--- newoldar.c.orig 2020-11-19 16:42:08.172565183 -0500 +++ newoldar.c 2020-11-19 16:44:50.784705159 -0500 @@ -1,21 +1,30 @@ -/* from 2.9bsd src/cmd/ar.c and include/ar.h -- this takes care of 0177545 archive files - * (the "new old" type) +/* + * newoldar - from 2.9bsd src/command/ar.c and include/ar.h -- this takes care of 0177545 archive files + * (the "new old" type) + * updated 11/19/20 to compile with a modern compiler on a Mac */ +#include <stdlib.h> +#include <unistd.h> +#include <fcntl.h> #include <stdio.h> +#include <machine/types.h> #include <sys/types.h> #include <sys/stat.h> +#include <string.h> #include <signal.h> +#include <time.h> + struct stat stbuf; #if BYTE_ORDER == LITTLE_ENDIAN #define PDPTOHL(x) (((x & 0xffff) << 16) | ((x & 0xffff0000) >> 16)) #define HTOPDPL(x) PDPTOHL(x) #else -#define SWITCHWORD(x) (((x & 0xff) << 8) | ((x & 0xff00) >> 8)) +#define BYTESWAPWORD(x) ((unsigned short int) ((((x) & 0xff) << 8) | (((x) >>8) & 0xff))) #define PDPTOHL(x) \ - ((SWITCHWORD(x & 0xffff) << 16) \ - | SWITCHWORD((x & 0xffff0000) >> 16))) + ((BYTESWAPWORD(x & 0xffff) << 16) \ + | BYTESWAPWORD((x & 0xffff0000) >> 16))) #define HTOPDPL(x) PDPTOHL(x) #endif @@ -24,29 +33,22 @@ #define OODD 4 #define HEAD 8 +#define OARMAG 0177555 #define ARMAG 0177545 + struct ar_hdr { - char ar_name[14]; - long ar_date; - char ar_uid; - char ar_gid; - unsigned short ar_mode; - long ar_size; + int8_t ar_name[14]; + int32_t ar_date; + int8_t ar_uid; + int8_t ar_gid; + uint16_t ar_mode; + int32_t ar_size; }__attribute__((packed)); struct ar_hdr arbuf; char *man = { "mrxtdpq" }; char *opt = { "uvnbail" }; int signum[] = {SIGHUP, SIGINT, SIGQUIT, 0}; -int sigdone(); -int rcmd(); -int dcmd(); -int xcmd(); -int tcmd(); -int pcmd(); -int mcmd(); -int qcmd(); -int (*comfun)(); char flg[26]; char **namv; int namc; @@ -68,14 +70,46 @@ int bastate; char buf[512]; -char *trim(); -char *mktemp(); -char *ctime(); +void bamatch(void); +void cleanup(void); +void copyfil(int, int, int); +void dcommand(void); +void done(int); +int getaf(void); +int getdir(void); +void getqf(void); +void init(void); +void install(void); +void longt(void); +int match(void); +void mcommand(void); +void mesg(int); +int morefil(void); +void movefil(int); +void noar(void); +int notfound(void); +void pcommand(void); +void phserr(void); +void pmode(void); +void qcommand(void); +void rcommand(void); +void selectp(int *); +void sigdone(int); +int stats(void); +void tcommand(void); +char *trim(char *); +void usage(void); +void wrerr(void); +void xcommand(void); -main(argc, argv) -char *argv[]; + +int (*comfun)(void); +void setcom(int (*)(void)); + +int +main(int argc, char *argv[]) { - register i; + register int i; register char *cp; for(i=0; signum[i]; i++) @@ -98,31 +132,31 @@ continue; case 'r': - setcom(rcmd); + setcom((int (*)(void))rcommand); continue; case 'd': - setcom(dcmd); + setcom((int (*)(void))dcommand); continue; case 'x': - setcom(xcmd); + setcom((int (*)(void))xcommand); continue; case 't': - setcom(tcmd); + setcom((int (*)(void))tcommand); continue; case 'p': - setcom(pcmd); + setcom((int (*)(void))pcommand); continue; case 'm': - setcom(mcmd); + setcom((int (*)(void))mcommand); continue; case 'q': - setcom(qcmd); + setcom((int (*)(void))qcommand); continue; default: @@ -152,14 +186,15 @@ fprintf(stderr, "ar: one of [%s] must be specified\n", man); done(1); } - setcom(rcmd); + setcom((int (*)(void))rcommand); } (*comfun)(); done(notfound()); + return(0); } -setcom(fun) -int (*fun)(); +void +setcom(int (*fun)(void) ) { if(comfun != 0) { @@ -169,9 +204,9 @@ comfun = fun; } -rcmd() +void rcommand(void) { - register f; + register int f; init(); getaf(); @@ -201,7 +236,7 @@ cleanup(); } -dcmd() +void dcommand(void) { init(); @@ -219,9 +254,10 @@ install(); } -xcmd() + +void xcommand(void) { - register f; + register int f; if(getaf()) noar(); @@ -245,7 +281,8 @@ } } -pcmd() + +void pcommand(void) { if(getaf()) @@ -263,7 +300,7 @@ } } -mcmd() +void mcommand(void) { init(); @@ -289,7 +326,8 @@ install(); } -tcmd() + +void tcommand(void) { if(getaf()) @@ -304,9 +342,9 @@ } } -qcmd() +void qcommand(void) { - register i, f; + register int i, f; if (flg['a'-'a'] || flg['b'-'a']) { fprintf(stderr, "ar: abi not allowed with q\n"); @@ -333,9 +371,9 @@ } } -init() +void init(void) { - static mbuf = ARMAG; + static uint16_t mbuf = ARMAG; tfnam = mktemp(tmpnam_hah_hah); close(creat(tfnam, 0600)); @@ -348,9 +386,9 @@ wrerr(); } -getaf() +int getaf(void) { - unsigned short mbuf; + uint16_t mbuf; af = open(arnam, 0); if(af < 0) @@ -363,9 +401,9 @@ return(0); } -getqf() +void getqf(void) { - unsigned short mbuf; + uint16_t mbuf; if ((qf = open(arnam, 2)) < 0) { if(!flg['c'-'a']) @@ -386,25 +424,27 @@ } } -usage() +void usage(void) { printf("usage: ar [%s][%s] archive files ...\n", opt, man); done(1); } -noar() +void noar(void) { fprintf(stderr, "ar: %s does not exist\n", arnam); done(1); } -sigdone() +void sigdone(int sig) { done(100); } -done(c) + +void +done(int c) { if(tfnam) @@ -416,9 +456,10 @@ exit(c); } -notfound() +int +notfound(void) { - register i, n; + register int i, n; n = 0; for(i=0; i<namc; i++) @@ -429,9 +470,10 @@ return(n); } -morefil() +int +morefil(void) { - register i, n; + register int i, n; n = 0; for(i=0; i<namc; i++) @@ -440,9 +482,9 @@ return(n); } -cleanup() +void cleanup(void) { - register i, f; + register int i, f; for(i=0; i<namc; i++) { file = namv[i]; @@ -460,9 +502,10 @@ install(); } -install() +void +install(void) { - register i; + register int i; for(i=0; signum[i]; i++) signal(signum[i], SIG_IGN); @@ -499,15 +542,16 @@ * insert the file 'file' * into the temporary file */ -movefil(f) +void movefil(int f) { register char *cp; - register i; + register int i; cp = trim(file); for(i=0; i<14; i++) - if(arbuf.ar_name[i] = *cp) + if ((arbuf.ar_name[i] = *cp)) { cp++; + } arbuf.ar_size = HTOPDPL(stbuf.st_size); arbuf.ar_date = HTOPDPL(stbuf.st_mtime); arbuf.ar_uid = stbuf.st_uid; @@ -517,9 +561,9 @@ close(f); } -stats() +int stats(void) { - register f; + register int f; f = open(file, 0); if(f < 0) @@ -535,9 +579,10 @@ * copy next file * size given in arbuf */ -copyfil(fi, fo, flag) +void +copyfil(int fi, int fo, int flag) { - register i, o; + register int i, o; int pe; int arsize = PDPTOHL(arbuf.ar_size); @@ -567,9 +612,9 @@ phserr(); } -getdir() +int getdir(void) { - register i; + register int i; i = read(af, (char *)&arbuf, sizeof arbuf); if(i != sizeof arbuf) { @@ -586,9 +631,10 @@ return(0); } -match() +int +match(void) { - register i; + register int i; for(i=0; i<namc; i++) { if(namv[i] == 0) @@ -602,9 +648,10 @@ return(0); } -bamatch() +void +bamatch(void) { - register f; + register int f; switch(bastate) { @@ -629,12 +676,13 @@ } } -phserr() +void phserr(void) { fprintf(stderr, "ar: phase error on %s\n", file); } -mesg(c) +void +mesg(int c) { if(flg['v'-'a']) @@ -642,9 +690,9 @@ printf("%c - %s\n", c, file); } + char * -trim(s) -char *s; +trim(char *s) { register char *p1, *p2; @@ -678,16 +726,17 @@ #define XOTH 01 #define STXT 01000 -longt() +void +longt(void) { - register char *cp; - long ardate = PDPTOHL(arbuf.ar_date); - long arsize = PDPTOHL(arbuf.ar_size); + char *cp; + time_t ardate = PDPTOHL(arbuf.ar_date); + int32_t arsize = PDPTOHL(arbuf.ar_size); pmode(); printf("%3d/%1d", arbuf.ar_uid, arbuf.ar_gid); printf(" %7D", arsize); - cp = ctime(&ardate); + cp = ctime(&(ardate)); printf(" %-12.12s %-4.4s ", cp+4, cp+20); } @@ -703,16 +752,17 @@ int *m[] = { m1, m2, m3, m4, m5, m6, m7, m8, m9}; -pmode() +void +pmode(void) { register int **mp; for (mp = &m[0]; mp < &m[9];) - select(*mp++); + selectp(*mp++); } -select(pairp) -int *pairp; +void +selectp(int *pairp) { register int n, *ap; @@ -723,7 +773,8 @@ putchar(*ap); } -wrerr() +void +wrerr(void) { perror("ar write error"); done(1);