📄 sendsms.c
字号:
case -1: syserr ("sendsms: call to select() failed"); break; default: if (FD_ISSET (fd, &inputs)) { /* first wait for all data to be ready */ ioctl (fd, FIONREAD, &nread); while (nread != previous) { sleep (resptime); previous = nread; ioctl (fd, FIONREAD, &nread); } /* while (nread != previous) */ /* we know what's the data size - alloc space for it */ buffer = (char *) malloc ((nread + 1) * sizeof (char)); if (!buffer) syserr ("sendsms: can't allocate buffer space"); /* now we can finally read this data */ nread = read (fd, buffer, nread); switch (nread) { case 0: /* EOF */ fprintf (stderr, "got no data from GSM module.\n"); break; case -1: syserr ("sendsms: error while reading answer from GSM"); break; default: buffer[nread] = '\0';#ifdef INCL_DEBUG_CODE fprintf (stderr, "pid<%d> Got : [%s] (%d char)\n", getpid (), buffer, nread);#endif /* here we could pre-process it (remove Ctrl-Z) */ /* copy it over to out string param. */ if (nread > size) { fprintf (stderr, "too much data, truncation will occur\n"); strncpy (answer, buffer, size); answer[size] = '\0'; } else { strcpy (answer, buffer); } break; } /* switch (nread) */ } /* if (FD_ISSET... */ free (buffer); break; } /* switch (retval) */ return (nread);} /* get_gsm_answer () *//*========================================================*//*========================================================*//********** MAIN PROGRAM LOOP ********//*========================================================*/main (int argc, char *argv[]){ extern char *optarg; extern int optind, optopt; int c; /* option char returned by getopt */ int errflag = 0; /* error in command line options */ char *destgsm; char *user; char *smsc; char *message; char *msgfile; char *host_or_ip; struct in_addr server_ip; struct sockaddr_in sockaddr; int sockfd; int addrlen; char *cmdline; int retval; char *sendlog; struct passwd *pwduentry; /*--------------------------------------Initialisations */ cmdline = (char *) malloc ((BUFFSIZE + 1) * sizeof (char)); cmdline[0] = '\0'; destgsm = (char *) malloc ((MAXPHNUMLEN + 1) * sizeof (char)); destgsm[0] = '\0'; smsc = (char *) malloc ((MAXPHNUMLEN + 1) * sizeof (char)); smsc[0] = '\0'; msgfile = (char *) malloc ((PATH_MAX + 1) * sizeof (char)); msgfile[0] = '\0'; /* MAXUIDLEN + 3 to leave space for the quotes */ user = (char *) malloc ((MAXUIDLEN + 3) * sizeof (char)); user[0] = '\0'; /* MAXMSGLEN + 3 to leave space for the quotes */ message = (char *) malloc ((MAXMSGLEN + 3) * sizeof (char)); message[0] = '\0'; host_or_ip = (char *) malloc ((MINIBUFF + 1) * sizeof (char)); host_or_ip[0] = '\0'; sendlog = (char *) malloc ((BIGBUFF + 1) * sizeof (char)); sendlog[0] = '\0'; /* default values for parameters */ if ((pwduentry = getpwuid (getuid ())) == NULL) syserr ("sendsms: can't get user entry in passwd file"); if (strlen (pwduentry->pw_name) > MAXUIDLEN) { strncpy (user, pwduentry->pw_name, MAXUIDLEN); fprintf (stderr, "sendsms: WARNING: username too long (max. %d), truncated\n", MAXUIDLEN); } else { strcpy (user, pwduentry->pw_name); } quote (user); /*-------------------------Command line processing loop */ while ((c = getopt (argc, argv, ":d:s:m:f:u:")) != -1) { switch (c) { case 'd': /* destination GSM number */ if (strlen (optarg) > MAXPHNUMLEN) { fprintf (stderr, "sendsms: -d parameter too long, max. is %d\n", MAXPHNUMLEN); errflag++; } else strcpy (destgsm, optarg); break; case 's': /* SMSC number */ if (strlen (optarg) > MAXPHNUMLEN) { fprintf (stderr, "sendsms: -s parameter too long, max. is %d\n", MAXPHNUMLEN); errflag++; } else strcpy (smsc, optarg); break; case 'm': /* message to send */ if (strlen (optarg) > MAXMSGLEN) { fprintf (stderr, "sendsms: warning: message too long (max. %d char.) - truncated\n", MAXMSGLEN); strncpy (message, optarg, MAXMSGLEN); } else strcpy (message, optarg); quote (message); break; case 'f': /* file to load message from */ if (strlen (optarg) > PATH_MAX) { fprintf (stderr, "sendsms: warning: filename too long (max. %d char.)\n", PATH_MAX); errflag++; } else strcpy (msgfile, optarg); break; case 'u': /* sender ID */ if (strlen (optarg) > MAXUIDLEN) { fprintf (stderr, "sendsms: warning: username too long (max. %d char.) - truncated\n", MAXUIDLEN); strncpy (user, optarg, MAXUIDLEN); } else strcpy (user, optarg); quote (user); break; case ':': /* parameter without argument */ fprintf (stderr, "sendsms: Option -%c requires an argument.\n", optopt); errflag++; break; case '?': /* unrecognized option char */ fprintf (stderr, "sendsms: Unrecognized option: -%c.\n", optopt); errflag++; break; default: fprintf (stderr, "sendsms: getopt() returned char. code 0%o ??\n", c); } /* switch (c) */ } /* while (c...) */ /*......................................................*/ /* now transfer the last element (server name) */ if (optind < argc) { if (strlen (argv[optind]) > MINIBUFF) { fprintf (stderr, "sendsms: <server name> parameter too long, max. is %d\n", MINIBUFF); errflag++; } else strcpy (host_or_ip, argv[optind]); } /*----------------------Check for required parameter(s) */ /* -d, either -m or -f and server name or address */ if (!errflag) { if (strlen (destgsm) == 0) { fprintf (stderr, "sendsms: Required parameter -d not present.\n"); errflag++; } if ((strlen (message) == 0) && (strlen (msgfile) == 0)) { fprintf (stderr, "sendsms: You must provide either -m or -f.\n"); errflag++; } if (strlen (host_or_ip) == 0) { fprintf (stderr, "sendsms: Required parameter <server name> not present.\n"); errflag++; } } /* if (!errflag) */ /*-------------------Check for conflicting parameter(s) */ /* -m with -f */ if ((strlen (message) > 0) && (strlen (msgfile) > 0)) { fprintf (stderr, "sendsms: Conflicting parameters -m and -f.\n"); errflag++; } /*-----------------------On error, display usage & exit */ if (errflag) { fprintf (stderr, "\nsendsms ver. %s (%s), SMS Client for Unix\n", SMS_CLI_VERSION, SMS_CLI_DATE); fprintf (stderr, "(c) Les Ateliers du Heron, 1998 for Scitex Europe, S.A.\n"); fprintf (stderr, "\nUsage: sendsms -d dest [-s smsc] (-m msg | -f file) [-u user] server\n"); fprintf (stderr, "\nWhere: dest = destination GSM number\n"); fprintf (stderr, " smsc = SMSC number (opt)\n"); fprintf (stderr, " msg = message to be sent (max. %d char.)\n", MAXMSGLEN); fprintf (stderr, " file = file containing the message (- for stdin)\n"); fprintf (stderr, " user = sender ID (max. %d char. - opt)\n", MAXUIDLEN); fprintf (stderr, " server = SMS Server name or ip addr.\n"); exit (2); } /* DEBUG ...............................................*/#ifdef INCL_DEBUG_CODE fprintf (stdout, "Those are the parameters :\n"); fprintf (stdout, "dest = [%s]\n", destgsm); fprintf (stdout, "smsc = [%s]\n", smsc); fprintf (stdout, "message = [%s]\n", message); fprintf (stdout, "msgfile = [%s]\n", msgfile); fprintf (stdout, "user = [%s]\n", user); fprintf (stdout, "raw host = [%s]\n", host_or_ip);#endif /*---------------------------Start real processing loop */ /* first resolve server name */ server_ip.s_addr = resolve (host_or_ip); /* load message from file is required */ if (strlen (msgfile) > 0) { if (load_from_file (message, msgfile) == 0) syserr ("sendsms: error loading message from file or empty file"); quote (message); } /* create the socket */ if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) == -1) syserr ("sendsms: can't create socket"); /* build the server socket address parameters */ sockaddr.sin_family = AF_INET; sockaddr.sin_port = htons (DEFSMSPORT); sockaddr.sin_addr.s_addr = server_ip.s_addr; addrlen = sizeof (sockaddr); /* now connect to the server */ if (connect (sockfd, (struct sockaddr *)&sockaddr, addrlen) == -1) syserr ("sendsms: can't connect to server"); /*......................................Start of dialog */ /* slurp server announce and catch prompt */ if (!slurp_n_catch (sockfd, 1, SERVPROMPT)) syserr ("sendsms: can't get server prompt"); /* set sender ID - get ok */ sprintf (cmdline, "set user = %s\n", user); tellsock (sockfd, cmdline); if (!slurp_n_catch (sockfd, 1, "Ok")) syserr ("sendsms: failed to set sender ID (user name)"); /* set dest GSM - get ok */ sprintf (cmdline, "set dest = %s\n", destgsm); tellsock (sockfd, cmdline); if (!slurp_n_catch (sockfd, 1, "Ok")) syserr ("sendsms: failed to set destination GSM number"); /* set smsc if needs be - get ok */ if (strlen (smsc) > 0) { sprintf (cmdline, "set smsc = %s\n", smsc); tellsock (sockfd, cmdline); if (!slurp_n_catch (sockfd, 1, "Ok")) syserr ("sendsms: failed to set new SMSC number"); } /* set message - get ok */ sprintf (cmdline, "set message = %s\n", message); tellsock (sockfd, cmdline); if (!slurp_n_catch (sockfd, 1, "Ok")) syserr ("sendsms: failed to set message to be transmitted"); /* send - get feedback (message sent) */ sprintf (cmdline, "send\n"); tellsock (sockfd, cmdline); if (get_gsm_answer (sockfd, sendlog, BIGBUFF, 20)) { /* timeout needs to be as large as 20 here, because of the * huge time it takes to send and verify a PIN code (at a * min. 13 secs. */#ifdef INCL_DEBUG_CODE fprintf (stderr, "SMS send dialog:\n%s\n", sendlog);#endif if (strstr (sendlog, "message sent")) { fprintf (stderr, "message successfully sent\n"); retval = 0; /* success */ } else { fprintf (stderr, "failed to send message\n"); retval = 102; /* sending failed */ } } else { fprintf (stderr, "no answer from server\n"); retval = 101; /* no answer */ } /* close connection */ sprintf (cmdline, "bye\n"); tellsock (sockfd, cmdline); /*------------------------------------------Conclusions */ /* close socket */ if (close (sockfd) == -1) syserr ("sendsms: can't close socket"); /* free what's need to be */ free (destgsm); free (smsc); free (message); free (msgfile); free (host_or_ip); free (cmdline); free (sendlog); /*------------------------------------------End program */ exit (retval);} /* main () *//*========================================================== * EOF : sendsms.c *===================*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -