From e050a0590554d9db4fc00ce0b8bb084eebecf847 Mon Sep 17 00:00:00 2001 From: alexhudson Date: Mon, 3 Sep 2007 10:45:36 +0000 Subject: [PATCH] Remove connio code from the header files. Good grief, it's now debuggable! --- include/Bongo.rules | 1 + include/connio-trace.h | 46 ++++++ include/connio.h | 321 +----------------------------------- src/libs/connio/Bongo.rules | 1 + src/libs/connio/connio.c | 115 ++++++------- src/libs/connio/sockets.c | 155 +++++++++++++++++ src/libs/nmap/nmap.c | 6 +- 7 files changed, 273 insertions(+), 372 deletions(-) create mode 100644 include/connio-trace.h create mode 100644 src/libs/connio/sockets.c diff --git a/include/Bongo.rules b/include/Bongo.rules index 0d8067a..906b1eb 100644 --- a/include/Bongo.rules +++ b/include/Bongo.rules @@ -5,6 +5,7 @@ bongoinclude_HEADERS = \ include/bongo-config.h \ include/calcmd.h \ include/connio.h \ + include/connio-trace.h \ include/bongocal.h \ include/bongocheck.h \ include/bongojson.h \ diff --git a/include/connio-trace.h b/include/connio-trace.h new file mode 100644 index 0000000..3b09db8 --- /dev/null +++ b/include/connio-trace.h @@ -0,0 +1,46 @@ + +#if !defined(_BONGO_CONN_TRACE) + +#define CONN_TRACE_GET_FLAGS() 0 +#define CONN_TRACE_SET_FLAGS(f) +#define CONN_TRACE_INIT(p, n) +#define CONN_TRACE_SHUTDOWN() +#define CONN_TRACE_CREATE_DESTINATION(t) NULL +#define CONN_TRACE_FREE_DESTINATION(d) +#define CONN_TRACE_BEGIN(c, t, d) +#define CONN_TRACE_END(c) +#define CONN_TRACE_EVENT(c, t) +#define CONN_TRACE_ERROR(c, e, l) +#define CONN_TRACE_DATA(c, t, b, l) +#define CONN_TRACE_DATA_AND_ERROR(c, t, b, l, e) + +#else + +void ConnTraceSetFlags(unsigned long flags); +unsigned long ConnTraceGetFlags(void); +void ConnTraceInit(char *path, char *name); +void ConnTraceShutdown(void); +TraceDestination *ConnTraceCreatePersistentDestination(unsigned char type); +void ConnTraceFreeDestination(TraceDestination *destination); +void ConnTraceBegin(Connection *c, unsigned long type, TraceDestination *destination); +void ConnTraceEnd(Connection *c); +void ConnTraceEvent(Connection *c, unsigned long event, char *buffer, long len); + +#define CONN_TRACE_GET_FLAGS() ConnTraceGetFlags() +#define CONN_TRACE_SET_FLAGS(f) ConnTraceSetFlags(f) +#define CONN_TRACE_INIT(p, n) ConnTraceInit(p, n) +#define CONN_TRACE_SHUTDOWN() ConnTraceShutdown() +#define CONN_TRACE_CREATE_DESTINATION(t) ConnTraceCreatePersistentDestination(t) +#define CONN_TRACE_FREE_DESTINATION(d) ConnTraceFreeDestination(d) +#define CONN_TRACE_BEGIN(c, t, d) ConnTraceBegin((c), (t), (d)) +#define CONN_TRACE_END(c) ConnTraceEnd((c)) +#define CONN_TRACE_EVENT(c, t) ConnTraceEvent((c), (t), NULL, 0) +#define CONN_TRACE_ERROR(c, e, l) ConnTraceEvent((c), CONN_TRACE_EVENT_ERROR, (e), (l)) +#define CONN_TRACE_DATA(c, t, b, l) ConnTraceEvent((c), (t), (b), (l)) +#define CONN_TRACE_DATA_AND_ERROR(c, t, b, l, e) if ((l) > 0) { \ + ConnTraceEvent((c), (t), (b), (l)); \ + } else { \ + ConnTraceEvent((c), CONN_TRACE_EVENT_ERROR, (e), (l)); \ + } + +#endif diff --git a/include/connio.h b/include/connio.h index ebb2eed..72b22d6 100644 --- a/include/connio.h +++ b/include/connio.h @@ -82,30 +82,8 @@ typedef struct { #define SSL_DISABLE_EMPTY_FRAGMENTS (1 << 4) #define SSL_DONT_INSERT_EMPTY_FRAGMENTS (1 << 5) -#define CHOP_NEWLINE(s) \ - { unsigned char *p; p = strchr((s), 0x0A); \ - if (p) { \ - *p = '\0'; \ - } \ - p = strrchr((s), 0x0D); \ - if (p) { \ - *p = '\0'; \ - } \ - } - -#define SET_POINTER_TO_VALUE(p,s) \ - { (p) = (s); \ - while(isspace(*(p))) { \ - (p)++; \ - } \ - if ((*(p) == '=') || (*(p) == ':')) { \ - (p)++; \ - } \ - while(isspace(*(p))) { \ - (p)++; \ - } \ - } - +void CHOP_NEWLINE(unsigned char *s); +void SET_POINTER_TO_VALUE(unsigned char *p, unsigned char *s); // FIXME: Unused? #if defined(_BONGO_LINUX) || defined(S390RH) || defined(SOLARIS) @@ -134,287 +112,12 @@ typedef struct { #define IPgetsockname(s, a, l) getsockname((s), (a), (l)) #define IPgetpeername(s, a, l) getpeername((s), (a), (l)) -#define CONN_TCP_READ(c, b, l, r) \ - { \ - struct pollfd pfd; \ - do { \ - pfd.fd = (int)(c)->socket; \ - pfd.events = POLLIN; \ - (r) = poll(&pfd, 1, (c)->receive.timeOut * 1000); \ - if ((r) > 0) { \ - if ((pfd.revents & (POLLIN | POLLPRI))) { \ - do { \ - (r) = IPrecv((c)->socket, b, l, 0); \ - if ((r) >= 0) { \ - CONN_TRACE_DATA((c), CONN_TRACE_EVENT_READ, (b), (r)); \ - break; \ - } else if (errno == EINTR) { \ - continue; \ - } \ - CONN_TRACE_ERROR((c), "RECV", (r)); \ - (r) = -1; \ - break; \ - } while (TRUE); \ - break; \ - } else if ((pfd.revents & (POLLERR | POLLHUP | POLLNVAL))) { \ - CONN_TRACE_ERROR((c), "POLL EVENT", (r)); \ - (r) = -1; \ - break; \ - } \ - } \ - if (errno == EINTR) { \ - continue; \ - } \ - CONN_TRACE_ERROR((c), "POLL", (r)); \ - (r) = -1; \ - break; \ - } while (TRUE); \ - } - -#define CONN_TCP_WRITE(c, b, l, r) \ - { \ - do { \ - (r) = IPsend((c)->socket, b, l, MSG_NOSIGNAL); \ - if ((r) >= 0) { \ - CONN_TRACE_DATA((c), CONN_TRACE_EVENT_WRITE, (b), (r)); \ - break; \ - } else if (errno == EINTR) { \ - continue; \ - } \ - CONN_TRACE_ERROR((c), "POLL", (r)); \ - (r) = -1; \ - break; \ - } while (TRUE); \ - } - -#elif defined(LIBC) || defined(NETWARE) || defined(WIN32) - -#ifdef WIN32 -typedef int socklen_t; -typedef unsigned int in_addr_t; -#define ETIMEDOUT WSAETIMEDOUT -#define ECONNREFUSED WSAECONNREFUSED -#define ENETUNREACH WSAENETUNREACH -#endif - -#define ConnSockOpt(c, o, v, p, l) setsockopt((c)->socket, (o), (v), (p), (l)) - -#define IPSOCKET SOCKET -#define IPInit() {WSADATA data; WSAStartup(MAKEWORD(1,1), &data);} - -#define IPCleanup() WSACleanup(); -#define IPsocket(domain, type, protocol) socket(domain, type, protocol) -#define IPaccept(s, addr, addrlen) accept(s, addr, addrlen) -#define IPlisten(sock, backlog) listen(sock, backlog) -#define IPbind(sock, addr, addrlen) bind(sock, addr, addrlen) -#define IPconnect(sock, addr, addrlen) connect(sock, addr, addrlen) -#define IPrecv(sock, buf, len, flags) recv(sock, buf, len, flags) -#define IPsend(sock, buf, len, flags) send(sock, buf, len, flags) -#define IPclose(sock) closesocket(sock) -#define IPshutdown(s, how) shutdown(s, how) -#define IPgetsockname(s, addr, addrlen) getsockname(s, addr, addrlen) -#define IPgetpeername(s, addr, addrlen) getpeername(s, addr, addrlen) -#define IPselect(nfds, rfds, wfds, efds, t) select(nfds, rfds, wfds, efds, t) - -#define CONN_TCP_READ(c, b, l, r) \ - { \ - fd_set rfds; \ - struct timeval timeout; \ - FD_ZERO(&rfds); \ - FD_SET((c)->socket, &rfds); \ - timeout.tv_usec = 0; \ - timeout.tv_sec = (c)->receive.timeOut; \ - (r) = select(FD_SETSIZE, &rfds, NULL, NULL, &timeout); \ - if ((r) > 0) { \ - (r) = IPrecv((c)->socket, (b), (l), 0); \ - CONN_TRACE_DATA_AND_ERROR((c), CONN_TRACE_EVENT_READ, (b), (r), "RECV"); \ - } else { \ - CONN_TRACE_ERROR((c), "SELECT", (r)); \ - (r) = -1; \ - } \ - } - -#define CONN_TCP_WRITE(c, b, l, r) \ - (r) = IPsend((c)->socket, (b), (l), 0); \ - CONN_TRACE_DATA_AND_ERROR((c), CONN_TRACE_EVENT_WRITE, (b), (r), "SEND"); - #else #error Connection management library not implemented on this platform. #endif -#define CONN_TCP_SEND(c, b, l, r) \ - { \ - if (!(c)->ssl.enable) { \ - CONN_TCP_WRITE((c), (b), (l), (r)); \ - } else { \ - CONN_SSL_WRITE((c), (b), (l), (r)); \ - } \ - } - -#define CONN_TCP_RECEIVE(c, b, l, r) \ - { \ - if (!(c)->ssl.enable) { \ - CONN_TCP_READ((c), (b), (l), (r)); \ - } else { \ - CONN_SSL_READ((c), (b), (l), (r)); \ - } \ - } - -#define CONN_TCP_FLUSH(c, b, e, r) \ - { \ - if ((b) < (e)) { \ - register char *curPTR = (char *)(b); \ - if (!(c)->ssl.enable) { \ - while (curPTR < (e)) { \ - CONN_TCP_WRITE((c), curPTR, (e) - curPTR, (r)); \ - if ((r) > 0) { \ - curPTR += (r); \ - continue; \ - } \ - break; \ - } \ - } else { \ - while (curPTR < (e)) { \ - CONN_SSL_WRITE((c), curPTR, (e) - curPTR, (r)); \ - if ((r) > 0) { \ - curPTR += (r); \ - continue; \ - } \ - break; \ - } \ - } \ - if (curPTR == (e)) { \ - (r) = (e) - (b); \ - } else { \ - (r) = -1; \ - } \ - } else { \ - (r) = 0; \ - } \ - } - -#define CONN_TCP_CLOSE(c) \ - { \ - if ((c)->receive.buffer) { \ - (c)->receive.remaining = CONN_TCP_MTU; \ - } else { \ - (c)->receive.remaining = 0; \ - } \ - (c)->receive.read = (c)->receive.write = (c)->receive.buffer; \ - if ((c)->send.buffer) { \ - ConnFlush(c); \ - (c)->send.remaining = CONN_TCP_MTU; \ - } else { \ - (c)->send.remaining = 0; \ - } \ - (c)->send.read = (c)->send.write = (c)->send.buffer; \ - if ((c)->ssl.enable) { \ - gnutls_bye((c)->ssl.context, GNUTLS_SHUT_RDWR); \ - gnutls_deinit((c)->ssl.context); \ - (c)->ssl.context = NULL; \ - (c)->ssl.enable = FALSE; \ - } \ - if ((c)->socket != -1) { \ - IPshutdown((c)->socket, 2); \ - IPclose((c)->socket); \ - (c)->socket = -1; \ - } \ - } - -#define CONN_SSL_NEW(c, s) \ - { \ - (c)->ssl.context = __gnutls_new(s); \ - if ((c)->ssl.context) \ - (c)->ssl.enable = TRUE; \ - } else { \ - (c)->ssl.context = NULL; \ - (c)->ssl.enable = FALSE; \ - } \ - } - -#define CONN_SSL_FREE(c) \ - { \ - if ((c)->ssl.enable) { \ - gnutls_deinit((c)->ssl.context); \ - (c)->ssl.context = NULL; \ - (c)->ssl.enable = FALSE; \ - } \ - } - -#define CONN_SSL_ACCEPT(c, s) \ - { \ - (c)->ssl.context = __gnutls_new(s); \ - if ((c)->ssl.context \ - && (gnutls_handshake((c)->ssl.context) == 0)) { \ - (c)->ssl.enable = TRUE; \ - } else { \ - if ((c)->ssl.context) { \ - gnutls_deinit((c)->ssl.context); \ - (c)->ssl.context = NULL; \ - } \ - (c)->ssl.enable = FALSE; \ - } \ - } - -#define CONN_SSL_CONNECT(c, s, r) \ - { \ - (c)->ssl.context = __gnutls_new(s); \ - if ((c)->ssl.context \ - && (gnutls_handshake((c)->ssl.context) == 0)) { \ - (c)->ssl.enable = TRUE; \ - } else { \ - if ((c)->ssl.context) { \ - gnutls_deinit((c)->ssl.context); \ - (c)->ssl.context = NULL; \ - } \ - (c)->ssl.enable = FALSE; \ - } \ - } - -#if !defined(_BONGO_CONN_TRACE) - -#define CONN_TRACE_GET_FLAGS() 0 -#define CONN_TRACE_SET_FLAGS(f) -#define CONN_TRACE_INIT(p, n) -#define CONN_TRACE_SHUTDOWN() -#define CONN_TRACE_CREATE_DESTINATION(t) NULL -#define CONN_TRACE_FREE_DESTINATION(d) -#define CONN_TRACE_BEGIN(c, t, d) -#define CONN_TRACE_END(c) -#define CONN_TRACE_EVENT(c, t) -#define CONN_TRACE_ERROR(c, e, l) -#define CONN_TRACE_DATA(c, t, b, l) -#define CONN_TRACE_DATA_AND_ERROR(c, t, b, l, e) - -#else - -#define CONN_TRACE_GET_FLAGS() ConnTraceGetFlags() -#define CONN_TRACE_SET_FLAGS(f) ConnTraceSetFlags(f) -#define CONN_TRACE_INIT(p, n) ConnTraceInit(p, n) -#define CONN_TRACE_SHUTDOWN() ConnTraceShutdown() -#define CONN_TRACE_CREATE_DESTINATION(t) ConnTraceCreatePersistentDestination(t) -#define CONN_TRACE_FREE_DESTINATION(d) ConnTraceFreeDestination(d) -#define CONN_TRACE_BEGIN(c, t, d) ConnTraceBegin((c), (t), (d)) -#define CONN_TRACE_END(c) ConnTraceEnd((c)) -#define CONN_TRACE_EVENT(c, t) ConnTraceEvent((c), (t), NULL, 0) -#define CONN_TRACE_ERROR(c, e, l) ConnTraceEvent((c), CONN_TRACE_EVENT_ERROR, (e), (l)) -#define CONN_TRACE_DATA(c, t, b, l) ConnTraceEvent((c), (t), (b), (l)) -#define CONN_TRACE_DATA_AND_ERROR(c, t, b, l, e) if ((l) > 0) { \ - ConnTraceEvent((c), (t), (b), (l)); \ - } else { \ - ConnTraceEvent((c), CONN_TRACE_EVENT_ERROR, (e), (l)); \ - } - -#endif - -#define CONN_SSL_READ(c, b, l, r) (r) = gnutls_record_recv((c)->ssl.context, (void *)(b), (l)); \ - CONN_TRACE_DATA_AND_ERROR((c), CONN_TRACE_EVENT_READ, (b), (r), "SSL_READ"); - -#define CONN_SSL_WRITE(c, b, l, r) (r) = gnutls_record_send((c)->ssl.context, (void *)(b), (l)); \ - CONN_TRACE_DATA_AND_ERROR((c), CONN_TRACE_EVENT_WRITE, (b), (r), "SSL_WRITE"); - typedef struct _ConnectionBuffer { char *read; char *write; @@ -523,6 +226,13 @@ typedef struct { unsigned long initialized; } AddressPool; +#include + +void ConnTcpWrite(Connection *c, char *b, unsigned int l, unsigned int *r); +void ConnTcpRead(Connection *c, char *b, unsigned int l, unsigned int *r); +void ConnTcpFlush(Connection *c, char *b, char *e, unsigned int *r); +void ConnTcpClose(Connection *c); + void ConnAddressPoolStartup(AddressPool *pool, unsigned long errorThreshold, unsigned long errorTimeThreshold); void ConnAddressPoolShutdown(AddressPool *pool); BOOL ConnAddressPoolAddHost(AddressPool *pool, char *hostName, unsigned short hostPort, unsigned long weight); @@ -576,23 +286,10 @@ int ConnWriteFile(Connection *Conn, FILE *Source); int ConnWriteFromFile(Connection *Conn, FILE *Source, int Count); #define ConnWriteStr(conn, mesg) ConnWrite(conn, mesg, strlen(mesg)) - int ConnFlush(Connection *Conn); BOOL ConnTraceAvailable(void); -#if defined(_BONGO_CONN_TRACE) -void ConnTraceSetFlags(unsigned long flags); -unsigned long ConnTraceGetFlags(void); -void ConnTraceInit(char *path, char *name); -void ConnTraceShutdown(void); -TraceDestination *ConnTraceCreatePersistentDestination(unsigned char type); -void ConnTraceFreeDestination(TraceDestination *destination); -void ConnTraceBegin(Connection *c, unsigned long type, TraceDestination *destination); -void ConnTraceEnd(Connection *c); -void ConnTraceEvent(Connection *c, unsigned long event, char *buffer, long len); -#endif - /* fixme - to be deprecated */ #define XPLNETDB_DEFINE_CONTEXT diff --git a/src/libs/connio/Bongo.rules b/src/libs/connio/Bongo.rules index a867b23..57921c8 100644 --- a/src/libs/connio/Bongo.rules +++ b/src/libs/connio/Bongo.rules @@ -6,6 +6,7 @@ libbongoconnio_la_SOURCES = \ src/libs/connio/trace.c \ src/libs/connio/conniop.h \ src/libs/connio/addrpool.c \ + src/libs/connio/sockets.c \ src/libs/connio/unix-ip.c libbongoconnio_la_LIBADD = $(GNUTLS_LIBS) diff --git a/src/libs/connio/connio.c b/src/libs/connio/connio.c index 37832d6..3c87c84 100644 --- a/src/libs/connio/connio.c +++ b/src/libs/connio/connio.c @@ -482,7 +482,8 @@ ConnClose(Connection *Conn, unsigned long Flags) CONN_TRACE_EVENT(Conn, CONN_TRACE_EVENT_CLOSE); CONN_TRACE_END(c); - CONN_TCP_CLOSE(c); + + ConnTcpClose(c); return(0); } @@ -497,7 +498,7 @@ ConnCloseAll(unsigned long Flags) c = ConnIO.allocated.head; while (c) { if (!c->bSelfManage) { - CONN_TCP_CLOSE(c); + ConnTcpClose(c); } c = c->allocated.next; @@ -518,7 +519,7 @@ ConnFree(Connection *Conn) } if (c->socket != -1) { - CONN_TCP_CLOSE(c); + ConnTcpClose(c); } if (c->receive.buffer) { @@ -561,7 +562,7 @@ ConnShutdown(void) ConnIO.allocated.head = NULL; while (c != NULL) { - CONN_TCP_CLOSE(c); + ConnTcpClose(c); if (c->receive.buffer) { MemFree(c->receive.buffer); @@ -624,9 +625,9 @@ int ConnAccept(Connection *Server, Connection **Client) int ConnSend(Connection *Conn, char *Buffer, unsigned int Length) { - register int count; + int count; - CONN_TCP_SEND(Conn, Buffer, Length, count); + ConnTcpWrite(Conn, Buffer, Length, &count); return(count); } @@ -634,9 +635,9 @@ ConnSend(Connection *Conn, char *Buffer, unsigned int Length) int ConnReceive(Connection *Conn, char *Buffer, unsigned int Length) { - register int count; + int count; - CONN_TCP_RECEIVE(Conn, Buffer, Length, count); + ConnTcpRead(Conn, Buffer, Length, &count); return(count); } @@ -654,8 +655,8 @@ ConnReceive(Connection *Conn, char *Buffer, unsigned int Length) int ConnRead(Connection *Conn, char *Dest, int Length) { - register int read; - register Connection *c = Conn; + int read; + Connection *c = Conn; read = c->receive.write - c->receive.read; do { @@ -677,7 +678,7 @@ ConnRead(Connection *Conn, char *Dest, int Length) return(Length); } - CONN_TCP_RECEIVE(c, c->receive.buffer, CONN_TCP_MTU, read); + ConnTcpRead(c, c->receive.buffer, CONN_TCP_MTU, &read); if (read > 0) { c->receive.read = c->receive.buffer; c->receive.write = c->receive.buffer + read; @@ -736,7 +737,7 @@ ConnReadCount(Connection *Conn, char *Dest, int Count) } if (remaining < CONN_TCP_MTU) { - CONN_TCP_RECEIVE(c, c->receive.write, c->receive.remaining, buffered); + ConnTcpRead(c, c->receive.write, c->receive.remaining, &buffered); if (buffered > 0) { c->receive.write += buffered; @@ -747,7 +748,7 @@ ConnReadCount(Connection *Conn, char *Dest, int Count) } } else { do { - CONN_TCP_RECEIVE(c, d, remaining, buffered); + ConnTcpRead(c, d, remaining, &buffered); if (buffered > 0) { d += buffered; remaining -= buffered; @@ -859,7 +860,7 @@ ConnReadLine(Connection *Conn, char *Line, int Length) } } - CONN_TCP_RECEIVE(c, c->receive.buffer, CONN_TCP_MTU, count); + ConnTcpRead(c, c->receive.buffer, CONN_TCP_MTU, &count); if (count > 0) { cur = c->receive.read = c->receive.buffer; limit = c->receive.write = cur + count; @@ -989,7 +990,7 @@ ConnReadAnswer(Connection *Conn, char *Line, int Length) } } - CONN_TCP_RECEIVE(c, c->receive.buffer, CONN_TCP_MTU, count); + ConnTcpRead(c, c->receive.buffer, CONN_TCP_MTU, &count); if (count > 0) { cur = c->receive.read = c->receive.buffer; limit = c->receive.write = cur + count; @@ -1136,7 +1137,7 @@ ConnReadToAllocatedBuffer(Connection *c, char **buffer, unsigned long *bufferSiz c->receive.remaining = CONN_TCP_MTU; c->receive.write[0] = '\0'; - CONN_TCP_RECEIVE(c, c->receive.buffer, CONN_TCP_MTU, count); + ConnTcpRead(c, c->receive.buffer, CONN_TCP_MTU, &count); if (count <= 0) { break; } @@ -1183,7 +1184,7 @@ ConnReadToAllocatedBuffer(Connection *c, char **buffer, unsigned long *bufferSiz } } - CONN_TCP_RECEIVE(c, c->receive.buffer, CONN_TCP_MTU, count); + ConnTcpRead(c, c->receive.buffer, CONN_TCP_MTU, &count); if (count <= 0) { c->send.remaining = 0; c->send.read = c->send.write; @@ -1202,9 +1203,9 @@ ConnReadToAllocatedBuffer(Connection *c, char **buffer, unsigned long *bufferSiz int ConnReadToFile(Connection *Conn, FILE *Dest, int Count) { - register size_t buffered; - register size_t remaining; - register Connection *c = Conn; + size_t buffered; + size_t remaining; + Connection *c = Conn; remaining = Count; while (remaining > 0) { @@ -1240,7 +1241,7 @@ ConnReadToFile(Connection *Conn, FILE *Dest, int Count) } } - CONN_TCP_RECEIVE(c, c->receive.write, c->receive.remaining, buffered); + ConnTcpRead(c, c->receive.write, c->receive.remaining, &buffered); if (buffered > 0) { c->receive.write += buffered; c->receive.remaining -= buffered; @@ -1350,7 +1351,7 @@ ConnReadToFileUntilEOS(Connection *Src, FILE *Dest) Src->receive.write[0] = '\0'; } - CONN_TCP_RECEIVE(Src, Src->receive.write, Src->receive.remaining, count); + ConnTcpRead(Src, Src->receive.write, Src->receive.remaining, &count); if (count > 0) { Src->receive.read = Src->receive.buffer; Src->receive.write += count; @@ -1369,14 +1370,14 @@ ConnReadToFileUntilEOS(Connection *Src, FILE *Dest) int ConnReadToConn(Connection *Src, Connection *Dest, int Count) { - size_t sent; + unsigned int sent; size_t buffered; size_t remaining; Connection *s = Src; Connection *d = Dest; if ((remaining = Count) > 0) { - CONN_TCP_FLUSH(d, d->send.read, d->send.write, sent); + ConnTcpFlush(d, d->send.read, d->send.write, &sent); if (sent >= 0) { d->send.read = d->send.write = d->send.buffer; d->send.remaining = CONN_TCP_MTU; @@ -1393,7 +1394,7 @@ ConnReadToConn(Connection *Src, Connection *Dest, int Count) buffered = s->receive.write - s->receive.read; if (buffered > 0) { if (remaining <= buffered) { - CONN_TCP_SEND(d, s->receive.read, remaining, sent); + ConnTcpWrite(d, s->receive.read, remaining, &sent); if (sent == remaining) { s->receive.read += sent; if (s->receive.read == s->receive.write) { @@ -1410,7 +1411,7 @@ ConnReadToConn(Connection *Src, Connection *Dest, int Count) } if ((remaining > s->receive.remaining) && (s->receive.remaining < CONN_TCP_THRESHOLD)) { - CONN_TCP_SEND(d, s->receive.read, buffered, sent); + ConnTcpWrite(d, s->receive.read, buffered, &sent); if (sent == buffered) { remaining -= sent; @@ -1424,7 +1425,7 @@ ConnReadToConn(Connection *Src, Connection *Dest, int Count) } } - CONN_TCP_RECEIVE(s, s->receive.write, s->receive.remaining, buffered); + ConnTcpRead(s, s->receive.write, s->receive.remaining, &buffered); if (buffered > 0) { s->receive.write += buffered; s->receive.remaining -= buffered; @@ -1443,12 +1444,12 @@ int ConnReadToConnUntilEOS(Connection *Src, Connection *Dest) { int written = 0; - size_t count; + unsigned int count; char *cur; char *limit; BOOL finished = FALSE; - CONN_TCP_FLUSH(Dest, Dest->send.read, Dest->send.write, count); + ConnTcpFlush(Dest, Dest->send.read, Dest->send.write, &count); if (count >= 0) { Dest->send.read = Dest->send.write = Dest->send.buffer; Dest->send.remaining = CONN_TCP_MTU; @@ -1488,7 +1489,7 @@ ConnReadToConnUntilEOS(Connection *Src, Connection *Dest) } if (Src->receive.read < cur) { - CONN_TCP_FLUSH(Dest, Src->receive.read, cur, count); + ConnTcpFlush(Dest, Src->receive.read, cur, &count); if ((size_t)(cur - Src->receive.read) == count) { written += count; @@ -1520,7 +1521,7 @@ ConnReadToConnUntilEOS(Connection *Src, Connection *Dest) } } - CONN_TCP_RECEIVE(Src, Src->receive.write, Src->receive.remaining, count); + ConnTcpRead(Src, Src->receive.write, Src->receive.remaining, &count); if (count > 0) { Src->receive.read = Src->receive.buffer; Src->receive.write += count; @@ -1535,14 +1536,14 @@ ConnReadToConnUntilEOS(Connection *Src, Connection *Dest) return(written); } - + int ConnWrite(Connection *Conn, const char *Buffer, int Length) { - register const char *b; - register int i; - register size_t r; - register Connection *c = Conn; + const char *b; + int i; + size_t r; + Connection *c = Conn; b = Buffer; r = Length; @@ -1564,7 +1565,7 @@ ConnWrite(Connection *Conn, const char *Buffer, int Length) c->send.write += c->send.remaining; - CONN_TCP_FLUSH(c, c->send.read, c->send.write, i); + ConnTcpFlush(c, c->send.read, c->send.write, &i); if (i > 0) { c->send.read = c->send.write = c->send.buffer; c->send.remaining = CONN_TCP_MTU; @@ -1579,7 +1580,7 @@ ConnWrite(Connection *Conn, const char *Buffer, int Length) } do { - CONN_TCP_FLUSH(c, b, b + r, i); + ConnTcpFlush(c, b, b + r, &i); if (i > 0) { b += r; r -= r; @@ -1599,10 +1600,10 @@ ConnWrite(Connection *Conn, const char *Buffer, int Length) int ConnWriteFromFile(Connection *Conn, FILE *Source, int Count) { - register int i; - register size_t n; - register size_t r; - register Connection *c = Conn; + int i; + size_t n; + size_t r; + Connection *c = Conn; r = Count; while (r > 0) { @@ -1623,7 +1624,7 @@ ConnWriteFromFile(Connection *Conn, FILE *Source, int Count) return(-1); } - CONN_TCP_FLUSH(c, c->send.read, c->send.write, i); + ConnTcpFlush(c, c->send.read, c->send.write, &i); if (i > 0) { c->send.read = c->send.write = c->send.buffer; c->send.remaining = CONN_TCP_MTU; @@ -1641,11 +1642,11 @@ ConnWriteFromFile(Connection *Conn, FILE *Source, int Count) int ConnWriteFile(Connection *Conn, FILE *Source) { - register int i; - register size_t n; - register size_t r; - register Connection *c = Conn; - + int i; + size_t n; + size_t r; + Connection *c = Conn; + n = 0; r = c->send.remaining; do { @@ -1659,10 +1660,10 @@ ConnWriteFile(Connection *Conn, FILE *Source) return(-1); } } - + n += c->send.write - c->send.read; - - CONN_TCP_FLUSH(c, c->send.read, c->send.write, i); + + ConnTcpFlush(c, c->send.read, c->send.write, &i); if (i > 0) { c->send.read = c->send.write = c->send.buffer; c->send.remaining = CONN_TCP_MTU; @@ -1670,10 +1671,10 @@ ConnWriteFile(Connection *Conn, FILE *Source) c->send.write[0] = '\0'; continue; } - + return(-1); } while (!feof(Source) && !ferror(Source)); - + return(n); } @@ -1717,7 +1718,7 @@ ConnWriteVF(Connection *c, const char *format, va_list ap) va_end(ap2); } - CONN_TCP_FLUSH(c, c->send.read, c->send.write, i); + ConnTcpFlush(c, c->send.read, c->send.write, &i); if (i > 0) { c->send.read = c->send.write = c->send.buffer; c->send.remaining = CONN_TCP_MTU; @@ -1746,10 +1747,10 @@ ConnWriteF(Connection *conn, const char *Format, ...) int ConnFlush(Connection *Conn) { - register int count; - register Connection *c = Conn; + int count; + Connection *c = Conn; - CONN_TCP_FLUSH(c, c->send.read, c->send.write, count); + ConnTcpFlush(c, c->send.read, c->send.write, &count); if (count >= 0) { c->send.read += count; diff --git a/src/libs/connio/sockets.c b/src/libs/connio/sockets.c new file mode 100644 index 0000000..241853b --- /dev/null +++ b/src/libs/connio/sockets.c @@ -0,0 +1,155 @@ + +#include +#include +#include +#include +#include +#include "config.h" + +void +CHOP_NEWLINE(unsigned char *s) +{ + unsigned char *p; + p = strchr(s, 0x0A); + if (p) { + *p = '\0'; + } + p = strrchr(s, 0x0D); + if (p) { + *p = '\0'; + } +} + +void +SET_POINTER_TO_VALUE(unsigned char *p, unsigned char *s) +{ + // FIXME: Unused? + p = s; + while(isspace(*p)) { + p++; + } + if ((*p == '=') || (*p == ':')) { + p++; + } + while(isspace(*p)) { + p++; + } +} + +void +ConnTcpFlush(Connection *c, char *b, char *e, unsigned int *r) +{ + if (b < e) { + char *curPTR = (char *)b; + while (curPTR < e) { + ConnTcpWrite(c, curPTR, e - curPTR, r); + if (*r > 0) { + curPTR = curPTR + (int)*r; + continue; + } + break; + } + if (curPTR == e) { + *r = e - b; + } else { + b = -1; + } + } else { + *r = 0; + } +} + +void +ConnTcpClose(Connection *c) +{ + if (c->receive.buffer) { + c->receive.remaining = CONN_TCP_MTU; + } else { + c->receive.remaining = 0; + } + c->receive.read = c->receive.write = c->receive.buffer; + if (c->send.buffer) { + ConnFlush(c); + c->send.remaining = CONN_TCP_MTU; + } else { + c->send.remaining = 0; + } + c->send.read = c->send.write = c->send.buffer; + if (c->ssl.enable) { + gnutls_bye(c->ssl.context, GNUTLS_SHUT_RDWR); + gnutls_deinit(c->ssl.context); + c->ssl.context = NULL; + c->ssl.enable = FALSE; + } + if (c->socket != -1) { + IPshutdown(c->socket, 2); + IPclose(c->socket); + c->socket = -1; + } +} + +#if defined(LINUX) || defined(S390RH) || defined(SOLARIS) + +void +ConnTcpRead(Connection *c, char *b, unsigned int l, unsigned int *r) +{ + struct pollfd pfd; + do { + pfd.fd = (int)c->socket; + pfd.events = POLLIN; + *r = poll(&pfd, 1, c->receive.timeOut * 1000); + if (*r > 0) { + if ((pfd.revents & (POLLIN | POLLPRI))) { + do { + if (!c->ssl.enable) { + *r = IPrecv((c)->socket, b, l, 0); + } else { + *r = gnutls_record_recv(c->ssl.context, (void *)b, l); + } + if (*r >= 0) { + CONN_TRACE_DATA(c, CONN_TRACE_EVENT_READ, b, r); + break; + } else if (errno == EINTR) { + continue; + } + CONN_TRACE_ERROR(c, "RECV", r); + break; + } while (TRUE); + break; + } else if ((pfd.revents & (POLLERR | POLLHUP | POLLNVAL))) { + CONN_TRACE_ERROR(c, "POLL EVENT", r); + *r = -2; + break; + } + } + if (errno == EINTR) { + continue; + } + CONN_TRACE_ERROR(c, "POLL", r); + *r = -3; + break; + } while (TRUE); +} + +void +ConnTcpWrite(Connection *c, char *b, unsigned int l, unsigned int *r) +{ + do { + if (!c->ssl.enable) { + *r = IPsend(c->socket, b, l, MSG_NOSIGNAL); + } else { + *r = gnutls_record_send(c->ssl.context, (void *)b, l); + } + if (*r >= 0) { + CONN_TRACE_DATA(c, CONN_TRACE_EVENT_WRITE, b, r); + break; + } else if (errno == EINTR) { + continue; + } + CONN_TRACE_ERROR(c, "POLL", r); + *r = -1; + break; + } while (TRUE); +} + +#endif diff --git a/src/libs/nmap/nmap.c b/src/libs/nmap/nmap.c index a2a3267..f82cf73 100644 --- a/src/libs/nmap/nmap.c +++ b/src/libs/nmap/nmap.c @@ -127,7 +127,7 @@ FindEndOfLine(Connection *conn) if (count < CONN_TCP_MTU) { if (count == 0) { - CONN_TCP_RECEIVE(c, c->receive.buffer, CONN_TCP_MTU, count); + ConnTcpRead(c, c->receive.buffer, CONN_TCP_MTU, &count); if (count > 0) { c->receive.read = c->receive.buffer; c->receive.write = c->receive.buffer + count; @@ -144,7 +144,7 @@ FindEndOfLine(Connection *conn) c->receive.read = c->receive.buffer; c->receive.write = c->receive.buffer + count; c->receive.remaining = CONN_TCP_MTU - count; - CONN_TCP_RECEIVE(c, c->receive.write, c->receive.remaining, count); + ConnTcpRead(c, c->receive.write, c->receive.remaining, &count); if (count > 0) { c->receive.write += count; c->receive.remaining -= count; @@ -1606,7 +1606,7 @@ NMAPQuit(Connection *conn) { ConnWrite(conn, "QUIT\r\n", 6); - CONN_TCP_CLOSE(conn); + ConnTcpClose(conn); return; }