3BSD/usr/src/cmd/versatec/vprm.c

Compare this file to the similar file:
Show the results in this format:

#include <sys/types.h>
#include <dir.h>
#include <stat.h>
#include <stdio.h>

char	line[128];
int	linel;
int	all;
char	vpddir[] = "/usr/vpd";
FILE	*df;
FILE	*dfb;

main(argc, argv)
	int argc;
	char *argv[];
{
	register int i;
	register char *ap, *cp;
	int cnt;

	if (chdir(vpddir) < 0)
		perror(vpddir), exit(1);
	df = fopen(".", "r");
	if (df == NULL)
		perror(vpddir), exit(1);
	argc--, argv++;
	if (argc == 0) {
		printf("usage: vprm [ id ... ] [ filename ... ] [ user ... ]\n");
		exit(1);
	}
	do {
		if (strcmp(*argv, "-a") == 0)
			all++;
		clobber(*argv++);
	} while (--argc);
}

clobber(cp)
	char *cp;
{
	struct dir dirent;
	int did = 0;

	rewind(df);
	while (fread(&dirent, sizeof dirent, 1, df) == 1) {
		if (dirent.d_ino == 0)
			continue;
		if (dirent.d_name[0] != 'd' || dirent.d_name[1] != 'f')
			continue;
		if (dirent.d_name[7] == 0 || dirent.d_name[8] != 0)
			continue;
		if (chkclob(cp, dirent.d_name)) {
			did++;
			printf("removing %s\n", dirent.d_name+3);
			unlink(dirent.d_name);
			dirent.d_name[0] = 'c'; unlink(dirent.d_name);
			dirent.d_name[2] = 'b'; unlink(dirent.d_name);
			dirent.d_name[2] = 'a';
			dirent.d_name[0] = 'l'; unlink(dirent.d_name);
			dirent.d_name[0] = 't'; unlink(dirent.d_name);
			dirent.d_name[0] = 'd';
		}
	}
	if (did == 0)
		fprintf(stderr, "%s: nothing to remove\n", cp);
}

chkclob(pattern, file)
	char *pattern, *file;
{
	register char *id = pattern;

	/*
	 * Quick check for matching id
	 */
	if (any(id[0], "cd") && id[1] == 'f' && id[2] == 'a')
		id += 3;
	if (strcmp(file+3, id) == 0)
		return (1);
	/*
	 * Now check for matching filename 'B', 'F' or id 'L'
	 */
	dfb = fopen(file, "r");
	if (dfb == NULL)
		return (0);
	while (getline()) switch (line[0]) {

	case 'L':
	case 'B':
	case 'F':
	case 'T':
		if (strcmp(line+1, pattern) == 0) {
			fclose(dfb);
			return (1);
		}
		continue;
	}
	fclose(dfb);
	return (0);
}

any(c, cp)
	char c;
	register char *cp;
{

	while (*cp)
		if (c == *cp++)
			return (1);
	return (0);
}

getline()
{
	register int i, c;

	i = 0;
	while ((c = getc(dfb)) != '\n') {
		if (c <= 0)
			return(0);
		if (i < 100)
			line[i++] = c;
	}
	line[i++] = 0;
	return (1);
}