|
|
1.1 root 1: /* rosapureject.c - ROPM: user reject */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/rosap/RCS/rosapureject.c,v 6.0 89/03/18 23:42:32 mrose Rel $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/rosap/RCS/rosapureject.c,v 6.0 89/03/18 23:42:32 mrose Rel $
9: *
10: * Based on an TCP-based implementation by George Michaelson of University
11: * College London.
12: *
13: *
14: * $Log: rosapureject.c,v $
15: * Revision 6.0 89/03/18 23:42:32 mrose
16: * Release 5.0
17: *
18: */
19:
20: /*
21: * NOTICE
22: *
23: * Acquisition, use, and distribution of this module and related
24: * materials are subject to the restrictions of a license agreement.
25: * Consult the Preface in the User's Manual for the full terms of
26: * this agreement.
27: *
28: */
29:
30:
31: /* LINTLIBRARY */
32:
33: #include <stdio.h>
34: #include <signal.h>
35: #include "ropkt.h"
36:
37: /* RO-U-REJECT.REQUEST */
38:
39: int RoURejectRequest (sd, invokeID, reason, priority, roi)
40: int sd;
41: int *invokeID,
42: reason,
43: priority;
44: struct RoSAPindication *roi;
45: {
46: SBV smask;
47: int result;
48: PElementID id;
49: register struct assocblk *acb;
50:
51: switch (reason) {
52: case ROS_IP_DUP: /* Invoke Problem */
53: case ROS_IP_UNRECOG:
54: case ROS_IP_MISTYPED:
55: case ROS_IP_LIMIT:
56: id = REJECT_INVOKE;
57: reason -= REJECT_INVOKE_BASE;
58: break;
59:
60: case ROS_IP_RELEASE:
61: case ROS_IP_UNLINKED:
62: case ROS_IP_LINKED:
63: case ROS_IP_CHILD:
64: id = REJECT_COMPLETE;
65: reason -= REJECT_INVOKE_BASE;
66: break;
67:
68: case ROS_RRP_UNRECOG: /* Return Result Problem */
69: case ROS_RRP_UNEXP:
70: case ROS_RRP_MISTYPED:
71: id = REJECT_RESULT;
72: reason -= REJECT_RESULT_BASE;
73: break;
74:
75: case ROS_REP_UNRECOG: /* Return Error Problem */
76: case ROS_REP_UNEXP:
77: case ROS_REP_RECERR:
78: case ROS_REP_UNEXPERR:
79: case ROS_REP_MISTYPED:
80: id = REJECT_ERROR;
81: reason -= REJECT_ERROR_BASE;
82: break;
83:
84: default:
85: return rosaplose (roi, ROS_PARAMETER, NULLCP,
86: "bad value for reason parameter");
87: }
88: missingP (roi);
89:
90: smask = sigioblock ();
91:
92: rosapPsig (acb, sd);
93:
94: result = RoURejectRequestAux (acb, invokeID, reason, id, priority, roi);
95:
96: (void) sigiomask (smask);
97:
98: return result;
99: }
100:
101: /* */
102:
103: int RoURejectRequestAux (acb, invokeID, reason, id, priority, roi)
104: register struct assocblk *acb;
105: int *invokeID,
106: reason,
107: priority;
108: PElementID id;
109: struct RoSAPindication *roi;
110: {
111: register PE pe,
112: p;
113:
114: if (id == REJECT_COMPLETE)
115: if (acb -> acb_flags & ACB_ACS)
116: id = REJECT_INVOKE;
117: else
118: return rosaplose (roi, ROS_PARAMETER, NULLCP,
119: "bad value for reason parameter");
120:
121: if (acb -> acb_ready
122: && !(acb -> acb_flags & ACB_TURN)
123: && (*acb -> acb_ready) (acb, priority, roi) == NOTOK)
124: return NOTOK;
125:
126: /* begin Reject APDU */
127: if ((pe = pe_alloc (PE_CLASS_CONT, PE_FORM_CONS, APDU_REJECT)) == NULLPE
128: || ((acb -> acb_flags & ACB_ACS)
129: ? (p = pe, 0)
130: : set_add (pe, p = pe_alloc (PE_CLASS_UNIV, PE_FORM_CONS,
131: PE_CONS_SEQ)) == NOTOK)
132: || seq_add (p, invokeID ? int2prim (*invokeID)
133: : pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM,
134: PE_PRIM_NULL), -1) == NOTOK
135: || seq_add (p, num2prim (reason, PE_CLASS_CONT, id), -1)
136: == NOTOK) {
137: if (pe)
138: pe_free (pe);
139: freeacblk (acb);
140: return rosaplose (roi, ROS_CONGEST, NULLCP, "out of memory");
141: }
142: /* end Reject APDU */
143:
144: return (*acb -> acb_putosdu) (acb, pe, NULLPE, priority, roi);
145: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.