| /* source: xiolayer.c */ |
| /* Copyright Gerhard Rieger and contributors (see file CHANGES) */ |
| /* Published under the GNU General Public License V.2, see file COPYING */ |
| |
| /* this file contains the source for common options */ |
| |
| #include "xiosysincludes.h" |
| #include "xioopen.h" |
| |
| #include "xiolayer.h" |
| |
| /****** for ALL addresses - by application ******/ |
| const struct optdesc opt_ignoreeof = { "ignoreeof", NULL, OPT_IGNOREEOF, GROUP_APPL, PH_LATE, TYPE_BOOL, OFUNC_EXT, XIO_OFFSETOF(ignoreeof), XIO_SIZEOF(ignoreeof) }; |
| const struct optdesc opt_cr = { "cr", NULL, OPT_CR, GROUP_APPL, PH_LATE, TYPE_CONST, OFUNC_EXT, XIO_OFFSETOF(lineterm), XIO_SIZEOF(lineterm), LINETERM_CR }; |
| const struct optdesc opt_crnl = { "crnl", NULL, OPT_CRNL, GROUP_APPL, PH_LATE, TYPE_CONST, OFUNC_EXT, XIO_OFFSETOF(lineterm), XIO_SIZEOF(lineterm), LINETERM_CRNL }; |
| const struct optdesc opt_readbytes = { "readbytes", "bytes", OPT_READBYTES, GROUP_APPL, PH_LATE, TYPE_SIZE_T, OFUNC_EXT, XIO_OFFSETOF(readbytes), XIO_SIZEOF(readbytes) }; |
| const struct optdesc opt_lockfile = { "lockfile", NULL, OPT_LOCKFILE, GROUP_APPL, PH_INIT, TYPE_FILENAME, OFUNC_EXT, 0, 0 }; |
| const struct optdesc opt_waitlock = { "waitlock", NULL, OPT_WAITLOCK, GROUP_APPL, PH_INIT, TYPE_FILENAME, OFUNC_EXT, 0, 0 }; |
| const struct optdesc opt_escape = { "escape", NULL, OPT_ESCAPE, GROUP_APPL, PH_INIT, TYPE_INT, OFUNC_OFFSET, XIO_OFFSETOF(escape), sizeof(((xiosingle_t *)0)->escape) }; |
| /****** APPL addresses ******/ |
| #if WITH_RETRY |
| const struct optdesc opt_forever = { "forever", NULL, OPT_FOREVER, GROUP_RETRY, PH_INIT, TYPE_BOOL, OFUNC_EXT, XIO_OFFSETOF(forever), XIO_SIZEOF(forever) }; |
| const struct optdesc opt_intervall = { "interval", NULL, OPT_INTERVALL, GROUP_RETRY, PH_INIT, TYPE_TIMESPEC, OFUNC_EXT, XIO_OFFSETOF(intervall), XIO_SIZEOF(intervall) }; |
| const struct optdesc opt_retry = { "retry", NULL, OPT_RETRY, GROUP_RETRY, PH_INIT, TYPE_UINT, OFUNC_EXT, XIO_OFFSETOF(retry), XIO_SIZEOF(retry) }; |
| #endif |
| |
| const struct optdesc opt_chdir = { "chdir", "cd", OPT_CHDIR, GROUP_ADDR, PH_INIT, TYPE_FILENAME, OFUNC_SPEC }; |
| const struct optdesc opt_umask = { "umask", NULL, OPT_UMASK, GROUP_ADDR, PH_INIT, TYPE_MODET, OFUNC_SPEC }; |
| |
| |
| int xio_chdir( |
| struct opt* opts, |
| char **orig_dir) |
| { |
| char *tmp_dir = NULL; |
| |
| if (retropt_string(opts, OPT_CHDIR, &tmp_dir) < 0) |
| return 0; |
| |
| if ((*orig_dir = Malloc(PATH_MAX)) == NULL) { |
| free(tmp_dir); |
| return -1; |
| } |
| |
| if (getcwd(*orig_dir, PATH_MAX) == NULL) { |
| Error1("getcwd(<ptr>, PATH_MAX): %s", strerror(errno)); |
| free(*orig_dir); |
| free(tmp_dir); |
| return -1; |
| } |
| *orig_dir = Realloc(*orig_dir, strlen(*orig_dir+1)); |
| |
| if (Chdir(tmp_dir) < 0) { |
| Error2("chdir(\"%s\"): %s", tmp_dir, strerror(errno)); |
| free(*orig_dir); |
| free(tmp_dir); |
| return -1; |
| } |
| |
| free(tmp_dir); |
| return 1; |
| } |