⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.y

📁 手机短消息的服务器端和客户端的源代码 是应用于LINUX/UNIX开发环境的
💻 Y
📖 第 1 页 / 共 3 页
字号:
%{/*========================================================== * 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 + -