chiark / gitweb /
720cadd087af0448517f537459a0fbe0becef4db
[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.6  2008/02/28 16:57:51  james
14  * *** empty log message ***
15  *
16  * Revision 1.5  2008/02/28 11:27:48  james
17  * *** empty log message ***
18  *
19  * Revision 1.4  2008/02/22 17:07:00  james
20  * *** empty log message ***
21  *
22  * Revision 1.3  2008/02/15 23:52:12  james
23  * *** empty log message ***
24  *
25  * Revision 1.2  2008/02/15 03:32:07  james
26  * *** empty log message ***
27  *
28  * Revision 1.1  2008/02/14 12:17:42  james
29  * *** empty log message ***
30  *
31  */
32
33 #include "project.h"
34
35 IPC_Msg *
36 ipc_check_for_message_in_slide (Slide * s)
37 {
38   IPC_Msg *m;
39   if (SLIDE_BYTES (s) < sizeof (IPC_Msg_hdr))
40     return NULL;
41   m = (IPC_Msg *) SLIDE_RPTR (s);
42   if (SLIDE_BYTES (s) < m->hdr.size)
43     return NULL;
44   if (m->hdr.size < sizeof (IPC_Msg_hdr))
45     abort ();
46
47   return m;
48 }
49
50 void
51 ipc_consume_message_in_slide (Slide * s)
52 {
53   IPC_Msg *m = ipc_check_for_message_in_slide (s);
54   if (!m)
55     abort ();
56
57   slide_consume (s, m->hdr.size);
58 }
59
60
61 int
62 ipc_msg_send (Socket * s, IPC_Msg * m)
63 {
64   int len = m->hdr.size;
65   return (socket_write (s, m, len) == len) ? 0 : -1;
66 }
67
68
69 int
70 ipc_msg_send_debug (Socket * s, char *msg)
71 {
72   char buf[sizeof (IPC_Msg_hdr) + IPC_MAX_BUF];
73   IPC_Msg_debug *m;
74   int len;
75
76
77   m = (IPC_Msg_debug *) buf;
78   m->type = IPC_MSG_TYPE_DEBUG;
79   strncpy (m->msg, msg, IPC_MAX_BUF);
80   m->msg[IPC_MAX_BUF - 1] = 0;
81
82   m->size = sizeof (IPC_Msg_hdr) + strlen (m->msg) + 1;
83
84
85   return ipc_msg_send (s, (IPC_Msg *) m);
86 }
87
88 int
89 ipc_msg_send_history (Socket * s, History_ent * l)
90 {
91   IPC_Msg_history m;
92   int len;
93
94
95   m.type = IPC_MSG_TYPE_HISTORY;
96   m.history = *l;
97   m.size = sizeof (m);
98
99   return ipc_msg_send (s, (IPC_Msg *) & m);
100 }
101
102 int
103 ipc_msg_send_vt102 (Socket * s, VT102 * v)
104 {
105   IPC_Msg_VT102 m;
106   int len;
107
108
109   m.type = IPC_MSG_TYPE_VT102;
110   m.len = sizeof (VT102);
111   m.vt102 = *v;
112   m.size = sizeof (m);
113
114   return ipc_msg_send (s, (IPC_Msg *) & m);
115 }
116
117
118 int
119 ipc_msg_send_key (Socket * s, int key)
120 {
121   IPC_Msg_key m;
122
123   m.size = sizeof (m);
124   m.type = IPC_MSG_TYPE_KEY;
125   m.key = key;
126   return ipc_msg_send (s, (IPC_Msg *) & m);
127 }
128
129
130
131 int
132 ipc_msg_send_term (Socket * s, void *buf, int len)
133 {
134   char mbuf[IPC_MAX_BUF + sizeof (IPC_Msg_hdr)];
135
136   IPC_Msg_term *m = (IPC_Msg_term *) mbuf;
137
138   if (!len)
139     return 0;
140
141   m->size = len + sizeof (IPC_Msg_hdr);
142   m->type = IPC_MSG_TYPE_TERM;
143   m->len = len;
144   memcpy (m->term, buf, len);
145
146   return ipc_msg_send (s, (IPC_Msg *) & m);
147 }
148
149
150 int
151 ipc_msg_send_status (Socket * s, char *buf)
152 {
153   char mbuf[IPC_MAX_BUF + sizeof (IPC_Msg_hdr)];
154   IPC_Msg_status *m = (IPC_Msg_status *) mbuf;
155   int len;
156
157   if (!buf)
158     return 0;
159   len = strlen (buf) + 1;
160
161   m->size = len + sizeof (IPC_Msg_hdr);
162   m->type = IPC_MSG_TYPE_STATUS;
163   strncpy (m->status, buf, IPC_MAX_BUF - 1);
164   m->status[IPC_MAX_BUF - 1] = 0;
165
166   return ipc_msg_send (s, (IPC_Msg *) & m);
167 }
168
169
170 int
171 ipc_msg_send_setbaud (Socket * s, int baud)
172 {
173   IPC_Msg_setbaud m;
174
175   m.size = sizeof (m);
176   m.type = IPC_MSG_TYPE_SETBAUD;
177   m.baud = baud;
178   return ipc_msg_send (s, (IPC_Msg *) & m);
179 }
180
181
182 int
183 ipc_msg_send_sendbreak (Socket * s)
184 {
185   IPC_Msg_sendbreak m;
186
187   m.size = sizeof (m);
188   m.type = IPC_MSG_TYPE_SENDBREAK;
189   return ipc_msg_send (s, (IPC_Msg *) & m);
190 }
191
192
193 int
194 ipc_msg_send_setflow (Socket * s, int flow)
195 {
196   IPC_Msg_setflow m;
197
198   m.size = sizeof (m);
199   m.type = IPC_MSG_TYPE_SETFLOW;
200   m.flow = flow;
201   return ipc_msg_send (s, (IPC_Msg *) & m);
202 }
203
204 int
205 ipc_msg_send_setansi (Socket * s, int ansi)
206 {
207   IPC_Msg_setansi m;
208
209   m.size = sizeof (m);
210   m.type = IPC_MSG_TYPE_SETANSI;
211   m.ansi = ansi;
212   return ipc_msg_send (s, (IPC_Msg *) & m);
213 }
214
215 int
216 ipc_msg_send_hangup (Socket * s)
217 {
218   IPC_Msg_hangup m;
219
220   m.size = sizeof (m);
221   m.type = IPC_MSG_TYPE_HANGUP;
222   return ipc_msg_send (s, (IPC_Msg *) & m);
223 }
224
225 int
226 ipc_msg_send_setsize (Socket * s, CRT_Pos size)
227 {
228   IPC_Msg_setsize m;
229
230   m.size = sizeof (m);
231   m.type = IPC_MSG_TYPE_SETSIZE;
232   m.winsize = size;
233
234   return ipc_msg_send (s, (IPC_Msg *) & m);
235 }
236
237 int
238 ipc_msg_send_reset (Socket * s)
239 {
240   IPC_Msg_reset m;
241
242   m.size = sizeof (m);
243   m.type = IPC_MSG_TYPE_RESET;
244   return ipc_msg_send (s, (IPC_Msg *) & m);
245 }