# 2.11BSD#431 - /usr/ingres/source/equel/runtime/IIingres.c

##### Functions

    IIgetpath         X
    IIingres          X

##### Variables

    IIPathname        X
    IImainpr          X

##### Macros

    CLOSED            X

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

#### Defined functions

IIgetpath defined in line 134; used 1 times

- in line 43

IIingres defined in line 12; never used

#### Defined variables

IIPathname defined in line 10; used 7 times

- in line 104, 186-190(2)
- in /usr/ingres/source/equel/runtime/IIingres.c line 104, 186-190(2)
- in /usr/ingres/source/equel/runtime/IIp_err.c line 137

IImainpr defined in line 9; used 3 times

- in line 102-109(3)

#### Defined macros

CLOSED defined in line 7; used 1 times

- in line 65

Last modified: 1995-02-09 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 737 |