|
|
1.1 root 1: /* ssapactitivity.c - SPM: activities */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/ssap/RCS/ssapactivity.c,v 7.0 89/11/23 22:25:22 mrose Rel $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/ssap/RCS/ssapactivity.c,v 7.0 89/11/23 22:25:22 mrose Rel $
9: *
10: *
11: * $Log: ssapactivity.c,v $
12: * Revision 7.0 89/11/23 22:25:22 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 <signal.h>
32: #include "spkt.h"
33:
34: /* S-CONTROL-GIVE.REQUEST */
35:
36: int SGControlRequest (sd, si)
37: int sd;
38: struct SSAPindication *si;
39: {
40: SBV smask;
41: int result;
42: register struct ssapblk *sb;
43:
44: smask = sigioblock ();
45:
46: ssapPsig (sb, sd);
47:
48: result = SGControlRequestAux (sb, si);
49:
50: (void) sigiomask (smask);
51:
52: return result;
53: }
54:
55: /* */
56:
57: static int SGControlRequestAux (sb, si)
58: register struct ssapblk *sb;
59: register struct SSAPindication *si;
60: {
61: int result;
62: register struct ssapkt *s;
63:
64: if (SDoActivityAux (sb, si, 1, 1) == NOTOK)
65: return NOTOK;
66:
67: if (sb -> sb_flags & SB_GTC)
68: return ssaplose (si, SC_OPERATION, NULLCP, "give control in progress");
69:
70: if ((s = newspkt (SPDU_GTC)) == NULL)
71: return ssaplose (si, SC_CONGEST, NULLCP, "out of memory");
72:
73: if ((result = spkt2sd (s, sb -> sb_fd, 0, si)) == NOTOK)
74: freesblk (sb);
75: else {
76: sb -> sb_owned = 0;
77: sb -> sb_flags |= SB_GTC;
78: }
79: freespkt (s);
80:
81: return result;
82: }
83:
84: /* S-ACTIVITY-START.REQUEST */
85:
86: int SActStartRequest (sd, id, data, cc, si)
87: int sd;
88: struct SSAPactid *id;
89: char *data;
90: int cc;
91: struct SSAPindication *si;
92: {
93: SBV smask;
94: int result;
95: register struct ssapblk *sb;
96:
97: missingP (id);
98: idmuchP (id);
99: missingP (si);
100:
101: smask = sigioblock ();
102:
103: ssapPsig (sb, sd);
104: toomuchP (sb, data, cc, SV_SIZE, "activity start");
105:
106: result = SActStartRequestAux (sb, id, data, cc, si);
107:
108: (void) sigiomask (smask);
109:
110: return result;
111: }
112:
113: /* */
114:
115: static int SActStartRequestAux (sb, id, data, cc, si)
116: register struct ssapblk *sb;
117: struct SSAPactid *id;
118: char *data;
119: int cc;
120: register struct SSAPindication *si;
121: {
122: int result;
123:
124: if (SDoActivityAux (sb, si, 1, 0) == NOTOK)
125: return NOTOK;
126:
127: if ((result = SWriteRequestAux (sb, SPDU_AS, data, cc, 0, 0L, 0, id,
128: NULLSD, NULLSR, si)) == NOTOK)
129: freesblk (sb);
130: else {
131: sb -> sb_V_A = sb -> sb_V_M = sb -> sb_V_R = 1;
132: sb -> sb_flags |= SB_Vact;
133: }
134:
135: return result;
136: }
137:
138: /* S-ACTIVITY-RESUME.REQUEST */
139:
140: int SActResumeRequest (sd, id, oid, ssn, ref, data, cc, si)
141: int sd;
142: struct SSAPactid *id,
143: *oid;
144: long ssn;
145: struct SSAPref *ref;
146: char *data;
147: int cc;
148: struct SSAPindication *si;
149: {
150: SBV smask;
151: int result;
152: register struct ssapblk *sb;
153:
154: missingP (id);
155: idmuchP (id);
156: missingP (oid);
157: idmuchP (oid);
158: if (SERIAL_MIN > ssn || ssn > SERIAL_MAX)
159: return ssaplose (si, SC_PARAMETER, NULLCP, "invalid serial number");
160: #ifdef notdef
161: missingP (ref);
162: #endif
163: if (ref)
164: refmuchP (ref)
165: missingP (si);
166:
167: smask = sigioblock ();
168:
169: ssapPsig (sb, sd);
170: toomuchP (sb, data, cc, SV_SIZE, "activity resume");
171:
172: result = SActResumeRequestAux (sb, id, oid, ssn, ref, data, cc, si);
173:
174: (void) sigiomask (smask);
175:
176: return result;
177: }
178:
179: /* */
180:
181: static int SActResumeRequestAux (sb, id, oid, ssn, ref, data, cc, si)
182: register struct ssapblk *sb;
183: struct SSAPactid *id,
184: *oid;
185: long ssn;
186: struct SSAPref *ref;
187: char *data;
188: int cc;
189: register struct SSAPindication *si;
190: {
191: int result;
192:
193: if (SDoActivityAux (sb, si, 1, 0) == NOTOK)
194: return NOTOK;
195:
196: if ((result = SWriteRequestAux (sb, SPDU_AR, data, cc, 0, ssn, 0, id,
197: oid, ref, si)) == NOTOK)
198: freesblk (sb);
199: else {
200: sb -> sb_V_A = sb -> sb_V_M = ssn + 1;
201: sb -> sb_V_R = 1;
202: sb -> sb_flags |= SB_Vact;
203: }
204:
205: return result;
206: }
207:
208: /* S-ACTIVITY-INTERRUPT.REQUEST */
209:
210: int SActIntrRequest (sd, reason, si)
211: int sd;
212: int reason;
213: struct SSAPindication *si;
214: {
215: SBV smask;
216: int result;
217: register struct ssapblk *sb;
218:
219: if (!(SP_OK (reason)))
220: return ssaplose (si, SC_PARAMETER, NULLCP, "invalid reason");
221: missingP (si);
222:
223: smask = sigioblock ();
224:
225: ssapXsig (sb, sd);
226: if (sb -> sb_flags & SB_MAP) {
227: (void) sigsetmask (smask);
228: return ssaplose (si, SC_OPERATION, NULLCP, "majorsync in progress");
229: }
230:
231: result = SActIntrRequestAux (sb, reason, SPDU_AI, si);
232:
233: (void) sigiomask (smask);
234:
235: return result;
236: }
237:
238: /* */
239:
240: static int SActIntrRequestAux (sb, reason, type, si)
241: register struct ssapblk *sb;
242: int reason,
243: type;
244: register struct SSAPindication *si;
245: {
246: int result;
247:
248: if (!(sb -> sb_requirements & SR_ACTIVITY))
249: return ssaplose (si, SC_OPERATION, NULLCP,
250: "activity management service unavailable");
251: if (!(sb -> sb_owned & ST_ACT_TOKEN))
252: return ssaplose (si, SC_OPERATION, NULLCP,
253: "activity token not owned by you");
254: if (!(sb -> sb_flags & SB_Vact))
255: return ssaplose (si, SC_OPERATION, NULLCP,
256: "no activity in progress");
257: if ((sb -> sb_flags & SB_RA)
258: && SDoCollideAux (sb -> sb_flags & SB_INIT ? 1 : 0,
259: type == SPDU_AI ? SYNC_INTR : SYNC_DISC, 0L,
260: sb -> sb_rs, sb -> sb_rsn) == NOTOK)
261: return ssaplose (si, SC_OPERATION, NULLCP,
262: "resync in progress takes precedence");
263:
264: if ((result = SWriteRequestAux (sb, type, NULLCP, 0, reason, 0L, 0,
265: NULLSD, NULLSD, NULLSR, si)) == NOTOK)
266: freesblk (sb);
267: else {
268: sb -> sb_flags |= SB_AI, sb -> sb_flags &= ~(SB_RA | SB_EDACK | SB_ERACK);
269: sb -> sb_rs = type == SPDU_AI ? SYNC_INTR : SYNC_DISC;
270: }
271:
272: return result;
273: }
274:
275: /* S-ACTIVITY-INTERRUPT.RESPONSE */
276:
277: int SActIntrResponse (sd, si)
278: int sd;
279: struct SSAPindication *si;
280: {
281: SBV smask;
282: int result;
283: register struct ssapblk *sb;
284:
285: missingP (si);
286:
287: smask = sigioblock ();
288:
289: ssapAsig (sb, sd);
290:
291: result = SActIntrResponseAux (sb, SPDU_AIA, si);
292:
293: (void) sigiomask (smask);
294:
295: return result;
296: }
297:
298: /* */
299:
300: static int SActIntrResponseAux (sb, type, si)
301: register struct ssapblk *sb;
302: int type;
303: register struct SSAPindication *si;
304: {
305: int result;
306:
307: if (!(sb -> sb_requirements & SR_ACTIVITY))
308: return ssaplose (si, SC_OPERATION, NULLCP,
309: "activity management service unavailable");
310: if (!(sb -> sb_flags & SB_Vact))
311: return ssaplose (si, SC_OPERATION, NULLCP,
312: "no activity in progress");
313: if (!(sb -> sb_flags & SB_AIA))
314: return ssaplose (si, SC_OPERATION, NULLCP,
315: "no activity interrupt/discard in progress");
316:
317: if ((result = SWriteRequestAux (sb, type, NULLCP, 0, 0, 0L, 0,
318: NULLSD, NULLSD, NULLSR, si)) == NOTOK)
319: freesblk (sb);
320: else {
321: sb -> sb_flags &= ~(SB_AIA | SB_Vact);
322: sb -> sb_owned = 0;
323: }
324:
325: return result;
326: }
327:
328: /* S-ACTIVITY-DISCARD.REQUEST */
329:
330: int SActDiscRequest (sd, reason, si)
331: int sd;
332: int reason;
333: struct SSAPindication *si;
334: {
335: SBV smask;
336: int result;
337: register struct ssapblk *sb;
338:
339: if (!(SP_OK (reason)))
340: return ssaplose (si, SC_PARAMETER, NULLCP, "invalid reason");
341: missingP (si);
342:
343: smask = sigioblock ();
344:
345: ssapXsig (sb, sd);
346: if (sb -> sb_flags & SB_MAP) {
347: (void) sigsetmask (smask);
348: return ssaplose (si, SC_OPERATION, NULLCP, "majorsync in progress");
349: }
350:
351: result = SActIntrRequestAux (sb, reason, SPDU_AD, si);
352:
353: (void) sigiomask (smask);
354:
355: return result;
356: }
357:
358: /* S-ACTIVITY-DISCARD.RESPONSE */
359:
360: int SActDiscResponse (sd, si)
361: int sd;
362: struct SSAPindication *si;
363: {
364: SBV smask;
365: int result;
366: register struct ssapblk *sb;
367:
368: missingP (si);
369:
370: smask = sigioblock ();
371:
372: ssapAsig (sb, sd);
373:
374: result = SActIntrResponseAux (sb, SPDU_ADA, si);
375:
376: (void) sigiomask (smask);
377:
378: return result;
379: }
380:
381: /* S-ACTIVITY-END.REQUEST */
382:
383: int SActEndRequest (sd, ssn, data, cc, si)
384: int sd;
385: long *ssn;
386: char *data;
387: int cc;
388: struct SSAPindication *si;
389: {
390: SBV smask;
391: int result;
392: register struct ssapblk *sb;
393:
394: missingP (ssn);
395: missingP (si);
396:
397: smask = sigioblock ();
398:
399: ssapPsig (sb, sd);
400: toomuchP (sb, data, cc, SV_SIZE, "activity end");
401:
402: result = SMajSyncRequestAux (sb, ssn, data, cc, 0, si);
403:
404: (void) sigiomask (smask);
405:
406: return result;
407: }
408:
409: /* S-ACTIVITY-END.RESPONSE */
410:
411: int SActEndResponse (sd, data, cc, si)
412: int sd;
413: char *data;
414: int cc;
415: struct SSAPindication *si;
416: {
417: SBV smask;
418: int result;
419: register struct ssapblk *sb;
420:
421: missingP (si);
422:
423: smask = sigioblock ();
424:
425: ssapPsig (sb, sd);
426: toomuchP (sb, data, cc, SV_SIZE, "activity end");
427:
428: result = SMajSyncResponseAux (sb, data, cc, si);
429:
430: (void) sigiomask (smask);
431:
432: return result;
433: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.