[net.sources] Save your important files with this code

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);
}