X-Git-Url: https://git.jankratochvil.net/?p=gnokii.git;a=blobdiff_plain;f=gnokii%2Fgnokii.c;h=fadf2b4913e5812259773aa2749e0a749e3641de;hp=d9030f78b7e7a77b8c464a6952bc7d233fbeab2c;hb=8f1eee8a4da6f78a0ee3bb4b8e735e367af42ac9;hpb=75fee3944a3fa77dae48012152a9d70f2145f148 diff --git a/gnokii/gnokii.c b/gnokii/gnokii.c index d9030f7..fadf2b4 100644 --- a/gnokii/gnokii.c +++ b/gnokii/gnokii.c @@ -20,6 +20,8 @@ #include #include #include +#include +#include #ifdef UCLINUX /* 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] [ [...]]\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; - case 2:fprintf(file,_("8"));break; - case 3:fprintf(file,_("4"));break; - case 4:fprintf(file,_("2"));break; - case 5:fprintf(file,_("1"));break; + 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)) { - 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 ? - } + 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 (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); + 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 (50, &CurrentMagicError, 20, 0x40,closebuffer); + NULL_SendMessageSequence(50, &CurrentMagicError, 20, 0x40,closebuffer); /* Opening all locks */ - 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); + 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) break; + if (NULL_SendMessageSequence(50, &CurrentMagicError, 9, 0x40,buffer)!=GE_NONE) break; i=i+0x10; }