|
|
1.1 root 1: /* ftamdiag.c - FPM: encode/decode diagnostics */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamdiag.c,v 7.1 90/01/11 18:35:40 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/ftam/RCS/ftamdiag.c,v 7.1 90/01/11 18:35:40 mrose Exp $
9: *
10: *
11: * $Log: ftamdiag.c,v $
12: * Revision 7.1 90/01/11 18:35:40 mrose
13: * real-sync
14: *
15: * Revision 7.0 89/11/23 21:53:32 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_Diagnostic *diag2fpm (fsb, magic, diag, ndiag, fti)
39: register struct ftamblk *fsb;
40: int magic;
41: struct FTAMdiagnostic diag[];
42: int ndiag;
43: struct FTAMindication *fti;
44: {
45: register int i;
46: register struct FTAMdiagnostic *dp;
47: struct type_FTAM_Diagnostic *fpmp;
48: register struct type_FTAM_Diagnostic *fpm,
49: **fpc;
50: register struct diag_element *f3;
51:
52: fpmp = NULL, fpc = &fpmp;
53: for (dp = diag, i = ndiag - 1; i >= 0; dp++, i--) {
54: if ((fpm = (struct type_FTAM_Diagnostic *) calloc (1, sizeof *fpm))
55: == NULL) {
56: no_mem: ;
57: (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
58: out: ;
59: if (fpmp)
60: free_FTAM_Diagnostic (fpmp);
61: return NULL;
62: }
63: *fpc = fpm;
64:
65: if ((f3 = (struct diag_element *) calloc (1, sizeof *f3)) == NULL)
66: goto no_mem;
67: fpm -> diagnostic = f3;
68:
69: switch (dp -> ftd_type) {
70: case DIAG_INFORM:
71: case DIAG_TRANS:
72: case DIAG_PERM:
73: break;
74:
75: default:
76: bad_dp: ;
77: (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
78: "bad diagnostic type/observer/source (%d/%d/%d) at slot %d",
79: dp -> ftd_type, dp -> ftd_observer, dp -> ftd_source,
80: ndiag - i - 1);
81: goto out;
82: }
83: f3 -> diagnostic__type = dp -> ftd_type;
84:
85: f3 -> error__identifier = dp -> ftd_identifier;
86:
87: switch (dp -> ftd_observer) {
88: case EREF_IFSU:
89: case EREF_IFPM:
90: if (!(fsb -> fsb_flags & FSB_INIT))
91: goto bad_dp;
92: break;
93:
94: case EREF_RFSU:
95: case EREF_RFPM:
96: if (fsb -> fsb_flags & FSB_INIT)
97: goto bad_dp;
98: break;
99:
100: default:
101: if (!magic)
102: goto bad_dp;
103: break;
104: }
105: if ((f3 -> error__observer =
106: (struct type_FTAM_Entity__Reference *)
107: calloc (1, sizeof *f3 -> error__observer))
108: == NULL)
109: goto no_mem;
110: f3 -> error__observer -> parm = dp -> ftd_observer;
111:
112: switch (dp -> ftd_source) {
113: case EREF_NONE:
114: case EREF_IFSU:
115: case EREF_IFPM:
116: case EREF_SERV:
117: case EREF_RFPM:
118: case EREF_RFSU:
119: break;
120:
121: default:
122: goto bad_dp;
123: }
124: if ((f3 -> error__source =
125: (struct type_FTAM_Entity__Reference *)
126: calloc (1, sizeof *f3 -> error__source))
127: == NULL)
128: goto no_mem;
129: f3 -> error__source -> parm = dp -> ftd_source;
130:
131: if (dp -> ftd_delay != DIAG_NODELAY) {
132: f3 -> optionals |= opt_FTAM_diag_element_suggested__delay;
133: f3 -> suggested__delay = dp -> ftd_delay;
134: }
135:
136: if (dp -> ftd_cc > FTD_SIZE)
137: goto bad_dp;
138: else
139: if (dp -> ftd_cc > 0
140: && (f3 -> further__details = str2qb (dp -> ftd_data,
141: dp -> ftd_cc, 1))
142: == NULL)
143: goto no_mem;
144:
145: fpc = &fpm -> next;
146: }
147:
148: return fpmp;
149: }
150:
151: /* */
152:
153: int fpm2diag (fsb, fpm, diag, ndiag, fti)
154: register struct ftamblk *fsb;
155: register struct type_FTAM_Diagnostic *fpm;
156: struct FTAMdiagnostic diag[];
157: int *ndiag;
158: struct FTAMindication *fti;
159: {
160: register int i;
161: register struct FTAMdiagnostic *dp;
162: register struct diag_element *f3;
163:
164: *ndiag = 0;
165:
166: dp = diag, i = 0;
167: for (; fpm; fpm = fpm -> next) {
168: if (i >= NFDIAG)
169: return ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
170: "too many diagnostics");
171:
172: f3 = fpm -> diagnostic;
173: dp -> ftd_type = f3 -> diagnostic__type;
174: dp -> ftd_identifier = f3 -> error__identifier;
175: dp -> ftd_observer = f3 -> error__observer -> parm;
176: dp -> ftd_source = f3 -> error__source -> parm;
177: if (f3 -> optionals & opt_FTAM_diag_element_suggested__delay)
178: dp -> ftd_delay = f3 -> suggested__delay;
179: else
180: dp -> ftd_delay = DIAG_NODELAY;
181: if (f3 -> further__details) {
182: register char *cp;
183:
184: if ((cp = qb2str (f3 -> further__details)) == NULL)
185: return ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
186: "out of memory");
187: (void) strncpy (dp -> ftd_data, cp, sizeof dp -> ftd_data);
188: dp -> ftd_data[sizeof dp -> ftd_data - 1] = NULL;
189: dp -> ftd_cc = strlen (dp -> ftd_data);
190: free (cp);
191: }
192: else
193: dp -> ftd_cc = 0;
194:
195: dp++, i++;
196: }
197:
198: *ndiag = i;
199:
200: return OK;
201: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.