|
|
1.1 ! root 1: /* task_invoke.c - deal with invocation of an operation over a connection */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/quipu/RCS/task_invoke.c,v 7.0 89/11/23 22:18:13 mrose Rel $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/quipu/RCS/task_invoke.c,v 7.0 89/11/23 22:18:13 mrose Rel $ ! 9: * ! 10: * ! 11: * $Log: task_invoke.c,v $ ! 12: * Revision 7.0 89/11/23 22:18:13 mrose ! 13: * Release 6.0 ! 14: * ! 15: */ ! 16: ! 17: /* ! 18: * NOTICE ! 19: * ! 20: * Acquisition, use, and distribution of this module and related ! 21: * materials are subject to the restrictions of a license agreement. ! 22: * Consult the Preface in the User's Manual for the full terms of ! 23: * this agreement. ! 24: * ! 25: */ ! 26: ! 27: ! 28: /* LINTLIBRARY */ ! 29: ! 30: #include "rosap.h" ! 31: #include "quipu/util.h" ! 32: #include "quipu/connection.h" ! 33: ! 34: extern LLog * log_dsap; ! 35: extern time_t timenow; ! 36: extern time_t admin_time; ! 37: extern UTC str2utct(); ! 38: struct task_act * task_alloc(); ! 39: struct common_args * get_ca_ref(); ! 40: ! 41: int task_invoke(conn, dx) ! 42: register struct connection * conn; ! 43: register struct DSAPinvoke * dx; ! 44: { ! 45: time_t timer; ! 46: struct task_act * task; ! 47: struct extension * ext; ! 48: struct common_args * ca; ! 49: ! 50: DLOG(log_dsap, LLOG_TRACE, ("task_invoke()")); ! 51: ! 52: for(task=conn->cn_tasklist; task!=NULLTASK; task=task->tk_next) ! 53: if(task->tk_dx.dx_id == dx->dx_id) ! 54: break; ! 55: ! 56: if(task != NULLTASK) ! 57: { ! 58: DLOG(log_dsap, LLOG_TRACE, ("Duplicate invocation identifier %d", dx->dx_id)); ! 59: send_ro_ureject(conn->cn_ad, &(dx->dx_id), ROS_IP_DUP); ! 60: return(NOTOK); ! 61: } ! 62: ! 63: task = task_alloc(); ! 64: ! 65: DLOG(log_dsap, LLOG_TRACE, ("Operation Invoked")); ! 66: ! 67: task->tk_conn = conn; ! 68: task->tk_state = TK_ACTIVE; ! 69: task->tk_dx = (*dx); /* struct copy */ ! 70: ! 71: if(task->tk_dx.dx_arg.dca_dsarg.arg_type == OP_ABANDON) ! 72: { ! 73: DLOG(log_dsap, LLOG_NOTICE, ("Abandon received")); ! 74: #ifndef NO_STATS ! 75: log_x500_event (&(task->tk_dx.dx_arg.dca_dsarg),task->tk_conn->cn_ctx,NULLDN,NULLDN,task->tk_conn->cn_ad); ! 76: #endif ! 77: if(perform_abandon(task) == OK) ! 78: { ! 79: task_result(task); ! 80: } ! 81: else ! 82: { ! 83: task_error(task); ! 84: } ! 85: task_free(task); ! 86: return(OK); ! 87: } ! 88: ! 89: if(task->tk_dx.dx_arg.dca_dsarg.arg_type == OP_GETEDB) ! 90: { ! 91: DLOG(log_dsap, LLOG_TRACE, ("GetEDB received")); ! 92: task->tk_dx.dx_arg.dca_charg.cha_originator = dn_cpy(task->tk_conn->cn_dn); ! 93: } ! 94: ! 95: if((ca = get_ca_ref(&task->tk_dx.dx_arg)) != NULL_COMMONARG) ! 96: { ! 97: switch(ca->ca_servicecontrol.svc_prio) ! 98: { ! 99: case SVC_PRIO_LOW: ! 100: task->tk_prio = DSA_PRIO_LOW; ! 101: break; ! 102: case SVC_PRIO_MED: ! 103: task->tk_prio = DSA_PRIO_MED; ! 104: break; ! 105: case SVC_PRIO_HIGH: ! 106: task->tk_prio = DSA_PRIO_HIGH; ! 107: break; ! 108: default: ! 109: DLOG(log_dsap, LLOG_EXCEPTIONS, ("Impossibly svc_prio = %d", ! 110: ca->ca_servicecontrol.svc_prio)); ! 111: task->tk_prio = DSA_PRIO_LOW; ! 112: break; ! 113: } ! 114: ! 115: for(ext = ca->ca_extensions; ext!=NULLEXT; ext=ext->ext_next) ! 116: { ! 117: /* Check for unavailable critical extension */ ! 118: if(ext->ext_critical) ! 119: break; ! 120: } ! 121: ! 122: if(ext != NULLEXT) ! 123: { ! 124: task->tk_resp.di_type = DI_ERROR; ! 125: task->tk_resp.di_error.de_err.dse_type = DSE_SERVICEERROR; ! 126: task->tk_resp.di_error.de_err.dse_un.dse_un_service.DSE_sv_problem = DSE_SV_UNAVAILABLECRITICALEXTENSION; ! 127: task_error(task); ! 128: task_free(task); ! 129: return(NOTOK); ! 130: } ! 131: } ! 132: else ! 133: { ! 134: /* Logic warning: No common args => low prio */ ! 135: task->tk_prio = DSA_PRIO_LOW; ! 136: } ! 137: ! 138: /* Check for loop */ ! 139: if(conn->cn_ctx == DS_CTX_X500_DAP) ! 140: { ! 141: if(ca != NULL_COMMONARG) ! 142: { ! 143: if(ca->ca_servicecontrol.svc_timelimit == SVC_NOTIMELIMIT) ! 144: { ! 145: task->tk_timed = FALSE; ! 146: if ( ! manager (task->tk_conn->cn_dn)) ! 147: { ! 148: task->tk_timed = 2; ! 149: task->tk_timeout = timenow + admin_time; ! 150: } ! 151: } ! 152: else ! 153: { ! 154: task->tk_timed = TRUE; ! 155: if ((timer = ca->ca_servicecontrol.svc_timelimit) > admin_time) ! 156: { ! 157: if (! manager (task->tk_conn->cn_dn)) ! 158: { ! 159: task->tk_timed = 2; ! 160: timer = admin_time; ! 161: } ! 162: } ! 163: task->tk_timeout = timenow + timer; ! 164: } ! 165: #ifdef DEBUG ! 166: if (task->tk_timed) ! 167: DLOG(log_dsap, LLOG_DEBUG, ("CommonArgs timelimit is %d secs", task->tk_timeout - timenow)); ! 168: #endif ! 169: } ! 170: else ! 171: { ! 172: task->tk_timed = FALSE; ! 173: } ! 174: } ! 175: else ! 176: { ! 177: struct chain_arg * cha = &(task->tk_dx.dx_arg.dca_charg); ! 178: ! 179: if(cha_loopdetected(cha)) ! 180: { ! 181: task->tk_resp.di_type = DI_ERROR; ! 182: task->tk_resp.di_error.de_err.dse_type = DSE_SERVICEERROR; ! 183: task->tk_resp.di_error.de_err.dse_un.dse_un_service.DSE_sv_problem = DSE_SV_LOOPDETECT; ! 184: task_error(task); ! 185: task_free(task); ! 186: return(NOTOK); ! 187: } ! 188: ! 189: if(cha->cha_timelimit == NULLCP) ! 190: { ! 191: task->tk_timed = 2; ! 192: task->tk_timeout = timenow + admin_time; ! 193: ! 194: if(ca != NULL_COMMONARG) ! 195: { ! 196: if(ca->ca_servicecontrol.svc_timelimit != SVC_NOTIMELIMIT) ! 197: { ! 198: task->tk_timed = TRUE; ! 199: if (ca->ca_servicecontrol.svc_timelimit < admin_time) ! 200: { ! 201: task->tk_timeout = timenow + ca->ca_servicecontrol.svc_timelimit; ! 202: } ! 203: } ! 204: } ! 205: #ifdef DEBUG ! 206: if (task->tk_timed) ! 207: DLOG(log_dsap, LLOG_DEBUG, ("DSP CommonArgs timelimit is %d secs", task->tk_timeout - timenow)); ! 208: #endif ! 209: } ! 210: else ! 211: { ! 212: UTC ut; ! 213: ! 214: task->tk_timed = TRUE; ! 215: ut = str2utct(cha->cha_timelimit, 12); ! 216: task->tk_timeout = gtime(ut2tm(ut)); ! 217: timer = timenow; ! 218: if (task->tk_timeout - timer > admin_time) ! 219: { ! 220: /* DSP -> can't rely on manager() !!! */ ! 221: task->tk_timed = 2; ! 222: task->tk_timeout = timer + admin_time; ! 223: DLOG(log_dsap, LLOG_DEBUG, ("Chained timeout (limited) is %s", cha->cha_timelimit)); ! 224: } ! 225: else ! 226: { ! 227: DLOG(log_dsap, LLOG_DEBUG, ("Chained timeout is %s", cha->cha_timelimit)); ! 228: } ! 229: } ! 230: } ! 231: ! 232: if(task->tk_timed == FALSE) ! 233: { ! 234: DLOG(log_dsap, LLOG_TRACE, ("task has NO timelimit")); ! 235: } ! 236: #ifdef DEBUG ! 237: else ! 238: { ! 239: struct UTCtime ut; ! 240: struct UTCtime ut2; ! 241: ! 242: DLOG(log_dsap, LLOG_TRACE, ("inv task has timelimit of %ld", task->tk_timeout)); ! 243: tm2ut(gmtime(&(task->tk_timeout)), &ut); ! 244: DLOG(log_dsap, LLOG_DEBUG, ("converted timelimit = %s", utct2str(&(ut)))); ! 245: tm2ut(gmtime(&(timenow)), &ut2); ! 246: DLOG(log_dsap, LLOG_DEBUG, ("time now = %s", utct2str(&(ut2)))); ! 247: } ! 248: #endif ! 249: ! 250: task->tk_next = conn->cn_tasklist; ! 251: conn->cn_tasklist = task; ! 252: task->tk_state = TK_ACTIVE; ! 253: return(OK); ! 254: } ! 255:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.