Exemplo n.º 1
0
/*
 *----------------------------------------------------------------------
 *
 * 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;
	}
}
Exemplo n.º 2
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 */