|
|
1.1 root 1: /* initiator.c -- initiator for callback demo */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/others/callback/RCS/initiator.c,v 7.0 89/11/23 21:58:11 mrose Rel $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/others/callback/RCS/initiator.c,v 7.0 89/11/23 21:58:11 mrose Rel $
9: *
10: *
11: * $Log: initiator.c,v $
12: * Revision 7.0 89/11/23 21:58:11 mrose
13: * Release 6.0
14: *
15: */
16:
17: /*
18: * NOTICE
19: *
20: * Acquisition, use, and distribution of this module and related
21: * materials are subject to the restrictions of a license agreement.
22: * Consult the Preface in the User's Manual for the full terms of
23: * this agreement.
24: *
25: */
26:
27:
28: #include <stdio.h>
29: #include "callback.h"
30:
31: /* */
32:
33: static char *mycontext = "isode callback demo";
34:
35: /* */
36:
37: /* ARGSUSED */
38:
39: main (argc, argv, envp)
40: int argc;
41: char **argv,
42: **envp;
43: {
44: int vecp;
45: char *taddr,
46: *vec[4];
47: struct TSAPaddr *ta;
48: struct TSAPdisconnect tds;
49: struct TSAPdisconnect *td = &tds;
50: register struct SSAPaddr *sz;
51: struct SSAPconnect scs;
52: register struct SSAPconnect *sc = &scs;
53: struct SSAPstart sss;
54: register struct SSAPstart *ss = &sss;
55: struct SSAPdata sxs;
56: register struct SSAPdata *sx = &sxs;
57: struct SSAPrelease srs;
58: register struct SSAPrelease *sr = &srs;
59: struct SSAPindication sis;
60: register struct SSAPindication *si = &sis;
61: register struct SSAPabort *sa = &si -> si_abort;
62: AEI aei;
63: struct PSAPaddr *pa;
64: struct sblk incoming,
65: outgoing;
66: SB sbi = &incoming,
67: sbo = &outgoing;
68:
69: reportailor (argv[0]);
70:
71: if (argc != 2)
72: adios (NULLCP, "usage: %s \"host\"", argv[0]);
73:
74: /* really should postpone this until after the session connect so we
75: can bind to the same network address (in the case of a multi-homed ES) */
76: if ((aei = str2aei (PLocalHostName (), mycontext)) == NULLAEI)
77: adios (NULLCP, "%s-%s: unknown application-entity",
78: PLocalHostName (), mycontext);
79: if ((pa = aei2addr (aei)) == NULLPA)
80: adios (NULLCP, "address translation failed");
81: ta = &pa -> pa_addr.sa_addr;
82: if (TNetUnique (ta, td) == NOTOK) {
83: if (td -> td_cc > 0)
84: adios (NULLCP, "TNetUnique: [%s] %*.*s", TErrString (td -> td_reason),
85: td -> td_cc, td -> td_cc, td -> td_data);
86: else
87: adios (NULLCP, "TNetUnique: [%s]", TErrString (td -> td_reason));
88: }
89: if ((taddr = taddr2str (ta)) == NULLCP)
90: adios (NULLCP, "taddr2str failed");
91:
92: if ((aei = str2aei (argv[1], mycontext)) == NULLAEI)
93: adios (NULLCP, "%s-%s: unknown application-entity",
94: argv[1], mycontext);
95: if ((pa = aei2addr (aei)) == NULLPA)
96: adios (NULLCP, "address translation failed");
97: sz = &pa -> pa_addr;
98:
99: bzero ((char *) sbo, sizeof *sbo);
100: sbo -> sb_requirements = SR_BASUBSET;
101: sbo -> sb_settings = 0;
102: #define dotoken(requires,shift,bit,type) \
103: { \
104: if (sbo -> sb_requirements & requires) \
105: sbo -> sb_settings |= ST_INIT_VALUE << shift; \
106: }
107: dotokens ();
108: #undef dotoken
109: sbo -> sb_isn = SERIAL_NONE;
110:
111: /* we pass the transport address we are listening on in the initial
112: user data */
113: if (SConnRequest (&sbo -> sb_connect, NULLSA, sz, sbo -> sb_requirements,
114: sbo -> sb_settings, sbo -> sb_isn, taddr, strlen (taddr),
115: NULLQOS, sc, si) == NOTOK)
116: adios (NULLCP, "S-CONNECT.REQUEST: %s", SErrString (sa -> sa_reason));
117: if (sc -> sc_result != SC_ACCEPT)
118: adios (NULLCP, "connection rejected by peer: %s",
119: SErrString (sc -> sc_result));
120: advise (LLOG_NOTICE, NULLCP,
121: "S-CONNECT.RESPONSE: <%d, %s, %s, %s, %ld, %d>",
122: sc -> sc_sd, sprintref (&sc -> sc_connect),
123: saddr2str (&sc -> sc_responding),
124: sprintb (sc -> sc_requirements, RMASK), sc -> sc_isn,
125: sc -> sc_ssdusize);
126:
127: sbo -> sb_sd = sc -> sc_sd;
128: sbo -> sb_requirements = sc -> sc_requirements;
129: sbo -> sb_settings = sc -> sc_settings;
130: #define dotoken(requires,shift,bit,type) \
131: { \
132: if (sbo -> sb_requirements & requires) \
133: if ((sbo -> sb_settings & (ST_MASK << shift)) == ST_INIT_VALUE) \
134: sbo -> sb_owned |= bit; \
135: }
136: dotokens ();
137: #undef dotoken
138: sbo -> sb_ssn = sbo -> sb_isn = sc -> sc_isn;
139:
140: SCFREE (sc);
141:
142: /* now wait for the other end to call us back */
143: for (;;) {
144: if (TNetAccept (&vecp, vec, 0, NULLFD, NULLFD, NULLFD, NOTOK, td)
145: == NOTOK) {
146: if (td -> td_cc > 0)
147: adios (NULLCP, "TNetAccept: [%s] %*.*s", TErrString (td -> td_reason),
148: td -> td_cc, td -> td_cc, td -> td_data);
149: else
150: adios (NULLCP, "TNetAccept: [%s]", TErrString (td -> td_reason));
151: }
152:
153: if (vecp > 0)
154: break;
155: }
156:
157: if (SInit (vecp, vec, ss, si) == NOTOK)
158: adios (NULLCP, "S-CONNECT.INDICATION: %s",
159: SErrString (sa -> sa_reason));
160: advise (LLOG_NOTICE, NULLCP,
161: "S-CONNECT.INDICATION: <%d, %s, %s, %s, %s, %ld, %d>",
162: ss -> ss_sd, sprintref (&ss -> ss_connect),
163: saddr2str (&ss -> ss_calling), saddr2str (&ss -> ss_called),
164: sprintb (ss -> ss_requirements, RMASK), ss -> ss_isn,
165: ss -> ss_ssdusize);
166:
167: /* stop listening, we have what we want */
168: (void) TNetClose (NULLTA, td);
169:
170: bzero ((char *) sbi, sizeof *sbi);
171: sbi -> sb_sd = ss -> ss_sd;
172: sbi -> sb_connect = ss -> ss_connect; /* struct copy */
173: sbi -> sb_requirements = ss -> ss_requirements & SR_BASUBSET;
174: sbi -> sb_settings = ss -> ss_settings;
175: #define dotoken(requires,shift,bit,type) \
176: { \
177: if (sbi -> sb_requirements & requires) \
178: switch (sbi -> sb_settings & (ST_MASK << shift)) { \
179: case ST_CALL_VALUE << shift: \
180: sbi -> sb_settings &= ~(ST_MASK << shift); \
181: sbi -> sb_settings |= ST_INIT_VALUE << shift; \
182: break; \
183: \
184: case ST_INIT_VALUE: \
185: break; \
186: \
187: case ST_RESP_VALUE: \
188: sbi -> sb_owned |= bit; \
189: break; \
190: \
191: default: \
192: adios (NULLCP, "%s token: reserved", type); \
193: break; \
194: } \
195: }
196: dotokens ();
197: #undef dotoken
198: sbi -> sb_ssn = sbi -> sb_isn = ss -> ss_isn;
199:
200: SSFREE (ss);
201:
202: if (SConnResponse (sbi -> sb_sd, &sbi -> sb_connect, NULLSA, SC_ACCEPT,
203: sbi -> sb_requirements, sbi -> sb_settings, sbi -> sb_isn,
204: NULLCP, 0, si) == NOTOK)
205: adios (NULLCP, "S-CONNECT.RESPONSE: %s", SErrString (sa -> sa_reason));
206:
207: /* do work here */
208:
209: if (SRelRequest (sbo -> sb_sd, NULLCP, 0, NOTOK, sr, si) == NOTOK)
210: adios (NULLCP, "S-RELEASE.REQUEST: %s", SErrString (sa -> sa_reason));
211: if (!sr -> sr_affirmative)
212: adios (NULLCP, "release rejected by peer");
213:
214: switch (SReadRequest (sbi -> sb_sd, sx, NOTOK, si)) {
215: case NOTOK:
216: adios (NULLCP, "S-READ.REQUEST: %s", SErrString (sa -> sa_reason));
217:
218: case OK:
219: adios (NULLCP, "not expecting DATA indication 0x%x", sx -> sx_type);
220:
221: case DONE:
222: if (si -> si_type != SI_FINISH)
223: adios (NULLCP, "not expecting indication 0x%x", si -> si_type);
224: if (SRelResponse (sbi -> sb_sd, SC_ACCEPT, NULLCP, 0, si) == NOTOK)
225: adios (NULLCP, "S-RELEASE.RESPONSE: %s", SErrString (sa -> sa_reason));
226: break;
227: }
228:
229: exit (0);
230: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.