4 * Copyright (c) 2008 James McKenzie <james@fishsoup.dhs.org>,
14 * Revision 1.5 2008/02/20 22:54:22 staffcvs
15 * *** empty log message ***
17 * Revision 1.4 2008/02/20 18:31:53 james
18 * *** empty log message ***
20 * Revision 1.3 2008/02/14 02:46:44 james
21 * *** empty log message ***
23 * Revision 1.2 2008/02/14 00:57:58 james
24 * *** empty log message ***
26 * Revision 1.1 2008/02/13 18:05:06 james
27 * *** empty log message ***
32 #include <sys/socket.h>
35 #define BUF_SIZE 16384
39 wrap_recv (int fd, void *buf, int len)
43 red = recv (fd, buf, len, 0);
47 if ((red < 0) && (errno == EAGAIN))
54 wrap_send (int fd, void *buf, int len)
60 writ = send (fd, buf, len, MSG_NOSIGNAL);
65 if ((writ < 0) && (errno == EAGAIN))
72 socket_free (Socket * s)
77 slide_free (s->read_buf);
79 slide_free (s->write_buf);
80 if (s->path_to_unlink)
82 unlink (s->path_to_unlink);
83 free (s->path_to_unlink);
90 socket_free_parent (Socket * s)
95 slide_free (s->read_buf);
97 slide_free (s->write_buf);
98 if (s->path_to_unlink)
99 free (s->path_to_unlink);
107 socket_listen (char *path)
110 struct sockaddr_un *sun;
117 fd = socket (PF_UNIX, SOCK_STREAM, 0);
122 n = strlen (path) + sizeof (struct sockaddr_un);
123 sun = (struct sockaddr_un *) malloc (n);
126 sun->sun_family = AF_UNIX;
127 strcpy (sun->sun_path, path);
129 if (bind (fd, (struct sockaddr *) sun, SUN_LEN (sun)) < 0)
138 if (listen (fd, 5) < 0)
144 set_nonblocking (fd);
146 ret = (Socket *) malloc (sizeof (Socket));
147 memset (ret, 0, sizeof (Socket));
148 ret->read_buf = NULL;
149 ret->write_buf = NULL;
152 ret->path_to_unlink = strdup (path);
159 socket_accept (Socket * l)
164 struct sockaddr_un sun;
166 len = sizeof (struct sockaddr_un);
168 fd = accept (l->fd, (struct sockaddr *) &sun, &len);
174 ret = (Socket *) malloc (sizeof (Socket));
175 memset (ret, 0, sizeof (Socket));
177 set_nonblocking (fd);
180 ret->read_buf = slide_new (BUF_SIZE);
181 ret->write_buf = slide_new (BUF_SIZE);
190 socket_connect (char *path)
194 struct sockaddr_un *sun;
198 fd = socket (PF_UNIX, SOCK_STREAM, 0);
203 n = strlen (path) + sizeof (struct sockaddr_un);
204 sun = (struct sockaddr_un *) malloc (n);
207 sun->sun_family = AF_UNIX;
208 strcpy (sun->sun_path, path);
210 if (connect (fd, (struct sockaddr *) sun, SUN_LEN (sun)))
219 set_nonblocking (fd);
221 ret = (Socket *) malloc (sizeof (Socket));
222 memset (ret, 0, sizeof (Socket));
225 ret->read_buf = slide_new (BUF_SIZE);
226 ret->write_buf = slide_new (BUF_SIZE);
233 socket_consume_msg (Socket * s)
240 ipc_consume_message_in_slide (s->read_buf);
241 s->msg = ipc_check_for_message_in_slide (s->read_buf);
246 socket_pre_select (Socket * s, fd_set * rfds, fd_set * wfds)
252 if (SOCKET_IS_LISTENER (s))
254 FD_SET (s->fd, rfds);
258 if (!SLIDE_EMPTY (s->write_buf))
259 FD_SET (s->fd, wfds);
261 if (!SLIDE_FULL (s->read_buf))
262 FD_SET (s->fd, rfds);
267 socket_post_select (Socket * s, fd_set * rfds, fd_set * wfds)
274 if ((!SLIDE_EMPTY (s->write_buf)) && FD_ISSET (s->fd, wfds))
277 (SLIDE_BYTES (s->write_buf) >
278 MAX_TXN) ? MAX_TXN : SLIDE_BYTES (s->write_buf);
279 n = wrap_send (s->fd, SLIDE_RPTR (s->write_buf), n);
281 slide_consume (s->write_buf, n);
286 if (!SLIDE_FULL (s->read_buf) && FD_ISSET (s->fd, rfds))
289 (SLIDE_SPACE (s->read_buf) >
290 MAX_TXN) ? MAX_TXN : SLIDE_SPACE (s->read_buf);
291 n = wrap_recv (s->fd, SLIDE_WPTR (s->read_buf), n);
293 slide_added (s->read_buf, n);
298 s->msg = ipc_check_for_message_in_slide (s->read_buf);
306 socket_write (Socket * s, void *buf, int len)
310 slide_expand (s->write_buf, len);
311 memcpy (SLIDE_WPTR (s->write_buf), buf, len);
312 slide_added (s->write_buf, len);
315 (SLIDE_BYTES (s->write_buf) >
316 MAX_TXN) ? MAX_TXN : SLIDE_BYTES (s->write_buf);
317 n = wrap_send (s->fd, SLIDE_RPTR (s->write_buf), n);
319 uint8_t *c = SLIDE_RPTR (s->write_buf);
323 slide_consume (s->write_buf, n);