1 /* -*- Mode: C; c-basic-offset:4 ; -*- */
2 /*
3  *  (C) 2001 by Argonne National Laboratory.
4  *      See COPYRIGHT in top-level directory.
5  */
6 #ifndef BSOCKET_H_INCLUDED
7 #define BSOCKET_H_INCLUDED
8 
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 #include "mpidi_ch3_conf.h"
14 #include "mpichconf.h"
15 
16 /* sockaddr_in (Internet) */
17 #ifdef HAVE_NETINET_IN_H
18 #include <netinet/in.h>
19 #endif
20 #ifdef HAVE_WINSOCK2_H
21 #include <winsock2.h>
22 #include <windows.h>
23 #endif
24 #ifdef HAVE_SYS_SOCKET_H
25 #include <sys/socket.h>
26 #endif
27 #ifdef HAVE_SYS_SELECT_H
28 #include <sys/select.h>
29 #endif
30 #ifdef HAVE_NETINET_TCP_H
31 #include <netinet/tcp.h>
32 #endif
33 
34 #ifndef SOCKET_ERROR
35 #define SOCKET_ERROR -1
36 #endif
37 
38 #ifndef ADDR_ANY
39 #define ADDR_ANY 0
40 #endif
41 #ifndef INADDR_ANY
42 #define INADDR_ANY 0
43 #endif
44 
45 #ifdef HAVE_WINDOWS_SOCKET
46 #define bfd_close closesocket
47 #define bfd_read(a,b,c) recv(a,b,c,0)
48 #define bfd_write(a,b,c) send(a,b,c,0)
49 #else
50 #define bfd_close close
51 #define bfd_read(a,b,c) read(a,b,c)
52 #define bfd_write(a,b,c) write(a,b,c)
53 #endif
54 
55 #ifdef HAVE_WINSOCK2_H
56 #ifndef socklen_t
57 typedef int socklen_t;
58 #endif
59 #else
60 #ifndef socklen_t
61 #define socklen_t int
62 #endif
63 #endif
64 
65 #ifdef HAVE_WINSOCK2_H
66 #define B_VECTOR         WSABUF
67 #define B_VECTOR_LEN     len
68 #define B_VECTOR_BUF     buf
69 #else
70 #ifdef HAVE_SYS_UIO_H
71 #include <sys/uio.h>
72 #endif
73 #define B_VECTOR         struct iovec
74 #define B_VECTOR_LEN     iov_len
75 #define B_VECTOR_BUF     iov_base
76 #endif
77 #define B_VECTOR_LIMIT   16
78 
79 #define BFD_INVALID_SOCKET -1
80 
81 /* This was ifdef NO_BSOCKETS but should have been USE_BSOCKETS */
82 #ifndef USE_BSOCKETS
83 
84 #define bfd_set fd_set
85 #define BFD_CLR(bfd, s)       FD_CLR((unsigned int)bfd,s)
86 #define BFD_ZERO(s)           FD_ZERO(s)
87 #define BFD_SET(bfd, s)       FD_SET((unsigned int)bfd,s)
88 #define BFD_ISSET(bfd, s)     FD_ISSET((unsigned int)bfd,s)
89 
90 #define BFD_MAX(a,b) (((a) > (b)) ? (a) : (b))
91 
92 #define bcopyset(dest, src) *(dest) = *(src)
93 #define bget_fd(bfd) bfd
94 #define bclr(bfd, s) FD_CLR( (unsigned int)bfd, s )
95 #define bset(bfd, s) FD_SET( (unsigned int)bfd, s )
96 #define bsocket(family, type, protocol) socket(family, type, protocol)
97 #define bbind(bfd, servaddr, servaddr_len) bind(bfd, servaddr, servaddr_len)
98 #define blisten(bfd, backlog) listen(bfd, backlog)
99 #define bsetsockopt(bfd, level, optname, optval, optlen) setsockopt(bfd, level, optname, optval, optlen)
100 #define baccept(bfd, cliaddr, clilen) accept(bfd, cliaddr, clilen)
101 #define bconnect(bfd, servaddr, servaddr_len) connect(bfd, servaddr, servaddr_len)
102 #define bselect(maxfds, readbfds, writebfds, execbfds, tv) select(maxfds, readbfds, writebfds, execbfds, tv)
103 #define bwrite(bfd, ubuf, len) bfd_write(bfd, ubuf, len)
104 #define bread(bfd, ubuf, len) bfd_read(bfd, ubuf, len)
105 #define bclose(bfd) bfd_close(bfd)
106 #define bgetsockname(bfd, name, namelen) getsockname(bfd, name, namelen)
107 
108 #else /* #ifndef USE_BSOCKETS */
109 
110 typedef struct BFD_Buffer_struct BFD_Buffer;
111 typedef struct bfd_set
112 {
113     fd_set set;
114     int n;
115     BFD_Buffer *p[FD_SETSIZE];
116 } bfd_set;
117 /*#define BFD_CLR(bfd, s)       FD_CLR( bget_fd(bfd), & (s) -> set )*/
118 #define BFD_CLR(bfd, s)       bclr( bfd, s )
119 #define BFD_ZERO(s)           { FD_ZERO(& (s) -> set); (s) -> n = 0; }
120 #define BFD_SET(bfd, s)       bset( bfd , s )
121 #define BFD_ISSET(bfd, s)     FD_ISSET( bget_fd(bfd), & (s) -> set )
122 /*
123 #define bfd_set                 fd_set
124 #define BFD_CLR(bfd, set)       FD_CLR( bget_fd(bfd), set )
125 #define BFD_ZERO(set)           FD_ZERO(set)
126 #define BFD_SET(bfd, set)       FD_SET( bget_fd(bfd), set )
127 #define BFD_ISSET(bfd, set)     FD_ISSET( bget_fd(bfd), set )
128 */
129 
130 #define BFD_MAX(a,b) (((bget_fd(a)) > (bget_fd(b))) ? (a) : (b))
131 
132 /* bsockets.c */
133 void bcopyset(bfd_set *dest, bfd_set *src);
134 unsigned int bget_fd(int bfd);
135 void bset(int bfd, bfd_set *s);
136 void bclr(int bfd, bfd_set *s);
137 int bsocket_init( void );
138 int bsocket_finalize( void );
139 int bsocket( int, int, int );
140 int bbind( int, const struct sockaddr *, socklen_t );
141 int blisten( int, int );
142 int bsetsockopt( int, int, int, const void *, socklen_t );
143 int baccept( int, struct sockaddr *, socklen_t * );
144 int bconnect( int, const struct sockaddr *, socklen_t );
145 int bread( int, char *, int );
146 int breadwrite( int, int, char *, int, int *, int * );
147 int breadvwrite( int, int, B_VECTOR *, int, int *, int * );
148 int bwrite( int, char *, int );
149 int bclose( int );
150 int bclose_all( void );
151 int bgetsockname(int bfd, struct sockaddr *name, int *namelen );
152 int bselect( int maxfds, bfd_set *readbfds, bfd_set *writebfds, bfd_set *execbfds, struct timeval *tv );
153 
154 #endif /* #else #ifndef USE_BSOCKETS */
155 
156 int bsocket_init( void );
157 int bsocket_finalize( void );
158 int breadv( int, B_VECTOR *, int );
159 int bwritev( int, B_VECTOR *, int );
160 int bmake_nonblocking( int );
161 int bmake_blocking( int );
162 
163 int beasy_create(int *bfd, int port, unsigned long addr);
164 int beasy_connect(int bfd, char *host, int port);
165 int beasy_connect_timeout(int bfd, char *host, int port, int seconds);
166 int beasy_accept(int bfd);
167 int beasy_closesocket(int bfd);
168 int beasy_get_sock_info(int bfd, char *name, int *port);
169 int beasy_get_ip_string(char *ipstring);
170 int beasy_get_ip(unsigned long *ip);
171 int beasy_receive(int bfd, char *buffer, int len);
172 int beasy_receive_timeout(int bfd, char *buffer, int len, int timeout);
173 int beasy_receive_some(int bfd, char *buffer, int len);
174 int beasy_send(int bfd, char *buffer, int length);
175 int beasy_getlasterror(void);
176 int beasy_error_to_string(int error, char *str, int length);
177 
178 #ifdef __cplusplus
179 }
180 #endif
181 
182 #endif
183