1 #include <sys/types.h> 2 #include <dir.h> 3 #include <stat.h> 4 #include <stdio.h> 5 6 char line[128]; 7 int linel; 8 int wide; 9 char *spooldir; 10 FILE *df; 11 FILE *dfb; 12 extern char _sobuf[]; 13 14 main(argc, argv) 15 int argc; 16 char *argv[]; 17 { 18 register int i; 19 register char *ap, *cp; 20 int cnt; 21 int oldargc; 22 char **oldargv; 23 24 setbuf(stdout, _sobuf); 25 argc--, argv++; 26 if (argc == 0) { 27 fprintf(stderr, "usage: vprm [ id ... ] [ filename ... ] [ user ... ]\n"); 28 exit(1); 29 } 30 31 32 oldargc = argc; oldargv = argv; 33 34 printf("Varian - "); 35 if (chdir("/usr/spool/vad") < 0) 36 perror("/usr/spool/vad"); 37 else { 38 df = fopen(".", "r"); 39 if (df == NULL) 40 perror("/usr/spool/vad"); 41 else do { 42 clobber(*oldargv++); 43 } while (--oldargc); 44 } 45 46 printf("Versatec - "); 47 if (chdir("/usr/spool/vpd") < 0) 48 perror("/usr/spool/vpd"); 49 else { 50 df = fopen(".", "r"); 51 if (df == NULL) 52 perror("/usr/spool/vpd"); 53 else do { 54 clobber(*argv++); 55 } while (--argc); 56 } 57 } 58 59 clobber(cp) 60 char *cp; 61 { 62 struct dir dirent; 63 int did = 0; 64 65 rewind(df); 66 while (fread(&dirent, sizeof dirent, 1, df) == 1) { 67 if (dirent.d_ino == 0) 68 continue; 69 if (dirent.d_name[0] != 'd' || dirent.d_name[1] != 'f') 70 continue; 71 if (dirent.d_name[7] == 0 || dirent.d_name[8] != 0) 72 continue; 73 if (chkclob(cp, dirent.d_name)) { 74 did++; 75 printf("removing %s\n", dirent.d_name+3); 76 unlink(dirent.d_name); 77 dirent.d_name[0] = 'c'; unlink(dirent.d_name); 78 dirent.d_name[2] = 'b'; unlink(dirent.d_name); 79 dirent.d_name[2] = 'a'; 80 dirent.d_name[0] = 'l'; unlink(dirent.d_name); 81 dirent.d_name[0] = 't'; unlink(dirent.d_name); 82 dirent.d_name[0] = 'd'; 83 } 84 } 85 if (did == 0) 86 printf("%s: nothing to remove\n", cp); 87 } 88 89 chkclob(pattern, file) 90 char *pattern, *file; 91 { 92 register char *id = pattern; 93 94 /* 95 * Quick check for matching id 96 */ 97 if (any(id[0], "cd") && id[1] == 'f' && id[2] == 'a') 98 id += 3; 99 if (strcmp(file+3, id) == 0) 100 return (1); 101 /* 102 * Now check for matching filename 'B', 'F' or id 'L' 103 */ 104 dfb = fopen(file, "r"); 105 if (dfb == NULL) 106 return (0); 107 while (getline()) switch (line[0]) { 108 109 case 'L': 110 case 'B': 111 case 'F': 112 case 'T': 113 if (strcmp(line+1, pattern) == 0) { 114 fclose(dfb); 115 return (1); 116 } 117 continue; 118 } 119 fclose(dfb); 120 return (0); 121 } 122 123 any(c, cp) 124 char c; 125 register char *cp; 126 { 127 128 while (*cp) 129 if (c == *cp++) 130 return (1); 131 return (0); 132 } 133 134 getline() 135 { 136 register int i, c; 137 138 i = 0; 139 while ((c = getc(dfb)) != '\n') { 140 if (c <= 0) 141 return(0); 142 if (i < 100) 143 line[i++] = c; 144 } 145 line[i++] = 0; 146 return (1); 147 } 148