|
|
1.1 root 1: /* ftamaccess2.c - FPM: respond to file access */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamaccess2.c,v 7.0 89/11/23 21:53:21 mrose Rel $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/ftam/RCS/ftamaccess2.c,v 7.0 89/11/23 21:53:21 mrose Rel $
9: *
10: *
11: * $Log: ftamaccess2.c,v $
12: * Revision 7.0 89/11/23 21:53:21 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 "fpkt.h"
33:
34: /* F-{LOCATE,ERASE}.RESPONSE */
35:
36: int FAccessResponse (sd, action, identity, diag, ndiag, fti)
37: int sd;
38: int action;
39: struct FADUidentity *identity; /* F-LOCATE.RESPONSE only */
40: struct FTAMdiagnostic diag[];
41: int ndiag;
42: struct FTAMindication *fti;
43: {
44: SBV smask;
45: int result;
46: register struct ftamblk *fsb;
47:
48: switch (action) {
49: case FACTION_SUCCESS:
50: case FACTION_TRANS:
51: case FACTION_PERM:
52: break;
53:
54: default:
55: return ftamlose (fti, FS_GEN_NOREASON, 0, NULLCP,
56: "bad value for action parameter");
57: }
58: toomuchP (diag, ndiag, NFDIAG, "diagnostic");
59: missingP (fti);
60:
61: smask = sigioblock ();
62:
63: ftamPsig (fsb, sd);
64:
65: result = FAccessResponseAux (fsb, action, identity, diag, ndiag, fti);
66:
67: (void) sigiomask (smask);
68:
69: return result;
70: }
71:
72: /* */
73:
74: static int FAccessResponseAux (fsb, action, identity, diag, ndiag, fti)
75: register struct ftamblk *fsb;
76: int action;
77: struct FADUidentity *identity;
78: struct FTAMdiagnostic diag[];
79: int ndiag;
80: struct FTAMindication *fti;
81: {
82: int result;
83: PE pe;
84: struct PSAPindication pis;
85: struct PSAPindication *pi = &pis;
86: struct PSAPabort *pa = &pi -> pi_abort;
87: register struct type_FTAM_PDU *pdu;
88: register struct type_FTAM_F__LOCATE__response *loc;
89: register struct type_FTAM_F__ERASE__response *era;
90:
91: if (fsb -> fsb_flags & FSB_INIT)
92: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "not responder");
93: switch (fsb -> fsb_state) {
94: case FSB_LOCATE:
95: break;
96:
97: case FSB_ERASE:
98: if (identity)
99: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
100: "FADU identity parameter not allowed");
101: break;
102:
103: default:
104: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "wrong state");
105: }
106:
107: pe = NULLPE;
108: if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL) {
109: no_mem: ;
110: (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
111: out: ;
112: if (pe)
113: pe_free (pe);
114: if (pdu)
115: free_FTAM_PDU (pdu);
116: if (fti -> fti_abort.fta_action == FACTION_PERM)
117: freefsblk (fsb);
118: return NOTOK;
119: }
120: if (fsb -> fsb_state != FSB_LOCATE) {
121: pdu -> offset = type_FTAM_PDU_f__erase__response;
122: if ((era = (struct type_FTAM_F__ERASE__response *)
123: calloc (1, sizeof *era)) == NULL)
124: goto no_mem;
125: pdu -> un.f__erase__response = era;
126:
127: if ((era -> action__result =
128: (struct type_FTAM_Action__Result *)
129: calloc (1, sizeof *era -> action__result)) == NULL)
130: goto no_mem;
131: era -> action__result -> parm = action;
132: if (ndiag > 0
133: && (era -> diagnostic = diag2fpm (fsb, 0, diag, ndiag, fti))
134: == NULL)
135: goto out;
136: }
137: else {
138: pdu -> offset = type_FTAM_PDU_f__locate__response;
139: if ((loc = (struct type_FTAM_F__LOCATE__response *)
140: calloc (1, sizeof *loc)) == NULL)
141: goto no_mem;
142: pdu -> un.f__locate__response = loc;
143:
144: if ((loc -> action__result =
145: (struct type_FTAM_Action__Result *)
146: calloc (1, sizeof *loc -> action__result)) == NULL)
147: goto no_mem;
148: loc -> action__result -> parm = action;
149: if (identity
150: && (loc -> file__access__data__unit__identity =
151: faduid2fpm (fsb, identity, fti)) == NULL)
152: goto out;
153: if (ndiag > 0
154: && (loc -> diagnostic = diag2fpm (fsb, 0, diag, ndiag, fti))
155: == NULL)
156: goto out;
157: }
158:
159: if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, pdu) == NOTOK) {
160: (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
161: "error encoding PDU: %s", PY_pepy);
162: goto out;
163: }
164:
165: pe -> pe_context = fsb -> fsb_id;
166:
167: fsbtrace (fsb, (fsb -> fsb_fd, "P-DATA.REQUEST",
168: fsb -> fsb_state != FSB_LOCATE ? "F-LOCATE-response"
169: : "F-ERASE-response", pe, 0));
170:
171: result = PDataRequest (fsb -> fsb_fd, &pe, 1, pi);
172:
173: pe_free (pe);
174: pe = NULLPE;
175: free_FTAM_PDU (pdu);
176: pdu = NULL;
177:
178: if (result == NOTOK) {
179: (void) ps2ftamlose (fsb, fti, "PDataRequest", pa);
180: goto out;
181: }
182:
183: fsb -> fsb_state = FSB_DATAIDLE;
184:
185: return OK;
186: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.