/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following definitions.
- ScmSockAddr
- ScmSockAddrUn
- ScmSockAddrIn
- ScmSockAddrIn6
- ScmSocket
- ScmSysHostent
- ScmSysProtoent
- ScmSysServent
- ScmSysAddrinfo
1 /*
2 * net.h - network interface
3 *
4 * Copyright (c) 2000-2003 Shiro Kawai, All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 *
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 *
17 * 3. Neither the name of the authors nor the names of its contributors
18 * may be used to endorse or promote products derived from this
19 * software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
27 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 *
33 * $Id: net.h,v 1.2 2005/09/04 23:59:54 shirok Exp $
34 */
35
36 #ifndef GAUCHE_NET_H
37 #define GAUCHE_NET_H
38
39 #include <sys/types.h>
40 #include <gauche.h>
41 #include <errno.h>
42
43 #ifndef __MINGW32__
44 #include <sys/socket.h>
45 #include <netdb.h>
46 #include <netinet/in.h>
47 #include <netinet/tcp.h>
48 #include <arpa/inet.h>
49 #include <sys/un.h>
50 typedef int Socket;
51 #define closeSocket close
52 #define INVALID_SOCKET ((Socket)-1)
53 #else /*__MINGW32__*/
54 #include <winsock2.h>
55 #include <mswsock.h>
56 typedef SOCKET Socket;
57 #define closeSocket closesocket
58 #endif /*__MINGW32__*/
59
60 #ifdef HAVE_RPC_TYPES_H
61 #include <rpc/types.h>
62 #endif
63
64 #ifdef HAVE_STDINT_H
65 #include <stdint.h>
66 #endif
67
68 SCM_DECL_BEGIN
69
70 /*==================================================================
71 * Socket
72 */
73
74 /*------------------------------------------------------------------
75 * Socket address
76 */
77
78 typedef struct ScmSockAddrRec {
79 SCM_HEADER;
80 socklen_t addrlen;
81 struct sockaddr addr;
82 } ScmSockAddr;
83
84 SCM_CLASS_DECL(Scm_SockAddrClass);
85 #define SCM_CLASS_SOCKADDR (&Scm_SockAddrClass)
86 #define SCM_SOCKADDR(obj) ((ScmSockAddr*)(obj))
87 #define SCM_SOCKADDRP(obj) SCM_XTYPEP(obj, SCM_CLASS_SOCKADDR)
88
89 #define SCM_SOCKADDR_FAMILY(obj) SCM_SOCKADDR(obj)->addr.sa_family
90
91 int Scm_SockAddrP(ScmObj obj);
92 ScmObj Scm_SockAddrName(ScmSockAddr *addr);
93 ScmObj Scm_SockAddrFamily(ScmSockAddr *addr);
94 ScmObj Scm_MakeSockAddr(ScmClass *klass, struct sockaddr *addr, int len);
95
96 extern ScmGeneric Scm_GenericSockAddrName;
97 extern ScmGeneric Scm_GenericSockAddrFamily;
98 extern ScmGeneric Scm_GenericSockAddrAddr;
99 extern ScmGeneric Scm_GenericSockAddrPort;
100
101 typedef struct ScmSockAddrUnRec {
102 SCM_HEADER;
103 int addrlen;
104 struct sockaddr_un addr;
105 } ScmSockAddrUn;
106
107 SCM_CLASS_DECL(Scm_SockAddrUnClass);
108 #define SCM_CLASS_SOCKADDR_UN (&Scm_SockAddrUnClass)
109
110 typedef struct ScmSockAddrInRec {
111 SCM_HEADER;
112 int addrlen;
113 struct sockaddr_in addr;
114 } ScmSockAddrIn;
115
116 SCM_CLASS_DECL(Scm_SockAddrInClass);
117 #define SCM_CLASS_SOCKADDR_IN (&Scm_SockAddrInClass)
118
119 #ifdef HAVE_IPV6
120
121 typedef struct ScmSockAddrIn6Rec {
122 SCM_HEADER;
123 int addrlen;
124 struct sockaddr_in6 addr;
125 } ScmSockAddrIn6;
126
127 SCM_CLASS_DECL(Scm_SockAddrIn6Class);
128 #define SCM_CLASS_SOCKADDR_IN6 (&Scm_SockAddrIn6Class)
129
130 #endif /* HAVE_IPV6 */
131
132 #define SCM_SOCKADDR_MAXLEN 128
133
134 /*------------------------------------------------------------------
135 * Socket
136 */
137
138 typedef struct ScmSocketRec {
139 SCM_HEADER;
140 Socket fd; /* INVALID_SOCKET if closed */
141 int status;
142 int type;
143 ScmSockAddr *address;
144 ScmPort *inPort;
145 ScmPort *outPort;
146 ScmString *name;
147 } ScmSocket;
148
149 #define SOCKET_CLOSED(fd) ((fd) == INVALID_SOCKET)
150 #define SOCKET_INVALID(fd) ((fd) == INVALID_SOCKET)
151
152 enum {
153 SCM_SOCKET_STATUS_NONE,
154 SCM_SOCKET_STATUS_BOUND,
155 SCM_SOCKET_STATUS_LISTENING,
156 SCM_SOCKET_STATUS_CONNECTED,
157 SCM_SOCKET_STATUS_SHUTDOWN,
158 SCM_SOCKET_STATUS_CLOSED
159 };
160
161 SCM_CLASS_DECL(Scm_SocketClass);
162 #define SCM_CLASS_SOCKET (&Scm_SocketClass)
163 #define SCM_SOCKET(obj) ((ScmSocket*)obj)
164 #define SCM_SOCKETP(obj) SCM_XTYPEP(obj, SCM_CLASS_SOCKET)
165
166 extern ScmObj Scm_MakeSocket(int domain, int type, int protocol);
167 extern ScmObj Scm_SocketShutdown(ScmSocket *s, int how);
168 extern ScmObj Scm_SocketClose(ScmSocket *s);
169
170 extern ScmObj Scm_SocketInputPort(ScmSocket *s, int buffered);
171 extern ScmObj Scm_SocketOutputPort(ScmSocket *s, int buffered);
172
173 extern ScmObj Scm_SocketBind(ScmSocket *s, ScmSockAddr *addr);
174 extern ScmObj Scm_SocketConnect(ScmSocket *s, ScmSockAddr *addr);
175 extern ScmObj Scm_SocketListen(ScmSocket *s, int backlog);
176 extern ScmObj Scm_SocketAccept(ScmSocket *s);
177
178 extern ScmObj Scm_SocketGetSockName(ScmSocket *s);
179 extern ScmObj Scm_SocketGetPeerName(ScmSocket *s);
180
181 extern ScmObj Scm_SocketSend(ScmSocket *s, ScmString *msg, int flags);
182 extern ScmObj Scm_SocketSendTo(ScmSocket *s, ScmString *msg, ScmSockAddr *to, int flags);
183 extern ScmObj Scm_SocketRecv(ScmSocket *s, int bytes, int flags);
184 extern ScmObj Scm_SocketRecvFrom(ScmSocket *s, int bytes, int flags);
185
186 extern ScmObj Scm_SocketSetOpt(ScmSocket *s, int level,
187 int option, ScmObj value);
188 extern ScmObj Scm_SocketGetOpt(ScmSocket *s, int level,
189 int option, int resulttype);
190
191 /*==================================================================
192 * Netdb interface
193 */
194
195 /*
196 * Host entry
197 */
198 typedef struct ScmSysHostentRec {
199 SCM_HEADER;
200 ScmObj name; /* Scheme string of the host */
201 ScmObj aliases; /* list of aliases */
202 ScmObj addresses; /* list of addresses */
203 } ScmSysHostent;
204
205 SCM_CLASS_DECL(Scm_SysHostentClass);
206 #define SCM_CLASS_SYS_HOSTENT (&Scm_SysHostentClass)
207 #define SCM_SYS_HOSTENT(obj) ((ScmSysHostent*)obj)
208 #define SCM_SYS_HOSTENT_P(obj) SCM_XTYPEP(obj, SCM_CLASS_SYS_HOSTENT)
209
210 extern ScmObj Scm_GetHostByName(const char *name);
211 extern ScmObj Scm_GetHostByAddr(const char *addr, int type);
212 extern int Scm_HostNameToAddr(const char *name, char *addrbuf, int *addrlen);
213
214 /*
215 * Protocol Entry
216 */
217
218 typedef struct ScmSysProtoentRec {
219 SCM_HEADER;
220 ScmObj name;
221 ScmObj aliases;
222 ScmObj proto;
223 } ScmSysProtoent;
224
225 SCM_CLASS_DECL(Scm_SysProtoentClass);
226 #define SCM_CLASS_SYS_PROTOENT (&Scm_SysProtoentClass)
227 #define SCM_SYS_PROTOENT(obj) ((ScmSysProtoent*)obj)
228 #define SCM_SYS_PROTOENT_P(obj) SCM_XTYPEP(obj, SCM_CLASS_SYS_PROTOENT)
229
230 extern ScmObj Scm_GetProtoByName(const char *name);
231 extern ScmObj Scm_GetProtoByNumber(int proto);
232
233 /*
234 * Service Entry
235 */
236
237 typedef struct ScmSysServentRec {
238 SCM_HEADER;
239 ScmObj name;
240 ScmObj aliases;
241 ScmObj port;
242 ScmObj proto;
243 } ScmSysServent;
244
245 SCM_CLASS_DECL(Scm_SysServentClass);
246 #define SCM_CLASS_SYS_SERVENT (&Scm_SysServentClass)
247 #define SCM_SYS_SERVENT(obj) ((ScmSysServent*)obj)
248 #define SCM_SYS_SERVENT_P(obj) SCM_XTYPEP(obj, SCM_CLASS_SYS_SERVENT)
249
250 extern ScmObj Scm_GetServByName(const char *name, const char *proto);
251 extern ScmObj Scm_GetServByPort(int port, const char *proto);
252
253 /*
254 * Address information
255 */
256
257 #ifdef HAVE_IPV6
258
259 typedef struct ScmSysAddrinfoRec {
260 SCM_HEADER;
261 int flags;
262 int family;
263 int socktype;
264 int protocol;
265 socklen_t addrlen;
266 ScmString *canonname;
267 ScmSockAddr *addr;
268 } ScmSysAddrinfo;
269
270 SCM_CLASS_DECL(Scm_SysAddrinfoClass);
271 #define SCM_CLASS_SYS_ADDRINFO (&Scm_SysAddrinfoClass)
272 #define SCM_SYS_ADDRINFO(obj) ((ScmSysAddrinfo*)obj)
273 #define SCM_SYS_ADDRINFO_P(obj) SCM_XTYPEP(obj, SCM_CLASS_SYS_ADDRINFO)
274
275 extern ScmObj Scm_GetAddrinfo(const char *nodename,
276 const char *servname,
277 struct addrinfo *hints);
278 extern ScmObj Scm_GetNameinfo(ScmSockAddr *addr, int flags);
279
280 #define NI_MAXHOST 1025
281 #define NI_MAXSERV 32
282
283 #endif /* HAVE_IPV6 */
284
285 SCM_DECL_END
286
287 #endif /*GAUCHE_NET_H */