|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.