ING_DB
This commit is contained in:
parent
706ced15ba
commit
0a43b96573
|
|
@ -0,0 +1,217 @@
|
||||||
|
# include <stdio.h>
|
||||||
|
# include "gen.h"
|
||||||
|
|
||||||
|
# define CLOSED '?'
|
||||||
|
|
||||||
|
# include "../h/dbs.h"
|
||||||
|
# include "../h/symbol.h"
|
||||||
|
# include "../h/pipes.h"
|
||||||
|
# include "../h/bs.h"
|
||||||
|
# include "../h/aux.h"
|
||||||
|
# include "IIglobals.h"
|
||||||
|
|
||||||
|
# ifdef P8000
|
||||||
|
ret_buf IIjmp_buf;
|
||||||
|
# else
|
||||||
|
jmp_buf IIjmp_buf;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
int IIqlpid; /* process id of DBS */
|
||||||
|
int IIin_retrieve; /* set if inside a retrieve */
|
||||||
|
int IIndoms; /* # of domains in this retrieve */
|
||||||
|
int IIdoms; /* index into source field of buf */
|
||||||
|
long IItupcnt; /* # tuples which satified last */
|
||||||
|
struct retsym IIretsym[MAXDOM]; /* retrieve table */
|
||||||
|
struct retsym IIr_sym; /* type, length fields used by new */
|
||||||
|
|
||||||
|
int IIw_down; /* pipe descriptors for */
|
||||||
|
int IIr_down; /* parser communcation */
|
||||||
|
int IIr_front; /* pipe descriptor for */
|
||||||
|
/* ovqp ommunication */
|
||||||
|
struct pipfrmt IIeinpipe; /* the data pipe structure */
|
||||||
|
struct pipfrmt IIinpipe; /* the control pipe struct */
|
||||||
|
struct pipfrmt IIoutpipe; /* the pipe for writing queries */
|
||||||
|
|
||||||
|
static char *IImainpr = "/bin/iql";
|
||||||
|
# ifdef ESER_PSU
|
||||||
|
static char II_PASSWD[] = "/SYS/PASSWD";
|
||||||
|
# else
|
||||||
|
static char II_PASSWD[] = "/etc/passwd";
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
** IIGETPATH -- initialize the IIPathname variable
|
||||||
|
**
|
||||||
|
** Sets IIPathname to the home directory of the USERDBS
|
||||||
|
** [bs.h] user.
|
||||||
|
*/
|
||||||
|
# ifdef DBS_PATH
|
||||||
|
char *IIPathname = DBS_PATH;
|
||||||
|
# else
|
||||||
|
static char IIPathbuf[41];
|
||||||
|
char *IIPathname = IIPathbuf;
|
||||||
|
|
||||||
|
IIgetpath()
|
||||||
|
{
|
||||||
|
static char reenter;
|
||||||
|
register int i;
|
||||||
|
register int c;
|
||||||
|
register char *lp;
|
||||||
|
register FILE *iop;
|
||||||
|
char line[MAXLINE + 1];
|
||||||
|
char *field[UF_NFIELDS];
|
||||||
|
|
||||||
|
if (reenter)
|
||||||
|
return;
|
||||||
|
else
|
||||||
|
reenter++;
|
||||||
|
|
||||||
|
if (!(iop = fopen(II_PASSWD, "r")))
|
||||||
|
IIsyserr("Passwordfile %s nicht lesbar", II_PASSWD);
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
/* get a line from the II_PASSWD */
|
||||||
|
i = 0;
|
||||||
|
for (lp = line; (c = getc(iop)) != '\n'; )
|
||||||
|
{
|
||||||
|
if (c <= 0)
|
||||||
|
IIsyserr("Nutzer %s im Passwordfile %s nicht verzeichnet", USERDBS, II_PASSWD);
|
||||||
|
if (++i > sizeof line - 1)
|
||||||
|
{
|
||||||
|
*lp = '\0';
|
||||||
|
IIsyserr("GETPATH: Zeilenpufferueberlauf bei \"%s\"", line);
|
||||||
|
}
|
||||||
|
*lp++ = c;
|
||||||
|
}
|
||||||
|
*lp = '\0';
|
||||||
|
for (i = 0, lp = line; *lp; lp++)
|
||||||
|
{
|
||||||
|
if (*lp == ':')
|
||||||
|
{
|
||||||
|
*lp = '\0';
|
||||||
|
field[++i] = lp + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (!IIsequal(line, USERDBS));
|
||||||
|
fclose(iop);
|
||||||
|
|
||||||
|
/* check for enough fields for valid entry */
|
||||||
|
if (i < PF_HOME)
|
||||||
|
IIsyserr("Zu wenig Felder in dem Eintrag \"%s\"", line);
|
||||||
|
|
||||||
|
/* check that pathname won't overflow static buffer */
|
||||||
|
if ((i = IIlength(field[PF_HOME]) + 1) > sizeof IIPathbuf)
|
||||||
|
IIsyserr("DBS-Pfadname \"%s\" ist zu lang", field[PF_HOME]);
|
||||||
|
|
||||||
|
/* move pathname into buffer */
|
||||||
|
IIbmove(field[PF_HOME], IIPathname, i);
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** IIdbs opens the needed pipes and
|
||||||
|
** forks an DBS process.
|
||||||
|
**
|
||||||
|
** DBS recognizes the EQL flag followed by
|
||||||
|
** three control characters as being an EQL processes
|
||||||
|
**
|
||||||
|
** parameters to DBS are passed directly. only
|
||||||
|
** the first 9 are counted.
|
||||||
|
*/
|
||||||
|
IIdbs(p1, p2, p3, p4, p5, p6, p7, p8, p9)
|
||||||
|
char *p1, *p2, *p3, *p4, *p5, *p6, *p7, *p8, *p9;
|
||||||
|
{
|
||||||
|
int pipes[6]; /* pipe vector buffer */
|
||||||
|
char eoption[10]; /* dummy var to hold -EQL option */
|
||||||
|
register char *cp;
|
||||||
|
char *argv[12];
|
||||||
|
register char **ap;
|
||||||
|
extern char *IIconcatv();
|
||||||
|
extern IIresync();
|
||||||
|
extern *(IIinterrupt)();
|
||||||
|
extern exit();
|
||||||
|
extern int (*signal())();
|
||||||
|
|
||||||
|
# ifdef xETR1
|
||||||
|
if (IIdebug)
|
||||||
|
printf("DBS\n");
|
||||||
|
# endif
|
||||||
|
/* test if DBS is already invoked */
|
||||||
|
if (IIqlpid)
|
||||||
|
IIsyserr("Zweites ## DBS-Statement");
|
||||||
|
|
||||||
|
IIgetpath();
|
||||||
|
/* open DBS pipes */
|
||||||
|
if (pipe(&pipes[0]) || pipe(&pipes[2]) || pipe(&pipes[4]))
|
||||||
|
IIsyserr("DBS: PIPE ERROR");
|
||||||
|
|
||||||
|
IIw_down = pipes[1]; /* file desc for EQL->parser */
|
||||||
|
IIr_down = pipes[2]; /* file desc for parser->EQL */
|
||||||
|
IIr_front = pipes[4]; /* file desc for ovqp->EQL */
|
||||||
|
|
||||||
|
/* catch interupts if they are not being ignored */
|
||||||
|
if (signal(2, (int (*)()) 1) != (int (*)()) 1)
|
||||||
|
{
|
||||||
|
signal(2, IIresync);
|
||||||
|
signal(3, IIresync);
|
||||||
|
}
|
||||||
|
/* prime the control pipes */
|
||||||
|
IIrdpipe(P_PRIME, &IIinpipe);
|
||||||
|
IIwrpipe(P_PRIME, &IIoutpipe, IIw_down);
|
||||||
|
|
||||||
|
/* set up EQL option flag */
|
||||||
|
cp = eoption;
|
||||||
|
*cp++ = '-';
|
||||||
|
*cp++ = EQL;
|
||||||
|
*cp++ = pipes[0] | 0100;
|
||||||
|
*cp++ = pipes[3] | 0100;
|
||||||
|
*cp++ = CLOSED; /* this will be the EQL->ovqp pipe in the future */
|
||||||
|
*cp++ = pipes[5] | 0100;
|
||||||
|
/* put "6.2" at end of flag for OVQP to not do flush after
|
||||||
|
* every tuple
|
||||||
|
*/
|
||||||
|
*cp++ = '6';
|
||||||
|
*cp++ = '.';
|
||||||
|
*cp++ = '2';
|
||||||
|
*cp = '\0';
|
||||||
|
|
||||||
|
fflush(stdout);
|
||||||
|
if ((IIqlpid = fork()) < 0)
|
||||||
|
IIsyserr("DBS: FORK ERROR");
|
||||||
|
/* if parent, close the unneeded files and return */
|
||||||
|
if (IIqlpid)
|
||||||
|
{
|
||||||
|
close(pipes[0]);
|
||||||
|
close(pipes[3]);
|
||||||
|
close(pipes[5]);
|
||||||
|
# ifdef xETR1
|
||||||
|
if (IIdebug)
|
||||||
|
printf("## DBS database %s\n", p1);
|
||||||
|
# endif
|
||||||
|
/* resync to child */
|
||||||
|
IIrdpipe(P_INT, &IIinpipe, IIr_down);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* the child overlays .../bin/iql */
|
||||||
|
ap = argv;
|
||||||
|
*ap++ = "iql";
|
||||||
|
*ap++ = eoption;
|
||||||
|
*ap++ = p1;
|
||||||
|
*ap++ = p2;
|
||||||
|
*ap++ = p3;
|
||||||
|
*ap++ = p4;
|
||||||
|
*ap++ = p5;
|
||||||
|
*ap++ = p6;
|
||||||
|
*ap++ = p7;
|
||||||
|
*ap++ = p8;
|
||||||
|
*ap++ = p9;
|
||||||
|
*ap = (char *) 0;
|
||||||
|
execv(cp = IIconcatv(IIPathname, IImainpr), argv);
|
||||||
|
IIsyserr("DBS: EXEC ERROR \"%s\"", cp);
|
||||||
|
}
|
||||||
|
|
||||||
|
# ifndef SIGN_EXT
|
||||||
|
# include "../gutil/i1toi2.c"
|
||||||
|
# endif
|
||||||
Loading…
Reference in New Issue