root/ext/net/gauche/net.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. ScmSockAddr
  2. ScmSockAddrUn
  3. ScmSockAddrIn
  4. ScmSockAddrIn6
  5. ScmSocket
  6. ScmSysHostent
  7. ScmSysProtoent
  8. ScmSysServent
  9. 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 */

/* [<][>][^][v][top][bottom][index][help] */