chiark / gitweb /
*** empty log message ***
[sympathy.git] / apps / sympathy.c
index a8dba28e16512e46bbe93e69b680bc8d95a6a852..91f6c0c789e809712d8f48e2194389c9dfdbf16a 100644 (file)
@@ -11,6 +11,24 @@ static char rcsid[] =
 
 /*
  * $Log$
+ * 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 ***
  *
@@ -71,6 +89,7 @@ static char rcsid[] =
 #include <string.h>
 #include <strings.h>
 #include <malloc.h>
+#include <fcntl.h>
 
 #include "mainloop.h"
 
@@ -245,7 +264,7 @@ main (int argc, char *argv[])
   int c;
   extern char *optarg;
   extern int optind, opterr, optopt;
-  int width = VT102_COLS_80;
+  CRT_Pos size = { VT102_COLS_80, VT102_ROWS };
 
   int oflags[128];
   char *oargs[128];
@@ -262,7 +281,7 @@ main (int argc, char *argv[])
 
   memset (oflags, 0, sizeof (oflags));
   memset (oargs, 0, sizeof (oargs));
-  while ((c = getopt (argc, argv, "w:utscr:lKHd:pb:fL:Fk:n:")) != EOF)
+  while ((c = getopt (argc, argv, "vw:utscr:lKHd:pb:fL:Fk:n:")) != EOF)
     {
       switch (c)
         {
@@ -295,26 +314,32 @@ 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 ();
@@ -337,12 +362,16 @@ 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']++;
     }
@@ -420,9 +449,24 @@ main (int argc, char *argv[])
 
   if (oflags['w'])
     {
-      width = safe_atoi (oargs['w']);
-      if ((width > VT102_MAX_COLS) || (width < 1))
+      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_ROWS) || (size.y < 1))
+        fatal_moan ("-w requires a height between 1 and %d\n",
+                    VT102_MAX_COLS);
+
     }
 
   if (oflags['s'] && !oflags['F'])
@@ -443,12 +487,37 @@ main (int argc, char *argv[])
 
       if (oflags['p'])
         {
-          tty = ptty_open (NULL, NULL, width);
+          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 :
@@ -500,7 +569,7 @@ main (int argc, char *argv[])
         }
     }
 
-  mainloop (tty, server_socket, client_socket, ansi, log, history, width);
+  mainloop (tty, server_socket, client_socket, ansi, log, history, &size);
 
   if (ansi)
     {