/* ansi.c */
-int terminal_winches;
-void ansi_move(ANSI *a, CRT_Pos p);
-void ansi_showhide_cursor(ANSI *a, int hide);
-void ansi_force_attr_normal(ANSI *a);
-void ansi_set_color(ANSI *a, int color);
-void ansi_set_attr(ANSI *a, int attr);
-void ansi_render(ANSI *a, CRT_CA ca);
-void ansi_cls(ANSI *a);
-void ansi_draw_line(ANSI *a, CRT_CA *cap, int y);
-void ansi_resize_check(ANSI *a);
-void ansi_history(ANSI *a, History *h);
-void ansi_draw(ANSI *a, CRT *c);
-void ansi_reset(ANSI *a, CRT *c);
-void ansi_terminal_reset(ANSI *a);
-void ansi_flush_escape(ANSI *a, Context *c);
-void ansi_parse_deckey(ANSI *a, Context *c);
-void ansi_parse_ansikey(ANSI *a, Context *c);
-void ansi_parse_escape(ANSI *a, Context *c);
-void ansi_check_escape(ANSI *a, Context *c);
-void ansi_parse_char(ANSI *a, Context *c, int ch);
-void ansi_parse(ANSI *a, Context *c, char *buf, int len);
-int ansi_dispatch(ANSI *a, Context *c);
-void ansi_update(ANSI *a, Context *c);
+extern void ansi_move(ANSI *a, CRT_Pos p);
+extern void ansi_showhide_cursor(ANSI *a, int hide);
+extern void ansi_force_attr_normal(ANSI *a);
+extern void ansi_set_color(ANSI *a, int color);
+extern void ansi_set_attr(ANSI *a, int attr);
+extern void ansi_render(ANSI *a, CRT_CA ca);
+extern void ansi_cls(ANSI *a);
+extern void ansi_draw_line(ANSI *a, CRT_CA *cap, int y);
+extern void ansi_resize_check(ANSI *a);
+extern void ansi_history(ANSI *a, History *h);
+extern void ansi_draw(ANSI *a, CRT *c);
+extern void ansi_reset(ANSI *a, CRT *c);
+extern void ansi_terminal_reset(ANSI *a);
+extern void ansi_flush_escape(ANSI *a, Context *c);
+extern void ansi_parse_deckey(ANSI *a, Context *c);
+extern void ansi_parse_ansikey(ANSI *a, Context *c);
+extern void ansi_parse_escape(ANSI *a, Context *c);
+extern void ansi_check_escape(ANSI *a, Context *c);
+extern void ansi_parse_char(ANSI *a, Context *c, int ch);
+extern void ansi_parse(ANSI *a, Context *c, char *buf, int len);
+extern int ansi_dispatch(ANSI *a, Context *c);
+extern void ansi_update(ANSI *a, Context *c);
/* crt.c */
-void crt_erase(CRT *c, CRT_Pos s, CRT_Pos e, int ea);
-void crt_cls(CRT *c);
-void crt_scroll_up(CRT *c, CRT_Pos s, CRT_Pos e, int ea);
-void crt_scroll_down(CRT *c, CRT_Pos s, CRT_Pos e, int ea);
-void crt_reset(CRT *c);
-void crt_insert(CRT *c, CRT_CA ca);
+extern void crt_erase(CRT *c, CRT_Pos s, CRT_Pos e, int ea);
+extern void crt_cls(CRT *c);
+extern void crt_scroll_up(CRT *c, CRT_Pos s, CRT_Pos e, int ea);
+extern void crt_scroll_down(CRT *c, CRT_Pos s, CRT_Pos e, int ea);
+extern void crt_reset(CRT *c);
+extern void crt_insert(CRT *c, CRT_CA ca);
/* html.c */
-void html_entity(FILE *f, int c);
-void html_render(FILE *f, CRT_CA c);
-void html_draw(FILE *f, CRT *c);
+extern void html_entity(FILE *f, int c);
+extern void html_render(FILE *f, CRT_CA c);
+extern void html_draw(FILE *f, CRT *c);
/* libsympathy.c */
/* render.c */
/* version.c */
/* vt102.c */
-void vt102_log_line(Context *c, int line);
-void vt102_history(Context *c, CRT_Pos t, CRT_Pos b);
-void vt102_clip_cursor(VT102 *v, CRT_Pos tl, CRT_Pos br);
-void vt102_cursor_normalize(VT102 *v);
-void vt102_cursor_carriage_return(VT102 *v);
-void vt102_cursor_advance_line(Context *c);
-void vt102_cursor_advance(Context *c);
-void vt102_do_pending_wrap(Context *c);
-void vt102_cursor_retard(VT102 *v);
-void vt102_reset_tabs(VT102 *v);
-void vt102_cursor_advance_tab(VT102 *v);
-int vt102_cursor_home(VT102 *v);
-int vt102_cursor_absolute(VT102 *v, int x, int y);
-int vt102_cursor_relative(VT102 *v, int x, int y);
-void vt102_delete_from_line(VT102 *v, CRT_Pos p);
-void vt102_insert_into_line(VT102 *v, CRT_Pos p);
-void vt102_change_mode(VT102 *v, int private, char *ns, int set);
-void vt102_parse_mode_string(VT102 *v, char *buf, int len);
-void vt102_change_attr(VT102 *v, char *na);
-void vt102_parse_attr_string(VT102 *v, char *buf, int len);
-void vt102_save_state(VT102 *v);
-void vt102_restore_state(VT102 *v);
-void vt102_scs(Context *c, int g, int s);
-void vt102_parse_esc(Context *c, int ch);
-void vt102_parse_csi(Context *c, char *buf, int len);
-void vt102_status_line(VT102 *v, char *str);
-void vt102_parse_char(Context *c, int ch);
-int vt102_parse(Context *c, char *buf, int len);
-void vt102_parser_reset(VT102_parser *p);
-void vt102_send(Context *c, uint8_t key);
-void vt102_reset(VT102 *v);
-int vt102_dispatch(Context *c);
-int vt102_dispatch_one(Context *c);
-VT102 *vt102_new(void);
-void vt102_free(VT102 *v);
+extern void vt102_log_line(Context *c, int line);
+extern void vt102_history(Context *c, CRT_Pos t, CRT_Pos b);
+extern void vt102_clip_cursor(VT102 *v, CRT_Pos tl, CRT_Pos br);
+extern void vt102_cursor_normalize(VT102 *v);
+extern void vt102_cursor_carriage_return(VT102 *v);
+extern void vt102_cursor_advance_line(Context *c);
+extern void vt102_cursor_advance(Context *c);
+extern void vt102_do_pending_wrap(Context *c);
+extern void vt102_cursor_retard(VT102 *v);
+extern void vt102_reset_tabs(VT102 *v);
+extern void vt102_cursor_advance_tab(VT102 *v);
+extern int vt102_cursor_home(VT102 *v);
+extern int vt102_cursor_absolute(VT102 *v, int x, int y);
+extern int vt102_cursor_relative(VT102 *v, int x, int y);
+extern void vt102_delete_from_line(VT102 *v, CRT_Pos p);
+extern void vt102_insert_into_line(VT102 *v, CRT_Pos p);
+extern void vt102_change_mode(VT102 *v, int private, char *ns, int set);
+extern void vt102_parse_mode_string(VT102 *v, char *buf, int len);
+extern void vt102_change_attr(VT102 *v, char *na);
+extern void vt102_parse_attr_string(VT102 *v, char *buf, int len);
+extern void vt102_save_state(VT102 *v);
+extern void vt102_restore_state(VT102 *v);
+extern void vt102_scs(Context *c, int g, int s);
+extern void vt102_parse_esc(Context *c, int ch);
+extern void vt102_parse_csi(Context *c, char *buf, int len);
+extern void vt102_status_line(VT102 *v, char *str);
+extern void vt102_parse_char(Context *c, int ch);
+extern int vt102_parse(Context *c, char *buf, int len);
+extern void vt102_parser_reset(VT102_parser *p);
+extern void vt102_send(Context *c, uint8_t key);
+extern void vt102_reset(VT102 *v);
+extern int vt102_dispatch(Context *c);
+extern int vt102_dispatch_one(Context *c);
+extern VT102 *vt102_new(void);
+extern void vt102_free(VT102 *v);
/* tty.c */
-void tty_pre_select(TTY *t, fd_set *rfds, fd_set *wfds);
+extern void tty_pre_select(TTY *t, fd_set *rfds, fd_set *wfds);
/* history.c */
-History *history_new(int n);
-void history_free(History *h);
-void history_add(History *h, CRT_CA *c);
+extern History *history_new(int n);
+extern void history_free(History *h);
+extern void history_add(History *h, CRT_CA *c);
/* ring.c */
-int ring_read(Ring *r, void *b, int n);
-int ring_write(Ring *r, void *b, int n);
-int ring_space(Ring *r);
-int ring_bytes(Ring *r);
-Ring *ring_new(int n);
+extern int ring_read(Ring *r, void *b, int n);
+extern int ring_write(Ring *r, void *b, int n);
+extern int ring_space(Ring *r);
+extern int ring_bytes(Ring *r);
+extern Ring *ring_new(int n);
/* ptty.c */
-TTY *ptty_open(char *path, char *argv[]);
+extern TTY *ptty_open(char *path, char *argv[]);
/* terminal.c */
-void terminal_atexit(void);
-void terminal_getsize(TTY *_t);
-void terminal_dispatch(void);
-void terminal_register_handlers(void);
-TTY *terminal_open(int rfd, int wfd);
+extern int terminal_winches;
+extern void terminal_atexit(void);
+extern void terminal_getsize(TTY *_t);
+extern void terminal_dispatch(void);
+extern void terminal_register_handlers(void);
+extern TTY *terminal_open(int rfd, int wfd);
/* util.c */
-int wrap_read(int fd, void *buf, int len);
-int wrap_write(int fd, void *buf, int len);
-void set_nonblocking(int fd);
-void set_blocking(int fd);
-void raw_termios(struct termios *termios);
-void default_termios(struct termios *termios);
+extern int wrap_read(int fd, void *buf, int len);
+extern int wrap_write(int fd, void *buf, int len);
+extern void set_nonblocking(int fd);
+extern void set_blocking(int fd);
+extern void raw_termios(struct termios *termios);
+extern void default_termios(struct termios *termios);
/* log.c */
-Log *file_log_new(char *fn);
+extern Log *file_log_new(char *fn);
/* ipc.c */
-Socket *socket_listen(char *path);
-Socket *socket_accept(Socket *l);
-Socket *socket_connect(char *path);
-Socket *socket_postselect(Socket *s, fd_set *rfds, fd_set *wfds);
-void socket_preselect(Socket *s, fd_set *rfds, fd_set *wfds);
+extern IPC_Msg *ipc_check_for_message_in_slide(Slide *s);
/* slide.c */
-void slide_free(Slide *s);
-void slide_consume(Slide *s, int n);
-void slide_added(Slide *s, int n);
-Slide *slide_new(int n);
-void slide_expand(Slide *s, int n);
+extern void slide_free(Slide *s);
+extern void slide_consume(Slide *s, int n);
+extern void slide_added(Slide *s, int n);
+extern Slide *slide_new(int n);
+extern void slide_expand(Slide *s, int n);
+/* symsocket.c */
+extern void socket_free(Socket *s);
+extern Socket *socket_listen(char *path);
+extern Socket *socket_accept(Socket *l);
+extern Socket *socket_connect(char *path);
+extern Socket *socket_post_select(Socket *s, fd_set *rfds, fd_set *wfds);
+extern void socket_consume_msg(Socket *s);
+extern void socket_pre_select(Socket *s, fd_set *rfds, fd_set *wfds);
+extern IPC_Msg *ipc_check_for_message_in_slide(Slide *s);
--- /dev/null
+/*
+ * symsocket.c:
+ *
+ * Copyright (c) 2008 James McKenzie <james@fishsoup.dhs.org>,
+ * All rights reserved.
+ *
+ */
+
+static char rcsid[] = "$Id$";
+
+/*
+ * $Log$
+ * Revision 1.1 2008/02/13 18:05:06 james
+ * *** empty log message ***
+ *
+ */
+
+#include "project.h"
+#include <sys/socket.h>
+#include <sys/un.h>
+
+#define BUF_SIZE 16384
+#define MAX_TXN 4096
+
+
+void socket_free(Socket *s)
+{
+if (!s) return;
+if (s->read_buf) slide_free(s->read_buf);
+if (s->write_buf) slide_free(s->write_buf);
+close(s->fd);
+}
+
+
+Socket *
+socket_listen (char *path)
+{
+ int fd;
+ struct sockaddr_un *sun;
+ Socket *ret;
+ int n;
+
+
+ unlink (path);
+
+ fd = socket (PF_UNIX, SOCK_STREAM, 0);
+
+ if (fd < 0)
+ return NULL;
+
+ n = strlen (path) + sizeof (struct sockaddr_un);
+ sun = (struct sockaddr_un *) malloc (n);
+ memset (sun, 0, n);
+
+ sun->sun_family = AF_UNIX;
+ strcpy (sun->sun_path, path);
+
+ if (bind (fd, (struct sockaddr *) sun, SUN_LEN (sun)) < 0)
+ {
+ free (sun);
+ close (fd);
+ return NULL;
+ }
+
+ free (sun);
+
+ if (listen (fd, 5) < 0)
+ {
+ close (fd);
+ return NULL;
+ }
+
+ set_nonblocking (fd);
+
+ ret = (Socket *) malloc (sizeof (Socket));
+ memset (ret, 0, sizeof (Socket));
+ ret->read_buf = NULL;
+ ret->write_buf = NULL;
+
+ ret->fd = fd;
+
+
+ return ret;
+}
+
+Socket *
+socket_accept (Socket * l)
+{
+ Socket *ret;
+ int len;
+ int fd;
+ struct sockaddr_un sun;
+
+ len = sizeof (struct sockaddr_un);
+
+ fd = accept (l->fd, (struct sockaddr *) &sun, &len);
+
+ if (fd < 0)
+ return NULL;
+
+
+ ret = (Socket *) malloc (sizeof (Socket));
+ memset (ret, 0, sizeof (Socket));
+
+ set_nonblocking (fd);
+
+ ret->fd = fd;
+ ret->read_buf = slide_new (BUF_SIZE);
+ ret->write_buf = slide_new (BUF_SIZE);
+ ret->msg = 0;
+
+ return ret;
+}
+
+
+/*Blocking for now*/
+Socket *
+socket_connect (char *path)
+{
+ int n;
+ int fd;
+ struct sockaddr_un *sun;
+ Socket *ret;
+
+ unlink (path);
+
+ fd = socket (PF_UNIX, SOCK_STREAM, 0);
+
+ if (fd < 0)
+ return NULL;
+
+ n = strlen (path) + sizeof (struct sockaddr_un);
+ sun = (struct sockaddr_un *) malloc (n);
+ memset (sun, 0, n);
+
+ sun->sun_family = AF_UNIX;
+ strcpy (sun->sun_path, path);
+
+ if (connect (fd, (struct sockaddr *) sun, SUN_LEN (sun)))
+ {
+ free (sun);
+ close (fd);
+ return NULL;
+ }
+
+ free (sun);
+
+ set_nonblocking (fd);
+
+ ret = (Socket *) malloc (sizeof (Socket));
+ memset (ret, 0, sizeof (Socket));
+
+ ret->fd = fd;
+ ret->read_buf = slide_new (BUF_SIZE);
+ ret->write_buf = slide_new (BUF_SIZE);
+ ret->msg = 0;
+
+ return ret;
+}
+
+Socket *
+socket_post_select (Socket * s, fd_set * rfds, fd_set * wfds)
+{
+ char buf[1024];
+ int n;
+
+ if (SOCKET_IS_LISTENER (s))
+ {
+ if (!FD_ISSET (s->fd, rfds))
+ return NULL;
+
+ return socket_accept (s);
+ }
+
+
+ if ((!SLIDE_EMPTY (s->write_buf)) && FD_ISSET (s->fd, wfds))
+ {
+ n =
+ (SLIDE_BYTES (s->write_buf) >
+ MAX_TXN) ? MAX_TXN : SLIDE_BYTES (s->write_buf);
+ n = write (s->fd, SLIDE_RPTR (s->write_buf), n);
+ if (n > 0)
+ slide_consume (s->write_buf, n);
+ }
+
+ if (!SLIDE_FULL (s->read_buf) && FD_ISSET (s->fd, rfds))
+ {
+ n =
+ (SLIDE_SPACE (s->read_buf) >
+ MAX_TXN) ? MAX_TXN : SLIDE_SPACE (s->read_buf);
+ n = read (s->fd, SLIDE_RPTR (s->read_buf), n);
+
+ if (n > 0)
+ slide_added (s->read_buf, n);
+ }
+
+ if (SLIDE_BYTES (s->read_buf) >= sizeof (IPC_Msg))
+ {
+ s->msg = ipc_check_for_message_in_slide(s->read_buf);
+ } else {
+ s->msg=NULL;
+ }
+
+
+ return NULL;
+
+}
+
+void socket_consume_msg(Socket *s)
+{
+int n;
+
+if (!s->msg) return;
+
+n=s->msg->size;
+
+slide_consume(s->read_buf,n);
+
+ if (SLIDE_BYTES (s->read_buf) >= sizeof (IPC_Msg))
+ {
+ s->msg = ipc_check_for_message_in_slide(s->read_buf);
+ } else {
+ s->msg=NULL;
+ }
+
+}
+
+void
+socket_pre_select (Socket * s, fd_set * rfds, fd_set * wfds)
+{
+ char buf[1024];
+ int n;
+
+ /*Server socket */
+ if (SOCKET_IS_LISTENER (s))
+ {
+ FD_SET (s->fd, rfds);
+ return;
+ }
+
+ if (!SLIDE_EMPTY (s->write_buf))
+ FD_SET (s->fd, wfds);
+
+ if (!SLIDE_FULL (s->read_buf))
+ FD_SET (s->fd, rfds);
+
+}
+
+