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
Defined variables
Defined macros
CLOSED
defined in line
7; used 1 times