|
|
1.1 root 1: /* ssaplose.c - SPM: you lose */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/ssap/RCS/ssaplose.c,v 7.0 89/11/23 22:25:29 mrose Rel $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/ssap/RCS/ssaplose.c,v 7.0 89/11/23 22:25:29 mrose Rel $
9: *
10: *
11: * $Log: ssaplose.c,v $
12: * Revision 7.0 89/11/23 22:25:29 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: /* LINTLIBRARY */
29:
30: #include <stdio.h>
31: #include <varargs.h>
32: #include "spkt.h"
33: #include "tailor.h"
34:
35: /* */
36:
37: #ifndef lint
38: int spktlose (va_alist)
39: va_dcl
40: {
41: int reason,
42: result,
43: sd,
44: secs,
45: value;
46: register struct ssapblk *sb;
47: register struct ssapkt *s;
48: struct SSAPindication sis;
49: register struct SSAPindication *si;
50: register struct SSAPabort *sa;
51: struct TSAPdata txs;
52: register struct TSAPdata *tx = &txs;
53: struct TSAPdisconnect tds;
54: register struct TSAPdisconnect *td = &tds;
55: va_list ap;
56:
57: va_start (ap);
58:
59: sd = va_arg (ap, int);
60:
61: si = va_arg (ap, struct SSAPindication *);
62: if (si == NULL)
63: si = &sis;
64:
65: reason = va_arg (ap, int);
66: value = reason & SC_REFUSE;
67: reason &= ~SC_REFUSE;
68:
69: result = _ssaplose (si, reason, ap);
70:
71: va_end (ap);
72:
73: if ((sa = &si -> si_abort) -> sa_cc > 0) {
74: SLOG (ssap_log, LLOG_EXCEPTIONS, NULLCP,
75: ("spktlose [%s] %*.*s", SErrString (sa -> sa_reason),
76: sa -> sa_cc, sa -> sa_cc, sa -> sa_data));
77: }
78: else
79: SLOG (ssap_log, LLOG_EXCEPTIONS, NULLCP,
80: ("spktlose [%s]", SErrString (sa -> sa_reason)));
81:
82: if (value && SC_OFFICIAL (reason)) {
83: if ((s = newspkt (SPDU_RF)) == NULL)
84: return result;
85:
86: s -> s_mask |= SMASK_RF_DISC;
87: s -> s_rf_disconnect |= RF_DISC_RELEASE;
88:
89: if (reason == SC_VERSION) {
90: s -> s_mask |= SMASK_RF_VRSN;
91: s -> s_rf_version = SB_ALLVRSNS;
92: }
93:
94: if (s -> s_rdata = malloc ((unsigned) (s -> s_rlen = 1)))
95: *s -> s_rdata = reason & 0xff;
96:
97: secs = RF_TIM;
98: }
99: else {
100: if ((s = newspkt (SPDU_AB)) == NULL)
101: return result;
102:
103: s -> s_mask |= SMASK_SPDU_AB | SMASK_AB_DISC;
104: s -> s_ab_disconnect = AB_DISC_RELEASE;
105: switch (reason) {
106: case SC_PROTOCOL:
107: case SC_VERSION:
108: s -> s_ab_disconnect |= AB_DISC_PROTO;
109: break;
110:
111: case SC_CONGEST:
112: case SC_SSAPID:
113: break;
114:
115: default:
116: s -> s_ab_disconnect |= AB_DISC_UNKNOWN;
117: break;
118: }
119:
120: secs = AB_TIM;
121: }
122:
123: value = spkt2sd (s, sd,
124: (sb = findsblk (sd)) && (sb -> sb_flags & SB_EXPD), si);
125:
126: freespkt (s);
127: if (value == NOTOK)
128: return result;
129:
130: switch (TReadRequest (sd, tx, secs, td)) {
131: case OK:
132: default:
133: TXFREE (tx);
134: break;
135:
136: case NOTOK:
137: break;
138: }
139:
140: return result;
141: }
142: #else
143: /* VARARGS5 */
144:
145: int spktlose (sd, si, reason, what, fmt)
146: int sd,
147: reason;
148: struct SSAPindication *si;
149: char *what,
150: *fmt;
151: {
152: return spktlose (sd, si, reason, what, fmt);
153: }
154: #endif
155:
156: /* */
157:
158: #ifndef lint
159: int ssaplose (va_alist)
160: va_dcl
161: {
162: int reason,
163: result;
164: struct SSAPindication *si;
165: va_list ap;
166:
167: va_start (ap);
168:
169: si = va_arg (ap, struct SSAPindication *);
170: reason = va_arg (ap, int);
171:
172: result = _ssaplose (si, reason, ap);
173:
174: va_end (ap);
175:
176: return result;
177: }
178: #else
179: /* VARARGS4 */
180:
181: int ssaplose (si, reason, what, fmt)
182: struct SSAPindication *si;
183: int reason;
184: char *what,
185: *fmt;
186: {
187: return ssaplose (si, reason, what, fmt);
188: }
189: #endif
190:
191: /* */
192:
193: #ifndef lint
194: static int _ssaplose (si, reason, ap) /* what, fmt, args ... */
195: register struct SSAPindication *si;
196: int reason;
197: va_list ap;
198: {
199: register char *bp;
200: char buffer[BUFSIZ];
201: register struct SSAPabort *sa;
202:
203: if (si) {
204: bzero ((char *) si, sizeof *si);
205: si -> si_type = SI_ABORT;
206: sa = &si -> si_abort;
207:
208: asprintf (bp = buffer, ap);
209: bp += strlen (bp);
210:
211: sa -> sa_peer = 0;
212: sa -> sa_reason = reason;
213: copySSAPdata (buffer, bp - buffer, sa);
214: }
215:
216: return NOTOK;
217: }
218: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.