?? server.y
字號(hào):
if (strlen ($4) > MAXMSGLEN) { strncpy (symbols.message, $4, MAXMSGLEN); symbols.message[MAXMSGLEN] = '\0'; sprintf (buffer, "WARNING: max. message length is %d, value now truncated\r\n", MAXMSGLEN); tellsock (csfd, buffer); } else strcpy (symbols.message, $4); sprintf (buffer, "Ok\r\n"); tellsock (csfd, buffer); syslog ((FACILITY | LOG_NOTICE), "message to transmit is set."); } else { sprintf (buffer, "ERROR: unknown item <%s>\r\n", idname); tellsock (csfd, buffer); } free (idname); idname = NULL; free ($4); } ;parameter: T_PARAM { if (paramname) free (paramname); paramname = (char *) malloc ((yyleng + 1) * sizeof (char)); paramname[0] = '\0'; strcpy (paramname, yytext); } ;variable: T_NAME { if (idname) free (idname); idname = (char *) malloc ((yyleng + 1) * sizeof (char)); idname[0] = '\0'; strcpy (idname, yytext); } ;value: T_TEXT { /* let's dequote here */ dequote ($1); vtype = T_TEXT; } | T_PHNUM { /* let's dequote and remove [/.] here */ dequote ($1); deslashdot ($1); vtype = T_PHNUM; } ;%%/*########################################################*//* Main entry point for the parser module */int parser (){ /*======================================Initialisations */ /*==============================Main Call to the Parser */ yyparse ();} /* parser () *//*########################################################*//*========================================================*//* Local Functions *//*========================================================*/int my_yyinput (buf, max_size)char *buf;int max_size;{ int n = min (max_size, (myinputlim - myinputptr)); if (n > 0) { memcpy (buf, myinputptr, n); myinputptr += n; } return (n);} /* my_yyinput () *//*========================================================*/int give_help (p)char *p;{ int topic_id; topic_id = help_lookup (p); switch (topic_id) { case H_HELP: { sprintf (buffer, "\r\nSyntax: he | help [command]\r\n" "Used with no option, gives a list of all available commands.\r\n" "When a command is provided, gives detailed help on this command.\r\n\r\n"); tellsock (csfd, buffer); break; } case H_CLEAR: { sprintf (buffer, "\r\nSyntax: clear [item]\r\n" "Where [item] is one of:\r\n" "- smsc: SMS Message Center (reverts it to \"%s\")\r\n" "- user: sender identification (user name) for logging purposes\r\n" "- dest: destination GSM number\r\n" "- message | msg: message text to be sent to destination\r\n" "Used with no option, clears all items.\r\n" "When an item is specified, clears only this one.\r\n\r\n", DEFAULTSMSC); tellsock (csfd, buffer); break; } case H_SET: { sprintf (buffer, "\r\nSyntax: set item = value\r\n" "Where [item] is one of:\r\n" "- smsc: SMS Message Center (see your provider or use default)\r\n" "- user: sender identification (user name) for logging purposes\r\n" "- dest: destination GSM number\r\n" "- message | msg: message text to be sent to destination\r\n\r\n"); tellsock (csfd, buffer); sprintf (buffer, "Note 1: text must be quoted, GSM numbers can be quoted, GSM numbers can\r\n" "contain any of [/.-+].\r\n\r\n" "Note 2: for SMSC, a value of \"%s\" means the default SMSC\r\n" "as defined per device in %s. Set it to a valid phone\r\n" "number to use a different one. Use the \"clear\" command to reset it\r\n" "to \"%s\".\r\n\r\n", DEFAULTSMSC, GSMDEVFILE, DEFAULTSMSC); tellsock (csfd, buffer); break; } case H_SEND: { sprintf (buffer, "\r\nSyntax: send\r\n" "When all parameters are filled in as required, use this command to\r\n" "send the SMS message. You'll wait during the time it takes to send.\r\n" "An acknowlegment will be returned when done.\r\n\r\n"); tellsock (csfd, buffer); break; } case H_QUIT: { /* just jump to next */ } case H_EXIT: { /* just jump to next */ } case H_BYE: { sprintf (buffer, "\r\nSyntax: quit | exit | bye\r\n" "Closes the connection and leaves the program.\r\n\r\n"); tellsock (csfd, buffer); break; } case H_SHOW: { sprintf (buffer, "\r\nSyntax: sh | show [item]\r\n" "Where [item] is one of:\r\n" "- smsc: SMS Message Center (see your provider or use default)\r\n" "- user: sender identification (user name) for logging purposes\r\n" "- dest: destination GSM number\r\n" "- message | msg: message text to be sent to destination\r\n" "Used without parameter, the command displays the current setting\r\n" "for all items. When an item is specified, only this one is\r\n" "displayed.\r\n\r\n"); tellsock (csfd, buffer); break; } case H_STATS: { sprintf (buffer, "\r\nStatistics are not implemented yet.\r\n\r\n"); tellsock (csfd, buffer); break; } case H_DEVLIST: { sprintf (buffer, "\r\nSyntax: devicelist | dl\r\n" "Lists registered GSM devices.\r\n" "Those are usually configured through <%s>.\r\n" "The fields provided in the output are:\r\n", GSMDEVFILE); tellsock (csfd, buffer); sprintf (buffer, "- owner: pid owning a lock on it (0 = not locked)\r\n" "- device: Unix device name\r\n" "- CallerID: the GSM's network addr. (its phone number)\r\n" "- Def SCA: the default Service Center Addr. (or SMSC)\r\n" "- Provider: Network Provider Name\r\n\r\n"); tellsock (csfd, buffer); break; } case H_ACLIST: { sprintf (buffer, "\r\nSyntax: aclist | acl\r\n" "Dumps the registered ACL entries to screen.\r\n" "ACL's are Access Control Lists that define which machine\r\n" "is allowed to use the server and which isn't. ACL's are\r\n" "usually configured through <%s>.\r\n" "man 5 gsmaccess for more details.\r\n\r\n", ACCESSFILE); tellsock (csfd, buffer); break; } case H_UPTIME: { sprintf (buffer, "\r\nSyntax: uptime | ut\r\n" "Displays the SMS server process uptime in days, hours, \r\n" "minutes and seconds.\r\n\r\n"); tellsock (csfd, buffer); break; } default: { sprintf (buffer, "ERROR: don't know about <%s>. Can't help.\r\n", p); tellsock (csfd, buffer); break; } } /* switch (topic_id) */ return (topic_id);} /* give_help () *//*========================================================*/int help_lookup (p)char *p;{ int i; for (i = 0; (help_topics[i] != NULL) && (strcmp (p, help_topics[i]) != 0); i++); return (i);} /* help_lookup () *//*========================================================*/void print_device_list (){ extern int shmem_sem; extern struct gsms_def *gsmdevices; sprintf (buffer, "\r\n" "L | Owner | Device | CallerID | Def. SCA | Provider \r\n" "--+-------+---------------+----------------+----------------+------------\r\n"); tellsock (csfd, buffer); /* get exclusive access to shared mem. for safety's sake */ if (sem_wait (shmem_sem) == -1) syserr ("sms_serv: failed to wait on shared mem. semaphore"); /* ---- Begin Crit. Sect. #4 ---- */ for (i = 0; i < ngsmdevs; i++) { sprintf (buffer, "%s | %5d | /dev/%-8s | %-14s | %-14s | %s\r\n", (gsmdevices[i].free ? "." : "*"), gsmdevices[i].owner, gsmdevices[i].device, gsmdevices[i].addr, gsmdevices[i].defsca, gsmdevices[i].provider); tellsock (csfd, buffer); } /* for (i... */ /* leave crit. sect. */ if (sem_signal (shmem_sem) == -1) syserr ("sms_serv: can't signal shared mem. semaphore"); /* ---- End Crit. Sect. #4 ---- */ sprintf (buffer, "\r\n"); tellsock (csfd, buffer);} /* print_device_list () *//*========================================================*/void print_access_list (){ extern acl_list gsm_acl; struct acl_item *cursor; unsigned long nomask; int netmask; double power; sprintf (buffer, "\r\nCurrent Access Control List:\r\n" "============================\r\n"); tellsock (csfd, buffer); if (!empty_acl_list (gsm_acl)) { cursor = gsm_acl.head; /* convert mask value */ nomask = ntohl (cursor->nomask); if (nomask < (unsigned long) 4294967295) { nomask++; power = (log (nomask) / log (2)); netmask = (32 - power); } else { netmask = 0; } sprintf (buffer, "%-5s : [%s] / %d\r\n", (cursor->action == ACL_ALLOW) ? "ALLOW" : "DENY", inet_ntoa (cursor->network), netmask); tellsock (csfd, buffer); while (cursor->next != NULL) { cursor = cursor->next; /* convert mask value */ nomask = ntohl (cursor->nomask); if (nomask < (unsigned long) 4294967295) { nomask++; power = (log (nomask) / log (2)); netmask = (32 - power); } else { netmask = 0; } sprintf (buffer, "%-5s : [%s] / %d\r\n", (cursor->action == ACL_ALLOW) ? "ALLOW" : "DENY", inet_ntoa (cursor->network), netmask); tellsock (csfd, buffer); } } else { sprintf (buffer, "Nothing to print: empty 'ACL' list.\r\n"); tellsock (csfd, buffer); } sprintf (buffer, "\r\n"); tellsock (csfd, buffer);} /* print_access_list () *//*========================================================*/void compute_uptime (){ extern time_t starttime; double upsecs; int days; int hours; int rem; div_t dt; /* compute the uptime in seconds */ upsecs = difftime (time (NULL), starttime); /* first extract the number of days */ dt = div ((int) upsecs, 86400); days = dt.quot; rem = dt.rem; /* now extract the number of hours */ dt = div (rem, 3600); hours = dt.quot; rem = dt.rem; /* then extract the number of minutes and seconds */ dt = div (rem, 60); sprintf (buffer, "\r\nServer uptime: %d days %d hours %d min %d secs.\r\n\r\n", days, hours, dt.quot, dt.rem); tellsock (csfd, buffer);} /* compute_uptime () *//*========================================================*/int validate_msg_param (struct symbols *msg){ int retval; retval = ((msg->smsc[0] != '\0') && (msg->destgsm[0] != '\0') && (msg->message[0] != '\0') && (msg->user[0] != '\0')); return (retval);} /* validate_msg_param () *//*========================================================*/int send_sms (struct gsms_def *gsm){ int fd, retval = 0; char *scratch; char *ptr; char *cmsgid; int nread; int newpin; int retries; int msgid; char reqsca[MAXPHNUMLEN + 1]; scratch = (char *) malloc ((BIGBUFF + 1) * sizeof (char)); if (!scratch) syserr ("sms_serv: can't allocate scratch space"); memset (scratch, 0, (BIGBUFF + 1)); /* open modem line */ fd = blopen_mdm_line (gsm->device, B9600); if (fd < 0) { syslog ((FACILITY | LOG_ERR), "call to blopen_mdm_line() failed."); mdmperror ("sms_serv: blopen_mdm_line() failed"); free (scratch); return (-1); } /*------------set GSM to "verbose" error reporting mode */ sprintf (scratch, "at+cmee=1\r"); tell_gsm (fd, scratch); memset (scratch, 0, (BIGBUFF + 1)); if (get_gsm_answer (fd, scratch, BIGBUFF, 1)) { tellsock (csfd, scratch); /* check for "OK" */ if (strstr (scratch, "OK") == NULL) { mdm_unlock (mdmopendevice); hangup (fd); free (scratch); syslog ((FACILITY | LOG_ERR), "error after sending AT+CMEE command."); mdmperror ("sms_serv: error after sending AT+CMEE command"); return (-1); } } else { mdm_unlock (mdmopendevice); hangup (fd); free (scratch); syslog ((FACILITY | LOG_ERR), "GSM module not responding."); mdmperror ("sms_serv: GSM not responding"); return (-1); } /*---------------------------then, check for SIM status */ sprintf (scratch, "at+cpin?\r"); tell_gsm (fd, scratch); memset (scratch, 0, (BIGBUFF + 1)); if (get_gsm_answer (fd, scratch, BIGBUFF, 1)) { tellsock (csfd, scratch); /* check for "READY" -- if not, make it so */
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -