aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2017-05-29 14:09:37 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2017-05-29 14:09:37 +0300
commitd03eab65d31aa4be7682e9c0271b5793d8227698 (patch)
tree5bf1ea2b5c3714b3ac557b8b5abb40ed15016a56
parentec72abd9dd63bbff4534ec77e97b1a6cadfc3cf8 (diff)
downloadpaxutils-d03eab65d31aa4be7682e9c0271b5793d8227698.tar.gz
paxutils-d03eab65d31aa4be7682e9c0271b5793d8227698.tar.bz2
Improve genfile
* tests/genfile.c: Rename --unlink option to --delete, retaining old name as alias. Call unlink or rmdir depending on the type of the argument. * doc/genfile.texi: Document changes.
-rw-r--r--doc/genfile.texi6
-rw-r--r--tests/genfile.c41
2 files changed, 33 insertions, 14 deletions
diff --git a/doc/genfile.texi b/doc/genfile.texi
index e35f34b..58aa593 100644
--- a/doc/genfile.texi
+++ b/doc/genfile.texi
@@ -319,8 +319,10 @@ an almost arbitrary format (@pxref{Date input formats}).
@item --exec @var{command}
Execute given shell command.
-@item --unlink @var{file}
- Unlink the @var{file}.
+@item --delete @var{file}
+@itemx --unlink @var{file}
+ Delete the named file or directory. If deleting the directory, it
+must be empty.
@end table
Option @option{--verbose} instructs @command{genfile} to print on
diff --git a/tests/genfile.c b/tests/genfile.c
index 336788f..66c54df 100644
--- a/tests/genfile.c
+++ b/tests/genfile.c
@@ -123,7 +123,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
+#define OPT_DELETE 264
static struct argp_option options[] = {
#define GRP 0
@@ -195,9 +195,10 @@ 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"),
+ {"delete", OPT_DELETE, N_("FILE"), 0,
+ N_("Delete FILE"),
GRP+1 },
+ {"unlink", 0, 0, OPTION_ALIAS, NULL, GRP+1},
#undef GRP
{ NULL, }
};
@@ -289,7 +290,7 @@ struct action
struct timespec ts;
};
-static struct action *action_list;
+static struct action *action_head, *action_tail;
void
reg_action (int action, char *arg)
@@ -301,8 +302,12 @@ reg_action (int action, char *arg)
act->ts = touch_time;
act->size = file_length;
act->name = arg;
- act->next = action_list;
- action_list = act;
+ act->next = NULL;
+ if (action_tail)
+ action_tail->next = act;
+ else
+ action_head = act;
+ action_tail = act;
}
static error_t
@@ -380,7 +385,7 @@ parse_opt (int key, char *arg, struct argp_state *state)
case OPT_TRUNCATE:
case OPT_TOUCH:
case OPT_EXEC:
- case OPT_UNLINK:
+ case OPT_DELETE:
reg_action (key, arg);
break;
@@ -769,9 +774,19 @@ exec_checkpoint (struct action *p)
error (0, 0, _("command failed: %s"), p->name);
break;
- case OPT_UNLINK:
- if (unlink (p->name))
- error (0, errno, _("cannot unlink `%s'"), p->name);
+ case OPT_DELETE:
+ {
+ struct stat st;
+ if (stat (p->name, &st))
+ error (0, errno, _("cannot stat `%s'"), p->name);
+ else if (S_ISDIR (st.st_mode))
+ {
+ if (rmdir (p->name))
+ error (0, errno, _("cannot remove directory `%s'"), p->name);
+ }
+ else if (unlink (p->name))
+ error (0, errno, _("cannot unlink `%s'"), p->name);
+ }
break;
default:
@@ -784,7 +799,7 @@ process_checkpoint (size_t n)
{
struct action *p, *prev = NULL;
- for (p = action_list; p; )
+ for (p = action_head; p; )
{
struct action *next = p->next;
@@ -795,7 +810,9 @@ process_checkpoint (size_t n)
if (prev)
prev->next = next;
else
- action_list = next;
+ action_head = next;
+ if (next == NULL)
+ action_tail = prev;
free (p);
}
else

Return to:

Send suggestions and report system problems to the System administrator.