Diffstat (limited to 'gammu/emb/gammu/smsd/smsdcore.c') (more/less context) (show whitespace changes)
-rw-r--r-- | gammu/emb/gammu/smsd/smsdcore.c | 130 |
1 files changed, 103 insertions, 27 deletions
diff --git a/gammu/emb/gammu/smsd/smsdcore.c b/gammu/emb/gammu/smsd/smsdcore.c index fbc55d3..cc9accc 100644 --- a/gammu/emb/gammu/smsd/smsdcore.c +++ b/gammu/emb/gammu/smsd/smsdcore.c @@ -1,5 +1,5 @@ -/* (c) 2002-2003 by Marcin Wiacek and Joergen Thomsen */ +/* (c) 2002-2004 by Marcin Wiacek and Joergen Thomsen */ #include <string.h> #include <signal.h> #include <stdarg.h> @@ -13,12 +13,15 @@ # include "s_mysql.h" #endif FILE *smsd_log_file = NULL; +static int TPMR; static GSM_Error SendingSMSStatus; + static void SMSSendingSMSStatus (char *Device, int status, int mr) { dbgprintf("Incoming SMS device: \"%s\" status=%d, reference=%d\n",Device, status, mr); + TPMR = mr; if (status==0) { SendingSMSStatus = ERR_NONE; } else { SendingSMSStatus = ERR_UNKNOWN; @@ -72,9 +75,9 @@ void WriteSMSDLog(char *format, ...) fflush(smsd_log_file); } } -void SMSD_ReadConfig(char *filename, GSM_SMSDConfig *Config, bool log) +void SMSD_ReadConfig(char *filename, GSM_SMSDConfig *Config, bool log, char *service) { INI_Section *smsdcfgfile = NULL; GSM_Config smsdcfg; unsigned char *str; @@ -101,8 +104,9 @@ void SMSD_ReadConfig(char *filename, GSM_SMSDConfig *Config, bool log) Config->IncludeNumbers=INI_FindLastSectionEntry(smsdcfgfile, "gammu", false); if (Config->IncludeNumbers) { GSM_ReadConfig(smsdcfgfile, &smsdcfg, 0); memcpy(&s.Config,&smsdcfg,sizeof(GSM_Config)); + error=GSM_SetDebugFile(s.Config[0].DebugFile, &di); } Config->PINCode=INI_GetValue(smsdcfgfile, "smsd", "PIN", false); if (Config->PINCode == NULL) { @@ -111,31 +115,30 @@ void SMSD_ReadConfig(char *filename, GSM_SMSDConfig *Config, bool log) exit(-1); } if (log) WriteSMSDLog("PIN code is \"%s\"",Config->PINCode); - Config->user = INI_GetValue(smsdcfgfile, "smsd", "user", false); - if (Config->user == NULL) Config->user="root"; - Config->password = INI_GetValue(smsdcfgfile, "smsd", "password", false); - if (Config->password == NULL) Config->password=""; - Config->PC = INI_GetValue(smsdcfgfile, "smsd", "pc", false); - if (Config->PC == NULL) Config->PC="localhost"; - Config->database = INI_GetValue(smsdcfgfile, "smsd", "database", false); - if (Config->database == NULL) Config->database="sms"; - str = INI_GetValue(smsdcfgfile, "smsd", "commtimeout", false); if (str) Config->commtimeout=atoi(str); else Config->commtimeout = 1; str = INI_GetValue(smsdcfgfile, "smsd", "sendtimeout", false); if (str) Config->sendtimeout=atoi(str); else Config->sendtimeout = 10; str = INI_GetValue(smsdcfgfile, "smsd", "receivefrequency", false); if (str) Config->receivefrequency=atoi(str); else Config->receivefrequency = 0; - if (log) WriteSMSDLog("commtimeout=%i, sendtimeout=%i, receivefrequency=%i", Config->commtimeout, Config->sendtimeout, Config->receivefrequency); + str = INI_GetValue(smsdcfgfile, "smsd", "resetfrequency", false); + if (str) Config->resetfrequency=atoi(str); else Config->resetfrequency = 0; + if (log) WriteSMSDLog("commtimeout=%i, sendtimeout=%i, receivefrequency=%i, resetfrequency=%i", + Config->commtimeout, Config->sendtimeout, Config->receivefrequency, Config->resetfrequency); Config->deliveryreport = INI_GetValue(smsdcfgfile, "smsd", "deliveryreport", false); if (Config->deliveryreport == NULL || (!mystrncasecmp(Config->deliveryreport, "log", 3) && !mystrncasecmp(Config->deliveryreport, "sms", 3))) { Config->deliveryreport = "no"; } if (log) WriteSMSDLog("deliveryreport = %s", Config->deliveryreport); + Config->PhoneID = INI_GetValue(smsdcfgfile, "smsd", "phoneid", false); + if (Config->PhoneID == NULL) Config->PhoneID = ""; + if (log) WriteSMSDLog("phoneid = %s", Config->PhoneID); + + if (!strcmp(service,"FILES")) { Config->inboxpath=INI_GetValue(smsdcfgfile, "smsd", "inboxpath", false); if (Config->inboxpath == NULL) Config->inboxpath = emptyPath; Config->inboxformat=INI_GetValue(smsdcfgfile, "smsd", "inboxformat", false); @@ -159,8 +162,24 @@ void SMSD_ReadConfig(char *filename, GSM_SMSDConfig *Config, bool log) Config->errorsmspath=INI_GetValue(smsdcfgfile, "smsd", "errorsmspath", false); if (Config->errorsmspath == NULL) Config->errorsmspath = Config->sentsmspath; if (log) WriteSMSDLog("SMS with errors moved to \"%s\"",Config->errorsmspath); + } + +#ifdef HAVE_MYSQL_MYSQL_H + if (!strcmp(service,"MYSQL")) { + Config->skipsmscnumber = INI_GetValue(smsdcfgfile, "smsd", "skipsmscnumber", false); + if (Config->skipsmscnumber == NULL) Config->skipsmscnumber=""; + Config->user = INI_GetValue(smsdcfgfile, "smsd", "user", false); + if (Config->user == NULL) Config->user="root"; + Config->password = INI_GetValue(smsdcfgfile, "smsd", "password", false); + if (Config->password == NULL) Config->password=""; + Config->PC = INI_GetValue(smsdcfgfile, "smsd", "pc", false); + if (Config->PC == NULL) Config->PC="localhost"; + Config->database = INI_GetValue(smsdcfgfile, "smsd", "database", false); + if (Config->database == NULL) Config->database="sms"; + } +#endif Config->IncludeNumbers=INI_FindLastSectionEntry(smsdcfgfile, "include_numbers", false); Config->ExcludeNumbers=INI_FindLastSectionEntry(smsdcfgfile, "exclude_numbers", false); if (Config->IncludeNumbers != NULL) { @@ -175,8 +194,10 @@ void SMSD_ReadConfig(char *filename, GSM_SMSDConfig *Config, bool log) } Config->retries = 0; Config->prevSMSID[0] = 0; + Config->SMSC.Location = 0; + Config->relativevalidity = -1; } bool SMSD_CheckSecurity(GSM_SMSDConfig *Config) { @@ -191,8 +212,9 @@ bool SMSD_CheckSecurity(GSM_SMSDConfig *Config) return false; } /* No supported - do not check more */ if (error == ERR_NOTSUPPORTED) return true; + /* If PIN, try to enter */ switch (SecurityCode.Type) { case SEC_Pin: WriteSMSDLog("Trying to enter PIN"); @@ -325,29 +347,31 @@ bool SMSD_SendSMS(GSM_SMSDConfig *Config,GSM_SMSDService *Service) while (i==Date.Second && !gshutdown) { my_sleep(10); GSM_GetCurrentDateTime(&Date); } + Service->RefreshPhoneStatus(Config); } return true; } if (error != ERR_NONE) { /* Unknown error - escape */ WriteSMSDLog("Error in outbox on %s", Config->SMSID); for (i=0;i<sms.Number;i++) { - Service->AddSentSMSInfo(&sms, Config, Config->SMSID, i+1, false); + Service->AddSentSMSInfo(&sms, Config, Config->SMSID, i+1, SMSD_SEND_ERROR, -1); } Service->MoveSMS(&sms,Config, Config->SMSID, true,false); return false; } + if (!gshutdown) { if (strcmp(Config->prevSMSID, Config->SMSID) == 0) { Config->retries++; if (Config->retries > MAX_RETRIES) { Config->retries = 0; strcpy(Config->prevSMSID, ""); WriteSMSDLog("Moved to errorbox: %s", Config->SMSID); for (i=0;i<sms.Number;i++) { - Service->AddSentSMSInfo(&sms, Config, Config->SMSID, i+1, false); + Service->AddSentSMSInfo(&sms, Config, Config->SMSID, i+1, SMSD_SEND_ERROR, -1); } Service->MoveSMS(&sms,Config, Config->SMSID, true,false); return false; } @@ -355,15 +379,41 @@ bool SMSD_SendSMS(GSM_SMSDConfig *Config,GSM_SMSDService *Service) Config->retries = 0; strcpy(Config->prevSMSID, Config->SMSID); } for (i=0;i<sms.Number;i++) { - if (strcmp(Config->deliveryreport, "no") != 0) sms.SMS[i].PDU = SMS_Status_Report; + if (sms.SMS[i].SMSC.Location == 1) { + if (Config->SMSC.Location == 0) { + Config->SMSC.Location = 1; + error = Phone->GetSMSC(&s,&Config->SMSC); + if (error!=ERR_NONE) { + WriteSMSDLog("Error getting SMSC from phone"); + return false; + } + + } + memcpy(&sms.SMS[i].SMSC,&Config->SMSC,sizeof(GSM_SMSC)); + sms.SMS[i].SMSC.Location = 0; + if (Config->relativevalidity != -1) { + sms.SMS[i].SMSC.Validity.Format = SMS_Validity_RelativeFormat; + sms.SMS[i].SMSC.Validity.Relative = Config->relativevalidity; + } + } + + if (Config->currdeliveryreport == 1) { + sms.SMS[i].PDU = SMS_Status_Report; + } else { + if ((strcmp(Config->deliveryreport, "no") != 0 && (Config->currdeliveryreport == -1))) sms.SMS[i].PDU = SMS_Status_Report; + } + error=Phone->SendSMS(&s, &sms.SMS[i]); if (error!=ERR_NONE) { + Service->AddSentSMSInfo(&sms, Config, Config->SMSID, i+1, SMSD_SEND_SENDING_ERROR, -1); WriteSMSDLog("Error sending SMS %s (%i): %s", Config->SMSID, error,print_error(error,s.di.df,s.msg)); return false; } + Service->RefreshPhoneStatus(Config); j=0; + TPMR = -1; SendingSMSStatus = ERR_TIMEOUT; while (!gshutdown) { GSM_GetCurrentDateTime (&Date); z=Date.Second; @@ -372,25 +422,24 @@ bool SMSD_SendSMS(GSM_SMSDConfig *Config,GSM_SMSDService *Service) GSM_GetCurrentDateTime(&Date); GSM_ReadDevice(&s,true); if (SendingSMSStatus != ERR_TIMEOUT) break; } + Service->RefreshSendStatus(Config, Config->SMSID); + Service->RefreshPhoneStatus(Config); if (SendingSMSStatus != ERR_TIMEOUT) break; j++; if (j>Config->sendtimeout) break; } if (SendingSMSStatus != ERR_NONE) { + Service->AddSentSMSInfo(&sms, Config, Config->SMSID, i+1, SMSD_SEND_SENDING_ERROR, TPMR); WriteSMSDLog("Error getting send status of %s (%i): %s", Config->SMSID, SendingSMSStatus,print_error(SendingSMSStatus,s.di.df,s.msg)); return false; } - error = Service->AddSentSMSInfo(&sms, Config, Config->SMSID, i+1, true); + error = Service->AddSentSMSInfo(&sms, Config, Config->SMSID, i+1, SMSD_SEND_OK, TPMR); if (error!=ERR_NONE) { return false; } } - while ((int)i<sms.Number-1) { - Service->AddSentSMSInfo(&sms, Config, Config->SMSID, i+1, false); - i++; - } strcpy(Config->prevSMSID, ""); if (Service->MoveSMS(&sms,Config, Config->SMSID, false, true) != ERR_NONE) { Service->MoveSMS(&sms,Config, Config->SMSID, true, false); } @@ -402,9 +451,9 @@ void SMSDaemon(int argc, char *argv[]) { int errors = 255, initerrors=0; GSM_SMSDService *Service; GSM_Error error; - time_t time1; + time_t lastreceive, lastreset = 0; GSM_SMSDConfig Config; if (!strcmp(argv[2],"FILES")) { Service = &SMSDFiles; @@ -416,9 +465,9 @@ void SMSDaemon(int argc, char *argv[]) fprintf(stderr,"Unknown service type (\"%s\")\n",argv[2]); exit(-1); } - SMSD_ReadConfig(argv[3], &Config, true); + SMSD_ReadConfig(argv[3], &Config, true, argv[2]); error = Service->Init(&Config); if (error!=ERR_NONE) { GSM_Terminate_SMSD("Stop GAMMU smsd (%i)", error, true, -1); @@ -427,9 +476,10 @@ void SMSDaemon(int argc, char *argv[]) signal(SIGINT, interrupt); signal(SIGTERM, interrupt); fprintf(stderr,"Press Ctrl+C to stop the program ...\n"); - time1 = time(NULL); + lastreceive = time(NULL); + lastreset = time(NULL); SendingSMSStatus = ERR_UNKNOWN; while (!gshutdown) { /* There were errors in communication - try to recover */ @@ -444,9 +494,29 @@ void SMSDaemon(int argc, char *argv[]) switch (error) { case ERR_NONE: s.User.SendSMSStatus = SMSSendingSMSStatus; Phone = s.Phone.Functions; + if (errors == 255) { errors = 0; + s.Phone.Data.IMEI[0] = 0; + if (!(Phone->GetIMEI(&s))) { + errors++; + } else { + error = Service->InitAfterConnect(&Config); + if (error!=ERR_NONE) { + GSM_Terminate_SMSD("Stop GAMMU smsd (%i)", error, true, -1); + } + Phone->SetFastSMSSending(&s,true); + } + } else { + errors = 0; + } + if (initerrors > 3 || initerrors < 0) { + error=Phone->Reset(&s, false); /* soft reset */ + WriteSMSDLog("Reset return code: %s (%i) ", error == ERR_NONE? "OK":"ERROR", error); + lastreset = time(NULL); + my_sleep(5000); + } /* Marcin Wiacek: FIXME. To check */ // di = s.di; break; case ERR_DEVICEOPENERROR: @@ -456,10 +526,10 @@ void SMSDaemon(int argc, char *argv[]) errors = 250; } continue; } - if ((difftime(time(NULL), time1) >= Config.receivefrequency) || (SendingSMSStatus != ERR_NONE)) { - time1 = time(NULL); + if ((difftime(time(NULL), lastreceive) >= Config.receivefrequency) || (SendingSMSStatus != ERR_NONE)) { + lastreceive = time(NULL); if (!SMSD_CheckSecurity(&Config)) { errors++; initerrors++; @@ -467,15 +537,21 @@ void SMSDaemon(int argc, char *argv[]) } else errors=0; initerrors = 0; - if (!SMSD_CheckSMSStatus(&Config,Service)) { + if (!SMSD_CheckSMSStatus(&Config,Service)) { /* read all incoming SMS */ errors++; continue; } else errors=0; + + if (Config.resetfrequency > 0 && difftime(time(NULL), lastreset) >= Config.resetfrequency) { /* time for preventive reset */ + errors = 254; initerrors = -2; + continue; + } } if (!SMSD_SendSMS(&Config,Service)) continue; } + Phone->SetFastSMSSending(&s,false); GSM_Terminate_SMSD("Stop GAMMU smsd", 0, false, 0); } GSM_Error SMSDaemonSendSMS(char *service, char *filename, GSM_MultiSMSMessage *sms) @@ -493,9 +569,9 @@ GSM_Error SMSDaemonSendSMS(char *service, char *filename, GSM_MultiSMSMessage *s fprintf(stderr,"Unknown service type (\"%s\")\n",service); exit(-1); } - SMSD_ReadConfig(filename, &Config, false); + SMSD_ReadConfig(filename, &Config, false, service); error = Service->Init(&Config); if (error!=ERR_NONE) return ERR_UNKNOWN; |