Subject: pkg/34038: dump takes modulo 10 dump level
To: None <pkg-manager@netbsd.org, gnats-admin@netbsd.org,>
From: None <msvincen@midway.uchicago.edu>
List: pkgsrc-bugs
Date: 07/19/2006 17:05:01
>Number:         34038
>Category:       pkg
>Synopsis:       dump takes modulo 10 dump level
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    pkg-manager
>State:          open
>Class:          change-request
>Submitter-Id:   net
>Arrival-Date:   Wed Jul 19 17:05:01 +0000 2006
>Originator:     Matthew Vincenz
>Release:        3
>Organization:
UofC
>Environment:
>Description:
hi, I submitted a patch for this to the gnu folks a couple years ago.  it would be nice to have the same functionality on our bsd boxes. patch is here if formatting is screwed up below: 
http://www.lib.uchicago.edu/~msv/openbsddiff
tested and appears to work
thanks 
Matthew
>How-To-Repeat:

>Fix:
--- itime.c.1.16        2006-07-19 10:03:49.000000000 -0500
+++ itime.c     2006-07-19 10:14:14.000000000 -0500
@@ -136,11 +136,11 @@

        fname = disk;
 #ifdef FDEBUG
-       msg("Looking for name %s in dumpdates = %s for level = %c\n",
+       msg("Looking for name %s in dumpdates = %s for level = %s\n",
                fname, dumpdates, level);
 #endif
        spcl.c_ddate = 0;
-       lastlevel = '0';
+       memset(&lastlevel,0,NUM_STR_SIZE);

        initdumptimes();
        /*
@@ -150,12 +150,12 @@
        ITITERATE(i, ddp) {
                if (strncmp(fname, ddp->dd_name, sizeof (ddp->dd_name)) != 0)
                        continue;
-               if (ddp->dd_level >= level)
+               if (ddp->dd_level >= atoi(level))
                        continue;
                if (ddp->dd_ddate <= iswap32(spcl.c_ddate))
                        continue;
                spcl.c_ddate = iswap32(ddp->dd_ddate);
-               lastlevel = ddp->dd_level;
+               snprintf(lastlevel,NUM_STR_SIZE,"%d",ddp->dd_level);
        }
 }

@@ -186,7 +186,7 @@
                if (strncmp(fname, dtwalk->dd_name,
                                sizeof (dtwalk->dd_name)) != 0)
                        continue;
-               if (dtwalk->dd_level != level)
+               if (dtwalk->dd_level != atoi(level))
                        continue;
                goto found;
        }
@@ -199,7 +199,7 @@
        nddates += 1;
   found:
        (void) strlcpy(dtwalk->dd_name, fname, sizeof(dtwalk->dd_name));
-       dtwalk->dd_level = level;
+       dtwalk->dd_level = atoi(level);
        dtwalk->dd_ddate = iswap32(spcl.c_date);
        dtfound = dtwalk;

@@ -211,7 +211,7 @@
        if (ftruncate(fd, ftell(df)))
                quit("ftruncate (%s): %s\n", dumpdates, strerror(errno));
        (void) fclose(df);
-       msg("level %c dump on %s", level,
+       msg("level %s dump on %s", level,
                spcl.c_date == 0 ? "the epoch\n" : ctime(&dtfound->dd_ddate));
 }

@@ -242,7 +242,7 @@
                        dumpdates, recno);

 #ifdef FDEBUG
-       msg("getrecord: %s %c %s", ddatep->dd_name, ddatep->dd_level,
+       msg("getrecord: %s %d %s", ddatep->dd_name, ddatep->dd_level,
            ddatep->dd_ddate == 0 ? "the epoch\n" : ctime(&ddatep->dd_ddate));
 #endif
        return(0);
@@ -259,3 +259,4 @@
                return(-1);
        return(0);
 }
+
--- dump.h.1.43 2006-07-19 10:15:50.000000000 -0500
+++ dump.h      2006-07-19 10:22:20.000000000 -0500
@@ -94,6 +94,9 @@
 #define        TSTINO(ino, map) \
        (map[(u_int)((ino) - 1) / NBBY] &  (1 << ((u_int)((ino) - 1) % NBBY)))

+
+#define NUM_STR_SIZE    32 /* max length of dump level string */
+
 /*
  *     All calculations done in 0.1" units!
  */
@@ -101,8 +104,8 @@
 const char *tape;      /* name of the tape file */
 const char *dumpdates; /* name of the file containing dump date information*/
 const char *temp;      /* name of the file for doing rewrite of dumpdates */
-char   lastlevel;      /* dump level of previous dump */
-char   level;          /* dump level of this dump */
+char  lastlevel[NUM_STR_SIZE]; /* dump level of previous dump */
+char  level[NUM_STR_SIZE]; /* dump level of this dump */
 int    uflag;          /* update flag */
 int    eflag;          /* eject flag */
 int    lflag;          /* autoload flag */
@@ -262,7 +265,7 @@
  */
 struct dumpdates {
        char    dd_name[NAME_MAX+3];
-       char    dd_level;
+       int     dd_level;
        time_t  dd_ddate;
 };

--- optr.c.1.35 2006-07-19 10:56:06.000000000 -0500
+++ optr.c      2006-07-19 10:57:49.000000000 -0500
@@ -485,7 +485,7 @@
                    dtwalk->dd_ddate < tnow - (dt->fs_freq * SECSPERDAY));
                if (arg != 'w' || dumpme)
                        (void) printf(
-                           "%c %8s\t(%6s) Last dump: Level %c, Date %s\n",
+                           "%c %8s\t(%6s) Last dump: Level %d, Date %s\n",
                            dumpme && (arg != 'w') ? '>' : ' ',
                            dtwalk->dd_name,
                            dt ? dt->fs_file : "",
--- main.c.1.62 2006-07-19 10:23:40.000000000 -0500
+++ main.c      2006-07-19 10:51:33.000000000 -0500
@@ -99,7 +99,7 @@
        struct fstab *dt;
        struct statvfs *mntinfo, fsbuf;
        char *map, *cp;
-       int ch;
+       int ch, pch = 0;
        int i, anydirskipped, bflag = 0, Tflag = 0, Fflag = 0, honorlevel = 1;
        int snap_internal = 0;
        ino_t maxino;
@@ -126,7 +126,7 @@
        strcpy(labelstr, "none");       /* XXX safe strcpy. */
        if (TP_BSIZE / DEV_BSIZE == 0 || TP_BSIZE % DEV_BSIZE != 0)
                quit("TP_BSIZE must be a multiple of DEV_BSIZE\n");
-       level = '0';
+       memset(&level,0,NUM_STR_SIZE);
        timestamp = 0;

        if (argc < 2)
@@ -139,7 +139,10 @@
                /* dump level */
                case '0': case '1': case '2': case '3': case '4':
                case '5': case '6': case '7': case '8': case '9':
-                       level = ch;
+                 if ((pch >= '0') && (pch <= '9') && (strlen(level) < NUM_STR_SIZE))
+                   level[strlen(level)] = ch;
+                 else level[0] = ch;
+                 pch = ch;
                        break;

                case 'a':               /* `auto-size', Write to EOM. */
@@ -234,7 +237,7 @@
                                exit(X_STARTUP);
                        }
                        Tflag = 1;
-                       lastlevel = '?';
+                       sprintf(lastlevel,"?");
                        break;

                case 'u':               /* update /etc/dumpdates */
@@ -304,9 +307,9 @@
                                msg("Ignoring u flag for subdir dump\n");
                                uflag = 0;
                        }
-                       if (level > '0') {
+                       if (atoi(level) > 0) {
                                msg("Subdir dump is done at level 0\n");
-                               level = '0';
+                               memset(&level,0,NUM_STR_SIZE);
                        }
                        msg("Dumping sub files/directories from %s\n",
                            mountpoint);
@@ -461,7 +464,7 @@

        needswap = fs_read_sblock(sblock_buf);

-       spcl.c_level = iswap32(level - '0');
+       spcl.c_level = iswap32(atoi(level));
        spcl.c_type = iswap32(TS_TAPE);
        spcl.c_date = iswap32(spcl.c_date);
        spcl.c_ddate = iswap32(spcl.c_ddate);
@@ -469,10 +472,10 @@
                getdumptime();          /* /etc/dumpdates snarfed */

        date = iswap32(spcl.c_date);
-       msg("Date of this level %c dump: %s", level,
+       msg("Date of this level %s dump: %s", level,
                spcl.c_date == 0 ? "the epoch\n" : ctime(&date));
        date = iswap32(spcl.c_ddate);
-       msg("Date of last level %c dump: %s", lastlevel,
+       msg("Date of last level %s dump: %s", lastlevel,
                spcl.c_ddate == 0 ? "the epoch\n" : ctime(&date));
        msg("Dumping ");
        if (snap_backup != NULL || snap_internal)
@@ -629,7 +632,7 @@
                    (iswap32(spcl.c_volume) == 1) ? "" : "s");
        tnow = do_stats();
        date = iswap32(spcl.c_date);
-       msg("Date of this level %c dump: %s", level,
+       msg("Date of this level %s dump: %s", level,
                spcl.c_date == 0 ? "the epoch\n" : ctime(&date));
        msg("Date this dump completed:  %s", ctime(&tnow));
        msg("Average transfer rate: %d KB/s\n", xferrate / tapeno);
--- /usr/include/protocols/dumprestore.h.1.14   2006-07-19 11:24:47.000000000 -0500
+++ /usr/include/protocols/dumprestore.h        2006-07-19 11:03:04.000000000 -0500
@@ -151,8 +151,8 @@
 #define DR_NEWHEADER   0x0001  /* new format tape header */
 #define DR_NEWINODEFMT 0x0002  /* new format inodes on tape */

-#define        DUMPOUTFMT      "%-16s %c %s"           /* for printf */
+#define        DUMPOUTFMT      "%-16s %d %s"           /* for printf */
                                                /* name, level, ctime(date) */
-#define        DUMPINFMT       "%16s %c %[^\n]\n"      /* inverse for scanf */
+#define        DUMPINFMT       "%16s %d %[^\n]\n"      /* inverse for scanf */

 #endif /* !_PROTOCOLS_DUMPRESTORE_H_ */