From 67cae9e4473297d23ed51cb4c71f41cc179094ec Mon Sep 17 00:00:00 2001 From: blt Date: Wed, 6 Aug 2003 12:11:54 +0000 Subject: [PATCH] Add support for Winsock library and logging to the windows event log --- shared/report.c | 61 ++++++++++++++++++++++++++++++ shared/report.h | 1 - shared/sockets.c | 96 +++++++++++++++++++++++++++++++++++++++++++----- shared/sockets.h | 3 ++ 4 files changed, 150 insertions(+), 11 deletions(-) diff --git a/shared/report.c b/shared/report.c index f750b9a..adf7b47 100644 --- a/shared/report.c +++ b/shared/report.c @@ -19,11 +19,19 @@ #include #include #include +#ifndef WIN32 #include +#else +#include +#endif int report_level = RPT_INFO; int report_dest = RPT_DEST_STORE; +#ifdef WIN32 +HANDLE event_log_handle = NULL; +#endif + #define MAX_STORED_MSGS 200 static char *stored_msgs[MAX_STORED_MSGS]; @@ -55,7 +63,43 @@ void report( const int level, const char *format, .../*args*/ ) fprintf( stderr, "\n" ); break; case RPT_DEST_SYSLOG: + { +#ifndef WIN32 vsyslog( LOG_USER|(level+2), format, ap ); +#else + LPTSTR tmpArray[1]; + WORD eventType; + switch (level) + { + case RPT_CRIT: + case RPT_ERR: + eventType = EVENTLOG_ERROR_TYPE; + break; + case RPT_WARNING: + eventType = EVENTLOG_WARNING_TYPE; + break; + case RPT_NOTICE: + case RPT_INFO: + case RPT_DEBUG: + default: + eventType = EVENTLOG_INFORMATION_TYPE; + break; + } + + vsnprintf( buf, sizeof(buf), format, ap ); + tmpArray[0] = buf; + ReportEvent(event_log_handle, + eventType, + 0, /* category */ + 0, /* event ID */ + NULL, /* user ID */ + 1, /* number of strings */ + 0, /* binary data size */ + (LPCTSTR*) tmpArray, /* error string */ + NULL /* binary data */ + ); +#endif + } break; case RPT_DEST_STORE: vsnprintf( buf, sizeof(buf), format, ap ); @@ -76,10 +120,27 @@ int set_reporting( char *application_name, int new_level, int new_dest ) } if( report_dest != RPT_DEST_SYSLOG && new_dest == RPT_DEST_SYSLOG ) { +#ifdef WIN32 + if (event_log_handle) + { + CloseEventLog(event_log_handle); + } else { + event_log_handle = RegisterEventSource(NULL, "LcdProc"); + } +#else openlog( application_name, 0, LOG_USER ); +#endif } else if( report_dest == RPT_DEST_SYSLOG && new_dest != RPT_DEST_SYSLOG ) { +#ifdef WIN32 + if (event_log_handle) + { + CloseEventLog(event_log_handle); + event_log_handle = NULL; + } +#else closelog(); +#endif } report_level = new_level; diff --git a/shared/report.h b/shared/report.h index c3dd8c7..a1be7c1 100644 --- a/shared/report.h +++ b/shared/report.h @@ -61,7 +61,6 @@ #include #include -#include /* Reporting levels */ diff --git a/shared/sockets.c b/shared/sockets.c index bd5b747..d2df7ad 100644 --- a/shared/sockets.c +++ b/shared/sockets.c @@ -1,15 +1,21 @@ +#include "config.h" #include #include #include #include #include #include +#include +#ifndef WINSOCK2 #include #include -#include #include #include #include +#else +#include +#endif + #include #include "report.h" @@ -55,7 +61,11 @@ sock_connect (char *host, unsigned short int port) report (RPT_DEBUG, "sock_connect: Creating socket"); sock = socket (PF_INET, SOCK_STREAM, 0); +#ifdef WINSOCK2 + if (sock == INVALID_SOCKET) { +#else if (sock < 0) { +#endif report (RPT_ERR, "sock_connect: Error creating socket"); return sock; } @@ -65,13 +75,27 @@ sock_connect (char *host, unsigned short int port) return -1; err = connect (sock, (struct sockaddr *) &servername, sizeof (servername)); +#ifdef WINSOCK2 + if (err == INVALID_SOCKET) { +#else if (err < 0) { +#endif report (RPT_ERR, "sock_connect: connect failed"); shutdown (sock, 2); return 0; // Normal exit if server doesn't exist... } +#ifndef WINSOCK2 fcntl (sock, F_SETFL, O_NONBLOCK); +#else + { + unsigned long tmp = 1; + if (ioctlsocket(sock, FIONBIO, &tmp) == SOCKET_ERROR) + { + report(RPT_ERR, "sock_connect: Error setting socket to non-blocking"); + } + } +#endif return sock; } @@ -102,7 +126,11 @@ sock_send_string (int fd, char *string) while (offset != len) { // write isn't guaranteed to send the entire string at once, // so we have to sent it in a loop like this +#ifndef WINSOCK2 int sent = write (fd, string + offset, len - offset); +#else + int sent = send(fd, string + offset, len - offset, 0); +#endif if (sent == -1) { if (errno != EAGAIN) { report (RPT_ERR, "sock_send_string: socket write error"); @@ -128,7 +156,7 @@ int sock_recv_string (int fd, char *dest, size_t maxlen) { char *ptr = dest; - int recv = 0; + int recvBytes = 0; if (!dest) return -1; @@ -136,7 +164,11 @@ sock_recv_string (int fd, char *dest, size_t maxlen) return 0; while (1) { +#ifndef WINSOCK2 int err = read (fd, ptr, 1); +#else + int err = recv(fd, ptr, 1, 0); +#endif if (err == -1) { if (errno == EAGAIN) { if (recv) { @@ -150,28 +182,28 @@ sock_recv_string (int fd, char *dest, size_t maxlen) return err; } } else if (err == 0) { - return recv; + return recvBytes; } - recv++; + recvBytes++; - if (recv == maxlen || *ptr == 0 || *ptr == 10) { + if (recvBytes == maxlen || *ptr == 0 || *ptr == 10) { *ptr = 0; break; } ptr++; } - if (recv == 1 && dest[0] == 0) { + if (recvBytes == 1 && dest[0] == 0) { // Don't return a null string return 0; } - if (recv < maxlen - 1) { - dest[recv] = 0; + if (recvBytes < maxlen - 1) { + dest[recvBytes] = 0; } - return recv; + return recvBytes; } // Send/receive raw data @@ -186,7 +218,11 @@ sock_send (int fd, void *src, size_t size) while (offset != size) { // write isn't guaranteed to send the entire string at once, // so we have to sent it in a loop like this - int sent = write (fd, ((char *) src) + offset, size - offset); +#ifndef WINSOCK2 + int sent = write (fd, ((char *) src) + offset, size - offset); +#else + int sent = send(fd, ((char *) src) + offset, size - offset, 0); +#endif if (sent == -1) { if (errno != EAGAIN) { report (RPT_ERR, "sock_send: socket write error"); @@ -216,7 +252,11 @@ sock_recv (int fd, void *dest, size_t maxlen) if (maxlen <= 0) return 0; +#ifndef WINSOCK2 err = read (fd, dest, maxlen); +#else + err = recv(fd, dest, maxlen, 0); +#endif if (err < 0) { //report (RPT_DEBUG,"sock_recv: socket read error"); //shutdown(fd, 2); @@ -226,3 +266,39 @@ sock_recv (int fd, void *dest, size_t maxlen) return err; } + +/*****************************************************************************/ +static char retString[256]; + +char* +sock_geterror(void) +{ +#ifndef WINSOCK2 + return strerror(errno); +#else + long err; + char* tmp; + + err = WSAGetLastError(); + + sprintf(retString, "Error code %ld: ", err); + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + err, + 0, /* Default language */ + (LPTSTR) &tmp, + 0, + NULL); + + /* append the message text after the error code and ensure a terminating + character ends the string */ + strncpy(retString + strlen(retString), tmp, + sizeof(retString) - strlen(retString) - 1); + retString[sizeof(retString) - 1] = '\0'; + + return retString; +#endif +} + diff --git a/shared/sockets.h b/shared/sockets.h index c56091a..2016cf3 100644 --- a/shared/sockets.h +++ b/shared/sockets.h @@ -29,6 +29,9 @@ int sock_recv_string (int fd, char *dest, size_t maxlen); int sock_send (int fd, void *src, size_t size); int sock_recv (int fd, void *dest, size_t maxlen); +/* Return error message string for the socket function */ +char *sock_geterror(void); + // Er, ignore the rest of this file. I'll clean it up sometime... /*****************************************************************