aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjames <>2008-02-20 02:11:35 +0000
committerjames <>2008-02-20 02:11:35 +0000
commit52e93d61c117c99b5bc9e80807317e1bf73a3039 (patch)
treeeddaa725def67e7bf2c086d158ea0cd04cea3d94
parent99e902e2b49103fa4c44edbf94210b8ede924663 (diff)
downloadsympathy-52e93d61c117c99b5bc9e80807317e1bf73a3039.tar.gz
sympathy-52e93d61c117c99b5bc9e80807317e1bf73a3039.tar.bz2
sympathy-52e93d61c117c99b5bc9e80807317e1bf73a3039.zip
*** empty log message ***
-rw-r--r--apps/mainloop.c204
-rw-r--r--apps/sympathy.c51
-rw-r--r--apps/usage.c25
3 files changed, 211 insertions, 69 deletions
diff --git a/apps/mainloop.c b/apps/mainloop.c
index e3d2190..f515478 100644
--- a/apps/mainloop.c
+++ b/apps/mainloop.c
@@ -6,11 +6,13 @@
*
*/
-static char rcsid[] =
- "$Id$";
+static char rcsid[] = "$Id$";
/*
* $Log$
+ * Revision 1.3 2008/02/20 02:11:35 james
+ * *** empty log message ***
+ *
* Revision 1.2 2008/02/16 10:58:52 james
* *** empty log message ***
*
@@ -86,7 +88,12 @@ get_status (TTY * t, Clients * cs)
tty_get_status (t, &tty_status);
status.bootstrap = 1;
- status.nclients = cs->n;
+
+ if (cs)
+ status.nclients = cs->n;
+ else
+ status.nclients = 0;
+
status.lines = tty_status.lines;
status.baud = tty_status.baud;
status.crtscts = (tty_status.termios.c_cflag & CRTSCTS) ? 1 : 0;
@@ -280,95 +287,148 @@ check_status (Context * c, Clients * cs)
*ptr = 0;
- send_status (cs, buf);
+ if (cs)
+ send_status (cs, buf);
+ else
+ cmd_new_status (c->d, c, m->status.status);
+
}
- TTY *t;
- Log *l;
- t= ptty_open (NULL, NULL);
- //t = serial_open ("/dev/cellmodem", 0);
-l=file_log_new ("log");
+static void
+msg_from_server (IPC_Msg * m, Context * c)
+{
+ switch (m->hdr.type)
+ {
+
+ case IPC_MSG_TYPE_NOOP:
+ break;
+ case IPC_MSG_TYPE_DEBUG:
+// fprintf (stderr,"%p [%d] %s\n", m, m->hdr.size , m->debug.msg );
+ break;
+ case IPC_MSG_TYPE_HISTORY:
+ history_add (c->h, m->history.history.line);
+ break;
+ case IPC_MSG_TYPE_VT102:
+ if (sizeof (VT102) != m->vt102.len)
+ abort ();
+
+ *(c->v) = m->vt102.vt102;
+ //FIXME HTML hook
+ break;
+ case IPC_MSG_TYPE_TERM:
+ vt102_parse (c, m->term.term, m->term.len);
+ break;
+ case IPC_MSG_TYPE_STATUS:
+ cmd_new_status (c->d, c, m->status.status);
+ break;
+ default:
+ fprintf (stderr, "Unhandeled message type %d\n", m->hdr.type);
+ }
+}
-void mainloop (TTY *tty,Socket *server_socket,Socket *client_socket,Ansi *a,Log *log)
+void
+mainloop (TTY * tty, Socket * server_socket, Socket * client_socket, Ansi * a,
+ Log * log)
{
fd_set rfds, wfds;
Context c;
Clients *clients;
+
c.v = vt102_new ();
c.h = history_new (200);
c.l = log
+ /* are we being fed by a tty or a socket */
+ if (client_socket)
+ {
+ if (server_socket)
+ abort ();
+ c.s = client_socket;
+ c.k = keydis_ipc_new (client_socket);
+ }
+ else
+ {
+ if (!tty)
+ abort ();
+ c.t = tty;
+ c.k = keydis_vt102_new ();
+ }
+
+ /* do we have an upstream terminal to talk to */
+ /* if so start a command parser */
+ if (ansi)
+ {
+ c.d = cmd_new ();
+ }
+ else
+ {
+ c.d = NULL;
+ }
+
- /* are we being fed by a tty or a socket */
- if (client_socket) {
- if (server_socket) abort();
- c.s = client_socket;
- c.k = keydis_ipc_new (client_socket);
- } else {
- if (!tty) abort();
- c.t = tty;
- c.k = keydis_vt102_new ();
- }
-
- /* do we have an upstream terminal to talk to*/
- if (ansi) {
- c.d = cmd_new ();
- } else {
- c.d = NULL;
- }
-
-
- if (server_socket) {
- if(client_socket) abort();
- clients = clients_new ();
- } else {
- clients=NULL;
- }
+ if (server_socket)
+ {
+ if (client_socket)
+ abort ();
+ clients = clients_new ();
+ }
+ else
+ {
+ clients = NULL;
+ }
for (;;)
{
struct timeval tv = { 1, 0 };
+ /*update the status lines, locally or remotely*/
check_status (&c, clients);
FD_ZERO (&rfds);
FD_ZERO (&wfds);
- if (c.t)
- tty_pre_select (c.t, &rfds, &wfds);
+ if (c.t)
+ tty_pre_select (c.t, &rfds, &wfds);
- if (server_socket) {
- FD_SET (server_socket->fd, &rfds);
- clients_pre_select (clients, &rfds, &wfds);
- }
+ if (server_socket)
+ {
+ FD_SET (server_socket->fd, &rfds);
+ clients_pre_select (clients, &rfds, &wfds);
+ }
- if (client_socket)
- socket_pre_select (client_socket, &rfds, &wfds);
+ if (client_socket)
+ socket_pre_select (client_socket, &rfds, &wfds);
+
+ if (ansi)
+ tty_pre_select (ansi->terminal, &rfds, &wfds);
select (FD_SETSIZE, &rfds, &wfds, NULL, &tv);
- /*any message from clients, or new connexions*/
- if (server_socket) {
- Socket *cs;
- if (FD_ISSET (server_socket->fd, &rfds) && ((cs = socket_accept (s))))
+ /*any message from clients, or new connexions */
+ if (server_socket)
{
- {
- Client *cl;
- /*New client connexion */
- cl = clients_new_client (clients, cs, &c);
+ Socket *new_client_socket;
+ if (FD_ISSET (server_socket->fd, &rfds)
+ && ((new_client_socket = socket_accept (s))))
+ {
+ {
+ Client *new_client;
+ /*New client connexion */
+ new_client =
+ clients_new_client (clients, new_client_socket, &c);
- send_history (c.h, cl);
- send_vt102 (c.v, cl);
+ send_history (c.h, new_client);
+ send_vt102 (c.v, new_client);
- }
- }
+ }
+ }
- clients_post_select (clients, &c, &rfds, &wfds);
- }
+ clients_post_select (clients, &c, &rfds, &wfds);
+ }
- /*any data from the port*/
+ /*any data from the port */
if (c.t && FD_ISSET (c.t->rfd, &rfds))
{
char buf[IPC_MAX_BUF];
@@ -388,9 +448,33 @@ void mainloop (TTY *tty,Socket *server_socket,Socket *client_socket,Ansi *a,Log
+ /*any data from the server*/
+ if (client_socket)
+ {
+ if (socket_post_select (client_socket, &rfds, &wfds))
+ break;
+
+ while (client_socket->msg)
+ {
+ msg_from_server (client_socket->msg, &c);
+ socket_consume_msg (client_socket);
+ }
+ }
+
+
+ /*update our local screen*/
+ if (ansi)
+ {
+ if (ansi_dispatch (ansi, &c))
+ break;
+
+ ansi_update (ansi, &c);
+ }
}
- clients_shutdown (clients);
- terminal_atexit ();
+ if (clients)
+ {
+ clients_shutdown (clients);
+ }
printf ("QUAT\n");
}
diff --git a/apps/sympathy.c b/apps/sympathy.c
index e11df1e..4b67502 100644
--- a/apps/sympathy.c
+++ b/apps/sympathy.c
@@ -10,6 +10,9 @@ static char rcsid[] = "$Id$";
/*
* $Log$
+ * Revision 1.4 2008/02/20 02:11:35 james
+ * *** empty log message ***
+ *
* Revision 1.3 2008/02/14 02:46:44 james
* *** empty log message ***
*
@@ -22,11 +25,57 @@ static char rcsid[] = "$Id$";
*/
#include <sympathy.h>
-#include "client.h"
+#include "mainloop.h"
int
main (int argc, char *argv[])
{
+int c;
+extern char *optarg;
+extern int optind, opterr, optopt;
+
+int tflag=0,cflag=0,sflag=0,rflag=0;
+int lflag=0,dflag=0,bflag=0,pflag=0;
+int kflag=0;
+
+int nhistory=200;
+int baud=-1;
+char *rid,*device_path;
+char *socket_path;
+
+while ((c=getopt(argc,argv,"tscr:d:pb:fL:Fk:n:"))!=EOF) {
+switch(c) {
+ case 't':
+ tflag++;
+ break;
+ case 's':
+ sflag++;
+ break;
+ case 'c':
+ cflag++;
+
+
+
+
+
+
+
+default:
+ usage();
+}
+}
+
+
+
+
+ "sympathy -t [-l] [-d serialdev|-p] [-b baud] [-f] [-L log]\n"
+ "sympathy -s [-l] [-d serialdev|-p] [-b baud] [-f] [-L log] [-F] [-k skt]\n"
+ " [-n hlines]\n"
+ "sympathy [-s -c] [-l] [-d serialdev|-p] [-b baud] [-f] [-L log] [-k skt]\n"
+ " [-n hlines]\n"
+ "sympathy -c [-H] -k skt\n"
+ "sympathy -r id [-H]\n"
+ "\n"
client ();
}
diff --git a/apps/usage.c b/apps/usage.c
index c0b81f3..f86fa20 100644
--- a/apps/usage.c
+++ b/apps/usage.c
@@ -10,6 +10,9 @@ static char rcsid[] = "$Id$";
/*
* $Log$
+ * Revision 1.3 2008/02/20 02:11:35 james
+ * *** empty log message ***
+ *
* Revision 1.2 2008/02/16 10:58:52 james
* *** empty log message ***
*
@@ -24,20 +27,23 @@ usage (void)
{
fprintf (stderr, "Usage:\n"
- "sympathy -t [-l] [-d serialdev|-p] [-b baud] [-h] [-L log]\n"
- "sympathy -s [-l] [-d serialdev|-p] [-b baud] [-h] [-L log] [-f] [-k skt]\n"
- "sympathy [-s -c] [-l] [-d serialdev|-p] [-b baud] [-h] [-L log] [-k skt]\n"
+ "sympathy -t [-l] [-d serialdev|-p] [-b baud] [-f] [-L log]\n"
+ "sympathy -s [-l] [-d serialdev|-p] [-b baud] [-f] [-L log] [-F] [-k skt]\n"
+ " [-n hlines]\n"
+ "sympathy [-s -c] [-l] [-d serialdev|-p] [-b baud] [-f] [-L log] [-k skt]\n"
+ " [-n hlines]\n"
"sympathy -c [-H] -k skt\n"
"sympathy -r id [-H]\n"
+ "sympathy -h\n"
"\n"
"Main mode:\n"
" -t terminal emulator mode: one process is started which reads from\n"
" the serial device or ptty and writes to the users terminal.\n"
- " -s server mode: a process is started (and daemonized unless -f is\n"
+ " -s server mode: a process is started (and daemonized unless -F is\n"
" given) which listens on a socket, and reads from the serial\n"
" device or ptty.\n"
" -s -c server and client mode. Fork a server and connect a client\n"
- " incompatible with -f. This is the default mode\n"
+ " incompatible with -F. This is the default mode\n"
" -c client mode: connect to server mode process\n"
" -r id client mode: connect to server mode process on socket\n"
" ~/.sympathy/id\n"
@@ -54,14 +60,17 @@ usage (void)
" no -d option is specified\n"
" -b baud the baudrate to set. If omitted sympathy does not set\n"
" a baudrate and uses the current setting\n"
- " -h set RTS/CTS flowcontrol. By default sympathy disables flow\n"
+ " -f set RTS/CTS flowcontrol. By default sympathy disables flow\n"
" control\n"
" -k socket explicity set the name of the socket, by default\n"
" sympathy will use ~/.sympathy/$pid\n"
- " -f do not detach, run the server in the foreground\n"
+ " -F do not detach, run the server in the foreground\n"
" -H instead of connecting the user's terminal to the session\n"
" emit HTML of the current state of the screen on stdout\n"
- " -L log activity on the device to the file log\n");
+ " -L log activity on the device to the file log\n"
+ " -n hlines the number of lines of history to store in the\n"
+ " server, that are replayed on connexion\n"
+);
exit (1);
}