Annotation of 43BSDReno/contrib/isode-beta/quipu/update.c, revision 1.1

1.1     ! root        1: /* update.c - write EDB back to disk after modify */
        !             2: 
        !             3: #ifndef lint
        !             4: static char *rcsid = "$Header: /f/osi/quipu/RCS/update.c,v 7.3 90/07/09 14:46:49 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /*
        !             8:  * $Header: /f/osi/quipu/RCS/update.c,v 7.3 90/07/09 14:46:49 mrose Exp $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       update.c,v $
        !            12:  * Revision 7.3  90/07/09  14:46:49  mrose
        !            13:  * sync
        !            14:  * 
        !            15:  * Revision 7.2  90/03/15  11:19:14  mrose
        !            16:  * quipu-sync
        !            17:  * 
        !            18:  * Revision 7.1  89/12/19  16:20:54  mrose
        !            19:  * sync
        !            20:  * 
        !            21:  * Revision 7.0  89/11/23  22:18:18  mrose
        !            22:  * Release 6.0
        !            23:  * 
        !            24:  */
        !            25: 
        !            26: /*
        !            27:  *                                NOTICE
        !            28:  *
        !            29:  *    Acquisition, use, and distribution of this module and related
        !            30:  *    materials are subject to the restrictions of a license agreement.
        !            31:  *    Consult the Preface in the User's Manual for the full terms of
        !            32:  *    this agreement.
        !            33:  *
        !            34:  */
        !            35: 
        !            36: 
        !            37: #include "quipu/util.h"
        !            38: #include "quipu/entry.h"
        !            39: #include "tailor.h"
        !            40: #include "quipu/read.h"
        !            41: #include "quipu/dua.h"
        !            42: #include "quipu/connection.h"
        !            43: 
        !            44: #ifndef NO_STATS
        !            45: extern LLog * log_stat;
        !            46: #endif
        !            47: extern int dn_print ();
        !            48: extern char *new_version ();
        !            49: 
        !            50: extern LLog * log_dsap;
        !            51: extern char remote_lookup;
        !            52: extern int local_slave_size;
        !            53: extern int slave_edbs;
        !            54: extern DN mydsadn;
        !            55: struct oper_act *      oper_alloc();
        !            56: struct oper_act *      make_get_edb_op();
        !            57: 
        !            58: /* routine name is historic - not significant */
        !            59: 
        !            60: journal (myentry)
        !            61: Entry myentry;
        !            62: {
        !            63: char * filename, *dn2edbfile();
        !            64: char savefile [LINESIZE], newfile[LINESIZE];
        !            65: DN dn;
        !            66: extern char * treedir;
        !            67: extern char * parse_file;
        !            68: Entry liststart;
        !            69: extern int errno;
        !            70: 
        !            71:        if (myentry == NULLENTRY) {
        !            72:                LLOG (log_dsap,LLOG_FATAL,("update edb problem"));
        !            73:                return NOTOK;
        !            74:        }
        !            75: 
        !            76:        if ((myentry->e_parent != NULLENTRY) && (myentry->e_parent->e_leaf)) {
        !            77:                liststart = myentry;
        !            78:                dn = get_copy_dn (liststart->e_parent);
        !            79:                if ((filename = dn2edbfile (dn)) == NULLCP) {
        !            80:                        dn_free (dn);
        !            81:                        return NOTOK;
        !            82:                }
        !            83:                myentry->e_parent->e_leaf = FALSE;  /* not a leaf now !! */
        !            84: 
        !            85:                if ( write_edb(liststart,filename) != OK)
        !            86:                        return NOTOK;
        !            87:        } else {
        !            88:                if (myentry->e_parent == NULLENTRY) {
        !            89:                        liststart = myentry;
        !            90:                        dn = NULLDN;
        !            91:                } else {
        !            92:                        liststart = myentry->e_parent->e_child;
        !            93:                        dn = get_copy_dn (liststart->e_parent);
        !            94:                }
        !            95:                if ((filename = dn2edbfile (dn)) == NULLCP) {
        !            96:                        dn_free (dn);
        !            97:                        return NOTOK;
        !            98:                }
        !            99: 
        !           100:                (void) strcpy (newfile,filename);
        !           101:                (void) strcat (newfile,".new");
        !           102: 
        !           103:                if ( write_edb(liststart,newfile) != OK) {
        !           104:                    (void) unlink (newfile);
        !           105:                    return NOTOK;
        !           106:                }
        !           107: 
        !           108:                (void) strcpy (savefile,filename);
        !           109:                (void) strcat (savefile,".bak");
        !           110: 
        !           111:                (void) unlink (savefile);
        !           112:                if (link (filename, savefile) == NOTOK)
        !           113:                    SLOG (log_dsap, LLOG_EXCEPTIONS, savefile,
        !           114:                          ("unable to link %s to", filename));
        !           115:                if (rename (newfile, filename) == NOTOK) {
        !           116:                    SLOG (log_dsap, LLOG_EXCEPTIONS, filename,
        !           117:                          ("unable to rename %s to", newfile));
        !           118:                    if (link (savefile, filename) == NOTOK
        !           119:                            && !fileexists (filename))
        !           120:                        LLOG (log_dsap, LLOG_EXCEPTIONS,
        !           121:                              ("and couldn't get old file back - PANIC!!!"));
        !           122:                    return NOTOK;
        !           123:                }
        !           124:        }
        !           125: 
        !           126:        return OK;
        !           127: }
        !           128: 
        !           129: modify_attr (eptr,who)
        !           130: Entry eptr;
        !           131: DN who;
        !           132: {
        !           133: AttributeType at;
        !           134: AttributeValue av;
        !           135: AV_Sequence avs;
        !           136: Attr_Sequence as, old; 
        !           137: extern int       no_last_mod;
        !           138: 
        !           139:        if (no_last_mod)
        !           140:                return;
        !           141: 
        !           142:        if ((at = AttrT_new (LAST_MOD_OID)) == NULLAttrT) {
        !           143:                LLOG (log_dsap, LLOG_EXCEPTIONS, ("last mod oid missing"));
        !           144:                return;
        !           145:        }
        !           146: 
        !           147:        av = AttrV_alloc ();
        !           148:        av->av_syntax = str2syntax ("UTCTime");
        !           149:        av->av_struct = (caddr_t) new_version();
        !           150: 
        !           151:        avs = avs_comp_new(av);
        !           152: 
        !           153:        if ((old = as_find_type (eptr->e_attributes,at)) == NULLATTR) {
        !           154:                as = as_comp_new (at,avs,NULLACL_INFO);
        !           155:                eptr->e_attributes = as_merge (eptr->e_attributes,as);
        !           156:        } else {
        !           157:                avs_free (old->attr_value);
        !           158:                old->attr_value = avs;
        !           159:                AttrT_free (at);
        !           160:        }
        !           161: 
        !           162:        if ((at = AttrT_new (MOD_BY_OID)) == NULLAttrT) {
        !           163:                LLOG (log_dsap, LLOG_EXCEPTIONS, ("last mod by oid missing"));
        !           164:                return;
        !           165:        }
        !           166: 
        !           167:        av = AttrV_alloc ();
        !           168:        av->av_syntax = str2syntax ("DN");
        !           169:        av->av_struct = (caddr_t) dn_cpy (who);
        !           170: 
        !           171:        avs = avs_comp_new(av);
        !           172: 
        !           173:        if ((old = as_find_type (eptr->e_attributes,at)) == NULLATTR) {
        !           174:                as = as_comp_new (at,avs,NULLACL_INFO);
        !           175:                eptr->e_attributes = as_merge (eptr->e_attributes,as);
        !           176:        } else {
        !           177:                avs_free (old->attr_value);
        !           178:                old->attr_value = avs;
        !           179:                AttrT_free (at);
        !           180:        }
        !           181: }
        !           182: 
        !           183: static allowed_to_send (a,b)
        !           184: register DN  a,b;
        !           185: {
        !           186:        /* Return TRUE if the DNs are the same */
        !           187:        /* Return TRUE if all components of 'a' match, but 'b' has one extra */
        !           188:        /* False otherwise */
        !           189: 
        !           190:        if ((a == NULLDN) || (b == NULLDN))
        !           191:                return FALSE;
        !           192: 
        !           193:        for (; a != NULLDN && b != NULLDN ; a = a->dn_parent, b = b->dn_parent)
        !           194:                if ( dn_comp_cmp (a,b) == NOTOK)
        !           195:                        return FALSE;
        !           196: 
        !           197:        if (( b == NULLDN) || (b->dn_parent == NULLDN))
        !           198:                return TRUE;
        !           199:        else
        !           200:                return FALSE;
        !           201: 
        !           202: }
        !           203: 
        !           204: 
        !           205: do_get_edb (arg,error,result,binddn)
        !           206: struct getedb_arg *arg;
        !           207: struct DSError   *error;
        !           208: struct getedb_result *result;
        !           209: DN binddn;
        !           210: {
        !           211: Entry eptr;
        !           212: Entry my_entry;
        !           213: AV_Sequence avs;
        !           214: struct edb_info * dsainfo;
        !           215: char proceed = FALSE;
        !           216: struct dn_seq  * dnseq;
        !           217: struct di_block        * di;
        !           218: 
        !           219:        DLOG (log_dsap,LLOG_DEBUG,("getedb '%s'",arg->ga_version));
        !           220: 
        !           221:        switch(really_find_entry (arg->ga_entry,FALSE,NULLDNSEQ,FALSE,&(eptr),error,&(di)))
        !           222:        {
        !           223:        case DS_OK:
        !           224:            /*
        !           225:            *  Entry has been found and returned via eptr.
        !           226:            *  Go through and process this entry.
        !           227:            */
        !           228:            break;
        !           229: 
        !           230:        case DS_CONTINUE:
        !           231:            /*
        !           232:            * Get edb operations should never generate referrals.
        !           233:            * Free the di_blocks generated and return an error.
        !           234:            */
        !           235:            error->dse_type = DSE_SERVICEERROR;
        !           236:            error->ERR_SERVICE.DSE_sv_problem = DSE_SV_CHAININGREQUIRED;
        !           237:            return (DS_X500_ERROR);
        !           238: 
        !           239:        case DS_X500_ERROR:
        !           240:            /* something wrong with the request - error should be filled out */
        !           241:            return(DS_X500_ERROR);
        !           242: 
        !           243:        default:
        !           244:            LLOG(log_dsap, LLOG_EXCEPTIONS, ("do_get_edb() - really_find_entry() failed"));
        !           245:            error->dse_type = DSE_SERVICEERROR;
        !           246:            error->ERR_SERVICE.DSE_sv_problem = DSE_SV_DITERROR;
        !           247:            return (DS_X500_ERROR);
        !           248:        }
        !           249: 
        !           250:        if ((my_entry = local_find_entry (mydsadn,TRUE)) == NULLENTRY)
        !           251:                fatal (84,"my entry has gone - no getedb");
        !           252: 
        !           253:        /* Check we will send to this DSA */
        !           254:        for (avs = my_entry->e_dsainfo->dsa_attr ; avs != NULLAV; avs=avs->avseq_next) {
        !           255:                if (avs->avseq_av.av_struct == NULL)
        !           256:                        continue;
        !           257:                dsainfo = (struct edb_info *) avs->avseq_av.av_struct;
        !           258:                if (dn_cmp(dsainfo->edb_name,arg->ga_entry) == 0) {
        !           259:                        for (dnseq=dsainfo->edb_allowed; dnseq!=NULLDNSEQ; dnseq=dnseq->dns_next) {
        !           260:                                if (allowed_to_send(dnseq->dns_dn,binddn)) {
        !           261:                                        proceed = TRUE;
        !           262:                                        break;
        !           263:                                }
        !           264:                        }
        !           265:                }
        !           266:                if (proceed)
        !           267:                        break;
        !           268:        }
        !           269:                                        
        !           270:        if (!proceed) {
        !           271:                error->dse_type = DSE_SECURITYERROR;
        !           272:                error->ERR_SECURITY.DSE_sc_problem = DSE_SC_ACCESSRIGHTS;
        !           273:                return (DS_ERROR_REMOTE);
        !           274:        }
        !           275: 
        !           276:        if ((eptr->e_child == NULLENTRY) 
        !           277:                || ((eptr->e_child->e_data != E_DATA_MASTER) 
        !           278:                        && (eptr->e_child->e_data != E_TYPE_SLAVE))) {
        !           279:                error->dse_type = DSE_SERVICEERROR;
        !           280:                error->ERR_SERVICE.DSE_sv_problem = DSE_SV_DITERROR;
        !           281:                return (DS_X500_ERROR);
        !           282:        }
        !           283: 
        !           284:        if (eptr->e_edbversion != NULLCP) {
        !           285:                DLOG(log_dsap, LLOG_DEBUG, ("edb_ver = %s", eptr->e_edbversion));
        !           286: 
        !           287:                if (lexequ (arg->ga_version,eptr->e_edbversion) == 0) {
        !           288:                        result->gr_version = eptr->e_edbversion;
        !           289:                        result->gr_edb = NULLENTRY;
        !           290:                        result->gr_next = NULL_GETRESULT;
        !           291:                        return (DS_OK);
        !           292:                }
        !           293:        } else 
        !           294:                eptr->e_edbversion = new_version();
        !           295: 
        !           296:        result->gr_version = eptr->e_edbversion;
        !           297:        result->gr_edb = eptr->e_child;
        !           298:        result->gr_next = NULL_GETRESULT;
        !           299:        return (DS_OK);
        !           300: }
        !           301: 
        !           302: slave_update () 
        !           303: { 
        !           304: extern time_t lastedb_update, timenow;
        !           305: 
        !           306:        (void) update_aux (NULLDN, 0); 
        !           307:        lastedb_update = timenow;
        !           308: }
        !           309: 
        !           310: update_aux (dn, isroot)
        !           311: DN     dn;
        !           312: int    isroot;
        !           313: {
        !           314: Entry my_entry, make_path();
        !           315: Entry find_sibling();
        !           316: extern DN mydsadn;
        !           317: struct edb_info * dsainfo;
        !           318: Entry eptr;
        !           319: static char *version = NULLCP;
        !           320: AV_Sequence avs;
        !           321: AV_Sequence avs_head;
        !           322: int              success;
        !           323: 
        !           324:        DLOG (log_dsap,LLOG_TRACE,("slave update"));
        !           325: 
        !           326:        if ((my_entry = local_find_entry (mydsadn,TRUE)) == NULLENTRY)
        !           327:                fatal (82,"Can't update slaves - my entry has gone");
        !           328: 
        !           329:        avs_head = avs_cpy(my_entry->e_dsainfo->dsa_attr);
        !           330: 
        !           331:        for (avs = avs_head ; avs != NULLAV; avs=avs->avseq_next)
        !           332:        {
        !           333:                if (avs->avseq_av.av_struct == NULL)
        !           334:                        continue;
        !           335:                dsainfo = (struct edb_info *) avs->avseq_av.av_struct;
        !           336:                if (dsainfo->edb_getfrom == NULLDN)
        !           337:                        continue;  /* not an EDB to update */
        !           338:                if ((dn || isroot) && dn_cmp (dn, dsainfo -> edb_name) != OK)
        !           339:                    continue;      /* not an EDB this time */
        !           340: 
        !           341:                if ((eptr = local_find_entry (dsainfo->edb_name,FALSE)) == NULLENTRY) {
        !           342:                        version = "0000000000Z";
        !           343:                        eptr = make_path (dsainfo->edb_name);
        !           344:                } 
        !           345:                else
        !           346:                {
        !           347:                        if((version = eptr->e_edbversion) == NULLCP)
        !           348:                        {
        !           349:                            LLOG(log_dsap, LLOG_NOTICE, ("update_aux: edbversion was NULLCP"));
        !           350:                            version = "0000000000Z";
        !           351:                        }
        !           352:                }
        !           353: 
        !           354:                success = send_get_edb(version, dsainfo->edb_name, dsainfo->edb_getfrom);
        !           355: 
        !           356:                if(dn || isroot)
        !           357:                    break;
        !           358: 
        !           359:                dsa_wait (0);   /* accept any results of previous ops */
        !           360: 
        !           361:        }
        !           362:        avs_free (avs_head);
        !           363: 
        !           364:        return((dn || isroot) ? success : OK);
        !           365: }
        !           366: 
        !           367: int     send_get_edb (version,dn,from)
        !           368: char   * version;
        !           369: DN dn,from;
        !           370: {
        !           371: struct di_block                * di;
        !           372: struct DSError           error;
        !           373: struct oper_act                * on;
        !           374: char    buffer[BUFSIZ];
        !           375: PS         ps;
        !           376: 
        !           377:        switch(get_dsa_info(from, NULLDNSEQ, &(error), &(di)))
        !           378:        {
        !           379:        case DS_OK:
        !           380:            /*
        !           381:            *  di is a completed dsa info block
        !           382:            *  Make a get_edb operation from it, attempt to send the operation
        !           383:            *  and link the operation onto the global list of get_edb
        !           384:            *  operations.
        !           385:            */
        !           386:            if (ps = ps_alloc (str_open)) {
        !           387:                if (str_setup (ps, buffer, sizeof buffer, 1) != NOTOK) {
        !           388:                    ps_printf (ps, "contact ");
        !           389:                    dn_print (ps, from, EDBOUT);
        !           390:                    ps_printf (ps, " for ");
        !           391:                    if (dn)
        !           392:                        dn_print (ps, dn, EDBOUT);
        !           393:                    *ps -> ps_ptr = NULL;
        !           394: 
        !           395:                    LLOG (log_dsap, LLOG_NOTICE, ("%s", buffer));
        !           396:                }
        !           397: 
        !           398:                (void) ps_free (ps);
        !           399:            }
        !           400: 
        !           401: #ifdef DEBUG
        !           402:            DLOG(log_dsap, LLOG_DEBUG, ("send_get_edb - get_dsa_info OK:"));
        !           403:            di_list_log(di);
        !           404: #endif
        !           405:            if((on = make_get_edb_op(dn, version, di)) == NULLOPER)
        !           406:            {
        !           407:                /* Flake out screaming */
        !           408:                LLOG(log_dsap, LLOG_EXCEPTIONS, ("make_get_edb_op failed for send_get_edb"));
        !           409:                return(NOTOK);
        !           410:            }
        !           411: 
        !           412:            if(oper_chain(on) != OK)
        !           413:            {
        !           414:                LLOG(log_dsap, LLOG_NOTICE, ("Could not chain a getEDB operation"));
        !           415:                return(NOTOK);
        !           416:            }
        !           417: 
        !           418:            on->on_next_task = get_edb_ops;
        !           419:            get_edb_ops = on;
        !           420:            return(OK);
        !           421: 
        !           422:        case DS_CONTINUE:
        !           423:            /*
        !           424:            *  di is a deferred dsa info block
        !           425:            *  make the operation and suspend waiting for the di_block to be 
        !           426:            *  woken up.
        !           427:            */
        !           428: #ifdef DEBUG
        !           429:            DLOG(log_dsap, LLOG_DEBUG, ("send_get_edb - get_dsa_info CONT:"));
        !           430:            di_list_log(di);
        !           431: #endif
        !           432:            if((on = make_get_edb_op(dn, version, di)) == NULLOPER)
        !           433:            {
        !           434:                /* Flake out screaming */
        !           435:                LLOG(log_dsap, LLOG_EXCEPTIONS, ("make_get_edb_op failed for send_get_edb"));
        !           436:                return(NOTOK);
        !           437:            }
        !           438: 
        !           439:            on->on_state = ON_DEFERRED;
        !           440: 
        !           441:            on->on_next_task = get_edb_ops;
        !           442:            get_edb_ops = on;
        !           443: 
        !           444:            if (ps = ps_alloc (str_open)) {
        !           445:                if (str_setup (ps, buffer, sizeof buffer, 1) != NOTOK) {
        !           446:                    ps_printf (ps, "contact ");
        !           447:                    dn_print (ps, from, EDBOUT);
        !           448:                    ps_printf (ps, " for ");
        !           449:                    if (dn)
        !           450:                        dn_print (ps, dn, EDBOUT);
        !           451:                    *ps -> ps_ptr = NULL;
        !           452: 
        !           453:                    LLOG (log_dsap, LLOG_NOTICE, ("%s", buffer));
        !           454:                }
        !           455: 
        !           456:                (void) ps_free (ps);
        !           457:            }
        !           458: 
        !           459:            return(OK);
        !           460: 
        !           461:        case DS_X500_ERROR:
        !           462:            /* Error encountered generating di_block */
        !           463:            LLOG(log_dsap, LLOG_NOTICE, ("send_get_edb - get_dsa_info returned X500 ERROR"));
        !           464:            log_ds_error (&error);
        !           465:            ds_error_free (&error);
        !           466:            return(NOTOK);
        !           467: 
        !           468:        default:
        !           469:            LLOG(log_dsap, LLOG_EXCEPTIONS, ("send_get_edb - get_dsa_info unexpected return"));
        !           470:            return(NOTOK);
        !           471:        }
        !           472:        /* NOTREACHED */
        !           473: }
        !           474: 
        !           475: process_edb(on)
        !           476: struct oper_act        * on;
        !           477: {
        !           478: extern DN mydsadn;
        !           479: Entry make_path(), find_sibling();
        !           480: Entry new_entry, old_entry, temp, sibl, next;
        !           481: Entry eptr;
        !           482:                        /* up 'n' down to make sure first child !!! */
        !           483: struct DSError  error;
        !           484: struct getedb_result   * result = &(on->on_resp.di_result.dr_res.dcr_dsres.res_ge);
        !           485: int entry_cnt = 0;
        !           486: 
        !           487:        if ((eptr = local_find_entry (on->on_req.dca_dsarg.arg_ge.ga_entry,FALSE)) == NULLENTRY) {
        !           488:                pslog (log_dsap,LLOG_EXCEPTIONS,"Updating something which does not exist !!!",
        !           489:                        dn_print,(caddr_t)on->on_req.dca_dsarg.arg_ge.ga_entry);
        !           490:                return;
        !           491:        }
        !           492: 
        !           493:        if ((new_entry = result->gr_edb) == NULLENTRY) {
        !           494:                DLOG (log_dsap, LLOG_NOTICE,("  EDBs are the same (%d): %s",on->on_id,on->on_getedb_ver));
        !           495:                return;
        !           496:        } else {
        !           497:                DLOG (log_dsap, LLOG_NOTICE,("  EDB updated from (%d): %s to: %s", on->on_id,on->on_getedb_ver, result->gr_version));
        !           498:                ;
        !           499:        }
        !           500: 
        !           501: #ifndef NO_STATS
        !           502:        {
        !           503:        DN tmp_dn;
        !           504:        tmp_dn = get_copy_dn (eptr);
        !           505:        pslog (log_stat,LLOG_NOTICE,"Slave update",dn_print,(caddr_t)tmp_dn);
        !           506:        dn_free (tmp_dn);
        !           507:        }
        !           508: #endif
        !           509: 
        !           510:        if (eptr->e_edbversion)
        !           511:                free (eptr->e_edbversion);
        !           512: 
        !           513:        if (result->gr_version == NULLCP) {
        !           514:                eptr->e_edbversion = "Unknown";
        !           515:                LLOG(log_dsap, LLOG_EXCEPTIONS, ("EDBRES: NULL version"));
        !           516:        } else
        !           517:                eptr->e_edbversion = strdup (result->gr_version);
        !           518: 
        !           519:        for (temp = new_entry; temp != NULLENTRY; temp=temp->e_sibling) {
        !           520:                temp->e_parent = eptr;
        !           521:                if (unravel_attribute (temp,&error) != OK) {
        !           522:                        LLOG (log_dsap,LLOG_EXCEPTIONS, ("Error in new EDB - continuing with old"));
        !           523:                        log_ds_error (&error);
        !           524:                        return;
        !           525:                }
        !           526:        }
        !           527: 
        !           528:        for (temp = new_entry; temp != NULLENTRY; temp=temp->e_sibling) {
        !           529:                entry_cnt++;
        !           530:                if ((old_entry = find_sibling (temp->e_name,eptr->e_child)) != NULLENTRY) {
        !           531:                        temp->e_leaf = old_entry->e_leaf;
        !           532:                        temp->e_allchildrenpresent = old_entry->e_allchildrenpresent;
        !           533:                        temp->e_child = old_entry->e_child;
        !           534:                        for (sibl = temp->e_child; sibl != NULLENTRY; sibl=sibl->e_sibling)
        !           535:                                sibl->e_parent = temp;
        !           536:                        if (old_entry->e_edbversion != NULLCP)
        !           537:                                temp->e_edbversion = strdup (old_entry->e_edbversion);
        !           538:                }
        !           539: 
        !           540:        }
        !           541: 
        !           542:        if (eptr->e_child == NULLENTRY)
        !           543:                slave_edbs++;
        !           544: 
        !           545:        for (temp = eptr->e_child; temp != NULLENTRY; temp=next) {
        !           546:                next = temp->e_sibling;
        !           547:                local_slave_size--;
        !           548:                entry_free (temp);
        !           549:        }
        !           550: 
        !           551:        sync ();        /* Photos - no evidence - just a guess !!! */
        !           552: 
        !           553:        local_slave_size += entry_cnt;
        !           554:        eptr->e_child = new_entry;
        !           555:        eptr->e_allchildrenpresent = TRUE;
        !           556:        eptr->e_leaf = FALSE;
        !           557: 
        !           558: #ifdef TURBO_DISK
        !           559:        if (turbo_writeall(new_entry) != OK)
        !           560:                fatal (-79,"Lost old EDB, can't write new one!!!");
        !           561: #else
        !           562:        if (journal (new_entry) != OK) 
        !           563:                fatal (-79,"Lost old EDB, can't write new one !!!");
        !           564: #endif
        !           565: 
        !           566:        if (local_find_entry (mydsadn,TRUE) == NULLENTRY)
        !           567:                fatal (-80,"My entry has disappeared from the DIT !!!");
        !           568: }
        !           569: 
        !           570: /*
        !           571: *  get_edb_fail_wakeup suffices for both fail and error conditions
        !           572: *  arising on a get edb operation.
        !           573: */
        !           574: get_edb_fail_wakeup(on)
        !           575: struct oper_act        * on;
        !           576: {
        !           577:     struct oper_act    * on_tmp;
        !           578:     struct oper_act    **on_p;
        !           579: 
        !           580:     DLOG(log_dsap, LLOG_TRACE, ("get_edb_fail_wakeup"));
        !           581: 
        !           582: /* Should do extra logging here */
        !           583: 
        !           584:     on_p = &(get_edb_ops);
        !           585:     for(on_tmp = get_edb_ops; on_tmp != NULLOPER; on_tmp = on_tmp->on_next_task)
        !           586:     {
        !           587:        if(on_tmp == on)
        !           588:            break;
        !           589: 
        !           590:        on_p = &(on_tmp->on_next_task);
        !           591:     }
        !           592: 
        !           593:     if(on_tmp != NULLOPER)
        !           594:     {
        !           595:        (*on_p) = on_tmp->on_next_task;
        !           596:     }
        !           597:     else
        !           598:     {
        !           599:        LLOG(log_dsap, LLOG_EXCEPTIONS, ("get_edb_fail_wakeup - op escaped from get_edb_ops (the global list)"));
        !           600:     }
        !           601: 
        !           602:     oper_conn_extract(on);
        !           603:     oper_free(on);
        !           604: }
        !           605: 
        !           606: struct oper_act        * make_get_edb_op(dn, version, di)
        !           607: DN               dn;
        !           608: char           * version;
        !           609: struct di_block        * di;
        !           610: {
        !           611: struct di_block        * di_tmp;
        !           612: struct oper_act        * on_tmp;
        !           613: struct getedb_arg      * arg;
        !           614: 
        !           615:        DLOG(log_dsap, LLOG_TRACE, ("make_get_edb_op"));
        !           616: 
        !           617:        if((on_tmp = oper_alloc()) == NULLOPER)
        !           618:        {
        !           619:                LLOG(log_dsap, LLOG_EXCEPTIONS, ("make_get_edb_op - out of memory"));
        !           620:                return(NULLOPER);
        !           621:        }
        !           622: 
        !           623:        on_tmp->on_type = ON_TYPE_GET_EDB;
        !           624:        on_tmp->on_arg = &(on_tmp->on_req);
        !           625:        on_tmp->on_req.dca_dsarg.arg_type = OP_GETEDB;
        !           626:        on_tmp->on_getedb_ver = version;
        !           627: 
        !           628:        arg = &(on_tmp->on_req.dca_dsarg.arg_ge);
        !           629: 
        !           630:        arg->ga_entry = dn_cpy(dn);
        !           631:        arg->ga_version = strdup(version);
        !           632:        DLOG(log_dsap, LLOG_NOTICE, ("EDBARG: ver = %s", arg->ga_version));
        !           633: 
        !           634:        on_tmp->on_dsas = di;
        !           635:        for(di_tmp=di; di_tmp!=NULL_DI_BLOCK; di_tmp=di_tmp->di_next)
        !           636:        {
        !           637: #ifdef DEBUG
        !           638:            DLOG(log_dsap, LLOG_DEBUG, ("Linking a di_block to this op"));
        !           639:            di_log(di_tmp);
        !           640: #endif
        !           641:            di_tmp->di_type = DI_OPERATION;
        !           642:            di_tmp->di_oper = on_tmp;
        !           643:        }
        !           644: 
        !           645:        return(on_tmp);
        !           646: }
        !           647: 
        !           648: get_edb_extract(on)
        !           649: struct oper_act        * on;
        !           650: {
        !           651:     struct oper_act    * on_tmp;
        !           652:     struct oper_act    **next_on;
        !           653: 
        !           654:     next_on = &(get_edb_ops);
        !           655:     for(on_tmp=get_edb_ops; on_tmp!=NULLOPER; on_tmp=on_tmp->on_next_task)
        !           656:     {
        !           657:        if(on_tmp == on)
        !           658:            break;
        !           659:        next_on = &(on_tmp->on_next_task);
        !           660:     }
        !           661:     if(on_tmp != NULLOPER)
        !           662:     {
        !           663:        (*next_on) = on_tmp->on_next_task;
        !           664:     }
        !           665:     else
        !           666:     {
        !           667:        LLOG(log_dsap, LLOG_EXCEPTIONS, ("Not on get_edb list"));
        !           668:     }
        !           669: }
        !           670: 

unix.superglobalmegacorp.com

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