4 * Copyright (c) 2008 James McKenzie <james@fishsoup.dhs.org>,
9 static char rcsid[] = "$Id$";
13 * Revision 1.15 2008/03/02 10:27:24 james
14 * *** empty log message ***
16 * Revision 1.14 2008/02/28 16:57:51 james
17 * *** empty log message ***
19 * Revision 1.13 2008/02/28 16:37:16 james
20 * *** empty log message ***
22 * Revision 1.12 2008/02/28 12:12:24 james
23 * *** empty log message ***
25 * Revision 1.11 2008/02/23 11:48:51 james
26 * *** empty log message ***
28 * Revision 1.10 2008/02/22 17:06:59 james
29 * *** empty log message ***
31 * Revision 1.9 2008/02/20 18:49:11 staffcvs
32 * *** empty log message ***
34 * Revision 1.8 2008/02/20 18:31:44 james
35 * *** empty log message ***
37 * Revision 1.7 2008/02/15 23:52:12 james
38 * *** empty log message ***
40 * Revision 1.6 2008/02/15 03:32:07 james
41 * *** empty log message ***
43 * Revision 1.5 2008/02/14 10:34:47 james
44 * *** empty log message ***
46 * Revision 1.4 2008/02/14 10:34:30 james
47 * *** empty log message ***
49 * Revision 1.3 2008/02/14 02:46:44 james
50 * *** empty log message ***
52 * Revision 1.2 2008/02/14 00:57:58 james
53 * *** empty log message ***
55 * Revision 1.1 2008/02/13 18:05:06 james
56 * *** empty log message ***
69 client_msg (IPC_Msg * m, Context * c)
71 switch (m->hdr.type) {
73 case IPC_MSG_TYPE_NOOP:
75 case IPC_MSG_TYPE_DEBUG:
76 fprintf (stderr, "%p [%d] %s\n", m, m->hdr.size, m->debug.msg);
78 case IPC_MSG_TYPE_KEY:
79 vt102_send (c, m->key.key);
81 case IPC_MSG_TYPE_SETBAUD:
82 tty_set_baud (c->t, m->setbaud.baud);
85 log_f (c->l, "<baud changed to %d>", m->setbaud.baud);
87 case IPC_MSG_TYPE_SENDBREAK:
88 tty_send_break (c->t);
90 case IPC_MSG_TYPE_SETFLOW:
91 tty_set_flow (c->t, m->setflow.flow);
93 case IPC_MSG_TYPE_SETANSI:
94 vt102_set_ansi (c->v, m->setansi.ansi);
96 case IPC_MSG_TYPE_HANGUP:
99 case IPC_MSG_TYPE_SETSIZE:
100 vt102_resize (c, m->setsize.winsize);
102 case IPC_MSG_TYPE_RESET:
106 fprintf (stderr, "Unhandeled message type %d\n", m->hdr.type);
111 client_free (Client * c)
118 fprintf (stderr, "Client at %p freed\n", c);
123 clients_new_client (Clients * cs, Socket * s, Context * ctx)
127 c = (Client *) malloc (sizeof (Client));
137 fprintf (stderr, "Client at %p created\n", c);
141 if (ipc_msg_send_debug (s, "new_client"))
148 clients_reap (Clients * cs)
153 for (p = &cs->head; *p;) {
169 Clients *ret = (Clients *) malloc (sizeof (Clients));
178 clients_pre_select (Clients * cs, fd_set * rfds, fd_set * wfds)
182 for (c = cs->head; c; c = c->next) {
183 socket_pre_select (c->s, rfds, wfds);
188 clients_post_select (Clients * cs, Context * ctx, fd_set * rfds,
194 for (c = cs->head; c; c = c->next) {
195 if (socket_post_select (c->s, rfds, wfds)) {
201 client_msg (c->s->msg, ctx);
202 socket_consume_msg (c->s);
213 clients_shutdown (Clients * cs)
217 for (c = cs->head; c; c = c->next) {
231 send_status (Clients * cs, char *msg)
233 char mbuf[IPC_MAX_BUF + sizeof (IPC_Msg_status)];
234 IPC_Msg_status *m = (IPC_Msg_status *) mbuf;
241 len = strlen (msg) + 1;
245 if (len > IPC_MAX_BUF)
248 m->size = len + sizeof (IPC_Msg_status);
249 m->type = IPC_MSG_TYPE_STATUS;
250 strncpy (m->status, msg, IPC_MAX_BUF);
251 m->status[IPC_MAX_BUF - 1] = 0;
253 for (c = cs->head; c; c = c->next) {
255 if (ipc_msg_send (c->s, (IPC_Msg *) m))
264 send_output (Clients * cs, void *buf, int len)
266 char mbuf[IPC_MAX_BUF + sizeof (IPC_Msg_term)];
267 IPC_Msg_term *m = (IPC_Msg_term *) mbuf;
273 if (len > IPC_MAX_BUF)
276 m->size = len + sizeof (IPC_Msg_term);
277 m->type = IPC_MSG_TYPE_TERM;
279 memcpy (m->term, buf, len);
281 for (c = cs->head; c; c = c->next) {
283 if (ipc_msg_send (c->s, (IPC_Msg *) m))
292 send_history (History * h, Client * c)
296 HISTORY_INC (h, rptr);
298 HISTORY_INC (h, rptr);
299 while (rptr != h->wptr) {
300 History_ent *l = &h->lines[rptr];
303 if (ipc_msg_send_history (c->s, l))
307 HISTORY_INC (h, rptr);
312 send_vt102 (VT102 * v, Client * c)
314 if (ipc_msg_send_vt102 (c->s, v))