sbase

suckless unix tools
git clone git://git.suckless.org/sbase
Log | Files | Refs | README | LICENSE

commit 7ed4866556a8208d8d0470e1dd1a4c0df68039b2
parent e1f87da43e4805ac6758fa11cc49fbebaa5c3c89
Author: Michael Forney <mforney@mforney.org>
Date:   Sat,  1 Nov 2014 20:36:39 +0000

tar: Implement -m flag

This changes the default behavior to adjust mtimes to what is present in
the file header.

Diffstat:
Mtar.c | 25++++++++++++++++++++++---
1 file changed, 22 insertions(+), 3 deletions(-)

diff --git a/tar.c b/tar.c @@ -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> @@ -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 @@ -80,6 +84,9 @@ main(int argc, char *argv[]) case 'f': file = EARGF(usage()); break; + case 'm': + mflag = true; + break; default: usage(); } ARGEND; @@ -109,6 +116,9 @@ main(int argc, char *argv[]) argc--, argv++; dir = argv[0]; break; + case 'm': + mflag = true; + break; default: usage(); } @@ -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: @@ -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; }