4 * Copyright (c) 2008 James McKenzie <james@fishsoup.dhs.org>,
9 static char rcsid[] = "$Id$";
13 * Revision 1.1 2008/02/13 18:05:06 james
14 * *** empty log message ***
19 #include <sys/socket.h>
22 #define BUF_SIZE 16384
26 void socket_free(Socket *s)
29 if (s->read_buf) slide_free(s->read_buf);
30 if (s->write_buf) slide_free(s->write_buf);
36 socket_listen (char *path)
39 struct sockaddr_un *sun;
46 fd = socket (PF_UNIX, SOCK_STREAM, 0);
51 n = strlen (path) + sizeof (struct sockaddr_un);
52 sun = (struct sockaddr_un *) malloc (n);
55 sun->sun_family = AF_UNIX;
56 strcpy (sun->sun_path, path);
58 if (bind (fd, (struct sockaddr *) sun, SUN_LEN (sun)) < 0)
67 if (listen (fd, 5) < 0)
75 ret = (Socket *) malloc (sizeof (Socket));
76 memset (ret, 0, sizeof (Socket));
78 ret->write_buf = NULL;
87 socket_accept (Socket * l)
92 struct sockaddr_un sun;
94 len = sizeof (struct sockaddr_un);
96 fd = accept (l->fd, (struct sockaddr *) &sun, &len);
102 ret = (Socket *) malloc (sizeof (Socket));
103 memset (ret, 0, sizeof (Socket));
105 set_nonblocking (fd);
108 ret->read_buf = slide_new (BUF_SIZE);
109 ret->write_buf = slide_new (BUF_SIZE);
118 socket_connect (char *path)
122 struct sockaddr_un *sun;
127 fd = socket (PF_UNIX, SOCK_STREAM, 0);
132 n = strlen (path) + sizeof (struct sockaddr_un);
133 sun = (struct sockaddr_un *) malloc (n);
136 sun->sun_family = AF_UNIX;
137 strcpy (sun->sun_path, path);
139 if (connect (fd, (struct sockaddr *) sun, SUN_LEN (sun)))
148 set_nonblocking (fd);
150 ret = (Socket *) malloc (sizeof (Socket));
151 memset (ret, 0, sizeof (Socket));
154 ret->read_buf = slide_new (BUF_SIZE);
155 ret->write_buf = slide_new (BUF_SIZE);
162 socket_post_select (Socket * s, fd_set * rfds, fd_set * wfds)
167 if (SOCKET_IS_LISTENER (s))
169 if (!FD_ISSET (s->fd, rfds))
172 return socket_accept (s);
176 if ((!SLIDE_EMPTY (s->write_buf)) && FD_ISSET (s->fd, wfds))
179 (SLIDE_BYTES (s->write_buf) >
180 MAX_TXN) ? MAX_TXN : SLIDE_BYTES (s->write_buf);
181 n = write (s->fd, SLIDE_RPTR (s->write_buf), n);
183 slide_consume (s->write_buf, n);
186 if (!SLIDE_FULL (s->read_buf) && FD_ISSET (s->fd, rfds))
189 (SLIDE_SPACE (s->read_buf) >
190 MAX_TXN) ? MAX_TXN : SLIDE_SPACE (s->read_buf);
191 n = read (s->fd, SLIDE_RPTR (s->read_buf), n);
194 slide_added (s->read_buf, n);
197 if (SLIDE_BYTES (s->read_buf) >= sizeof (IPC_Msg))
199 s->msg = ipc_check_for_message_in_slide(s->read_buf);
209 void socket_consume_msg(Socket *s)
217 slide_consume(s->read_buf,n);
219 if (SLIDE_BYTES (s->read_buf) >= sizeof (IPC_Msg))
221 s->msg = ipc_check_for_message_in_slide(s->read_buf);
229 socket_pre_select (Socket * s, fd_set * rfds, fd_set * wfds)
235 if (SOCKET_IS_LISTENER (s))
237 FD_SET (s->fd, rfds);
241 if (!SLIDE_EMPTY (s->write_buf))
242 FD_SET (s->fd, wfds);
244 if (!SLIDE_FULL (s->read_buf))
245 FD_SET (s->fd, rfds);