#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 */
#ifdef UCLINUX
fprintf(stdout, _(
-" gnokii --gnokiid [--debug]\n"
+" gnokii --gnokiid [--debug] [<child to run> [<child args>...]]\n"
));
#endif
#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 */
for(i = 2; i < argc; i++)
nargv[i-2] = argv[i];
+ nargv[argc-2] = NULL; /* required by gnokiid() for execv(3) */
if(checkargs(c, gals, nargc)) {
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)
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;
fprintf(stderr, _("Unknown memory type %s!\n"), argv[0]);
return (-1);
}
+
GetMemoryTypeString(memory_type_string, &entry.MemoryType);
if (argv[argc-1][0] == '-')
/* 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;
}
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;
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;
}
}
/* 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;
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;
}