dapinvoke.c
来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 708 行 · 第 1/2 页
C
708 行
if(roi1->roi_error.roe_id == old_id) { /* Ferret error away for later */ result_roi = roi1; } else if(roi1->roi_error.roe_id == (old_id + 1)) { if (roi1->roi_error.roe_error != DSE_ABANDON_FAILED) { LLOG(log_dsap, LLOG_EXCEPTIONS, ("Failed to abandon correctly")); return(dapreject (di, DP_INVOKE, roi1->roi_error.roe_id, NULLCP, "Error mistyped for abandon")); } else { struct DSE_abandon_fail * af; if(decode_DAS_AbandonFailedParm (roi1->roi_error.roe_param, 1, NULLIP, NULLVP, &af) != OK) { LLOG(log_dsap, LLOG_EXCEPTIONS, ("Failed to decode abandonFailed")); return(dapreject (di, DP_INVOKE, old_id, NULLCP, "Abandon error decoding failed")); } else { LLOG(log_dsap, LLOG_NOTICE, ("Abandon failed error!!!")); ab_err.dse_un.dse_un_abandon_fail = *af; /* struct copy */ free ((char *)af); ab_err.dse_type = DSE_ABANDON_FAILED; log_ds_error(&ab_err); ds_error_free(&ab_err); } } } else { LLOG(log_dsap, LLOG_EXCEPTIONS, ("Abandon sent : event for neither op nor abandon op returned!!")); return(dapreject (di, DP_INVOKE, roi1->roi_error.roe_id, NULLCP, "Unrecognised op id")); } break; default: LLOG(log_dsap, LLOG_FATAL, ("Unexpected roi_type : %d", roi1->roi_type)); return(dapreject (di, DP_INVOKE, -1, NULLCP, "Unrecognised event")); } break; case NOTOK: ros_log(rop1, "RO-INVOKE.REQUEST"); if (ROS_FATAL (rop2->rop_reason)) { return (ros2daplose (di, "DapInterrupt", rop2)); } else { return (dapreject (di, DP_ROS, -1, NULLCP, "DapInterrupt: Non-fatal reject")); } case DONE: LLOG(log_dsap, LLOG_EXCEPTIONS, ("Responder has sent Finish!")); return(daplose (di, DP_ROS, NULLCP, "Received Finish")); default: LLOG(log_dsap, LLOG_FATAL, ("Unknown return from RoInvokeRequest : %d", ret1)); return(daplose (di, DP_ROS, NULLCP, "RoInvokeRequest error")); } ret2 = RoWaitRequest(sd, NOTOK, roi2); DLOG(log_dsap, LLOG_DEBUG, ("Abandon RoInvoke returns: %d", ret1)); switch(ret2) { case OK: /* What have we got? */ switch(roi2->roi_type) { case ROI_RESULT: if(roi2->roi_result.ror_id == old_id) { /* Ferret result away for later */ result_roi = roi2; } else if(roi2->roi_result.ror_id == (old_id + 1)) { RORFREE (&(roi2->roi_result)); } else { LLOG(log_dsap, LLOG_EXCEPTIONS, ("ARRGH! Abandon sent and event for neither op nor abandon op returned!!")); return(dapreject (di, DP_INVOKE, roi1->roi_result.ror_id, NULLCP, "Unexpected operation identifier")); } break; case ROI_ERROR:#ifdef PDU_DUMP pdu_dump (roi1->roi_error.roe_param,DUMP_ERR,op);#endif if(roi2->roi_error.roe_id == old_id) { /* Ferret error away for later */ result_roi = roi2; } else if(roi2->roi_error.roe_id == (old_id + 1)) { if (roi2->roi_error.roe_error != DSE_ABANDON_FAILED) { LLOG(log_dsap, LLOG_EXCEPTIONS, ("Failed to abandon correctly")); return(dapreject (di, DP_INVOKE, roi2->roi_error.roe_id, NULLCP, "Error mistyped for abandon")); } else { struct DSE_abandon_fail * af; if(decode_DAS_AbandonFailedParm (roi2->roi_error.roe_param, 1, NULLIP, NULLVP, &af) != OK) { LLOG(log_dsap, LLOG_EXCEPTIONS, ("Failed to decode abandonFailed")); return(dapreject (di, DP_INVOKE, old_id, NULLCP, "Abandon error decoding failed")); } else { LLOG(log_dsap, LLOG_NOTICE, ("Abandon failed error!!!")); ab_err.dse_un.dse_un_abandon_fail = *af; /*struct copy */ free ((char *) af); ab_err.dse_type = DSE_ABANDON_FAILED; log_ds_error(&ab_err); ds_error_free(&ab_err); } } } else { LLOG(log_dsap, LLOG_EXCEPTIONS, ("Abandon sent : event for neither op nor abandon op returned!!")); return(dapreject (di, DP_INVOKE, roi1->roi_error.roe_id, NULLCP, "Unrecognised op id")); } break; default: LLOG(log_dsap, LLOG_FATAL, ("Unexpected roi_type : %d", roi2->roi_type)); return(dapreject (di, DP_INVOKE, -1, NULLCP, "Unrecognised event")); } break; case NOTOK: ros_log(rop2, "RO-WAIT.REQUEST (Abandon)"); if (ROS_FATAL (rop1->rop_reason)) { return (ros2daplose (di, "DapInterrupt", rop2)); } else { return (dapreject (di, DP_ROS, -1, NULLCP, "DapInterrupt: Non-fatal reject")); } case DONE: LLOG(log_dsap, LLOG_EXCEPTIONS, ("Responder has sent Finish!")); return(daplose (di, DP_ROS, NULLCP, "Received Finish")); default: LLOG(log_dsap, LLOG_FATAL, ("Unknown return from RoInvokeRequest : %d", ret2)); return(daplose (di, DP_ROS, NULLCP, "RoInvokeRequest error")); } } switch(result_roi->roi_type) { case ROI_RESULT: return (DapDecodeResult (sd, &(result_roi->roi_result), di)); case ROI_ERROR: return (DapDecodeError (sd, &(result_roi->roi_error), di)); default: return (dapreject (di, DP_ROS, old_id, NULLCP, "DapInterrupt erroneous")); }}#ifdef PDU_DUMPstatic int pdu_count = -1;static char * pdu_dir = NULLCP;pdu_dump_init (dir)char * dir;{ pdu_count = 0; pdu_dir = strdup (dir); LLOG (log_dsap, LLOG_NOTICE, ("PDU Tracing enabled - %s",dir)); (void) mkdir (pdu_dir,0755);}pdu_dump (pe,type,op)PE pe;char * type;int op;{char filename [BUFSIZE];char * oper;PS ps;FILE * fptr; if ( pdu_count == -1) return; if (strcmp (type,DUMP_ARG) == 0) pdu_count++; switch (op) { case OP_READ: oper = "read"; break; case OP_COMPARE: oper = "compare"; break; case OP_ABANDON: /* Humm ... */ oper = "abandon"; break; case OP_LIST: oper = "list"; break; case OP_SEARCH: oper = "search"; break; case OP_ADDENTRY: oper = "add"; break; case OP_REMOVEENTRY: oper = "remove"; break; case OP_MODIFYENTRY: oper = "modify"; break; case OP_MODIFYRDN: oper = "modifyrdn"; break; case OP_GETEDB: oper = "getedb"; break; case 100: /* special case for bind */ oper = "bind"; break; } if (strcmp (type,DUMP_ERR) == 0) oper = "oper"; (void) sprintf (filename, "%s/%s_%s.%d",pdu_dir,oper,type,pdu_count); DLOG (log_dsap,LLOG_DEBUG,("Writing PDU to file %s",filename)); if ((fptr = fopen (filename,"w")) == (FILE *) NULL) { LLOG(log_dsap,LLOG_EXCEPTIONS,("Cant open PDU file %s",filename)); return; } ps = ps_alloc (std_open); if (std_setup (ps,fptr) != OK) { (void) fclose (fptr); return; } (void) pe2pl (ps,pe); (void) fclose (fptr); ps_free (ps);}#endif#ifdef HEAVY_DEBUGpdu_arg_log (pe,op)PE pe;int op;{ /* PDU Level Logging */ switch (op) { case OP_READ: PLOG (log_dsap, print_DAS_ReadArgument, pe, "Read", 0); break; case OP_COMPARE: PLOG (log_dsap, print_DAS_CompareArgument, pe, "Compare", 0); break; case OP_ABANDON: PLOG (log_dsap, print_DAS_AbandonArgument, pe, "Abandon", 0); break; case OP_LIST: PLOG (log_dsap, print_DAS_ListArgument, pe, "List", 0); break; case OP_SEARCH: PLOG (log_dsap, print_DAS_SearchArgument, pe, "Search", 0); break; case OP_ADDENTRY: PLOG (log_dsap, print_DAS_AddEntryArgument, pe, "AddEntry", 0); break; case OP_REMOVEENTRY: PLOG (log_dsap, print_DAS_RemoveEntryArgument, pe, "RemoveEntry", 0); break; case OP_MODIFYENTRY: PLOG (log_dsap, print_DAS_ModifyEntryArgument, pe, "ModifyEntry", 0); break; case OP_MODIFYRDN: PLOG (log_dsap, print_DAS_ModifyRDNArgument, pe, "ModifyRDN", 0); break; case OP_GETEDB: PLOG (log_dsap, print_Quipu_GetEntryDataBlockArgument, pe, "GetEDB", 0); break; default: LLOG (log_dsap, LLOG_PDUS, ("Unknown operation (%d) - no argument PDU logged",op)); }}pdu_res_log (pe, op)PE pe;int op;{ /* PDU Level Logging */ switch (op) { case OP_READ: PLOG (log_dsap, print_DAS_ReadResult, pe, "Read", 1); break; case OP_COMPARE: PLOG (log_dsap, print_DAS_CompareResult, pe, "Compare", 1); break; case OP_ABANDON: PLOG (log_dsap, print_DAS_AbandonResult, pe, "Abandon", 1); break; case OP_LIST: PLOG (log_dsap, print_DAS_ListResult, pe, "List", 1); break; case OP_SEARCH: PLOG (log_dsap, print_DAS_SearchResult, pe, "Search", 1); break; case OP_ADDENTRY: PLOG (log_dsap, print_DAS_AddEntryResult, pe, "AddEntry", 1); break; case OP_REMOVEENTRY: PLOG (log_dsap, print_DAS_RemoveEntryResult, pe, "RemoveEntry",1); break; case OP_MODIFYENTRY: PLOG (log_dsap, print_DAS_ModifyEntryResult, pe, "ModifyEntry",1); break; case OP_MODIFYRDN: PLOG (log_dsap, print_DAS_ModifyRDNResult, pe, "ModifyRDN", 1); break; case OP_GETEDB: PLOG (log_dsap, print_Quipu_GetEntryDataBlockResult, pe, "GetEDB", 1); break; default: LLOG (log_dsap, LLOG_PDUS, ("Unknown operation (%d) - no result PDU logged",op)); }}#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?