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