From 5c63ffad332bd23fe527a19a468aa679d10da55c Mon Sep 17 00:00:00 2001 From: Michael Forney Date: Sat, 11 Jan 2020 02:10:04 -0800 Subject: [PATCH] install: Fix -d with more than two directories The `tflag || argc > 2` if-statement should only apply when not creating directories (-d). Otherwise, if we are creating more than two directories, we get an error if the last argument does not already exist. To fix this, move the -d case above and return early. --- xinstall.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/xinstall.c b/xinstall.c index 93ce842..fe55396 100644 --- a/xinstall.c +++ b/xinstall.c @@ -198,6 +198,12 @@ main(int argc, char *argv[]) if (mflag) mode = parsemode(mflag, mode, 0); + if (dflag) { + for (; *argv; argc--, argv++) + make_dirs(*argv, 0); + return 0; + } + if (tflag) { argv = memmove(argv - 1, argv, argc * sizeof(*argv)); argv[argc++] = tflag; @@ -213,24 +219,18 @@ main(int argc, char *argv[]) eprintf("%s: not a directory\n", argv[argc - 1]); } } - - if (dflag) { - for (; *argv; argc--, argv++) - make_dirs(*argv, 0); - } else { - if (stat(argv[argc - 1], &st) < 0) { - if (errno != ENOENT) - eprintf("stat %s:", argv[argc - 1]); - if (tflag || Dflag || argc > 2) { - if ((p = strrchr(argv[argc - 1], '/')) != NULL) { - *p = '\0'; - make_dirs(argv[argc - 1], 1); - *p = '/'; - } + if (stat(argv[argc - 1], &st) < 0) { + if (errno != ENOENT) + eprintf("stat %s:", argv[argc - 1]); + if (tflag || Dflag || argc > 2) { + if ((p = strrchr(argv[argc - 1], '/')) != NULL) { + *p = '\0'; + make_dirs(argv[argc - 1], 1); + *p = '/'; } } - enmasse(argc, argv, install); } + enmasse(argc, argv, install); return 0; }