|
|
1.1 root 1: /* ftamaccess1.c - FPM: initiate file access */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamaccess1.c,v 7.0 89/11/23 21:53:20 mrose Rel $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/ftam/RCS/ftamaccess1.c,v 7.0 89/11/23 21:53:20 mrose Rel $
9: *
10: *
11: * $Log: ftamaccess1.c,v $
12: * Revision 7.0 89/11/23 21:53:20 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}.REQUEST */
35:
36: int FAccessRequest (sd, operation, identity, lock, fti)
37: int sd;
38: int operation;
39: struct FADUidentity *identity;
40: int lock; /* F-LOCATE.REQUEST only */
41: struct FTAMindication *fti;
42: {
43: SBV smask;
44: int result,
45: state;
46: register struct ftamblk *fsb;
47:
48: switch (operation) {
49: case FA_OPS_LOCATE:
50: state = FSB_LOCATE;
51: break;
52:
53: case FA_OPS_ERASE:
54: state = FSB_ERASE;
55: break;
56:
57: default:
58: return ftamlose (fti, FS_GEN_NOREASON, 0, NULLCP,
59: "bad value for operation parameter");
60: }
61: missingP (identity);
62: missingP (fti);
63:
64: smask = sigioblock ();
65:
66: ftamPsig (fsb, sd);
67:
68: result = FAccessRequestAux (fsb, state, identity, lock, fti);
69:
70: (void) sigiomask (smask);
71:
72: return result;
73: }
74:
75: /* */
76:
77: static int FAccessRequestAux (fsb, state, identity, lock, fti)
78: register struct ftamblk *fsb;
79: int state;
80: struct FADUidentity *identity;
81: int lock;
82: struct FTAMindication *fti;
83: {
84: int result;
85: PE pe;
86: struct PSAPindication pis;
87: struct PSAPindication *pi = &pis;
88: struct PSAPabort *pa = &pi -> pi_abort;
89: register struct type_FTAM_PDU *pdu;
90: register struct type_FTAM_F__LOCATE__request *req;
91:
92: if (!(fsb -> fsb_flags & FSB_INIT))
93: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "not initiator");
94: if (fsb -> fsb_state != FSB_DATAIDLE)
95: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "wrong state");
96: if (!(fsb -> fsb_units & FUNIT_ACCESS))
97: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
98: "file access not allowed");
99:
100: pe = NULLPE;
101: if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL) {
102: no_mem: ;
103: (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
104: out: ;
105: if (pe)
106: pe_free (pe);
107: if (pdu)
108: free_FTAM_PDU (pdu);
109: if (fti -> fti_abort.fta_action == FACTION_PERM)
110: freefsblk (fsb);
111: return NOTOK;
112: }
113: /* F-ERASE-request is identical... */
114: pdu -> offset = state != FSB_LOCATE ? type_FTAM_PDU_f__erase__request
115: : type_FTAM_PDU_f__locate__request;
116: if ((req = (struct type_FTAM_F__LOCATE__request *)
117: calloc (1, sizeof *req)) == NULL)
118: goto no_mem;
119: pdu -> un.f__locate__request = req;
120: if ((req -> file__access__data__unit__identity =
121: faduid2fpm (fsb, identity, fti)) == NULL)
122: goto out;
123: if ((fsb -> fsb_units & FUNIT_FADULOCK) && state == FSB_LOCATE) {
124: if ((req -> fadu__lock = (struct type_FTAM_FADU__Lock *)
125: calloc (1, sizeof *req -> fadu__lock))
126: == NULL)
127: goto no_mem;
128: req -> fadu__lock -> parm = lock ? int_FTAM_FADU__Lock_on
129: : int_FTAM_FADU__Lock_off;
130: }
131:
132: if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, pdu) == NOTOK) {
133: (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
134: "error encoding PDU: %s", PY_pepy);
135: goto out;
136: }
137:
138: pe -> pe_context = fsb -> fsb_id;
139:
140: fsbtrace (fsb, (fsb -> fsb_fd, "P-DATA.REQUEST",
141: state == FSB_LOCATE ? "F-LOCATE-request"
142: : "F-ERASE-request", pe, 0));
143:
144: result = PDataRequest (fsb -> fsb_fd, &pe, 1, pi);
145:
146: pe_free (pe);
147: pe = NULLPE;
148: free_FTAM_PDU (pdu);
149: pdu = NULL;
150:
151: if (result == NOTOK) {
152: (void) ps2ftamlose (fsb, fti, "PDataRequest", pa);
153: goto out;
154: }
155:
156: fsb -> fsb_state = state;
157:
158: return FWaitRequestAux (fsb, NOTOK, fti);
159: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.