Missing includes for uClinux patches on i386
[gnokii.git] / gnokii / gnokii.c
index d9030f7..fadf2b4 100644 (file)
@@ -20,6 +20,8 @@
 #include <ctype.h>
 #include <time.h>
 #include <sys/stat.h>
+#include <limits.h>
+#include <errno.h>
 
 #ifdef UCLINUX
 /* <getopt.h> or "getopt.h" would include insufficient getopt.h from uClinux */
@@ -948,7 +950,7 @@ static int usage(void)
 
 #ifdef UCLINUX
   fprintf(stdout, _(
-"          gnokii --gnokiid [--debug]\n"
+"          gnokii --gnokiid [--debug] [<child to run> [<child args>...]]\n"
   ));
 #endif
 
@@ -1232,12 +1234,14 @@ int main(int argc, char *argv[])
 #endif /* UCLINUX */
 
 #ifdef UCLINUX
-    { OPT_GNOKIID,           0, 1, 0 },
+    { OPT_GNOKIID,           0, INT_MAX, 0 },
 #endif /* UCLINUX */
 
     { 0, 0, 0, 0 },
   };
 
+  LIVE;
+
   opterr = 0;
 
   /* For GNU gettext */
@@ -1278,6 +1282,7 @@ int main(int argc, char *argv[])
 
     for(i = 2; i < argc; i++)
       nargv[i-2] = argv[i];
+               nargv[argc] = NULL;     /* required by gnokiid() for execv(3) */
        
     if(checkargs(c, gals, nargc)) {
 
@@ -4127,17 +4132,16 @@ static int gnokiid(int argc, char *argv[])
        DebugMode = false;
        if(argc>0)
        {
-               if( strcmp(argv[0],"--debug" ))
+               if( !strcmp(argv[0],"--debug" ))
                {
-                       usage();
-                       return -1;
-               }
-               else
                        DebugMode = true;
+                       argv++;
+                       argc--;
+               }
        }
 
 #ifdef DEBUG
-  fprintf (stderr, _("Entering gnokiid mode...\n"));
+  fprintf (stderr, _("Initializing gnokiid mode...\n"));
 #endif
 
        if (CFG_ReadConfig(&Model, &Port, &Initlength, &Connection, &BinDir, true) < 0)
@@ -4146,6 +4150,33 @@ static int gnokiid(int argc, char *argv[])
   if (VM_Initialise(Model, Port, Initlength, GCT_FBUS, BinDir, DebugMode, true, ""/*SynchronizeTime*/) == false)
                return (-1);
 
+       if (argc>0) {
+#ifdef DEBUG
+               fprintf (stderr, _("Spawning gnokiid startup child process \"%s\"...\n"), *argv);
+#endif
+               /* default action for SIGCHLD is SIG_IGN, should be OK */
+               errno=0;
+               switch (vfork()) {
+                       case -1: /* vfork() failure */
+                               fprintf (stderr, _("vfork() failed! (%m)\n"));
+                               return -1;
+                       case 0: /* child */
+                               execv(*argv,argv);
+                               fprintf (stderr, _("Spawn of child process failed! (%m)\n"));
+                               _exit(9);
+                               break;
+                       default: /* parent */
+                               /* PASSTHRU */
+                               break;
+                       }
+               }
+
+#ifdef DEBUG
+  fprintf (stderr, _("Entering gnokiid virtual modem main loop...\n"));
+#endif
+
+       VM_ThreadLoop();
+
        VM_Terminate();
 
   return 0;
@@ -4672,6 +4703,7 @@ static int getmemory(int argc, char *argv[])
     fprintf(stderr, _("Unknown memory type %s!\n"), argv[0]);
     return (-1);
   }
+
   GetMemoryTypeString(memory_type_string, &entry.MemoryType);
 
   if (argv[argc-1][0] == '-')
@@ -5231,20 +5263,29 @@ static int identify( void )
   /* Hopefully is 64 larger as FB38_MAX* / FB61_MAX* */
   char imei[64], model[64], rev[64], manufacturer[64];
 
+  LIVE;
   fbusinit(NULL);
 
+  LIVE;
   while (GSM->GetIMEI(imei)    != GE_NONE) sleep(1);
+  LIVE;
   while (GSM->GetRevision(rev) != GE_NONE) sleep(1);
+  LIVE;
   while (GSM->GetModel(model)  != GE_NONE) sleep(1);
+  LIVE;
 
   strcpy(manufacturer, "(unknown)");
+  LIVE;
   GSM->GetManufacturer(manufacturer);
+  LIVE;
 
   fprintf(stdout, _("IMEI:     %s\n"), imei);
   fprintf(stdout, _("Model:    %s %s (%s)\n"), manufacturer, GetModelName (model), model);
   fprintf(stdout, _("Revision: %s\n"), rev);
 
+  LIVE;
   GSM->Terminate();
+  LIVE;
 
   return 0;
 }
@@ -7750,32 +7791,32 @@ int binringtoneconvert(int argc, char *argv[])
            w=w*2;
            if (w>z && (w/2)<=z) {
              switch (m) {
-               case 1:fprintf(file,_("16"));break;\r
-               case 2:fprintf(file,_("8"));break;\r
-               case 3:fprintf(file,_("4"));break;\r
-               case 4:fprintf(file,_("2"));break;\r
-               case 5:fprintf(file,_("1"));break;\r
+               case 1:fprintf(file,_("16"));break;
+               case 2:fprintf(file,_("8"));break;
+               case 3:fprintf(file,_("4"));break;
+               case 4:fprintf(file,_("2"));break;
+               case 5:fprintf(file,_("1"));break;
              }
              break;
            }
          }
          if (z>w) fprintf(file,_("1"));
          pause=false;
-          switch (GSM_GetNote(j)) {\r
-            case Note_C  :fprintf(file,_("c"));break;\r
-            case Note_Cis:fprintf(file,_("c#"));break;\r
-            case Note_D  :fprintf(file,_("d"));break;\r
-            case Note_Dis:fprintf(file,_("d#"));break;\r
-            case Note_E  :fprintf(file,_("e"));break;\r
-            case Note_F  :fprintf(file,_("f"));break;\r
-            case Note_Fis:fprintf(file,_("f#"));break;\r
-            case Note_G  :fprintf(file,_("g"));break;\r
-            case Note_Gis:fprintf(file,_("g#"));break;\r
-            case Note_A  :fprintf(file,_("a"));break;\r
-            case Note_Ais:fprintf(file,_("a#"));break;\r
-            case Note_H  :fprintf(file,_("h"));break;\r
-            default      :pause=true;fprintf(file,_("p"));break; //Pause ?\r
-          }\r
+          switch (GSM_GetNote(j)) {
+            case Note_C  :fprintf(file,_("c"));break;
+            case Note_Cis:fprintf(file,_("c#"));break;
+            case Note_D  :fprintf(file,_("d"));break;
+            case Note_Dis:fprintf(file,_("d#"));break;
+            case Note_E  :fprintf(file,_("e"));break;
+            case Note_F  :fprintf(file,_("f"));break;
+            case Note_Fis:fprintf(file,_("f#"));break;
+            case Note_G  :fprintf(file,_("g"));break;
+            case Note_Gis:fprintf(file,_("g#"));break;
+            case Note_A  :fprintf(file,_("a"));break;
+            case Note_Ais:fprintf(file,_("a#"));break;
+            case Note_H  :fprintf(file,_("h"));break;
+            default      :pause=true;fprintf(file,_("p"));break; //Pause ?
+          }
          w=deflen*1.5;
          for (m=0;m<6;m++) {
            w=w*2;
@@ -7920,11 +7961,11 @@ int setsimlock()
     fprintf(stderr,_("Error getting simlock info\n"));GSM->Terminate();return -1;
   }
   /* Opening all locks (we must check, if we can open them) */
-  NULL_SendMessageSequence\r(50, &CurrentMagicError, 10, 0x40,openbuffer0);
-  openbuffer[4]=1;NULL_SendMessageSequence\r(50, &CurrentMagicError, 10, 0x40,openbuffer);
-  openbuffer[4]=2;NULL_SendMessageSequence\r(50, &CurrentMagicError, 10, 0x40,openbuffer);
-  openbuffer[4]=4;NULL_SendMessageSequence\r(50, &CurrentMagicError, 10, 0x40,openbuffer);
-  openbuffer[4]=8;NULL_SendMessageSequence\r(50, &CurrentMagicError, 10, 0x40,openbuffer);
+  NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer0);
+  openbuffer[4]=1;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
+  openbuffer[4]=2;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
+  openbuffer[4]=4;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
+  openbuffer[4]=8;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
   if (GSM->SimlockInfo(&siml)!=GE_NONE) {
     fprintf(stderr,_("Error getting simlock info\n"));GSM->Terminate();return -1;
   }
@@ -7973,13 +8014,13 @@ int setsimlock()
   }  
   /* Closing simlock with given values */
   closebuffer[4]=1+2+4+8;
-  NULL_SendMessageSequence\r(50, &CurrentMagicError, 20, 0x40,closebuffer);  
+  NULL_SendMessageSequence(50, &CurrentMagicError, 20, 0x40,closebuffer);  
   /* Opening all locks */
-  NULL_SendMessageSequence\r(50, &CurrentMagicError, 10, 0x40,openbuffer0);
-  openbuffer[4]=1;NULL_SendMessageSequence\r(50, &CurrentMagicError, 10, 0x40,openbuffer);
-  openbuffer[4]=2;NULL_SendMessageSequence\r(50, &CurrentMagicError, 10, 0x40,openbuffer);
-  openbuffer[4]=4;NULL_SendMessageSequence\r(50, &CurrentMagicError, 10, 0x40,openbuffer);
-  openbuffer[4]=8;NULL_SendMessageSequence\r(50, &CurrentMagicError, 10, 0x40,openbuffer);
+  NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer0);
+  openbuffer[4]=1;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
+  openbuffer[4]=2;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
+  openbuffer[4]=4;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
+  openbuffer[4]=8;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
   GSM->Reset(0x03);
   GSM->Terminate();
   return 0;
@@ -8079,7 +8120,7 @@ int geteeprom()
     
     if ((i/256)!=((i-1)/256)) fprintf(stderr,_("."));
     
-    if (NULL_SendMessageSequence(50, &CurrentMagicError, 9, 0x40,buffer)!=GE_NONE)\r      break;
+    if (NULL_SendMessageSequence(50, &CurrentMagicError, 9, 0x40,buffer)!=GE_NONE)       break;
 
     i=i+0x10;
   }