|
|
1.1 ! root 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 all; ! 9: char vpddir[] = "/usr/vpd"; ! 10: FILE *df; ! 11: FILE *dfb; ! 12: ! 13: main(argc, argv) ! 14: int argc; ! 15: char *argv[]; ! 16: { ! 17: register int i; ! 18: register char *ap, *cp; ! 19: int cnt; ! 20: ! 21: if (chdir(vpddir) < 0) ! 22: perror(vpddir), exit(1); ! 23: df = fopen(".", "r"); ! 24: if (df == NULL) ! 25: perror(vpddir), exit(1); ! 26: argc--, argv++; ! 27: if (argc == 0) { ! 28: printf("usage: vprm [ id ... ] [ filename ... ] [ user ... ]\n"); ! 29: exit(1); ! 30: } ! 31: do { ! 32: if (strcmp(*argv, "-a") == 0) ! 33: all++; ! 34: clobber(*argv++); ! 35: } while (--argc); ! 36: } ! 37: ! 38: clobber(cp) ! 39: char *cp; ! 40: { ! 41: struct dir dirent; ! 42: int did = 0; ! 43: ! 44: rewind(df); ! 45: while (fread(&dirent, sizeof dirent, 1, df) == 1) { ! 46: if (dirent.d_ino == 0) ! 47: continue; ! 48: if (dirent.d_name[0] != 'd' || dirent.d_name[1] != 'f') ! 49: continue; ! 50: if (dirent.d_name[7] == 0 || dirent.d_name[8] != 0) ! 51: continue; ! 52: if (chkclob(cp, dirent.d_name)) { ! 53: did++; ! 54: printf("removing %s\n", dirent.d_name+3); ! 55: unlink(dirent.d_name); ! 56: dirent.d_name[0] = 'c'; unlink(dirent.d_name); ! 57: dirent.d_name[2] = 'b'; unlink(dirent.d_name); ! 58: dirent.d_name[2] = 'a'; ! 59: dirent.d_name[0] = 'l'; unlink(dirent.d_name); ! 60: dirent.d_name[0] = 't'; unlink(dirent.d_name); ! 61: dirent.d_name[0] = 'd'; ! 62: } ! 63: } ! 64: if (did == 0) ! 65: fprintf(stderr, "%s: nothing to remove\n", cp); ! 66: } ! 67: ! 68: chkclob(pattern, file) ! 69: char *pattern, *file; ! 70: { ! 71: register char *id = pattern; ! 72: ! 73: /* ! 74: * Quick check for matching id ! 75: */ ! 76: if (any(id[0], "cd") && id[1] == 'f' && id[2] == 'a') ! 77: id += 3; ! 78: if (strcmp(file+3, id) == 0) ! 79: return (1); ! 80: /* ! 81: * Now check for matching filename 'B', 'F' or id 'L' ! 82: */ ! 83: dfb = fopen(file, "r"); ! 84: if (dfb == NULL) ! 85: return (0); ! 86: while (getline()) switch (line[0]) { ! 87: ! 88: case 'L': ! 89: case 'B': ! 90: case 'F': ! 91: case 'T': ! 92: if (strcmp(line+1, pattern) == 0) { ! 93: fclose(dfb); ! 94: return (1); ! 95: } ! 96: continue; ! 97: } ! 98: fclose(dfb); ! 99: return (0); ! 100: } ! 101: ! 102: any(c, cp) ! 103: char c; ! 104: register char *cp; ! 105: { ! 106: ! 107: while (*cp) ! 108: if (c == *cp++) ! 109: return (1); ! 110: return (0); ! 111: } ! 112: ! 113: getline() ! 114: { ! 115: register int i, c; ! 116: ! 117: i = 0; ! 118: while ((c = getc(dfb)) != '\n') { ! 119: if (c <= 0) ! 120: return(0); ! 121: if (i < 100) ! 122: line[i++] = c; ! 123: } ! 124: line[i++] = 0; ! 125: return (1); ! 126: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.