313 lines
5.1 KiB
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');
|
|
}
|