|
|
1.1 root 1: /* acserver2.c - generic server dispatch */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/acsap/RCS/acserver2.c,v 7.2 90/07/09 14:30:46 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/acsap/RCS/acserver2.c,v 7.2 90/07/09 14:30:46 mrose Exp $
9: *
10: *
11: * $Log: acserver2.c,v $
12: * Revision 7.2 90/07/09 14:30:46 mrose
13: * sync
14: *
15: * Revision 7.1 90/02/19 13:07:07 mrose
16: * update
17: *
18: * Revision 7.0 89/11/23 21:22:03 mrose
19: * Release 6.0
20: *
21: */
22:
23: /*
24: * NOTICE
25: *
26: * Acquisition, use, and distribution of this module and related
27: * materials are subject to the restrictions of a license agreement.
28: * Consult the Preface in the User's Manual for the full terms of
29: * this agreement.
30: *
31: */
32:
33:
34: /* LINTLIBRARY */
35:
36: #include <signal.h>
37: #include "psap.h"
38: #include "tsap.h"
39: #include <sys/ioctl.h>
40: #ifdef BSD42
41: #include <sys/file.h>
42: #endif
43: #ifdef SYS5
44: #include <fcntl.h>
45: #endif
46: #include "tailor.h"
47:
48: /* */
49:
50: static int is_nfds;
51: static fd_set is_mask;
52: static char is_single;
53:
54: /* */
55:
56: int iserver_init (argc, argv, aei, initfnx, td)
57: int argc;
58: char **argv;
59: AEI aei;
60: IFP initfnx;
61: struct TSAPdisconnect *td;
62: {
63: int fd;
64:
65: isodetailor (NULLCP, 0);
66:
67: is_nfds = 0;
68: FD_ZERO (&is_mask);
69:
70: if (argc > 1) {
71: is_single = 1;
72: if ((fd = (*initfnx) (argc, argv)) == NOTOK)
73: return tsaplose (td, DR_NETWORK, NULLCP, "initialization failed");
74:
75: is_nfds = fd + 1;
76: FD_SET (fd, &is_mask);
77: }
78: else {
79: struct PSAPaddr *pa;
80: is_single = 0;
81:
82: if ((pa = aei2addr (aei)) == NULLPA)
83: return tsaplose (td, DR_ADDRESS, NULLCP,
84: "address translation failed");
85:
86: if (TNetListen (&pa -> pa_addr.sa_addr, td) == NOTOK)
87: return NOTOK;
88:
89: if (!isatty (2)) {
90: int i;
91:
92: for (i = 0; i < 5; i++) {
93: switch (fork ()) {
94: case NOTOK:
95: sleep (5);
96: continue;
97:
98: case OK:
99: break;
100:
101: default:
102: _exit (0);
103: }
104: break;
105: }
106:
107: (void) chdir ("/");
108:
109: if ((fd = open ("/dev/null", O_RDWR)) != NOTOK) {
110: if (fd != 0)
111: (void) dup2 (fd, 0), (void) close (fd);
112: (void) dup2 (0, 1);
113: (void) dup2 (0, 2);
114: }
115:
116: #ifdef SETSID
117: (void) setsid ();
118: #endif
119: #ifdef TIOCNOTTY
120: if ((fd = open ("/dev/tty", O_RDWR)) != NOTOK) {
121: (void) ioctl (fd, TIOCNOTTY, NULLCP);
122: (void) close (fd);
123: }
124: #else
125: #ifdef SYS5
126: (void) setpgrp ();
127: (void) signal (SIGINT, SIG_IGN);
128: (void) signal (SIGQUIT, SIG_IGN);
129: #endif
130: #endif
131: isodexport (NULLCP); /* re-initialize logfiles */
132: }
133: }
134:
135: return OK;
136: }
137:
138: /* */
139:
140: int iserver_wait (initfnx, workfnx, losefnx, nfds, rfds, wfds, efds, secs, td)
141: IFP initfnx,
142: workfnx,
143: losefnx;
144: int nfds;
145: fd_set *rfds,
146: *wfds,
147: *efds;
148: int secs;
149: struct TSAPdisconnect *td;
150: {
151: int fd,
152: vecp;
153: fd_set ifds,
154: ofds,
155: xfds;
156: char *vec[4];
157:
158: ifds = is_mask; /* struct copy */
159: FD_ZERO (&ofds);
160: FD_ZERO (&xfds);
161: if (is_nfds > nfds)
162: nfds = is_nfds + 1;
163:
164: if (rfds)
165: for (fd = 0; fd < nfds; fd++)
166: if (FD_ISSET (fd, rfds))
167: FD_SET (fd, &ifds);
168: if (wfds)
169: ofds = *wfds;
170: if (efds)
171: xfds = *efds;
172:
173: if (TNetAccept (&vecp, vec, nfds, &ifds, &ofds, &xfds, secs, td)
174: == NOTOK) {
175: (void) (*losefnx) (td);
176:
177: return OK;
178: }
179: if (wfds)
180: *wfds = ofds;
181: if (efds)
182: *efds = xfds;
183:
184: if (vecp > 0 && (fd = (*initfnx) (vecp, vec)) != NOTOK) {
185: if (fd >= is_nfds)
186: is_nfds = fd + 1;
187: FD_SET (fd, &is_mask);
188: }
189:
190: for (fd = 0; fd < nfds; fd++)
191: if (FD_ISSET (fd, &is_mask) && FD_ISSET (fd, &ifds)) {
192: if (workfnx == NULLIFP) {
193: (void) TNetClose (NULLTA, td);
194: return tsaplose (td, DR_OPERATION, NULLCP,
195: "no worker routine for connected fd");
196: }
197: FD_CLR (fd, &ifds);
198: if ((*workfnx) (fd) == NOTOK) {
199: FD_CLR (fd, &is_mask);
200: if (is_nfds == fd + 1)
201: is_nfds--;
202:
203: if (is_single) {
204: int xd;
205:
206: for (xd = 0; xd < nfds; xd++)
207: if (FD_ISSET (xd, &is_mask))
208: break;
209: if (rfds)
210: FD_ZERO (rfds);
211: if (xd >= is_nfds)
212: return DONE;
213: }
214: }
215: }
216: if (rfds)
217: *rfds = ifds;
218: return OK;
219: }
220:
221: /* */
222:
223: fd_set iserver_mask ()
224: {
225: return is_mask;
226: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.