4 * Copyright (c) 2008 James McKenzie <sympathy@madingley.org>,
9 static char rcsid[] = "$Id: clients.c,v 1.25 2008/05/09 12:35:57 james Exp $";
13 * Revision 1.25 2008/05/09 12:35:57 james
14 * *** empty log message ***
16 * Revision 1.24 2008/03/11 17:56:04 james
17 * *** empty log message ***
19 * Revision 1.23 2008/03/11 17:47:24 james
20 * *** empty log message ***
22 * Revision 1.22 2008/03/07 14:16:44 james
23 * *** empty log message ***
25 * Revision 1.21 2008/03/07 14:13:40 james
26 * *** empty log message ***
28 * Revision 1.20 2008/03/07 13:56:39 james
29 * *** empty log message ***
31 * Revision 1.19 2008/03/07 13:16:02 james
32 * *** empty log message ***
34 * Revision 1.18 2008/03/03 18:16:16 james
35 * *** empty log message ***
37 * Revision 1.17 2008/03/03 18:15:19 james
38 * *** empty log message ***
40 * Revision 1.16 2008/03/03 06:04:42 james
41 * *** empty log message ***
43 * Revision 1.15 2008/03/02 10:27:24 james
44 * *** empty log message ***
46 * Revision 1.14 2008/02/28 16:57:51 james
47 * *** empty log message ***
49 * Revision 1.13 2008/02/28 16:37:16 james
50 * *** empty log message ***
52 * Revision 1.12 2008/02/28 12:12:24 james
53 * *** empty log message ***
55 * Revision 1.11 2008/02/23 11:48:51 james
56 * *** empty log message ***
58 * Revision 1.10 2008/02/22 17:06:59 james
59 * *** empty log message ***
61 * Revision 1.9 2008/02/20 18:49:11 staffcvs
62 * *** empty log message ***
64 * Revision 1.8 2008/02/20 18:31:44 james
65 * *** empty log message ***
67 * Revision 1.7 2008/02/15 23:52:12 james
68 * *** empty log message ***
70 * Revision 1.6 2008/02/15 03:32:07 james
71 * *** empty log message ***
73 * Revision 1.5 2008/02/14 10:34:47 james
74 * *** empty log message ***
76 * Revision 1.4 2008/02/14 10:34:30 james
77 * *** empty log message ***
79 * Revision 1.3 2008/02/14 02:46:44 james
80 * *** empty log message ***
82 * Revision 1.2 2008/02/14 00:57:58 james
83 * *** empty log message ***
85 * Revision 1.1 2008/02/13 18:05:06 james
86 * *** empty log message ***
100 client_initialize (Client * c, Context * ctx)
102 send_history (ctx->h, c);
103 send_vt102 (ctx->v, c);
108 client_execute_message (Client * client, IPC_Msg * m, Context * c)
112 case IPC_MSG_TYPE_NOOP:
114 case IPC_MSG_TYPE_DEBUG:
115 log_f (c->l, "<debug message %s>", m->debug.msg);
117 case IPC_MSG_TYPE_KEY:
118 vt102_send (c, m->key.key);
120 case IPC_MSG_TYPE_SETBAUD:
121 tty_set_baud (c->t, m->setbaud.baud);
123 log_f (c->l, "<baud changed to %d>", m->setbaud.baud);
125 case IPC_MSG_TYPE_SENDBREAK:
126 log_f (c->l, "<break sent>");
127 tty_send_break (c->t);
129 case IPC_MSG_TYPE_SETFLOW:
130 log_f (c->l, "<flow control turned %s>",
131 m->setflow.flow ? "on" : "off");
132 tty_set_flow (c->t, m->setflow.flow);
134 case IPC_MSG_TYPE_SETANSI:
135 vt102_set_ansi (c->v, m->setansi.ansi);
137 case IPC_MSG_TYPE_HANGUP:
138 log_f (c->l, "<hangup initiated>");
141 case IPC_MSG_TYPE_SETSIZE:
142 vt102_resize (c, m->setsize.winsize);
144 case IPC_MSG_TYPE_RESET:
147 case IPC_MSG_TYPE_INITIALIZE:
148 client_initialize (client, c);
150 case IPC_MSG_TYPE_KILLME:
155 log_f (c->l, "<Unhandled message type %d>", m->hdr.type);
161 client_free (Client * c)
168 fprintf (stderr, "Client at %p freed\n", c);
173 clients_new_client (Clients * cs, Socket * s, Context * ctx)
177 c = (Client *) xmalloc (sizeof (Client));
188 fprintf (stderr, "Client at %p created\n", c);
191 log_f (ctx->l, "<client %p connected - now %d clients>", c, cs->n);
193 if (ipc_msg_send_debug (s, "new_client"))
200 clients_reap (Clients * cs, Context * ctx)
205 for (p = &cs->head; *p;)
214 log_f (ctx->l, "<client %p disconnected - now %d clients>", c,
227 Clients *ret = (Clients *) xmalloc (sizeof (Clients));
236 clients_pre_select (Clients * cs, fd_set * rfds, fd_set * wfds)
240 for (c = cs->head; c; c = c->next)
242 socket_pre_select (c->s, rfds, wfds);
247 clients_post_select (Clients * cs, Context * ctx, fd_set * rfds,
253 for (c = cs->head; c; c = c->next)
255 if (socket_post_select (c->s, rfds, wfds))
263 client_execute_message (c, c->s->msg, ctx);
264 socket_consume_msg (c->s);
272 clients_reap (cs, ctx);
277 clients_shutdown (Clients * cs, Context * ctx)
281 for (c = cs->head; c; c = c->next)
287 clients_reap (cs, ctx);
296 send_status (Clients * cs, char *msg)
298 char mbuf[IPC_MAX_BUF + sizeof (IPC_Msg_status)];
299 IPC_Msg_status *m = (IPC_Msg_status *) mbuf;
306 len = strlen (msg) + 1;
310 if (len > IPC_MAX_BUF)
313 m->size = len + sizeof (IPC_Msg_status);
314 m->type = IPC_MSG_TYPE_STATUS;
315 strncpy (m->status, msg, IPC_MAX_BUF);
316 m->status[IPC_MAX_BUF - 1] = 0;
318 for (c = cs->head; c; c = c->next)
320 if (!c->dead && c->initialized)
321 if (ipc_msg_send (c->s, (IPC_Msg *) m))
330 send_output (Clients * cs, void *buf, int len)
332 char mbuf[IPC_MAX_BUF + sizeof (IPC_Msg_term)];
333 IPC_Msg_term *m = (IPC_Msg_term *) mbuf;
339 if (len > IPC_MAX_BUF)
342 m->size = len + sizeof (IPC_Msg_term);
343 m->type = IPC_MSG_TYPE_TERM;
345 memcpy (m->term, buf, len);
347 for (c = cs->head; c; c = c->next)
349 if (!c->dead && c->initialized)
350 if (ipc_msg_send (c->s, (IPC_Msg *) m))
359 send_history (History * h, Client * c)
363 HISTORY_INC (h, rptr);
365 HISTORY_INC (h, rptr);
366 while (rptr != h->wptr)
368 History_ent *l = &h->lines[rptr];
372 if (ipc_msg_send_history (c->s, l))
376 HISTORY_INC (h, rptr);
381 send_vt102 (VT102 * v, Client * c)
383 if (ipc_msg_send_vt102 (c->s, v))