|
|
1.1 root 1: /* responder.c -- responder for callback demo */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/others/callback/RCS/responder.c,v 7.0 89/11/23 21:58:14 mrose Rel $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/others/callback/RCS/responder.c,v 7.0 89/11/23 21:58:14 mrose Rel $
9: *
10: *
11: * $Log: responder.c,v $
12: * Revision 7.0 89/11/23 21:58:14 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: /* ARGSUSED */
34:
35: main (argc, argv, envp)
36: int argc;
37: char **argv,
38: **envp;
39: {
40: struct TSAPaddr tas;
41: struct TSAPaddr *ta = &tas;
42: register struct SSAPaddr *sz;
43: struct SSAPconnect scs;
44: register struct SSAPconnect *sc = &scs;
45: struct SSAPstart sss;
46: register struct SSAPstart *ss = &sss;
47: struct SSAPdata sxs;
48: register struct SSAPdata *sx = &sxs;
49: struct SSAPrelease srs;
50: register struct SSAPrelease *sr = &srs;
51: struct SSAPindication sis;
52: register struct SSAPindication *si = &sis;
53: register struct SSAPabort *sa = &si -> si_abort;
54: struct sblk incoming,
55: outgoing;
56: SB sbi = &incoming,
57: sbo = &outgoing;
58:
59: reportailor (argv[0]);
60:
61: /* S-CONNECT.INDICATION */
62: if (SInit (argc, argv, ss, si) == NOTOK)
63: adios (NULLCP, "S-CONNECT.INDICATION: %s", SErrString (sa -> sa_reason));
64: advise (LLOG_NOTICE, NULLCP,
65: "S-CONNECT.INDICATION: <%d, %s, %s, %s, %s, %ld, %d>",
66: ss -> ss_sd, sprintref (&ss -> ss_connect),
67: saddr2str (&ss -> ss_calling), saddr2str (&ss -> ss_called),
68: sprintb (ss -> ss_requirements, RMASK), ss -> ss_isn,
69: ss -> ss_ssdusize);
70:
71: bzero ((char *) sbi, sizeof *sbi);
72: sbi -> sb_sd = ss -> ss_sd;
73: sbi -> sb_connect = ss -> ss_connect; /* struct copy */
74: sbi -> sb_requirements = ss -> ss_requirements & SR_BASUBSET;
75: sbi -> sb_settings = ss -> ss_settings;
76: #define dotoken(requires,shift,bit,type) \
77: { \
78: if (sbi -> sb_requirements & requires) \
79: switch (sbi -> sb_settings & (ST_MASK << shift)) { \
80: case ST_CALL_VALUE << shift: \
81: sbi -> sb_settings &= ~(ST_MASK << shift); \
82: sbi -> sb_settings |= ST_INIT_VALUE << shift; \
83: break; \
84: \
85: case ST_INIT_VALUE: \
86: break; \
87: \
88: case ST_RESP_VALUE: \
89: sbi -> sb_owned |= bit; \
90: break; \
91: \
92: default: \
93: adios (NULLCP, "%s token: reserved", type); \
94: break; \
95: } \
96: }
97: dotokens ();
98: #undef dotoken
99: sbi -> sb_ssn = sbi -> sb_isn = ss -> ss_isn;
100:
101: if ((ta = str2taddr (ss -> ss_data)) == NULLTA)
102: adios (NULLCP, "str2taddr failed");
103:
104: SSFREE (ss);
105:
106: if (SConnResponse (sbi -> sb_sd, &sbi -> sb_connect, NULLSA, SC_ACCEPT,
107: sbi -> sb_requirements, sbi -> sb_settings, sbi -> sb_isn,
108: NULLCP, 0, si) == NOTOK)
109: adios (NULLCP, "S-CONNECT.RESPONSE: %s", SErrString (sa -> sa_reason));
110:
111: /* we use the transport address passed in via the initial user data,
112: along with our our session selector */
113: sz = &ss -> ss_called;
114: sz -> sa_addr = *ta; /* struct copy */
115:
116: bzero ((char *) sbo, sizeof *sbo);
117: sbo -> sb_requirements = SR_BASUBSET;
118: sbo -> sb_settings = 0;
119: #define dotoken(requires,shift,bit,type) \
120: { \
121: if (sbo -> sb_requirements & requires) \
122: sbo -> sb_settings |= ST_INIT_VALUE << shift; \
123: }
124: dotokens ();
125: #undef dotoken
126: sbo -> sb_isn = SERIAL_NONE;
127:
128: /* make the callback */
129: if (SConnRequest (&sbo -> sb_connect, NULLSA, sz, sbo -> sb_requirements,
130: sbo -> sb_settings, sbo -> sb_isn, NULLCP, 0, NULLQOS, sc, si)
131: == NOTOK)
132: adios (NULLCP, "S-CONNECT.REQUEST: %s", SErrString (sa -> sa_reason));
133: if (sc -> sc_result != SC_ACCEPT)
134: adios (NULLCP, "connection rejected by peer: %s",
135: SErrString (sc -> sc_result));
136: advise (LLOG_NOTICE, NULLCP,
137: "S-CONNECT.RESPONSE: <%d, %s, %s, %s, %ld, %d>",
138: sc -> sc_sd, sprintref (&sc -> sc_connect),
139: saddr2str (&sc -> sc_responding),
140: sprintb (sc -> sc_requirements, RMASK), sc -> sc_isn,
141: sc -> sc_ssdusize);
142:
143: sbo -> sb_sd = sc -> sc_sd;
144: sbo -> sb_requirements = sc -> sc_requirements;
145: sbo -> sb_settings = sc -> sc_settings;
146: #define dotoken(requires,shift,bit,type) \
147: { \
148: if (sbo -> sb_requirements & requires) \
149: if ((sbo -> sb_settings & (ST_MASK << shift)) == ST_INIT_VALUE) \
150: sbo -> sb_owned |= bit; \
151: }
152: dotokens ();
153: #undef dotoken
154: sbo -> sb_ssn = sbo -> sb_isn = sc -> sc_isn;
155:
156: SCFREE (sc);
157:
158: /* do work here */
159:
160: switch (SReadRequest (sbi -> sb_sd, sx, NOTOK, si)) {
161: case NOTOK:
162: adios (NULLCP, "S-READ.REQUEST: %s", SErrString (sa -> sa_reason));
163:
164: case OK:
165: adios (NULLCP, "not expecting DATA indication 0x%x", sx -> sx_type);
166:
167: case DONE:
168: if (si -> si_type != SI_FINISH)
169: adios (NULLCP, "not expecting indication 0x%x", si -> si_type);
170: if (SRelResponse (sbi -> sb_sd, SC_ACCEPT, NULLCP, 0, si) == NOTOK)
171: adios (NULLCP, "S-RELEASE.RESPONSE: %s", SErrString (sa -> sa_reason));
172: break;
173: }
174:
175: if (SRelRequest (sbo -> sb_sd, NULLCP, 0, NOTOK, sr, si) == NOTOK)
176: adios (NULLCP, "S-RELEASE.REQUEST: %s", SErrString (sa -> sa_reason));
177: if (!sr -> sr_affirmative)
178: adios (NULLCP, "release rejected by peer");
179:
180: exit (0);
181: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.