P8000/WEGA/contrib/ingres/dbs/src/support/subs.c

313 lines
5.1 KiB
C

# 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');
}