📄 gsmsmsd.cc
字号:
{ bool enableSyslog = false; try { string device = "/dev/mobilephone"; string action; string baudrate; bool enableSMS = true; bool enableCB = true; bool enableStat = true; bool flushSMS = false; bool onlyReceptionIndication = true; string spoolDir; string sentDir = ""; string failedDir = ""; unsigned int priorities = 0; string initString = DEFAULT_INIT_STRING; bool swHandshake = false; string concatenatedMessageIdStr; int opt; int dummy; while((opt = getopt_long(argc, argv, "c:C:I:t:fd:a:b:hvs:S:F:P:LXDr", longOpts, &dummy)) != -1) switch (opt) { case 'c': concatenatedMessageIdStr = optarg; break; case 'r': requestStatusReport = true; break; case 'D': onlyReceptionIndication = false; break; case 'X': swHandshake = true; break; case 'I': initString = optarg; break; case 't': receiveStoreName = optarg; break; case 'd': device = optarg; break; case 'C': serviceCentreAddress = optarg; break; case 's': spoolDir = optarg; break; case 'S': sentDir = optarg; break; case 'F': failedDir = optarg; break; case 'P': priorities = abs(atoi(optarg)); break;#ifndef WIN32 case 'L': enableSyslog = true; // log messages prefixed by the program name with the path removed openlog( strrchr(argv[0],'/')!=NULL ? strrchr(argv[0],'/')+1 : argv[0], LOG_CONS | LOG_NDELAY | LOG_PID, LOG_DAEMON); syslog(LOG_NOTICE, "%s started (version %s [compiled %s])", argv[0], VERSION, __DATE__); on_exit(syslogExit, NULL); break;#endif case 'f': flushSMS = true; break; case 'a': action = optarg; break; case 'b': baudrate = optarg; break; case 'v': cerr << argv[0] << stringPrintf(_(": version %s [compiled %s]"), VERSION, __DATE__) << endl; exit(0); break; case 'h': cerr << argv[0] << _(": [-a action][-b baudrate][-C sca][-d device]" "[-f][-F failed dir]\n" " [-h][-I init string][-L][-P priorities]" "[-s spool dir][-S sent dir][-t]\n" " [-v]{sms_type}") << endl << endl << _(" -a, --action the action to execute when an SMS " "arrives\n" " (SMS is send to stdin of action)") << endl << _(" -b, --baudrate baudrate to use for device " "(default: 38400)") << endl << _(" -c, --concatenate start ID for concatenated SMS messages") << endl << _(" -C, --sca SMS service centre address") << endl << _(" -d, --device sets the device to connect to") << endl << _(" -D, --direct enable direct routing of SMSs") << endl << _(" -f, --flush flush SMS from store") << endl << _(" -F, --failed directory to move failed SMS to") << endl << _(" -h, --help prints this message") << endl << _(" -I, --init device AT init sequence") << endl#ifndef WIN32 << _(" -L, --syslog log errors and information to syslog") << endl#endif << _(" -P, --priorities number of priority levels to use") << endl << _(" -r, --requeststat request SMS status report") << endl << _(" -s, --spool spool directory for outgoing SMS") << endl << _(" -S, --sent directory to move sent SMS to") << endl << _(" -t, --store name of SMS store to use for flush\n" " and/or temporary SMS storage") << endl << endl << _(" -v, --version prints version and exits") << endl << _(" -X, --xonxoff switch on software handshake") << endl << endl << _(" sms_type may be any combination of") << endl << endl << _(" sms, no_sms controls reception of normal SMS") << endl << _(" cb, no_cb controls reception of cell broadcast" " messages") << endl << _(" stat, no_stat controls reception of status reports") << endl << endl << _(" default is \"sms cb stat\"") << endl << endl << _("If no action is given, the SMS is printed to stdout") << endl << endl; exit(0); break; case '?': throw GsmException(_("unknown option"), ParameterError); break; } // find out which kind of message to route for (int i = optind; i < argc; ++i) { string s = lowercase(argv[i]); if (s == "sms") enableSMS = true; else if (s == "no_sms") enableSMS = false; else if (s == "cb") enableCB = true; else if (s == "no_cb") enableCB = false; else if (s == "stat") enableStat = true; else if (s == "no_stat") enableStat = false; } // check parameters if (concatenatedMessageIdStr != "") concatenatedMessageId = checkNumber(concatenatedMessageIdStr); // register signal handler for terminate signal#ifndef WIN32 struct sigaction terminateAction; terminateAction.sa_handler = terminateHandler; sigemptyset(&terminateAction.sa_mask); terminateAction.sa_flags = SA_RESTART; if (sigaction(SIGINT, &terminateAction, NULL) != 0 || sigaction(SIGTERM, &terminateAction, NULL) != 0)#else if(signal(SIGINT, terminateHandler) == SIG_ERR || signal(SIGTERM, terminateHandler) == SIG_ERR)#endif throw GsmException( stringPrintf(_("error when calling sigaction() (errno: %d/%s)"), errno, strerror(errno)), OSError); // open GSM device me = new MeTa(new#ifdef WIN32 Win32SerialPort#else UnixSerialPort#endif (device, baudrate == "" ? DEFAULT_BAUD_RATE : baudRateStrToSpeed(baudrate), initString, swHandshake)); // if flush option is given get all SMS from store and dispatch them if (flushSMS) { if (receiveStoreName == "") throw GsmException(_("store name must be given for flush option"), ParameterError); SMSStoreRef store = me->getSMSStore(receiveStoreName); for (SMSStore::iterator s = store->begin(); s != store->end(); ++s) if (! s->empty()) { string result = _("Type of message: "); switch (s->message()->messageType()) { case SMSMessage::SMS_DELIVER: result += _("SMS message\n"); break; case SMSMessage::SMS_SUBMIT_REPORT: result += _("submit report message\n"); break; case SMSMessage::SMS_STATUS_REPORT: result += _("status report message\n"); break; } result += s->message()->toString(); doAction(action, result); store->erase(s); } } // set default SMS store if -t option was given or // read from ME otherwise if (receiveStoreName == "") { string dummy1, dummy2; me->getSMSStore(dummy1, dummy2, receiveStoreName ); } else me->setSMSStore(receiveStoreName, 3); // switch message service level to 1 // this enables SMS routing to TA me->setMessageService(1); // switch on SMS routing me->setSMSRoutingToTA(enableSMS, enableCB, enableStat, onlyReceptionIndication); // register event handler to handle routed SMSs, CBMs, and status reports me->setEventHandler(new EventHandler()); // wait for new messages bool exitScheduled = false; while (1) {#ifdef WIN32 ::timeval timeoutVal; timeoutVal.tv_sec = 5; timeoutVal.tv_usec = 0; me->waitEvent((gsmlib::timeval *)&timeoutVal);#else struct timeval timeoutVal; timeoutVal.tv_sec = 5; timeoutVal.tv_usec = 0; me->waitEvent(&timeoutVal);#endif // if it returns, there was an event or a timeout while (newMessages.size() > 0) { // get first new message and remove it from the vector SMSMessageRef newSMSMessage = newMessages.begin()->_newSMSMessage; CBMessageRef newCBMessage = newMessages.begin()->_newCBMessage; GsmEvent::SMSMessageType messageType = newMessages.begin()->_messageType; int index = newMessages.begin()->_index; string storeName = newMessages.begin()->_storeName; newMessages.erase(newMessages.begin()); // process the new message string result = _("Type of message: "); switch (messageType) { case GsmEvent::NormalSMS: result += _("SMS message\n"); break; case GsmEvent::CellBroadcastSMS: result += _("cell broadcast message\n"); break; case GsmEvent::StatusReportSMS: result += _("status report message\n"); break; } if (! newSMSMessage.isnull()) result += newSMSMessage->toString(); else if (! newCBMessage.isnull()) result += newCBMessage->toString(); else { SMSStoreRef store = me->getSMSStore(storeName); store->setCaching(false); if (messageType == GsmEvent::CellBroadcastSMS) result += (*store.getptr())[index].cbMessage()->toString(); else result += (*store.getptr())[index].message()->toString(); store->erase(store->begin() + index); } // call the action doAction(action, result); } // if no new SMS came in and program exit was scheduled, then exit if (exitScheduled) exit(0); // handle terminate signal if (terminateSent) { exitScheduled = true; // switch off SMS routing try { me->setSMSRoutingToTA(false, false, false); } catch (GsmException &ge) { // some phones (e.g. Motorola Timeport 260) don't allow to switch // off SMS routing which results in an error. Just ignore this. } // the AT sequences involved in switching of SMS routing // may yield more SMS events, so go round the loop one more time } // send spooled SMS if (! terminateSent) sendSMS(spoolDir, sentDir, failedDir, priorities, enableSyslog, me->getAt()); } } catch (GsmException &ge) {#ifndef WIN32 if (enableSyslog) syslog(LOG_ERR, "error %s", ge.what());#endif cerr << argv[0] << _("[ERROR]: ") << ge.what() << endl; if (ge.getErrorClass() == MeTaCapabilityError) cerr << argv[0] << _("[ERROR]: ") << _("(try setting sms_type, please refer to gsmsmsd manpage)") << endl; // switch off message routing, so that following invocations of gsmsmd // are not swamped with message deliveries while they start up if (me != NULL) { try { me->setSMSRoutingToTA(false, false, false); } catch (GsmException &ge) { // some phones (e.g. Motorola Timeport 260) don't allow to switch // off SMS routing which results in an error. Just ignore this. } } return 1; } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -