/** * Returns TRUE if the connection and protocol test succeeded * otherwise FALSE. */ static int check_process_connection(Service_T s, Port_T p, char *report) { Socket_T socket; volatile int rv= TRUE; ASSERT(s && p); /* Open a socket to the destination INET[hostname:port] or UNIX[pathname] */ socket= socket_create(p); if(!socket) { snprintf(report, STRLEN, "'%s' failed, cannot open a connection to %s", s->name, p->address); rv= FALSE; goto error; } else { DEBUG("'%s' succeeded connecting to %s\n", s->name, p->address); } /* Verify that the socket is ready for i|o */ if(! socket_is_ready(socket)) { snprintf(report, STRLEN, "'%s' failed, the socket at %s is not ready for i|o -- %s", s->name, p->address, STRERROR); rv= FALSE; goto error; } /* Run the protocol verification routine through the socket */ if(! p->protocol->check(socket)) { snprintf(report, STRLEN, "'%s' failed protocol test [%s] at %s.", s->name, p->protocol->name, p->address); rv= FALSE; goto error; } else { DEBUG("'%s' succeeded testing protocol [%s] at %s\n", s->name, p->protocol->name, p->address); } error: if(socket) socket_free(&socket); return rv; }
/** * Test the connection and protocol */ static void check_connection(Service_T s, Port_T p) { Socket_T socket; volatile int rv = TRUE; char buf[STRLEN]; char report[STRLEN] = {0}; struct timeval t1; struct timeval t2; ASSERT(s && p); /* Get time of connection attempt beginning */ gettimeofday(&t1, NULL); /* Open a socket to the destination INET[hostname:port] or UNIX[pathname] */ socket = socket_create(p); if (!socket) { snprintf(report, STRLEN, "failed, cannot open a connection to %s", Util_portDescription(p, buf, sizeof(buf))); rv = FALSE; goto error; } else DEBUG("'%s' succeeded connecting to %s\n", s->name, Util_portDescription(p, buf, sizeof(buf))); /* Verify that the socket is ready for i|o. TCP sockets are checked anytime, UDP * sockets just when there is no specific protocol test used since the socket_is_ready() * adds 2s delay when used with UDP socket. When there is specific protocol used, we * don't need it for UDP, since the protocol test is sufficient */ if ((socket_get_type(socket) != SOCK_DGRAM || p->protocol->check == check_default) && !socket_is_ready(socket)) { snprintf(report, STRLEN, "connection failed, %s is not ready for i|o -- %s", Util_portDescription(p, buf, sizeof(buf)), STRERROR); rv = FALSE; goto error; } /* Run the protocol verification routine through the socket */ if (! p->protocol->check(socket)) { snprintf(report, STRLEN, "failed protocol test [%s] at %s", p->protocol->name, Util_portDescription(p, buf, sizeof(buf))); rv = FALSE; goto error; } else DEBUG("'%s' succeeded testing protocol [%s] at %s\n", s->name, p->protocol->name, Util_portDescription(p, buf, sizeof(buf))); /* Get time of connection attempt finish */ gettimeofday(&t2, NULL); /* Get the response time */ p->response = (double)(t2.tv_sec - t1.tv_sec) + (double)(t2.tv_usec - t1.tv_usec)/1000000; error: if (socket) socket_free(&socket); if (!rv) { p->response = -1; p->is_available = FALSE; Event_post(s, Event_Connection, STATE_FAILED, p->action, report); } else { p->is_available = TRUE; Event_post(s, Event_Connection, STATE_SUCCEEDED, p->action, "connection succeeded to %s", Util_portDescription(p, buf, sizeof(buf))); } }