Annotation of 42BSD/ingres/source/libq/IIingres.c, revision 1.1.1.1

1.1       root        1: # include      <ingres.h>
                      2: # include      <symbol.h>
                      3: # include      <opsys.h>
                      4: # include      <aux.h>
                      5: # include      "IIglobals.h"
                      6: # include      <pipes.h>
                      7: # include      <sccs.h>
                      8: # include      <signal.h>
                      9: 
                     10: SCCSID(@(#)IIingres.c  7.3     9/26/83)
                     11: 
                     12: # define       CLOSED  '?'
                     13: 
                     14: 
                     15: # ifdef xV7_UNIX
                     16: char   *IImainpr =     "ingres";
                     17: # else xV7_UNIX
                     18: char   *IImainpr =     "/usr/bin/ingresx";
                     19: # endif xV7_UNIX
                     20: 
                     21: char   IIPathname[41];
                     22: 
                     23: /*
                     24: **     IIingres opens the needed pipes and
                     25: **     forks an ingres process.
                     26: **
                     27: **     ingres recognizes the EQUEL flag followed by
                     28: **     three control characters as being an equel processes
                     29: **
                     30: **     parameters to ingres are passed directly. only
                     31: **     the first 9 are counted.
                     32: */
                     33: 
                     34: IIingres(p1, p2, p3, p4, p5, p6, p7, p8, p9)
                     35: char   *p1, *p2, *p3, *p4, *p5, *p6, *p7, *p8, *p9;
                     36: {
                     37:        int             pipes[4];               /* pipe vector buffer */
                     38:        char            eoption[15];    /* dummy variable to hold -EQUEL option */
                     39:        register char   *cp;
                     40:        char            *argv[12];
                     41:        register char   **ap;
                     42:        extern          IIresync();
                     43:        extern          *(IIinterrupt)(),       exit();
                     44:        pb_t            pb;
                     45: 
                     46: #      ifdef xETR1
                     47:        if (IIdebug)
                     48:                printf("IIingres\n");
                     49: #      endif
                     50:        /* test if ingres is already invoked */
                     51:        if (IIingpid)
                     52:                IIsyserr("Attempt to invoke INGRES twice");
                     53: 
                     54:        IIgetpath();
                     55:        /* open INGRES pipes */
                     56:        if (pipe(&pipes[0]) || pipe(&pipes[2]))
                     57:                IIsyserr("pipe error in IIingres");
                     58: 
                     59:        IIw_down = pipes[1];    /* file desc for equel->parser */
                     60:        IIr_down = pipes[2];    /* file desc for parser->equel */
                     61: 
                     62:        /* catch interupts if they are not being ignored */
                     63:        if (signal(SIGINT, SIG_IGN) != SIG_IGN)
                     64:                signal(SIGINT, IIresync);
                     65: 
                     66:        /* set up equel option flag */
                     67:        cp = eoption;
                     68:        *cp++ = '-';
                     69:        *cp++ = EQUEL;
                     70:        *cp++ = pipes[0] | 0100;
                     71:        *cp++ = pipes[1] | 0100;
                     72:        *cp++ = CLOSED;
                     73:        *cp++ = pipes[3] | 0100;
                     74:        *cp++ = CLOSED; /* this will be the equel->ovqp pipe in the future */
                     75:        *cp++ = CLOSED; /* old ovqp->equel pipe */
                     76:        /* put "6.3" at end of flag for OVQP to not do flush after
                     77:         * every tuple
                     78:         */
                     79:        *cp++ = '6';
                     80:        *cp++ = '.';
                     81:        *cp++ = '3';
                     82:        *cp = '\0';
                     83:        if (cp - eoption >= sizeof eoption)
                     84:                IIsyserr("IIingres: too big an eoption");
                     85: 
                     86:        if ((IIingpid = fork()) < 0)
                     87:                IIsyserr("IIingres:cant fork %d", IIingpid);
                     88:        /* if parent, close the unneeded files and return */
                     89:        if (IIingpid)
                     90:        {
                     91:                if (close(pipes[0]) || close(pipes[3]))
                     92:                        IIsyserr("close error 1 in IIingres");
                     93:                IIinput = IIr_down;
                     94:                IIpb_prime(&pb, PB_NOTYPE);
                     95: #              ifdef xETR1
                     96:                if (IIdebug)
                     97:                        printf("calling ingres with '%s' database %s\n", eoption, p1);
                     98: #              endif
                     99:                return;
                    100:        }
                    101:        /* the child overlays /usr/bin/ingres */
                    102:        ap = argv;
                    103:        *ap++ = "ingres";
                    104:        *ap++ = eoption;
                    105:        *ap++ = p1;
                    106:        *ap++ = p2;
                    107:        *ap++ = p3;
                    108:        *ap++ = p4;
                    109:        *ap++ = p5;
                    110:        *ap++ = p6;
                    111:        *ap++ = p7;
                    112:        *ap++ = p8;
                    113:        *ap++ = p9;
                    114:        *ap = 0;
                    115: # ifdef xV7_UNIX
                    116:        execvp(IImainpr, argv);
                    117: # else xV7_UNIX
                    118:        execv(IImainpr, argv);
                    119: # endif xV7_UNIX
                    120:        IIsyserr("cannot exec INGRES in IIingres");
                    121: }
                    122: 
                    123: /*
                    124: **  IIGETPATH -- initialize the IIPathname variable
                    125: **
                    126: **     Parameters:
                    127: **             none
                    128: **
                    129: **     Returns:
                    130: **             none
                    131: **
                    132: **     Side Effects:
                    133: **             Sets IIPathname to the home directory of the USERINGRES
                    134: **             [unix.h] user.
                    135: **
                    136: **     Called By:
                    137: **             IIingres.c
                    138: **
                    139: **     History:
                    140: **             3/26/79 -- (marc) written
                    141: */
                    142: 
                    143: IIgetpath()
                    144: {
                    145:        char                    line[MAXLINE + 1];
                    146:        static char             reenter;
                    147:        register int            i;
                    148:        register char           *lp;
                    149:        struct iob              iobuf;
                    150:        char                    *field[UF_NFIELDS];
                    151: 
                    152:        if (reenter)
                    153:                return;
                    154:        else
                    155:                reenter++;
                    156: 
                    157:        if ((i = IIfopen("/etc/passwd", &iobuf)) < 0)
                    158:                IIsyserr("IIgetpath: no /etc/passwd");
                    159: 
                    160:        do
                    161:        {
                    162:                /* get a line from the passwd file */
                    163:                i = 0;
                    164:                for (lp = line; (*lp = IIgetc(&iobuf)) != '\n'; lp++)
                    165:                {
                    166:                        if (*lp == -1)
                    167:                                IIsyserr("IIgetpath: no user 'ingres' in /etc/passwd");
                    168:                        if (++i > sizeof line - 1)
                    169:                        {
                    170:                                *lp = '\0';
                    171:                                IIsyserr("IIgetpath: line overflow: \"%s\"",
                    172:                                line);
                    173:                        }
                    174:                }
                    175:                *lp = '\0';
                    176:                for (i = 0, lp = line; *lp != '\0'; lp++)
                    177:                {
                    178:                        if (*lp == ':')
                    179:                        {
                    180:                                *lp = '\0';
                    181:                                if (i > UF_NFIELDS)
                    182:                                        IIsyserr("IIgetpath: too many fields in passwd \"%s\"",
                    183:                                        line);
                    184:                                field[i++] = lp + 1;
                    185:                        }
                    186:                }
                    187:                /* check for enough fields for valid entry */
                    188:                if (i < 3)
                    189:                        IIsyserr("IIgetpath: too few fields \"%s\"",
                    190:                        line);
                    191:        }  while (!IIsequal(line, USERINGRES));
                    192:        IIclose(&iobuf);
                    193: 
                    194:        /* check that pathname won't overflow static buffer */
                    195:        if (field[i - 1] - field[i - 2] > sizeof IIPathname)
                    196:                IIsyserr("IIgetpath: path too long \"%s\"", field[i - 2]);
                    197: 
                    198:        /* move pathname into buffer */
                    199:        IIbmove(field[i - 2], IIPathname, field[i - 1] - field[i - 2]);
                    200: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.