4 * Copyright (c) 2008 James McKenzie <james@fishsoup.dhs.org>,
14 * Revision 1.3 2008/02/14 02:46:44 james
15 * *** empty log message ***
17 * Revision 1.2 2008/02/14 00:57:58 james
18 * *** empty log message ***
20 * Revision 1.1 2008/02/13 18:05:06 james
21 * *** empty log message ***
26 #include <sys/socket.h>
29 #define BUF_SIZE 16384
34 socket_free (Socket * s)
39 slide_free (s->read_buf);
41 slide_free (s->write_buf);
47 socket_listen (char *path)
50 struct sockaddr_un *sun;
57 fd = socket (PF_UNIX, SOCK_STREAM, 0);
62 n = strlen (path) + sizeof (struct sockaddr_un);
63 sun = (struct sockaddr_un *) malloc (n);
66 sun->sun_family = AF_UNIX;
67 strcpy (sun->sun_path, path);
69 if (bind (fd, (struct sockaddr *) sun, SUN_LEN (sun)) < 0)
78 if (listen (fd, 5) < 0)
86 ret = (Socket *) malloc (sizeof (Socket));
87 memset (ret, 0, sizeof (Socket));
89 ret->write_buf = NULL;
98 socket_accept (Socket * l)
103 struct sockaddr_un sun;
105 len = sizeof (struct sockaddr_un);
107 fd = accept (l->fd, (struct sockaddr *) &sun, &len);
113 ret = (Socket *) malloc (sizeof (Socket));
114 memset (ret, 0, sizeof (Socket));
116 set_nonblocking (fd);
119 ret->read_buf = slide_new (BUF_SIZE);
120 ret->write_buf = slide_new (BUF_SIZE);
129 socket_connect (char *path)
133 struct sockaddr_un *sun;
137 fd = socket (PF_UNIX, SOCK_STREAM, 0);
142 n = strlen (path) + sizeof (struct sockaddr_un);
143 sun = (struct sockaddr_un *) malloc (n);
146 sun->sun_family = AF_UNIX;
147 strcpy (sun->sun_path, path);
149 if (connect (fd, (struct sockaddr *) sun, SUN_LEN (sun)))
158 set_nonblocking (fd);
160 ret = (Socket *) malloc (sizeof (Socket));
161 memset (ret, 0, sizeof (Socket));
164 ret->read_buf = slide_new (BUF_SIZE);
165 ret->write_buf = slide_new (BUF_SIZE);
172 socket_consume_msg (Socket * s)
179 ipc_consume_message_in_slide (s->read_buf);
180 s->msg = ipc_check_for_message_in_slide (s->read_buf);
185 socket_pre_select (Socket * s, fd_set * rfds, fd_set * wfds)
191 if (SOCKET_IS_LISTENER (s))
193 FD_SET (s->fd, rfds);
197 if (!SLIDE_EMPTY (s->write_buf))
198 FD_SET (s->fd, wfds);
200 if (!SLIDE_FULL (s->read_buf))
201 FD_SET (s->fd, rfds);
206 socket_post_select (Socket * s, fd_set * rfds, fd_set * wfds)
213 if ((!SLIDE_EMPTY (s->write_buf)) && FD_ISSET (s->fd, wfds))
216 (SLIDE_BYTES (s->write_buf) >
217 MAX_TXN) ? MAX_TXN : SLIDE_BYTES (s->write_buf);
218 n = wrap_write (s->fd, SLIDE_RPTR (s->write_buf), n);
220 slide_consume (s->write_buf, n);
225 if (!SLIDE_FULL (s->read_buf) && FD_ISSET (s->fd, rfds))
228 (SLIDE_SPACE (s->read_buf) >
229 MAX_TXN) ? MAX_TXN : SLIDE_SPACE (s->read_buf);
230 n = wrap_read (s->fd, SLIDE_WPTR (s->read_buf), n);
232 slide_added (s->read_buf, n);
237 s->msg = ipc_check_for_message_in_slide (s->read_buf);
245 socket_write (Socket * s, void *buf, int len)
249 slide_expand (s->write_buf, len);
250 memcpy (SLIDE_WPTR (s->write_buf), buf, len);
251 slide_added (s->write_buf, len);
254 (SLIDE_BYTES (s->write_buf) >
255 MAX_TXN) ? MAX_TXN : SLIDE_BYTES (s->write_buf);
256 n = wrap_write (s->fd, SLIDE_RPTR (s->write_buf), n);
258 uint8_t *c = SLIDE_RPTR (s->write_buf);
262 slide_consume (s->write_buf, n);