--- 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 +#include +#include #include +#include #include #include +#include #include +#include + 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