4 * Copyright (c) 2008 James McKenzie <james@fishsoup.dhs.org>,
14 * Revision 1.4 2008/02/20 18:31:53 james
15 * *** empty log message ***
17 * Revision 1.3 2008/02/14 02:46:44 james
18 * *** empty log message ***
20 * Revision 1.2 2008/02/14 00:57:58 james
21 * *** empty log message ***
23 * Revision 1.1 2008/02/13 18:05:06 james
24 * *** empty log message ***
29 #include <sys/socket.h>
32 #define BUF_SIZE 16384
36 wrap_recv (int fd, void *buf, int len)
40 red = recv (fd, buf, len,0);
44 if ((red < 0) && (errno == EAGAIN))
51 wrap_send (int fd, void *buf, int len)
57 writ = send (fd, buf, len,MSG_NOSIGNAL);
62 if ((writ < 0) && (errno == EAGAIN))
69 socket_free (Socket * s)
74 slide_free (s->read_buf);
76 slide_free (s->write_buf);
77 if (s->path_to_unlink) {
78 unlink(s->path_to_unlink);
79 free(s->path_to_unlink);
86 socket_free_parent (Socket * s)
91 slide_free (s->read_buf);
93 slide_free (s->write_buf);
94 if (s->path_to_unlink)
95 free(s->path_to_unlink);
103 socket_listen (char *path)
106 struct sockaddr_un *sun;
113 fd = socket (PF_UNIX, SOCK_STREAM, 0);
118 n = strlen (path) + sizeof (struct sockaddr_un);
119 sun = (struct sockaddr_un *) malloc (n);
122 sun->sun_family = AF_UNIX;
123 strcpy (sun->sun_path, path);
125 if (bind (fd, (struct sockaddr *) sun, SUN_LEN (sun)) < 0)
134 if (listen (fd, 5) < 0)
140 set_nonblocking (fd);
142 ret = (Socket *) malloc (sizeof (Socket));
143 memset (ret, 0, sizeof (Socket));
144 ret->read_buf = NULL;
145 ret->write_buf = NULL;
148 ret->path_to_unlink=strdup(path);
155 socket_accept (Socket * l)
160 struct sockaddr_un sun;
162 len = sizeof (struct sockaddr_un);
164 fd = accept (l->fd, (struct sockaddr *) &sun, &len);
170 ret = (Socket *) malloc (sizeof (Socket));
171 memset (ret, 0, sizeof (Socket));
173 set_nonblocking (fd);
176 ret->read_buf = slide_new (BUF_SIZE);
177 ret->write_buf = slide_new (BUF_SIZE);
186 socket_connect (char *path)
190 struct sockaddr_un *sun;
194 fd = socket (PF_UNIX, SOCK_STREAM, 0);
199 n = strlen (path) + sizeof (struct sockaddr_un);
200 sun = (struct sockaddr_un *) malloc (n);
203 sun->sun_family = AF_UNIX;
204 strcpy (sun->sun_path, path);
206 if (connect (fd, (struct sockaddr *) sun, SUN_LEN (sun)))
215 set_nonblocking (fd);
217 ret = (Socket *) malloc (sizeof (Socket));
218 memset (ret, 0, sizeof (Socket));
221 ret->read_buf = slide_new (BUF_SIZE);
222 ret->write_buf = slide_new (BUF_SIZE);
229 socket_consume_msg (Socket * s)
236 ipc_consume_message_in_slide (s->read_buf);
237 s->msg = ipc_check_for_message_in_slide (s->read_buf);
242 socket_pre_select (Socket * s, fd_set * rfds, fd_set * wfds)
248 if (SOCKET_IS_LISTENER (s))
250 FD_SET (s->fd, rfds);
254 if (!SLIDE_EMPTY (s->write_buf))
255 FD_SET (s->fd, wfds);
257 if (!SLIDE_FULL (s->read_buf))
258 FD_SET (s->fd, rfds);
263 socket_post_select (Socket * s, fd_set * rfds, fd_set * wfds)
270 if ((!SLIDE_EMPTY (s->write_buf)) && FD_ISSET (s->fd, wfds))
273 (SLIDE_BYTES (s->write_buf) >
274 MAX_TXN) ? MAX_TXN : SLIDE_BYTES (s->write_buf);
275 n = wrap_send (s->fd, SLIDE_RPTR (s->write_buf), n);
277 slide_consume (s->write_buf, n);
282 if (!SLIDE_FULL (s->read_buf) && FD_ISSET (s->fd, rfds))
285 (SLIDE_SPACE (s->read_buf) >
286 MAX_TXN) ? MAX_TXN : SLIDE_SPACE (s->read_buf);
287 n = wrap_recv (s->fd, SLIDE_WPTR (s->read_buf), n);
289 slide_added (s->read_buf, n);
294 s->msg = ipc_check_for_message_in_slide (s->read_buf);
302 socket_write (Socket * s, void *buf, int len)
306 slide_expand (s->write_buf, len);
307 memcpy (SLIDE_WPTR (s->write_buf), buf, len);
308 slide_added (s->write_buf, len);
311 (SLIDE_BYTES (s->write_buf) >
312 MAX_TXN) ? MAX_TXN : SLIDE_BYTES (s->write_buf);
313 n = wrap_send (s->fd, SLIDE_RPTR (s->write_buf), n);
315 uint8_t *c = SLIDE_RPTR (s->write_buf);
319 slide_consume (s->write_buf, n);