|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T f
Length: 20218 (0x4efa) Types: TextFile Names: »ftamgroup2.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape └─⟦eba4602b1⟧ »./isode-5.0.tar.Z« └─⟦d3ac74d73⟧ └─⟦this⟧ »isode-5.0/ftam/ftamgroup2.c«
/* ftamgroup2.c - FPM: respond to a grouped transaction */ #ifndef lint static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamgroup2.c,v 6.0 89/03/18 23:30:42 mrose Rel $"; #endif /* * $Header: /f/osi/ftam/RCS/ftamgroup2.c,v 6.0 89/03/18 23:30:42 mrose Rel $ * * * $Log: ftamgroup2.c,v $ * Revision 6.0 89/03/18 23:30:42 mrose * Release 5.0 * */ /* * NOTICE * * Acquisition, use, and distribution of this module and related * materials are subject to the restrictions of a license agreement. * Consult the Preface in the User's Manual for the full terms of * this agreement. * */ /* LINTLIBRARY */ #include <stdio.h> #include <signal.h> #include "fpkt.h" /* \f F-{MANAGE,BULK-{BEGIN,END}}.RESPONSE (group) */ int FManageResponse (sd, ftg, fti) int sd; struct FTAMgroup *ftg; struct FTAMindication *fti; { return FGroupResponse (sd, ftg, FTI_MANAGEMENT, FSB_INITIALIZED, fti); } int FBulkBeginResponse (sd, ftg, fti) int sd; struct FTAMgroup *ftg; struct FTAMindication *fti; { return FGroupResponse (sd, ftg, FTI_BULKBEGIN, FSB_DATAIDLE, fti); } int FBulkEndResponse (sd, ftg, fti) int sd; struct FTAMgroup *ftg; struct FTAMindication *fti; { return FGroupResponse (sd, ftg, FTI_BULKEND, FSB_INITIALIZED, fti); } /* \f F-GROUP.RESPONSE (group) */ static int FGroupResponse (sd, ftg, type, state, fti) int sd; struct FTAMgroup *ftg; int type, state; struct FTAMindication *fti; { SBV smask; int result; register struct ftamblk *fsb; missingP (ftg); missingP (fti); smask = sigioblock (); ftamPsig (fsb, sd); if ((result = frgrpchk (fsb, ftg, type, fti)) != NOTOK) result = FGroupResponseAux (fsb, ftg, state, fti); (void) sigiomask (smask); return result; } /* \f */ static int FGroupResponseAux (fsb, ftg, state, fti) register struct ftamblk *fsb; register struct FTAMgroup *ftg; int state; struct FTAMindication *fti; { register int i; int did_loop, npdu, result, okstate; char **txp, *texts[NPDATA]; PE pe, *pep, info[NPDATA]; struct PSAPindication pis; struct PSAPindication *pi = &pis; struct PSAPabort *pa = &pi -> pi_abort; struct type_FTAM_PDU **pdup, *pdus[NPDATA]; bzero ((char *) texts, sizeof texts); bzero ((char *) info, sizeof info); bzero ((char *) pdus, sizeof pdus); did_loop = 0; if ((result = frgrp2pdus (fsb, ftg, pdus, texts, &npdu, fti)) == NOTOK) goto out; for (pdup = pdus, pep = info, txp = texts, i = npdu - 1; i >= 0; pdup++, pep++, txp++, i--) { pe = NULLPE; if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, *pdup) == NOTOK) { result = ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "error encoding PDU: %s", PY_pepy); goto out; } (*pep = pe) -> pe_context = fsb -> fsb_id; fsbtrace (fsb, (fsb -> fsb_fd, "P-DATA.REQUEST", *txp, pe, 0)); } did_loop = 1; result = PDataRequest (fsb -> fsb_fd, info, npdu, pi); out: ; for (pdup = pdus, pep = info, i = NPDATA - 1; i >= 0; pdup++, pep++, i--) { if (*pep) pe_free (*pep); if (*pdup) free_FTAM_PDU (*pdup); } if (result == NOTOK) { if (did_loop) (void) ps2ftamlose (fsb, fti, "PDataRequest", pa); if (fti -> fti_abort.fta_action == FACTION_PERM) freefsblk (fsb); return NOTOK; } switch (state) { case FSB_DATAIDLE: if (ftg -> ftg_flags & FTG_SELECT) okstate = ftg -> ftg_select.ftse_state; else okstate = ftg -> ftg_create.ftce_state; if (okstate != FSTATE_SUCCESS || ftg -> ftg_open.ftop_state != FSTATE_SUCCESS) { fsb -> fsb_state = FSB_INITIALIZED; break; } /* else fall */ default: fsb -> fsb_state = state; break; } return OK; } /* \f */ static int frgrpchk (fsb, ftg, type, fti) register struct ftamblk *fsb; register struct FTAMgroup *ftg; int type; struct FTAMindication *fti; { if (fsb -> fsb_flags & FSB_INIT) return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "not responder"); switch (fsb -> fsb_state) { case FSB_MANAGEMENT: if (type != FTI_MANAGEMENT) goto wrong_state; if (ftg -> ftg_flags & ~fsb -> fsb_group) { reply_mismatch: ; return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "group reply mismatch; expecting 0x%x, found 0x%x", fsb -> fsb_group, ftg -> ftg_flags); } break; case FSB_BULKBEGIN: if (type != FTI_BULKBEGIN) goto wrong_state; if (ftg -> ftg_flags & ~fsb -> fsb_group) goto reply_mismatch; break; case FSB_BULKEND: if (type != FTI_BULKEND) goto wrong_state; if (ftg -> ftg_flags & ~fsb -> fsb_group) goto reply_mismatch; break; default: wrong_state: ; return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "wrong state"); } if (ftg -> ftg_flags & FTG_SELECT) { register struct FTAMselect *ftse = &ftg -> ftg_select; switch (ftse -> ftse_state) { case FSTATE_SUCCESS: case FSTATE_FAILURE: break; default: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "bad value for select state parameter"); } switch (ftse -> ftse_action) { case FACTION_SUCCESS: case FACTION_TRANS: case FACTION_PERM: break; default: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "bad value for select action parameter"); } if (ftse -> ftse_attrs.fa_present != FA_FILENAME) return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "only filename should be present"); if (ftse -> ftse_ndiag > NFDIAG) return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "too many select diagnostics"); } if (ftg -> ftg_flags & FTG_CREATE) { register struct FTAMcreate *ftce = &ftg -> ftg_create; switch (ftce -> ftce_state) { case FSTATE_SUCCESS: case FSTATE_FAILURE: break; default: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "bad value for create state parameter"); } switch (ftce -> ftce_action) { case FACTION_SUCCESS: case FACTION_TRANS: case FACTION_PERM: break; default: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "bad value for create action parameter"); } if (!(ftce -> ftce_attrs.fa_present & FA_FILENAME)) return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "filename not present"); if (!(ftce -> ftce_attrs.fa_present & FA_ACTIONS)) return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "permitted-actions not present"); if (!(ftce -> ftce_attrs.fa_present & FA_CONTENTS)) return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "contents-type not present"); if (ftce -> ftce_attrs.fa_present & ~FA_CRE_ATTRS) return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "illegal attributes present"); if (!(fsb -> fsb_attrs & FATTR_STORAGE) && (ftce -> ftce_attrs.fa_present & FA_STORAGE)) return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "storage attributes not permitted"); if (!(fsb -> fsb_attrs & FATTR_SECURITY) && (ftce -> ftce_attrs.fa_present & FA_SECURITY)) return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "security attributes not permitted"); if (ftce -> ftce_ndiag > NFDIAG) return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "too many create diagnostics"); } if (ftg -> ftg_flags & FTG_CLOSE) { register struct FTAMclose *ftcl = &ftg -> ftg_close; switch (ftcl -> ftcl_action) { case FACTION_SUCCESS: case FACTION_TRANS: case FACTION_PERM: break; default: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "bad value for close action parameter"); } if (ftcl -> ftcl_ndiag > NFDIAG) return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "too many close diagnostics"); } if (ftg -> ftg_flags & FTG_RDATTR) { register struct FTAMreadattr *ftra = &ftg -> ftg_readattr; switch (ftra -> ftra_action) { case FACTION_SUCCESS: case FACTION_TRANS: case FACTION_PERM: break; default: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "bad value for read attribute action parameter"); } if (!(fsb -> fsb_attrs & FATTR_STORAGE) && (ftra -> ftra_attrs.fa_present & FA_STORAGE)) return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "storage attributes not permitted"); if (!(fsb -> fsb_attrs & FATTR_SECURITY) && (ftra -> ftra_attrs.fa_present & FA_SECURITY)) return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "security attributes not permitted"); if (ftra -> ftra_ndiag > NFDIAG) return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "too many read attribute diagnostics"); } if (ftg -> ftg_flags & FTG_CHATTR) { register struct FTAMchngattr *ftca = &ftg -> ftg_chngattr; switch (ftca -> ftca_action) { case FACTION_SUCCESS: case FACTION_TRANS: case FACTION_PERM: break; default: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "bad value for change attribute action parameter"); } if (!(fsb -> fsb_attrs & FATTR_STORAGE) && (ftca -> ftca_attrs.fa_present & FA_STORAGE)) return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "storage attributes not permitted"); if (!(fsb -> fsb_attrs & FATTR_SECURITY) && (ftca -> ftca_attrs.fa_present & FA_SECURITY)) return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "security attributes not permitted"); if (ftca -> ftca_attrs.fa_present & FA_CONTROL) return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "encoding of access-control not supported (yet)"); if (ftca -> ftca_ndiag > NFDIAG) return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "too many change attribute diagnostics"); } if (ftg -> ftg_flags & FTG_DESELECT) { register struct FTAMdeselect *ftde = &ftg -> ftg_deselect; switch (ftde -> ftde_action) { case FACTION_SUCCESS: case FACTION_TRANS: case FACTION_PERM: break; default: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "bad value for deselect action parameter"); } if (!(fsb -> fsb_flags & FSB_DECHARGE) && ftde -> ftde_charges.fc_ncharge > 0) return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "deselect not permitted to include charges"); if (ftde -> ftde_charges.fc_ncharge > NFCHRG) return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "too many deselect charges"); if (ftde -> ftde_ndiag > NFDIAG) return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "too many deselect diagnostics"); } if (ftg -> ftg_flags & FTG_DELETE) { register struct FTAMdelete *ftxe = &ftg -> ftg_delete; switch (ftxe -> ftxe_action) { case FACTION_SUCCESS: case FACTION_TRANS: case FACTION_PERM: break; default: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "bad value for delete action parameter"); } if (ftxe -> ftxe_charges.fc_ncharge > NFCHRG) return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "too many delete charges"); if (ftxe -> ftxe_ndiag > NFDIAG) return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "too many delete diagnostics"); } if (ftg -> ftg_flags & FTG_OPEN) { register struct FTAMopen *ftop = &ftg -> ftg_open; register struct FTAMconcurrency *fc; switch (ftop -> ftop_state) { case FSTATE_SUCCESS: case FSTATE_FAILURE: break; default: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "bad value for open state parameter"); } switch (ftop -> ftop_action) { case FACTION_SUCCESS: case FACTION_TRANS: case FACTION_PERM: break; default: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "bad value for open action parameter"); } if (ftop -> ftop_contents == NULLOID) return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "missing open contents type parameter"); if (fsb -> fsb_attrs & FATTR_STORAGE) { fc = &ftop -> ftop_conctl; if (fc -> fc_readattrlock != FLOCK_NOTREQD || fc -> fc_chngattrlock != FLOCK_NOTREQD || fc -> fc_deletelock != FLOCK_NOTREQD) return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "bad settings for open concurrency control"); } if (ftop -> ftop_ndiag > NFDIAG) return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "too many open diagnostics"); } return OK; } /* \f */ static int frgrp2pdus (fsb, ftg, pdus, texts, npdu, fti) register struct ftamblk *fsb; register struct FTAMgroup *ftg; struct type_FTAM_PDU *pdus[]; char *texts[]; int *npdu; struct FTAMindication *fti; { int flags, i; register struct type_FTAM_PDU *pdu; i = 0; #define new_pdu(t,o,u,x) \ register struct t *req; \ \ if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL) \ goto no_mem; \ pdus[i] = pdu; \ pdu -> offset = o; \ texts[i++] = x; \ if ((req = (struct t *) calloc (1, sizeof *req)) == NULL) \ goto no_mem; \ pdu -> un.u = req; #define new_state(s) \ if (s != int_FTAM_State__Result_success) { \ if ((req -> state__result = \ (struct type_FTAM_State__Result *) \ calloc (1, sizeof *req -> state__result)) \ == NULL) \ goto no_mem; \ req -> state__result -> parm = s; \ } #define new_action(a) \ if (a != int_FTAM_Action__Result_success) { \ if ((req -> action__result = \ (struct type_FTAM_Action__Result *) \ calloc (1, sizeof *req -> action__result)) \ == NULL) \ goto no_mem; \ req -> action__result -> parm = a; \ } if ((flags = ftg -> ftg_flags) & FTG_SELECT) { if (ftg -> ftg_select.ftse_state == FSTATE_FAILURE) flags &= FTG_BEGIN | FTG_SELECT | FTG_END; } else if (flags & FTG_CREATE) { if (ftg -> ftg_create.ftce_state == FSTATE_FAILURE) flags &= FTG_BEGIN | FTG_CREATE | FTG_END; } if (flags & FTG_BEGIN) { if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL) goto no_mem; pdus[i] = pdu; pdu -> offset = type_FTAM_PDU_f__begin__group__response; texts[i++] = "F-BEGIN-GROUP-response"; } if (flags & FTG_SELECT) { register struct FTAMselect *ftse = &ftg -> ftg_select; new_pdu (type_FTAM_F__SELECT__response, type_FTAM_PDU_f__select__response, f__select__response, "F-SELECT-response"); new_state (ftse -> ftse_state); new_action (ftse -> ftse_action); if ((req -> attributes = attr2fpm (fsb, &ftse -> ftse_attrs, fti)) == NULL) return NOTOK; if (ftse -> ftse_sharedASE && (req -> shared__ASE__information = shared2fpm (fsb, ftse -> ftse_sharedASE, fti)) == NULL) return NOTOK; if (ftse -> ftse_ndiag > 0 && (req -> diagnostic = diag2fpm (fsb, 0, ftse -> ftse_diags, ftse -> ftse_ndiag, fti)) == NULL) return NOTOK; } if (flags & FTG_CREATE) { register struct FTAMcreate *ftce = &ftg -> ftg_create; new_pdu (type_FTAM_F__CREATE__response, type_FTAM_PDU_f__create__response, f__create__response, "F-CREATE-response"); new_state (ftce -> ftce_state); new_action (ftce -> ftce_action); if ((req -> initial__attributes = attr2fpm (fsb, &ftce -> ftce_attrs, fti)) == NULL) return NOTOK; if (ftce -> ftce_sharedASE && (req -> shared__ASE__information = shared2fpm (fsb, ftce -> ftce_sharedASE, fti)) == NULL) return NOTOK; if (ftce -> ftce_ndiag > 0 && (req -> diagnostic = diag2fpm (fsb, 0, ftce -> ftce_diags, ftce -> ftce_ndiag, fti)) == NULL) return NOTOK; } if (flags & FTG_CLOSE) { register struct FTAMclose *ftcl = &ftg -> ftg_close; new_pdu (type_FTAM_F__CLOSE__response, type_FTAM_PDU_f__close__response, f__close__response, "F-CLOSE-response"); new_action (ftcl -> ftcl_action); if (ftcl -> ftcl_sharedASE && (req -> shared__ASE__information = shared2fpm (fsb, ftcl -> ftcl_sharedASE, fti)) == NULL) return NOTOK; if (ftcl -> ftcl_ndiag > 0 && (req -> diagnostic = diag2fpm (fsb, 0, ftcl -> ftcl_diags, ftcl -> ftcl_ndiag, fti)) == NULL) return NOTOK; } if (flags & FTG_RDATTR) { register struct FTAMreadattr *ftra = &ftg -> ftg_readattr; new_pdu (type_FTAM_F__READ__ATTRIB__response, type_FTAM_PDU_f__read__attrib__response, f__read__attrib__response, "F-READ-ATTRIB-response"); new_action (ftra -> ftra_action); if (ftra -> ftra_attrs.fa_present && (req -> attributes = attr2fpm (fsb, &ftra -> ftra_attrs, fti)) == NULL) return NOTOK; if (ftra -> ftra_ndiag > 0 && (req -> diagnostic = diag2fpm (fsb, 0, ftra -> ftra_diags, ftra -> ftra_ndiag, fti)) == NULL) return NOTOK; } if (flags & FTG_CHATTR) { register struct FTAMchngattr *ftca = &ftg -> ftg_chngattr; new_pdu (type_FTAM_F__CHANGE__ATTRIB__response, type_FTAM_PDU_f__change__attrib__response, f__change__attrib__response, "F-CHANGE-ATTRIB-response"); new_action (ftca -> ftca_action); if (ftca -> ftca_attrs.fa_present && (req -> attributes = attr2fpm (fsb, &ftca -> ftca_attrs, fti)) == NULL) return NOTOK; if (ftca -> ftca_ndiag > 0 && (req -> diagnostic = diag2fpm (fsb, 0, ftca -> ftca_diags, ftca -> ftca_ndiag, fti)) == NULL) return NOTOK; } if (flags & FTG_DESELECT) { register struct FTAMdeselect *ftde = &ftg -> ftg_deselect; new_pdu (type_FTAM_F__DESELECT__response, type_FTAM_PDU_f__deselect__response, f__deselect__response, "F-DESELECT-response"); new_action (ftde -> ftde_action); if (ftde -> ftde_sharedASE && (req -> shared__ASE__information = shared2fpm (fsb, ftde -> ftde_sharedASE, fti)) == NULL) return NOTOK; if (ftde -> ftde_charges.fc_ncharge && (req -> charging = chrg2fpm (fsb, &ftde -> ftde_charges, fti)) == NULL) return NOTOK; if (ftde -> ftde_ndiag > 0 && (req -> diagnostic = diag2fpm (fsb, 0, ftde -> ftde_diags, ftde -> ftde_ndiag, fti)) == NULL) return NOTOK; } if (flags & FTG_DELETE) { register struct FTAMdelete *ftxe = &ftg -> ftg_delete; new_pdu (type_FTAM_F__DELETE__response, type_FTAM_PDU_f__delete__response, f__delete__response, "F-DELETE-response"); new_action (ftxe -> ftxe_action); if (ftxe -> ftxe_sharedASE && (req -> shared__ASE__information = shared2fpm (fsb, ftxe -> ftxe_sharedASE, fti)) == NULL) return NOTOK; if (ftxe -> ftxe_charges.fc_ncharge && (req -> charging = chrg2fpm (fsb, &ftxe -> ftxe_charges, fti)) == NULL) return NOTOK; if (ftxe -> ftxe_ndiag > 0 && (req -> diagnostic = diag2fpm (fsb, 0, ftxe -> ftxe_diags, ftxe -> ftxe_ndiag, fti)) == NULL) return NOTOK; } if (flags & FTG_OPEN) { register struct FTAMopen *ftop = &ftg -> ftg_open; register struct type_FTAM_Contents__Type__Attribute *proposed; new_pdu (type_FTAM_F__OPEN__response, type_FTAM_PDU_f__open__response, f__open__response, "F-OPEN-response"); new_state (ftop -> ftop_state); new_action (ftop -> ftop_action); if ((proposed = (struct type_FTAM_Contents__Type__Attribute *) calloc (1, sizeof *proposed)) == NULL) goto no_mem; req -> contents__type = proposed; if ((proposed -> document__type__name = oid_cpy (ftop -> ftop_contents)) == NULLOID) goto no_mem; if (proposed -> parameter = ftop -> ftop_parameter) proposed -> parameter -> pe_refcnt++; if (conctl_present (&ftop -> ftop_conctl) && (req -> concurrency__control = conctl2fpm (fsb, &ftop -> ftop_conctl, fti)) == NULL) return NOTOK; if (ftop -> ftop_sharedASE && (req -> shared__ASE__information = shared2fpm (fsb, ftop -> ftop_sharedASE, fti)) == NULL) return NOTOK; if (ftop -> ftop_ndiag > 0 && (req -> diagnostic = diag2fpm (fsb, 0, ftop -> ftop_diags, ftop -> ftop_ndiag, fti)) == NULL) return NOTOK; } if (flags & FTG_END) { if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL) goto no_mem; pdus[i] = pdu; pdu -> offset = type_FTAM_PDU_f__end__group__response; texts[i++] = "F-END-GROUP-response"; } *npdu = i; return OK; #undef new_pdu #undef new_state #undef new_action no_mem: ; return ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory"); }