4 * Copyright (c) 2008 James McKenzie <james@fishsoup.dhs.org>,
14 * Revision 1.6 2008/02/27 00:27:22 james
15 * *** empty log message ***
17 * Revision 1.5 2008/02/20 22:54:22 staffcvs
18 * *** empty log message ***
20 * Revision 1.4 2008/02/20 18:31:53 james
21 * *** empty log message ***
23 * Revision 1.3 2008/02/14 02:46:44 james
24 * *** empty log message ***
26 * Revision 1.2 2008/02/14 00:57:58 james
27 * *** empty log message ***
29 * Revision 1.1 2008/02/13 18:05:06 james
30 * *** empty log message ***
35 #include <sys/socket.h>
38 #define BUF_SIZE 65536
42 wrap_recv (int fd, void *buf, int len)
46 red = recv (fd, buf, len, 0);
50 if ((red < 0) && (errno == EAGAIN))
57 wrap_send (int fd, void *buf, int len)
63 writ = send (fd, buf, len, MSG_NOSIGNAL);
68 if ((writ < 0) && (errno == EAGAIN))
75 socket_free (Socket * s)
80 slide_free (s->read_buf);
82 slide_free (s->write_buf);
83 if (s->path_to_unlink)
85 unlink (s->path_to_unlink);
86 free (s->path_to_unlink);
93 socket_free_parent (Socket * s)
98 slide_free (s->read_buf);
100 slide_free (s->write_buf);
101 if (s->path_to_unlink)
102 free (s->path_to_unlink);
110 socket_listen (char *path)
113 struct sockaddr_un *sun;
120 fd = socket (PF_UNIX, SOCK_STREAM, 0);
125 n = strlen (path) + sizeof (struct sockaddr_un);
126 sun = (struct sockaddr_un *) malloc (n);
129 sun->sun_family = AF_UNIX;
130 strcpy (sun->sun_path, path);
132 if (bind (fd, (struct sockaddr *) sun, SUN_LEN (sun)) < 0)
141 if (listen (fd, 5) < 0)
147 set_nonblocking (fd);
149 ret = (Socket *) malloc (sizeof (Socket));
150 memset (ret, 0, sizeof (Socket));
151 ret->read_buf = NULL;
152 ret->write_buf = NULL;
155 ret->path_to_unlink = strdup (path);
162 socket_accept (Socket * l)
167 struct sockaddr_un sun;
169 len = sizeof (struct sockaddr_un);
171 fd = accept (l->fd, (struct sockaddr *) &sun, &len);
177 ret = (Socket *) malloc (sizeof (Socket));
178 memset (ret, 0, sizeof (Socket));
180 set_nonblocking (fd);
183 ret->read_buf = slide_new (BUF_SIZE);
184 ret->write_buf = slide_new (BUF_SIZE);
193 socket_connect (char *path)
197 struct sockaddr_un *sun;
201 fd = socket (PF_UNIX, SOCK_STREAM, 0);
206 n = strlen (path) + sizeof (struct sockaddr_un);
207 sun = (struct sockaddr_un *) malloc (n);
210 sun->sun_family = AF_UNIX;
211 strcpy (sun->sun_path, path);
213 if (connect (fd, (struct sockaddr *) sun, SUN_LEN (sun)))
222 set_nonblocking (fd);
224 ret = (Socket *) malloc (sizeof (Socket));
225 memset (ret, 0, sizeof (Socket));
228 ret->read_buf = slide_new (BUF_SIZE);
229 ret->write_buf = slide_new (BUF_SIZE);
236 socket_consume_msg (Socket * s)
243 ipc_consume_message_in_slide (s->read_buf);
244 s->msg = ipc_check_for_message_in_slide (s->read_buf);
249 socket_pre_select (Socket * s, fd_set * rfds, fd_set * wfds)
255 if (SOCKET_IS_LISTENER (s))
257 FD_SET (s->fd, rfds);
261 if (!SLIDE_EMPTY (s->write_buf))
262 FD_SET (s->fd, wfds);
264 if (!SLIDE_FULL (s->read_buf))
265 FD_SET (s->fd, rfds);
270 socket_post_select (Socket * s, fd_set * rfds, fd_set * wfds)
277 if ((!SLIDE_EMPTY (s->write_buf)) && FD_ISSET (s->fd, wfds))
280 (SLIDE_BYTES (s->write_buf) >
281 MAX_TXN) ? MAX_TXN : SLIDE_BYTES (s->write_buf);
282 n = wrap_send (s->fd, SLIDE_RPTR (s->write_buf), n);
284 slide_consume (s->write_buf, n);
289 if (!SLIDE_FULL (s->read_buf) && FD_ISSET (s->fd, rfds))
292 (SLIDE_SPACE (s->read_buf) >
293 MAX_TXN) ? MAX_TXN : SLIDE_SPACE (s->read_buf);
294 n = wrap_recv (s->fd, SLIDE_WPTR (s->read_buf), n);
296 slide_added (s->read_buf, n);
301 s->msg = ipc_check_for_message_in_slide (s->read_buf);
309 socket_write (Socket * s, void *buf, int len)
313 slide_expand (s->write_buf, len);
314 memcpy (SLIDE_WPTR (s->write_buf), buf, len);
315 slide_added (s->write_buf, len);
318 (SLIDE_BYTES (s->write_buf) >
319 MAX_TXN) ? MAX_TXN : SLIDE_BYTES (s->write_buf);
320 n = wrap_send (s->fd, SLIDE_RPTR (s->write_buf), n);
322 uint8_t *c = SLIDE_RPTR (s->write_buf);
326 slide_consume (s->write_buf, n);