Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5564 serge 1
 
2
#include "util/u_network.h"
3
#include "util/u_debug.h"
4
5
 
6
#  include 
7
#  include 
8
#elif defined(PIPE_OS_LINUX) || defined(PIPE_OS_HAIKU) || \
9
   defined(PIPE_OS_APPLE) || defined(PIPE_OS_CYGWIN) || defined(PIPE_OS_SOLARIS)
10
#  include 
11
#  include 
12
#  include 
13
#  include 
14
#  include 
15
#else
16
#  warning "No socket implementation"
17
#endif
18
19
 
20
u_socket_init()
21
{
22
#if defined(PIPE_SUBSYSTEM_WINDOWS_USER)
23
   WORD wVersionRequested;
24
   WSADATA wsaData;
25
   int err;
26
27
 
28
   wVersionRequested = MAKEWORD(1, 1);
29
30
 
31
   if (err != 0) {
32
      debug_printf("WSAStartup failed with error: %d\n", err);
33
      return FALSE;
34
   }
35
   return TRUE;
36
#elif defined(PIPE_HAVE_SOCKETS)
37
   return TRUE;
38
#else
39
   return FALSE;
40
#endif
41
}
42
43
 
44
u_socket_stop()
45
{
46
#if defined(PIPE_SUBSYSTEM_WINDOWS_USER)
47
   WSACleanup();
48
#endif
49
}
50
51
 
52
u_socket_close(int s)
53
{
54
   if (s < 0)
55
      return;
56
57
 
58
    || defined(PIPE_OS_APPLE) || defined(PIPE_OS_SOLARIS)
59
   shutdown(s, SHUT_RDWR);
60
   close(s);
61
#elif defined(PIPE_SUBSYSTEM_WINDOWS_USER)
62
   shutdown(s, SD_BOTH);
63
   closesocket(s);
64
#else
65
   assert(0);
66
#endif
67
}
68
69
 
70
{
71
#if defined(PIPE_HAVE_SOCKETS)
72
   return accept(s, NULL, NULL);
73
#else
74
   return -1;
75
#endif
76
}
77
78
 
79
u_socket_send(int s, void *data, size_t size)
80
{
81
#if defined(PIPE_HAVE_SOCKETS)
82
   return send(s, data, size, 0);
83
#else
84
   return -1;
85
#endif
86
}
87
88
 
89
u_socket_peek(int s, void *data, size_t size)
90
{
91
#if defined(PIPE_HAVE_SOCKETS)
92
   return recv(s, data, size, MSG_PEEK);
93
#else
94
   return -1;
95
#endif
96
}
97
98
 
99
u_socket_recv(int s, void *data, size_t size)
100
{
101
#if defined(PIPE_HAVE_SOCKETS)
102
   return recv(s, data, size, 0);
103
#else
104
   return -1;
105
#endif
106
}
107
108
 
109
u_socket_connect(const char *hostname, uint16_t port)
110
{
111
#if defined(PIPE_HAVE_SOCKETS)
112
   int s;
113
   struct sockaddr_in sa;
114
   struct hostent *host = NULL;
115
116
 
117
   host = gethostbyname(hostname);
118
   if (!host)
119
      return -1;
120
121
 
122
   sa.sin_family= host->h_addrtype;
123
   sa.sin_port = htons(port);
124
125
 
126
   if (s < 0)
127
      return -1;
128
129
 
130
      u_socket_close(s);
131
      return -1;
132
   }
133
134
 
135
#else
136
   assert(0);
137
   return -1;
138
#endif
139
}
140
141
 
142
u_socket_listen_on_port(uint16_t portnum)
143
{
144
#if defined(PIPE_HAVE_SOCKETS)
145
   int s;
146
   struct sockaddr_in sa;
147
   memset(&sa, 0, sizeof(struct sockaddr_in));
148
149
 
150
   sa.sin_port = htons(portnum);
151
152
 
153
   if (s < 0)
154
      return -1;
155
156
 
157
      u_socket_close(s);
158
      return -1;
159
   }
160
161
 
162
163
 
164
#else
165
   assert(0);
166
   return -1;
167
#endif
168
}
169
170
 
171
u_socket_block(int s, boolean block)
172
{
173
#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_HAIKU) \
174
    || defined(PIPE_OS_APPLE) || defined(PIPE_OS_SOLARIS)
175
   int old = fcntl(s, F_GETFL, 0);
176
   if (old == -1)
177
      return;
178
179
 
180
   if (block)
181
      fcntl(s, F_SETFL, old & ~O_NONBLOCK);
182
   else
183
      fcntl(s, F_SETFL, old | O_NONBLOCK);
184
#elif defined(PIPE_SUBSYSTEM_WINDOWS_USER)
185
   u_long iMode = block ? 0 : 1;
186
   ioctlsocket(s, FIONBIO, &iMode);
187
#else
188
   assert(0);
189
#endif
190
}
191