X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=sympathy.git;a=blobdiff_plain;f=apps%2Fsympathy.c;h=23398535369ae2a45c89c41eb9c15fc0cac7e6e1;hp=13b54ef7938ef242740409ebbb45bf9e35af7655;hb=0811309bdec5ebb179d6056005f94c585b8fc8fd;hpb=82aed0c41cd917fdf9cdb20db788fe9da0662eba diff --git a/apps/sympathy.c b/apps/sympathy.c index 13b54ef..2339853 100644 --- a/apps/sympathy.c +++ b/apps/sympathy.c @@ -11,6 +11,36 @@ static char rcsid[] = /* * $Log$ + * Revision 1.24 2008/02/28 22:00:42 james + * *** empty log message *** + * + * Revision 1.23 2008/02/28 16:57:51 james + * *** empty log message *** + * + * Revision 1.22 2008/02/28 01:47:44 james + * *** empty log message *** + * + * Revision 1.21 2008/02/27 16:01:24 james + * *** empty log message *** + * + * Revision 1.20 2008/02/27 10:00:34 james + * *** empty log message *** + * + * Revision 1.19 2008/02/27 09:47:05 james + * *** empty log message *** + * + * Revision 1.18 2008/02/27 09:42:53 james + * *** empty log message *** + * + * Revision 1.17 2008/02/27 09:42:21 james + * *** empty log message *** + * + * Revision 1.16 2008/02/27 01:31:38 james + * *** empty log message *** + * + * Revision 1.15 2008/02/27 01:31:14 james + * *** empty log message *** + * * Revision 1.14 2008/02/24 00:43:55 james * *** empty log message *** * @@ -65,6 +95,7 @@ static char rcsid[] = #include #include #include +#include #include "mainloop.h" @@ -239,6 +270,10 @@ main (int argc, char *argv[]) int c; extern char *optarg; extern int optind, opterr, optopt; + CRT_Pos size = { VT102_COLS_80, VT102_ROWS_24 }; + + int csnok_pipe[2] = { 0 }; + int csnok = 0; int oflags[128]; char *oargs[128]; @@ -249,22 +284,13 @@ main (int argc, char *argv[]) Log *log = NULL; int history = 200; - + int pid; get_hostname (); memset (oflags, 0, sizeof (oflags)); memset (oargs, 0, sizeof (oargs)); -#if 0 - "sympathy -t [-K] [-d serialdev|-p] [-b baud] [-f] [-L log]\n" - "sympathy -s [-K] [-d serialdev|-p] [-b baud] [-f] [-L log] [-F] [-k skt]\n" - " [-n hlines]\n" - "sympathy [-s -c] [-K] [-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 {-l|-ls}\n" -#endif - while ((c = getopt (argc, argv, "utscr:lKHd:pb:fL:Fk:n:")) != EOF) + while ((c = getopt (argc, argv, "vw:utscr:lKHd:pb:fL:Fk:n:")) != EOF) { switch (c) { @@ -297,26 +323,33 @@ main (int argc, char *argv[]) oflags['s'] = 0; - if (!oflags['s'] && !oflags['c'] && !oflags['t'] && !oflags['r'] - && !oflags['l']) - { - /*If no mode is specified behave like screen */ - oflags['s']++; - oflags['c']++; - } - - { int sum = 0; sum += oflags['t']; sum += (oflags['s'] || oflags['c']) ? 1 : 0; sum += oflags['r']; sum += oflags['l']; + sum += oflags['v']; + + if (!sum) + { + /*If no mode is specified behave like screen */ + oflags['s']++; + oflags['c']++; + sum++; + } if (sum != 1) - fatal_moan ("specifiy exactly one of ( -c and or -s ), -t, -r and -l"); + fatal_moan + ("specifiy exactly one of ( -c and or -s ), -t, -r, -l and -v"); } + if (oflags['v']) + { + fprintf (stderr, "Version: %s\n", libsympathy_version ()); + fprintf (stderr, "Version: %s\n", rcsid); + return 0; + } if (oflags['l']) return list_sockets (); @@ -339,12 +372,19 @@ main (int argc, char *argv[]) /*Fold -r into -c */ if (oflags['r']) { - int id = safe_atoi (oargs['r']); + char *id = oargs['r']; if (id < 0) fatal_moan ("cannot parse -r %s as an integer", oargs['r']); oflags['k']++; - oargs['k'] = mome ("/.sympathy/%s%d", hostname, id); + if (safe_atoi (id) > 0) + { + oargs['k'] = mome ("/.sympathy/%s%d", hostname, safe_atoi (id)); + } + else + { + oargs['k'] = mome ("/.sympathy/%s", id); + } oflags['r'] = 0; oflags['c']++; } @@ -352,43 +392,35 @@ main (int argc, char *argv[]) if (oflags['p'] && oflags['d']) fatal_moan ("-p incompatible with -d"); - /*implement server and client by opening the server socket to prevent */ - /*a race condition, and then forking and munging the cmd line options */ - /*in the parent and child so that the child is the server and the */ - /*parent becomes its client */ if (oflags['c'] && oflags['s'] && oflags['F']) fatal_moan ("-F is incompatible with -c -s"); - if (oflags['s'] && !oflags['k']) - { - char *path; - path = mome ("/.sympathy"); - mkdir (path, 0700); - free (path); - - oargs['k'] = mome ("/.sympathy/%s%d", hostname, getpid ()); - oflags['k']++; - } - - if (oflags['s']) - { - server_socket = socket_listen (oargs['k']); - if (!server_socket) - fatal_moan ("failed to create socket %s for listening", oargs['k']); - } + /*implement server and client: this process forks. The parent */ + /*becomes the client and the child forks again to become the */ + /*server. If there's no -k argument the client (parent) needs */ + /*to find out the pid of the server, we use a pipe */ if (oflags['s'] && oflags['c']) { - switch (fork ()) + if (!oflags['k']) + { + csnok++; + pipe (csnok_pipe); + } + + switch (pid = fork ()) { case 0: /*child becomes the server */ oflags['c'] = 0; oflags['H'] = 0; + + if (csnok) + close (csnok_pipe[0]); break; case -1: fatal_moan ("fork failed"); - default: + default: /*parent becomes client*/ oflags['s'] = 0; oflags['K'] = 0; oflags['d'] = 0; @@ -397,14 +429,32 @@ main (int argc, char *argv[]) oflags['f'] = 0; oflags['L'] = 0; oflags['n'] = 0; - if (server_socket) + oflags['w'] = 0; + + /*Collect the child*/ + waitpid (pid, NULL, 0); + + /*if there was no k argument we need to find the*/ + /*pid of the server process so that we can work out*/ + /*what the socket is called. The server tells us on*/ + /*a pipe*/ + + if (csnok) { - socket_free_parent (server_socket); - server_socket = NULL; + close (csnok_pipe[1]); + + if (read (csnok_pipe[0], &pid, sizeof (pid)) != sizeof (pid)) + fatal_moan ("Failed to receive pid of server process"); + + close (csnok_pipe[0]); + + oargs['k'] = mome ("/.sympathy/%s%d", hostname, pid); + oflags['k']++; } } } + if (oflags['c'] && !oflags['k']) fatal_moan ("-c requires a socket to be specified with -s or -k"); @@ -418,12 +468,65 @@ main (int argc, char *argv[]) oflags['p']++; } + if (oflags['w']) + { + char buf[128], *ptr; + strcpy (buf, oargs['w']); + ptr = index (buf, 'x'); + if (ptr) + { + *ptr = 0; + ptr++; + size.y = safe_atoi (ptr); + } + size.x = safe_atoi (buf); + + if ((size.x > VT102_MAX_COLS) || (size.x < 1)) + fatal_moan ("-w requires a width between 1 and %d\n", VT102_MAX_COLS); + + if ((size.y > VT102_MAX_ROWS) || (size.y < 1)) + fatal_moan ("-w requires a height between 1 and %d\n", + VT102_MAX_COLS); + + } + if (oflags['s'] && !oflags['F']) { - daemon (1, 0); /*incase socket is relative path, unlink then will fail */ + /*nochdir incase socket is relative path, unlink then will fail */ + daemon (1, 0); + + /*Tell our parent's parent what our pid is */ + if (csnok) + { + pid = getpid (); + + write (csnok_pipe[1], &pid, sizeof (pid)); + close (csnok_pipe[1]); + } } + if (oflags['s'] ) + { + char *path; + path = mome ("/.sympathy"); + mkdir (path, 0700); + free (path); + + + if (!oflags['k']) { + pid = getpid (); + + oargs['k'] = mome ("/.sympathy/%s%d", hostname, pid); + oflags['k']++; + } + + server_socket = socket_listen (oargs['k']); + if (!server_socket) + fatal_moan ("failed to create socket %s for listening", oargs['k']); + + } + if (oflags['s'] || oflags['t']) { @@ -436,12 +539,38 @@ main (int argc, char *argv[]) if (oflags['p']) { - tty = ptty_open (NULL, NULL); + tty = ptty_open (NULL, NULL, &size); if (!tty) fatal_moan ("unable to open a ptty"); } else { + /*HACK-- check that console=device does not occur in */ + /*/proc/cmdline */ + if (!oargs['d']) + fatal_moan ("no argument to -d"); + + { + char kernel_cmdline[4096] = { 0 }; + char search_string[1024] = "console="; + char *ptr = oargs['d']; + int fd; + + if (!strncmp ("/dev/", ptr, 5)) + ptr += 5; + + strcat (search_string, ptr); + + fd = open ("/proc/cmdline", O_RDONLY); + read (fd, kernel_cmdline, sizeof (kernel_cmdline)); + close (fd); + + kernel_cmdline[sizeof (kernel_cmdline) - 1] = 0; + + if (strstr (kernel_cmdline, search_string)) + fatal_moan ("/proc/cmdline contains %s", search_string); + } + tty = serial_open (oargs['d'], oflags['K'] ? SERIAL_LOCK_ACTIVE : @@ -493,7 +622,7 @@ main (int argc, char *argv[]) } } - mainloop (tty, server_socket, client_socket, ansi, log, history); + mainloop (tty, server_socket, client_socket, ansi, log, history, &size); if (ansi) {