|
|
1.1 root 1: /* dsa_wait.c - accept and process events listened for */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/quipu/RCS/dsa_wait.c,v 7.4 90/07/09 14:46:03 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/quipu/RCS/dsa_wait.c,v 7.4 90/07/09 14:46:03 mrose Exp $
9: *
10: *
11: * $Log: dsa_wait.c,v $
12: * Revision 7.4 90/07/09 14:46:03 mrose
13: * sync
14: *
15: * Revision 7.3 90/04/18 08:49:51 mrose
16: * 6.2
17: *
18: * Revision 7.2 90/03/15 11:19:00 mrose
19: * quipu-sync
20: *
21: * Revision 7.1 89/12/19 16:20:30 mrose
22: * sync
23: *
24: * Revision 7.0 89/11/23 22:17:25 mrose
25: * Release 6.0
26: *
27: */
28:
29: /*
30: * NOTICE
31: *
32: * Acquisition, use, and distribution of this module and related
33: * materials are subject to the restrictions of a license agreement.
34: * Consult the Preface in the User's Manual for the full terms of
35: * this agreement.
36: *
37: */
38:
39:
40: #include "rosap.h"
41: #include "tsap.h"
42: #include "quipu/util.h"
43: #include "quipu/connection.h"
44: #include <signal.h>
45:
46: extern LLog * log_dsap;
47: extern LLog * tsap_log;
48:
49: extern unsigned watchdog_time;
50: extern unsigned watchdog_delta;
51: extern time_t time();
52: time_t timenow;
53:
54: dsa_wait(secs)
55: int secs;
56: {
57: int vecp = 0;
58: char *vec[4];
59: fd_set iads;
60: fd_set wads;
61: int nads;
62: struct TSAPdisconnect td_s;
63: struct TSAPdisconnect *td = &td_s;
64: struct connection * cn;
65: struct connection * next_cn;
66: char ibuffer[BUFSIZ];
67: char *ibp;
68: char wbuffer[BUFSIZ];
69: char *wbp;
70: SFD attempt_restart();
71: int newfd;
72:
73: nads = 0;
74: FD_ZERO(&iads);
75: FD_ZERO(&wads);
76: ibp = ibuffer;
77: wbp = wbuffer;
78:
79: /*
80: DLOG(log_dsap, LLOG_DEBUG, ("dsa_wait connections:"));
81: conn_list_log(connlist);
82: */
83:
84: for(cn=connlist; cn != NULLCONN; cn=cn->cn_next)
85: {
86: if (cn->cn_state == CN_CONNECTING1)
87: {
88: if (cn->cn_ad > 0)
89: FD_SET(cn->cn_ad, &wads);
90: else
91: SLOG (tsap_log, LLOG_EXCEPTIONS, NULLCP,
92: ("fd=%d for connection block(1)", cn -> cn_ad));
93: (void) sprintf(wbp, ", %d.", cn->cn_ad);
94: wbp += (strlen(wbp) - 1);
95: }
96: else
97: {
98: if (cn->cn_ad > 0)
99: FD_SET(cn->cn_ad, &iads);
100: else
101: SLOG (tsap_log, LLOG_EXCEPTIONS, NULLCP,
102: ("fd=%d for connection block(2)", cn -> cn_ad));
103: (void) sprintf(ibp, ", %d.", cn->cn_ad);
104: ibp += (strlen(ibp) - 1);
105: }
106:
107: if(cn->cn_ad >= nads)
108: nads = cn->cn_ad + 1;
109: }
110:
111: if(ibp == ibuffer)
112: {
113: DLOG (log_dsap, LLOG_DEBUG, ("Listening for new associations"));
114: }
115: else
116: {
117: LLOG (log_dsap, LLOG_NOTICE, ("Listening on ads: %s", (ibuffer+1)));
118: }
119:
120: if(wbp == wbuffer)
121: {
122: DLOG (log_dsap, LLOG_DEBUG, ("Not making new associations"));
123: }
124: else
125: {
126: LLOG (log_dsap, LLOG_NOTICE, ("Making ads: %s", (wbuffer+1)));
127: }
128:
129: DLOG (log_dsap, LLOG_NOTICE, ("secs: %d; nads: %d; iads 0x%x, wads 0x%x",
130: secs, nads, iads.fds_bits[0], wads.fds_bits[0]));
131:
132: if (secs != NOTOK) {
133: /* if secs == NOTOK we want to block, otherwise set watchdog, but
134: beware of setting watchdog off accidentally !
135: */
136: if (secs > (watchdog_time - watchdog_delta))
137: watch_dog_aux ("TNetAccept (long)",(unsigned)secs + watchdog_delta);
138: else
139: watch_dog ("TNetAccept");
140: }
141:
142: if(TNetAcceptAux(&vecp, vec, &newfd, NULLTA, nads, &iads, &wads, NULLFD, secs, td) == NOTOK)
143: {
144: watch_dog_reset();
145:
146: td_log (td, "TNetAccept");
147:
148: /*
149: * if (td -> td_reason == DR_PROTOCOL || td -> td_reason == DR_NETWORK)
150: */
151: return;
152: /*
153: * attempt_restart (NOTOK);
154: * exit (0); */ /* should not be reached */
155:
156: }
157: watch_dog_reset();
158:
159: (void) time (&timenow);
160:
161: if (vecp > 0)
162: conn_pre_init (newfd,vecp,vec);
163:
164: for(cn = connlist; cn != NULLCONN; cn = next_cn)
165: {
166: next_cn = cn->cn_next;
167:
168: switch(cn->cn_state)
169: {
170: case CN_CONNECTING1:
171: DLOG(log_dsap, LLOG_TRACE, ("Checking %d", cn->cn_ad));
172: if(FD_ISSET(cn->cn_ad, &wads))
173: {
174: DLOG(log_dsap, LLOG_DEBUG, ("Polling %d", cn->cn_ad));
175: conn_retry(cn);
176: }
177: break;
178:
179: case CN_CONNECTING2:
180: DLOG (log_dsap, LLOG_TRACE, ("Checking %d (2)", cn ->cn_ad));
181: if (FD_ISSET(cn->cn_ad, &iads))
182: {
183: DLOG(log_dsap, LLOG_DEBUG, ("Polling %d (2)", cn->cn_ad));
184: conn_retry(cn);
185: }
186: break;
187:
188: case CN_OPEN:
189: if (FD_ISSET (cn->cn_ad, &iads))
190: {
191: DLOG (log_dsap,LLOG_DEBUG,( "Activity on association: %d", cn->cn_ad));
192: conn_dispatch(cn);
193: } /* if there is work on this connection */
194: break;
195:
196: case CN_CLOSING:
197: if (FD_ISSET (cn->cn_ad, &iads))
198: (void) conn_release_retry(cn);
199: break;
200:
201: case CN_OPENING:
202: if (FD_ISSET (cn->cn_ad, &iads))
203: conn_init(cn);
204: break;
205:
206: case CN_INDICATED:
207: if (FD_ISSET (cn->cn_ad, &iads))
208: {
209: if(cn->cn_start.cs_bind_compare == NULLOPER)
210: {
211: LLOG(log_dsap, LLOG_EXCEPTIONS, ("cn_state = INDICATED but no bind_compare operation"));
212: }
213: else
214: {
215: cn->cn_start.cs_bind_compare->on_bind_compare = NULLCONN;
216: }
217: }
218: /* FALL THROUGH */
219:
220: default:
221: if (FD_ISSET (cn->cn_ad, &iads))
222: {
223: LLOG (log_dsap,LLOG_EXCEPTIONS,( "Unexpected activity on association %d ... aborting",cn->cn_ad));
224: net_send_abort(cn);
225: conn_extract(cn);
226: } /* if there is work on this connection */
227: break;
228: }
229: } /* for each connection */
230:
231: } /* dsa_wait */
232:
233:
234: static char * watch_dog_where;
235:
236: static SFD watch_dog_activate ()
237: {
238: static char called = FALSE;
239:
240: if (!called) {
241: called = TRUE;
242: LLOG (log_dsap, LLOG_FATAL, ("Watchdog activated in %s", watch_dog_where));
243: attempt_restart (-2);
244: } else
245: LLOG (log_dsap, LLOG_FATAL, ("Repeated lower level blocking in %s", watch_dog_where));
246:
247: exit(-1);
248: }
249:
250: watch_dog (where)
251: char * where;
252: {
253: /*
254: A simple timer to stop DSAs holding onto associations, due to
255: a lower level failure.
256: */
257: watch_dog_where = where;
258: (void) signal (SIGALRM, watch_dog_activate);
259: (void) alarm (watchdog_time);
260: }
261:
262: watch_dog_aux (where,secs)
263: char * where;
264: unsigned secs;
265: {
266: watch_dog_where = where;
267: (void) signal (SIGALRM, watch_dog_activate);
268: (void) alarm (secs);
269: }
270:
271: watch_dog_reset ()
272: {
273: (void) signal (SIGALRM, SIG_IGN);
274: (void) alarm ((unsigned) 0);
275: }
276:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.