Add support for Winsock library and logging to the windows event log

This commit is contained in:
blt
2003-08-06 12:11:54 +00:00
parent d3223644a2
commit 67cae9e447
4 changed files with 150 additions and 11 deletions
+61
View File
@@ -19,11 +19,19 @@
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#ifndef WIN32
#include <syslog.h>
#else
#include <windows.h>
#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;
-1
View File
@@ -61,7 +61,6 @@
#include <stdarg.h>
#include <stdio.h>
#include <syslog.h>
/* Reporting levels */
+86 -10
View File
@@ -1,15 +1,21 @@
#include "config.h"
#include <unistd.h>
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/types.h>
#ifndef WINSOCK2
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#else
#include <winsock2.h>
#endif
#include <fcntl.h>
#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
}
+3
View File
@@ -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...
/*****************************************************************