Annotation of 43BSDReno/contrib/isode-beta/ftam/ftamattr.c, revision 1.1.1.1

1.1       root        1: /* ftamattr.c - FPM: encode/decode attributes */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamattr.c,v 7.1 90/03/23 10:53:58 mrose Exp $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/ftam/RCS/ftamattr.c,v 7.1 90/03/23 10:53:58 mrose Exp $
                      9:  *
                     10:  *
                     11:  * $Log:       ftamattr.c,v $
                     12:  * Revision 7.1  90/03/23  10:53:58  mrose
                     13:  * update
                     14:  * 
                     15:  * Revision 7.0  89/11/23  21:53:23  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_Read__Attributes *attr2fpm (fsb, fa, fti)
                     39: register struct ftamblk *fsb;
                     40: register struct FTAMattributes *fa;
                     41: struct FTAMindication *fti;
                     42: {
                     43:     register int    i;
                     44:     register char  *cp,
                     45:                  **ap;
                     46:     register struct type_FTAM_Read__Attributes *fpm;
                     47: 
                     48:     if ((fpm = (struct type_FTAM_Read__Attributes *) calloc (1, sizeof *fpm))
                     49:            == NULL) {
                     50: no_mem: ;
                     51:        (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
                     52: out: ;
                     53:        if (fpm)
                     54:            free_FTAM_Read__Attributes (fpm);
                     55:        return NULL;
                     56:     }
                     57: 
                     58:     if (fa -> fa_present & FA_FILENAME) {
                     59:        register struct type_FTAM_Filename__Attribute *fn,
                     60:                                                     **fc;
                     61: 
                     62:        if (fa -> fa_novalue & FA_FILENAME) {
                     63:            (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
                     64:                             "filename not present");
                     65:            goto out;
                     66:        }
                     67: 
                     68:        if (fa -> fa_nfile > NFFILE) {
                     69:            (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
                     70:                             "too many filenames");
                     71:            goto out;
                     72:        }
                     73: 
                     74:        fc = &fpm -> filename;
                     75:        for (ap = fa -> fa_files, i = fa -> fa_nfile - 1; i >= 0; ap++, i--) {
                     76:            if (*ap == NULL) {
                     77:                (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
                     78:                                 "empty filename at slot %d",
                     79:                                 fa -> fa_nfile - i - 1);
                     80:                goto out;
                     81:            }
                     82: 
                     83:            if ((fn = (struct type_FTAM_Filename__Attribute *)
                     84:                                calloc (1, sizeof *fpm -> filename))
                     85:                    == NULL)
                     86:                goto no_mem;
                     87:            *fc = fn;
                     88: 
                     89:            if ((fn -> GraphicString = str2qb (*ap, strlen (*ap), 1)) == NULL)
                     90:                goto no_mem;
                     91: 
                     92:            fc = &((*fc) -> next);
                     93:        }
                     94:     }
                     95: 
                     96:     if (fa -> fa_present & FA_ACTIONS) {
                     97:        if (fa -> fa_novalue & FA_ACTIONS) {
                     98:            (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
                     99:                             "permitted-actions not present");
                    100:            goto out;
                    101:        }
                    102: 
                    103:        if ((fpm -> permitted__actions = bits2fpm (fsb, fpermitted_pairs,
                    104:                                                   fa -> fa_permitted, fti))
                    105:                == NULL)
                    106:            goto out;
                    107:     }
                    108: 
                    109:     if (fa -> fa_present & FA_CONTENTS) {
                    110:        if (fa -> fa_novalue & FA_CONTENTS) {
                    111:            (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
                    112:                             "contents-type not present");
                    113:            goto out;
                    114:        }
                    115:        if (fa -> fa_contents == NULLOID) {
                    116:            (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
                    117:                             "missing contents-type");
                    118:            goto out;
                    119:        }
                    120:        if ((fpm -> contents__type =
                    121:                    (struct type_FTAM_Contents__Type__Attribute *)
                    122:                            calloc (1, sizeof *fpm -> contents__type)) == NULL
                    123:                || (fpm -> contents__type -> document__type__name =
                    124:                            oid_cpy (fa -> fa_contents)) == NULL)
                    125:            goto no_mem;
                    126:        if (fpm -> contents__type -> parameter = fa -> fa_parameter)
                    127:            fpm -> contents__type -> parameter -> pe_refcnt++;
                    128:     }
                    129: 
                    130:     if (fa -> fa_present & FA_ACCOUNT) {
                    131:        if (fa -> fa_account == NULL) {
                    132:            (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
                    133:                             "missing account");
                    134:            goto out;
                    135:        }
                    136:        if ((fpm -> storage__account =
                    137:                    (struct type_FTAM_Account__Attribute *)
                    138:                            calloc (1, sizeof *fpm -> storage__account))
                    139:                == NULL)
                    140:            goto no_mem;
                    141:        if (fa -> fa_novalue & FA_ACCOUNT)
                    142:            fpm -> storage__account -> offset =
                    143:                    type_FTAM_Account__Attribute_no__value__available;
                    144:        else {
                    145:            fpm -> storage__account -> offset =
                    146:                    type_FTAM_Account__Attribute_actual__values;
                    147:            if ((fpm -> storage__account -> un.actual__values =
                    148:                       str2qb (fa -> fa_account, strlen (fa -> fa_account), 1))
                    149:                    == NULL)
                    150:                goto no_mem;
                    151:        }
                    152:     }
                    153: 
                    154: #define        dodate(flag,field,tag) \
                    155:     if (fa -> fa_present & flag) { \
                    156:        if ((fpm -> tag = (struct type_FTAM_Date__and__Time__Attribute *) \
                    157:                                calloc (1, sizeof *fpm -> tag)) == NULL) \
                    158:            goto no_mem; \
                    159:        if (fa -> fa_novalue & flag) \
                    160:            fpm -> tag -> offset = \
                    161:                    type_FTAM_Date__and__Time__Attribute_no__value__available;\
                    162:        else { \
                    163:            fpm -> tag -> offset = \
                    164:                    type_FTAM_Date__and__Time__Attribute_actual__values; \
                    165:            if ((cp = gent2str (field)) == NULL \
                    166:                    || (fpm -> tag -> un.actual__values = \
                    167:                                str2qb (cp, strlen (cp), 1)) == NULL) \
                    168:                goto no_mem; \
                    169:        } \
                    170:     }
                    171:     dodate (FA_DATE_CREATE, &fa -> fa_date_create,
                    172:            date__and__time__of__creation);
                    173:     dodate (FA_DATE_MODIFY, &fa -> fa_date_modify,
                    174:            date__and__time__of__last__modification);
                    175:     dodate (FA_DATE_READ, &fa -> fa_date_read,
                    176:            date__and__time__of__last__read__access);
                    177:     dodate (FA_DATE_ATTR, &fa -> fa_date_attribute,
                    178:            date__and__time__of__last__attribute__modification);
                    179: #undef dodate
                    180: 
                    181: #define        douser(flag,field,tag,name) \
                    182:     if (fa -> fa_present & flag) { \
                    183:        if ((fpm -> tag = (struct type_FTAM_User__Identity__Attribute *) \
                    184:                                calloc (1, sizeof *fpm -> tag)) == NULL) \
                    185:            goto no_mem; \
                    186:        if (fa -> fa_novalue & flag) \
                    187:            fpm -> tag -> offset = \
                    188:                    type_FTAM_User__Identity__Attribute_no__value__available; \
                    189:        else { \
                    190:            if (field == NULL) { \
                    191:                (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "missing %s", \
                    192:                                 name); \
                    193:                goto out; \
                    194:            } \
                    195:            fpm -> tag -> offset = \
                    196:                    type_FTAM_User__Identity__Attribute_actual__values; \
                    197:            if ((fpm -> tag -> un.actual__values = str2qb (field, \
                    198:                                                          strlen (field), 1)) \
                    199:                    == NULL) \
                    200:                goto no_mem; \
                    201:        } \
                    202:     }
                    203:     douser (FA_ID_CREATE, fa -> fa_id_create,
                    204:            identity__of__creator, "identity-of-creator");
                    205:     douser (FA_ID_MODIFY, fa -> fa_id_modify,
                    206:            identity__of__last__modifier, "identity-of-last-modifier");
                    207:     douser (FA_ID_READ, fa -> fa_id_read,
                    208:            identity__of__last__reader, "identity-of-last-reader");
                    209:     douser (FA_ID_ATTR, fa -> fa_id_attribute,
                    210:            identity__of__last__attribute__modifier,
                    211:            "identity-of-last-attribute-modifier");
                    212: #undef douser
                    213: 
                    214:     if (fa -> fa_present & FA_AVAILABILITY) {
                    215:        if ((fpm -> file__availability =
                    216:                    (struct type_FTAM_File__Availability__Attribute *)
                    217:                            calloc (1, sizeof *fpm -> file__availability))
                    218:                == NULL)
                    219:            goto no_mem;
                    220:        if (fa -> fa_novalue & FA_AVAILABILITY)
                    221:            fpm -> file__availability -> offset =
                    222:                type_FTAM_File__Availability__Attribute_no__value__available;
                    223:        else {
                    224:            fpm -> file__availability -> offset =
                    225:                type_FTAM_File__Availability__Attribute_actual__values;
                    226:            switch (fa -> fa_availability) {
                    227:                case FA_AVAIL_IMMED:
                    228:                case FA_AVAIL_DEFER:
                    229:                    fpm -> file__availability -> un.actual__values =
                    230:                                fa -> fa_availability;
                    231:                    break;
                    232: 
                    233:                default:
                    234:                    (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
                    235:                                     "bad value for file-availability");
                    236:                    goto out;
                    237:            }
                    238:        }
                    239:     }
                    240: 
                    241: #define        dosize(flag,field,tag) \
                    242:     if (fa -> fa_present & flag) { \
                    243:        if ((fpm -> tag = (struct type_FTAM_Filesize__Attribute *) \
                    244:                            calloc (1, sizeof *fpm -> tag)) == NULL) \
                    245:            goto no_mem; \
                    246:        if (fa -> fa_novalue & flag) \
                    247:            fpm -> tag -> offset = \
                    248:                type_FTAM_Filesize__Attribute_no__value__available; \
                    249:        else { \
                    250:            fpm -> tag -> offset = \
                    251:                type_FTAM_Filesize__Attribute_actual__values; \
                    252:            fpm -> tag -> un.actual__values = field; \
                    253:        } \
                    254:     }
                    255:     dosize (FA_FILESIZE, fa -> fa_filesize, filesize);
                    256:     dosize (FA_FUTURESIZE, fa -> fa_futuresize, future__filesize);
                    257: #undef dosize
                    258: 
                    259:     if (fa -> fa_present & FA_CONTROL) {
                    260:        if ((fpm -> access__control =
                    261:                    (struct type_FTAM_Access__Control__Attribute *)
                    262:                            calloc (1, sizeof *fpm -> access__control))
                    263:                == NULL)
                    264:            goto no_mem;
                    265:        if (fa -> fa_novalue & FA_CONTROL)
                    266:            fpm -> access__control -> offset =
                    267:                type_FTAM_Access__Control__Attribute_no__value__available;
                    268:        else {
                    269:            fpm -> access__control -> offset =
                    270:                type_FTAM_Access__Control__Attribute_actual__values;
                    271:            if ((fpm -> access__control -> un.actual__values =
                    272:                            acl2fpm (fsb, fa -> fa_control, fti)) == NULL)
                    273:                goto out;
                    274:        }
                    275:     }
                    276: 
                    277:     if (fa -> fa_present & FA_LEGAL) {
                    278:        if ((fpm -> legal__qualification =
                    279:                        (struct type_FTAM_Legal__Qualification__Attribute *)
                    280:                               calloc (1, sizeof *fpm -> legal__qualification))
                    281:                == NULL)
                    282:            goto no_mem;
                    283:        if (fa -> fa_novalue & FA_LEGAL)
                    284:            fpm -> legal__qualification -> offset =
                    285:                type_FTAM_Legal__Qualification__Attribute_no__value__available;
                    286:        else {
                    287:            if (fa -> fa_legal == NULL) {
                    288:                (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
                    289:                                 "missing legal-qualification");
                    290:                goto out;
                    291:            }
                    292:            fpm -> legal__qualification -> offset =
                    293:                type_FTAM_Legal__Qualification__Attribute_actual__values;
                    294:            if ((fpm -> legal__qualification -> un.actual__values =
                    295:                        str2qb (fa -> fa_legal, strlen (fa -> fa_legal), 1))
                    296:                    == NULL)
                    297:                goto no_mem;
                    298:        }
                    299:     }
                    300:        
                    301:     /*
                    302:      * Added private use attribute functionality for Retix NBS9 interworking.
                    303:      * No value should always be set because we don't support private use.
                    304:      * pmk.
                    305:      */
                    306:     if (fa -> fa_present & FA_PRIVATE) {
                    307:        (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
                    308:                         "private-use attribute not supported");
                    309:        goto out;
                    310:     }
                    311: 
                    312:     return fpm;
                    313: }
                    314: 
                    315: /*  */
                    316: 
                    317: int    fpm2attr (fsb, fpm, fa, fti)
                    318: register struct ftamblk *fsb;
                    319: register struct type_FTAM_Read__Attributes *fpm;
                    320: register struct FTAMattributes *fa;
                    321: struct FTAMindication *fti;
                    322: {
                    323:     register char   *cp;
                    324:     register UTC     u;
                    325: 
                    326:     bzero ((char *) fa, sizeof *fa);
                    327: 
                    328:     if (fpm -> filename) {
                    329:        register int    n;
                    330:        register char **ap;
                    331:        register struct type_FTAM_Filename__Attribute *fn;
                    332: 
                    333:        fa -> fa_present |= FA_FILENAME;
                    334: 
                    335:        ap = fa -> fa_files, n = NFFILE;
                    336:        for (fn = fpm -> filename; fn; fn = fn -> next) {
                    337:            if (n-- <= 0) {
                    338:                (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
                    339:                                 "too many names in filename");
                    340: out: ;
                    341:                FAFREE (fa);
                    342:                return NOTOK;
                    343:            }
                    344:            if ((*ap++ = qb2str (fn -> GraphicString)) == NULL) {
                    345: no_mem: ;
                    346:                (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
                    347:                                 "out of memory");
                    348:                goto out;
                    349:            }
                    350:            fa -> fa_nfile++;
                    351:        }
                    352:     }
                    353: 
                    354:     if (fpm -> permitted__actions) {
                    355:        fa -> fa_present |= FA_ACTIONS;
                    356: 
                    357:        if (fpm2bits (fsb, fpermitted_pairs, fpm -> permitted__actions,
                    358:                      &fa -> fa_permitted, fti) == NOTOK)
                    359:            goto out;
                    360:     }
                    361: 
                    362:     if (fpm -> contents__type) {
                    363:        fa -> fa_present |= FA_CONTENTS;
                    364: 
                    365:        fa -> fa_contents = fpm -> contents__type -> document__type__name;
                    366:        fpm -> contents__type -> document__type__name = NULLOID;
                    367:        if (fpm -> contents__type -> parameter
                    368:                && (fa -> fa_parameter =
                    369:                            pe_cpy (fpm -> contents__type -> parameter))
                    370:                        == NULLPE)
                    371:            goto no_mem;
                    372:     }
                    373: 
                    374:     if (fpm -> storage__account) {
                    375:        fa -> fa_present |= FA_ACCOUNT;
                    376: 
                    377:        if (fpm -> storage__account -> offset
                    378:                == type_FTAM_Account__Attribute_no__value__available)
                    379:            fa -> fa_novalue |= FA_ACCOUNT;
                    380:        else
                    381:            if ((fa -> fa_account =
                    382:                        qb2str (fpm -> storage__account -> un.actual__values))
                    383:                    == NULL)
                    384:                goto no_mem;
                    385:     }
                    386: 
                    387: #define        dodate(flag,field,tag) \
                    388:     if (fpm -> tag) { \
                    389:        fa -> fa_present |= flag; \
                    390:  \
                    391:        if (fpm -> tag -> offset \
                    392:                == type_FTAM_Date__and__Time__Attribute_no__value__available) \
                    393:            fa -> fa_novalue |= flag; \
                    394:        else { \
                    395:            if ((cp = qb2str (fpm -> tag -> un.actual__values)) == NULL) \
                    396:                goto no_mem; \
                    397:            u = str2gent (cp, strlen (cp)); \
                    398:            free (cp); \
                    399:            if (u == NULLUTC) \
                    400:                goto no_mem; \
                    401:            field = *u; \
                    402:        } \
                    403:     }
                    404:     dodate (FA_DATE_CREATE, fa -> fa_date_create,
                    405:            date__and__time__of__creation);
                    406:     dodate (FA_DATE_MODIFY, fa -> fa_date_modify,
                    407:            date__and__time__of__last__modification);
                    408:     dodate (FA_DATE_READ, fa -> fa_date_read,
                    409:            date__and__time__of__last__read__access);
                    410:     dodate (FA_DATE_ATTR, fa -> fa_date_attribute,
                    411:            date__and__time__of__last__attribute__modification);
                    412: #undef dodate
                    413: 
                    414: #define        douser(flag,field,tag,name) \
                    415:     if (fpm -> tag) { \
                    416:        fa -> fa_present |= flag; \
                    417:  \
                    418:        if (fpm -> tag -> offset \
                    419:                == type_FTAM_User__Identity__Attribute_no__value__available) \
                    420:            fa -> fa_novalue |= flag; \
                    421:        else \
                    422:            if ((field = qb2str (fpm -> tag -> un.actual__values)) == NULL) \
                    423:                goto no_mem; \
                    424:     }
                    425:     douser (FA_ID_CREATE, fa -> fa_id_create,
                    426:            identity__of__creator, "identity-of-creator");
                    427:     douser (FA_ID_MODIFY, fa -> fa_id_modify,
                    428:            identity__of__last__modifier, "identity-of-last-modifier");
                    429:     douser (FA_ID_READ, fa -> fa_id_read,
                    430:            identity__of__last__reader, "identity-of-last-reader");
                    431:     douser (FA_ID_ATTR, fa -> fa_id_attribute,
                    432:            identity__of__last__attribute__modifier,
                    433:            "identity-of-last-attribute-modifier");
                    434: #undef douser
                    435: 
                    436:     if (fpm -> file__availability) {
                    437:        fa -> fa_present |= FA_AVAILABILITY;
                    438: 
                    439:        if (fpm -> file__availability -> offset ==
                    440:                type_FTAM_File__Availability__Attribute_no__value__available)
                    441:            fa -> fa_novalue |= FA_AVAILABILITY;
                    442:        else
                    443:            fa -> fa_availability =
                    444:                        fpm -> file__availability -> un.actual__values;
                    445:     }
                    446: 
                    447: #define        dosize(flag,field,tag) \
                    448:     if (fpm -> tag) { \
                    449:        fa -> fa_present |= flag; \
                    450:  \
                    451:        if (fpm -> tag -> offset \
                    452:                == type_FTAM_Filesize__Attribute_no__value__available) \
                    453:            fa -> fa_novalue |= flag; \
                    454:        else \
                    455:            field = fpm -> tag -> un.actual__values; \
                    456:     }
                    457:     dosize (FA_FILESIZE, fa -> fa_filesize, filesize);
                    458:     dosize (FA_FUTURESIZE, fa -> fa_futuresize, future__filesize);
                    459: #undef dosize
                    460: 
                    461:     if (fpm -> access__control) {
                    462:        fa -> fa_present |= FA_CONTROL;
                    463: 
                    464:        if (fpm -> access__control -> offset
                    465:                == type_FTAM_Access__Control__Attribute_no__value__available)
                    466:            fa -> fa_novalue |= FA_CONTROL;
                    467:        else
                    468:            if (fpm2acl (fsb, fpm -> access__control -> un.actual__values,
                    469:                         &fa -> fa_control, fti) == NOTOK)
                    470:            goto out;
                    471:     }
                    472: 
                    473:     if (fpm -> legal__qualification) {
                    474:        fa -> fa_present |= FA_LEGAL;
                    475: 
                    476:        if (fpm -> legal__qualification -> offset ==
                    477:                type_FTAM_Legal__Qualification__Attribute_no__value__available)
                    478:            fa -> fa_novalue |= FA_LEGAL;
                    479:        else
                    480:            if ((fa -> fa_legal =
                    481:                     qb2str (fpm -> legal__qualification -> un.actual__values))
                    482:                    == NULL)
                    483:                goto no_mem;
                    484:     }
                    485: 
                    486:     /* Added private use functionality pmk */
                    487:     if (fpm -> private__use) {
                    488:        fa -> fa_present |= FA_PRIVATE;
                    489:        /* Set no value, regardless of what is there we don't support it */
                    490:        fa -> fa_novalue |= FA_PRIVATE;
                    491:     }
                    492: 
                    493:     return OK;
                    494: }
                    495: 
                    496: /*  */
                    497: 
                    498: void   FAFREE (fa)
                    499: register struct FTAMattributes *fa;
                    500: {
                    501:     register int FAI;
                    502: 
                    503:     for (FAI = (fa) -> fa_nfile - 1; FAI >= 0; FAI--)
                    504:        if ((fa) -> fa_files[FAI])
                    505:            free ((fa) -> fa_files[FAI]), (fa) -> fa_files[FAI] = NULL;
                    506:     (fa) -> fa_nfile = 0;
                    507:     if ((fa) -> fa_contents)
                    508:        oid_free ((fa) -> fa_contents), (fa) -> fa_contents = NULLOID;
                    509:     if ((fa) -> fa_parameter)
                    510:        pe_free ((fa) -> fa_parameter), (fa) -> fa_parameter = NULLPE;
                    511:     if ((fa) -> fa_account)
                    512:        free ((fa) -> fa_account), (fa) -> fa_account = NULL;
                    513:     if ((fa) -> fa_id_create)
                    514:        free  ((fa) -> fa_id_create), (fa) -> fa_id_create = NULL;
                    515:     if ((fa) -> fa_id_modify)
                    516:        free  ((fa) -> fa_id_modify), (fa) -> fa_id_modify = NULL;
                    517:     if ((fa) -> fa_id_read)
                    518:        free  ((fa) -> fa_id_read), (fa) -> fa_id_read = NULL;
                    519:     if ((fa) -> fa_id_attribute)
                    520:        free  ((fa) -> fa_id_attribute), (fa) -> fa_id_attribute = NULL;
                    521:     if (fa -> fa_control) {
                    522:        FEFREE (fa -> fa_control);
                    523:        fa -> fa_control = NULL;
                    524:     }
                    525:     if ((fa) -> fa_legal)
                    526:        free ((fa) -> fa_legal), (fa) -> fa_legal = NULL;
                    527:     if ((fa) -> fa_private)
                    528:       free ((fa) -> fa_private), (fa) -> fa_private = NULL;
                    529: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.