|
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: 14774 (0x39b6) Types: TextFile Names: »ftamattr.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z« └─⟦de7628f85⟧ └─⟦this⟧ »isode-6.0/ftam/ftamattr.c«
/* ftamattr.c - FPM: encode/decode attributes */ #ifndef lint static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamattr.c,v 7.0 89/11/23 21:53:23 mrose Rel $"; #endif /* * $Header: /f/osi/ftam/RCS/ftamattr.c,v 7.0 89/11/23 21:53:23 mrose Rel $ * * * $Log: ftamattr.c,v $ * Revision 7.0 89/11/23 21:53:23 mrose * Release 6.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 "fpkt.h" /* \f */ struct type_FTAM_Read__Attributes *attr2fpm (fsb, fa, fti) register struct ftamblk *fsb; register struct FTAMattributes *fa; struct FTAMindication *fti; { register int i; register char *cp, **ap; register struct type_FTAM_Read__Attributes *fpm; if ((fpm = (struct type_FTAM_Read__Attributes *) calloc (1, sizeof *fpm)) == NULL) { no_mem: ; (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory"); out: ; if (fpm) free_FTAM_Read__Attributes (fpm); return NULL; } if (fa -> fa_present & FA_FILENAME) { register struct type_FTAM_Filename__Attribute *fn, **fc; if (fa -> fa_novalue & FA_FILENAME) { (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "filename not present"); goto out; } if (fa -> fa_nfile > NFFILE) { (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "too many filenames"); goto out; } fc = &fpm -> filename; for (ap = fa -> fa_files, i = fa -> fa_nfile - 1; i >= 0; ap++, i--) { if (*ap == NULL) { (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "empty filename at slot %d", fa -> fa_nfile - i - 1); goto out; } if ((fn = (struct type_FTAM_Filename__Attribute *) calloc (1, sizeof *fpm -> filename)) == NULL) goto no_mem; *fc = fn; if ((fn -> GraphicString = str2qb (*ap, strlen (*ap), 1)) == NULL) goto no_mem; fc = &((*fc) -> next); } } if (fa -> fa_present & FA_ACTIONS) { if (fa -> fa_novalue & FA_ACTIONS) { (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "permitted-actions not present"); goto out; } if ((fpm -> permitted__actions = bits2fpm (fsb, fpermitted_pairs, fa -> fa_permitted, fti)) == NULL) goto out; } if (fa -> fa_present & FA_CONTENTS) { if (fa -> fa_novalue & FA_CONTENTS) { (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "contents-type not present"); goto out; } if (fa -> fa_contents == NULLOID) { (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "missing contents-type"); goto out; } if ((fpm -> contents__type = (struct type_FTAM_Contents__Type__Attribute *) calloc (1, sizeof *fpm -> contents__type)) == NULL || (fpm -> contents__type -> document__type__name = oid_cpy (fa -> fa_contents)) == NULL) goto no_mem; if (fpm -> contents__type -> parameter = fa -> fa_parameter) fpm -> contents__type -> parameter -> pe_refcnt++; } if (fa -> fa_present & FA_ACCOUNT) { if (fa -> fa_account == NULL) { (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "missing account"); goto out; } if ((fpm -> storage__account = (struct type_FTAM_Account__Attribute *) calloc (1, sizeof *fpm -> storage__account)) == NULL) goto no_mem; if (fa -> fa_novalue & FA_ACCOUNT) fpm -> storage__account -> offset = type_FTAM_Account__Attribute_no__value__available; else { fpm -> storage__account -> offset = type_FTAM_Account__Attribute_actual__values; if ((fpm -> storage__account -> un.actual__values = str2qb (fa -> fa_account, strlen (fa -> fa_account), 1)) == NULL) goto no_mem; } } #define dodate(flag,field,tag) \ if (fa -> fa_present & flag) { \ if ((fpm -> tag = (struct type_FTAM_Date__and__Time__Attribute *) \ calloc (1, sizeof *fpm -> tag)) == NULL) \ goto no_mem; \ if (fa -> fa_novalue & flag) \ fpm -> tag -> offset = \ type_FTAM_Date__and__Time__Attribute_no__value__available;\ else { \ fpm -> tag -> offset = \ type_FTAM_Date__and__Time__Attribute_actual__values; \ if ((cp = gent2str (field)) == NULL \ || (fpm -> tag -> un.actual__values = \ str2qb (cp, strlen (cp), 1)) == NULL) \ goto no_mem; \ } \ } dodate (FA_DATE_CREATE, &fa -> fa_date_create, date__and__time__of__creation); dodate (FA_DATE_MODIFY, &fa -> fa_date_modify, date__and__time__of__last__modification); dodate (FA_DATE_READ, &fa -> fa_date_read, date__and__time__of__last__read__access); dodate (FA_DATE_ATTR, &fa -> fa_date_attribute, date__and__time__of__last__attribute__modification); #undef dodate #define douser(flag,field,tag,name) \ if (fa -> fa_present & flag) { \ if ((fpm -> tag = (struct type_FTAM_User__Identity__Attribute *) \ calloc (1, sizeof *fpm -> tag)) == NULL) \ goto no_mem; \ if (fa -> fa_novalue & flag) \ fpm -> tag -> offset = \ type_FTAM_User__Identity__Attribute_no__value__available; \ else { \ if (field == NULL) { \ (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "missing %s", \ name); \ goto out; \ } \ fpm -> tag -> offset = \ type_FTAM_User__Identity__Attribute_actual__values; \ if ((fpm -> tag -> un.actual__values = str2qb (field, \ strlen (field), 1)) \ == NULL) \ goto no_mem; \ } \ } douser (FA_ID_CREATE, fa -> fa_id_create, identity__of__creator, "identity-of-creator"); douser (FA_ID_MODIFY, fa -> fa_id_modify, identity__of__last__modifier, "identity-of-last-modifier"); douser (FA_ID_READ, fa -> fa_id_read, identity__of__last__reader, "identity-of-last-reader"); douser (FA_ID_ATTR, fa -> fa_id_attribute, identity__of__last__attribute__modifier, "identity-of-last-attribute-modifier"); #undef douser if (fa -> fa_present & FA_AVAILABILITY) { if ((fpm -> file__availability = (struct type_FTAM_File__Availability__Attribute *) calloc (1, sizeof *fpm -> file__availability)) == NULL) goto no_mem; if (fa -> fa_novalue & FA_AVAILABILITY) fpm -> file__availability -> offset = type_FTAM_File__Availability__Attribute_no__value__available; else { fpm -> file__availability -> offset = type_FTAM_File__Availability__Attribute_actual__values; switch (fa -> fa_availability) { case FA_AVAIL_IMMED: case FA_AVAIL_DEFER: fpm -> file__availability -> un.actual__values = fa -> fa_availability; break; default: (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "bad value for file-availability"); goto out; } } } #define dosize(flag,field,tag) \ if (fa -> fa_present & flag) { \ if ((fpm -> tag = (struct type_FTAM_Filesize__Attribute *) \ calloc (1, sizeof *fpm -> tag)) == NULL) \ goto no_mem; \ if (fa -> fa_novalue & flag) \ fpm -> tag -> offset = \ type_FTAM_Filesize__Attribute_no__value__available; \ else { \ fpm -> tag -> offset = \ type_FTAM_Filesize__Attribute_actual__values; \ fpm -> tag -> un.actual__values = field; \ } \ } dosize (FA_FILESIZE, fa -> fa_filesize, filesize); dosize (FA_FUTURESIZE, fa -> fa_futuresize, future__filesize); #undef dosize if (fa -> fa_present & FA_CONTROL) { if ((fpm -> access__control = (struct type_FTAM_Access__Control__Attribute *) calloc (1, sizeof *fpm -> access__control)) == NULL) goto no_mem; if (fa -> fa_novalue & FA_CONTROL) fpm -> access__control -> offset = type_FTAM_Access__Control__Attribute_no__value__available; else { fpm -> access__control -> offset = type_FTAM_Access__Control__Attribute_actual__values; if ((fpm -> access__control -> un.actual__values = acl2fpm (fsb, fa -> fa_control, fti)) == NULL) goto out; } } if (fa -> fa_present & FA_LEGAL) { if ((fpm -> legal__qualification = (struct type_FTAM_Legal__Qualification__Attribute *) calloc (1, sizeof *fpm -> legal__qualification)) == NULL) goto no_mem; if (fa -> fa_novalue & FA_LEGAL) fpm -> legal__qualification -> offset = type_FTAM_Legal__Qualification__Attribute_no__value__available; else { if (fa -> fa_legal == NULL) { (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "missing legal-qualification"); goto out; } fpm -> legal__qualification -> offset = type_FTAM_Legal__Qualification__Attribute_actual__values; if ((fpm -> legal__qualification -> un.actual__values = str2qb (fa -> fa_legal, strlen (fa -> fa_legal), 1)) == NULL) goto no_mem; } } return fpm; } /* \f */ int fpm2attr (fsb, fpm, fa, fti) register struct ftamblk *fsb; register struct type_FTAM_Read__Attributes *fpm; register struct FTAMattributes *fa; struct FTAMindication *fti; { register char *cp; register UTC u; bzero ((char *) fa, sizeof *fa); if (fpm -> filename) { register int n; register char **ap; register struct type_FTAM_Filename__Attribute *fn; fa -> fa_present |= FA_FILENAME; ap = fa -> fa_files, n = NFFILE; for (fn = fpm -> filename; fn; fn = fn -> next) { if (n-- <= 0) { (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "too many names in filename"); out: ; FAFREE (fa); return NOTOK; } if ((*ap++ = qb2str (fn -> GraphicString)) == NULL) { no_mem: ; (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory"); goto out; } fa -> fa_nfile++; } } if (fpm -> permitted__actions) { fa -> fa_present |= FA_ACTIONS; if (fpm2bits (fsb, fpermitted_pairs, fpm -> permitted__actions, &fa -> fa_permitted, fti) == NOTOK) goto out; } if (fpm -> contents__type) { fa -> fa_present |= FA_CONTENTS; fa -> fa_contents = fpm -> contents__type -> document__type__name; fpm -> contents__type -> document__type__name = NULLOID; if (fpm -> contents__type -> parameter && (fa -> fa_parameter = pe_cpy (fpm -> contents__type -> parameter)) == NULLPE) goto no_mem; } if (fpm -> storage__account) { fa -> fa_present |= FA_ACCOUNT; if (fpm -> storage__account -> offset == type_FTAM_Account__Attribute_no__value__available) fa -> fa_novalue |= FA_ACCOUNT; else if ((fa -> fa_account = qb2str (fpm -> storage__account -> un.actual__values)) == NULL) goto no_mem; } #define dodate(flag,field,tag) \ if (fpm -> tag) { \ fa -> fa_present |= flag; \ \ if (fpm -> tag -> offset \ == type_FTAM_Date__and__Time__Attribute_no__value__available) \ fa -> fa_novalue |= flag; \ else { \ if ((cp = qb2str (fpm -> tag -> un.actual__values)) == NULL) \ goto no_mem; \ u = str2gent (cp, strlen (cp)); \ free (cp); \ if (u == NULLUTC) \ goto no_mem; \ field = *u; \ } \ } dodate (FA_DATE_CREATE, fa -> fa_date_create, date__and__time__of__creation); dodate (FA_DATE_MODIFY, fa -> fa_date_modify, date__and__time__of__last__modification); dodate (FA_DATE_READ, fa -> fa_date_read, date__and__time__of__last__read__access); dodate (FA_DATE_ATTR, fa -> fa_date_attribute, date__and__time__of__last__attribute__modification); #undef dodate #define douser(flag,field,tag,name) \ if (fpm -> tag) { \ fa -> fa_present |= flag; \ \ if (fpm -> tag -> offset \ == type_FTAM_User__Identity__Attribute_no__value__available) \ fa -> fa_novalue |= flag; \ else \ if ((field = qb2str (fpm -> tag -> un.actual__values)) == NULL) \ goto no_mem; \ } douser (FA_ID_CREATE, fa -> fa_id_create, identity__of__creator, "identity-of-creator"); douser (FA_ID_MODIFY, fa -> fa_id_modify, identity__of__last__modifier, "identity-of-last-modifier"); douser (FA_ID_READ, fa -> fa_id_read, identity__of__last__reader, "identity-of-last-reader"); douser (FA_ID_ATTR, fa -> fa_id_attribute, identity__of__last__attribute__modifier, "identity-of-last-attribute-modifier"); #undef douser if (fpm -> file__availability) { fa -> fa_present |= FA_AVAILABILITY; if (fpm -> file__availability -> offset == type_FTAM_File__Availability__Attribute_no__value__available) fa -> fa_novalue |= FA_AVAILABILITY; else fa -> fa_availability = fpm -> file__availability -> un.actual__values; } #define dosize(flag,field,tag) \ if (fpm -> tag) { \ fa -> fa_present |= flag; \ \ if (fpm -> tag -> offset \ == type_FTAM_Filesize__Attribute_no__value__available) \ fa -> fa_novalue |= flag; \ else \ field = fpm -> tag -> un.actual__values; \ } dosize (FA_FILESIZE, fa -> fa_filesize, filesize); dosize (FA_FUTURESIZE, fa -> fa_futuresize, future__filesize); #undef dosize if (fpm -> access__control) { fa -> fa_present |= FA_CONTROL; if (fpm -> access__control -> offset == type_FTAM_Access__Control__Attribute_no__value__available) fa -> fa_novalue |= FA_CONTROL; else if (fpm2acl (fsb, fpm -> access__control -> un.actual__values, &fa -> fa_control, fti) == NOTOK) goto out; } if (fpm -> legal__qualification) { fa -> fa_present |= FA_LEGAL; if (fpm -> legal__qualification -> offset == type_FTAM_Legal__Qualification__Attribute_no__value__available) fa -> fa_novalue |= FA_LEGAL; else if ((fa -> fa_legal = qb2str (fpm -> legal__qualification -> un.actual__values)) == NULL) goto no_mem; } return OK; } /* \f */ void FAFREE (fa) register struct FTAMattributes *fa; { register int FAI; for (FAI = (fa) -> fa_nfile - 1; FAI >= 0; FAI--) if ((fa) -> fa_files[FAI]) free ((fa) -> fa_files[FAI]), (fa) -> fa_files[FAI] = NULL; (fa) -> fa_nfile = 0; if ((fa) -> fa_contents) oid_free ((fa) -> fa_contents), (fa) -> fa_contents = NULLOID; if ((fa) -> fa_parameter) pe_free ((fa) -> fa_parameter), (fa) -> fa_parameter = NULLPE; if ((fa) -> fa_account) free ((fa) -> fa_account), (fa) -> fa_account = NULL; if ((fa) -> fa_id_create) free ((fa) -> fa_id_create), (fa) -> fa_id_create = NULL; if ((fa) -> fa_id_modify) free ((fa) -> fa_id_modify), (fa) -> fa_id_modify = NULL; if ((fa) -> fa_id_read) free ((fa) -> fa_id_read), (fa) -> fa_id_read = NULL; if ((fa) -> fa_id_attribute) free ((fa) -> fa_id_attribute), (fa) -> fa_id_attribute = NULL; if (fa -> fa_control) { FEFREE (fa -> fa_control); fa -> fa_control = NULL; } if ((fa) -> fa_legal) free ((fa) -> fa_legal), (fa) -> fa_legal = NULL; }