void SearchPrintPhoneInfo(GSM_StateMachine * sm) { GSM_Error error; char buffer[GSM_MAX_INFO_LENGTH]; /* Try to get phone manufacturer */ error = GSM_GetManufacturer(sm, buffer); /* Bail out if we failed */ if (error != ERR_NONE) { SearchPrintf("\t%s\n", GSM_ErrorString(error)); return; } /* Print basic information */ printf("\t" LISTFORMAT "%s\n", _("Manufacturer"), buffer); /* Try to get phone model */ error = GSM_GetModel(sm, buffer); /* Bail out if we failed */ if (error != ERR_NONE) { SearchPrintf("\t%s\n", GSM_ErrorString(error)); return; } /* Print model information */ printf("\t" LISTFORMAT "%s (%s)\n", _("Model"), GSM_GetModelInfo(sm)->model, buffer); }
void GSM_LogError(GSM_StateMachine * s, const char * message, const GSM_Error err) { if (err != ERR_NONE) { smprintf(s, "%s failed with error %s[%d]: %s\n", message, GSM_ErrorName(err), err, GSM_ErrorString(err)); } }
/* Function to handle errors */ void error_handler(void) { if (error != ERR_NONE) { printf("ERROR: %s\n", GSM_ErrorString(error)); if (GSM_IsConnected(s)) GSM_TerminateConnection(s); exit(error); } }
void cgi_process(GSM_StateMachine *s) { int i = 0; for(i = 0; i<GSM_MAX_MULTI_SMS && smsQ.SMS[0].Location != -1; i++) { /* ----------------------------------------------------- read the message */ error = GSM_GetSMS(s, &smsQ); if(error == ERR_EMPTY) { /* somehow the message is empty */ error = ERR_NONE; smprintf(s, CGI_ENGINE "Message was empty\n"); } if(error != ERR_NONE) { smprintf(s, CGI_ENGINE "Error while reading sms: %s\n", GSM_ErrorString(error)); } if(error == ERR_NONE) { cgi_process_each(s, smsQ.SMS); } /* ------------------------------------------------------- scroll to next */ memmove(smsQ.SMS, &(smsQ.SMS[1]), (GSM_MAX_MULTI_SMS-i-1)*sizeof(GSM_SMSMessage)); } }
int main(int argc, char **argv) { GSM_Error error; gboolean numeric = FALSE, manpage = FALSE; int rc = 0; const char *errorstring; const char *errorname; if (argc >= 2 && strcmp(argv[1], "-n") == 0) { numeric = TRUE; } if (argc >= 2 && strcmp(argv[1], "-m") == 0) { manpage = TRUE; } for (error = ERR_NONE; error < ERR_LAST_VALUE; error++) { errorstring = GSM_ErrorString(error); errorname = GSM_ErrorName(error); if (strcmp("Unknown error description.", errorstring) == 0) { fprintf(stderr, "Unknown error message for %d!\n", error); rc = 1; } if (errorname == NULL) { fprintf(stderr, "Unknown error name for %d!\n", error); rc = 1; } if (numeric) { printf("%d. %s - %s\n", error, errorname, errorstring); } else if (manpage) { printf(".SS %d\n%s\n", 100 + error, errorstring); } else { printf("# %s - %s\n", errorname, errorstring); } } return rc; }
int process_commandline(int argc, char **argv, SMSD_Parameters * params) { int opt; #ifdef HAVE_GETOPT_LONG struct option long_options[] = { {"help", 0, 0, 'h'}, {"version", 0, 0, 'v'}, {"config", 1, 0, 'c'}, {"use-log", 0, 0, 'l'}, {"no-use-log", 0, 0, 'L'}, {0, 0, 0, 0} }; int option_index; while ((opt = getopt_long(argc, argv, "+hvc:lL", long_options, &option_index)) != -1) { #elif defined(HAVE_GETOPT) while ((opt = getopt(argc, argv, "+hvc:lL")) != -1) { #else /* Poor mans getopt replacement */ int i; #define optarg argv[++i] for (i = 1; i < argc; i++) { if (strlen(argv[i]) != 2 || argv[i][0] != '-') { return i; } opt = argv[i][1]; #endif switch (opt) { case 'c': params->config_file = optarg; break; case 'v': version(); break; case 'l': params->use_log = TRUE; break; case 'L': params->use_log = FALSE; break; case '?': wrong_params(); case 'h': help(); exit(0); default: fprintf(stderr, "Parameter -%c not known!\n", opt); wrong_params(); break; } } #if defined(HAVE_GETOPT_LONG) || defined(HAVE_GETOPT) return optind; #else return i; #endif } #ifndef WIN32 #endif int main(int argc, char **argv) { GSM_Error error; int startarg; GSM_MultiSMSMessage sms; GSM_Message_Type type = SMS_SMSD; GSM_SMSDConfig *config; const char program_name[] = "gammu-smsd-inject"; char newid[200] = { 0 }; SMSD_Parameters params = { NULL, NULL, -1, -1, NULL, NULL, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 0 }; /* * We don't need gettext, but need to set locales so that * charset conversion works. */ GSM_InitLocales(NULL); startarg = process_commandline(argc, argv, ¶ms); if (params.config_file == NULL) { #ifdef HAVE_DEFAULT_CONFIG params.config_file = default_config; #else fprintf(stderr, "No config file specified!\n"); help(); exit(1); #endif } error = CreateMessage(&type, &sms, argc, startarg, argv, NULL); if (error != ERR_NONE) { printf("Failed to create message: %s\n", GSM_ErrorString(error)); return 1; } config = SMSD_NewConfig(program_name); assert(config != NULL); error = SMSD_ReadConfig(params.config_file, config, params.use_log); if (error != ERR_NONE) { printf("Failed to read config: %s\n", GSM_ErrorString(error)); SMSD_FreeConfig(config); return 2; } SMSD_EnableGlobalDebug(config); error = SMSD_InjectSMS(config, &sms, newid); if (error != ERR_NONE) { printf("Failed to inject message: %s\n", GSM_ErrorString(error)); SMSD_FreeConfig(config); return 3; } if (strlen(newid) == 0) { printf("Written message without ID\n"); } else { printf("Written message with ID %s\n", newid); } SMSD_FreeConfig(config); return 0; }
void Restore(int argc, char *argv[]) { GSM_Error error; GSM_Backup Backup; GSM_FMStation FMStation; GSM_DateTime date_time; GSM_CalendarEntry Calendar; GSM_Bitmap Bitmap; GSM_Ringtone Ringtone; GSM_MemoryEntry Pbk; GSM_MemoryStatus MemStatus; GSM_ToDoEntry ToDo; GSM_ToDoStatus ToDoStatus; GSM_NoteEntry Note; GSM_Profile Profile; GSM_MultiWAPSettings Settings; GSM_GPRSAccessPoint GPRSPoint; GSM_WAPBookmark Bookmark; int i, j, used, max = 0; gboolean Past = TRUE, First; gboolean Found, DoRestore; error = GSM_ReadBackupFile(argv[2],&Backup,GSM_GuessBackupFormat(argv[2], FALSE)); Print_Error(error); signal(SIGINT, interrupt); fprintf(stderr, "%s\n", _("Press Ctrl+C to break...")); if (Backup.DateTimeAvailable) fprintf(stderr, LISTFORMAT "%s\n", _("Time of backup"),OSDateTime(Backup.DateTime,FALSE)); if (Backup.Model[0]!=0) fprintf(stderr, LISTFORMAT "%s\n", _("Phone"),Backup.Model); if (Backup.IMEI[0]!=0) fprintf(stderr, LISTFORMAT "%s\n", _("IMEI"),Backup.IMEI); if (Backup.Creator[0]!=0) fprintf(stderr, LISTFORMAT "%s\n", _("File created by"),Backup.Creator); if (argc == 4 && strcasecmp(argv[3],"-yes") == 0) always_answer_yes = TRUE; if (Backup.MD5Calculated[0]!=0) { if (strcmp(Backup.MD5Original,Backup.MD5Calculated)) { if (!answer_yes(_("Checksum in backup file do not match (original: %s, new: %s). Continue?"), Backup.MD5Original, Backup.MD5Calculated)) return; } } GSM_Init(TRUE); printf("%s\n", _("Please note that restoring data will cause existing data in phone to be deleted.")); printf("%s\n", _("Use addnew command if you just want to add some entries to your phone.")); DoRestore = FALSE; if (Backup.CallerLogos[0] != NULL) { Bitmap.Type = GSM_CallerGroupLogo; Bitmap.Location = 1; error=GSM_GetBitmap(gsm,&Bitmap); if (error == ERR_NONE) { if (answer_yes("%s", _("Restore phone caller groups and logos?"))) DoRestore = TRUE; } } if (DoRestore) { max = 0; while (Backup.CallerLogos[max]!=NULL) max++; for (i=0;i<max;i++) { error=GSM_SetBitmap(gsm,Backup.CallerLogos[i]); Print_Error(error); fprintf(stderr, "\r"); fprintf(stderr, "%s ", _("Writing:")); fprintf(stderr, _("%i percent"), (i + 1) * 100 / max); if (gshutdown) { GSM_Terminate(); Terminate(4); } } fprintf(stderr, "\n"); } DoRestore = FALSE; if (Backup.PhonePhonebook[0] != NULL) { max = 0; while (Backup.PhonePhonebook[max]!=NULL) max++; MemStatus.MemoryType = MEM_ME; error=GSM_GetMemoryStatus(gsm, &MemStatus); /* Some phones do not support status, try reading some entry */ if (error != ERR_NONE) { Pbk.Location = 1; Pbk.MemoryType = MEM_ME; error = GSM_GetMemory(gsm, &Pbk); MemStatus.MemoryUsed = max; MemStatus.MemoryFree = max; } if (error == ERR_NONE || error == ERR_EMPTY) { fprintf(stderr, _("%i entries in backup file\n"),max); if (answer_yes("%s", _("Restore phone phonebook?"))) DoRestore = TRUE; } } if (DoRestore) { used = 0; for (i=0;i<MemStatus.MemoryUsed+MemStatus.MemoryFree;i++) { Pbk.MemoryType = MEM_ME; Pbk.Location = i + 1; Pbk.EntriesNum = 0; if (used<max && Backup.PhonePhonebook[used]->Location == Pbk.Location) { Pbk = *Backup.PhonePhonebook[used]; used++; if (Pbk.EntriesNum != 0) error=GSM_SetMemory(gsm, &Pbk); if (error == ERR_PERMISSION && GSM_IsPhoneFeatureAvailable(GSM_GetModelInfo(gsm), F_6230iCALLER)) { error=GSM_DeleteMemory(gsm, &Pbk); Print_Error(error); error=GSM_SetMemory(gsm, &Pbk); } if (error == ERR_MEMORY && GSM_IsPhoneFeatureAvailable(GSM_GetModelInfo(gsm), F_6230iCALLER)) { printf_err("%s\n", _("Probably caller group is missing from your backup, add it and use --restore again.")); GSM_Terminate(); Terminate(2); } if (Pbk.EntriesNum != 0 && error==ERR_NONE) { First = TRUE; for (j=0;j<Pbk.EntriesNum;j++) { if (Pbk.Entries[j].AddError == ERR_NONE) continue; if (First) { printf("\r"); printf(_("Location %d"), Pbk.Location); printf("%20s\n ", " "); First = FALSE; } PrintMemorySubEntry(&Pbk.Entries[j], gsm); printf(" %s\n", GSM_ErrorString(Pbk.Entries[j].AddError)); } } } if (Pbk.EntriesNum == 0) { /* Delete only when there was some content in phone */ if (MemStatus.MemoryUsed > 0) { error = GSM_DeleteMemory(gsm, &Pbk); if (error != ERR_EMPTY && error != ERR_NONE) { Print_Error(error); } } } fprintf(stderr, "\r"); fprintf(stderr, "%s ", _("Writing:")); fprintf(stderr, _("%i percent"), (i + 1) * 100 / (MemStatus.MemoryUsed + MemStatus.MemoryFree) ); if (gshutdown) { GSM_Terminate(); Terminate(4); } } fprintf(stderr, "\n"); } DoRestore = FALSE; if (Backup.SIMPhonebook[0] != NULL) { MemStatus.MemoryType = MEM_SM; error=GSM_GetMemoryStatus(gsm, &MemStatus); if (error==ERR_NONE) { max = 0; while (Backup.SIMPhonebook[max]!=NULL) max++; fprintf(stderr, _("%i entries in backup file\n"),max); if (answer_yes("%s", _("Restore SIM phonebook?"))) DoRestore = TRUE; } } if (DoRestore) { used = 0; for (i=0;i<MemStatus.MemoryUsed+MemStatus.MemoryFree;i++) { Pbk.MemoryType = MEM_SM; Pbk.Location = i + 1; Pbk.EntriesNum = 0; if (used<max && Backup.SIMPhonebook[used]->Location == Pbk.Location) { Pbk = *Backup.SIMPhonebook[used]; used++; if (Pbk.EntriesNum != 0) { error=GSM_SetMemory(gsm, &Pbk); if (error==ERR_NONE) { First = TRUE; for (j=0;j<Pbk.EntriesNum;j++) { if (Pbk.Entries[j].AddError == ERR_NONE) continue; if (First) { printf("\r"); printf(_("Location %d"), Pbk.Location); printf("%20s\n ", " "); First = FALSE; } PrintMemorySubEntry(&Pbk.Entries[j], gsm); printf(" %s\n",GSM_ErrorString(Pbk.Entries[j].AddError)); } } } } if (Pbk.EntriesNum == 0) error=GSM_DeleteMemory(gsm, &Pbk); Print_Error(error); fprintf(stderr, "\r"); fprintf(stderr, "%s ", _("Writing:")); fprintf(stderr, _("%i percent"), (i + 1) * 100 / (MemStatus.MemoryUsed + MemStatus.MemoryFree)); if (gshutdown) { GSM_Terminate(); Terminate(4); } } fprintf(stderr, "\n"); } if (GSM_GetConfig(gsm, -1)->SyncTime == FALSE) { if (answer_yes("%s", _("Do you want to set phone date/time? (NOTE: in some phones it's required to correctly restore calendar notes and other items)"))) { GSM_GetCurrentDateTime(&date_time); error=GSM_SetDateTime(gsm, &date_time); Print_Error(error); } } DoRestore = FALSE; if (Backup.Calendar[0] != NULL) { Calendar.Location = 0; /* N6110 doesn't support getting calendar status */ error = GSM_GetNextCalendar(gsm,&Calendar,TRUE); if (error == ERR_NONE || error == ERR_INVALIDLOCATION || error == ERR_EMPTY) { max = 0; while (Backup.Calendar[max] != NULL) max++; fprintf(stderr, _("%i entries in backup file\n"),max); if (answer_yes("%s", _("Restore phone calendar notes?"))) { Past = answer_yes(" %s", _("Restore notes from the past?")); DoRestore = TRUE; } } } if (DoRestore) { fprintf(stderr, "%s ", _("Deleting old notes:")); error = GSM_DeleteAllCalendar(gsm); if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { while (1) { error = GSM_GetNextCalendar(gsm,&Calendar,TRUE); if (error != ERR_NONE) break; error = GSM_DeleteCalendar(gsm,&Calendar); Print_Error(error); fprintf(stderr, "*"); } fprintf(stderr, "\n"); } else { fprintf(stderr, "%s\n", _("Done")); Print_Error(error); } for (i=0;i<max;i++) { if (!Past && GSM_IsCalendarNoteFromThePast(Backup.Calendar[i])) continue; Calendar = *Backup.Calendar[i]; error=GSM_AddCalendar(gsm,&Calendar); Print_Error(error); fprintf(stderr, "\r"); fprintf(stderr, "%s ", _("Writing:")); fprintf(stderr, _("%i percent"), (i + 1) * 100 / max); if (gshutdown) { GSM_Terminate(); Terminate(4); } } fprintf(stderr, "\n"); } DoRestore = FALSE; if (Backup.ToDo[0] != NULL) { error = GSM_GetToDoStatus(gsm,&ToDoStatus); if (error == ERR_NONE) { max = 0; while (Backup.ToDo[max]!=NULL) max++; fprintf(stderr, _("%i entries in backup file\n"),max); if (answer_yes("%s", _("Restore phone todo?"))) DoRestore = TRUE; } } if (DoRestore) { ToDo = *Backup.ToDo[0]; error = GSM_SetToDo(gsm,&ToDo); } if (DoRestore && (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED)) { fprintf(stderr, "%s ", _("Deleting old todos:")); error=GSM_DeleteAllToDo(gsm); if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { while (1) { error = GSM_GetNextToDo(gsm,&ToDo,TRUE); if (error != ERR_NONE) break; error = GSM_DeleteToDo(gsm,&ToDo); Print_Error(error); fprintf(stderr, "*"); } fprintf(stderr, "\n"); } else { fprintf(stderr, "%s\n", _("Done")); Print_Error(error); } for (i=0;i<max;i++) { ToDo = *Backup.ToDo[i]; ToDo.Location = 0; error=GSM_AddToDo(gsm,&ToDo); Print_Error(error); fprintf(stderr, "\r"); fprintf(stderr, "%s ", _("Writing:")); fprintf(stderr, _("%i percent"), (i + 1) * 100 / max); if (gshutdown) { GSM_Terminate(); Terminate(4); } } fprintf(stderr, "\n"); } else if (DoRestore) { /* At first delete entries, that were deleted */ used = 0; error = GSM_GetNextToDo(gsm,&ToDo,TRUE); while (error == ERR_NONE) { used++; Found = FALSE; for (i=0;i<max;i++) { if (Backup.ToDo[i]->Location == ToDo.Location) { Found = TRUE; break; } } if (!Found) { error=GSM_DeleteToDo(gsm,&ToDo); Print_Error(error); } error = GSM_GetNextToDo(gsm,&ToDo,FALSE); fprintf(stderr, "\r"); fprintf(stderr, "%s ", _("Writing:")); fprintf(stderr, _("%i percent"), used * 100 / ToDoStatus.Used); if (gshutdown) { GSM_Terminate(); Terminate(4); } } fprintf(stderr, "\n"); /* Now write modified/new entries */ for (i=0;i<max;i++) { ToDo = *Backup.ToDo[i]; error = GSM_SetToDo(gsm,&ToDo); Print_Error(error); fprintf(stderr, "\r"); fprintf(stderr, "%s ", _("Writing:")); fprintf(stderr, _("%i percent"), (i + 1) * 100 / max); if (gshutdown) { GSM_Terminate(); Terminate(4); } } fprintf(stderr, "\n"); } DoRestore = FALSE; if (Backup.Note[0] != NULL) { error = GSM_GetNotesStatus(gsm,&ToDoStatus); if (error == ERR_NONE) { max = 0; while (Backup.Note[max]!=NULL) max++; fprintf(stderr, _("%i entries in backup file\n"),max); if (answer_yes("%s", _("Restore phone notes?"))) DoRestore = TRUE; } } if (DoRestore) { fprintf(stderr, "%s ", _("Deleting old notes:")); while (1) { error = GSM_GetNextNote(gsm,&Note,TRUE); if (error != ERR_NONE) break; error = GSM_DeleteNote(gsm,&Note); Print_Error(error); fprintf(stderr, "*"); } fprintf(stderr, "\n"); for (i=0;i<max;i++) { Note = *Backup.Note[i]; Note.Location = 0; error=GSM_AddNote(gsm,&Note); Print_Error(error); fprintf(stderr, "\r"); fprintf(stderr, "%s ", _("Writing:")); fprintf(stderr, _("%i percent"), (i + 1) * 100 / max); if (gshutdown) { GSM_Terminate(); Terminate(4); } } fprintf(stderr, "\n"); } if (Backup.SMSC[0] != NULL && answer_yes("%s", _("Restore SIM SMSC profiles?"))) { max = 0; while (Backup.SMSC[max]!=NULL) max++; for (i=0;i<max;i++) { error=GSM_SetSMSC(gsm,Backup.SMSC[i]); Print_Error(error); fprintf(stderr, "\r"); fprintf(stderr, "%s ", _("Writing:")); fprintf(stderr, _("%i percent"), (i + 1) * 100 / max); if (gshutdown) { GSM_Terminate(); Terminate(4); } } fprintf(stderr, "\n"); } if (Backup.StartupLogo != NULL && answer_yes("%s", _("Restore phone startup logo/text?"))) { error=GSM_SetBitmap(gsm,Backup.StartupLogo); Print_Error(error); } if (Backup.OperatorLogo != NULL && answer_yes("%s", _("Restore phone operator logo?"))) { error=GSM_SetBitmap(gsm,Backup.OperatorLogo); Print_Error(error); } DoRestore = FALSE; if (Backup.WAPBookmark[0] != NULL) { Bookmark.Location = 1; error = GSM_GetWAPBookmark(gsm,&Bookmark); if (error == ERR_NONE || error == ERR_INVALIDLOCATION) { if (answer_yes("%s", _("Restore phone WAP bookmarks?"))) DoRestore = TRUE; } } if (DoRestore) { fprintf(stderr, "%s ", _("Deleting old bookmarks:")); /* One thing to explain: DCT4 phones seems to have bug here. * When delete for example first bookmark, phone change * numeration for getting frame, not for deleting. So, we try to * get 1'st bookmark. Inside frame is "correct" location. We use * it later */ while (error==ERR_NONE) { error = GSM_DeleteWAPBookmark(gsm,&Bookmark); Bookmark.Location = 1; error = GSM_GetWAPBookmark(gsm,&Bookmark); fprintf(stderr, "*"); } fprintf(stderr, "\n"); max = 0; while (Backup.WAPBookmark[max]!=NULL) max++; for (i=0;i<max;i++) { Bookmark = *Backup.WAPBookmark[i]; Bookmark.Location = 0; error=GSM_SetWAPBookmark(gsm,&Bookmark); Print_Error(error); fprintf(stderr, "\r"); fprintf(stderr, "%s ", _("Writing:")); fprintf(stderr, _("%i percent"), (i + 1) * 100 / max); if (gshutdown) { GSM_Terminate(); Terminate(4); } } fprintf(stderr, "\n"); } DoRestore = FALSE; if (Backup.WAPSettings[0] != NULL) { Settings.Location = 1; error = GSM_GetWAPSettings(gsm,&Settings); if (error == ERR_NONE) { if (answer_yes("%s", _("Restore phone WAP settings?"))) DoRestore = TRUE; } } if (DoRestore) { max = 0; while (Backup.WAPSettings[max]!=NULL) max++; for (i=0;i<max;i++) { error=GSM_SetWAPSettings(gsm,Backup.WAPSettings[i]); Print_Error(error); fprintf(stderr, "\r"); fprintf(stderr, "%s ", _("Writing:")); fprintf(stderr, _("%i percent"), (i + 1) * 100 / max); if (gshutdown) { GSM_Terminate(); Terminate(4); } } fprintf(stderr, "\n"); } DoRestore = FALSE; if (Backup.MMSSettings[0] != NULL) { Settings.Location = 1; error = GSM_GetMMSSettings(gsm,&Settings); if (error == ERR_NONE) { if (answer_yes("%s", _("Restore phone MMS settings?"))) DoRestore = TRUE; } } if (DoRestore) { max = 0; while (Backup.MMSSettings[max]!=NULL) max++; for (i=0;i<max;i++) { error=GSM_SetMMSSettings(gsm,Backup.MMSSettings[i]); Print_Error(error); fprintf(stderr, "\r"); fprintf(stderr, "%s ", _("Writing:")); fprintf(stderr, _("%i percent"), (i + 1) * 100 / max); if (gshutdown) { GSM_Terminate(); Terminate(4); } } fprintf(stderr, "\n"); } DoRestore = FALSE; if (Backup.Ringtone[0] != NULL) { Ringtone.Location = 1; Ringtone.Format = 0; error = GSM_GetRingtone(gsm,&Ringtone,FALSE); if (error == ERR_NONE || error ==ERR_EMPTY) { if (answer_yes("%s", _("Delete all phone user ringtones?"))) DoRestore = TRUE; } } if (DoRestore) { fprintf(stderr, LISTFORMAT, _("Deleting")); error=GSM_DeleteUserRingtones(gsm); Print_Error(error); fprintf(stderr, "%s\n", _("Done")); DoRestore = FALSE; if (answer_yes("%s", _("Restore user ringtones?"))) DoRestore = TRUE; } if (DoRestore) { max = 0; while (Backup.Ringtone[max]!=NULL) max++; for (i=0;i<max;i++) { error=GSM_RingtoneConvert(&Ringtone, Backup.Ringtone[i], Ringtone.Format); Print_Error(error); error=GSM_SetRingtone(gsm,&Ringtone,&i); Print_Error(error); fprintf(stderr, "\r"); fprintf(stderr, "%s ", _("Writing:")); fprintf(stderr, _("%i percent"), (i + 1) * 100 / max); if (gshutdown) { GSM_Terminate(); Terminate(4); } } fprintf(stderr, "\n"); } DoRestore = FALSE; if (Backup.Profiles[0] != NULL) { Profile.Location = 1; error = GSM_GetProfile(gsm,&Profile); if (error == ERR_NONE) { if (answer_yes("%s", _("Restore phone profiles?"))) DoRestore = TRUE; } } if (DoRestore) { Profile.Location= 0; max = 0; while (Backup.Profiles[max]!=NULL) max++; for (i=0;i<max;i++) { Profile = *Backup.Profiles[i]; error=GSM_SetProfile(gsm,&Profile); Print_Error(error); if (gshutdown) { GSM_Terminate(); Terminate(4); } } fprintf(stderr, "\n"); } DoRestore = FALSE; if (Backup.FMStation[0] != NULL) { FMStation.Location = 1; error = GSM_GetFMStation(gsm,&FMStation); if (error == ERR_NONE || error == ERR_EMPTY) { if (answer_yes("%s", _("Restore phone FM radio stations?"))) DoRestore = TRUE; } } if (DoRestore) { fprintf(stderr, "%s ", _("Deleting old FM stations:")); error=GSM_ClearFMStations(gsm); Print_Error(error); fprintf(stderr, "%s\n", _("Done")); max = 0; while (Backup.FMStation[max]!=NULL) max++; for (i=0;i<max;i++) { FMStation = *Backup.FMStation[i]; error=GSM_SetFMStation(gsm,&FMStation); Print_Error(error); fprintf(stderr, "\r"); fprintf(stderr, "%s ", _("Writing:")); fprintf(stderr, _("%i percent"), (i + 1) * 100 / max); if (gshutdown) { GSM_Terminate(); Terminate(4); } } fprintf(stderr, "\n"); } DoRestore = FALSE; if (Backup.GPRSPoint[0] != NULL) { GPRSPoint.Location = 1; error = GSM_GetGPRSAccessPoint(gsm,&GPRSPoint); if (error == ERR_NONE || error == ERR_EMPTY) { if (answer_yes("%s", _("Restore phone GPRS Points?"))) DoRestore = TRUE; } } if (DoRestore) { max = 0; while (Backup.GPRSPoint[max]!=NULL) max++; for (i=0;i<max;i++) { error=GSM_SetGPRSAccessPoint(gsm,Backup.GPRSPoint[i]); Print_Error(error); fprintf(stderr, "\r"); fprintf(stderr, "%s ", _("Writing:")); fprintf(stderr, _("%i percent"), (i + 1) * 100 / max); if (gshutdown) { GSM_Terminate(); Terminate(4); } } fprintf(stderr, "\n"); } GSM_FreeBackup(&Backup); GSM_Terminate(); }
THREAD_RETURN SearchPhoneThread(void * arg) { int j; OneDeviceInfo *Info = arg; GSM_Error error; GSM_StateMachine *search_gsm; GSM_Config *smcfg; GSM_Config *globalcfg; /* Iterate over all connections */ for (j = 0; strlen(Info->Connections[j].Connection) != 0; j++) { /* Allocate state machine */ search_gsm = GSM_AllocStateMachine(); if (search_gsm == NULL) return THREAD_RETURN_VAL; /* Get configuration pointers */ smcfg = GSM_GetConfig(search_gsm, 0); globalcfg = GSM_GetConfig(gsm, 0); /* We share some configuration with global one */ smcfg->UseGlobalDebugFile = globalcfg->UseGlobalDebugFile; smcfg->DebugFile = strdup(globalcfg->DebugFile); strcpy(smcfg->DebugLevel, globalcfg->DebugLevel); /* Configure the tested state machine */ smcfg->Device = strdup(Info->Device); smcfg->Connection = strdup(Info->Connections[j].Connection); smcfg->SyncTime = FALSE; smcfg->Model[0] = 0; smcfg->LockDevice = FALSE; smcfg->StartInfo = FALSE; /* We have only one configured connection */ GSM_SetConfigNum(search_gsm, 1); /* Let's connect */ error = GSM_InitConnection(search_gsm, 1); printf(_("Connection \"%s\" on device \"%s\"\n"), Info->Connections[j].Connection, Info->Device); /* Did we succeed? Show info */ if (error == ERR_NONE) { SearchPrintPhoneInfo(search_gsm); } else { SearchPrintf("\t%s\n", GSM_ErrorString(error)); } if (error != ERR_DEVICEOPENERROR) { GSM_TerminateConnection(search_gsm); } if (error == ERR_DEVICEOPENERROR) break; /* Free allocated buffer */ GSM_FreeStateMachine(search_gsm); } return THREAD_RETURN_VAL; }
void process_commandline(int argc, char **argv, SMSD_Parameters * params) { int opt; #ifdef HAVE_GETOPT_LONG struct option long_options[] = { {"help", 0, 0, 'h'}, {"version", 0, 0, 'v'}, {"config", 1, 0, 'c'}, {"daemon", 0, 0, 'd'}, {"pid", 1, 0, 'p'}, {"install-service", 0, 0, 'i'}, {"uninstall-service", 0, 0, 'u'}, {"start-service", 0, 0, 's'}, {"stop-service", 0, 0, 'k'}, {"run-as-service", 0, 0, 'S'}, {"user", 1, 0, 'U'}, {"group", 1, 0, 'G'}, {"service-name", 1, 0, 'n'}, {"suicide", 1, 0, 'X'}, {"max-failures", 1, 0, 'f'}, {"use-log", 0, 0, 'l'}, {"no-use-log", 0, 0, 'L'}, {"install-event-log", 0, 0, 'e'}, {"uninstall-event-log", 0, 0, 'E'}, {0, 0, 0, 0} }; int option_index; while ((opt = getopt_long(argc, argv, "hvdc:p:iusSkU:G:n:X:f:lLeE", long_options, &option_index)) != -1) { #elif defined(HAVE_GETOPT) while ((opt = getopt(argc, argv, "hvdc:p:iusSkU:G:n:X:f:lLeE")) != -1) { #else /* Poor mans getopt replacement */ int i; #define optarg argv[++i] for (i = 1; i < argc; i++) { if (strlen(argv[i]) != 2 || argv[i][0] != '-') { wrong_params(); } opt = argv[i][1]; #endif switch (opt) { case 'c': params->config_file = optarg; break; #ifdef HAVE_PIDFILE case 'p': params->pid_file = optarg; break; #endif #ifdef HAVE_UID case 'U': if (!fill_uid(params, optarg)) { fprintf(stderr, "Wrong user name/ID!\n"); exit(1); } break; case 'G': if (!fill_gid(params, optarg)) { fprintf(stderr, "Wrong group name/ID!\n"); exit(1); } break; #endif case 'f': params->max_failures = atoi(optarg); break; #ifdef HAVE_ALARM case 'X': alarm(atoi(optarg)); break; #endif #ifdef HAVE_DAEMON case 'd': params->daemonize = TRUE; break; #endif #ifdef HAVE_WINDOWS_EVENT_LOG case 'e': params->install_evlog = TRUE; break; case 'E': params->uninstall_evlog = TRUE; break; #endif #ifdef HAVE_WINDOWS_SERVICE case 'i': params->install_service = TRUE; break; case 'u': params->uninstall_service = TRUE; break; case 's': params->start_service = TRUE; break; case 'k': params->stop_service = TRUE; break; case 'S': params->run_service = TRUE; break; case 'n': strncpy(smsd_service_name, optarg, SERVICE_NAME_LENGTH); smsd_service_name[SERVICE_NAME_LENGTH - 1] = 0; break; #endif case 'v': version(); break; case 'l': params->use_log = TRUE; break; case 'L': params->use_log = FALSE; break; case '?': wrong_params(); case 'h': help(); exit(0); default: wrong_params(); break; } } #if defined(HAVE_GETOPT) || defined(HAVE_GETOPT_LONG) if (optind < argc) { wrong_params(); } #endif } void configure_daemon(SMSD_Parameters * params) { signal(SIGINT, smsd_interrupt); signal(SIGTERM, smsd_interrupt); #ifdef HAVE_SIGHUP signal(SIGHUP, smsd_reconfigure); #endif #ifdef HAVE_ALARM signal(SIGALRM, smsd_interrupt); #endif #if defined(HAVE_SIGUSR1) && defined(HAVE_SIGUSR2) signal(SIGUSR1, smsd_standby); signal(SIGUSR2, smsd_resume); #endif #ifdef HAVE_DAEMON /* Daemonize has to be before writing PID as it changes it */ if (params->daemonize) { if (daemon(1, 0) != 0) { fprintf(stderr, "daemonizing failed! (%s)\n", strerror(errno)); exit(1); } } #endif #ifdef HAVE_PIDFILE /* Writing PID file has to happen before dropping privileges */ if (params->pid_file != NULL && strlen(params->pid_file) > 0) { check_pid(params->pid_file); write_pid(params->pid_file); } #endif #ifdef HAVE_UID if (params->gid != -1 || params->uid != -1) { if (!set_uid_gid(params)) { fprintf(stderr, "changing uid/gid failed! (%s)\n", strerror(errno)); exit(1); } } #endif #ifdef HAVE_WINDOWS_SERVICE if (params->run_service) { if (!start_smsd_service_dispatcher()) { printf("Error starting %s service\n", smsd_service_name); service_print_error("Error running service"); exit(1); } SMSD_FreeConfig(config); exit(0); } #endif } int main(int argc, char **argv) { GSM_Error error; const char program_name[] = "gammu-smsd"; SMSD_Parameters params = { NULL, NULL, -1, -1, NULL, NULL, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, 0 }; /* * We don't need gettext, but need to set locales so that * charset conversion works. */ GSM_InitLocales(NULL); process_commandline(argc, argv, ¶ms); #ifdef HAVE_WINDOWS_SERVICE if (params.stop_service) { if (stop_smsd_service()) { printf("Service %s stopped sucessfully\n", smsd_service_name); exit(0); } else { printf("Error stopping %s service\n", smsd_service_name); service_print_error("Error stopping service"); exit(1); } } if (params.uninstall_service) { if (uninstall_smsd_service()) { printf("Service %s uninstalled sucessfully\n", smsd_service_name); exit(0); } else { printf("Error uninstalling %s service\n", smsd_service_name); service_print_error("Error uninstalling service"); exit(1); } } #endif #ifdef HAVE_WINDOWS_EVENT_LOG if (params.install_evlog) { if (eventlog_register()) { printf("Installed event log description\n"); exit(0); } else { printf("Failed to install event log description!\n"); exit(1); } } if (params.uninstall_evlog) { if (eventlog_deregister()) { printf("Uninstalled event log description\n"); exit(0); } else { printf("Failed to uninstall event log description!\n"); exit(1); } } #endif if (params.config_file == NULL) { #ifdef HAVE_DEFAULT_CONFIG params.config_file = default_config; #else fprintf(stderr, "No config file specified!\n"); help(); exit(1); #endif } #ifdef HAVE_WINDOWS_SERVICE if (params.install_service) { if (install_smsd_service(¶ms)) { printf("Service %s installed sucessfully\n", smsd_service_name); exit(0); } else { printf("Error installing %s service\n", smsd_service_name); service_print_error("Error installing service"); exit(1); } } if (params.start_service) { if (start_smsd_service()) { printf("Service %s started sucessfully\n", smsd_service_name); exit(0); } else { printf("Error starting %s service\n", smsd_service_name); service_print_error("Error starting service"); exit(1); } } #endif read_config: config = SMSD_NewConfig(program_name); assert(config != NULL); error = SMSD_ReadConfig(params.config_file, config, params.use_log); if (error != ERR_NONE) { printf("Failed to read config: %s\n", GSM_ErrorString(error)); SMSD_FreeConfig(config); return 2; } if (!reconfigure) configure_daemon(¶ms); reconfigure = FALSE; standby = FALSE; error = SMSD_MainLoop(config, FALSE, params.max_failures); if (error != ERR_NONE) { printf("Failed to run SMSD: %s\n", GSM_ErrorString(error)); SMSD_FreeConfig(config); return 2; } SMSD_FreeConfig(config); /* * Wait while we should be suspended. * Later we fall back to reconfigure bellow. */ while (standby) { sleep(1); } if (reconfigure) { goto read_config; } return 0; }
int process_commandline(int argc, char **argv, SMSD_Parameters * params) { int opt; #ifdef HAVE_GETOPT_LONG struct option long_options[] = { {"help", 0, 0, 'h'}, {"version", 0, 0, 'v'}, {"config", 1, 0, 'c'}, {"delay", 1, 0, 'd'}, {"loops", 1, 0, 'l'}, {0, 0, 0, 0} }; int option_index; while ((opt = getopt_long(argc, argv, "+hvc:d:l:C", long_options, &option_index)) != -1) { #elif defined(HAVE_GETOPT) while ((opt = getopt(argc, argv, "+hvc:d:l:C")) != -1) { #else /* Poor mans getopt replacement */ int i, optind = -1; #define optarg argv[++i] for (i = 1; i < argc; i++) { if (strlen(argv[i]) != 2 || argv[i][0] != '-') { wrong_params(); } opt = argv[i][1]; #endif switch (opt) { case 'c': params->config_file = optarg; break; case 'v': version(); break; case 'C': compact = TRUE; break; case 'd': delay_seconds = atoi(optarg); break; case 'l': limit_loops = atoi(optarg); break; case '?': wrong_params(); case 'h': help(); exit(0); default: #if defined(HAVE_GETOPT) || defined(HAVE_GETOPT_LONG) wrong_params(); #else optind = 1; #endif break; } #if !defined(HAVE_GETOPT) && !defined(HAVE_GETOPT_LONG) if (optind != -1) break; #endif } return optind; } #ifndef WIN32 #endif int main(int argc, char **argv) { GSM_Error error; GSM_SMSDConfig *config; GSM_SMSDStatus status; const char program_name[] = "gammu-smsd-monitor"; SMSD_Parameters params = { NULL, NULL, -1, -1, NULL, NULL, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 0 }; /* * We don't need gettext, but need to set locales so that * charset conversion works. */ GSM_InitLocales(NULL); process_commandline(argc, argv, ¶ms); if (params.config_file == NULL) { #ifdef HAVE_DEFAULT_CONFIG params.config_file = default_config; #else fprintf(stderr, "No config file specified!\n"); help(); exit(1); #endif } signal(SIGINT, smsd_interrupt); signal(SIGTERM, smsd_interrupt); config = SMSD_NewConfig(program_name); assert(config != NULL); error = SMSD_ReadConfig(params.config_file, config, TRUE); if (error != ERR_NONE) { printf("Failed to read config: %s\n", GSM_ErrorString(error)); SMSD_FreeConfig(config); return 2; } while (!terminate && (limit_loops == -1 || limit_loops-- > 0)) { error = SMSD_GetStatus(config, &status); if (error != ERR_NONE) { printf("Failed to get status: %s\n", GSM_ErrorString(error)); SMSD_FreeConfig(config); return 3; } if (compact) { printf("%s;%s;%s;%d;%d;%d;%d;%d\n", status.Client, status.PhoneID, status.IMEI, status.Sent, status.Received, status.Failed, status.Charge.BatteryPercent, status.Network.SignalPercent); } else { printf("Client: %s\n", status.Client); printf("PhoneID: %s\n", status.PhoneID); printf("IMEI: %s\n", status.IMEI); printf("Sent: %d\n", status.Sent); printf("Received: %d\n", status.Received); printf("Failed: %d\n", status.Failed); printf("BatterPercent: %d\n", status.Charge.BatteryPercent); printf("NetworkSignal: %d\n", status.Network.SignalPercent); printf("\n"); } sleep(delay_seconds); } SMSD_FreeConfig(config); return 0; }
int main(int argc, char **argv) { GSM_Debug_Info *debug_info; GSM_Phone_ATGENData *Priv; GSM_Phone_Data *Data; unsigned char buffer[BUFFER_SIZE]; FILE *f; size_t len; GSM_StateMachine *s; GSM_Protocol_Message msg; GSM_Error error; GSM_SMSC SMSC; /* Check parameters */ if (argc != 2) { printf("Not enough parameters!\nUsage: get-smsc-at comm.dump\n"); return 1; } /* Open file */ f = fopen(argv[1], "r"); test_result(f != NULL); /* Read data */ len = fread(buffer, 1, sizeof(buffer) - 1, f); test_result(feof(f)); /* Zero terminate data */ buffer[len] = 0; /* Close file */ fclose(f); /* Configure state machine */ debug_info = GSM_GetGlobalDebug(); GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info); GSM_SetDebugLevel("textall", debug_info); /* Allocates state machine */ s = GSM_AllocStateMachine(); test_result(s != NULL); debug_info = GSM_GetDebug(s); GSM_SetDebugGlobal(TRUE, debug_info); GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info); GSM_SetDebugLevel("textall", debug_info); /* Initialize AT engine */ Data = &s->Phone.Data; Data->ModelInfo = GetModelData(NULL, NULL, "unknown", NULL); Priv = &s->Phone.Data.Priv.ATGEN; Priv->ReplyState = AT_Reply_OK; Priv->SMSMode = SMS_AT_PDU; Priv->Charset = AT_CHARSET_UCS2; /* Init message */ msg.Type = 0; msg.Length = len; msg.Buffer = buffer; SplitLines(msg.Buffer, msg.Length, &Priv->Lines, "\x0D\x0A", 2, "\"", 1, TRUE); /* Pointer to store message */ s->Phone.Data.SMSC = &SMSC; /* Parse it */ error = ATGEN_ReplyGetSMSC(msg, s); /* This is normally done by ATGEN_Terminate */ FreeLines(&Priv->Lines); GetLineString(NULL, NULL, 0); /* Free state machine */ GSM_FreeStateMachine(s); printf("%s\n", GSM_ErrorString(error)); return (error == ERR_NONE) ? 0 : 1; }