[hackers] [sbase] tar: Implement -m flag || Michael Forney

From: <git_AT_suckless.org>
Date: Sat, 01 Nov 2014 23:34:33 +0100

commit 7ed4866556a8208d8d0470e1dd1a4c0df68039b2
Author: Michael Forney <mforney_AT_mforney.org>
Date: Sat Nov 1 20:36:39 2014 +0000

    tar: Implement -m flag
    
    This changes the default behavior to adjust mtimes to what is present in
    the file header.

diff --git a/tar.c b/tar.c
index 0a41795..7588a41 100644
--- a/tar.c
+++ b/tar.c
_AT_@ -2,9 +2,11 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <stdio.h>
+#include <stdbool.h>
 #include <string.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/time.h>
 #include <limits.h>
 #include <grp.h>
 #include <pwd.h>
_AT_@ -50,13 +52,15 @@ static FILE *tarfile;
 static ino_t tarinode;
 static dev_t tardev;
 
+static bool mflag = false;
+
 static void
 usage(void)
 {
- eprintf("usage: tar [-f tarfile] [-C dir] [-]x|t\n"
+ eprintf("usage: tar [-f tarfile] [-C dir] [-]x[m]|t\n"
                 " tar [-f tarfile] [-C dir] [-]c dir\n"
                 " tar [-C dir] cf tarfile dir\n"
- " tar [-C dir] x|tf tarfile\n");
+ " tar [-C dir] x[m]|tf tarfile\n");
 }
 
 int
_AT_@ -80,6 +84,9 @@ main(int argc, char *argv[])
         case 'f':
                 file = EARGF(usage());
                 break;
+ case 'm':
+ mflag = true;
+ break;
         default:
                 usage();
         } ARGEND;
_AT_@ -109,6 +116,9 @@ main(int argc, char *argv[])
                                 argc--, argv++;
                                 dir = argv[0];
                                 break;
+ case 'm':
+ mflag = true;
+ break;
                         default:
                                 usage();
                         }
_AT_@ -225,9 +235,12 @@ unarchive(char *fname, int l, char b[Blksiz])
 {
         char lname[101];
         FILE *f = NULL;
- unsigned long mode, major, minor, type;
+ unsigned long mode, major, minor, type, mtime;
+ struct timeval times[2] = {0};
         Header *h = (void*)b;
 
+ if(!mflag)
+ mtime = strtoul(h->mtime, 0, 8);
         unlink(fname);
         switch(h->type) {
         case REG:
_AT_@ -277,6 +290,12 @@ unarchive(char *fname, int l, char b[Blksiz])
         }
         if(f)
                 fclose(f);
+
+ if(!mflag) {
+ times[0].tv_sec = times[1].tv_sec = mtime;
+ if(utimes(fname, times))
+ perror(fname);
+ }
         return 0;
 }
 
Received on Sat Nov 01 2014 - 23:34:33 CET

This archive was generated by hypermail 2.3.0 : Sat Nov 01 2014 - 23:36:27 CET