|
|
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.