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