[hackers] [sbase] Refactor tar(1) || FRIGN

From: <git_AT_suckless.org>
Date: Mon, 16 Feb 2015 20:12:14 +0100 (CET)

commit b89543f5adbaaae0cfee83416a77215c541c9f3e
Author: FRIGN <dev_AT_frign.de>
Date: Mon Feb 16 19:47:36 2015 +0100

    Refactor tar(1)

diff --git a/tar.c b/tar.c
index 6c2af26..43fe80b 100644
--- a/tar.c
+++ b/tar.c
_AT_@ -11,8 +11,7 @@
 
 #include "util.h"
 
-typedef struct Header Header;
-struct Header {
+struct header {
         char name[100];
         char mode[8];
         char uid[8];
_AT_@ -22,8 +21,8 @@ struct Header {
         char chksum[8];
         char type;
         char link[100];
- char magic[6];
- char version[2];
+ char *magic;
+ char *version;
         char uname[32];
         char gname[32];
         char major[8];
_AT_@ -31,43 +30,34 @@ struct Header {
         char prefix[155];
 };
 
-enum {
- Blksiz = 512
-};
+#define BLKSIZ 512
 
 enum Type {
         REG = '0', AREG = '\0', HARDLINK = '1', SYMLINK = '2', CHARDEV = '3',
         BLOCKDEV = '4', DIRECTORY = '5', FIFO = '6'
 };
 
-static void putoctal(char *, unsigned, int);
-static int archive(const char *);
-static int unarchive(char *, int, char[Blksiz]);
-static int print(char *, int , char[Blksiz]);
-static void c(const char *, int);
-static void xt(int (*)(char*, int, char[Blksiz]));
-
 static FILE *tarfile;
 static ino_t tarinode;
 static dev_t tardev;
 
-static int mflag;
-static int fflag = 'P';
+static int mflag;
+static int fflag = 'P';
 static char filtermode;
 
 static FILE *
 decomp(FILE *fp)
 {
- int fds[2];
         pid_t pid;
+ int fds[2];
 
         if (pipe(fds) < 0)
                 eprintf("pipe:");
 
         pid = fork();
- if (pid < 0) {
+ if (pid < 0)
                 eprintf("fork:");
- } else if (!pid) {
+ else if (!pid) {
                 dup2(fileno(fp), 0);
                 dup2(fds[1], 1);
                 close(fds[0]);
_AT_@ -83,7 +73,6 @@ decomp(FILE *fp)
                         break;
                 }
         }
-
         close(fds[1]);
         return fdopen(fds[0], "r");
 }
_AT_@ -91,21 +80,20 @@ decomp(FILE *fp)
 static void
 putoctal(char *dst, unsigned num, int n)
 {
- snprintf(dst, n, "%.*o", n-1, num);
+ snprintf(dst, n, "%.*o", n - 1, num);
 }
 
 static int
 archive(const char* path)
 {
- unsigned char b[Blksiz];
- unsigned chksum;
- int l, x;
- Header *h = (void*)b;
- FILE *f = NULL;
- struct stat st;
- struct passwd *pw;
- struct group *gr;
+ FILE *f;
         mode_t mode;
+ struct group *gr;
+ struct header *h;
+ struct passwd *pw;
+ struct stat st;
+ size_t chksum, l, x;
+ unsigned char b[BLKSIZ];
 
         lstat(path, &st);
         if (st.st_ino == tarinode && st.st_dev == tardev) {
_AT_@ -115,15 +103,16 @@ archive(const char* path)
         pw = getpwuid(st.st_uid);
         gr = getgrgid(st.st_gid);
 
- memset(b, 0, sizeof b);
- snprintf(h->name, sizeof h->name, "%s", path);
- putoctal(h->mode, (unsigned)st.st_mode&0777, sizeof h->mode);
- putoctal(h->uid, (unsigned)st.st_uid, sizeof h->uid);
- putoctal(h->gid, (unsigned)st.st_gid, sizeof h->gid);
- putoctal(h->size, 0, sizeof h->size);
- putoctal(h->mtime, (unsigned)st.st_mtime, sizeof h->mtime);
- memcpy(h->magic, "ustar", sizeof h->magic);
- memcpy(h->version, "00", sizeof h->version);
+ h = (void*)b;
+ memset(b, 0, sizeof(b));
+ snprintf(h->name, sizeof(h->name), "%s", path);
+ putoctal(h->mode, (unsigned)st.st_mode & 0777, sizeof(h->mode));
+ putoctal(h->uid, (unsigned)st.st_uid, sizeof(h->uid));
+ putoctal(h->gid, (unsigned)st.st_gid, sizeof(h->gid));
+ putoctal(h->size, 0, sizeof(h->size));
+ putoctal(h->mtime, (unsigned)st.st_mtime, sizeof(h->mtime));
+ h->magic = "ustar";
+ h->version = "00";
         snprintf(h->uname, sizeof h->uname, "%s", pw ? pw->pw_name : "");
         snprintf(h->gname, sizeof h->gname, "%s", gr ? gr->gr_name : "");
 
_AT_@ -154,26 +143,26 @@ archive(const char* path)
                 chksum += b[x];
         putoctal(h->chksum, chksum, sizeof h->chksum);
 
- fwrite(b, Blksiz, 1, tarfile);
+ fwrite(b, BLKSIZ, 1, tarfile);
         if (!f)
                 return 0;
- while ((l = fread(b, 1, Blksiz, f)) > 0) {
- if (l < Blksiz)
- memset(b+l, 0, Blksiz-l);
- fwrite(b, Blksiz, 1, tarfile);
+ while ((l = fread(b, 1, BLKSIZ, f)) > 0) {
+ if (l < BLKSIZ)
+ memset(b+l, 0, BLKSIZ-l);
+ fwrite(b, BLKSIZ, 1, tarfile);
         }
         fclose(f);
         return 0;
 }
 
 static int
-unarchive(char *fname, int l, char b[Blksiz])
+unarchive(char *fname, int l, char b[BLKSIZ])
 {
- char lname[101];
         FILE *f = NULL;
- unsigned long mode, major, minor, type, mtime;
         struct timeval times[2];
- Header *h = (void*)b;
+ struct header *h = (void*)b;
+ unsigned long mode, major, minor, type, mtime;
+ char lname[101];
 
         if (!mflag)
                 mtime = strtoul(h->mtime, 0, 8);
_AT_@ -215,12 +204,11 @@ unarchive(char *fname, int l, char b[Blksiz])
         default:
                 fprintf(stderr, "usupported tarfiletype %c\n", h->type);
         }
- if (getuid() == 0 && chown(fname, strtoul(h->uid, 0, 8),
- strtoul(h->gid, 0, 8)))
+ if (getuid() == 0 && chown(fname, strtoul(h->uid, 0, 8), strtoul(h->gid, 0, 8)))
                 perror(fname);
 
- for (; l > 0; l -= Blksiz) {
- fread(b, Blksiz, 1, tarfile);
+ for (; l > 0; l -= BLKSIZ) {
+ fread(b, BLKSIZ, 1, tarfile);
                 if (f)
                         fwrite(b, MIN(l, 512), 1, f);
         }
_AT_@ -237,11 +225,11 @@ unarchive(char *fname, int l, char b[Blksiz])
 }
 
 static int
-print(char * fname, int l, char b[Blksiz])
+print(char * fname, int l, char b[BLKSIZ])
 {
         puts(fname);
- for (; l > 0; l -= Blksiz)
- fread(b, Blksiz, 1, tarfile);
+ for (; l > 0; l -= BLKSIZ)
+ fread(b, BLKSIZ, 1, tarfile);
         return 0;
 }
 
_AT_@ -253,12 +241,12 @@ c(const char * path, int fflag)
 }
 
 static void
-xt(int (*fn)(char*, int, char[Blksiz]))
+xt(int (*fn)(char*, int, char[BLKSIZ]))
 {
- char b[Blksiz], fname[257], *s;
- Header *h = (void*)b;
+ char b[BLKSIZ], fname[257], *s;
+ struct header *h = (void*)b;
 
- while (fread(b, Blksiz, 1, tarfile) && h->name[0] != '\0') {
+ while (fread(b, BLKSIZ, 1, tarfile) && h->name[0] != '\0') {
                 s = fname;
                 if (h->prefix[0] != '\0')
                         s += sprintf(s, "%.*s/", (int)sizeof h->prefix, h->prefix);
_AT_@ -277,10 +265,9 @@ usage(void)
 int
 main(int argc, char *argv[])
 {
- struct stat st;
- char *file = NULL, *dir = ".";
- char mode = '\0';
         FILE *fp;
+ struct stat st;
+ char *file = NULL, *dir = ".", mode = '\0';
 
         ARGBEGIN {
         case 'x':
Received on Mon Feb 16 2015 - 20:12:14 CET

This archive was generated by hypermail 2.3.0 : Mon Feb 16 2015 - 20:24:09 CET