1 static char vprmSCCSid[] = "@(#)vprm.c 1.4\t11/04/87"; 2 3 #include <sys/param.h> 4 #include <sys/dir.h> 5 #include <sys/stat.h> 6 #include <stdio.h> 7 8 char *basename(); 9 10 extern char _sobuf[]; 11 12 main(argc, argv) 13 int argc; 14 char *argv[]; 15 { 16 setbuf(stdout, _sobuf); 17 argc--, argv++; 18 if (argc == 0) { 19 fprintf(stderr, "usage: vprm [ id ... ] [ filename ... ] [ user ... ]\n"); 20 exit(1); 21 } 22 23 /* Look for something to delete both in Varian and Versatec spool dirs. */ 24 delete("Varian", "/usr/spool/vad", argc, argv); 25 delete("Versatec", "/usr/spool/vpd", argc, argv); 26 } 27 28 /* 29 * Look through the argv list for things to delete. 30 */ 31 32 delete(devname, spooldir, argc, argv) 33 char *devname, *spooldir, *argv[]; 34 int argc; 35 { 36 DIR *dir; /* The spool dir. */ 37 struct direct *dirp; /* An entry read from the spool dir.*/ 38 int deletion = 0; /* Flag noting something has been deleted. */ 39 40 /* Change to the spool directory. */ 41 if (chdir(spooldir) < 0) { 42 perror(spooldir); 43 return(1); 44 } 45 46 /* Open it. */ 47 if ((dir = opendir(".")) == NULL) { 48 perror(spooldir); 49 return(1); 50 } 51 52 printf("%s -", devname); 53 54 /* 55 * Loop through the args and the spool dir, looking for a spool 56 * command file (has a prefix of 'df'), 57 * and trying to match it with the argument. 58 */ 59 while (argc-- > 0) { 60 rewinddir(dir); 61 while ((dirp = readdir(dir)) != NULL) { 62 if (dirp->d_name[0] == 'd' && 63 dirp->d_name[1] == 'f' && 64 delcheck(dirp->d_name, *argv)) { 65 printf(" removing %s", &(dirp->d_name[3])); 66 deletion = 1; 67 } 68 } 69 argv++; 70 } 71 closedir(dir); 72 if (!deletion) 73 printf(" nothing to remove\n"); 74 else 75 putchar('\n'); 76 } 77 78 79 /* 80 * delcheck tries to match the given arg against the given command file in 81 * various ways. For instance, if dfname = 'dfa12345', then there is a match if 82 * arg == 'dfa12345', or 83 * arg == '12345', or 84 * arg == the name given on the L line of the file (the owner), or 85 * arg == the basename of a file given on a command line in the file. 86 * If there is a match, all the U (unlink) commands in the command file 87 * are executed, and then the command file itself is unlinked. 88 */ 89 90 int 91 delcheck(dfname, arg) 92 char *dfname, *arg; 93 { 94 FILE *df = NULL; /* The command file. */ 95 int delfile = 0; /* A match was found, so do a deletion. */ 96 char line[256]; /* Command line in command file. */ 97 98 if (strcmp(arg, dfname) == 0) 99 delfile = 1; /* arg == 'dfa12345'. */ 100 else if (strcmp(arg, dfname+3) == 0) 101 delfile = 1; /* arg == '12345' (skip 'dfa'). */ 102 else { /* No match; look inside on command lines. */ 103 if ((df = fopen(dfname, "r")) == NULL) 104 return(0); 105 while (!delfile && getline(df, line)) { 106 switch (line[0]) { 107 case 'L': 108 /* Check owner name. */ 109 if (strcmp(arg, line+1) == 0) 110 delfile = 1; 111 break; 112 113 case 'C': 114 case 'V': 115 case 'F': 116 case 'G': 117 case 'P': 118 case 'T': 119 /* Check command line arg. */ 120 if (strcmp (basename(arg), basename(line)) == 0) 121 delfile = 1; 122 break; 123 } 124 } 125 } 126 127 if (delfile) { 128 if (df == NULL) /* File not open yet. */ 129 df = fopen(dfname, "r"); 130 if (df == NULL) 131 return(0); 132 133 /* Run through the command file, executing Unlink commands. */ 134 rewind(df); 135 while (getline(df, line)) { 136 if (line[0] == 'U') 137 unlink(line+1); 138 } 139 140 unlink(dfname); /* Now unlink the command file itself. */ 141 } 142 143 if (df != NULL) 144 fclose(df); 145 return(delfile); 146 } 147 148 149 150 151 getline(file, line) 152 FILE *file; 153 char *line; 154 { 155 register int i, c; 156 157 i = 0; 158 while ((c = getc(file)) != '\n') { 159 if (c <= 0) 160 return(0); 161 if (i < 256) 162 line[i++] = c; 163 } 164 line[i++] = 0; 165 return (1); 166 } 167 168 169 /* 170 * basename gets the final component of the given pathname. E.g. "c" in 171 * /a/b/c. 172 */ 173 174 char * 175 basename(pathname) 176 char *pathname; 177 { 178 register char *lastname; 179 180 lastname = pathname + strlen(pathname)-1; /* Move to last char in name. */ 181 while (lastname >= pathname) { 182 if (*lastname == '/') 183 return(lastname + 1); 184 lastname--; 185 } 186 return(pathname); /* No /'s at all. */ 187 } 188