aboutsummaryrefslogtreecommitdiffstats
path: root/src/ipc.c
diff options
context:
space:
mode:
authorjames <>2008-02-14 12:17:42 +0000
committerjames <>2008-02-14 12:17:42 +0000
commite977995b9e97c8f7a795843c753ff59468510c4d (patch)
tree4e96c6c0cb1cf5eb228839b6f18e53ebfb969378 /src/ipc.c
parent5a4c8aa348f78026a568ff684b42ea1a2733aa2a (diff)
downloadsympathy-e977995b9e97c8f7a795843c753ff59468510c4d.tar.gz
sympathy-e977995b9e97c8f7a795843c753ff59468510c4d.tar.bz2
sympathy-e977995b9e97c8f7a795843c753ff59468510c4d.zip
*** empty log message ***
Diffstat (limited to 'src/ipc.c')
-rw-r--r--src/ipc.c152
1 files changed, 152 insertions, 0 deletions
diff --git a/src/ipc.c b/src/ipc.c
new file mode 100644
index 0000000..e42f6ff
--- /dev/null
+++ b/src/ipc.c
@@ -0,0 +1,152 @@
+/*
+ * ipc.c:
+ *
+ * Copyright (c) 2008 James McKenzie <james@fishsoup.dhs.org>,
+ * All rights reserved.
+ *
+ */
+
+static char rcsid[] = "$Id$";
+
+/*
+ * $Log$
+ * Revision 1.1 2008/02/14 12:17:42 james
+ * *** empty log message ***
+ *
+ */
+
+#include "project.h"
+
+IPC_Msg *
+ipc_check_for_message_in_slide (Slide * s)
+{
+ IPC_Msg *m;
+ if (SLIDE_BYTES (s) < sizeof (IPC_Msg_hdr))
+ return NULL;
+ m = (IPC_Msg *) SLIDE_RPTR (s);
+ if (SLIDE_BYTES (s) < m->hdr.size)
+ return NULL;
+ if (m->hdr.size < sizeof (IPC_Msg_hdr))
+ abort ();
+
+ return m;
+}
+
+void
+ipc_consume_message_in_slide (Slide * s)
+{
+ IPC_Msg *m = ipc_check_for_message_in_slide (s);
+ if (!m)
+ abort ();
+
+ slide_consume (s, m->hdr.size);
+}
+
+
+int
+ipc_msg_send (Socket * s, IPC_Msg * m)
+{
+ int len = m->hdr.size;
+ return (socket_write (s, m, len) == len) ? 0 : -1;
+}
+
+
+int
+ipc_msg_send_debug (Socket * s, char *msg)
+{
+ char buf[sizeof (IPC_Msg_hdr) + IPC_MAX_BUF];
+ IPC_Msg_debug *m;
+ int len;
+
+
+ m = (IPC_Msg_debug *) buf;
+ m->type = IPC_MSG_TYPE_DEBUG;
+ strncpy (m->msg, msg, IPC_MAX_BUF);
+ m->msg[IPC_MAX_BUF - 1] = 0;
+
+ m->size = sizeof (IPC_Msg_hdr) + strlen (m->msg) + 1;
+
+
+ return ipc_msg_send (s, (IPC_Msg *) m);
+}
+
+int
+ipc_msg_send_history (Socket * s, History_ent * l)
+{
+ IPC_Msg_history m;
+ int len;
+
+
+ m.type = IPC_MSG_TYPE_HISTORY;
+ m.history = *l;
+ m.size = sizeof (m);
+
+ return ipc_msg_send (s, (IPC_Msg *) & m);
+}
+
+int
+ipc_msg_send_vt102 (Socket * s, VT102 * v)
+{
+ IPC_Msg_VT102 m;
+ int len;
+
+
+ m.type = IPC_MSG_TYPE_VT102;
+ m.len = sizeof (VT102);
+ m.vt102 = *v;
+ m.size = sizeof (m);
+
+ return ipc_msg_send (s, (IPC_Msg *) & m);
+}
+
+
+int
+ipc_msg_send_key (Socket * s, int key)
+{
+ IPC_Msg_key m;
+
+ m.size = sizeof (m);
+ m.type = IPC_MSG_TYPE_KEY;
+ m.key = key;
+ return ipc_msg_send (s, (IPC_Msg *) & m);
+}
+
+
+
+int
+ipc_msg_send_term (Socket * s, void *buf, int len)
+{
+ char mbuf[IPC_MAX_BUF + sizeof (IPC_Msg_hdr)];
+
+ IPC_Msg_term *m = (IPC_Msg_term *) mbuf;
+
+ if (!len)
+ return 0;
+
+ m->size = len + sizeof (IPC_Msg_hdr);
+ m->type = IPC_MSG_TYPE_TERM;
+ m->len = len;
+ memcpy (m->term, buf, len);
+
+ return ipc_msg_send (s, (IPC_Msg *) & m);
+}
+
+
+int
+ipc_msg_send_status (Socket * s, char *buf)
+{
+ char mbuf[IPC_MAX_BUF + sizeof (IPC_Msg_hdr)];
+ IPC_Msg_status *m = (IPC_Msg_status *) mbuf;
+ int len;
+
+ if (!buf)
+ return 0;
+ len = strlen (buf) + 1;
+
+ m->size = len + sizeof (IPC_Msg_hdr);
+ m->type = IPC_MSG_TYPE_STATUS;
+ strncpy (m->status, buf, IPC_MAX_BUF - 1);
+ m->status[IPC_MAX_BUF - 1] = 0;
+
+ return ipc_msg_send (s, (IPC_Msg *) & m);
+}