This commit is contained in:
Oliver Lehmann 1989-04-04 08:44:43 +00:00
parent 3046bc250c
commit d1c174e06a
6 changed files with 1146 additions and 0 deletions

View File

@ -0,0 +1,117 @@
# include <stdio.h>
# include "gen.h"
# include "../h/dbs.h"
# include "../h/aux.h"
# include "../h/access.h"
# include "../h/symbol.h"
# include "../h/lock.h"
# include "../h/bs.h"
# ifdef P8000
ret_buf AAjmp_buf;
# else
jmp_buf AAjmp_buf;
# endif
int Noupdt;
extern char *Parmvect[];
extern char *Flagvect[];
extern char *AAdbpath;
extern char *AAproc_name;
main(argc, argv)
int argc;
char *argv[];
{
register char **av;
register char *p;
register int i;
char null;
AAproc_name = "COPYR";
# ifdef xSTR1
AAtTrace(&argc, argv, 'X');
# endif
switch (i = initucode(argc, argv, TRUE, (char **) 0, M_SHARE))
{
case 0:
case 5:
break;
case 1:
case 6:
AAsyserr(0, "Die Datenbank `%s' existiert nicht", Parmvect[0]);
case 2:
AAsyserr(0, "Sie duerfen auf die Datenbank `%s' nicht zugreifen", Parmvect[0]);
case 3:
AAsyserr(0, "Sie sind kein eingetragener DBS-Nutzer");
case 4:
printf("Sie haben keinen Datenbanknamen angegeben\n");
usage:
AAsyserr(0, "HINWEIS: copyr db_name rel_name {dom_name format} into|from file_name");
default:
AAsyserr(22200, AAproc_name, i);
}
for (i = 0, av = Flagvect; p = *av; av++)
{
printf("Unbekanntes Flag `%s'\n", p);
i++;
}
if (i)
goto usage;
for (i = 0; Parmvect[i]; i++)
continue;
if ((argc = i) < 4 || argc % 2)
goto usage;
/* initialize access methods (and AAdmin struct) for user_ovrd test */
AAam_start();
opencatalog(AA_REL, 2);
/* do function */
for (i = 0; i < argc - 3; i++)
Parmvect[i] = Parmvect[i + 1];
null = 0;
Parmvect[argc - 3] = &null;
copy(argc, Parmvect);
/* logout database */
closecatalog(TRUE);
AAunldb();
AAam_exit();
fflush(stdout);
exit(0);
}
char *AArelpath(rel)
register char *rel;
{
extern char *AAztack();
return (AAztack(AAztack(AAdbpath, "/"), rel));
}
rubproc()
{
AAunlall();
fflush(stdout);
exit(1);
}
/* substitution */
fullwait() {}
fork() {}
pipe() {}

View File

@ -0,0 +1,104 @@
# include <stdio.h>
# include "gen.h"
# include "../h/dbs.h"
# include "../h/aux.h"
# include "../h/access.h"
# include "../h/symbol.h"
# include "../h/lock.h"
# include "../h/bs.h"
# ifdef P8000
ret_buf AAjmp_buf;
# else
jmp_buf AAjmp_buf;
# endif
extern char *Parmvect[];
extern char *Flagvect[];
extern char *AAdbpath;
extern int Standalone;
main(argc, argv)
int argc;
char *argv[];
{
register char **av;
register char *p;
register int i;
extern char *AAproc_name;
AAproc_name = "DESTROYR";
# ifdef xSTR1
AAtTrace(&argc, argv, 'X');
# endif
switch (i = initucode(argc, argv, TRUE, (char **) 0, M_SHARE))
{
case 0:
case 5:
break;
case 1:
case 6:
AAsyserr(0, "Die Datenbank `%s' existiert nicht", Parmvect[0]);
case 2:
AAsyserr(0, "Sie duerfen auf die Datenbank `%s' nicht zugreifen", Parmvect[0]);
case 3:
AAsyserr(0, "Sie sind kein eingetragener DBS-Nutzer");
case 4:
printf("Sie haben keinen Datenbanknamen angegeben\n");
usage:
AAsyserr(0, "HINWEIS: destroyr db_name {rel_name}");
default:
AAsyserr(22200, AAproc_name, i);
}
for (i = 0, av = Flagvect; p = *av; av++)
{
printf("Unbekanntes Flag `%s'\n", p);
i++;
}
if (i)
goto usage;
for (i = 0; Parmvect[i]; i++)
continue;
if ((argc = i) < 2)
goto usage;
if (chdir(AAdbpath) < 0)
AAsyserr(22201, AAproc_name, AAdbpath);
/* hello eric */
Standalone = 0;
/* initialize access methods (and AAdmin struct) for user_ovrd test */
AAam_start();
opencatalog(AA_REL, 2);
/* do function */
Parmvect[argc] = (char *) -1;
destroy(--argc, &Parmvect[1]);
/* logout database */
closecatalog(TRUE);
AAunldb();
AAam_exit();
fflush(stdout);
exit(0);
}
rubproc()
{
AAunlall();
fflush(stdout);
exit(1);
}

View File

@ -0,0 +1,232 @@
# include <stdio.h>
# include "gen.h"
# include "../h/dbs.h"
# include "../h/aux.h"
# include "../h/access.h"
# include "../h/batch.h"
# include "../h/symbol.h"
# include "../h/lock.h"
# include "../h/bs.h"
# ifdef P8000
ret_buf AAjmp_buf;
# else
jmp_buf AAjmp_buf;
# endif
char KSORT[] = "/sys/bin/dbu___s";
char SYSNAME[] = "_SYS";
int s_SYSNAME = sizeof SYSNAME - 1;
char *Fileset;
char *Ksort;
char **Xparams = &Ksort;
int Noupdt;
int Where;
char *Fillflag;
char *Fillfactor;
char *Minflag;
char *Minpages;
char *Maxflag;
char *Maxpages;
char *Storage_structure = "isam";
int Tidp;
struct batchbuf Batchbuf;
extern char *Parmvect[];
extern char *Flagvect[];
extern char *AAdbpath;
extern char *AApath;
extern char *AAproc_name;
main(argc, argv)
int argc;
char *argv[];
{
register char **av;
register char *p;
register int i;
char null;
char ksort[100];
char fileset[6];
AAproc_name = "INDEXR";
# ifdef xSTR1
AAtTrace(&argc, argv, 'X');
# endif
switch (i = initucode(argc, argv, TRUE, (char **) 0, M_SHARE))
{
case 0:
case 5:
break;
case 1:
case 6:
AAsyserr(0, "Die Datenbank '%s' existiert nicht", Parmvect[0]);
case 2:
AAsyserr(0, "Sie duerfen auf die Datenbank '%s' nicht zugreifen", Parmvect[0]);
case 3:
AAsyserr(0, "Sie sind kein eingetragener DBS-Nutzer");
case 4:
printf("Sie haben keinen Datenbanknamen angegeben\n");
usage:
AAsyserr(0, "HINWEIS: indexr db_name prim_rel index_rel {dom_name}");
default:
AAsyserr(22200, AAproc_name, i);
}
for (i = 0, av = Flagvect; p = *av; av++)
{
if (*p == '-')
{
if (where_flag(p + 1))
continue;
switch (p[1])
{
case 'N':
case 'n':
Storage_structure = &p[2];
continue;
case 'T':
case 't':
Tidp++;
continue;
}
}
printf("Unbekanntes Flag '%s'\n", p);
i++;
}
if (i)
goto usage;
for (i = 0; Parmvect[i]; i++)
continue;
if ((argc = i) < 4 || argc > 9)
goto usage;
if (chdir(AAdbpath) < 0)
AAsyserr(22201, AAproc_name, AAdbpath);
/* initialize access methods (and AAdmin struct) for user_ovrd test */
AAam_start();
opencatalog(AA_REL, 2);
/* do function index */
if (sec_index(argc - 1, &Parmvect[1]))
goto no_modify;
/* do function modify */
AA_itoa(getpid(), Fileset = fileset);
AAconcat(AApath, KSORT, ksort);
Ksort = ksort;
Parmvect[0] = Parmvect[2];
Parmvect[1] = Storage_structure;
Parmvect[2] = "name";
if (Tidp)
Parmvect[argc++] = "tidp";
if (Where)
{
i = argc;
null = 0;
Parmvect[i++] = &null;
if (Fillflag)
{
Parmvect[i++] = Fillflag;
Parmvect[i++] = Fillfactor;
}
if (Minflag)
{
Parmvect[i++] = Minflag;
Parmvect[i++] = Minpages;
}
if (Maxflag)
{
Parmvect[i++] = Maxflag;
Parmvect[i++] = Maxpages;
}
argc = i;
}
Parmvect[argc] = (char *) -1;
Parmvect[argc + 1] = (char *) 0;
modify(argc, Parmvect);
no_modify:
/* logout database */
closecatalog(TRUE);
AAunldb();
AAam_exit();
fflush(stdout);
exit(0);
}
where_flag(flag)
register char *flag;
{
register char *f;
long i;
for (f = flag; *f && *f != ':'; f++)
continue;
if (!*f)
return (0);
*f++ = 0;
if ((AAsequal(flag, "fillfactor")
# ifdef ESER
|| AAsequal(flag, "FILLFACTOR")
# endif
) && !AA_atol(f, &i))
{
Fillflag = flag;
Fillfactor = f;
goto flag_ok;
}
if ((AAsequal(flag, "minpages")
# ifdef ESER
|| AAsequal(flag, "MINPAGES")
# endif
) && !AA_atol(f, &i))
{
Minflag = flag;
Minpages = f;
goto flag_ok;
}
if ((AAsequal(flag, "maxpages")
# ifdef ESER
|| AAsequal(flag, "MAXPAGES")
# endif
) && !AA_atol(f, &i))
{
Maxflag = flag;
Maxpages = f;
flag_ok:
Where++;
return (1);
}
*--f = ':';
return (0);
}
rubproc()
{
AAunlall();
fflush(stdout);
exit(1);
}

View File

@ -0,0 +1,99 @@
# include <stdio.h>
# include "gen.h"
# include "../h/dbs.h"
# include "../h/aux.h"
# include "../h/access.h"
# include "../h/symbol.h"
# include "../h/lock.h"
# include "../h/bs.h"
# ifdef P8000
ret_buf AAjmp_buf;
# else
jmp_buf AAjmp_buf;
# endif
extern char *Parmvect[];
extern char *Flagvect[];
extern char *AAdbpath;
main(argc, argv)
int argc;
char *argv[];
{
register char **av;
register char *p;
register int i;
extern char *AAproc_name;
AAproc_name = "SAVER";
# ifdef xSTR1
AAtTrace(&argc, argv, 'X');
# endif
switch (i = initucode(argc, argv, TRUE, (char **) 0, M_SHARE))
{
case 0:
case 5:
break;
case 1:
case 6:
AAsyserr(0, "Die Datenbank `%s' existiert nicht", Parmvect[0]);
case 2:
AAsyserr(0, "Sie duerfen auf die Datenbank `%s' nicht zugreifen", Parmvect[0]);
case 3:
AAsyserr(0, "Sie sind kein eingetragener DBS-Nutzer");
case 4:
printf("Sie haben keinen Datenbanknamen angegeben\n");
usage:
AAsyserr(0, "HINWEIS: saver db_name rel_name month day year");
default:
AAsyserr(22200, AAproc_name, i);
}
for (i = 0, av = Flagvect; p = *av; av++)
{
printf("Unbekanntes Flag `%s'\n", p);
i++;
}
if (i)
goto usage;
for (i = 0; Parmvect[i]; i++)
continue;
if ((argc = i) != 5)
goto usage;
if (chdir(AAdbpath) < 0)
AAsyserr(22201, AAproc_name, AAdbpath);
/* initialize access methods (and AAdmin struct) for user_ovrd test */
AAam_start();
opencatalog(AA_REL, 0);
/* do function */
save(argc - 1, &Parmvect[1]);
/* logout database */
closecatalog(TRUE);
AAunldb();
AAam_exit();
fflush(stdout);
exit(0);
}
rubproc()
{
AAunlall();
fflush(stdout);
exit(1);
}

View File

@ -0,0 +1,312 @@
# include <stdio.h>
# include "gen.h"
# include "../h/dbs.h"
# include "../h/aux.h"
# include "../h/access.h"
# include "../h/lock.h"
/*
** These are subroutines common to RESTORE and PURGE.
*/
char All;
char Qrymod;
char Superuser;
char Ask;
char Purge;
char No_purge;
char No_sysmod;
char Clean;
char Lastflag;
struct directory
{
# ifndef NON_V7_FS
short inumber;
# endif
char fname[MAXNAME + 3];
};
# ifndef NON_V7_FS
int Direc_fd;
# endif
extern int AAdbstat;
extern char *AAusercode;
char **Dblist;
/*
** INITIALIZE GLOBALS
**
** Set up AAusercode and AAdbstat
*/
initialize(argc, argv)
int argc;
char **argv;
{
register int i;
register char *p;
register char **av;
char datadir[MAXLINE];
extern char *AAproc_name;
extern char *Flagvect[];
extern char *Parmvect[];
extern long lseek();
AAproc_name = "INITIALIZE";
# ifdef xSTR2
AAtTfp(40, 0, "entered initialize\n");
# endif
i = initucode(argc, argv, FALSE, (char *) 0, -1);
# ifdef xSTR2
AAtTfp(40, 1, "initucode ret:%d\n", i);
# endif
switch (i)
{
case 0:
break;
case 3:
AAsyserr(0, "Sie sind kein eingetragener DBS-Nutzer");
default:
AAsyserr(22200, AAproc_name, i);
}
initdbpath((char *) 0, datadir, FALSE);
# ifdef xSTR2
AAtTfp(40, 2, "scanning flags\n");
# endif
for (av = Flagvect; *av; av++)
{
p = *av;
if (p[0] != '-')
{
badflag:
AAsyserr(0, "Unbekanntes Flag %s", p);
}
switch (p[1])
{
case 'A':
case 'a':
Ask++;
break;
case 'f':
Clean++;
break;
case 'p':
Purge++;
break;
case 'P':
No_purge++;
break;
case 's':
if (sucheck())
Superuser++;
else
AAsyserr(0, "Sie duerfen das -s Flag nicht verwenden");
break;
case 'S':
No_sysmod++;
break;
default:
goto badflag;
}
}
Dblist = Parmvect;
if (!*Dblist)
{
# ifdef xSTR2
AAtTfp(40, 3, "doing all\n");
# endif
All++;
# ifdef NON_V7_FS
if (!open_dir(datadir))
AAsyserr(21131);
# else
if ((Direc_fd = open(datadir, 0)) < 0)
AAsyserr(21131);
lseek(Direc_fd, 32L, 0);
# endif
}
# ifdef xSTR2
AAtTfp(40, 0, "leaving initialize\n");
# endif
return (0);
}
/*
** CHECK FOR SUPERUSER
**
** The user has requested the -s flag. Can he do it? Will Martha
** recover from cancer? Will Dick get the girl? Stay tuned for
** "sucheck".
**
** Permission is based on the U_SUPER bit in the status field
** in the AA_USERS.
*/
sucheck()
{
return (AAdbstat & U_SUPER);
}
/*
** GET NEXT DATABASE
**
** The next database to be purged is selected. It comes from
** either the directory or the database list.
**
** Getnxtdb() leaves the user in the database directory.
*/
char *getnxtdb()
{
# ifdef NON_V7_FS
extern char *read_dir();
# endif
static struct directory buf;
register char *db;
register int admin_fd;
register int i;
extern struct admin AAdmin;
static char dbpbuf[MAXLINE];
# ifdef xSTR2
AAtTfp(41, 0, "entered getnxtdb\n");
# endif
for ( ; ; )
{
if (All)
{
# ifdef NON_V7_FS
if (db = read_dir())
{
/* throw out legitimate files */
if (AAsequal(db, ".") || AAsequal(db, ".."))
continue;
AAbmove(db, buf.fname, MAXNAME + 2);
db = buf.fname;
}
# else
if ((i = read(Direc_fd, &buf, 16)) < 16)
db = (char *) 0;
else
{
if (!buf.inumber)
continue;
db = buf.fname;
}
# endif
buf.fname[MAXNAME + 2] = 0;
}
else
db = *Dblist++;
if (!db)
{
# ifdef NON_V7_FS
close_dir();
# else
if (Direc_fd);
close(Direc_fd);
# endif
return ((char *) 0);
}
# ifdef xSTR2
AAtTfp(41, 1, "using %s as Database\n", db);
# endif
i = initdbpath(db, dbpbuf, TRUE);
# ifdef xSTR2
AAtTfp(41, 3, "INITDBPATH: ret %d, %s\n", i, dbpbuf);
# endif
switch (i)
{
case 0:
case 1:
break;
case 2:
case 3:
printf("Die Datenbank %s existiert nicht\n", db);
continue;
default:
AAsyserr(21132, i);
}
if (chdir(dbpbuf) < 0)
{
printf("Fehler bei cd %s.", dbpbuf);
continue;
}
# ifdef xSTR2
AAtTfp(41, 4, "chdir ok, Superuser: %d\n", Superuser);
# endif
if ((admin_fd = open(AA_ADMIN, 0)) < 0)
{
printf("Fehler beim Eroeffnen des DBA file %s/admin\n", dbpbuf);
continue;
}
read(admin_fd, &AAdmin.adhdr, sizeof AAdmin.adhdr);
close(admin_fd);
# ifdef xSTR2
AAtTfp(41, 5, "dba: %.2s\n", AAdmin.adhdr.adowner);
# endif
/* set qrymod flag from database status */
Qrymod = ((AAdmin.adhdr.adflags & A_QRYMOD) == A_QRYMOD);
/* check for dba of database if not superuser */
if (Superuser || AAbequal(AAdmin.adhdr.adowner, AAusercode, 2))
break;
/*
** not DBA isn't an error if running in all mode since user
** couln't have specified the database
*/
if (All)
continue;
printf("Sie sind nicht der DBA der Datenbank %s\n", db);
}
# ifdef xSTR2
AAtTfp(41, 6, "leaving getnxtdb, %s ok\n", db);
# endif
return (db);
}
/*
** ASK
** If Ask is set desplay prompt and look for 'y' and return TRUE
** If Ask is not set return TRUE
*/
ask(prompt)
register char *prompt;
{
char line[MAXLINE];
extern char Ask;
extern char *fgetline();
if (!Ask)
return (TRUE);
printf("**\t\t%s ? *\b", prompt);
if (!fgetline(line, MAXLINE, stdin))
AAsyserr(21133);
return (line[0] == 'y');
}

View File

@ -0,0 +1,282 @@
# include <stdio.h>
# include "gen.h"
# include "../h/dbs.h"
# include "../h/aux.h"
# include "../h/lock.h"
# include "../h/access.h"
# include "../h/batch.h"
# include "../h/bs.h"
# ifdef P8000
ret_buf AAjmp_buf;
# else
jmp_buf AAjmp_buf;
# endif
extern int AAdbstat;
short Qrymod;
char *Fileset;
int Noupdt = FALSE;
char *Dummy;
char **Xparams = &Dummy;
struct batchbuf Batchbuf;
char Header[] = "**\t\t";
char KSORT[] = "/sys/bin/dbu___s";
struct modtabl
{
char *rname;
char **parvec;
short qmcatalogs;
short goahead;
short normgo;
short optn;
};
char *Relpar[] =
{
AA_REL,
"hash",
"name",
"relid",
(char *) -1
};
char *Attpar[] =
{
AA_ATT,
"hash",
"name",
"attrelid", "attowner", "#attid",
(char *) -1
};
char *Indpar[] =
{
AA_INDEX,
"hash",
"name",
"irelidp", "iownerp",
"",
"minpages", "5",
(char *) -1
};
char *Trepar[] =
{
AA_TREE,
"hash",
"name",
"treerelid", "treeowner", "treetype",
(char *) -1
};
char *Propar[] =
{
AA_PROTECT,
"hash",
"name",
"prorelid", "proowner",
"",
"minpages", "5",
(char *) -1
};
char *Intpar[] =
{
AA_INTEG,
"hash",
"name",
"intrelid", "intrelowner",
"",
"minpages", "5",
(char *) -1
};
char *Refpar[] =
{
AA_REF,
"hash",
"name",
"refrelid", "refowner", "reftype",
"",
"minpages", "5",
(char *) -1
};
struct modtabl Modtabl[] =
{
AA_REL, Relpar, FALSE, FALSE, TRUE, FALSE,
AA_ATT, Attpar, FALSE, FALSE, TRUE, FALSE,
AA_INDEX, Indpar, FALSE, FALSE, TRUE, FALSE,
AA_TREE, Trepar, TRUE, FALSE, TRUE, TRUE,
AA_PROTECT, Propar, TRUE, FALSE, TRUE, TRUE,
AA_INTEG, Intpar, TRUE, FALSE, TRUE, TRUE,
AA_REF, Refpar, TRUE, FALSE, TRUE, TRUE,
(char *) 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;
register char *p;
register int retval;
register int superuser;
char fileset[10];
char proctab[100];
extern char *Parmvect[];
extern char *Flagvect[];
extern char *AAdbpath;
extern char *AApath;
extern char *AAproc_name;
AAproc_name = "SYSMOD";
# ifdef xSTR1
AAtTrace(&argc, argv, 'X');
# endif
AA_itoa(getpid(), fileset);
Fileset = fileset;
i = initucode(argc, argv, TRUE, (char *) 0, M_EXCL);
printf("Datenbank %s\n", Parmvect[0]);
switch (i)
{
case 0:
case 5:
break;
case 1:
case 6:
AAsyserr(0, "Die Datenbank %s existiert nicht", Parmvect[0]);
case 2:
AAsyserr(0, "Sie duerfen auf die Datenbank %s nicht zugreifen", Parmvect[0]);
case 3:
AAsyserr(0, "Sie sind kein eingetragener DBS-Nutzer");
case 4:
printf("Sie haben keinen Datenbanknamen angegeben\n");
usage:
AAsyserr(0, "HINWEIS: sysmod [-s] [+-w] db_name {relation ...}");
default:
AAsyserr(22200, AAproc_name, i);
}
AAconcat(AApath, KSORT, proctab);
Dummy = proctab;
superuser = FALSE;
for (av = Flagvect; p = *av; av++)
{
if (p[0] != '-')
{
badflag:
printf("Unbekanntes Flag %s\n", p);
goto usage;
}
switch (p[1])
{
case 's':
if (!(AAdbstat & U_SUPER))
AAsyserr(0, "Sie duerfen das -s Flag nicht verwenden");
superuser = TRUE;
break;
default:
goto badflag;
}
}
if (chdir(AAdbpath) < 0)
AAsyserr(0, "Die Datenbank %s existiert nicht", Parmvect[0]);
if (superuser)
AAbmove(AAdmin.adhdr.adowner, AAusercode, 2);
if (!AAbequal(AAusercode, AAdmin.adhdr.adowner, 2))
AAsyserr(0, "Sie sind nicht der DBA der Datenbank %s", Parmvect[0]);
Qrymod = ((AAdmin.adhdr.adflags & A_QRYMOD) == A_QRYMOD);
/*
** 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])
if (!(Parmvect[2]) && AAsequal(Parmvect[1], "all"))
for (i = 0; Modtabl[i].rname; i++)
Modtabl[i].goahead = TRUE;
else
for (av = &Parmvect[1]; p = *av; av++)
{
for (j = 0; Modtabl[j].rname; j++)
{
if (!AAscompare(p, MAXNAME, Modtabl[j].rname, MAXNAME))
{
if (Modtabl[j].goahead)
AAsyserr(0, "Doppelt angegebener Relationsname %s", p);
Modtabl[j].goahead = TRUE;
break;
}
}
if (!Modtabl[j].rname)
AAsyserr(0, "%s ist kein Katalogname", p);
}
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 || optn_rel(&Modtabl[i]))
continue;
if (!Qrymod && Modtabl[i].qmcatalogs)
continue;
printf("%sKatalog %s\n", Header, Modtabl[i].rname);
av = Modtabl[i].parvec + 3;
j = 0;
while (*av != (char *) -1)
{
j++;
av++;
}
j += 3;
AAsmove(Fileset, Batchbuf.file_id);
if (retval = modify(j, Modtabl[i].parvec))
AAsyserr(0, "%sFehlernummer *%d*", Header, retval);
}
AAunldb();
fflush(stdout);
exit(0);
}
optn_rel(m)
register struct modtabl *m;
{
DESC des;
return (m->optn & AArelopen(&des, -1, m->rname));
}
rubproc()
{
printf("%sSYSMOD interrupted\n", Header);
AAunlall();
fflush(stdout);
exit(1);
}