?? server.y
字號:
%{/*========================================================== * Program : server.y Project : smslink * Author : Philippe Andersson. * Date : 02/12/99 * Version : 0.35b * Notice : (c) Les Ateliers du Heron, 1998 for Scitex Europe, S.A. * Comment : Parser module for SMS server * * Modification History : * - 0.01a (19/08/98) : Initial release. * - 0.02a (21/08/98) : Implemented "variable" assignment and * individual clearing. * - 0.03a (21/08/98) : Added support for prompt. * - 0.04a (21/08/98) : Added dequoting for strings. * - 0.05a (22/08/98) : Added detailed help handling and individ. * show for items. Also implemented a separate exit function. * - 0.06a (24/08/98) : Completed help system. Also stuffed the * conclude() function a bit. * - 0.10a (27/08/98) : Merged the parser module into the main * sms_serv program. Moved yyerror () to server.l. * - 0.11a (01/09/98) : Completed output migration to socket * (printf's to sprintf's). * - 0.12a (01/09/98) : Start implementing restricted access * to non-sharable resources (modems) through semaphores. * - 0.13a (03/09/98) : Completed implementation of crit. * sections through semaphores and shared memory. * - 0.14a (06/09/98) : Inserted #ifdef's to have it compile * under RedHat (GNU Libc 6). Also implemented minimal validation * on message parameters (presence checking). * - 0.15a (24/09/98) : Changed [LF] to [CR][LF] in messages * sent through the socket. * - 0.16a (27/09/98) : Added positive acknowledgement for * variable setting ("Ok") for error checking on client side. * Improved some help messages in give_help(). * - 0.17a (01/10/98) : Added logging detail (variable setting). * - 0.18a (19/10/98) : Changed 'struct modem_def' to 'struct * gsms_def' and 'modemsdef' to 'gsmdevices'. Cosmetics. * - 0.20a (20/10/98) : Merge the 'spit.c' source into this. * Implement the actual SMS sending code. * - 0.21a (20/10/98) : Implemented 'devicelist' command. * - 0.22a (21/10/98) : Added a signal trap for SIGPIPE, in * order to avoid getting locked GSM modules when a client * dies or quits unexpectedly (in the critical section). * ++++ Switched to Beta ++++ * - 0.23b (21/10/98) : Added deslashdot() function to clean * phone numbers before sending them to the GSM. * - 0.24b (22/10/98) : Improved SIGPIPE handling by adding * 'instance_is_set' variable telling whether the value of * 'instance' should be considered relevant. * - 0.25b (23/10/98) : Added handling for 'user' parameter, * and improved checking on phone number validity. 'user' * parameter also be made required. Corrected timeout values * in PIN / PUK transmission, and a bug in CSCA-related sprintf * format. * - 0.26b (05/11/98) : Corrected an inconsistency in the error * message related to catching SIGPIPE signal. * - 0.27b (13/12/98) : Moved to sigaction() signal handling. * Added handler for SIGTERM in crit. section. Included * handling of new member "owner" in struct gsms_def. * - 0.28b (14/12/98) : Corrected a boundary-checking bug in the * search for a free GSM instance loop. * - 0.29b (16/05/99) : Added "uptime" command. * - 0.30b (18/05/99) : Refined the uptime display. Solved a * bug related to the buffer length in "help" command. * - 0.31b (06/06/99) : Added "days" counter to uptime display. * Adapted on-line help accordingly. Also added a command to * turn off notification for incoming SMS messages in send_sms(). * - 0.32b (28/06/99) : In send_sms(), moved the AT+CNMI command * after the PIN check routine. PIN-Activated SIM is required * for AT+CNMI. * - 0.33b (29/06/99) : Moved 3 functions over to stuff.c and * made them public (misc. string handling functions). * - 0.34b (20/09/99) : Improved the "show" command to also * display the current length of the message string. * - 0.35b (02/12/99) : Improved default SMSC handling in * send_sms(). Now takes its default value from the configuration * file only (/etc/gsmdevices). Adapted on-line help accordingly. * Added "aclist" command and related help. Cosmetics. *========================================================*//* must be defined before the usual includes (stdlib.h) */#define RAND_MAX 9999 /* max val. for random PIN */#include <stdio.h>#include <stdlib.h> /* for errno & div() */#ifdef LINUX_LC6# include <errno.h>#endif /* #ifdef LINUX_LC6 */#include <strings.h>#include <signal.h>#include <time.h> /* for difftime() */#include <math.h> /* for log() */#include <netinet/in.h> /* for ntohl() */#include <termios.h> /* for baudrates definitions */#include <dial/modems.h> /* requires 'libmodem' */#include "sms_serv.h"#define min(a, b) ( a < b ? a : b )/*-------------------------------------External variables *//* for lex & yacc/bison */extern int errno;extern int yyleng;extern char *yytext;extern char myinput[];extern char *myinputptr; /* cur. pos. in myinput */extern char *myinputlim; /* end of data *//* program specific */extern int csfd; /* client socket FD */extern char *buffer; /* scratch space for C/S dialogue */extern struct symbols symbols;extern int ngsmdevs; /* num. configured GSM devices *//*---------------------------------------Global variables */char *paramname = NULL;char *idname = NULL;/* char *buffer = NULL; */int i;int instance;int instance_is_set = FALSE;int vtype;/*------------------------------------For the help system *//* Be carefull to match the defines here with the array below */#define H_HELP 0#define H_CLEAR 1#define H_SET 2#define H_SEND 3#define H_QUIT 4#define H_EXIT 5#define H_BYE 6#define H_SHOW 7#define H_STATS 8#define H_DEVLIST 9#define H_UPTIME 10#define H_ACLIST 11#define H_MAX 12 /* keeps (last + 1) */char *help_topics[(H_MAX + 1)] = {"help", "clear", "set", "send", "quit", "exit", "bye", "show", "stats", "devicelist", "uptime", "aclist", NULL};/*----------------------------Local Function declarations */int shiftleft (char *, int);int dequote (char *);int deslashdot (char *);int give_help (char *);int help_lookup (char *);int load_help ();void free_help ();void print_device_list ();void print_access_list ();void compute_uptime ();int validate_msg_param (struct symbols *);int send_sms (struct gsms_def *);void sms_send_wrapper ();void unlock_gsm ();void conclude ();/*========================================================*/%}%union { char *string; /* string buffer for token value */}/* commands */%token T_HELP%token T_CLEAR%token T_SEND%token T_DEVLIST%token T_ACLIST%token T_UPTIME%token T_SET%token T_QUIT%token T_STATS%token T_SHOW/* others */%token T_PARAM%token <string> T_TEXT%token <string> T_PHNUM%token T_NAME%type <string> value%%statement: single_command | param_command | assignment | /* allow empty input */ ;single_command: T_HELP { sprintf (buffer, "\r\nSMS Server Help\r\n" "===============\r\n" "he | help [command] : displays help\r\n" "set item = value : sets message parameters\r\n" "clear [item] : clears item (all items)\r\n" "send : sends SMS\r\n"); tellsock (csfd, buffer); sprintf (buffer, "dl | devicelist : lists configured GSM devices\r\n" "acl | aclist : dumps the registered ACL's to screen\r\n" "ut | uptime : displays server uptime\r\n" "quit | exit | bye : closes connection and exits\r\n" "stats : displays server stats\r\n" "sh | show [item] : displays item (all items)\r\n\r\n"); tellsock (csfd, buffer); } | T_CLEAR { strcpy (symbols.smsc, DEFAULTSMSC); symbols.destgsm[0] = '\0'; symbols.user[0] = '\0'; symbols.message[0] = '\0'; sprintf (buffer, "All items cleared...\r\n"); tellsock (csfd, buffer); } | T_SEND { if (validate_msg_param (&symbols)) sms_send_wrapper (); else { sprintf (buffer, "ERROR: Not all required items are filled in.\r\n"); tellsock (csfd, buffer); } } | T_DEVLIST { print_device_list (); } | T_ACLIST { print_access_list (); } | T_UPTIME { compute_uptime (); } | T_STATS { sprintf (buffer, "Statistics are not implemented yet.\r\n"); tellsock (csfd, buffer); } | T_SHOW { sprintf (buffer, "\r\nCurrent settings:\r\n"); tellsock (csfd, buffer); sprintf (buffer, "smsc = [%s]\r\n", symbols.smsc); tellsock (csfd, buffer); sprintf (buffer, "user = [%s]\r\n", symbols.user); tellsock (csfd, buffer); sprintf (buffer, "dest = [%s]\r\n", symbols.destgsm); tellsock (csfd, buffer); sprintf (buffer, "msg = [%s] - Length: %d\r\n\r\n", symbols.message, strlen (symbols.message)); tellsock (csfd, buffer); } | T_QUIT { conclude (); } ;param_command: T_HELP parameter { give_help (paramname); free (paramname); paramname = NULL; } | T_SHOW parameter { if (strcmp (paramname, "msg") == 0) { free (paramname); paramname = (char *) malloc (8 * sizeof (char)); strcpy (paramname, "message"); } if (strcmp (paramname, "smsc") == 0) { sprintf (buffer, "smsc = [%s]\r\n", symbols.smsc); tellsock (csfd, buffer); } else if (strcmp (paramname, "user") == 0) { sprintf (buffer, "user = [%s]\r\n", symbols.user); tellsock (csfd, buffer); } else if (strcmp (paramname, "dest") == 0) { sprintf (buffer, "dest = [%s]\r\n", symbols.destgsm); tellsock (csfd, buffer); } else if (strcmp (paramname, "message") == 0) { sprintf (buffer, "msg = [%s] - Length: %d\r\n", symbols.message, strlen (symbols.message)); tellsock (csfd, buffer); } else { sprintf (buffer, "ERROR: unknown item <%s>\r\n", paramname); tellsock (csfd, buffer); } free (paramname); paramname = NULL; } | T_CLEAR parameter { if (strcmp (paramname, "msg") == 0) { free (paramname); paramname = (char *) malloc (8 * sizeof (char)); strcpy (paramname, "message"); } if (strcmp (paramname, "smsc") == 0) { strcpy (symbols.smsc, DEFAULTSMSC); } else if (strcmp (paramname, "user") == 0) { symbols.user[0] = '\0'; } else if (strcmp (paramname, "dest") == 0) { symbols.destgsm[0] = '\0'; } else if (strcmp (paramname, "message") == 0) { symbols.message[0] = '\0'; } else { sprintf (buffer, "ERROR: unknown item <%s>\r\n", paramname); tellsock (csfd, buffer); } free (paramname); paramname = NULL; } ;assignment: T_SET variable '=' value { if (strcmp (idname, "msg") == 0) { free (idname); idname = (char *) malloc (8 * sizeof (char)); strcpy (idname, "message"); } if (strcmp (idname, "smsc") == 0) { /* Assign smsc */ if (strlen ($4) > MAXPHNUMLEN) { strncpy (symbols.smsc, $4, MAXPHNUMLEN); symbols.smsc[MAXPHNUMLEN] = '\0'; sprintf (buffer, "WARNING: max. smsc length is %d, value now truncated\r\n", MAXPHNUMLEN); tellsock (csfd, buffer); } else strcpy (symbols.smsc, $4); sprintf (buffer, "Ok\r\n"); tellsock (csfd, buffer); syslog ((FACILITY | LOG_NOTICE), "got new smsc <%s>.", symbols.smsc); } else if (strcmp (idname, "user") == 0) { /* Assign user */ if (strlen ($4) > MAXUIDLEN) { strncpy (symbols.user, $4, MAXUIDLEN); symbols.user[MAXUIDLEN] = '\0'; sprintf (buffer, "WARNING: max. sender ID length is %d, value now truncated\r\n", MAXUIDLEN); tellsock (csfd, buffer); } else strcpy (symbols.user, $4); sprintf (buffer, "Ok\r\n"); tellsock (csfd, buffer); syslog ((FACILITY | LOG_NOTICE), "sender ID is [%s].", symbols.user); } else if (strcmp (idname, "dest") == 0) { /* Check whether we have a T_PHNUM */ if (vtype != T_PHNUM) { sprintf (buffer, "Expected a phone number\r\n"); tellsock (csfd, buffer); } else { /* Assign dest */ if (strlen ($4) > MAXPHNUMLEN) { strncpy (symbols.destgsm, $4, MAXPHNUMLEN); symbols.destgsm[MAXPHNUMLEN] = '\0'; sprintf (buffer, "WARNING: max. dest length is %d, value now truncated\r\n", MAXPHNUMLEN); tellsock (csfd, buffer); } else { strcpy (symbols.destgsm, $4); } sprintf (buffer, "Ok\r\n"); tellsock (csfd, buffer); syslog ((FACILITY | LOG_NOTICE), "got destgsm <%s>.", symbols.destgsm); } } else if (strcmp (idname, "message") == 0) { /* Assign message */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -