|
|
1.1 root 1: /* ftamacl.c - FPM: encode/decode access control lists (SETs of AC elements) */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamacl.c,v 7.1 90/03/23 10:53:55 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/ftam/RCS/ftamacl.c,v 7.1 90/03/23 10:53:55 mrose Exp $
9: *
10: *
11: * $Log: ftamacl.c,v $
12: * Revision 7.1 90/03/23 10:53:55 mrose
13: * update
14: *
15: * Revision 7.0 89/11/23 21:53:22 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 "fpkt.h"
35:
36: /* */
37:
38: struct type_FTAM_Access__Control__List *acl2fpm (fsb, fe, fti)
39: register struct ftamblk *fsb;
40: register struct FTAMacelement *fe;
41: struct FTAMindication *fti;
42: {
43: struct type_FTAM_Access__Control__List *fpmp;
44: register struct type_FTAM_Access__Control__List *fpm,
45: **fpc;
46: register struct type_FTAM_Access__Control__Element *ace;
47:
48: fpmp = NULL, fpc = &fpmp;
49: for (; fe; fe = fe -> fe_next) {
50: if ((fpm = (struct type_FTAM_Access__Control__List *)
51: calloc (1, sizeof *fpm)) == NULL) {
52: no_mem: ;
53: (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
54: out: ;
55: if (fpmp)
56: free_FTAM_Access__Control__List (fpmp);
57: return NULL;
58: }
59: *fpc = fpm;
60:
61: if ((ace = (struct type_FTAM_Access__Control__Element *)
62: calloc (1, sizeof *ace)) == NULL)
63: goto no_mem;
64: fpm -> Access__Control__Element = ace;
65:
66: if (fe -> fe_actions & FA_PERM_TRAVERSAL) {
67: (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
68: "bad value for action-list");
69: goto out;
70: }
71: if ((ace -> action__list = bits2fpm (fsb, frequested_pairs,
72: fe -> fe_actions, fti)) == NULL)
73: goto out;
74:
75: if (conctl_present (&fe -> fe_concurrency)
76: && (ace -> concurrency__access =
77: conacc2fpm (fsb, &fe -> fe_concurrency, fti))
78: == NULL)
79: goto out;
80:
81: if (fe -> fe_identity
82: && (ace -> identity = str2qb (fe -> fe_identity,
83: strlen (fe -> fe_identity), 1))
84: == NULL)
85: goto no_mem;
86:
87: if (passes_present (&fe -> fe_passwords)
88: && (ace -> passwords = pass2fpm (fsb, &fe -> fe_passwords, fti))
89: == NULL)
90: goto out;
91:
92: if (fe -> fe_aet) {
93: if ((ace -> location = (struct type_ACS_AE__title *)
94: calloc (1, sizeof *ace -> location))
95: == NULL)
96: goto no_mem;
97: if (ace -> location -> title = fe -> fe_aet -> aei_ap_title)
98: ace -> location -> title -> pe_refcnt++;
99: if (ace -> location -> qualifier = fe -> fe_aet -> aei_ae_qualifier)
100: ace -> location -> qualifier -> pe_refcnt++;
101: }
102:
103: fpc = &fpm -> next;
104: }
105:
106: return fpmp;
107: }
108:
109: /* */
110:
111: int fpm2acl (fsb, fpm, fe, fti)
112: register struct ftamblk *fsb;
113: register struct type_FTAM_Access__Control__List *fpm;
114: register struct FTAMacelement **fe;
115: struct FTAMindication *fti;
116: {
117: register struct FTAMacelement *fc,
118: **fl;
119: register struct type_FTAM_Access__Control__Element *ace;
120:
121: *(fl = fe) = NULL;
122:
123: for (; fpm; fpm = fpm -> next) {
124: ace = fpm -> Access__Control__Element;
125:
126: if ((fc = (struct FTAMacelement *) calloc (1, sizeof *fc)) == NULL) {
127: no_mem: ;
128: (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
129: out: ;
130: if (fc = *fl)
131: FEFREE (fc);
132: return NOTOK;
133: }
134:
135: if (fpm2bits (fsb, frequested_pairs, ace -> action__list,
136: &fc -> fe_actions, fti) == NOTOK)
137: goto out;
138:
139: FCINIT (&fc -> fe_concurrency);
140: if (ace -> concurrency__access
141: && fpm2conacc (fsb, ace -> concurrency__access,
142: &fc -> fe_concurrency, fti) == NOTOK)
143: goto out;
144:
145: if (ace -> identity
146: && (fc -> fe_identity = qb2str (ace -> identity)) == NULL)
147: goto no_mem;
148:
149: if (ace -> passwords
150: && fpm2pass (fsb, ace -> passwords, &fc -> fe_passwords, fti)
151: == NOTOK)
152: goto out;
153:
154: if (ace -> location) {
155: if ((fc -> fe_aet = (AEI) calloc (1, sizeof *fc -> fe_aet))
156: == NULL)
157: goto no_mem;
158: if (ace -> location -> title
159: && (fc -> fe_aet -> aei_ap_title
160: = pe_cpy (ace -> location -> title)) == NULLPE)
161: goto no_mem;
162: if (ace -> location -> qualifier
163: && (fc -> fe_aet -> aei_ae_qualifier
164: = pe_cpy (ace -> location -> qualifier))
165: == NULLPE)
166: goto no_mem;
167: }
168:
169: fe = &((*fe) -> fe_next);
170: }
171:
172: return OK;
173: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.