]> git.wh0rd.org - dump.git/blobdiff - dump/itime.c
Relicensed dump/restore under the revised BSD license, as per ftp://ftp.cs.berkeley...
[dump.git] / dump / itime.c
index 41eb78a9c20ea8ce956afd05640ac0bfce284d86..6f59a8502979bdd48993cc8188419265068bf03d 100644 (file)
@@ -2,8 +2,8 @@
  *     Ported to Linux's Second Extended File System as part of the
  *     dump and restore backup suit
  *     Remy Card <card@Linux.EU.Org>, 1994-1997
- *     Stelian Pop <pop@noos.fr>, 1999-2000
- *     Stelian Pop <pop@noos.fr> - Alcôve <www.alcove.fr>, 2000
+ *     Stelian Pop <stelian@popies.net>, 1999-2000
+ *     Stelian Pop <stelian@popies.net> - Alcôve <www.alcove.com>, 2000-2002
  */
 
 /*-
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
+ * 3. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
  *
@@ -41,7 +37,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-       "$Id: itime.c,v 1.20 2001/07/18 09:12:05 stelian Exp $";
+       "$Id: itime.c,v 1.25 2003/03/30 15:40:36 stelian Exp $";
 #endif /* not lint */
 
 #include <config.h>
@@ -56,6 +52,7 @@ static const char rcsid[] =
 #include <sys/param.h>
 #include <sys/time.h>
 #include <time.h>
+#include <fcntl.h>
 #ifdef __linux__
 #ifdef HAVE_EXT2FS_EXT2_FS_H
 #include <ext2fs/ext2_fs.h>
@@ -94,6 +91,7 @@ void
 initdumptimes(int createdumpdates)
 {
        FILE *df;
+       struct flock lock;
 
        if ((df = fopen(dumpdates, "r")) == NULL) {
                if (errno != ENOENT) {
@@ -122,7 +120,11 @@ initdumptimes(int createdumpdates)
                        msg("WARNING: no file `%s'\n", dumpdates);
        }
        if (df != NULL) {
-               (void) flock(fileno(df), LOCK_SH);
+               memset(&lock, 0, sizeof(lock));
+               lock.l_type = F_RDLCK;
+               if (fcntl(fileno(df), F_SETLKW, &lock) < 0)
+                       quit("cannot set read lock on %s: %s\n",
+                               dumpdates, strerror(errno));
                readdumptimes(df);
                (void) fclose(df);
        }
@@ -131,8 +133,8 @@ initdumptimes(int createdumpdates)
 static void
 readdumptimes(FILE *df)
 {
-       register int i;
-       register struct dumptime *dtwalk;
+       int i;
+       struct  dumptime *dtwalk;
 
        for (;;) {
                dtwalk = (struct dumptime *)calloc(1, sizeof (struct dumptime));
@@ -158,8 +160,8 @@ readdumptimes(FILE *df)
 void
 getdumptime(int createdumpdates)
 {
-       register struct dumpdates *ddp;
-       register int i;
+       struct dumpdates *ddp;
+       int i;
 
 #ifdef FDEBUG
        msg("Looking for name %s in dumpdates = %s for level = %c\n",
@@ -197,16 +199,20 @@ void
 putdumptime(void)
 {
        FILE *df;
-       register struct dumpdates *dtwalk;
-       register int i;
+       struct dumpdates *dtwalk;
+       int i;
        int fd;
+       struct flock lock;
 
        if(uflag == 0)
                return;
        if ((df = fopen(dumpdates, "r+")) == NULL)
                quit("cannot rewrite %s: %s\n", dumpdates, strerror(errno));
        fd = fileno(df);
-       (void) flock(fd, LOCK_EX);
+       memset(&lock, 0, sizeof(lock));
+       lock.l_type = F_WRLCK;
+       if (fcntl(fd, F_SETLKW, &lock) < 0)
+               quit("cannot set write lock on %s: %s\n", dumpdates, strerror(errno));
        free((char *)ddatev);
        ddatev = 0;
        nddates = 0;
@@ -249,11 +255,21 @@ putdumptime(void)
 static void
 dumprecout(FILE *file, struct dumpdates *what)
 {
+       char buf[26];
+       struct tm *tms;
 
-       if (fprintf(file, "%s %c %s",
+       tms = localtime(&what->dd_ddate);
+       strncpy(buf, asctime(tms), sizeof(buf));
+       if (buf[24] != '\n' || buf[25] != '\0')
+               quit("asctime returned an unexpected string\n");
+       buf[24] = 0;
+       if (fprintf(file, "%s %c %s %c%2.2d%2.2d\n",
                    what->dd_name,
                    what->dd_level,
-                   ctime(&what->dd_ddate)) < 0)
+                   buf,
+                   (tms->tm_gmtoff < 0 ? '-' : '+'),
+                   abs(tms->tm_gmtoff) / 3600,
+                   abs(tms->tm_gmtoff) % 3600 / 60) < 0)
                quit("%s: %s\n", dumpdates, strerror(errno));
 }