/* *---------------------------------------------------------------------- * * send_answer_back - * *---------------------------------------------------------------------- */ static int send_answer_back(edg_wll_GssConnection *con, int answer, struct timeval *timeout) { size_t count = 0; int err = 0; int ans = answer; u_int8_t ans_end[4]; edg_wll_GssStatus gss_stat; ans_end[0] = ans & 0xff; ans >>= 8; ans_end[1] = ans & 0xff; ans >>= 8; ans_end[2] = ans & 0xff; ans >>= 8; ans_end[3] = ans; if ((err = edg_wll_gss_write_full(con,ans_end,4,timeout,&count, &gss_stat)) < 0 ) { glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_INFO,"Error sending answer \"%d\" back to client.\n",answer); return handle_gss_failures(err,&gss_stat,"Error sending answer"); } else { glite_common_log(LOG_CATEGORY_ACCESS,LOG_PRIORITY_DEBUG,"Answer \"%d\" succesfully sent back to client.\n",answer); return 0; } }
/* * Send all events from the queue. * Returns: -1 - system error, 0 - not send, 1 - queue empty */ int event_queue_send(struct event_queue *eq, struct queue_thread *me) { assert(eq != NULL); assert(me != NULL); #ifdef LB_PERF if(!nosend) { #endif if(me->gss.context == NULL) return(0); #ifdef LB_PERF } #endif /* feed the server with events */ while (!event_queue_empty(eq)) { struct server_msg *msg; char *rep; int ret, code, code_min; size_t bytes_sent; struct timeval tv; edg_wll_GssStatus gss_stat; clear_error(); if(event_queue_get(eq, me, &msg) == 0) return(1); glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, " trying to deliver event at offset %ld for job %s", msg->offset, msg->job_id_s); #ifdef LB_PERF if(!nosend) { #endif if (msg->len) { tv.tv_sec = TIMEOUT; tv.tv_usec = 0; ret = edg_wll_gss_write_full(&me->gss, msg->msg, msg->len, &tv, &bytes_sent, &gss_stat); if(ret < 0) { if (ret == EDG_WLL_GSS_ERROR_ERRNO && errno == EPIPE && me->first_event_sent ) me->timeout = 0; else me->timeout = TIMEOUT; server_msg_release(msg); return(0); } if((code = get_reply(eq, me, &rep, &code_min)) < 0) { /* could not get the reply properly, so try again later */ if (me->first_event_sent) { /* could be expected server connection preemption */ clear_error(); me->timeout = 1; } else { me->timeout = TIMEOUT; glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_WARN, " error reading server %s reply: %s", eq->dest_name, error_get_msg()); } server_msg_release(msg); return(0); } } else { code = LB_OK; code_min = 0; rep = strdup("not sending empty message"); } #ifdef LB_PERF } else { glite_wll_perftest_consumeEventIlMsg(msg->msg+17); code = LB_OK; rep = strdup("OK"); } #endif glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_DEBUG, " event sent, server %s replied with %d, %s", eq->dest_name, code, rep); free(rep); /* the reply is back here */ switch(code) { /* NOT USED: case LB_TIME: */ case LB_NOMEM: /* NOT USED: case LB_SYS: */ /* NOT USED: case LB_AUTH: */ case LB_DBERR: /* check minor code */ if(!(ENOENT == code_min)) { /* non fatal errors (for us) */ me->timeout = TIMEOUT; server_msg_release(msg); return(0); } case LB_OK: /* event 'successfully' delivered */ case LB_PERM: default: /* LB_PROTO */ /* the event was not accepted by the server */ /* update the event pointer */ if(event_store_commit(msg->es, msg->ev_len, queue_list_is_log(eq), msg->generation) < 0) { /* failure committing message, this is bad */ server_msg_release(msg); return(-1); } /* if we have just delivered priority message from the queue, send confirmation */ ret = 1; #if defined(INTERLOGD_EMS) if(server_msg_is_priority(msg) && ((ret=confirm_msg(msg, code, code_min)) < 0)) return(ret); #endif if((ret == 0) && (error_get_maj() != IL_OK)) glite_common_log(IL_LOG_CATEGORY, LOG_PRIORITY_ERROR, "send_event: %s", error_get_msg()); event_queue_remove(eq, me); me->first_event_sent = 1; eq->last_sent = time(NULL); break; } /* switch */ } /* while */ return(1); } /* send_events */