mirror of
https://repo.or.cz/socat.git
synced 2024-12-22 23:42:34 +00:00
62 lines
2.8 KiB
C
62 lines
2.8 KiB
C
/* 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;
|
|
}
|