Add support for Winsock library and logging to the windows event log
This commit is contained in:
+86
-10
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user