NAMD
vmdsock.C
Go to the documentation of this file.
1 
7 #if ( defined(DUMMY_VMDSOCK) )
8 
9 #include "vmdsock.h"
10 
11 int vmdsock_init(void) { return -1; }
12 void * vmdsock_create(void) { return 0; }
13 int vmdsock_connect(void *v, const char *host, int port) { return 0; }
14 int vmdsock_bind(void * v, int port) { return 0; }
15 int vmdsock_listen(void * v) { return 0; }
16 void *vmdsock_accept(void * v) { return 0; }
17 int vmdsock_write(void * v, const void *buf, int len) { return 0; }
18 int vmdsock_read(void * v, void *buf, int len) { return 0; }
19 void vmdsock_destroy(void * v) { return; }
20 int vmdsock_selread(void *v, int sec) { return 0; }
21 int vmdsock_selwrite(void *v, int sec) { return 0; }
22 
23 #else
24 
25 #define VMDSOCKINTERNAL
26 
27 #include <sys/types.h>
28 #include <stdio.h>
29 #include <stdlib.h>
30 #include <string.h>
31 
32 #if defined(WIN32) && !defined(__CYGWIN__)
33 #include <winsock.h>
34 #else
35 #include <strings.h>
36 #include <arpa/inet.h>
37 #include <fcntl.h>
38 
39 #include <unistd.h> /* for Linux */
40 #include <sys/socket.h>
41 #include <netdb.h>
42 #endif
43 
44 #include <errno.h>
45 
46 #include "vmdsock.h"
47 
48 #ifdef NAMD_SOCKLEN_T
49 typedef NAMD_SOCKLEN_T socklen_t;
50 #endif
51 
52 int vmdsock_init(void) {
53 #if defined(WIN32) && !defined(__CYGWIN__)
54  int rc = 0;
55 
56 /*
57 ** XXX static and global variables are unsafe for shared memory builds.
58 ** The global and static vars should be eliminated.
59 */
60  static int initialized=0;
61 
62  if (!initialized) {
63  WSADATA wsdata;
64  rc = WSAStartup(MAKEWORD(1,1), &wsdata);
65  if (rc == 0)
66  initialized = 1;
67  }
68 
69  return rc;
70 #else
71  return 0;
72 #endif
73 }
74 
75 
76 void * vmdsock_create(void) {
77  vmdsocket * s;
78 
79  s = (vmdsocket *) malloc(sizeof(vmdsocket));
80  if (s != NULL)
81  memset(s, 0, sizeof(vmdsocket));
82 
83  if ((s->sd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
84  printf("Failed to open socket.");
85  free(s);
86  return NULL;
87  }
88 
89  return (void *) s;
90 }
91 
92 int vmdsock_connect(void *v, const char *host, int port) {
93  vmdsocket *s = (vmdsocket *) v;
94  char address[1030];
95  struct hostent *h;
96 
97  h=gethostbyname(host);
98  if (h == NULL)
99  return -1;
100  sprintf(address, "%d.%d.%d.%d",
101  (unsigned char) h->h_addr_list[0][0],
102  (unsigned char) h->h_addr_list[0][1],
103  (unsigned char) h->h_addr_list[0][2],
104  (unsigned char) h->h_addr_list[0][3]);
105 
106  memset(&(s->addr), 0, sizeof(s->addr));
107  s->addr.sin_family = PF_INET;
108  s->addr.sin_addr.s_addr = inet_addr(address);
109  s->addr.sin_port = htons(port);
110 
111  return connect(s->sd, (struct sockaddr *) &s->addr, sizeof(s->addr));
112 }
113 
114 int vmdsock_bind(void * v, int port) {
115  vmdsocket *s = (vmdsocket *) v;
116  memset(&(s->addr), 0, sizeof(s->addr));
117  s->addr.sin_family = PF_INET;
118  s->addr.sin_port = htons(port);
119 
120  return bind(s->sd, (struct sockaddr *) &s->addr, sizeof(s->addr));
121 }
122 
123 int vmdsock_listen(void * v) {
124  vmdsocket *s = (vmdsocket *) v;
125  return listen(s->sd, 5);
126 }
127 
128 void *vmdsock_accept(void * v) {
129  int rc;
130  vmdsocket *new_s = NULL, *s = (vmdsocket *) v;
131  socklen_t len;
132 
133  len = sizeof(s->addr);
134  rc = accept(s->sd, (struct sockaddr *) &s->addr, &len);
135  if (rc >= 0) {
136  new_s = (vmdsocket *) malloc(sizeof(vmdsocket));
137  if (new_s != NULL) {
138  *new_s = *s;
139  new_s->sd = rc;
140  }
141  }
142  return (void *)new_s;
143 }
144 
145 int vmdsock_write(void * v, const void *buf, int len) {
146  vmdsocket *s = (vmdsocket *) v;
147 #if defined(WIN32) && !defined(__CYGWIN__)
148  return send(s->sd, (const char*) buf, len, 0); // windows lacks the write() call
149 #else
150  return write(s->sd, buf, len);
151 #endif
152 }
153 
154 int vmdsock_read(void * v, void *buf, int len) {
155  vmdsocket *s = (vmdsocket *) v;
156 #if defined(WIN32) && !defined(__CYGWIN__)
157  return recv(s->sd, (char*) buf, len, 0); // windows lacks the read() call
158 #else
159  return read(s->sd, buf, len);
160 #endif
161 
162 }
163 
164 void vmdsock_destroy(void * v) {
165  vmdsocket * s = (vmdsocket *) v;
166  if (s == NULL)
167  return;
168 
169 #if defined(WIN32) && !defined(__CYGWIN__)
170  closesocket(s->sd);
171 #else
172  close(s->sd);
173 #endif
174  free(s);
175 }
176 
177 int vmdsock_selread(void *v, int sec) {
178  vmdsocket *s = (vmdsocket *)v;
179  fd_set rfd;
180  struct timeval tv;
181  int rc;
182 
183  FD_ZERO(&rfd);
184  FD_SET(s->sd, &rfd);
185  memset((void *)&tv, 0, sizeof(struct timeval));
186  tv.tv_sec = sec;
187  do {
188  rc = select(s->sd+1, &rfd, NULL, NULL, &tv);
189  } while (rc < 0 && errno == EINTR);
190  return rc;
191 
192 }
193 
194 int vmdsock_selwrite(void *v, int sec) {
195  vmdsocket *s = (vmdsocket *)v;
196  fd_set wfd;
197  struct timeval tv;
198  int rc;
199 
200  FD_ZERO(&wfd);
201  FD_SET(s->sd, &wfd);
202  memset((void *)&tv, 0, sizeof(struct timeval));
203  tv.tv_sec = sec;
204  do {
205  rc = select(s->sd + 1, NULL, &wfd, NULL, &tv);
206  } while (rc < 0 && errno == EINTR);
207  return rc;
208 }
209 
210 #endif
211 
int vmdsock_selwrite(void *v, int sec)
Definition: vmdsock.C:194
void * vmdsock_create(void)
Definition: vmdsock.C:76
int vmdsock_selread(void *v, int sec)
Definition: vmdsock.C:177
int vmdsock_connect(void *v, const char *host, int port)
Definition: vmdsock.C:92
int vmdsock_init(void)
Definition: vmdsock.C:52
int vmdsock_listen(void *v)
Definition: vmdsock.C:123
int vmdsock_bind(void *v, int port)
Definition: vmdsock.C:114
void vmdsock_destroy(void *v)
Definition: vmdsock.C:164
int vmdsock_write(void *v, const void *buf, int len)
Definition: vmdsock.C:145
int vmdsock_read(void *v, void *buf, int len)
Definition: vmdsock.C:154
void * vmdsock_accept(void *v)
Definition: vmdsock.C:128