4 * Copyright (c) 2008 James McKenzie <james@fishsoup.dhs.org>,
14 * Revision 1.2 2008/02/14 00:57:58 james
15 * *** empty log message ***
17 * Revision 1.1 2008/02/13 18:05:06 james
18 * *** empty log message ***
23 #include <sys/socket.h>
26 #define BUF_SIZE 16384
31 socket_free (Socket * s)
36 slide_free (s->read_buf);
38 slide_free (s->write_buf);
44 socket_listen (char *path)
47 struct sockaddr_un *sun;
54 fd = socket (PF_UNIX, SOCK_STREAM, 0);
59 n = strlen (path) + sizeof (struct sockaddr_un);
60 sun = (struct sockaddr_un *) malloc (n);
63 sun->sun_family = AF_UNIX;
64 strcpy (sun->sun_path, path);
66 if (bind (fd, (struct sockaddr *) sun, SUN_LEN (sun)) < 0)
75 if (listen (fd, 5) < 0)
83 ret = (Socket *) malloc (sizeof (Socket));
84 memset (ret, 0, sizeof (Socket));
86 ret->write_buf = NULL;
95 socket_accept (Socket * l)
100 struct sockaddr_un sun;
102 len = sizeof (struct sockaddr_un);
104 fd = accept (l->fd, (struct sockaddr *) &sun, &len);
110 ret = (Socket *) malloc (sizeof (Socket));
111 memset (ret, 0, sizeof (Socket));
113 set_nonblocking (fd);
116 ret->read_buf = slide_new (BUF_SIZE);
117 ret->write_buf = slide_new (BUF_SIZE);
126 socket_connect (char *path)
130 struct sockaddr_un *sun;
134 fd = socket (PF_UNIX, SOCK_STREAM, 0);
139 n = strlen (path) + sizeof (struct sockaddr_un);
140 sun = (struct sockaddr_un *) malloc (n);
143 sun->sun_family = AF_UNIX;
144 strcpy (sun->sun_path, path);
146 if (connect (fd, (struct sockaddr *) sun, SUN_LEN (sun)))
155 set_nonblocking (fd);
157 ret = (Socket *) malloc (sizeof (Socket));
158 memset (ret, 0, sizeof (Socket));
161 ret->read_buf = slide_new (BUF_SIZE);
162 ret->write_buf = slide_new (BUF_SIZE);
168 socket_consume_msg (Socket * s)
175 ipc_consume_message_in_slide(s->read_buf);
176 s->msg = ipc_check_for_message_in_slide (s->read_buf);
181 socket_pre_select (Socket * s, fd_set * rfds, fd_set * wfds)
187 if (SOCKET_IS_LISTENER (s))
189 FD_SET (s->fd, rfds);
193 if (!SLIDE_EMPTY (s->write_buf))
194 FD_SET (s->fd, wfds);
196 if (!SLIDE_FULL (s->read_buf))
197 FD_SET (s->fd, rfds);
202 socket_post_select (Socket * s, fd_set * rfds, fd_set * wfds)
209 if ((!SLIDE_EMPTY (s->write_buf)) && FD_ISSET (s->fd, wfds))
212 (SLIDE_BYTES (s->write_buf) >
213 MAX_TXN) ? MAX_TXN : SLIDE_BYTES (s->write_buf);
214 n = wrap_write (s->fd, SLIDE_RPTR (s->write_buf), n);
216 slide_consume (s->write_buf, n);
220 if (!SLIDE_FULL (s->read_buf) && FD_ISSET (s->fd, rfds))
223 (SLIDE_SPACE (s->read_buf) >
224 MAX_TXN) ? MAX_TXN : SLIDE_SPACE (s->read_buf);
225 n = wrap_read (s->fd, SLIDE_WPTR (s->read_buf), n);
227 slide_added (s->read_buf, n);
231 s->msg = ipc_check_for_message_in_slide (s->read_buf);
239 socket_write (Socket * s, void *buf, int len)
243 slide_expand (s->write_buf, len);
244 memcpy (SLIDE_WPTR (s->write_buf), buf, len);
245 slide_added (s->write_buf, len);
248 (SLIDE_BYTES (s->write_buf) >
249 MAX_TXN) ? MAX_TXN : SLIDE_BYTES (s->write_buf);
250 n = wrap_write (s->fd, SLIDE_RPTR (s->write_buf), n);
252 uint8_t *c=SLIDE_RPTR(s->write_buf);
256 slide_consume (s->write_buf, n);