|
|
1.1 root 1: /* conn_request.c - Generate DSP BIND from connection block */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/quipu/RCS/conn_request.c,v 7.4 90/07/09 14:45:28 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/quipu/RCS/conn_request.c,v 7.4 90/07/09 14:45:28 mrose Exp $
9: *
10: *
11: * $Log: conn_request.c,v $
12: * Revision 7.4 90/07/09 14:45:28 mrose
13: * sync
14: *
15: * Revision 7.3 89/12/19 16:20:06 mrose
16: * sync
17: *
18: * Revision 7.2 89/11/27 10:30:09 mrose
19: * sync
20: *
21: * Revision 7.1 89/11/24 16:21:56 mrose
22: * sync
23: *
24: * Revision 7.0 89/11/23 22:16:55 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: /* LINTLIBRARY */
41:
42: #include "quipu/dsap.h"
43: #include "tsap.h"
44: #include "quipu/util.h"
45: #include "quipu/connection.h"
46:
47: extern time_t timenow;
48:
49: struct connection * conn_alloc();
50: void conn_free();
51:
52: extern LLog * log_dsap;
53: #ifndef NO_STATS
54: extern LLog * log_stat;
55: extern int dn_print();
56: #endif
57:
58: extern PS opt;
59: extern unsigned watchdog_time;
60: extern unsigned watchdog_delta;
61:
62: /*
63: * conn_request uses the directory bind argument and context
64: * set up in the connection block to generate an asynchronous
65: * association request.
66: * If OK is returned the connection should be linked onto
67: * the global list.
68: * If NOTOK is returned the connection block should be freed,
69: * alerting all the operations requesting it.
70: */
71: conn_request(cn)
72: register struct connection * cn;
73: {
74: struct DSAPconnect dc_s;
75: struct DSAPconnect *dc = &dc_s;
76: struct DSAPindication di_s;
77: struct DSAPindication * di = &(di_s);
78: int inv_ret;
79:
80: DLOG(log_dsap, LLOG_TRACE, ("conn_request()"));
81: LLOG(log_dsap, LLOG_NOTICE, ("conn_request: Calling: %s", paddr2str(&(cn->cn_addr),NULLNA)));
82:
83: switch(cn->cn_ctx)
84: {
85: case DS_CTX_X500_DAP:
86: LLOG(log_dsap, LLOG_EXCEPTIONS, ("Making DAP connections illegal for DSA"));
87: return(NOTOK);
88:
89: case DS_CTX_X500_DSP:
90: LLOG(log_dsap, LLOG_TRACE, ("Making an X500 DSP connection"));
91: watch_dog ("DspAsynBindRequest");
92: inv_ret = DspAsynBindRequest (&(cn->cn_addr), &(cn->cn_connect.cc_req),
93: (int) (watchdog_time - watchdog_delta), dc, di, ROS_ASYNC);
94: watch_dog_reset ();
95: break;
96:
97: case DS_CTX_QUIPU_DSP:
98: LLOG(log_dsap, LLOG_TRACE, ("Making a QUIPU DSP connection"));
99: watch_dog ("QspAsynBindRequest");
100: inv_ret = QspAsynBindRequest (&(cn->cn_addr),
101: &(cn->cn_connect.cc_req),
102: (int) (watchdog_time - watchdog_delta), dc, di, ROS_ASYNC);
103: watch_dog_reset ();
104: break;
105:
106: default:
107: LLOG(log_dsap, LLOG_EXCEPTIONS, ("Unknown connection context"));
108: return(NOTOK);
109: }
110:
111: cn->cn_last_used = timenow;
112:
113: switch(inv_ret)
114: {
115: case NOTOK:
116: DLOG(log_dsap, LLOG_NOTICE, ("ASYN BIND REQUEST NOTOK!"));
117: #ifndef NO_STATS
118: pslog (log_stat, LLOG_NOTICE, "Failed (NOTOK)", dn_print, (caddr_t) cn->cn_dn);
119: #endif
120: dsa_reliable (cn,FALSE,timenow);
121: return(NOTOK);
122: case DONE:
123: DLOG(log_dsap, LLOG_NOTICE, ("ASYN BIND REQUEST DONE! (ad = %d)", dc->dc_sd));
124: cn->cn_ad = dc->dc_sd;
125: if (cn->cn_ad == NOTOK)
126: {
127: DCFREE(dc);
128: #ifndef NO_STATS
129: pslog(log_stat, LLOG_NOTICE, "Failed (DONE)", dn_print, (caddr_t) cn->cn_dn);
130: #endif
131: cn->cn_state = CN_FAILED;
132: dsa_reliable (cn,FALSE,timenow);
133: return(NOTOK);
134: }
135: if (conn_req_aux(cn, dc) == NOTOK) {
136: #ifndef NO_STATS
137: pslog(log_stat, LLOG_NOTICE, "Failed (DONE 2)", dn_print, (caddr_t) cn->cn_dn);
138: #endif
139: dsa_reliable (cn,FALSE,timenow);
140: return NOTOK;
141: }
142: return OK;
143: case CONNECTING_1:
144: DLOG (log_dsap,LLOG_NOTICE,("ASYN BIND REQUEST CONNECTING_1 (ad = %d)", dc->dc_sd));
145: cn->cn_ad = dc->dc_sd;
146: DCFREE(dc);
147: cn->cn_state = CN_CONNECTING1;
148: #ifndef NO_STATS
149: pslog (log_stat, LLOG_NOTICE, "Trying (CONN_1)", dn_print, (caddr_t) cn->cn_dn);
150: #endif
151: return(OK);
152:
153: case CONNECTING_2:
154: DLOG (log_dsap,LLOG_NOTICE,("ASYN BIND REQUEST CONNECTING_2 (ad = %d)", dc->dc_sd));
155: cn->cn_ad = dc->dc_sd;
156: DCFREE(dc);
157: cn->cn_state = CN_CONNECTING2;
158: #ifndef NO_STATS
159: pslog (log_stat, LLOG_NOTICE, "Trying (CONN_2)", dn_print, (caddr_t) cn->cn_dn);
160: #endif
161: return(OK);
162:
163: default:
164: LLOG(log_dsap, LLOG_EXCEPTIONS, ("Unknown return from DAsynBind : %d", inv_ret));
165: return(NOTOK);
166: } /* switch inv_ret */
167: /* NOTREACHED */
168: }
169:
170: /*
171: * conn_req_aux() is called to complete work started by conn_request().
172: * Current major complication is how to deal with an undecodable BindResult.
173: * If OK is returned, the connection is ready for action and any waiting
174: * operations should be sent.
175: * If NOTOK is returned the connection needs to be extracted, alerting any
176: * waiting operations in the process.
177: */
178: conn_req_aux(cn, dc)
179: register struct connection * cn;
180: register struct DSAPconnect * dc;
181: {
182:
183: switch(dc->dc_result)
184: {
185: case DS_RESULT:
186: DLOG(log_dsap, LLOG_NOTICE, ("D-BIND.RETRY(ASYNC) RESULT"));
187: cn->cn_state = CN_OPEN;
188: break;
189:
190: case DS_ERROR:
191: /*
192: * Get the DirectoryBindError
193: */
194: DLOG(log_dsap, LLOG_NOTICE, ("D-BIND.RETRY(ASYNC) ERROR"));
195: cn->cn_state = CN_FAILED;
196: cn->cn_ad = 0;
197: break;
198:
199: default:
200: DLOG(log_dsap, LLOG_NOTICE, ("D-BIND.RETRY(ASYNC) OTHER"));
201: cn->cn_state = CN_FAILED;
202: cn->cn_ad = 0;
203: LLOG (log_dsap,LLOG_EXCEPTIONS,( "Association rejected"));
204: /* ADT
205: LLOG (log_dsap,LLOG_EXCEPTIONS,( "Association rejected: [%s]",
206: DErrString(dc->dc_result)));
207: */
208: break;
209:
210: } /* switch acc->acc_result */
211:
212: if(cn->cn_state == CN_OPEN)
213: {
214: struct TSAPdisconnect td_s;
215: struct TSAPdisconnect *td = &td_s;
216:
217: if (TSetQueuesOK (cn->cn_ad, 1, td) == NOTOK)
218: td_log (td, "TSetQueuesOK (outgoing)");
219:
220: cn->cn_last_used = timenow;
221: dsa_reliable (cn,TRUE,cn->cn_last_used);
222: #ifndef NO_STATS
223: {
224: char buf [LINESIZE];
225: (void) sprintf (buf,"Bound using %s DSP context (%d)", cn->cn_ctx == DS_CTX_QUIPU_DSP ? "QUIPU" : "X500", cn->cn_ad);
226: pslog(log_stat, LLOG_NOTICE, buf, dn_print, (caddr_t) cn->cn_dn);
227: }
228: #endif
229: return(OK);
230: }
231:
232: return(NOTOK);
233: }
234:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.