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