chiark / gitweb /
e42f6ff59756613e69732c2fe72fa1da07bc4d62
[sympathy.git] / src / ipc.c
1 /*
2  * ipc.c:
3  *
4  * Copyright (c) 2008 James McKenzie <james@fishsoup.dhs.org>,
5  * All rights reserved.
6  *
7  */
8
9 static char rcsid[] = "$Id$";
10
11 /*
12  * $Log$
13  * Revision 1.1  2008/02/14 12:17:42  james
14  * *** empty log message ***
15  *
16  */
17
18 #include "project.h"
19
20 IPC_Msg *
21 ipc_check_for_message_in_slide (Slide * s)
22 {
23   IPC_Msg *m;
24   if (SLIDE_BYTES (s) < sizeof (IPC_Msg_hdr))
25     return NULL;
26   m = (IPC_Msg *) SLIDE_RPTR (s);
27   if (SLIDE_BYTES (s) < m->hdr.size)
28     return NULL;
29   if (m->hdr.size < sizeof (IPC_Msg_hdr))
30     abort ();
31
32   return m;
33 }
34
35 void
36 ipc_consume_message_in_slide (Slide * s)
37 {
38   IPC_Msg *m = ipc_check_for_message_in_slide (s);
39   if (!m)
40     abort ();
41
42   slide_consume (s, m->hdr.size);
43 }
44
45
46 int
47 ipc_msg_send (Socket * s, IPC_Msg * m)
48 {
49   int len = m->hdr.size;
50   return (socket_write (s, m, len) == len) ? 0 : -1;
51 }
52
53
54 int
55 ipc_msg_send_debug (Socket * s, char *msg)
56 {
57   char buf[sizeof (IPC_Msg_hdr) + IPC_MAX_BUF];
58   IPC_Msg_debug *m;
59   int len;
60
61
62   m = (IPC_Msg_debug *) buf;
63   m->type = IPC_MSG_TYPE_DEBUG;
64   strncpy (m->msg, msg, IPC_MAX_BUF);
65   m->msg[IPC_MAX_BUF - 1] = 0;
66
67   m->size = sizeof (IPC_Msg_hdr) + strlen (m->msg) + 1;
68
69
70   return ipc_msg_send (s, (IPC_Msg *) m);
71 }
72
73 int
74 ipc_msg_send_history (Socket * s, History_ent * l)
75 {
76   IPC_Msg_history m;
77   int len;
78
79
80   m.type = IPC_MSG_TYPE_HISTORY;
81   m.history = *l;
82   m.size = sizeof (m);
83
84   return ipc_msg_send (s, (IPC_Msg *) & m);
85 }
86
87 int
88 ipc_msg_send_vt102 (Socket * s, VT102 * v)
89 {
90   IPC_Msg_VT102 m;
91   int len;
92
93
94   m.type = IPC_MSG_TYPE_VT102;
95   m.len = sizeof (VT102);
96   m.vt102 = *v;
97   m.size = sizeof (m);
98
99   return ipc_msg_send (s, (IPC_Msg *) & m);
100 }
101
102
103 int
104 ipc_msg_send_key (Socket * s, int key)
105 {
106   IPC_Msg_key m;
107
108   m.size = sizeof (m);
109   m.type = IPC_MSG_TYPE_KEY;
110   m.key = key;
111   return ipc_msg_send (s, (IPC_Msg *) & m);
112 }
113
114
115
116 int
117 ipc_msg_send_term (Socket * s, void *buf, int len)
118 {
119   char mbuf[IPC_MAX_BUF + sizeof (IPC_Msg_hdr)];
120
121   IPC_Msg_term *m = (IPC_Msg_term *) mbuf;
122
123   if (!len)
124     return 0;
125
126   m->size = len + sizeof (IPC_Msg_hdr);
127   m->type = IPC_MSG_TYPE_TERM;
128   m->len = len;
129   memcpy (m->term, buf, len);
130
131   return ipc_msg_send (s, (IPC_Msg *) & m);
132 }
133
134
135 int
136 ipc_msg_send_status (Socket * s, char *buf)
137 {
138   char mbuf[IPC_MAX_BUF + sizeof (IPC_Msg_hdr)];
139   IPC_Msg_status *m = (IPC_Msg_status *) mbuf;
140   int len;
141
142   if (!buf)
143     return 0;
144   len = strlen (buf) + 1;
145
146   m->size = len + sizeof (IPC_Msg_hdr);
147   m->type = IPC_MSG_TYPE_STATUS;
148   strncpy (m->status, buf, IPC_MAX_BUF - 1);
149   m->status[IPC_MAX_BUF - 1] = 0;
150
151   return ipc_msg_send (s, (IPC_Msg *) & m);
152 }