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