|
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 a
Length: 5289 (0x14a9) Types: TextFile Names: »add.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape └─⟦eba4602b1⟧ »./isode-5.0.tar.Z« └─⟦d3ac74d73⟧ └─⟦this⟧ »isode-5.0/quipu/dish/add.c«
#include "quipu/util.h" #include "quipu/dua.h" #include "quipu/add.h" #include "quipu/entry.h" #define ORG_PERSON "thornPerson & quipuObject" /* this should probably go elsewhere !!! */ extern DN dn; extern PS opt; extern PS rps; extern LLog *log_dua; char fname[128]; static char new_draft; call_add (argc, argv) int argc; char **argv; { Entry entry_ptr; FILE *fd; struct ds_addentry_arg add_arg; struct DSError error; Attr_Sequence rdn_attr, get_attributes(); AV_Sequence rdn_avs; extern int parse_status; int x; int draft_flag = 0; char *O_class = NULLCP; char noedit_flag = FALSE; DN moddn; DLOG (log_dua, LLOG_TRACE, ("We are entering the add routine.\n")); (void) sprintf (fname, "%s/.dishdraft", getenv ("HOME")); new_draft = FALSE; if ((argc = service_control (opt, argc, argv, &add_arg.ada_common)) == -1) return; for (x = 1; x < argc; x++) { if (test_arg (argv[x], "-draft", 1)) { draft_flag = 1; DLOG (log_dua, LLOG_TRACE, ("We have a -draft flag.\n")); if (++x == argc) { ps_printf (opt, "Draft file name missing\n"); Usage (argv[0]); return; } (void) strcpy (fname, argv[x]); } else if (test_arg (argv[x], "-objectclass",1)) { DLOG (log_dua, LLOG_TRACE, ("We have a -objectclass flag.\n")); if (++x == argc) { ps_printf (opt, "Object Class missing\n"); Usage (argv[0]); return; } DLOG (log_dua, LLOG_TRACE, ("Calling add_template with '%s'.\n", argv[x])); O_class = argv[x]; } else if (test_arg(argv[x], "-newdraft", 2)) new_draft = TRUE; else if (test_arg(argv[x], "-noedit", 3)) noedit_flag = TRUE; else if (move (argv[x]) == OK) continue; else { ps_printf (opt,"Unknown option %s\n",argv[x]); Usage (argv[0]); return; } } if (draft_flag != 1) { /* if no draft - create a template */ if (add_template (fname, O_class) != OK) return; noedit_flag = FALSE; /* force editing */ } if ( ! noedit_flag) if (editentry (1, argv) != OK) { make_old (fname,draft_flag); return; } /* now parse the files */ if ((fd = fopen (fname, "r")) == (FILE *) NULL) { ps_printf (opt, "Can't open draft entry %s\n", fname); return; } entry_ptr = get_default_entry (NULLENTRY); entry_ptr->e_attributes = get_attributes (fd); (void) fclose (fd); if (parse_status != 0) return ; add_arg.ada_object = dn; for (moddn = dn ; moddn->dn_parent != NULLDN; moddn=moddn->dn_parent) ; entry_ptr->e_name = rdn_cpy (moddn->dn_rdn); add_arg.ada_entry = entry_ptr->e_attributes; /* add rdn as attribute */ rdn_avs = avs_comp_new (AttrV_cpy (entry_ptr->e_name->rdn_av)); rdn_attr = as_comp_new (AttrT_cpy (entry_ptr->e_name->rdn_at), rdn_avs, NULLACL_INFO); add_arg.ada_entry = as_merge (add_arg.ada_entry, rdn_attr); if (rebind () != OK) { entry_free (entry_ptr); return; } if (ds_addentry (&add_arg, &error) != DS_OK) { ps_printf (opt, "Dish: Adding failed\n"); ds_error (opt, &error); entry_free (entry_ptr); return; } else { ps_print (rps, "Added entry "); dn_print (rps, dn, EDBOUT); ps_print (rps, "\n"); } entry_free (entry_ptr); make_old (fname,draft_flag); } make_old (file, commit) char * file; char commit; { char newname[LINESIZE]; if (commit == 0) { (void) sprintf (newname, "%s.old", file); (void) rename (file, newname); } } Attr_Sequence make_template_as (oc) AV_Sequence oc; { AV_Sequence avs; Attr_Sequence newas; Attr_Sequence as = NULLATTR; table_seq optr; AttributeType at; for (avs = oc; avs != NULLAV; avs = avs->avseq_next) { for (optr=avs->avseq_av->av_un.av_objectclass->oc_must; optr!=NULLTABLE_SEQ; optr=optr->ts_next) { at = (AttributeType) smalloc (sizeof (attrType)); at-> at_oid = NULLOID; at-> at_table = optr->ts_oa; newas = as_comp_new (at,NULLAV,NULLACL_INFO); as = as_merge (as,newas); } } for (avs = oc; avs != NULLAV; avs = avs->avseq_next) { for (optr=avs->avseq_av->av_un.av_objectclass->oc_may; optr!=NULLTABLE_SEQ; optr=optr->ts_next) { at = (AttributeType) smalloc (sizeof (attrType)); at-> at_oid = NULLOID; at-> at_table = optr->ts_oa; newas = as_comp_new (at,NULLAV,NULLACL_INFO); as = as_merge (as,newas); } } return (as); } add_template (name, objclass) char *name; char *objclass; { FILE *fptr; PS ps; char obuf[LINESIZE]; Attr_Sequence as; Attr_Sequence ocas; int um; if (objclass == NULLCP) objclass = ORG_PERSON; if (!new_draft) if ((fptr = fopen (name, "r")) != NULL) { (void) fclose (fptr); return (OK); /* template already exists ! */ } um = umask (0177); if ((fptr = fopen (name, "w")) == NULL) { ps_printf (opt, "Can't open template entry %s\n", name); return (-1); } (void) umask (um); if ((ps = ps_alloc (std_open)) == NULLPS) { return (-1); } if (std_setup (ps, fptr) == NOTOK) { return (-1); } (void) sprintf (obuf, "objectClass=%s", objclass); if ((ocas = str2as (obuf)) == NULLATTR) return (-1); as = make_template_as (ocas->attr_value); as = as_merge (as,ocas); as_print (ps,as,EDBOUT); as_free (as); ps_free (ps); (void) fclose (fptr); return (OK); }