typedef char bool; extern short *tT; struct relation { char relid[ 12 ]; char relowner[2]; char relspec; char relindxd; short relstat2; short relstat; long relsave; long reltups; short relatts; short relwid; long relprim; long relfree; long relstamp; }; struct attribute { char attrelid[ 12 ]; char attowner[2]; short attid; char attname[ 12 ]; short attoff; char attfrmt; char attfrml; char attxtra; }; struct tup_id { char line_id, pg2, pg1, pg0; }; typedef struct tup_id TID; typedef union { long ltid; TID s_tupid; } tid_type; struct descriptor { struct relation reldum; char relvname[ 12 ]; short relfp; short relopn; tid_type reltid; long reladds; short reloff[ 50 ]; char relfrmt[ 50 ]; char relfrml[ 50 ]; char relxtra[ 50 ]; char relgiven[ 50 ]; }; typedef struct descriptor DESC; typedef struct { DESC *rngvdesc; bool rngvmark; } RANGEV; union anytype { char i1type; short i2type; long i4type; float f4type; double f8type; char c0type[1]; char *cptype; char **cpptype; }; typedef union anytype ANYTYPE; struct accessparam { short mode; short sec_index; char keydno[ 50 + 1]; }; struct desxx { char *cach_relname; DESC *cach_desc; DESC *cach_alias; }; extern char *Usercode; extern char *Pathname; struct out_arg { int c0width; int i1width; int i2width; int i4width; int f4width; int f8width; int f4prec; int f8prec; char f4style; char f8style; int linesperpage; char coldelim; }; struct lockreq { char lract; char lrtype; char lrmod; char dbnode[4]; char lrel[4]; char lpage[4]; }; extern char Acclock; extern int Alockdes; extern int Lockrel; struct accbuf { long mainpg; long ovflopg; short nxtlino; char firstup[ 1024 - 12]; short linetab[1]; long rel_tupid; long thispage; int filedesc; struct accbuf *modf; struct accbuf *modb; int bufstatus; }; struct { char acc_buf[3 ]; }; extern struct accbuf *Acc_head; extern struct accbuf *Acc_tail; extern struct accbuf Acc_buf[3 ]; struct adminhdr { char adowner[2]; short adflags; short adlength; short adversion; short adreldsz; short adattdsz; }; struct admin { struct adminhdr adhdr; struct descriptor adreld; struct descriptor adattd; }; extern struct admin Admin; struct pgtuple { struct tup_id childtid; char childtup[ 1010 ]; }; extern long Accuread, Accuwrite; extern char *Acctuple; extern Accerror; extern char Accanon[ 1010 ]; struct batchbuf { char file_id[ 6 ]; char bbuf[506 ]; }; struct si_doms { short rel_off; short tupo_off; short dom_size; }; struct batchhd { char db_name[15]; char rel_name[13]; char userid[2]; long num_updts; short mode_up; short tido_size; short tupo_size; short tupn_size; short tidn_size; short si_dcount; struct si_doms si[ 50 +1]; }; short Batch_fp; short Batch_cnt; short Batch_dirty; short Batch_lread; short Batch_recovery; extern char *Fileset; struct batchbuf Batchbuf; struct batchhd Batchhd; typedef struct { short pv_type; short pv_len; union { short pv_int; struct querytree *pv_qtree; char *pv_str; char *pv_tuple; } pv_val; } PARM; static char Sccsid[] = "@(#)sysmod.c 7.1 2/5/81"; extern int Status; short tTdbu[100]; char *Fileset; char Noupdt = 0 ; char *Dummy; char **Xparams = &Dummy; struct modtabl { char *rname; char **parvec; int goahead; int normgo; int optn; }; char *Relpar[] = { "relation", "hash", "name", "relid", 0 }; char *Attpar[] = { "attribute", "hash", "name", "attrelid", "attowner", "#attid", 0 }; char *Indpar[] = { "indexes", "hash", "name", "irelidp", "iownerp", "", "minpages", "5", 0 }; char *Trepar[] = { "tree", "hash", "name", "treerelid", "treeowner", "treetype", 0 }; char *Propar[] = { "protect", "hash", "name", "prorelid", "prorelown", 0 }; char *Intpar[] = { "integrities", "hash", "name", "intrelid", "intrelowner", 0 }; struct modtabl Modtabl[] = { "relation", &Relpar[0], 0 , 1 , 0 , "attribute", &Attpar[0], 0 , 1 , 0 , "indexes", &Indpar[0], 0 , 1 , 0 , "tree", &Trepar[0], 0 , 1 , 1 , "protect", &Propar[0], 0 , 1 , 1 , "integrities", &Intpar[0], 0 , 1 , 1 , 0 }; main(argc, argv) int argc; char *argv[]; { register int i; register int j; register char **av; PARM newpvec[40]; char *p; int retval; char fileset[10], proctab[100]; extern char *Parmvect[]; extern char *Flagvect[]; extern char *Dbpath; int superuser; argv[argc] = 0 ; tTrace(argv, 'T', tTdbu, 100); itoa(getpid(), fileset); Fileset = fileset; i = initucode(argc, argv, 1 , 0 , 1); switch (i) { case 0: case 5: break; case 1: case 6: printf("Database %s does not exist\n", Parmvect[0]); exit(-1); case 2: printf("You are not authorized for database %s\n", Parmvect[0]); exit(-1); case 3: printf("You are not a valid INGRES user\n"); exit(-1); case 4: printf("No database name specified\n"); usage: printf("Usage: sysmod [-s] [+-w] dbname [relation ...]\n"); exit(-1); default: syserr("initucode %d", i); } concat(Pathname, "/bin/ksort", proctab); Dummy = proctab; superuser = 0 ; for (av = Flagvect; (p = *av) != 0 ; av++) { if (p[0] != '-') { badflag: printf("Bad flag: %s\n", p); goto usage; } switch (p[1]) { case 's': if ((Status & 0100000 ) == 0) { printf("Only INGRES can use the -s flag\n"); exit(-1); } superuser = 1 ; break; case 'T': break; default: goto badflag; } } if (chdir(Dbpath) < 0) { printf("data base %s does not exist\n", Parmvect[0]); exit(1); } if (superuser) bmove(Admin.adhdr.adowner, Usercode, 2); if (!bequal(Usercode, Admin.adhdr.adowner, 2)) { printf("you are not the dba for %s\n", Parmvect[0]); exit(1); } if (Parmvect[1] != 0 ) if ((Parmvect[2] == 0 ) && sequal(Parmvect[1], "all")) for (i = 0; Modtabl[i].rname; i++) Modtabl[i].goahead = 1 ; else for (av = &Parmvect[1]; (p = *av) != 0 ; av++) { for (j = 0; Modtabl[j].rname; j++) { if (sequal(p, Modtabl[j].rname)) { if (Modtabl[j].goahead) { printf("%s duplicate relation name\n", p); exit(1); } Modtabl[j].goahead = 1 ; break; } } if (!Modtabl[j].rname) { printf("%s is not a system relation\n", p); exit(1); } } else for (i = 0; Modtabl[i].rname; i++) Modtabl[i].goahead = Modtabl[i].normgo; for (i = 0; Modtabl[i].rname; i++) { if (Modtabl[i].goahead == 0 || optn_rel(&Modtabl[i])) continue; printf("modifying %s\n", Modtabl[i].rname); av = Modtabl[i].parvec; j = 0; while (*av != 0 ) { newpvec[j].pv_type = 2 ; newpvec[j].pv_val.pv_str = *av; newpvec[j].pv_len = length(*av) + 1; j++; av++; } newpvec[j].pv_type = 0 ; smove(Fileset, Batchbuf.file_id); if ( (( 0 < 0) ? tT[1] : (tT[1] & (1 << 0)))) { prvect(j, newpvec); } if (retval = modify(j, newpvec)) { printf("Error %d on %s\n", retval, Modtabl[i].rname); exit(1); } } printf("sysmod done\n"); exit(0); } optn_rel(mx) struct modtabl *mx; { register struct modtabl *m; register int ret; struct descriptor des; m = mx; ret = 0 ; if (m->optn) { if (openr(&des, -1, m->rname)) { ret = 1 ; } } return (ret); } rubproc() { printf("sysmod interrupted\n"); exit(1); }