/** * Generic service test. * * @file */ void check_generic(Socket_T socket) { ASSERT(socket); Generic_T g = NULL; if (Socket_getPort(socket)) g = ((Port_T)(Socket_getPort(socket)))->parameters.generic.sendexpect; char *buf = CALLOC(sizeof(char), Run.limits.sendExpectBuffer + 1); while (g != NULL) { if (g->send != NULL) { /* Unescape any \0x00 escaped chars in g's send string to allow sending a string containing \0 bytes also */ char *X = Str_dup(g->send); int l = Util_handle0Escapes(X); if (Socket_write(socket, X, l) < 0) { FREE(X); FREE(buf); THROW(IOException, "GENERIC: error sending data -- %s", STRERROR); } else { DEBUG("GENERIC: successfully sent: '%s'\n", g->send); } FREE(X); } else if (g->expect != NULL) { /* Since the protocol is unknown we need to wait on EOF. To avoid waiting timeout seconds on EOF we first read one byte to fill the socket's read buffer and then set a low timeout on next read which reads remaining bytes as well as wait on EOF */ int first_byte = Socket_readByte(socket); if (first_byte < 0) { FREE(buf); THROW(IOException, "GENERIC: error receiving data -- %s", STRERROR); } *buf = first_byte; int timeout = Socket_getTimeout(socket); Socket_setTimeout(socket, 200); int n = Socket_read(socket, buf + 1, Run.limits.sendExpectBuffer - 1) + 1; buf[n] = 0; if (n > 0) _escapeZeroInExpectBuffer(buf, n); Socket_setTimeout(socket, timeout); // Reset back original timeout for next send/expect #ifdef HAVE_REGEX_H int regex_return = regexec(g->expect, buf, 0, NULL, 0); if (regex_return != 0) { char e[STRLEN]; regerror(regex_return, g->expect, e, STRLEN); FREE(buf); THROW(IOException, "GENERIC: received unexpected data -- %s", e); } else { DEBUG("GENERIC: successfully received: '%s'\n", Str_trunc(buf, STRLEN - 4)); } #else /* w/o regex support */ if (strncmp(buf, g->expect, strlen(g->expect)) != 0) { FREE(buf); THROW(IOException, "GENERIC: received unexpected data"); } else { DEBUG("GENERIC: successfully received: '%s'\n", Str_trunc(buf, STRLEN - 4)); } #endif } else { /* This should not happen */ FREE(buf); THROW(IOException, "GENERIC: unexpected strangeness"); } g = g->next; } FREE(buf); }
/** * Generic service test. * * @file */ int check_generic(Socket_T socket) { Generic_T g = NULL; char *buf; #ifdef HAVE_REGEX_H int regex_return; #endif ASSERT(socket); if(socket_get_Port(socket)) g = ((Port_T)(socket_get_Port(socket)))->generic; buf = CALLOC(sizeof(char), Run.expectbuffer + 1); while (g != NULL) { if (g->send != NULL) { /* Unescape any \0x00 escaped chars in g's send string to allow sending a string containing \0 bytes also */ char *X = Str_dup(g->send); int l = Util_handle0Escapes(X); if(socket_write(socket, X, l) < 0) { socket_setError(socket, "GENERIC: error sending data -- %s", STRERROR); FREE(X); FREE(buf); return FALSE; } else DEBUG("GENERIC: successfully sent: '%s'\n", g->send); FREE(X); } else if (g->expect != NULL) { int n; /* Need read, not readln here */ if((n = socket_read(socket, buf, Run.expectbuffer)) < 0) { socket_setError(socket, "GENERIC: error receiving data -- %s", STRERROR); FREE(buf); return FALSE; } buf[n] = 0; if (n > 0) _escapeZeroInExpectBuffer(buf, n); #ifdef HAVE_REGEX_H regex_return = regexec(g->expect, buf, 0, NULL, 0); if (regex_return != 0) { char e[STRLEN]; regerror(regex_return, g->expect, e, STRLEN); socket_setError(socket, "GENERIC: receiving unexpected data [%s] -- %s", Str_trunc(buf, STRLEN - 4), e); FREE(buf); return FALSE; } else DEBUG("GENERIC: successfully received: '%s'\n", Str_trunc(buf, STRLEN - 4)); #else /* w/o regex support */ if (strncmp(buf, g->expect, strlen(g->expect)) != 0) { socket_setError(socket, "GENERIC: receiving unexpected data [%s]", Str_trunc(buf, STRLEN - 4)); FREE(buf); return FALSE; } else DEBUG("GENERIC: successfully received: '%s'\n", Str_trunc(buf, STRLEN - 4)); #endif } else { /* This should not happen */ socket_setError(socket, "GENERIC: unexpected strangeness"); FREE(buf); return FALSE; } g = g->next; } FREE(buf); return TRUE; }