File: network.h

package info (click to toggle)
bzflag 2.4.30-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 26,488 kB
  • sloc: cpp: 150,376; ansic: 3,463; sh: 2,535; makefile: 2,194; perl: 486; python: 260; objc: 246; php: 206
file content (153 lines) | stat: -rw-r--r-- 4,173 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/* bzflag
 * Copyright (c) 1993-2025 Tim Riker
 *
 * This package is free software;  you can redistribute it and/or
 * modify it under the terms of the license found in the file
 * named COPYING that should have accompanied this file.
 *
 * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 */

/*
 * includes platform specific network files and adds missing stuff
 *
 * unfortunately this can include far more than necessary
 */

#ifndef BZF_NETWORK_H
#define BZF_NETWORK_H

#include "common.h"

#ifdef _WIN32
# include <winsock2.h>
# include <ws2tcpip.h>

using AddrLen = int;

# ifndef EINPROGRESS
#  define EINPROGRESS WSAEWOULDBLOCK
# endif

# ifndef EWOULDBLOCK
#  define EWOULDBLOCK WSAEWOULDBLOCK
# endif

# ifndef ECONNRESET
#  define ECONNRESET  WSAECONNRESET
# endif

# ifndef EBADMSG
#  define EBADMSG     WSAECONNRESET   /* not defined by windows */
# endif


/* setsockopt prototypes the 4th arg as const char*. */
using SSOType = char const*;
using CNCTType = sockaddr const; // only appears used in bzadmin

inline int close(SOCKET s)
{
    return closesocket(s);
}
# define ioctl(__fd, __req, __arg) \
ioctlsocket(__fd, __req, (u_long*)__arg)
# define gethostbyaddr(__addr, __len, __type) \
gethostbyaddr((const char*)__addr, __len, __type)

extern "C" {

    int           inet_aton(const char* cp, struct in_addr* pin);
    void          herror(const char* msg);

}

#else   // !defined(_WIN32)

// unistd has close(). It is poor encapsulation the close() is called from
//    - game/NetHandler.cxx
//    - bzadmin/ServerLink.cxx
//    - bzflag/ServerLink.cxx
//    - bzflag/ServerStartMenu.cxx (this is starting bzfs from the gui ... an abomination)
//    - bzfs/bzfs.cxx
//    - net/multicast.cxx
// yet none of them have the proper include. A proper cross-platform socket encapsulation
// (which has been written more than once, so we shouldn't do it) would provide all the
// necessary methods.
# include <unistd.h>
# include <sys/ioctl.h>  // Ubuntu (at least) needs this for ioctl (multicast.cxx, network.cxx)

# include <sys/socket.h>
# include <netinet/in.h>
# include <netinet/tcp.h>// TCP_NO_DELAY in bzfs.cxx
# include <arpa/inet.h> // inet_ntoa in AccessControlList.cxx
# include <netdb.h> // herror, hostent in <ares.h>
# include <sys/select.h> // select in Ping.cxx

// Posix defines the socket API to use socklen_t
using AddrLen = socklen_t;

# if defined(sun)
/* setsockopt prototypes the 4th arg as const char*. */
using SSOType = char const*;
/* connect prototypes the 2nd arg without const */
using CNCTType = sockaddr; // only appears used in bzadmin
# else
using SSOType  = void const*;
using CNCTType = sockaddr const; // only appears used in bzadmin
# endif

// BeOS net_server has closesocket(), which _must_ be used in place of close()
# if defined(__BEOS__) && (IPPROTO_TCP != 6)
#  define close(__x) closesocket(__x)
# endif

// This is extremely questionable. herror() is defined in netdb.h for Linux
// and in winsock2.h for Windows. Of course, it's deprecated (at least for Linux)
// so remapping it like this doesn't sound good. Better to refactor the code that feeds it
#define herror(x_)  bzfherror(x_)

extern "C" {
    void          bzfherror(const char* msg);
}

#endif /* defined(_WIN32) */

// Can this happen?
#if !defined(INADDR_NONE)
#  define INADDR_NONE   ((in_addr_t)0xffffffff)
#endif

// for all platforms
extern "C" {
    void          nerror(const char* msg);
    int           getErrno();
}

#include <string>


class BzfNetwork
{
public:
    static int        setNonBlocking(int fd);
    static int        setBlocking(int fd);
    static bool   parseURL(const std::string& url,
                           std::string& protocol,
                           std::string& hostname,
                           int& port,
                           std::string& pathname);
};

#endif // BZF_NETWORK_H


// Local Variables: ***
// mode: C++ ***
// tab-width: 4 ***
// c-basic-offset: 4 ***
// indent-tabs-mode: nil ***
// End: ***
// ex: shiftwidth=4 tabstop=4