|
|
1.1 root 1: /* psapabort.c - PPM: user abort */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/psap2/RCS/psapabort.c,v 7.1 90/07/01 21:04:56 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/psap2/RCS/psapabort.c,v 7.1 90/07/01 21:04:56 mrose Exp $
9: *
10: *
11: * $Log: psapabort.c,v $
12: * Revision 7.1 90/07/01 21:04:56 mrose
13: * pepsy
14: *
15: * Revision 7.0 89/11/23 22:14:17 mrose
16: * Release 6.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 "PS-types.h"
36: #include "ppkt.h"
37: #include "tailor.h"
38:
39: /* P-U-ABORT.REQUEST */
40:
41: int PUAbortRequest (sd, data, ndata, pi)
42: int sd;
43: PE *data;
44: int ndata;
45: struct PSAPindication *pi;
46: {
47: SBV smask;
48: int len,
49: result;
50: char *base;
51: PE pe;
52: register struct psapblk *pb;
53: struct SSAPindication sis;
54: register struct SSAPabort *sa = &sis.si_abort;
55: register struct type_PS_ARU__PPDU *pdu;
56:
57: toomuchP (data, ndata, NPDATA, "abort");
58: missingP (pi);
59:
60: smask = sigioblock ();
61:
62: if ((pb = findpblk (sd)) == NULL) {
63: (void) sigiomask (smask);
64: return psaplose (pi, PC_PARAMETER, NULLCP,
65: "invalid presentation descriptor");
66: }
67:
68: pe = NULLPE;
69: base = NULLCP;
70: result = NOTOK;
71: if ((pdu = (struct type_PS_ARU__PPDU *) calloc (1, sizeof *pdu)) == NULL) {
72: no_mem: ;
73: (void) psaplose (pi, PC_CONGEST, NULLCP, "out of memory");
74: goto out2;
75: }
76: pdu -> offset = type_PS_ARU__PPDU_normal__mode;
77: if ((pdu -> un.normal__mode = (struct element_PS_4 *)
78: calloc (1, sizeof (struct element_PS_4)))
79: == NULL)
80: goto no_mem;
81: if (data && ndata > 0) {
82: if (pb -> pb_ncontext > 0
83: && (pdu -> un.normal__mode -> context__list =
84: silly_list (pb, pi)) == NULL)
85: goto out2;
86:
87: if ((pdu -> un.normal__mode -> user__data = info2ppdu (pb, pi,
88: data, ndata,
89: PPDU_NONE))
90: == NULL)
91: goto out2;
92: }
93:
94: if (encode_PS_ARU__PPDU (&pe, 1, 0, NULLCP, pdu) == NOTOK) {
95: (void) psaplose (pi, PC_CONGEST, NULLCP, "error encoding PDU: %s",
96: PY_pepy);
97: goto out2;
98: }
99:
100: PLOGP (psap2_log,PS_ARU__PPDU, pe, "ARU-PPDU", 0);
101:
102: if (pe2ssdu (pe, &base, &len) == NOTOK)
103: goto no_mem;
104:
105: if ((result = SUAbortRequest (pb -> pb_fd, base, len, &sis)) == NOTOK)
106: if (SC_FATAL (sa -> sa_reason)) {
107: (void) ss2pslose (pb, pi, "SUAbortRequest", sa);
108: goto out2;
109: }
110: else {
111: (void) ss2pslose (NULLPB, pi, "SUAbortRequest", sa);
112: goto out1;
113: }
114:
115: result = OK;
116: pb -> pb_fd = NOTOK;
117:
118: out2: ;
119: freepblk (pb);
120:
121: out1: ;
122: if (pdu)
123: free_PS_ARU__PPDU (pdu);
124: if (pe)
125: pe_free (pe);
126: if (base)
127: free (base);
128:
129: (void) sigiomask (smask);
130:
131: return result;
132: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.