Save your important files with this code
utzoo!decvax!harpo!floyd!vax135!lime!we13!rjk
utzoo!decvax!harpo!floyd!vax135!lime!we13!rjk
Sat May 29 12:51:15 AEST 1982
/* 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);
}
More information about the Comp.sources.unix
mailing list