version 1.143, 2008/04/26 19:58:03 |
version 1.144, 2008/05/10 19:54:58 |
|
|
|
|
#include "rcsprog.h" |
#include "rcsprog.h" |
|
|
#define RCS_CMD_MAXARG 128 |
|
#define RCSPROG_OPTSTRING "A:a:b::c:e::ik:Ll::m:Mn:N:o:qt::TUu::Vx::z::" |
#define RCSPROG_OPTSTRING "A:a:b::c:e::ik:Ll::m:Mn:N:o:qt::TUu::Vx::z::" |
|
|
const char rcs_version[] = "OpenRCS 4.3"; |
const char rcs_version[] = "OpenRCS 4.3"; |
|
|
} |
} |
|
|
int |
int |
rcs_init(char *envstr, char **argv, int argvlen) |
build_cmd(char ***cmd_argv, char **argv, int argc) |
{ |
{ |
int argc, error; |
int cmd_argc, i, cur; |
char *linebuf, *lp, *cp; |
char *cp, *rcsinit, *linebuf, *lp; |
|
|
linebuf = xstrdup(envstr); |
if ((rcsinit = getenv("RCSINIT")) == NULL) { |
(void)memset(argv, 0, argvlen * sizeof(char *)); |
*cmd_argv = argv; |
|
return argc; |
|
} |
|
|
error = argc = 0; |
cur = argc + 2; |
|
cmd_argc = 0; |
|
*cmd_argv = xcalloc(cur, sizeof(char *)); |
|
(*cmd_argv)[cmd_argc++] = argv[0]; |
|
|
|
linebuf = xstrdup(rcsinit); |
for (lp = linebuf; lp != NULL;) { |
for (lp = linebuf; lp != NULL;) { |
cp = strsep(&lp, " \t\b\f\n\r\t\v"); |
cp = strsep(&lp, " \t\b\f\n\r\t\v"); |
if (cp == NULL) |
if (cp == NULL) |
break; |
break; |
else if (*cp == '\0') |
if (*cp == '\0') |
continue; |
continue; |
|
|
if (argc == argvlen) { |
if (cmd_argc == cur) { |
error++; |
cur += 8; |
break; |
*cmd_argv = xrealloc(*cmd_argv, cur, |
|
sizeof(char *)); |
} |
} |
|
|
argv[argc] = cp; |
(*cmd_argv)[cmd_argc++] = cp; |
argc++; |
|
} |
} |
|
|
if (error != 0) { |
if (cmd_argc + argc > cur) { |
xfree(linebuf); |
cur = cmd_argc + argc + 1; |
argc = -1; |
*cmd_argv = xrealloc(*cmd_argv, cur, |
|
sizeof(char *)); |
} |
} |
|
|
return (argc); |
for (i = 1; i < argc; i++) |
|
(*cmd_argv)[cmd_argc++] = argv[i]; |
|
|
|
(*cmd_argv)[cmd_argc] = NULL; |
|
|
|
return cmd_argc; |
} |
} |
|
|
int |
int |
main(int argc, char **argv) |
main(int argc, char **argv) |
{ |
{ |
u_int i; |
u_int i; |
char *rcsinit, *cmd_argv[RCS_CMD_MAXARG]; |
char **cmd_argv; |
int ret, cmd_argc; |
int ret, cmd_argc; |
|
|
ret = -1; |
ret = -1; |
rcs_optind = 1; |
rcs_optind = 1; |
SLIST_INIT(&rcs_temp_files); |
SLIST_INIT(&rcs_temp_files); |
|
|
cmd_argc = 0; |
cmd_argc = build_cmd(&cmd_argv, argv, argc); |
cmd_argv[cmd_argc++] = argv[0]; |
|
if ((rcsinit = getenv("RCSINIT")) != NULL) { |
|
ret = rcs_init(rcsinit, cmd_argv + 1, |
|
RCS_CMD_MAXARG - 1); |
|
if (ret < 0) |
|
errx(1, "failed to prepend RCSINIT options"); |
|
|
|
cmd_argc += ret; |
|
} |
|
|
|
if ((rcs_tmpdir = getenv("TMPDIR")) == NULL) |
if ((rcs_tmpdir = getenv("TMPDIR")) == NULL) |
rcs_tmpdir = RCS_TMPDIR_DEFAULT; |
rcs_tmpdir = RCS_TMPDIR_DEFAULT; |
|
|
if (argc + cmd_argc >= RCS_CMD_MAXARG) |
|
errx(1, "too many arguments"); |
|
for (ret = 1; ret < argc; ret++) |
|
cmd_argv[cmd_argc++] = argv[ret]; |
|
|
|
signal(SIGHUP, sighdlr); |
signal(SIGHUP, sighdlr); |
signal(SIGINT, sighdlr); |
signal(SIGINT, sighdlr); |