|
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 m
Length: 8408 (0x20d8) Types: TextFile Names: »modify.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape └─⟦eba4602b1⟧ »./isode-5.0.tar.Z« └─⟦d3ac74d73⟧ └─⟦this⟧ »isode-5.0/quipu/dish/modify.c«
#include "quipu/util.h" #include "quipu/modify.h" #include "quipu/entry.h" #include "quipu/dua.h" extern DN dn; extern PS opt, rps; extern Entry current_entry; extern LLog *log_dua; static char new_draft; call_modify (argc, argv) int argc; char **argv; { struct ds_modifyentry_arg mod_arg; struct DSError error; struct entrymod *em = NULLMOD, *emnew; Attr_Sequence as, get_attributes (), temp, trail = NULLATTR; AV_Sequence avs, avst = NULLAV; extern AttributeType at_objectclass; int change; extern char fname[]; extern int parse_status; Entry entry_ptr; FILE *fd; char draft_flag = FALSE; char noedit_flag = FALSE; int x; DN moddn; if ((argc = service_control (opt, argc, argv, &mod_arg.mea_common)) == -1) return; mod_arg.mea_changes = NULLMOD; new_draft = FALSE; (void) sprintf (fname, "%s/.dishdraft", getenv ("HOME")); 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")); shuffle_up (argc--,argv,x); if (x == argc) { ps_printf (opt, "Draft file name missing\n"); Usage (argv[0]); return; } (void) strcpy (fname, argv[x]); shuffle_up (argc--,argv,x--); } else if (test_arg (argv[x], "-newdraft",2)) { new_draft = TRUE; shuffle_up (argc--,argv,x--); } else if (test_arg (argv[x], "-noedit",3)) { noedit_flag = TRUE; shuffle_up (argc--,argv,x--); } else if (move (argv[x]) == OK) shuffle_up (argc--,argv,x--); else { Usage (argv[0]); return; } } /* read attributes we want to modify */ if ((argc = read_cache (argc, argv)) <0 ) return; if (argc != 1) { ps_printf (opt,"Unknown option %s\n",argv[1]); Usage (argv[0]); return; } if (!draft_flag) { if (mod_template (fname) != OK) return; noedit_flag = FALSE; } 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; mod_arg.mea_object = dn; for (moddn = dn ; moddn->dn_parent != NULLDN; moddn=moddn->dn_parent) ; entry_ptr->e_name = rdn_cpy (moddn->dn_rdn); /* add rdn as attribute */ avst = avs_comp_new (AttrV_cpy (entry_ptr->e_name->rdn_av)); temp = as_comp_new (AttrT_cpy (entry_ptr->e_name->rdn_at), avst, NULLACL_INFO); entry_ptr->e_attributes = as_merge (entry_ptr->e_attributes, temp); for (as = entry_ptr->e_attributes; as != NULLATTR; as = as->attr_link) { change = TRUE; if (trail != NULLATTR) trail->attr_link = NULLATTR; /* break list */ /* search read result for this attribute, if found */ /* it must be removed before added */ temp = current_entry->e_attributes; for (; temp != NULLATTR; temp = temp->attr_link) { if (AttrT_cmp (as->attr_type, temp->attr_type) == 0) { /* found it - does it need changing ? */ if (avs_cmp (as->attr_value, temp->attr_value) != 0) { if (AttrT_cmp (as->attr_type, current_entry->e_name->rdn_at) == 0) { /* this is the rdn */ /* add *new* value, can't delete old one !!! */ /* also can't send old one ->X500 error */ for (avs = as->attr_value; avs != NULLAV; avst = avs, avs = avs->avseq_next) if (AttrV_cmp (avs->avseq_av, entry_ptr->e_name->rdn_av,&error) == 0) if (avst == NULLAV) as->attr_value = avs->avseq_next; else avst->avseq_next = avs->avseq_next; if (as->attr_value != NULLAV) { emnew = em_alloc (); emnew->em_type = EM_ADDVALUES; emnew->em_what = as; emnew->em_next = NULLMOD; if (em == NULLMOD) mod_arg.mea_changes = emnew; else em->em_next = emnew; em = emnew; } change = FALSE; } else { emnew = em_alloc (); emnew->em_type = EM_REMOVEATTRIBUTE; emnew->em_what = as; emnew->em_next = NULLMOD; if (em == NULLMOD) mod_arg.mea_changes = emnew; else em->em_next = emnew; em = emnew; } } else change = FALSE; break; } } if (change) { emnew = em_alloc (); emnew->em_type = EM_ADDATTRIBUTE; emnew->em_what = as; emnew->em_next = NULLMOD; if (em == NULLMOD) mod_arg.mea_changes = emnew; else em->em_next = emnew; em = emnew; trail = as; } } if (mod_arg.mea_changes == NULLMOD) { ps_print (rps, "The draft entry and the entry for "); dn_print (rps, dn, EDBOUT); ps_print (rps, "\nare exactly the same - no change made!!!\n"); entry_free (entry_ptr); make_old (fname,draft_flag); return; } if (rebind () != OK) { entry_free (entry_ptr); return; } if (ds_modifyentry (&mod_arg, &error) != DS_OK) { ds_error (opt, &error); ps_print (opt, "\n"); entry_free (entry_ptr); return; } ps_print (rps, "Modified "); dn_print (rps, dn, READOUT); ps_print (rps, "\n"); delete_cache (dn); /* re-cache when next read */ entry_free (entry_ptr); ems_part_free (mod_arg.mea_changes); make_old (fname,draft_flag); } ems_part_free(emp) struct entrymod *emp; { if(emp == NULLMOD) return; ems_part_free(emp->em_next); free((char *)emp); } dsa_control (argc, argv) int argc; char **argv; { static struct entrymod mod = { EM_ADDATTRIBUTE, NULLATTR, NULLMOD }; static struct ds_modifyentry_arg mod_arg = { default_common_args, NULLDN, &mod }; struct DSError error; char buffer[100]; if (test_arg (argv[1], "-lock",1)) (void) sprintf (buffer, " ,1%s", argv[2]); else if (test_arg (argv[1], "-unlock",1)) (void) sprintf (buffer, "u %s", argv[2]); else if (test_arg (argv[1], "-dump",1)) (void) sprintf (buffer, "d %s", argv[2]); else if (test_arg (argv[1], "-tailor",1)) (void) sprintf (buffer, "t %s", argv[2]); else if (test_arg (argv[1], "-slave",1)) { buffer[0] = 's'; argc++; /* to get through if (argc != 3) */ } else if (test_arg (argv[1], "-abort",1)) { buffer[0] = 'a'; argc++; /* to get through if (argc != 3) */ } else if (test_arg (argv[1], "-refresh",3)) (void) sprintf (buffer, "r %s", argv[2]); else if (test_arg (argv[1], "-resync",2)) (void) sprintf (buffer, "f %s", argv[2]); else argc = 1; /* to force error */ if (argc != 3) { Usage (argv[0]); return; } mod_arg.mea_object = dn; mod_arg.mea_changes->em_what = as_comp_new (AttrT_new ("control"), avs_comp_new (str2AttrV (buffer, AV_CASEIGNORESTRING)), NULLACL_INFO); if (ds_modifyentry (&mod_arg, &error) != DS_OK) { /* deal with error */ ds_error (opt, &error); } else { ps_print (rps, "Done\n"); return; } /* as_free (mod_arg.mea_changes->em_what); */ } mod_template (name) char *name; { FILE *fptr; PS ps; extern oid_table_attr * tab_objectclass; Attr_Sequence as, trail = NULLATTR; Attr_Sequence nas, tas, make_template_as (); int um; 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); } as_decode (current_entry->e_attributes); for (as = current_entry->e_attributes; as != NULLATTR; as = as->attr_link) if (as->attr_type->at_table == tab_objectclass) break; tas = make_template_as (as->attr_value); nas = as_cpy(current_entry->e_attributes); for (as = nas; as != NULLATTR; as = as->attr_link) { /* remove photo attribute for now !!! */ if (as->attr_value->avseq_av->av_syntax == AV_PHOTO) { if (trail == NULLATTR) nas = as->attr_link; else trail->attr_link = as->attr_link; as_comp_free (as); break; } trail = as; } tas = as_merge (tas,nas); as_print (ps,tas,EDBOUT); as_free (tas); ps_free (ps); (void) fclose (fptr); return (OK); }