Annotation of 43BSDReno/contrib/isode-beta/quipu/dish/add.c, revision 1.1.1.1

1.1       root        1: /* add.c - */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/quipu/dish/RCS/add.c,v 7.2 90/07/09 14:46:56 mrose Exp $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/quipu/dish/RCS/add.c,v 7.2 90/07/09 14:46:56 mrose Exp $
                      9:  *
                     10:  *
                     11:  * $Log:       add.c,v $
                     12:  * Revision 7.2  90/07/09  14:46:56  mrose
                     13:  * sync
                     14:  * 
                     15:  * Revision 7.1  90/01/11  18:37:30  mrose
                     16:  * real-sync
                     17:  * 
                     18:  * Revision 7.0  89/11/23  22:19:55  mrose
                     19:  * Release 6.0
                     20:  * 
                     21:  */
                     22: 
                     23: /*
                     24:  *                               NOTICE
                     25:  *
                     26:  *    Acquisition, use, and distribution of this module and related
                     27:  *    materials are subject to the restrictions of a license agreement.
                     28:  *    Consult the Preface in the User's Manual for the full terms of
                     29:  *    this agreement.
                     30:  *
                     31:  */
                     32: 
                     33: 
                     34: #include "quipu/util.h"
                     35: #include "quipu/dua.h"
                     36: #include "quipu/add.h"
                     37: #include "quipu/entry.h"
                     38: 
                     39: #define ORG_PERSON "thornPerson & quipuObject"
                     40:        /* this should probably go elsewhere !!! */
                     41: 
                     42: extern DN       dn;
                     43: 
                     44: #define        OPT     (!frompipe || rps -> ps_byteno == 0 ? opt : rps)
                     45: #define        RPS     (!frompipe || opt -> ps_byteno == 0 ? rps : opt)
                     46: extern char    frompipe;
                     47: extern PS      opt, rps;
                     48: 
                     49: char            fname[128];
                     50: static char    new_draft;
                     51: 
                     52: call_add (argc, argv)
                     53: int             argc;
                     54: char          **argv;
                     55: {
                     56: 
                     57:        Entry           entry_ptr;
                     58:        FILE           *fd;
                     59:        struct ds_addentry_arg add_arg;
                     60:        struct DSError  error;
                     61:        Attr_Sequence   get_attributes();
                     62:        extern int      parse_status;
                     63: 
                     64:        int             x;
                     65:        int             draft_flag = 0;
                     66:        char           *O_class = NULLCP;
                     67:        char            noedit_flag = FALSE;
                     68:        DN              moddn;
                     69:        char           *home;
                     70: 
                     71:        if (home = getenv ("DISHDRAFT"))
                     72:            (void) strcpy (fname, home);
                     73:        else
                     74:            if (home = getenv ("HOME"))
                     75:                (void) sprintf (fname, "%s/.dishdraft", home);
                     76:            else
                     77:                (void) strcpy (fname, "./.dishdraft");
                     78:        new_draft = FALSE;
                     79: 
                     80:        if ((argc = service_control (OPT, argc, argv, &add_arg.ada_common)) == -1)
                     81:                return;
                     82: 
                     83:        for (x = 1; x < argc; x++) {
                     84:                if (test_arg (argv[x], "-template", 1)) {
                     85:                        int     i;
                     86:                        FILE *in, *out;
                     87:                        extern int errno;
                     88: 
                     89:                        draft_flag = 1;
                     90:                        if (++x == argc) {
                     91:                                ps_printf (OPT, "template file name missing\n");
                     92:                                Usage (argv[0]);
                     93:                                return;
                     94:                        }
                     95:                        if ((in = fopen (argv[x], "r")) == NULL) {
                     96:                            ps_printf (OPT, "unable to open template %s: %s\n",
                     97:                                       argv[x], sys_errname (errno));
                     98:                            return;
                     99:                        }
                    100:                        i = umask (0177);
                    101:                        out = fopen (fname, "w");
                    102:                        (void) umask (i);
                    103:                        if (out == NULL) {
                    104:                            ps_printf (OPT, "unable to write draft %s: %s\n",
                    105:                                       fname, sys_errname (errno));
                    106:                            (void) fclose (in);
                    107:                            return;
                    108:                        }
                    109:                        while ((i = getc (in)) != EOF)
                    110:                            if (putc (i, out) == EOF) {
                    111:                                ps_printf (OPT, "error writing draft %s: %s\n",
                    112:                                           fname, sys_errname (errno));
                    113:                                (void) fclose (in);
                    114:                                (void) fclose (out);
                    115:                                return;
                    116:                            }
                    117:                        (void) fclose (in);
                    118:                        (void) fclose (out);
                    119:                } else if (test_arg (argv[x], "-draft", 1)) {
                    120:                        draft_flag = 1;
                    121:                        if (++x == argc) {
                    122:                                ps_printf (OPT, "Draft file name missing\n");
                    123:                                Usage (argv[0]);
                    124:                                return;
                    125:                        }
                    126:                        (void) strcpy (fname, argv[x]);
                    127:                } else if (test_arg (argv[x], "-objectclass",1)) {
                    128:                        if (++x == argc) {
                    129:                                ps_printf (OPT, "Object Class missing\n");
                    130:                                Usage (argv[0]);
                    131:                                return;
                    132:                        }
                    133:                        O_class = argv[x];
                    134:                } else if (test_arg(argv[x], "-newdraft", 2)) 
                    135:                        new_draft = TRUE;
                    136:                else if (test_arg(argv[x], "-noedit", 3)) 
                    137:                        noedit_flag = TRUE;
                    138:                else if (move (argv[x]) == OK) 
                    139:                        continue;
                    140:                else {
                    141:                        ps_printf (OPT,"Unknown option %s\n",argv[x]);
                    142:                        Usage (argv[0]);
                    143:                        return;
                    144:                }
                    145:        }
                    146: 
                    147:        if ((!noedit_flag) && (draft_flag != 1)) { /* if no draft - create a template */
                    148:                if (add_template (fname, O_class) != OK)
                    149:                        return;
                    150:        }
                    151: 
                    152:        if ( ! noedit_flag)
                    153:                if (editentry (1, argv) != OK) {
                    154:                        make_old (fname,draft_flag);
                    155:                        return;
                    156:                }
                    157: 
                    158:        /* now parse the files */
                    159: 
                    160:        if ((fd = fopen (fname, "r")) == (FILE *) NULL) {
                    161:                ps_printf (OPT, "Can't open draft entry %s\n", fname);
                    162:                return;
                    163:        }
                    164: 
                    165:        entry_ptr = get_default_entry (NULLENTRY);
                    166:        entry_ptr->e_attributes = get_attributes (fd);
                    167: 
                    168:        (void) fclose (fd);
                    169:        if (parse_status != 0)
                    170:                return ;
                    171:                
                    172:        add_arg.ada_object = dn;
                    173: 
                    174:        for (moddn = dn ; moddn->dn_parent != NULLDN; moddn=moddn->dn_parent)
                    175:                ;
                    176:        entry_ptr->e_name = rdn_cpy (moddn->dn_rdn);
                    177: 
                    178:        add_arg.ada_entry = entry_ptr->e_attributes;
                    179: 
                    180:        if (rebind () != OK) {
                    181:                entry_free (entry_ptr);
                    182:                return;
                    183:        }
                    184: 
                    185:        /* Strong authentication */
                    186:        if (add_arg.ada_common.ca_security != (struct security_parms *) 0)
                    187:        {
                    188:        struct signature *sign_operation();
                    189:        int encode_DAS_AddEntryArgumentData();
                    190: 
                    191:        add_arg.ada_common.ca_sig =
                    192:                sign_operation((caddr_t)&add_arg, encode_DAS_AddEntryArgumentData);
                    193:        }
                    194: 
                    195:        while (ds_addentry (&add_arg, &error) != DS_OK) {
                    196:                if (dish_error (OPT, &error) == 0) {
                    197:                        entry_free (entry_ptr);
                    198:                        return;
                    199:                }
                    200:                add_arg.ada_object = error.ERR_REFERRAL.DSE_ref_candidates->cr_name;
                    201:        } 
                    202:        ps_print (RPS, "Added ");
                    203:        dn_print (RPS, dn, EDBOUT);
                    204:        ps_print (RPS, "\n");
                    205: 
                    206:        delete_list_cache (dn);
                    207:        entry_free (entry_ptr);
                    208: 
                    209:        make_old (fname,draft_flag);
                    210:        
                    211: }
                    212: 
                    213: make_old (file, commit)
                    214: char * file;
                    215: char commit;
                    216: {
                    217: char newname[LINESIZE];
                    218: 
                    219:        if (commit == 0) {
                    220:                (void) sprintf (newname, "%s.old", file);
                    221:                (void) rename (file, newname);
                    222:        }
                    223: }
                    224: 
                    225: 
                    226: Attr_Sequence make_template_as (oc)
                    227: AV_Sequence oc;
                    228: {
                    229: AV_Sequence avs;
                    230: Attr_Sequence newas;
                    231: Attr_Sequence as = NULLATTR;
                    232: table_seq optr;
                    233: AttributeType at;
                    234: objectclass * ocp;
                    235: 
                    236:        for (avs = oc; avs != NULLAV; avs = avs->avseq_next) {
                    237:                ocp = (objectclass *) avs->avseq_av.av_struct;
                    238:                for (optr=ocp->oc_must; optr!=NULLTABLE_SEQ;  optr=optr->ts_next) {
                    239:                        at  = optr->ts_oa;
                    240:                        newas = as_comp_new (at,NULLAV,NULLACL_INFO);
                    241:                        as = as_merge (as,newas);
                    242:                }
                    243:        }
                    244:        
                    245:        for (avs = oc; avs != NULLAV; avs = avs->avseq_next) {
                    246:                ocp = (objectclass *) avs->avseq_av.av_struct;
                    247:                for (optr=ocp->oc_may; optr!=NULLTABLE_SEQ;  optr=optr->ts_next) {
                    248:                        at = optr->ts_oa;
                    249:                        newas = as_comp_new (at,NULLAV,NULLACL_INFO);
                    250:                        as = as_merge (as,newas);
                    251:                }
                    252:        }
                    253: 
                    254:        return (as);
                    255: }
                    256: 
                    257: add_template (name, objclass)
                    258: char           *name;
                    259: char           *objclass;
                    260: {
                    261:        FILE           *fptr;
                    262:        PS              ps;
                    263:        char            obuf[LINESIZE];
                    264:        Attr_Sequence   as;
                    265:        Attr_Sequence   ocas;
                    266:        int             um;
                    267: 
                    268:        if (objclass == NULLCP)
                    269:                objclass = ORG_PERSON;
                    270: 
                    271:        if (!new_draft)
                    272:                if ((fptr = fopen (name, "r")) != NULL) {
                    273:                        (void) fclose (fptr);
                    274:                        if (yesno ("Use existing draft file ? "))
                    275:                                return OK;
                    276:                        else
                    277:                                make_old (fname,FALSE);
                    278:                        return (OK);    /* template already exists ! */
                    279:                }
                    280:        um = umask (0177);
                    281:        if ((fptr = fopen (name, "w")) == NULL) {
                    282:                ps_printf (OPT, "Can't open template entry %s\n", name);
                    283:                return (-1);
                    284:        }
                    285:        (void) umask (um);
                    286:        if ((ps = ps_alloc (std_open)) == NULLPS) {
                    287:                return (-1);
                    288:        }
                    289:        if (std_setup (ps, fptr) == NOTOK) {
                    290:                return (-1);
                    291:        }
                    292: 
                    293:        (void) sprintf (obuf, "objectClass=%s", objclass);
                    294:        if ((ocas = str2as (obuf)) == NULLATTR) 
                    295:                return (-1);
                    296: 
                    297:        as = make_template_as (ocas->attr_value);
                    298:        as = as_merge (as,ocas);
                    299: 
                    300:        as_print (ps,as,EDBOUT);
                    301:        
                    302:        as_free (as);
                    303:        ps_free (ps);
                    304:        (void) fclose (fptr);
                    305: 
                    306:        return (OK);
                    307: 
                    308: }

unix.superglobalmegacorp.com

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