rjk (05/29/82)
/* Save - save files in $HOME/SAVDIR. Use during development * of software. Converted from shell to C. * RJKing WECo-MG6565 Nov 79 * Updates, mods: RJKing WECo-MG6565 Mar 82 */ #include <stdio.h> #include <fcntl.h> #define SAVDIR ".safe_deposit" char *getenv(), *strrchr(), *strncpy(); main(argc, argv) char *argv[]; { register int cmp; register char *tp; char bnam[16], sdir[64], savf[64], buff[8]; if(argc == 1) { fprintf(stderr, "usage: save fil1 [ fil2 ] [ ... ]\n"); exit(1); } if((tp = getenv("HOME")) == NULL) { fprintf(stderr, "save: cannot get HOME variable\n"); exit(1); } sprintf(sdir, "%s/%s", tp, SAVDIR); if(access(sdir, 0) < 0) { switch(fork()) { case -1: perror("fork for mkdir"); exit(1); case 0: execl("/bin/mkdir", "mkdir", sdir, 0); perror("/bin/mkdir"); default: wait((int *)0); } } if(access(sdir, 7) < 0) { perror(sdir); exit(1); } while(argc > 1) { if(tp = strrchr(argv[1], '/')) strncpy(bnam, tp +1, 14); else strncpy(bnam, argv[1], 14); sprintf(savf, "%s/%s", sdir, bnam); if(access(savf, 0) == 0) { if((cmp = compare(savf, argv[1])) == 0) { printf("saved %s is identical\n", bnam); --argc; ++argv; continue; } if(cmp < 0) { --argc; ++argv; continue; } printf("overwrite existing saved %s? ", bnam); fgets(buff, sizeof(buff), stdin); if(*buff == 'y') saveit(argv[1], savf, bnam); } else saveit(argv[1], savf, bnam); --argc; ++argv; } } compare(fil1, fil2) char *fil1, *fil2; { register int i, f1, f2; int fd1, fd2, retn; char buf1[512], buf2[512]; if((fd1 = open(fil1, O_RDONLY)) < 0) { perror(fil1); return(-1); } if((fd2 = open(fil2, O_RDONLY)) < 0) { perror(fil2); close(fd1); return(-1); } for(;;) { f1 = read(fd1, buf1, sizeof(buf1)); f2 = read(fd2, buf2, sizeof(buf2)); if(f1 != f2) { retn = 1; break; } if((f1 == 0) && (f2 == 0)) { retn = 0; break; } for(retn=i=0; i<f1; ++i) { if(buf1[i] != buf2[i]) { retn = 1; break; } } if(retn != 0) break; } close(fd1); close(fd2); return(retn); } saveit(frfl, tofl, bnam) char *frfl, *tofl, *bnam; { register int i, fr, to; char buff[1024]; if((fr = open(frfl, O_RDONLY)) < 0) { perror(frfl); return; } unlink(tofl); if((to = open(tofl, O_WRONLY |O_CREAT |O_TRUNC, 0400)) < 0) { perror(tofl); close(fr); return; } while((i = read(fr, buff, sizeof(buff))) > 0) write(to, buff, (unsigned)i); close(fr); close(to); chown(tofl, getuid(), getgid()); printf("%s saved in $HOME/%s\n", bnam, SAVDIR); }