summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--buildMinGW.conf2
-rw-r--r--src/serversocket.cpp33
-rw-r--r--src/serversocket.h11
-rw-r--r--src/socket.cpp21
-rw-r--r--src/socket.h4
-rw-r--r--src/win32_compatibility.h27
6 files changed, 77 insertions, 21 deletions
diff --git a/buildMinGW.conf b/buildMinGW.conf
index 84a0d60..ec8c421 100644
--- a/buildMinGW.conf
+++ b/buildMinGW.conf
@@ -22,7 +22,7 @@ filesIn("src") filter regexp("^src/(.*)\\.h$", "bu/{re:1}.h"):
22 target file, 22 target file,
23 set "CXXFLAGS" += "-I.", 23 set "CXXFLAGS" += "-I.",
24 #input filesIn("src") filter regexp("^.*\\.cpp$") 24 #input filesIn("src") filter regexp("^.*\\.cpp$")
25 input ["src/list.cpp", "src/exceptionbase.cpp", "src/fstring.cpp", "src/file.cpp", "src/hash.cpp", "src/sptr.cpp", "src/tafnode.cpp", "src/tafreader.cpp", "src/tafwriter.cpp", "src/stdstream.cpp", "src/stream.cpp", "src/archive.cpp", "src/archival.cpp", "src/socket.cpp"] 25 input ["src/list.cpp", "src/exceptionbase.cpp", "src/fstring.cpp", "src/file.cpp", "src/hash.cpp", "src/sptr.cpp", "src/tafnode.cpp", "src/tafreader.cpp", "src/tafwriter.cpp", "src/stdstream.cpp", "src/stream.cpp", "src/archive.cpp", "src/archival.cpp", "src/socket.cpp", "src/serversocket.cpp"]
26 26
27rule "exe": 27rule "exe":
28 matches regexp("(.*)\\.win_o$"), 28 matches regexp("(.*)\\.win_o$"),
diff --git a/src/serversocket.cpp b/src/serversocket.cpp
index 6f7fc00..5ed661e 100644
--- a/src/serversocket.cpp
+++ b/src/serversocket.cpp
@@ -5,6 +5,13 @@
5 * terms of the license contained in the file LICENSE. 5 * terms of the license contained in the file LICENSE.
6 */ 6 */
7 7
8#ifndef WIN32
9 #include <sys/socket.h>
10 #include <netinet/in.h>
11 #include <netdb.h>
12 #include <arpa/inet.h>
13#endif
14
8#include <time.h> 15#include <time.h>
9#include <string.h> 16#include <string.h>
10#include <stdio.h> 17#include <stdio.h>
@@ -12,14 +19,11 @@
12#include <stdlib.h> 19#include <stdlib.h>
13#include <unistd.h> 20#include <unistd.h>
14#include <sys/types.h> 21#include <sys/types.h>
15#include <sys/socket.h> 22//#include <termios.h>
16#include <termios.h>
17#include <netinet/in.h>
18#include <netdb.h>
19#include <arpa/inet.h>
20#include <fcntl.h> 23#include <fcntl.h>
21#include "bu/serversocket.h" 24#include "bu/serversocket.h"
22#include "bu/osx_compatibility.h" 25#include "bu/osx_compatibility.h"
26#include "bu/win32_compatibility.h"
23 27
24namespace Bu { subExceptionDef( ServerSocketException ) } 28namespace Bu { subExceptionDef( ServerSocketException ) }
25 29
@@ -50,7 +54,11 @@ Bu::ServerSocket::ServerSocket(const FString &sAddr,int nPort, int nPoolSize) :
50 name.sin_family = AF_INET; 54 name.sin_family = AF_INET;
51 name.sin_port = htons( nPort ); 55 name.sin_port = htons( nPort );
52 56
57#ifdef WIN32
58 name.sin_addr.s_addr = inet_addr( sAddr.getStr() );
59#else
53 inet_aton( sAddr.getStr(), &name.sin_addr ); 60 inet_aton( sAddr.getStr(), &name.sin_addr );
61#endif
54 62
55 startServer( name, nPoolSize ); 63 startServer( name, nPoolSize );
56} 64}
@@ -139,14 +147,17 @@ int Bu::ServerSocket::accept( int nTimeoutSec, int nTimeoutUSec )
139 "Error accepting a new connection: %s", strerror( errno ) 147 "Error accepting a new connection: %s", strerror( errno )
140 ); 148 );
141 } 149 }
150
151#ifndef WIN32
142 char tmpa[20]; 152 char tmpa[20];
143 inet_ntop( AF_INET, (void *)&clientname.sin_addr, tmpa, 20 ); 153 inet_ntop( AF_INET, (void *)&clientname.sin_addr, tmpa, 20 );
144 //"New connection from host %s, port %hd.", 154 //"New connection from host %s, port %hd.",
145 // tmpa, ntohs (clientname.sin_port) ); 155 // tmpa, ntohs (clientname.sin_port) );
156#endif
146 157
147 { 158 {
159#ifndef WIN32
148 int flags; 160 int flags;
149
150 flags = fcntl( nClient, F_GETFL, 0 ); 161 flags = fcntl( nClient, F_GETFL, 0 );
151 flags |= O_NONBLOCK; 162 flags |= O_NONBLOCK;
152 if( fcntl( nClient, F_SETFL, flags ) < 0) 163 if( fcntl( nClient, F_SETFL, flags ) < 0)
@@ -156,6 +167,16 @@ int Bu::ServerSocket::accept( int nTimeoutSec, int nTimeoutUSec )
156 strerror( errno ) 167 strerror( errno )
157 ); 168 );
158 } 169 }
170#else
171 //-------------------------
172 // Set the socket I/O mode: In this case FIONBIO
173 // enables or disables the blocking mode for the
174 // socket based on the numerical value of iMode.
175 // If iMode = 0, blocking is enabled;
176 // If iMode != 0, non-blocking mode is enabled.
177 u_long iMode = 1;
178 ioctlsocket(nClient, FIONBIO, &iMode);
179#endif
159 } 180 }
160 181
161 return nClient; 182 return nClient;
diff --git a/src/serversocket.h b/src/serversocket.h
index 1742786..168c5e1 100644
--- a/src/serversocket.h
+++ b/src/serversocket.h
@@ -11,7 +11,12 @@
11#include <stdint.h> 11#include <stdint.h>
12#include "bu/fstring.h" 12#include "bu/fstring.h"
13#include "bu/exceptionbase.h" 13#include "bu/exceptionbase.h"
14#include <sys/select.h> 14
15#ifdef WIN32
16 #include <Winsock2.h>
17#else
18 #include <sys/select.h>
19#endif
15 20
16namespace Bu 21namespace Bu
17{ 22{
@@ -45,7 +50,11 @@ namespace Bu
45 void startServer( struct sockaddr_in &name, int nPoolSize ); 50 void startServer( struct sockaddr_in &name, int nPoolSize );
46 51
47 fd_set fdActive; 52 fd_set fdActive;
53#ifdef WIN32
54 unsigned int nServer;
55#else
48 int nServer; 56 int nServer;
57#endif
49 int nPort; 58 int nPort;
50 }; 59 };
51} 60}
diff --git a/src/socket.cpp b/src/socket.cpp
index 1e9a2f9..aea66f8 100644
--- a/src/socket.cpp
+++ b/src/socket.cpp
@@ -16,6 +16,7 @@
16#include <fcntl.h> 16#include <fcntl.h>
17#include "socket.h" 17#include "socket.h"
18#include "osx_compatibility.h" 18#include "osx_compatibility.h"
19#include "win32_compatibility.h"
19 20
20#ifndef WIN32 21#ifndef WIN32
21 #include <sys/socket.h> 22 #include <sys/socket.h>
@@ -194,11 +195,7 @@ void Bu::Socket::read()
194 195
195size_t Bu::Socket::read( void *pBuf, size_t nBytes ) 196size_t Bu::Socket::read( void *pBuf, size_t nBytes )
196{ 197{
197#ifndef WIN32
198 int nRead = TEMP_FAILURE_RETRY( ::read( nSocket, pBuf, nBytes ) ); 198 int nRead = TEMP_FAILURE_RETRY( ::read( nSocket, pBuf, nBytes ) );
199#else
200 int nRead = ::read( nSocket, pBuf, nBytes );
201#endif
202 if( nRead < 0 ) 199 if( nRead < 0 )
203 { 200 {
204 throw SocketException( SocketException::cRead, strerror(errno) ); 201 throw SocketException( SocketException::cRead, strerror(errno) );
@@ -209,7 +206,7 @@ size_t Bu::Socket::read( void *pBuf, size_t nBytes )
209size_t Bu::Socket::read( void *pBuf, size_t nBytes, 206size_t Bu::Socket::read( void *pBuf, size_t nBytes,
210 uint32_t nSec, uint32_t nUSec ) 207 uint32_t nSec, uint32_t nUSec )
211{ 208{
212 struct timeval tv, nt, ct; 209 struct timeval tv;
213 size_t nRead = 0; 210 size_t nRead = 0;
214 211
215 fd_set rfds; 212 fd_set rfds;
@@ -217,6 +214,7 @@ size_t Bu::Socket::read( void *pBuf, size_t nBytes,
217 FD_SET(nSocket, &rfds); 214 FD_SET(nSocket, &rfds);
218 215
219#ifndef WIN32 216#ifndef WIN32
217 struct timeval nt, ct;
220 gettimeofday( &nt, NULL ); 218 gettimeofday( &nt, NULL );
221 nt.tv_sec += nSec; 219 nt.tv_sec += nSec;
222 nt.tv_usec += nUSec; 220 nt.tv_usec += nUSec;
@@ -251,11 +249,7 @@ size_t Bu::Socket::read( void *pBuf, size_t nBytes,
251 249
252size_t Bu::Socket::write( const void *pBuf, size_t nBytes ) 250size_t Bu::Socket::write( const void *pBuf, size_t nBytes )
253{ 251{
254#ifndef WIN32
255 int nWrote = TEMP_FAILURE_RETRY( ::write( nSocket, pBuf, nBytes ) ); 252 int nWrote = TEMP_FAILURE_RETRY( ::write( nSocket, pBuf, nBytes ) );
256#else
257 int nWrote = ::write( nSocket, pBuf, nBytes );
258#endif
259 if( nWrote < 0 ) 253 if( nWrote < 0 )
260 { 254 {
261 if( errno == EAGAIN ) return 0; 255 if( errno == EAGAIN ) return 0;
@@ -266,7 +260,7 @@ size_t Bu::Socket::write( const void *pBuf, size_t nBytes )
266 260
267size_t Bu::Socket::write( const void *pBuf, size_t nBytes, uint32_t nSec, uint32_t nUSec ) 261size_t Bu::Socket::write( const void *pBuf, size_t nBytes, uint32_t nSec, uint32_t nUSec )
268{ 262{
269 struct timeval tv, nt, ct; 263 struct timeval tv;
270 size_t nWrote = 0; 264 size_t nWrote = 0;
271 265
272 fd_set wfds; 266 fd_set wfds;
@@ -274,6 +268,7 @@ size_t Bu::Socket::write( const void *pBuf, size_t nBytes, uint32_t nSec, uint32
274 FD_SET(nSocket, &wfds); 268 FD_SET(nSocket, &wfds);
275 269
276#ifndef WIN32 270#ifndef WIN32
271 struct timeval nt, ct;
277 gettimeofday( &nt, NULL ); 272 gettimeofday( &nt, NULL );
278 nt.tv_sec += nSec; 273 nt.tv_sec += nSec;
279 nt.tv_usec += nUSec; 274 nt.tv_usec += nUSec;
@@ -421,9 +416,9 @@ bool Bu::Socket::isOpen()
421 return bActive; 416 return bActive;
422} 417}
423 418
424#ifdef WIN32 419//#ifdef WIN32
425 typedef int socklen_t; 420// typedef int socklen_t;
426#endif 421//#endif
427 422
428void Bu::Socket::setAddress() 423void Bu::Socket::setAddress()
429{ 424{
diff --git a/src/socket.h b/src/socket.h
index 337b797..572c2ad 100644
--- a/src/socket.h
+++ b/src/socket.h
@@ -73,7 +73,11 @@ namespace Bu
73 private: 73 private:
74 void setAddress(); 74 void setAddress();
75 75
76#ifdef WIN32
77 unsigned int nSocket;
78#else
76 int nSocket; 79 int nSocket;
80#endif
77 bool bActive; 81 bool bActive;
78 FString sReadBuf; 82 FString sReadBuf;
79 FString sAddress; 83 FString sAddress;
diff --git a/src/win32_compatibility.h b/src/win32_compatibility.h
new file mode 100644
index 0000000..a1b9c97
--- /dev/null
+++ b/src/win32_compatibility.h
@@ -0,0 +1,27 @@
1/*
2 * Copyright (C) 2007-2008 Xagasoft, All rights reserved.
3 *
4 * This file is part of the libbu++ library and is released under the
5 * terms of the license contained in the file LICENSE.
6 */
7
8#ifndef WIN32_COMPATIBILITY__H
9#define WIN32_COMPATIBILITY__H
10
11#ifdef WIN32
12
13#ifndef TEMP_FAILURE_RETRY
14#define TEMP_FAILURE_RETRY(expression) \
15 (__extension__ \
16 ({ long int __result; \
17 do __result = (long int) (expression); \
18 while (__result == -1L && errno == EINTR); \
19 __result; }))
20#endif
21
22//__extension__ typedef unsigned int socklen_t;
23__extension__ typedef int socklen_t;
24
25#endif /* WIN32 */
26#endif
27