|
|
1.1 ! root 1: # include <stdio.h> ! 2: # include <sys/types.h> ! 3: # include <sys/dir.h> ! 4: # include <ingres.h> ! 5: # include <aux.h> ! 6: # include <access.h> ! 7: # include <sccs.h> ! 8: ! 9: SCCSID(@(#)destroydb.c 8.3 1/31/86) ! 10: ! 11: /* ! 12: ** DESTROY DATA BASE ! 13: ** ! 14: ** This program destroys an existing database. To be able ! 15: ** to wield this awesome power, you must be the dba for ! 16: ** the database. Also, anyone has this power if the admin ! 17: ** the database, or the ingres superuser, and have the "-s" ! 18: ** flag requested. If admin is trashed, the INGRES superuser ! 19: ** must either destroy the database or recover it. ! 20: ** ! 21: ** If -m is specified, then the directory is not removed. ! 22: ** This is useful if the directory is a mounted file system. ! 23: */ ! 24: ! 25: extern char *Usercode; ! 26: extern int Status; ! 27: extern char *Pathname; ! 28: extern char *Parmvect[]; ! 29: extern char *Flagvect[]; ! 30: extern char *Dbpath; ! 31: struct admin Admin; ! 32: short tTdbu[100]; ! 33: ! 34: main(argc, argv) ! 35: int argc; ! 36: char *argv[]; ! 37: { ! 38: register int i; ! 39: register char *dbase; ! 40: int superuser, mounted; ! 41: char **av; ! 42: register char *p; ! 43: char *q; ! 44: # ifdef rewinddir ! 45: DIR *dirp; ! 46: # else rewinddir ! 47: FILE *iop; ! 48: # endif rewinddir ! 49: ! 50: argv[argc] = NULL; ! 51: # ifdef xSTR1 ! 52: tTrace(argv, 'T', tTdbu, 100); ! 53: # endif ! 54: ! 55: i = initucode(argc, argv, TRUE, NULL, -1); ! 56: dbase = Parmvect[0]; ! 57: # ifdef xSTR1 ! 58: if (tTf(1, 0)) ! 59: { ! 60: printf("after initcode %d: ", i); ! 61: prargs(argc, argv); ! 62: } ! 63: # endif ! 64: switch (i) ! 65: { ! 66: case 0: ! 67: case 5: ! 68: break; ! 69: ! 70: case 1: ! 71: case 6: ! 72: printf("Database %s does not exist\n", dbase); ! 73: exit(-1); ! 74: ! 75: case 2: ! 76: printf("You are not authorized to access database %s\n", dbase); ! 77: exit(-1); ! 78: ! 79: case 3: ! 80: printf("You are not an authorized INGRES user\n"); ! 81: exit(-1); ! 82: ! 83: case 4: ! 84: printf("No database name specified\n"); ! 85: usage: ! 86: printf("Usage: destroydb [-s] [-m] dbname\n"); ! 87: exit(-1); ! 88: ! 89: default: ! 90: syserr("initucode %d", i); ! 91: } ! 92: ! 93: mounted = superuser = 0; ! 94: for (av = Flagvect; (p = *av) != NULL; av++) ! 95: { ! 96: # ifdef xSTR1 ! 97: if (tTf(1, 1)) ! 98: printf("p = *av (\"%s\")\n", p); ! 99: # endif ! 100: if (p[0] != '-') ! 101: { ! 102: badflag: ! 103: printf("Bad flag %s\n", p); ! 104: goto usage; ! 105: } ! 106: switch (p[1]) ! 107: { ! 108: ! 109: case 's': ! 110: superuser++; ! 111: break; ! 112: ! 113: case 'm': ! 114: mounted++; ! 115: break; ! 116: ! 117: default: ! 118: goto badflag; ! 119: } ! 120: } ! 121: ! 122: if (Parmvect[1] != NULL) ! 123: { ! 124: printf("Too many parameters to destroydb\n"); ! 125: goto usage; ! 126: } ! 127: if (length(dbase) > 14) ! 128: syserr(0, "invalid dbname %s", dbase); ! 129: if (superuser && (Status & U_SUPER) == 0) ! 130: syserr(0, "you may not use the -s flag"); ! 131: ! 132: if (!superuser) ! 133: { ! 134: if (!bequal(Admin.adhdr.adowner, Usercode, UCODE_SZ)) ! 135: { ! 136: printf("You are not the DBA for %s\n", dbase); ! 137: exit(-1); ! 138: } ! 139: } ! 140: ! 141: if (chdir(Dbpath) < 0) ! 142: syserr("chdir %s", Dbpath); ! 143: ! 144: # ifdef rewinddir ! 145: if ( (dirp = opendir(".")) == NULL ) ! 146: syserr("Can't open . in %s",Dbpath); ! 147: clean(dirp); ! 148: closedir(dirp); ! 149: # else rewinddir ! 150: iop = fopen(".", "r"); ! 151: if (iop == NULL) ! 152: syserr("Cannot open dot in %s", Dbpath); ! 153: clean(iop); ! 154: fclose(iop); ! 155: # endif rewinddir ! 156: ! 157: if (!mounted) ! 158: { ! 159: /* find end of Dbpath and trim it off. */ ! 160: for (p = q = Dbpath; *p != '\0'; p++) ! 161: if (*p == '/') ! 162: q = p; ! 163: *q++ = '\0'; ! 164: if (chdir(Dbpath) < 0) ! 165: syserr("chdir(%s)", Dbpath); ! 166: if ( i == 5 ) ! 167: if ( unlink(ztack(ztack(Pathname,"/data/base/"),dbase)) == -1 ) ! 168: syserr("Can't unlink the indirect file %s",dbase); ! 169: execl("/bin/rmdir", "/bin/rmdir", q, 0); ! 170: perror("/bin/rmdir"); ! 171: } ! 172: } ! 173: ! 174: ! 175: ! 176: # ifdef rewinddir ! 177: clean(dirp) ! 178: register DIR *dirp; ! 179: { ! 180: struct direct *dp; ! 181: ! 182: # ifdef xSTR1 ! 183: if (tTf(2, 0)) ! 184: printf("clean: "); ! 185: # endif ! 186: ! 187: for ( dp = readdir(dirp) ; dp != NULL ; dp = readdir(dirp) ) ! 188: { ! 189: if ( !strcmp(".",dp->d_name) || !strcmp("..",dp->d_name) ) ! 190: continue; ! 191: # ifdef xSTR1 ! 192: if (tTf(2, 1)) ! 193: printf("unlinking %s\n", dp->d_name); ! 194: # endif ! 195: unlink(dp->d_name); ! 196: } ! 197: }/* clean */ ! 198: ! 199: # else rewinddir ! 200: ! 201: clean(f) ! 202: register FILE *f; ! 203: { ! 204: struct direc ! 205: { ! 206: struct direct d; ! 207: char null; ! 208: }; ! 209: struct direc cur; ! 210: ! 211: # ifdef xSTR1 ! 212: if (tTf(2, 0)) ! 213: printf("clean: "); ! 214: # endif ! 215: ! 216: cur.null = 0; ! 217: ! 218: /* skip "." and ".." entries */ ! 219: fread(&cur, sizeof cur.d, 1, f); ! 220: fread(&cur, sizeof cur.d, 1, f); ! 221: ! 222: /* scan directory */ ! 223: while (fread(&cur, sizeof cur.d, 1, f) > 0) ! 224: { ! 225: /* skip null entries */ ! 226: if (cur.d.d_ino == 0) ! 227: continue; ! 228: ! 229: # ifdef xSTR1 ! 230: if (tTf(2, 1)) ! 231: printf("unlinking %s\n", cur.d.d_name); ! 232: # endif ! 233: unlink(cur.d.d_name); ! 234: } ! 235: } ! 236: # endif rewinddir ! 237: ! 238: ! 239: ! 240: /* ! 241: ** Rubout processing. ! 242: */ ! 243: ! 244: rubproc() ! 245: { ! 246: exit(-2); ! 247: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.