2.11BSD/ingres/source/support/sysmod.c
# include "../ingres.h"
# include "../aux.h"
# include "../lock.h"
# include "../access.h"
# include "../batch.h"
extern int Status;
char *Fileset;
char Noupdt = FALSE;
char *Dummy;
char **Xparams = &Dummy;
struct modtabl
{
char *rname;
char **parvec;
int goahead;
int normgo;
int optn;
};
char *Relpar[] =
{
"relation", "hash", "name",
"relid", (char *) -1
};
char *Attpar[] =
{
"attribute", "hash", "name",
"attrelid", "attowner", "#attid",
(char *) -1
};
char *Indpar[] =
{
"indexes", "hash", "name",
"irelidp", "iownerp", "",
"minpages", "5", (char *) -1
};
char *Trepar[] =
{
"tree", "hash", "name",
"treerelid", "treeowner", "treetype",
(char *) -1
};
char *Propar[] =
{
"protect", "hash", "name",
"prorelid", "proowner", "",
"minpages", "4", (char *) -1
};
char *Intpar[] =
{
"integrities", "hash", "name",
"intrelid", "intrelowner", "",
"minpages", "4", (char *) -1
};
struct modtabl Modtabl[] =
{
"relation", &Relpar[0], FALSE, TRUE, FALSE,
"attribute", &Attpar[0], FALSE, TRUE, FALSE,
"indexes", &Indpar[0], FALSE, TRUE, FALSE,
"tree", &Trepar[0], FALSE, TRUE, TRUE,
"protect", &Propar[0], FALSE, TRUE, TRUE,
"integrities", &Intpar[0], FALSE, TRUE, TRUE,
0
};
/*
** SYSMOD -- Modify system catalogs to a predetermined
** storage structure with predetermined keys.
*/
main(argc, argv)
int argc;
char *argv[];
{
register int i;
register int j;
register char **av;
char *p;
int retval;
char fileset[10], proctab[100];
extern char *Parmvect[];
extern char *Flagvect[];
extern char *Dbpath;
int superuser;
tTrace(&argc, argv, 'T');
itoa(getpid(), fileset);
Fileset = fileset;
i = initucode(argc, argv, TRUE, NULL, M_EXCL);
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 = FALSE;
for (av = Flagvect; (p = *av) != NULL; av++)
{
if (p[0] != '-')
{
badflag:
printf("Bad flag: %s\n", p);
goto usage;
}
switch (p[1])
{
case 's':
if ((Status & U_SUPER) == 0)
{
printf("Only INGRES can use the -s flag\n");
exit(-1);
}
superuser = TRUE;
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 there are any arguments, verify that they are valid
** names of relations which can be modified by this program.
** if there are no arguments, assume all system relations are to be
** modified.
*/
if (Parmvect[1] != NULL)
if ((Parmvect[2] == NULL) && sequal(Parmvect[1], "all"))
for (i = 0; Modtabl[i].rname; i++)
Modtabl[i].goahead = TRUE;
else
for (av = &Parmvect[1]; (p = *av) != NULL; 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 = TRUE;
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 + 3;
j = 0;
while (*av != -1)
{
j++;
av++;
}
j += 3;
smove(Fileset, Batchbuf.file_id);
if (retval = modify(j, Modtabl[i].parvec))
{
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 = FALSE;
if (m->optn)
{
if (openr(&des, -1, m->rname))
{
ret = TRUE;
}
}
return (ret);
}
rubproc()
{
printf("sysmod interrupted\n");
exit(1);
}