|
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 u
Length: 8962 (0x2302) Types: TextFile Names: »update.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape └─⟦eba4602b1⟧ »./isode-5.0.tar.Z« └─⟦d3ac74d73⟧ └─⟦this⟧ »isode-5.0/quipu/update.c«
/* update.c - write EDB back to disk after modify */ #ifndef lint static char *rcsid = "$Header: /f/osi/quipu/RCS/update.c,v 6.0 89/03/18 23:42:00 mrose Rel $"; #endif /* * $Header: /f/osi/quipu/RCS/update.c,v 6.0 89/03/18 23:42:00 mrose Rel $ * * * $Log: update.c,v $ * Revision 6.0 89/03/18 23:42:00 mrose * Release 5.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. * */ #include "quipu/util.h" #include "quipu/entry.h" #include "tailor.h" #include "quipu/read.h" #include "quipu/dua.h" #include "quipu/connection.h" #ifndef NO_STATS extern LLog * log_stat; #endif extern int dn_print (); extern LLog * log_dsap; extern char remote_lookup; /* routine name is historic - not significant */ journal (myentry) Entry myentry; { PS ps,entryps; char filename [LINESIZE]; char savefile [LINESIZE]; DN dn; FILE * fptr; extern char * treedir; extern char * parse_file; Entry liststart; int um; if (myentry == NULLENTRY) { LLOG (log_dsap,LLOG_FATAL,("update edb problem")); return NOTOK; } if ((ps = ps_alloc (str_open)) == NULLPS) return (NOTOK); if (str_setup (ps,filename,LINESIZE,1) == NOTOK) return (NOTOK); if ((myentry->e_parent != NULLENTRY) && (myentry->e_parent->e_leaf)) { liststart = myentry; if ((dn = get_copy_dn (liststart->e_parent)) == NULLDN) { /* there must be a root directory ! */ LLOG (log_dsap,LLOG_EXCEPTIONS,("serious journal error")); return (NOTOK); } else { ps_printf (ps,"%s/",isodefile(treedir)); dn_print (ps,dn,DIROUT); *ps->ps_ptr = 0; if ( mkdir (filename,0700) != 0 ) { LLOG (log_dsap,LLOG_EXCEPTIONS,("journal mkdir failure")); return (NOTOK); } ps_print (ps,"/EDB"); *ps->ps_ptr = 0; } myentry->e_parent->e_leaf = FALSE; /* not a leaf now !! */ } else { if (myentry->e_parent == NULLENTRY) { liststart = myentry; ps_printf (ps,"%s/EDB",isodefile(treedir)); } else { liststart = myentry->e_parent->e_child; if ((dn = get_copy_dn (liststart->e_parent)) == NULLDN) ps_printf (ps,"%s/EDB",isodefile(treedir)); else { ps_printf (ps,"%s/",isodefile(treedir)); dn_print (ps,dn,DIROUT); ps_print (ps,"/EDB"); } } *ps->ps_ptr = 0; (void) strcpy (savefile,filename); (void) strcat (savefile,".bak"); if (rename (filename,savefile) != OK) { LLOG (log_dsap,LLOG_EXCEPTIONS,("rename %s, %s failed",filename,savefile)); return NOTOK; } } um = umask (0177); if ((fptr = fopen (filename,"w")) == (FILE *) NULL) { LLOG (log_dsap,LLOG_EXCEPTIONS,("file_open failed")); return NOTOK; } (void) umask (um); if ((entryps = ps_alloc (std_open)) == NULLPS) { LLOG (log_dsap,LLOG_EXCEPTIONS,("ps_alloc failed")); return NOTOK; } if (std_setup (entryps,fptr) == NOTOK) { LLOG (log_dsap,LLOG_EXCEPTIONS,("std_setup failed")); return NOTOK; } parse_file = filename; header_print (entryps,liststart,EDBOUT); entry_block_print (entryps,liststart,EDBOUT); ps_free (entryps); ps_free (ps); (void) fclose (fptr); sync (); return (OK); } Entry find_sibling (object,start) RDN object; Entry start; { if (start == NULLENTRY) return (NULLENTRY); while (rdn_cmp (start->e_name, object) != OK) { start = start->e_sibling ; if ( start == NULLENTRY ) return (NULLENTRY); } return (start); } Entry read_edb (version,dn,from) char ** version; DN dn,from; { struct DSError error; static struct ds_bind_arg bindarg; static struct ds_bind_arg bindresult; static struct ds_bind_error binderr; struct PSAPaddr * addr, * get_dsa_psap(); int ad; struct getedb_arg arg; struct getedb_result result; /* read from of remote DSA */ /* Do synchronus read for now */ /* Async read eventually */ make_dsa_bind_arg (&bindarg); if ((addr = get_dsa_psap (from)) == NULLPA) { LLOG (log_dsap,LLOG_EXCEPTIONS,("get edb psap lookup failed")); return (NULLENTRY); } if (dap_bind (&ad, &bindarg, &binderr, &bindresult,addr) != OK) { LLOG (log_dsap,LLOG_EXCEPTIONS,("get edb bind failed")); return (NULLENTRY); } arg.ga_entry = dn; arg.ga_version = *version; DLOG(log_dsap, LLOG_NOTICE, ("EDBARG: ver = %s", arg.ga_version)); if (getedb (&arg,&error,&result,ad) != OK) { LLOG (log_dsap,LLOG_EXCEPTIONS,("getedb remote operation failed")); log_ds_error (&error); ds_error_free (&error); return (NULLENTRY); } (void) dap_unbind (ad); *version = result.gr_version; if (result.gr_version == NULLCP) LLOG(log_dsap, LLOG_NOTICE, ("EDBRES: NULL version")); else DLOG(log_dsap, LLOG_NOTICE, ("EDBRES: ver = %s", result.gr_version)); return (result.gr_edb); } slave_update () { Entry my_entry; extern DN mydsadn; struct edb_info * dsainfo; Entry new_entry, eptr, old_entry, temp, sibl; struct DSError error; static char *version = NULLCP; AV_Sequence avs; DLOG (log_dsap,LLOG_TRACE,("slave update")); if ((my_entry = local_find_entry (mydsadn,TRUE)) == NULLENTRY) fatal (82,"Can't update slaves - my entry has gone"); for (avs = my_entry->e_dsainfo->dsa_attr ; avs != NULLAV; avs=avs->avseq_next) { if (avs->avseq_av == NULLAttrV) continue; dsainfo = avs->avseq_av->av_un.av_update; if (dsainfo->edb_getfrom == NULLDN) continue; /* not an EDB to update */ if ((eptr = local_find_entry (dsainfo->edb_name,FALSE)) == NULLENTRY) { pslog (log_dsap,LLOG_NOTICE,"local slave missing",dn_print,(caddr_t)dsainfo->edb_name); continue; } else version = eptr->e_edbversion; if ((new_entry = read_edb (&version,dsainfo->edb_name,dsainfo->edb_getfrom)) == NULLENTRY) { LLOG (log_dsap,LLOG_NOTICE,("getedb: EDB's are the same!")); continue; } if (version == NULLCP) eptr->e_edbversion = "Unknown"; else eptr->e_edbversion = strdup (version); for (temp = new_entry; temp != NULLENTRY; temp=temp->e_sibling) { temp->e_parent = eptr; if (unravel_attribute (temp,&error,TRUE) != OK) { log_ds_error (&error); fatal (-44,"new edb won't unravel"); } if ((old_entry = find_sibling (temp->e_name,eptr->e_child)) != NULLENTRY) { temp->e_leaf = FALSE; temp->e_allchildrenpresent = old_entry->e_allchildrenpresent; temp->e_child = old_entry->e_child; for (sibl = temp->e_child; sibl != NULLENTRY; sibl=sibl->e_sibling) sibl->e_parent = temp; if (old_entry->e_edbversion != NULLCP) temp->e_edbversion = strdup (old_entry->e_edbversion); } } for (temp = eptr->e_child; temp != NULLENTRY; temp=temp->e_sibling) entry_free (temp); eptr->e_child = new_entry; if (journal (new_entry) != OK) fatal (-45,"Lost old EDB, can't write new one !!!"); #ifndef NO_STATS else pslog (log_stat,LLOG_NOTICE,"slave update",dn_print,(caddr_t)dsainfo->edb_name); #endif if ((my_entry = local_find_entry (mydsadn,TRUE)) == NULLENTRY) fatal (-80,"My entry has disappeared"); } } do_get_edb (arg,error,result,binddn) struct getedb_arg *arg; struct DSError *error; struct getedb_result *result; DN binddn; { Entry eptr; extern DN mydsadn; Entry my_entry; AV_Sequence avs; struct edb_info * dsainfo; char proceed = FALSE; struct dn_seq *dnseq; dn_decode (arg->ga_entry); #ifndef NO_STATS pslog (log_stat,LLOG_NOTICE,"getedb",dn_print,(caddr_t)arg->ga_entry); #endif DLOG (log_dsap,LLOG_DEBUG,("getedb '%s'",arg->ga_version)); remote_lookup = FALSE; if ((eptr = really_find_entry (arg->ga_entry,error,FALSE)) == NULLENTRY) { if (error->dse_type == DSE_REFERRAL) { error->dse_type = DSE_SERVICEERROR; error->ERR_SERVICE.DSE_sv_problem = DSE_SV_CHAININGREQUIRED; remote_lookup = TRUE; return (DS_ERROR_REMOTE); } } remote_lookup = TRUE; if (eptr->e_edbversion != NULLCP) { DLOG(log_dsap, LLOG_DEBUG, ("edb_ver = %s", eptr->e_edbversion)); if (lexequ (arg->ga_version,eptr->e_edbversion) == 0) { result->gr_version = eptr->e_edbversion; result->gr_next = NULL_GETRESULT; result->gr_edb = NULLENTRY; return (DS_OK); } } if ((my_entry = local_find_entry (mydsadn,TRUE)) == NULLENTRY) fatal (84,"my entry has gone - no getedb"); /* Check we will send to this DSA */ for (avs = my_entry->e_dsainfo->dsa_attr ; avs != NULLAV; avs=avs->avseq_next) { if (avs->avseq_av == NULLAttrV) continue; dsainfo = avs->avseq_av->av_un.av_update; if (dn_cmp(dsainfo->edb_name,arg->ga_entry) == 0) { for (dnseq=dsainfo->edb_allowed; dnseq!=NULLDNSEQ; dnseq=dnseq->dns_next) { if (dn_cmp(dnseq->dns_dn,binddn) == 0) { proceed = TRUE; break; } } } if (proceed) break; } if (!proceed) { error->dse_type = DSE_SECURITYERROR; error->ERR_SECURITY.DSE_sc_problem = DSE_SC_ACCESSRIGHTS; return (DS_ERROR_REMOTE); } result->gr_version = eptr->e_edbversion; result->gr_edb = eptr->e_child; result->gr_next = NULL_GETRESULT; return (DS_OK); }