From: Zdeněk Salvet Date: Fri, 17 Feb 2006 10:10:17 +0000 (+0000) Subject: Properly interpret return codes from get_reply_* routines X-Git-Tag: glite-lb-client_R_2_1_3~6 X-Git-Url: http://scientific.zcu.cz/git/?a=commitdiff_plain;h=cf87587cca3b3130fa6e84b5c449695a5a61c63f;p=jra1mw.git Properly interpret return codes from get_reply_* routines (errors were ignored), properly decode replies from LB proxy or LB server (when logging directly), use error codes from correct enum (LB_PROTO -> EDG_WLL_IL_PROTO). --- diff --git a/org.glite.lb.client/src/prod_proto.c b/org.glite.lb.client/src/prod_proto.c index 0eb6948..19822e6 100644 --- a/org.glite.lb.client/src/prod_proto.c +++ b/org.glite.lb.client/src/prod_proto.c @@ -81,7 +81,7 @@ plain_reader(void *user_data, char *buffer, int max_len) len = edg_wll_plain_read_full(data->conn, buffer, max_len, &data->ctx->p_tmp_timeout); if(len < 0) - edg_wll_SetError(data->ctx, LB_PROTO, "get_reply_plain(): error reading message data"); + edg_wll_SetError(data->ctx, EDG_WLL_IL_PROTO, "plain_reader(): error reading message data"); return(len); } @@ -96,23 +96,22 @@ plain_reader(void *user_data, char *buffer, int max_len) */ static int -get_reply_plain(edg_wll_Context context, edg_wll_PlainConnection *conn, char **buf, int *code_min) +get_reply_plain(edg_wll_Context context, edg_wll_PlainConnection *conn, char **buf, int *code_maj, int *code_min) { char *msg=NULL; - int len, code; + int len; struct reader_data data; data.ctx = context; data.conn = conn; - code = 0; len = read_il_data(&data, &msg, plain_reader); if(len < 0) { - edg_wll_SetError(context, LB_PROTO, "get_reply_plain(): error reading message"); + edg_wll_SetError(context, EDG_WLL_IL_PROTO, "get_reply_plain(): error reading message"); goto get_reply_plain_end; } - if(decode_il_reply(&code, code_min, buf, msg) < 0) { - edg_wll_SetError(context, LB_PROTO, "get_reply_plain(): error decoding message"); + if(decode_il_reply(code_maj, code_min, buf, msg) < 0) { + edg_wll_SetError(context, EDG_WLL_IL_PROTO, "get_reply_plain(): error decoding message"); goto get_reply_plain_end; } @@ -134,7 +133,7 @@ gss_reader(void *user_data, char *buffer, int max_len) &len, &gss_code); if(ret < 0) { edg_wll_log_proto_handle_gss_failures(data->ctx, ret, &gss_code, "edg_wll_gss_read_full"); - edg_wll_UpdateError(data->ctx, LB_PROTO, "get_reply_gss(): error reading message"); + edg_wll_UpdateError(data->ctx, EDG_WLL_IL_PROTO, "gss_reader(): error reading message"); } return(ret); @@ -143,7 +142,7 @@ gss_reader(void *user_data, char *buffer, int max_len) static int -get_reply_gss(edg_wll_Context context, edg_wll_GssConnection *conn, char **buf, int *code_min) +get_reply_gss(edg_wll_Context context, edg_wll_GssConnection *conn, char **buf, int *code_maj, int *code_min) { char *msg = NULL; int code; @@ -153,12 +152,12 @@ get_reply_gss(edg_wll_Context context, edg_wll_GssConnection *conn, char **buf, data.conn = conn; code = read_il_data(&data, &msg, gss_reader); if(code < 0) { - edg_wll_SetError(context, LB_PROTO, "get_reply_gss(): error reading reply"); + edg_wll_SetError(context, EDG_WLL_IL_PROTO, "get_reply_gss(): error reading reply"); goto get_reply_gss_end; } - if(decode_il_reply(&code, code_min, buf, msg) < 0) { - edg_wll_SetError(context, LB_PROTO, "get_reply_gss(): error decoding reply"); + if(decode_il_reply(code_maj, code_min, buf, msg) < 0) { + edg_wll_SetError(context, EDG_WLL_IL_PROTO, "get_reply_gss(): error decoding reply"); goto get_reply_gss_end; } @@ -282,9 +281,11 @@ int edg_wll_log_proto_client_proxy(edg_wll_Context context, edg_wll_PlainConnect static char et[256]; int err; int code; + int lbproto_code; int count; errno = err = code = count = 0; + lbproto_code = 0; edg_wll_ResetError(context); len = encode_il_msg(&buffer, logline); @@ -298,7 +299,7 @@ int edg_wll_log_proto_client_proxy(edg_wll_Context context, edg_wll_PlainConnect fprintf(stderr,"log_proto_client_proxy: sending message...\n"); #endif if (( count = edg_wll_plain_write_full(conn, buffer, len, &context->p_tmp_timeout)) < 0) { - edg_wll_SetError(context,LB_PROTO,"edg_wll_log_proto_client_proxy(): error sending message to socket"); + edg_wll_SetError(context, EDG_WLL_IL_PROTO,"edg_wll_log_proto_client_proxy(): error sending message to socket"); goto edg_wll_log_proto_client_proxy_end; } @@ -306,14 +307,28 @@ int edg_wll_log_proto_client_proxy(edg_wll_Context context, edg_wll_PlainConnect #ifdef EDG_WLL_LOG_STUB fprintf(stderr,"log_proto_client_proxy: reading answer from server...\n"); #endif - if ((err = get_reply_plain(context, conn, &answer, &code)) < 0 ) { - edg_wll_SetError(context,LB_PROTO,"edg_wll_log_proto_client_proxy(): error reading answer from L&B Proxy server"); + if ((err = get_reply_plain(context, conn, &answer, &lbproto_code, &code)) != 0 ) { + edg_wll_SetError(context, EDG_WLL_IL_PROTO,"edg_wll_log_proto_client_proxy(): error reading answer from L&B Proxy server"); } else { #ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"log_proto_client_proxy: read answer \"%d: %s\"\n",code,answer); + fprintf(stderr,"log_proto_client_proxy: read answer \"%d:%d: %s\"\n",lbproto_code,code,answer); #endif - snprintf(et, sizeof(et), "answer read from L&B Proxy server: %s", answer); - edg_wll_SetError(context,code,et); + switch (lbproto_code) { + case LB_OK: break; + case LB_NOMEM: + edg_wll_SetError(context, ENOMEM, "edg_wll_log_proto_client_proxy(): proxy out of memory"); + break; + case LB_PROTO: + edg_wll_SetError(context, EDG_WLL_IL_PROTO, "edg_wll_log_proto_client_proxy(): received protocol error response"); + break; + case LB_DBERR: + snprintf(et, sizeof(et), "error details from L&B Proxy server: %s", answer); + edg_wll_SetError(context, code, et); + break; + default: + edg_wll_SetError(context, EDG_WLL_IL_PROTO, "edg_wll_log_proto_client_proxy(): received unknown protocol response"); + break; + } } edg_wll_log_proto_client_proxy_end: @@ -341,7 +356,7 @@ int edg_wll_log_proto_client_direct(edg_wll_Context context, edg_wll_GssConnecti char *buffer,*answer = NULL; static char et[256]; int err; - int code; + int code, lbproto_code; int count; edg_wll_GssStatus gss_code; @@ -361,7 +376,7 @@ int edg_wll_log_proto_client_direct(edg_wll_Context context, edg_wll_GssConnecti count = 0; if (( err = edg_wll_gss_write_full(con, buffer, len, &context->p_tmp_timeout, &count, &gss_code)) < 0) { edg_wll_log_proto_handle_gss_failures(context,err,&gss_code,"edg_wll_gss_write_full()"); - edg_wll_UpdateError(context,LB_PROTO,"edg_wll_log_proto_client_direct(): error sending message"); + edg_wll_UpdateError(context, EDG_WLL_IL_PROTO,"edg_wll_log_proto_client_direct(): error sending message"); goto edg_wll_log_proto_client_direct_end; } @@ -369,14 +384,28 @@ int edg_wll_log_proto_client_direct(edg_wll_Context context, edg_wll_GssConnecti #ifdef EDG_WLL_LOG_STUB fprintf(stderr,"log_proto_client_direct: reading answer from server...\n"); #endif - if ((err = get_reply_gss(context, con, &answer, &code)) < 0 ) { - edg_wll_SetError(context,LB_PROTO,"edg_wll_log_proto_client_direct(): error reading answer from L&B direct server"); + if ((err = get_reply_gss(context, con, &answer, &lbproto_code, &code)) != 0 ) { + edg_wll_SetError(context, EDG_WLL_IL_PROTO,"edg_wll_log_proto_client_direct(): error reading answer from L&B direct server"); } else { #ifdef EDG_WLL_LOG_STUB - fprintf(stderr,"log_proto_client_direct: read answer \"%d: %s\"\n",code,answer); + fprintf(stderr,"log_proto_client_direct: read answer \"%d:%d: %s\"\n",lbproto_code,code,answer); #endif - snprintf(et, sizeof(et), "answer read from bkserver: %s", answer); - edg_wll_SetError(context,code,et); + switch (lbproto_code) { + case LB_OK: break; + case LB_NOMEM: + edg_wll_SetError(context, ENOMEM, "log_proto_client_direct(): server out of memory"); + break; + case LB_PROTO: + edg_wll_SetError(context, EDG_WLL_IL_PROTO, "log_proto_client_direct(): received protocol error response"); + break; + case LB_DBERR: + snprintf(et, sizeof(et), "error details from L&B server: %s", answer); + edg_wll_SetError(context, code, et); + break; + default: + edg_wll_SetError(context, EDG_WLL_IL_PROTO, "log_proto_client_direct(): received unknown protocol response"); + break; + } } edg_wll_log_proto_client_direct_end: