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

1.1       root        1: /* dsa_work.c - do some work on an active task. */
                      2: 
                      3: #ifndef lint
                      4: static char *rcsid = "$Header: /f/osi/quipu/RCS/dsa_work.c,v 7.3 90/07/09 14:46:05 mrose Exp $";
                      5: #endif
                      6: 
                      7: /*
                      8:  * $Header: /f/osi/quipu/RCS/dsa_work.c,v 7.3 90/07/09 14:46:05 mrose Exp $
                      9:  *
                     10:  *
                     11:  * $Log:       dsa_work.c,v $
                     12:  * Revision 7.3  90/07/09  14:46:05  mrose
                     13:  * sync
                     14:  * 
                     15:  * Revision 7.2  90/03/15  11:19:02  mrose
                     16:  * quipu-sync
                     17:  * 
                     18:  * Revision 7.1  89/12/19  16:20:32  mrose
                     19:  * sync
                     20:  * 
                     21:  * Revision 7.0  89/11/23  22:17:26  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 "acsap.h"
                     38: #include "quipu/util.h"
                     39: #include "quipu/common.h"
                     40: #include "quipu/connection.h"
                     41: 
                     42: extern LLog * log_dsap;
                     43: 
                     44: dsa_work(tk)
                     45: register        struct task_act * tk;
                     46: {
                     47: struct DSArgument   *arg;
                     48: struct DSError      *err;
                     49: struct DSResult     *res;
                     50: DN                  orig;
                     51: DN                  base;
                     52: struct ds_search_task  **local;
                     53: struct ds_search_task  **refer;
                     54: int                 dsa_ret;
                     55: struct di_block            * di;
                     56: char               dsp;
                     57: 
                     58:     arg = &(tk->tk_dx.dx_arg.dca_dsarg);
                     59:     res = &(tk->tk_resp.di_result.dr_res.dcr_dsres);
                     60:     err = &(tk->tk_resp.di_error.de_err);
                     61:     local = &(tk->local_st);
                     62:     refer = &(tk->refer_st);
                     63: 
                     64:     if(tk->tk_conn->cn_ctx == DS_CTX_X500_DAP)
                     65:     {
                     66:        orig = dn_cpy(tk->tk_conn->cn_dn);
                     67:        base = NULLDN;
                     68:        dsp = FALSE;
                     69:     }
                     70:     else
                     71:     {
                     72:        if (tk->tk_dx.dx_arg.dca_charg.cha_originator == NULLDN) {
                     73:            switch (arg->arg_type) {
                     74:                case OP_READ:           orig = dn_cpy (arg->arg_rd.rda_common.ca_requestor);
                     75:                                        break;
                     76:                case OP_COMPARE:        orig = dn_cpy (arg->arg_cm.cma_common.ca_requestor);
                     77:                                        break;
                     78:                case OP_LIST:           orig = dn_cpy (arg->arg_ls.lsa_common.ca_requestor);
                     79:                                        break;
                     80:                case OP_SEARCH:         orig = dn_cpy (arg->arg_sr.sra_common.ca_requestor);
                     81:                                        break;
                     82:                case OP_ADDENTRY:       orig = dn_cpy (arg->arg_ad.ada_common.ca_requestor);
                     83:                                        break;
                     84:                case OP_REMOVEENTRY:    orig = dn_cpy (arg->arg_rm.rma_common.ca_requestor);
                     85:                                        break;
                     86:                case OP_MODIFYENTRY:    orig = dn_cpy (arg->arg_me.mea_common.ca_requestor);
                     87:                                        break;
                     88:                case OP_MODIFYRDN:      orig = dn_cpy (arg->arg_mr.mra_common.ca_requestor);
                     89:                                        break;
                     90:                default:                orig = NULLDN;
                     91:                                        break;
                     92:            }
                     93:        } else
                     94:                orig = dn_cpy(tk->tk_dx.dx_arg.dca_charg.cha_originator);
                     95: 
                     96:        if (tk->tk_dx.dx_arg.dca_charg.cha_target == NULLDN) {
                     97:            switch (arg->arg_type) {
                     98:                case OP_READ:           base = dn_cpy (arg->arg_rd.rda_object);
                     99:                                        break;
                    100:                case OP_COMPARE:        base = dn_cpy (arg->arg_cm.cma_object);
                    101:                                        break;
                    102:                case OP_LIST:           base = dn_cpy (arg->arg_ls.lsa_object);
                    103:                                        break;
                    104:                case OP_SEARCH:         base = dn_cpy (arg->arg_sr.sra_baseobject);
                    105:                                        break;
                    106:                case OP_ADDENTRY:       base = dn_cpy (arg->arg_ad.ada_object);
                    107:                                        break;
                    108:                case OP_REMOVEENTRY:    base = dn_cpy (arg->arg_rm.rma_object);
                    109:                                        break;
                    110:                case OP_MODIFYENTRY:    base = dn_cpy (arg->arg_me.mea_object);
                    111:                                        break;
                    112:                case OP_MODIFYRDN:      base = dn_cpy (arg->arg_mr.mra_object);
                    113:                                        break;
                    114:                case OP_GETEDB:         base = dn_cpy (arg->arg_ge.ga_entry);
                    115:                                        break;
                    116:                default:                base = NULLDN;
                    117:                                        break;
                    118:            }
                    119:        } else 
                    120:                base = dn_cpy(tk->tk_dx.dx_arg.dca_charg.cha_target);
                    121: 
                    122:        dsp = TRUE;
                    123:        
                    124:     }
                    125: 
                    126: 
                    127:     DLOG (log_dsap,LLOG_TRACE,( "Apply operation"));
                    128: 
                    129: #ifndef NO_STATS
                    130:     if (*local == NULL_ST)
                    131:            log_x500_event (arg,tk->tk_conn->cn_ctx,orig,base,tk->tk_conn->cn_ad);
                    132: #endif
                    133: 
                    134:     if (!dsp && (tk->tk_conn->cn_authen == DBA_AUTH_NONE)) {
                    135:        dn_free (orig);
                    136:        orig = NULLDN;
                    137:     }
                    138: 
                    139:     switch(arg->arg_type)
                    140:     {
                    141:     case OP_READ:
                    142:        dsa_ret = do_ds_read(&(arg->arg_rd), err, &(res->res_rd), orig, base, &(di), dsp, 
                    143:                tk->tk_conn->cn_ctx == DS_CTX_QUIPU_DSP);
                    144:     break;
                    145: 
                    146:     case OP_COMPARE:
                    147:        dsa_ret = do_ds_compare(&(arg->arg_cm), err, &(res->res_cm), orig, base, &(di),dsp);
                    148:     break;
                    149: 
                    150:     case OP_ABANDON:
                    151:        LLOG(log_dsap, LLOG_FATAL, ("Abandon being applied!"));
                    152:        dsa_ret = do_ds_abandon(&(arg->arg_ab), err);
                    153:     break;
                    154: 
                    155:     case OP_LIST:
                    156:        dsa_ret = do_ds_list(&(arg->arg_ls), err, &(res->res_ls), orig, base, &(di),dsp);
                    157:     break;
                    158: 
                    159:     case OP_SEARCH:
                    160: 
                    161:        dsa_ret = do_ds_search(&(arg->arg_sr), err, &(res->res_sr), orig, base, 
                    162:                local, refer, &(di), dsp,
                    163:                tk->tk_conn->cn_ctx == DS_CTX_QUIPU_DSP,
                    164:                tk->tk_timed ? tk->tk_timeout : (time_t) 0,
                    165:                tk->tk_dx.dx_arg.dca_charg.cha_entryonly);
                    166:        
                    167:         search_continue (tk);
                    168: 
                    169:     break;
                    170: 
                    171:     case OP_ADDENTRY:
                    172:        dsa_ret = do_ds_addentry(&(arg->arg_ad), err, orig, base, &(di),dsp);
                    173:     break;
                    174: 
                    175:     case OP_REMOVEENTRY:
                    176:        dsa_ret = do_ds_removeentry(&(arg->arg_rm), err, orig, base, &(di),dsp);
                    177:     break;
                    178: 
                    179:     case OP_MODIFYENTRY:
                    180:        dsa_ret = do_ds_modifyentry(&(arg->arg_me), err, orig, base, &(di),dsp);
                    181:     break;
                    182: 
                    183:     case OP_MODIFYRDN:
                    184:        dsa_ret = do_ds_modifyrdn(&(arg->arg_mr), err, orig, base, &(di),dsp);
                    185:     break;
                    186: 
                    187:     case OP_GETEDB:
                    188:        dn_free(orig);
                    189:        orig = dn_cpy(tk->tk_conn->cn_dn);
                    190:        dsa_ret = do_get_edb (&(arg->arg_ge), err, &(res->res_ge), orig);
                    191:     break;
                    192: 
                    193:     default:
                    194:        LLOG (log_dsap,LLOG_EXCEPTIONS,( "Unknown operation type!"));
                    195:     break;
                    196:     }
                    197: 
                    198:     DLOG (log_dsap,LLOG_TRACE,( "Activity applied"));
                    199: 
                    200:     switch(dsa_ret)
                    201:     {
                    202:     case DS_OK:
                    203:        DLOG (log_dsap,LLOG_DEBUG,( "dsa_work - DS_OK"));
                    204:        /* Task completed successfully: send result */
                    205:        tk->tk_result = &(tk->tk_resp.di_result.dr_res);
                    206:        tk->tk_result->dcr_dsres.result_type = tk->tk_dx.dx_arg.dca_dsarg.arg_type;
                    207:        tk->tk_resp.di_type = DI_RESULT;
                    208: 
                    209:        if((tk->referred_st != NULL_ST) || (tk->tk_operlist != NULLOPER))
                    210:        {
                    211:            tk->tk_state = TK_PASSIVE;
                    212:            break; /* Go wait for operations to return */
                    213:        }
                    214:        tk->tk_resp.di_type = DI_RESULT;
                    215:        task_conn_extract(tk);
                    216:        task_result(tk);
                    217:        task_extract(tk);
                    218:        break;
                    219:     case DS_X500_ERROR:
                    220:        DLOG (log_dsap,LLOG_DEBUG,( "dsa_work - DS_X500_ERROR"));
                    221:        /* Task produced error: send error */
                    222:        tk->tk_resp.di_type = DI_RESULT;
                    223:        tk->tk_error = &(tk->tk_resp.di_error.de_err);
                    224:        task_conn_extract(tk);
                    225:        task_error(tk);
                    226:        if (tk->tk_dx.dx_arg.dca_dsarg.arg_type == OP_SEARCH) {
                    227:                free ((char *)tk->tk_resp.di_result.dr_res.dcr_dsres.res_sr.srr_un.srr_unit);
                    228:                free ((char *)tk->tk_resp.di_result.dr_res.dcr_dsres.res_sr.srr_next->srr_un.srr_unit);
                    229:                free ((char *)tk->tk_resp.di_result.dr_res.dcr_dsres.res_sr.srr_next);
                    230:        }
                    231:        task_extract(tk);
                    232:        break;
                    233:     case DS_CONTINUE:
                    234:        DLOG (log_dsap,LLOG_DEBUG,( "dsa_work - DS_CONTINUE"));
                    235: #ifdef DEBUG
                    236:        di_list_log(di);
                    237: #endif
                    238:        /* Task produced list of dsas: chain operation or send referral */
                    239:        if(task_chain(tk, di) != OK)
                    240:        {
                    241:            task_conn_extract(tk);
                    242:            task_error(tk);
                    243:            if (tk->tk_dx.dx_arg.dca_dsarg.arg_type == OP_SEARCH) {
                    244:                free ((char *)tk->tk_resp.di_result.dr_res.dcr_dsres.res_sr.srr_un.srr_unit);
                    245:                free ((char *)tk->tk_resp.di_result.dr_res.dcr_dsres.res_sr.srr_next->srr_un.srr_unit);
                    246:                free ((char *)tk->tk_resp.di_result.dr_res.dcr_dsres.res_sr.srr_next);
                    247:            }
                    248:            task_extract(tk);
                    249:        }
                    250:        else
                    251:                {
                    252:            tk->tk_state = TK_PASSIVE;
                    253:        }
                    254:        break;
                    255:     case DS_SUSPEND:
                    256:        DLOG (log_dsap,LLOG_DEBUG,( "dsa_work - DS_SUSPEND"));
                    257:        /* Task has suspended itself to check network and other tasks */
                    258:        if((tk->referred_st != NULL_ST) || (tk->tk_operlist != NULLOPER))
                    259:                /* doing things over the net - no need to hurry !!! */
                    260:                tk->tk_prio = DSA_PRIO_LOW;
                    261:        tk->tk_state = TK_SUSPEND;
                    262:        break;
                    263:     default:
                    264:        /* Local error */
                    265:        LLOG(log_dsap, LLOG_EXCEPTIONS, ("dsa_work - do_ds_OP() failed"));
                    266:        tk->tk_resp.di_error.de_err.dse_type = DSE_SERVICEERROR;
                    267:        tk->tk_resp.di_error.de_err.ERR_SERVICE.DSE_sv_problem = DSE_SV_DITERROR;
                    268:        task_conn_extract(tk);
                    269:        task_error(tk);
                    270:        if (tk->tk_dx.dx_arg.dca_dsarg.arg_type == OP_SEARCH) {
                    271:                free ((char *)tk->tk_resp.di_result.dr_res.dcr_dsres.res_sr.srr_un.srr_unit);
                    272:                free ((char *)tk->tk_resp.di_result.dr_res.dcr_dsres.res_sr.srr_next->srr_un.srr_unit);
                    273:                free ((char *)tk->tk_resp.di_result.dr_res.dcr_dsres.res_sr.srr_next);
                    274:        }
                    275:        task_extract(tk);
                    276:        break;
                    277:     }
                    278: 
                    279:     dn_free(orig);
                    280:     dn_free(base);
                    281: }
                    282: 
                    283: search_continue (tk)
                    284: struct task_act * tk;
                    285: {
                    286: struct ds_search_result * tk_sr = &(tk->tk_resp.di_result.dr_res.dcr_dsres.res_sr);
                    287: 
                    288:        /* Set up next part of search result to collate remote sub-searches */
                    289:        if(tk_sr->srr_next == NULLSRR)
                    290:        {
                    291:            DLOG(log_dsap, LLOG_DEBUG, ("Allocating a search result"));
                    292:            tk_sr->srr_next = (struct ds_search_result *) calloc(1, sizeof(struct ds_search_result));
                    293:            tk_sr->srr_next->srr_correlated = TRUE;
                    294:            tk_sr->srr_next->srr_un.srr_unit = (struct ds_search_unit *) calloc(1, sizeof(struct ds_search_unit));
                    295:            tk_sr->srr_next->CSR_limitproblem = LSR_NOLIMITPROBLEM;
                    296:        }
                    297: 
                    298:        /* Map any new elements in the refer list onto opers */
                    299:        subtask_chain(tk);
                    300: 
                    301:        if((tk->local_st != NULL_ST) && (tk->tk_state == TK_PASSIVE))
                    302:        {
                    303:            tk->tk_state = TK_ACTIVE;
                    304:        }
                    305: }
                    306: 
                    307: 
                    308: #ifndef NO_STATS
                    309: log_x500_event (arg,context,orig,dsptarget,ad)
                    310: struct DSArgument   *arg;
                    311: int context;
                    312: DN dsptarget,orig;
                    313: int ad;
                    314: {
                    315: extern LLog * log_stat;
                    316: char * op;
                    317: int dn_print ();
                    318: DN daptarget = NULLDN;
                    319: char buf [LINESIZE];
                    320: 
                    321:        switch (arg->arg_type) {
                    322:                case OP_READ:           op = "Read";            
                    323:                                        daptarget = arg->arg_rd.rda_object;
                    324:                                        break;
                    325:                case OP_COMPARE:        op = "Compare";         
                    326:                                        daptarget = arg->arg_cm.cma_object;
                    327:                                        break;
                    328:                case OP_ABANDON:        op = "Abandon";         break;
                    329:                case OP_LIST:           op = "List";            
                    330:                                        daptarget = arg->arg_ls.lsa_object;
                    331:                                        break;
                    332:                case OP_SEARCH:         op = "Search";          
                    333:                                        daptarget = arg->arg_sr.sra_baseobject;
                    334:                                        break;
                    335:                case OP_ADDENTRY:       op = "Add";     
                    336:                                        daptarget = arg->arg_ad.ada_object;
                    337:                                        break;
                    338:                case OP_REMOVEENTRY:    op = "Remove";  
                    339:                                        daptarget = arg->arg_rm.rma_object;
                    340:                                        break;
                    341:                case OP_MODIFYENTRY:    op = "Modify";  
                    342:                                        daptarget = arg->arg_me.mea_object;
                    343:                                        break;
                    344:                case OP_MODIFYRDN:      op = "Modifyrdn";       
                    345:                                        daptarget = arg->arg_mr.mra_object;
                    346:                                        break;
                    347:                case OP_GETEDB:         op = "Getedb";          
                    348:                                        if (dsptarget == NULLDN) {
                    349:                                                dsptarget = arg->arg_ge.ga_entry;
                    350:                                        }
                    351:                                        break;
                    352:                default:                op = "Unknown op";      break;
                    353:        }
                    354: 
                    355:        if (context == DS_CTX_X500_DAP) {
                    356:                (void) sprintf (buf,"%s (%d)",op,ad);
                    357:                        pslog (log_stat,LLOG_NOTICE,buf,dn_print,(caddr_t)daptarget);
                    358:        } else {
                    359:                (void) sprintf (buf,"%s (%d)",op,ad);
                    360:                pslog (log_stat,LLOG_NOTICE,buf,dn_print,(caddr_t)dsptarget);
                    361:                if (arg->arg_type != OP_GETEDB) {
                    362:                        pslog (log_stat,LLOG_TRACE,"DAP Originator",dn_print,(caddr_t)orig);
                    363:                }
                    364:        }
                    365: }
                    366: #endif

unix.superglobalmegacorp.com

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