ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/socket/init.C
(Generate patch)

Comparing deliantra/server/socket/init.C (file contents):
Revision 1.7 by root, Sun Sep 10 13:43:33 2006 UTC vs.
Revision 1.10 by pippijn, Mon Dec 11 19:46:47 2006 UTC

1
2/*
3 * static char *rcsid_init_c =
4 * "$Id: init.C,v 1.7 2006/09/10 13:43:33 root Exp $";
5 */
6
7/* 1/*
8 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
9 3
10 Copyright (C) 2001 Mark Wedel 4 Copyright (C) 2001 Mark Wedel
11 Copyright (C) 1992 Frank Tore Johansen 5 Copyright (C) 1992 Frank Tore Johansen
22 16
23 You should have received a copy of the GNU General Public License 17 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software 18 along with this program; if not, write to the Free Software
25 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 20
27 The author can be reached via e-mail to crossfire-devel@real-time.com 21 The author can be reached via e-mail to <crossfire@schmorp.de>
28*/ 22*/
29 23
30/** 24/**
31 * \file 25 * \file
32 * Socket general functions 26 * Socket general functions
41 35
42#include <global.h> 36#include <global.h>
43#ifndef __CEXTRACT__ 37#ifndef __CEXTRACT__
44# include <sproto.h> 38# include <sproto.h>
45#endif 39#endif
46#ifndef WIN32 /* ---win32 exclude include files */
47# include <sys/types.h> 40#include <sys/types.h>
48# include <sys/time.h> 41#include <sys/time.h>
49# include <sys/socket.h> 42#include <sys/socket.h>
50# include <netinet/in.h> 43#include <netinet/in.h>
51# include <netdb.h> 44#include <netdb.h>
52#endif /* win32 */
53 45
54#ifdef HAVE_UNISTD_H 46#ifdef HAVE_UNISTD_H
55# include <unistd.h> 47# include <unistd.h>
56#endif 48#endif
57 49
75 char buf[256]; 67 char buf[256];
76 int bufsize = 65535; /*Supposed absolute upper limit */ 68 int bufsize = 65535; /*Supposed absolute upper limit */
77 int oldbufsize; 69 int oldbufsize;
78 int buflen = sizeof (int); 70 int buflen = sizeof (int);
79 71
80#ifdef WIN32 /* ***WIN32 SOCKET: init win32 non blocking socket */
81 int temp = 1;
82
83 if (ioctlsocket (ns->fd, FIONBIO, &temp) == -1)
84 LOG (llevError, "InitConnection: Error on ioctlsocket.\n");
85#else
86 if (fcntl (ns->fd, F_SETFL, O_NONBLOCK) == -1) 72 if (fcntl (ns->fd, F_SETFL, O_NONBLOCK) == -1)
87 { 73 {
88 LOG (llevError, "InitConnection: Error on fcntl.\n"); 74 LOG (llevError, "InitConnection: Error on fcntl.\n");
89 } 75 }
90#endif /* end win32 */
91 76
92 if (getsockopt (ns->fd, SOL_SOCKET, SO_SNDBUF, (char *) &oldbufsize, (socklen_t *) & buflen) == -1) 77 if (getsockopt (ns->fd, SOL_SOCKET, SO_SNDBUF, (char *) &oldbufsize, (socklen_t *) & buflen) == -1)
93 oldbufsize = 0; 78 oldbufsize = 0;
94 if (oldbufsize < bufsize) 79 if (oldbufsize < bufsize)
95 { 80 {
114 ns->exp64 = 0; 99 ns->exp64 = 0;
115 ns->monitor_spells = 0; 100 ns->monitor_spells = 0;
116 ns->mapmode = Map0Cmd; 101 ns->mapmode = Map0Cmd;
117 ns->darkness = 1; 102 ns->darkness = 1;
118 ns->status = Ns_Add; 103 ns->status = Ns_Add;
119 ns->comment = NULL;
120 ns->old_mode = (Old_Mode) 0;
121 ns->mapx = 11; 104 ns->mapx = 11;
122 ns->mapy = 11; 105 ns->mapy = 11;
123 ns->newmapcmd = 0; 106 ns->newmapcmd = 0;
124 ns->itemcmd = 1; /* Default is version item1 command */ 107 ns->itemcmd = 1; /* Default is version item1 command */
125 ns->ext_mapinfos = 0; /*extendedmapinfo datas */ 108 ns->ext_mapinfos = 0; /*extendedmapinfo datas */
187{ 170{
188 struct sockaddr_in insock; 171 struct sockaddr_in insock;
189 struct protoent *protox; 172 struct protoent *protox;
190 struct linger linger_opt; 173 struct linger linger_opt;
191 174
192#ifdef WIN32 /* ***win32 - we init a windows socket */
193 WSADATA w;
194
195 socket_info.max_filedescriptor = 1; /* used in select, ignored in winsockets */
196 WSAStartup (0x0101, &w); /* this setup all socket stuff */
197 /* ill include no error tests here, winsocket 1.1 should always work */
198 /* except some old win95 versions without tcp/ip stack */
199#else /* non windows */
200
201# ifdef HAVE_SYSCONF 175#ifdef HAVE_SYSCONF
202 socket_info.max_filedescriptor = sysconf (_SC_OPEN_MAX); 176 socket_info.max_filedescriptor = sysconf (_SC_OPEN_MAX);
177#else
178# ifdef HAVE_GETDTABLESIZE
179 socket_info.max_filedescriptor = getdtablesize ();
203# else 180# else
204# ifdef HAVE_GETDTABLESIZE
205 socket_info.max_filedescriptor = getdtablesize ();
206# else
207 "Unable to find usable function to get max filedescriptors"; 181 "Unable to find usable function to get max filedescriptors";
208# endif
209# endif 182# endif
210#endif /* win32 */ 183#endif
211 184
212 socket_info.timeout.tv_sec = 0; 185 socket_info.timeout.tv_sec = 0;
213 socket_info.timeout.tv_usec = 0; 186 socket_info.timeout.tv_usec = 0;
214 socket_info.nconns = 0; 187 socket_info.nconns = 0;
215 188
257 defined(__sun__) || defined(__linux__) || defined(SVR4) || \ 230 defined(__sun__) || defined(__linux__) || defined(SVR4) || \
258 defined(__FreeBSD__) || defined(__OpenBSD__) || \ 231 defined(__FreeBSD__) || defined(__OpenBSD__) || \
259 defined(WIN32) /* ---win32 add this here */ || \ 232 defined(WIN32) /* ---win32 add this here */ || \
260 defined(__GNU__) /* HURD */ 233 defined(__GNU__) /* HURD */
261 { 234 {
262# ifdef WIN32
263 char tmp = 1;
264# else
265 int tmp = 1; 235 int tmp = 1;
266# endif
267 236
268 if (setsockopt (init_sockets[0].fd, SOL_SOCKET, SO_REUSEADDR, &tmp, sizeof (tmp))) 237 if (setsockopt (init_sockets[0].fd, SOL_SOCKET, SO_REUSEADDR, &tmp, sizeof (tmp)))
269 { 238 {
270 LOG (llevError, "Cannot setsockopt(SO_REUSEADDR): %s\n", strerror (errno)); 239 LOG (llevError, "Cannot setsockopt(SO_REUSEADDR): %s\n", strerror (errno));
271 } 240 }
278#endif 247#endif
279 248
280 if (bind (init_sockets[0].fd, (struct sockaddr *) &insock, sizeof (insock)) == (-1)) 249 if (bind (init_sockets[0].fd, (struct sockaddr *) &insock, sizeof (insock)) == (-1))
281 { 250 {
282 LOG (llevError, "Cannot bind socket to port %d: %s\n", ntohs (insock.sin_port), strerror (errno)); 251 LOG (llevError, "Cannot bind socket to port %d: %s\n", ntohs (insock.sin_port), strerror (errno));
283#ifdef WIN32 /* ***win32: close() -> closesocket() */
284 shutdown (init_sockets[0].fd, SD_BOTH);
285 closesocket (init_sockets[0].fd);
286#else
287 close (init_sockets[0].fd); 252 close (init_sockets[0].fd);
288#endif /* win32 */
289 exit (-1); 253 exit (-1);
290 } 254 }
291 if (listen (init_sockets[0].fd, 5) == (-1)) 255 if (listen (init_sockets[0].fd, 5) == (-1))
292 { 256 {
293 LOG (llevError, "Cannot listen on socket: %s\n", strerror (errno)); 257 LOG (llevError, "Cannot listen on socket: %s\n", strerror (errno));
294#ifdef WIN32 /* ***win32: close() -> closesocket() */
295 shutdown (init_sockets[0].fd, SD_BOTH);
296 closesocket (init_sockets[0].fd);
297#else
298 close (init_sockets[0].fd); 258 close (init_sockets[0].fd);
299#endif /* win32 */
300 exit (-1); 259 exit (-1);
301 } 260 }
302 init_sockets[0].status = Ns_Add; 261 init_sockets[0].status = Ns_Add;
303 read_client_images (); 262 read_client_images ();
304} 263}
327 */ 286 */
328 287
329void 288void
330free_newsocket (NewSocket * ns) 289free_newsocket (NewSocket * ns)
331{ 290{
332#ifdef WIN32 /* ***win32: closesocket in windows style */
333 shutdown (ns->fd, SD_BOTH);
334 if (closesocket (ns->fd))
335 {
336#else
337 if (close (ns->fd)) 291 if (close (ns->fd))
338 { 292 {
339#endif /* win32 */
340 293
341#ifdef ESRV_DEBUG 294#ifdef ESRV_DEBUG
342 LOG (llevDebug, "Error closing socket %d\n", ns->fd); 295 LOG (llevDebug, "Error closing socket %d\n", ns->fd);
343#endif 296#endif
344 } 297 }
298
345 if (ns->stats.range) 299 if (ns->stats.range)
346 free (ns->stats.range); 300 free (ns->stats.range);
301
347 if (ns->stats.title) 302 if (ns->stats.title)
348 free (ns->stats.title); 303 free (ns->stats.title);
349 if (ns->comment) 304
350 free (ns->comment);
351 free (ns->host); 305 free (ns->host);
352 free (ns->inbuf.buf); 306 free (ns->inbuf.buf);
353} 307}
354 308
355/** Sends the 'goodbye' command to the player, and closes connection. */ 309/** Sends the 'goodbye' command to the player, and closes connection. */

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines