|
|
1.1 root 1: /* ftambulk1.c - FPM: initiate bulk data transfer */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/ftam/RCS/ftambulk1.c,v 7.0 89/11/23 21:53:27 mrose Rel $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/ftam/RCS/ftambulk1.c,v 7.0 89/11/23 21:53:27 mrose Rel $
9: *
10: *
11: * $Log: ftambulk1.c,v $
12: * Revision 7.0 89/11/23 21:53:27 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-{READ,WRITE}.REQUEST */
35:
36: int FReadWriteRequest (sd, operation, identity, context, level, lock, fti)
37: int sd;
38: int operation;
39: struct FADUidentity *identity;
40: int context, /* F-READ.REQUEST only */
41: level, /* .. */
42: lock;
43: struct FTAMindication *fti;
44: {
45: SBV smask;
46: int result,
47: state;
48: register struct ftamblk *fsb;
49:
50: switch (operation) {
51: case FA_OPS_READ:
52: state = FSB_DATAREAD;
53: break;
54:
55: case FA_OPS_INSERT:
56: case FA_OPS_REPLACE:
57: case FA_OPS_EXTEND:
58: state = FSB_DATAWRITE;
59: break;
60:
61: default:
62: return ftamlose (fti, FS_GEN_NOREASON, 0, NULLCP,
63: "bad value for operation parameter");
64: }
65: missingP (identity);
66: if (operation == FA_OPS_READ)
67: switch (context) {
68: case FA_ACC_HA:
69: case FA_ACC_HN:
70: case FA_ACC_FA:
71: case FA_ACC_FL:
72: case FA_ACC_FS:
73: case FA_ACC_UA:
74: case FA_ACC_US:
75: break;
76:
77: default:
78: return ftamlose (fti, FS_GEN_NOREASON, 0, NULLCP,
79: "bad value for context parameter");
80: }
81: missingP (fti);
82:
83: smask = sigioblock ();
84:
85: ftamPsig (fsb, sd);
86:
87: result = FReadWriteRequestAux (fsb, state, operation, identity, context,
88: level, lock, fti);
89:
90: (void) sigiomask (smask);
91:
92: return result;
93: }
94:
95: /* */
96:
97: static int FReadWriteRequestAux (fsb, state, operation, identity, context,
98: level, lock, fti)
99: register struct ftamblk *fsb;
100: int state,
101: operation;
102: struct FADUidentity *identity;
103: int context,
104: level,
105: lock;
106: struct FTAMindication *fti;
107: {
108: int result;
109: char *fpdu;
110: PE pe;
111: struct PSAPindication pis;
112: struct PSAPindication *pi = &pis;
113: struct PSAPabort *pa = &pi -> pi_abort;
114: register struct type_FTAM_PDU *pdu;
115: register struct type_FTAM_F__READ__request *rd;
116: register struct type_FTAM_F__WRITE__request *wr;
117:
118: if (!(fsb -> fsb_flags & FSB_INIT))
119: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "not initiator");
120: if (fsb -> fsb_state != FSB_DATAIDLE)
121: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "wrong state");
122:
123: switch (state) {
124: case FSB_DATAREAD:
125: if (!(fsb -> fsb_units & FUNIT_READ))
126: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
127: "reading not allowed");
128: break;
129:
130: case FSB_DATAWRITE:
131: if (!(fsb -> fsb_units & FUNIT_WRITE))
132: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
133: "writing not allowed");
134: break;
135: }
136:
137: pe = NULLPE;
138: if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL) {
139: no_mem: ;
140: (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
141: out: ;
142: if (pe)
143: pe_free (pe);
144: if (pdu)
145: free_FTAM_PDU (pdu);
146: if (fti -> fti_abort.fta_action == FACTION_PERM)
147: freefsblk (fsb);
148: return NOTOK;
149: }
150: if (state != FSB_DATAREAD) {
151: pdu -> offset = type_FTAM_PDU_f__write__request;
152: if ((wr = (struct type_FTAM_F__WRITE__request *)
153: calloc (1, sizeof *wr)) == NULL)
154: goto no_mem;
155: pdu -> un.f__write__request = wr;
156: fpdu = "F-WRITE-request";
157:
158: wr -> file__access__data__unit__operation = operation;
159: if ((wr -> file__access__data__unit__identity =
160: faduid2fpm (fsb, identity, fti)) == NULL)
161: goto out;
162: if (fsb -> fsb_units & FUNIT_FADULOCK) {
163: if ((wr -> fadu__lock = (struct type_FTAM_FADU__Lock *)
164: calloc (1, sizeof *wr -> fadu__lock))
165: == NULL)
166: goto no_mem;
167: wr -> fadu__lock -> parm = lock ? int_FTAM_FADU__Lock_on
168: : int_FTAM_FADU__Lock_off;
169: }
170: }
171: else {
172: pdu -> offset = type_FTAM_PDU_f__read__request;
173: if ((rd = (struct type_FTAM_F__READ__request *)
174: calloc (1, sizeof *rd)) == NULL)
175: goto no_mem;
176: pdu -> un.f__read__request = rd;
177: fpdu = "F-READ-request";
178:
179: if ((rd -> file__access__data__unit__identity =
180: faduid2fpm (fsb, identity, fti)) == NULL)
181: goto out;
182: if ((rd -> access__context =
183: (struct type_FTAM_Access__Context *)
184: calloc (1, sizeof *rd -> access__context))
185: == NULL)
186: goto no_mem;
187: if ((rd -> access__context -> access__context = context)
188: == FA_ACC_FL) {
189: rd -> access__context -> optionals |=
190: opt_FTAM_Access__Context_level__number;
191: rd -> access__context -> level__number = level;
192: }
193:
194: if (fsb -> fsb_units & FUNIT_FADULOCK) {
195: if ((rd -> fadu__lock = (struct type_FTAM_FADU__Lock *)
196: calloc (1, sizeof *wr -> fadu__lock))
197: == NULL)
198: goto no_mem;
199: rd -> fadu__lock -> parm = lock ? int_FTAM_FADU__Lock_on
200: : int_FTAM_FADU__Lock_off;
201: }
202: }
203:
204: if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, pdu) == NOTOK) {
205: (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
206: "error encoding PDU: %s", PY_pepy);
207: goto out;
208: }
209:
210: pe -> pe_context = fsb -> fsb_id;
211:
212: fsbtrace (fsb, (fsb -> fsb_fd, "P-DATA.REQUEST", fpdu, pe, 0));
213:
214: result = PDataRequest (fsb -> fsb_fd, &pe, 1, pi);
215:
216: pe_free (pe);
217: pe = NULLPE;
218: free_FTAM_PDU (pdu);
219: pdu = NULL;
220:
221: if (result == NOTOK) {
222: (void) ps2ftamlose (fsb, fti, "PDataRequest", pa);
223: goto out;
224: }
225:
226: fsb -> fsb_state = state;
227:
228: return OK;
229: }
230:
231: /* F-TRANSFER-END.REQUEST */
232:
233: int FTransEndRequest (sd, sharedASE, fti)
234: int sd;
235: PE sharedASE;
236: struct FTAMindication *fti;
237: {
238: SBV smask;
239: int result;
240: register struct ftamblk *fsb;
241:
242: missingP (fti);
243:
244: smask = sigioblock ();
245:
246: ftamPsig (fsb, sd);
247:
248: result = FTransEndRequestAux (fsb, sharedASE, fti);
249:
250: (void) sigiomask (smask);
251:
252: return result;
253: }
254:
255:
256: /* */
257:
258: static int FTransEndRequestAux (fsb, sharedASE, fti)
259: register struct ftamblk *fsb;
260: PE sharedASE;
261: struct FTAMindication *fti;
262: {
263: int result;
264: PE pe;
265: struct PSAPindication pis;
266: struct PSAPindication *pi = &pis;
267: struct PSAPabort *pa = &pi -> pi_abort;
268: register struct type_FTAM_PDU *pdu;
269:
270: if (!(fsb -> fsb_flags & FSB_INIT))
271: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "not initiator");
272: if (fsb -> fsb_state != FSB_DATAFIN1)
273: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "wrong state");
274:
275: pe = NULLPE;
276: if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL) {
277: (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
278: out: ;
279: if (pe)
280: pe_free (pe);
281: if (pdu)
282: free_FTAM_PDU (pdu);
283: if (fti -> fti_abort.fta_action == FACTION_PERM)
284: freefsblk (fsb);
285: return NOTOK;
286: }
287: pdu -> offset = type_FTAM_PDU_f__transfer__end__request;
288: if (sharedASE
289: && (pdu -> un.f__transfer__end__request =
290: shared2fpm (fsb, sharedASE, fti)) == NULL)
291: goto out;
292:
293: if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, pdu) == NOTOK) {
294: (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
295: "error encoding PDU: %s", PY_pepy);
296: goto out;
297: }
298:
299: pe -> pe_context = fsb -> fsb_id;
300:
301: fsbtrace (fsb, (fsb -> fsb_fd, "P-DATA.REQUEST", "F-TRANSFER-END-request",
302: pe, 0));
303:
304: result = PDataRequest (fsb -> fsb_fd, &pe, 1, pi);
305:
306: pe_free (pe);
307: pe = NULLPE;
308: free_FTAM_PDU (pdu);
309: pdu = NULL;
310:
311:
312: if (result == NOTOK) {
313: (void) ps2ftamlose (fsb, fti, "PDataRequest", pa);
314: goto out;
315: }
316:
317: fsb -> fsb_state = FSB_DATAFIN2;
318:
319: return FWaitRequestAux (fsb, NOTOK, fti);
320: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.