Instead of doing strcmp(argv0), track the invocation mode (pax/tar/cpio)
authorguenther <guenther@openbsd.org>
Tue, 23 Aug 2016 06:00:28 +0000 (06:00 +0000)
committerguenther <guenther@openbsd.org>
Tue, 23 Aug 2016 06:00:28 +0000 (06:00 +0000)
in a separate variable

ok deraadt@

bin/pax/Makefile
bin/pax/ar_io.c
bin/pax/extern.h
bin/pax/file_subs.c
bin/pax/options.c
bin/pax/pax.c

index 0db098b..472c7d0 100644 (file)
@@ -1,5 +1,6 @@
-#      $OpenBSD: Makefile,v 1.11 2014/01/08 04:58:36 guenther Exp $
+#      $OpenBSD: Makefile,v 1.12 2016/08/23 06:00:28 guenther Exp $
 
+WARNINGS=Yes
 PROG=   pax
 SRCS=  ar_io.c ar_subs.c buf_subs.c cache.c cpio.c file_subs.c ftree.c\
        gen_subs.c getoldopt.c options.c pat_rep.c pax.c sel_subs.c tables.c\
index 9b8fe86..5a579be 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ar_io.c,v 1.57 2016/08/14 18:30:33 guenther Exp $     */
+/*     $OpenBSD: ar_io.c,v 1.58 2016/08/23 06:00:28 guenther Exp $     */
 /*     $NetBSD: ar_io.c,v 1.5 1996/03/26 23:54:13 mrg Exp $    */
 
 /*-
@@ -390,12 +390,12 @@ ar_close(int in_sig)
                return;
        }
 
-       if (strcmp(NM_PAX, argv0) == 0)
+       if (op_mode == OP_PAX)
                (void)dprintf(listfd, "%s: %s vol %d, %lu files,"
                    " %llu bytes read, %llu bytes written.\n",
                    argv0, frmt->name, arvol-1, flcnt, rdcnt, wrcnt);
 #ifndef NOCPIO
-       else if (strcmp(NM_CPIO, argv0) == 0)
+       else if (op_mode == OP_CPIO)
                (void)dprintf(listfd, "%llu blocks\n",
                    (rdcnt ? rdcnt : wrcnt) / 5120);
 #endif /* !NOCPIO */
@@ -1112,7 +1112,7 @@ ar_next(void)
        if (sigprocmask(SIG_SETMASK, &o_mask, NULL) < 0)
                syswarn(0, errno, "Unable to restore signal mask");
 
-       if (done || !wr_trail || force_one_volume || strcmp(NM_TAR, argv0) == 0)
+       if (done || !wr_trail || force_one_volume || op_mode == OP_TAR)
                return(-1);
 
        tty_prnt("\nATTENTION! %s archive volume change required.\n", argv0);
index 80c7dc7..774487b 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: extern.h,v 1.55 2016/08/14 04:47:52 guenther Exp $    */
+/*     $OpenBSD: extern.h,v 1.56 2016/08/23 06:00:28 guenther Exp $    */
 /*     $NetBSD: extern.h,v 1.5 1996/03/26 23:54:16 mrg Exp $   */
 
 /*-
@@ -240,6 +240,7 @@ extern int exit_val;
 extern int docrc;
 extern char *dirptr;
 extern char *argv0;
+extern enum op_mode { OP_PAX, OP_TAR, OP_CPIO } op_mode;
 extern FILE *listf;
 extern int listfd;
 extern char *tempfile;
index 8d96763..6f6a783 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: file_subs.c,v 1.50 2016/08/23 03:31:44 guenther Exp $ */
+/*     $OpenBSD: file_subs.c,v 1.51 2016/08/23 06:00:28 guenther Exp $ */
 /*     $NetBSD: file_subs.c,v 1.4 1995/03/21 09:07:18 cgd Exp $        */
 
 /*-
@@ -371,7 +371,7 @@ node_creat(ARCHD *arcn)
                         * potential symlink chain before trying to create the
                         * directory.
                         */
-                       if (strcmp(NM_TAR, argv0) == 0 && Lflag) {
+                       if (op_mode == OP_TAR && Lflag) {
                                while (lstat(nm, &sb) == 0 &&
                                    S_ISLNK(sb.st_mode)) {
                                        len = readlink(nm, target,
@@ -484,7 +484,7 @@ badlink:
        if (pmode && !defer_pmode)
                set_pmode(nm, arcn->sb.st_mode);
 
-       if (arcn->type == PAX_DIR && strcmp(NM_CPIO, argv0) != 0) {
+       if (arcn->type == PAX_DIR && op_mode != OP_CPIO) {
                /*
                 * Dirs must be processed again at end of extract to set times
                 * and modes to agree with those stored in the archive. However
@@ -758,7 +758,7 @@ set_ids(char *fnm, uid_t uid, gid_t gid)
                 * ignore EPERM unless in verbose mode or being run by root.
                 * if running as pax, POSIX requires a warning.
                 */
-               if (strcmp(NM_PAX, argv0) == 0 || errno != EPERM || vflag ||
+               if (op_mode == OP_PAX || errno != EPERM || vflag ||
                    geteuid() == 0)
                        syswarn(1, errno, "Unable to set file uid/gid of %s",
                            fnm);
@@ -775,7 +775,7 @@ fset_ids(char *fnm, int fd, uid_t uid, gid_t gid)
                 * ignore EPERM unless in verbose mode or being run by root.
                 * if running as pax, POSIX requires a warning.
                 */
-               if (strcmp(NM_PAX, argv0) == 0 || errno != EPERM || vflag ||
+               if (op_mode == OP_PAX || errno != EPERM || vflag ||
                    geteuid() == 0)
                        syswarn(1, errno, "Unable to set file uid/gid of %s",
                            fnm);
index 2ee50db..bb0b9fc 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: options.c,v 1.94 2016/08/14 04:47:52 guenther Exp $   */
+/*     $OpenBSD: options.c,v 1.95 2016/08/23 06:00:28 guenther Exp $   */
 /*     $NetBSD: options.c,v 1.6 1996/03/26 23:54:18 mrg Exp $  */
 
 /*-
@@ -186,11 +186,13 @@ options(int argc, char **argv)
        argv0 = __progname;
 
        if (strcmp(NM_TAR, argv0) == 0) {
+               op_mode = OP_TAR;
                tar_options(argc, argv);
                return;
        }
 #ifndef NOCPIO
        else if (strcmp(NM_CPIO, argv0) == 0) {
+               op_mode = OP_CPIO;
                cpio_options(argc, argv);
                return;
        }
@@ -199,6 +201,7 @@ options(int argc, char **argv)
         * assume pax as the default
         */
        argv0 = NM_PAX;
+       op_mode = OP_PAX;
        pax_options(argc, argv);
 }
 
index 1b17b8c..a8e365a 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: pax.c,v 1.45 2016/06/23 06:37:36 semarie Exp $        */
+/*     $OpenBSD: pax.c,v 1.46 2016/08/23 06:00:28 guenther Exp $       */
 /*     $NetBSD: pax.c,v 1.5 1996/03/26 23:54:20 mrg Exp $      */
 
 /*-
@@ -90,6 +90,7 @@ int   exit_val;               /* exit value */
 int    docrc;                  /* check/create file crc */
 char   *dirptr;                /* destination dir in a copy */
 char   *argv0;                 /* root of argv[0] */
+enum op_mode op_mode;          /* what program are we acting as? */
 sigset_t s_mask;               /* signal mask for cleanup critical sect */
 FILE   *listf = stderr;        /* file pointer to print file list to */
 int    listfd = STDERR_FILENO; /* fd matching listf, for sighandler output */