summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2009-08-08 19:47:33 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2009-08-08 19:47:33 +0300
commitf653a2bd71d7e340f802dd76d432ed399ddd2d0e (patch)
tree6031765604786ac383014fed865ecb1412e54b14 /tests
parent20ecc7e634e41dd282d16739f17efe5e81fb2e98 (diff)
downloadpaxutils-f653a2bd71d7e340f802dd76d432ed399ddd2d0e.tar.gz
Improve genfile --run
* tests/genfile.c: Change the use of --run option. Implement --unlink action. * doc/genfile.texi: Document changes in genfile
Diffstat (limited to 'tests')
-rw-r--r--tests/genfile.c46
1 files changed, 37 insertions, 9 deletions
diff --git a/tests/genfile.c b/tests/genfile.c
index 3cceb02..7ebeddf 100644
--- a/tests/genfile.c
+++ b/tests/genfile.c
@@ -99,6 +99,7 @@ char *buffer;
/* Number of arguments and argument vector for mode == mode_exec */
int exec_argc;
char **exec_argv;
+char *checkpoint_option;
/* Time for --touch option */
struct timespec touch_time;
@@ -119,6 +120,7 @@ static char doc[] = N_("genfile manipulates data files for GNU paxutils test sui
#define OPT_DATE 261
#define OPT_VERBOSE 262
#define OPT_SEEK 263
+#define OPT_UNLINK 264
static struct argp_option options[] = {
#define GRP 0
@@ -159,8 +161,8 @@ static struct argp_option options[] = {
{NULL, 0, NULL, 0,
N_("Synchronous execution options:"), GRP},
- {"run", 'r', N_("COMMAND"), 0,
- N_("Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, --touch"),
+ {"run", 'r', N_("OPTION"), OPTION_ARG_OPTIONAL,
+ N_("Execute ARGS. Useful with --checkpoint and one of --cut, --append, --touch, --unlink"),
GRP+1 },
{"checkpoint", OPT_CHECKPOINT, N_("NUMBER"), 0,
N_("Perform given action (see below) upon reaching checkpoint NUMBER"),
@@ -189,6 +191,9 @@ static struct argp_option options[] = {
{"exec", OPT_EXEC, N_("COMMAND"), 0,
N_("Execute COMMAND"),
GRP+1 },
+ {"unlink", OPT_UNLINK, N_("FILE"), 0,
+ N_("Unlink FILE"),
+ GRP+1 },
#undef GRP
{ NULL, }
};
@@ -333,7 +338,11 @@ parse_opt (int key, char *arg, struct argp_state *state)
case 'r':
mode = mode_exec;
- argcv_get (arg, "", NULL, &exec_argc, &exec_argv);
+ if (arg)
+ {
+ argcv_get (arg, "", NULL, &exec_argc, &exec_argv);
+ checkpoint_option = "--checkpoint";
+ }
break;
case 'T':
@@ -363,6 +372,7 @@ parse_opt (int key, char *arg, struct argp_state *state)
case OPT_TRUNCATE:
case OPT_TOUCH:
case OPT_EXEC:
+ case OPT_UNLINK:
reg_action (key, arg);
break;
@@ -685,6 +695,11 @@ exec_checkpoint (struct action *p)
system (p->name);
break;
+ case OPT_UNLINK:
+ if (unlink (p->name))
+ error (0, errno, _("cannot unlink `%s'"), p->name);
+ break;
+
default:
abort ();
}
@@ -730,11 +745,17 @@ exec_command (void)
/* Insert --checkpoint option.
FIXME: This assumes that exec_argv does not use traditional tar options
- (without dash) */
- exec_argc++;
- exec_argv = xrealloc (exec_argv, (exec_argc + 1) * sizeof (*exec_argv));
- memmove (exec_argv+2, exec_argv+1, (exec_argc - 1) * sizeof (*exec_argv));
- exec_argv[1] = "--checkpoint";
+ (without dash).
+ FIXME: There is no way to set checkpoint argument (granularity).
+ */
+ if (checkpoint_option)
+ {
+ exec_argc++;
+ exec_argv = xrealloc (exec_argv, (exec_argc + 1) * sizeof (*exec_argv));
+ memmove (exec_argv+2, exec_argv+1,
+ (exec_argc - 1) * sizeof (*exec_argv));
+ exec_argv[1] = checkpoint_option;
+ }
#ifdef SIGCHLD
/* System V fork+wait does not work if SIGCHLD is ignored. */
@@ -760,7 +781,7 @@ exec_command (void)
setenv ("LC_ALL", "POSIX", 1);
execvp (exec_argv[0], exec_argv);
- error (EXIT_FAILURE, errno, "execvp");
+ error (EXIT_FAILURE, errno, "execvp %s", exec_argv[0]);
}
/* Master */
@@ -872,6 +893,13 @@ main (int argc, char **argv)
break;
case mode_exec:
+ if (!checkpoint_option)
+ {
+ exec_argc = argc;
+ exec_argv = argv;
+ }
+ else if (argc)
+ error (EXIT_FAILURE, 0, _("too many arguments"));
exec_command ();
break;