|
|
1.1 root 1: /* ftamd.c - FTAM -- responder */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/ftam2/RCS/ftamd.c,v 7.0 89/11/23 21:54:36 mrose Rel $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/ftam2/RCS/ftamd.c,v 7.0 89/11/23 21:54:36 mrose Rel $
9: *
10: *
11: * $Log: ftamd.c,v $
12: * Revision 7.0 89/11/23 21:54:36 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: #include <stdio.h>
29: #include <varargs.h>
30: #include "ftamsystem.h"
31:
32: /* DATA */
33:
34: int ftamfd = NOTOK;
35:
36: int cflag = 0;
37: int debug = 0;
38: char *myname = "ftamd";
39:
40: /* MAIN */
41:
42: #define SMASK "\020\01UNCONS\02MANAGE\03TRANSFER\04TM\05ACCESS"
43:
44: #define UMASK "\020\01READ\02WRITE\03ACCESS\04LIMITED\05ENHANCED\06GROUPING\
45: \07FADULOCK\08RECOVERY\00RESTART"
46:
47: #define AMASK "\020\01STORAGE\02SECURITY\03PRIVATE"
48:
49: /* ARGSUSED */
50:
51: main (argc, argv, envp)
52: int argc;
53: char **argv,
54: **envp;
55: {
56: int result;
57: char *ap;
58: struct FTAMstart ftss;
59: register struct FTAMstart *fts = &ftss;
60: struct FTAMindication ftis;
61: register struct FTAMindication *fti = &ftis;
62:
63: if (myname = rindex (argv[0], '/'))
64: myname++;
65: if (myname == NULL || *myname == NULL)
66: myname = argv[0];
67:
68: isodetailor (myname, 0);
69: if (debug == 0 && !(debug = isatty (fileno (stderr)))) {
70: ftam_log -> ll_stat &= ~LLOGCLS;
71: ll_hdinit (ftam_log, myname);
72: }
73: else
74: ll_dbinit (ftam_log, myname);
75:
76: advise (LLOG_NOTICE, NULLCP, "starting");
77:
78: if (FInit (argc, argv, fts, debug ? FTraceHook : NULLIFP, fti) == NOTOK)
79: ftam_adios (&fti -> fti_abort, "initialization");
80: advise (LLOG_NOTICE, NULLCP,
81: "F-INITIALIZE.INDICATION: <%d, %s, %s, %s, %s>",
82: fts -> fts_sd, oid2ode (fts -> fts_context),
83: sprintb (fts -> fts_class, SMASK),
84: fts -> fts_initiator ? fts -> fts_initiator : "",
85: fts -> fts_account ? fts -> fts_account : "");
86: #ifdef DEBUG
87: {
88: register int i;
89: register struct FTAMcontent *fx;
90:
91: advise (LLOG_DEBUG, NULLCP,
92: " called AE title: %s, called PSAP address: %s",
93: sprintaei (&fts -> fts_calledtitle),
94: paddr2str (&fts -> fts_calledaddr, NULLNA));
95: advise (LLOG_DEBUG, NULLCP,
96: " calling AE title: %s, calling PSAP address: %s",
97: sprintaei (&fts -> fts_callingtitle),
98: paddr2str (&fts -> fts_callingaddr, NULLNA));
99:
100: advise (LLOG_DEBUG, NULLCP, " manage: %d, ftam-QoS: %d",
101: fts -> fts_manage, fts -> fts_fqos);
102: advise (LLOG_DEBUG, NULLCP, " units: %s",
103: sprintb (fts -> fts_units, UMASK));
104: advise (LLOG_DEBUG, NULLCP, " attrs: %s",
105: sprintb (fts -> fts_attrs, AMASK));
106:
107: for (fx = fts -> fts_contents.fc_contents, i = 0;
108: i < fts -> fts_contents.fc_ncontent;
109: fx++, i++)
110: advise (LLOG_DEBUG, NULLCP, " cnt %d: %s %d %d",
111: i, sprintoid (fx -> fc_dtn), fx -> fc_id, fx -> fc_result);
112: }
113: #endif
114:
115: for (argv++; ap = *argv; argv++)
116: if (*ap == '-')
117: while (*++ap)
118: switch (*ap) {
119: case 'c':
120: cflag++;
121: break;
122:
123: case 'd':
124: debug++;
125: ll_dbinit (ftam_log, myname);
126: (void) FHookRequest (fts -> fts_sd, FTraceHook, fti);
127: break;
128:
129: default:
130: adios (NULLCP, "unknown switch -%c", *ap);
131: }
132: else
133: advise (LLOG_NOTICE, NULLCP, "unknown argument \"%s\"", ap);
134:
135: ftam_start (fts);
136:
137: FTSFREE (fts);
138:
139: for (;;)
140: switch (result = FWaitRequest (ftamfd, NOTOK, fti)) {
141: case NOTOK:
142: case OK:
143: case DONE:
144: ftam_indication (fti);
145: break;
146:
147: default:
148: adios (NULLCP, "unknown return from FWaitRequest=%d", result);
149: }
150: }
151:
152: /* */
153:
154: void ftam_adios (fta, event)
155: struct FTAMabort *fta;
156: char *event;
157: {
158: struct FTAMindication ftis;
159:
160: ftam_advise (fta, event);
161:
162: if (fta -> fta_action != FACTION_PERM && ftamfd != NOTOK)
163: (void) FUAbortRequest (ftamfd, FACTION_PERM,
164: (struct FTAMdiagnostic *) 0, 0, &ftis);
165:
166: closewtmp ();
167:
168: _exit (1);
169: }
170:
171:
172: void ftam_advise (fta, event)
173: register struct FTAMabort *fta;
174: char *event;
175: {
176: advise (LLOG_NOTICE, NULLCP, "%s: failed", event);
177: ftam_diag (fta -> fta_diags, fta -> fta_ndiag);
178:
179: if (fta -> fta_action == FACTION_PERM) {
180: closewtmp ();
181:
182: _exit (1);
183: }
184: }
185:
186: /* */
187:
188: static char *entity[] = {
189: "UNK", "IFSU", "IFPM", "VFS", "RFPM", "RFSU"
190: };
191:
192:
193: void ftam_diag (diag, ndiag)
194: struct FTAMdiagnostic diag[];
195: int ndiag;
196: {
197: register int i;
198: register char *cp;
199: char buffer[BUFSIZ];
200: register struct FTAMdiagnostic *dp;
201:
202: for (dp = diag, i = ndiag - 1; i >= 0; dp++, i--) {
203: cp = buffer;
204: (void) sprintf (cp, "%s", FErrString (dp -> ftd_identifier));
205:
206: if (dp -> ftd_cc > 0) {
207: cp += strlen (cp);
208: (void) sprintf (cp, ": %*.*s", dp -> ftd_cc, dp -> ftd_cc,
209: dp -> ftd_data);
210: }
211:
212: advise (LLOG_NOTICE, NULLCP, "%s", buffer);
213:
214: cp = buffer;
215: (void) sprintf (cp, " type ");
216: cp += strlen (cp);
217:
218: switch (dp -> ftd_type) {
219: case DIAG_INFORM:
220: (void) sprintf (cp, "informative");
221: break;
222:
223: case DIAG_TRANS:
224: (void) sprintf (cp, "transient");
225: break;
226:
227: case DIAG_PERM:
228: (void) sprintf (cp, "permanent");
229: break;
230:
231: default:
232: (void) sprintf (cp, "%d", dp -> ftd_type);
233: break;
234: }
235: cp += strlen (cp);
236:
237: (void) sprintf (cp, ", observer ");
238: cp += strlen (cp);
239:
240: switch (dp -> ftd_observer) {
241: case EREF_IFSU:
242: case EREF_IFPM:
243: case EREF_RFPM:
244: case EREF_RFSU:
245: (void) sprintf (cp, "%s", entity[dp -> ftd_observer]);
246: break;
247:
248: default:
249: (void) sprintf (cp, "%d", dp -> ftd_observer);
250: break;
251: }
252: cp += strlen (cp);
253:
254: (void) sprintf (cp, ", source ");
255: cp += strlen (cp);
256:
257: switch (dp -> ftd_source) {
258: case EREF_NONE:
259: case EREF_IFSU:
260: case EREF_IFPM:
261: case EREF_SERV:
262: case EREF_RFPM:
263: case EREF_RFSU:
264: (void) sprintf (cp, "%s", entity[dp -> ftd_source]);
265: break;
266:
267: default:
268: (void) sprintf (cp, "%d", dp -> ftd_source);
269: break;
270: }
271:
272: if (dp -> ftd_delay != DIAG_NODELAY) {
273: cp += strlen (cp);
274: (void) sprintf (cp, ", suggested-delay %d", dp -> ftd_delay);
275: }
276:
277: advise (LLOG_NOTICE, NULLCP, "%s", buffer);
278: }
279: }
280:
281: /* */
282:
283: #ifndef lint
284: void adios (va_alist)
285: va_dcl
286: {
287: struct FTAMindication ftis;
288: va_list ap;
289:
290: va_start (ap);
291:
292: (void) _ll_log (ftam_log, LLOG_FATAL, ap);
293:
294: va_end (ap);
295:
296: if (ftamfd != NOTOK)
297: (void) FUAbortRequest (ftamfd, FACTION_PERM,
298: (struct FTAMdiagnostic *) 0, 0, &ftis);
299:
300: closewtmp ();
301:
302: _exit (1);
303: }
304: #else
305: /* VARARGS */
306:
307: void adios (what, fmt)
308: char *what,
309: *fmt;
310: {
311: adios (what, fmt);
312: }
313: #endif
314:
315:
316: #ifndef lint
317: void advise (va_alist)
318: va_dcl
319: {
320: int code;
321: va_list ap;
322:
323: va_start (ap);
324:
325: code = va_arg (ap, int);
326:
327: (void) _ll_log (ftam_log, code, ap);
328:
329: va_end (ap);
330: }
331: #else
332: /* VARARGS */
333:
334: void advise (code, what, fmt)
335: char *what,
336: *fmt;
337: int code;
338: {
339: advise (code, what, fmt);
340: }
341: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.