sendsms.c
上传用户:eo_sii
上传日期:2007-01-05
资源大小:91k
文件大小:22k
源码类别:

手机短信编程

开发平台:

Unix_Linux

  1. /*==========================================================
  2.  * Program : sendsms.c                     Project : smslink
  3.  * Author  : Philippe Andersson.
  4.  * Date    : 01/03/00
  5.  * Version : 0.10b
  6.  * Notice  : (c) Les Ateliers du Heron, 1998 for Scitex Europe, S.A.
  7.  * Comment : SMS client.
  8.  *
  9.  * Modification History :
  10.  * - 0.01a (28/09/98) : Initial release.
  11.  * - 0.02a (21/10/98) : Adapted client to modifications in server
  12.  *   consecutive to full GSM dialog implementation.
  13.  * ++++ Switch to Beta ++++
  14.  * - 0.03b (21/10/98) : First Beta release.
  15.  * - 0.04b (23/10/98) : Added handling of the 'user' parameter.
  16.  * - 0.05b (28/10/98) : Improved error reporting regarding
  17.  *   host name resolution failure.
  18.  * - 0.06b (03/11/98) : Added -f parameter (load message from
  19.  *   a text file).
  20.  * - 0.07b (06/02/99) : Added "-f -" option for stdin processing.
  21.  *   Added Solaris compatibility. (contrib. by Philipp Klaus).
  22.  * - 0.08b (16/02/99) : Adapted "slurping" of server announce
  23.  *   after Ph. Klaus' modifications. Also solved a problem
  24.  *   in the HP-UX port (PATH_MAX needs limits.h on HP-UX).
  25.  * - 0.09b (20/05/99) : Corrected a bug that prevented comp-
  26.  *   ilation on LINUX_LC6 platform.
  27.  * - 0.10b (01/03/00) : Replaced the "old" slurp_n_catch() by
  28.  *   a new version copied on get_gsm_answer(). This one should
  29.  *   be more robust and less sensitive to the amount of data
  30.  *   sent back by the server.
  31.  *========================================================*/
  32. #include <stdio.h>
  33. #include <stdlib.h>
  34. #include <string.h>               /* for strcpy & friends */
  35. #ifdef HPUX
  36. #  include <sys/unistd.h>                /* for getopt () */
  37. #  include <limits.h>                     /* for PATH_MAX */
  38. #else
  39. #  include <unistd.h>                    /* for getopt () */
  40. #  ifdef LINUX_LC6
  41. #    include <limits.h>
  42. #    include <linux/limits.h>
  43. #  endif
  44. #endif                                      /* ifdef HPUX */
  45. #include <netdb.h>                 /* for gethostbyname() */
  46. #include <pwd.h>                        /* for getpwuid() */
  47. #include <sys/socket.h>
  48. #include <netinet/in.h>
  49. #include <arpa/inet.h>
  50. #include <sys/types.h>
  51. #include <sys/time.h>           /* for the struct timeval */
  52. #include <sys/ioctl.h>            /* for the ioctl() call */
  53. #ifdef SOLARIS
  54. #  include <sys/filio.h>
  55. #endif
  56. /*--------------------------------------Personal includes */
  57. #include "sendsms.h"
  58. /*========================================================*/
  59. /**********             LOCAL DEFINES              ********/
  60. /*========================================================*/
  61. /* For debugging purposes only - comment out for normal compile */
  62. /* #define INCL_DEBUG_CODE */
  63. /*========================================================*/
  64. /**********           GLOBAL VARIABLES             ********/
  65. /*========================================================*/
  66. /*========================================================*/
  67. /**********               FUNCTIONS                ********/
  68. /*========================================================*/
  69. void syserr (char *msg)
  70. {
  71.   extern int errno, sys_nerr;
  72. #ifdef LINUX_LC6
  73.   extern const char *const sys_errlist[];
  74. #else
  75.   extern char * sys_errlist[];
  76. #endif                                /* #ifdef LINUX_LC6 */
  77.   fprintf (stderr, "ERROR %s", msg);
  78.   if (errno > 0 && errno < sys_nerr)
  79.     fprintf (stderr, " (%d ; %s)n", errno, sys_errlist[errno]);
  80.   else
  81.     fprintf (stderr, "n");
  82.   exit (1);
  83. }                                            /* syserr () */
  84. /*========================================================*/
  85. void tellsock (int sock, char *string)
  86. {
  87.   int length;
  88.   
  89.   length = strlen (string);
  90.   if (write (sock, string, length) != length)
  91.     syserr ("sendsms: error while writing to socket");
  92. }                                          /* tellsock () */
  93. /*========================================================*/
  94. void quote (char *string)
  95. /* we take it for granted that we malloc'ed at least 2 char more
  96. than max length */
  97. {
  98.   char *ptr;
  99.   
  100.   ptr = string + strlen (string);
  101.   /* shift all chars 1 place to the right */
  102.   while (ptr >= string) {
  103.     ptr [1] = ptr[0];
  104.     ptr--;
  105.   }
  106.   string[0] = '"';
  107.   ptr = string + strlen (string);
  108.   ptr[1] = '';
  109.   ptr[0] = '"';
  110. }                                             /* quote () */
  111. /*========================================================*/
  112. int desLF (char *string)
  113. {
  114.   char *ptr;
  115.   
  116.   if ((ptr = strchr (string, 'n')) != NULL) {
  117.     ptr[0] = ' ';
  118.   }
  119.   
  120.   return (strlen (string));
  121. }                                             /* desLF () */
  122. /*========================================================*/
  123. int is_dotted_quad (char *string)
  124. {
  125.   int is_dq;
  126.   char *s;
  127.   int ntok = 0;
  128.   char *ptok = NULL;
  129.   long int ip_byte;
  130.   char **endptr;
  131.   char *dummyp;
  132.   
  133.   /*--------------------------------------Initializations */
  134.   s = (char *) malloc ((strlen (string) + 1) * sizeof (char));
  135.   strcpy (s, string);
  136.   /*--------------------------------------------Main Loop */
  137.   /* no point going any further if the 1st char. is not a digit */
  138.   is_dq = isdigit (string[0]);
  139.   if (is_dq) {
  140.     ptok = strtok (s, ".");
  141.     while (ptok != NULL) {
  142.       ntok++;
  143. #ifdef INCL_DEBUG_CODE
  144.       printf ("got token #%d : <%s>n", ntok, ptok);
  145. #endif
  146.       dummyp = ptok + strlen (ptok);
  147.       endptr = &dummyp;
  148.       ip_byte = strtol (ptok, endptr, 10);
  149.       if (strlen (*endptr) != 0) {
  150. #ifdef INCL_DEBUG_CODE
  151. printf ("error on token #%d : can't convert <%s>n", ntok, *endptr);
  152. #endif
  153. is_dq = FALSE;
  154.       }
  155.       ptok = strtok (NULL, ".");
  156.     }
  157.     if (ntok != 4) {
  158.       is_dq = FALSE;
  159.     }
  160.   }                                         /* if (is_dq) */
  161.   /*------------------------------------------Conclusions */
  162.   free (s);
  163.   /*-------------------------------------------------Exit */
  164.   return (is_dq);
  165. }                                    /* is_dotted_quad () */
  166. /*========================================================*/
  167. unsigned long int resolve (char *host)
  168. /* return the host ip address in network format */
  169. {
  170.   struct hostent *h_ent;
  171.   struct in_addr target_ip;
  172.   char **addrs;
  173.   char *scratch;
  174.   
  175.   if (is_dotted_quad (host)) {
  176. #ifdef INCL_DEBUG_CODE
  177.     printf ("I think I got an IP addressn");
  178. #endif
  179.     if (inet_aton (host, &target_ip) == 0)
  180.       syserr ("sendsms: invalid server IP address");
  181.   }
  182.   else {
  183. #ifdef INCL_DEBUG_CODE
  184.     printf ("I think I got a host namen");
  185. #endif
  186.     if ((h_ent = gethostbyname (host)) == NULL) {
  187.       scratch = (char *) malloc ((MINIBUFF + 1) * sizeof (char));
  188.       sprintf (scratch, "sendsms: can't resolve hostname (%s)", host);
  189.       herror (scratch);
  190.       free (scratch);
  191.       exit (1);
  192.     }
  193.     /* lines below cf. "Beginning Linux Progr.", pp. 468-473 */
  194.     addrs = h_ent->h_addr_list;
  195.     target_ip = *(struct in_addr *)*addrs;
  196. #ifdef INCL_DEBUG_CODE
  197.     printf ("server IP address is: [%s]n", inet_ntoa (target_ip));
  198. #endif
  199.   }                             /* if (isdigit (host[0])) */
  200.   return (target_ip.s_addr);
  201. }                                           /* resolve () */
  202. /*========================================================*/
  203. int load_from_file (char *msg, char *file)
  204. {
  205.   FILE *infile;
  206.   char *buff;
  207.   
  208.   /*--------------------------------------Initializations */
  209.   buff = (char *) malloc ((BUFFSIZE + 1) * sizeof (char));
  210.   if (!buff)
  211.     syserr ("sendsms: can't malloc");
  212.   msg[0] = '';
  213.   
  214.   /*------------------------------------------------------*/
  215.   /* open file */
  216.   if (file[0] == '-' && file[1] == '') {
  217.     infile = stdin;
  218.   } else {
  219.     if ((infile = fopen (file, "r")) == NULL)
  220.       syserr ("sendsms: can't open input file");
  221.   }
  222.   
  223.   /* read from file */
  224.   while (fgets (buff, BUFFSIZE, infile)) {
  225.     desLF (buff);
  226.     if ((strlen (msg) + strlen (buff)) > MAXMSGLEN) {
  227.       strncat (msg, buff, (MAXMSGLEN - strlen (msg)));
  228.       fprintf (stderr, "Warning: input file too long - truncation will occurn");
  229.     }
  230.     else {
  231.       strcat (msg, buff);
  232.     }
  233.   }                                           /* while () */
  234.   
  235.   /* close file */
  236.   if (infile != stdin)
  237.     fclose (infile);
  238.   
  239.   /*------------------------------------------------------*/
  240.   return (strlen (msg));
  241. }                                    /* load_from_file () */
  242. /*========================================================*/
  243. int slurp_n_catch (int fd, int resptime, char *catch)
  244. {
  245.   int nread, retval, previous, found;
  246.   fd_set inputs;
  247.   struct timeval timeout;
  248.   char *buffer;
  249.   
  250.   /*--------------------------------------Initializations */
  251.   nread = previous = 0;
  252.   found = FALSE;
  253.   
  254.   FD_ZERO (&inputs);
  255.   FD_SET (fd, &inputs);
  256.   
  257.   timeout.tv_sec = 10;
  258.   timeout.tv_usec = 0;
  259.   
  260.   /* wait for data to arrive on the line */
  261.   retval = select (FD_SETSIZE, &inputs, NULL, NULL, &timeout);
  262.   switch (retval) {
  263.     case 0:
  264.       fprintf (stderr, "sendsms: WARNING: timeout while waiting for server reply.");
  265.       break;
  266.     
  267.     case -1:
  268.       syserr ("sendsms: call to select() failed");
  269.       break;
  270.       
  271.     default:
  272.       if (FD_ISSET (fd, &inputs)) {
  273.         /* first wait for all data to be ready */
  274. ioctl (fd, FIONREAD, &nread);
  275. while (nread != previous) {
  276.   sleep (resptime);
  277.   previous = nread;
  278.   ioctl (fd, FIONREAD, &nread);
  279. }                    /* while (nread != previous) */
  280. /* we know what's the data size - alloc space for it */
  281. buffer = (char *) malloc ((nread + 1) * sizeof (char));
  282. if (!buffer)
  283.   syserr ("sendsms: can't allocate buffer space");
  284. /* now we can finally read this data */
  285. nread = read (fd, buffer, nread);
  286. switch (nread) {
  287.   case 0:
  288.     /* EOF */
  289.     buffer[nread] = '';
  290.     fprintf (stderr, "sendsms: no data from server waiting for [%s].",
  291.              catch);
  292.     break;
  293.     
  294.   case -1:
  295.     syserr ("sendsms: error while reading answer from server");
  296.     break;
  297.     
  298.   default:
  299.     buffer[nread] = '';
  300. #ifdef INCL_DEBUG_CODE
  301.     fprintf (stderr, "pid<%d> Got : [%s] (%d char)n", getpid (), buffer,
  302.              nread);
  303. #endif
  304.     /* here we could pre-process it (remove Ctrl-Z) */
  305.     /* look for catch */
  306.             found = (strstr (buffer, catch) != NULL);
  307.     break;
  308. }                               /* switch (nread) */
  309.       }                                /* if (FD_ISSET... */
  310.       free (buffer);
  311.       break;
  312.   }                                    /* switch (retval) */
  313.   /*------------------------------------------------------*/
  314. #ifdef INCL_DEBUG_CODE
  315.   printf ("catch found: [%s]n", found ? "yes" : "no");
  316. #endif
  317.   /*----------------------------------Conclusion and exit */
  318.   return (found);
  319. }                                     /* slurp_n_catch () */
  320. /*========================================================*/
  321. int get_gsm_answer (int fd, char *answer, int size, int resptime)
  322. {
  323.   int nread, retval, previous;
  324.   fd_set inputs;
  325.   struct timeval timeout;
  326.   char *buffer;
  327.   
  328.   /*--------------------------------------Initializations */
  329.   nread = previous = 0;
  330.   
  331.   FD_ZERO (&inputs);
  332.   FD_SET (fd, &inputs);
  333.   
  334.   timeout.tv_sec = 10;
  335.   timeout.tv_usec = 0;
  336.   
  337.   /* wait for data to arrive on the line */
  338.   retval = select (FD_SETSIZE, &inputs, NULL, NULL, &timeout);
  339.   switch (retval) {
  340.     case 0:
  341.       fprintf (stderr, "timeout while waiting for GSM answer.n");
  342.       break;
  343.     
  344.     case -1:
  345.       syserr ("sendsms: call to select() failed");
  346.       break;
  347.       
  348.     default:
  349.       if (FD_ISSET (fd, &inputs)) {
  350.         /* first wait for all data to be ready */
  351. ioctl (fd, FIONREAD, &nread);
  352. while (nread != previous) {
  353.   sleep (resptime);
  354.   previous = nread;
  355.   ioctl (fd, FIONREAD, &nread);
  356. }                    /* while (nread != previous) */
  357. /* we know what's the data size - alloc space for it */
  358. buffer = (char *) malloc ((nread + 1) * sizeof (char));
  359. if (!buffer)
  360.   syserr ("sendsms: can't allocate buffer space");
  361. /* now we can finally read this data */
  362. nread = read (fd, buffer, nread);
  363. switch (nread) {
  364.   case 0:
  365.     /* EOF */
  366.     fprintf (stderr, "got no data from GSM module.n");
  367.     break;
  368.     
  369.   case -1:
  370.     syserr ("sendsms: error while reading answer from GSM");
  371.     break;
  372.     
  373.   default:
  374.     buffer[nread] = '';
  375. #ifdef INCL_DEBUG_CODE
  376.     fprintf (stderr, "pid<%d> Got : [%s] (%d char)n", getpid (), buffer, nread);
  377. #endif
  378.     /* here we could pre-process it (remove Ctrl-Z) */
  379.     /* copy it over to out string param. */
  380.     if (nread > size) {
  381.       fprintf (stderr, "too much data, truncation will occurn");
  382.       strncpy (answer, buffer, size);
  383.       answer[size] = '';
  384.     }
  385.     else {
  386.       strcpy (answer, buffer);
  387.     }
  388.     break;
  389. }                               /* switch (nread) */
  390.       }                                /* if (FD_ISSET... */
  391.       free (buffer);
  392.       break;
  393.   }                                    /* switch (retval) */
  394.   return (nread);
  395. }                                    /* get_gsm_answer () */
  396. /*========================================================*/
  397. /*========================================================*/
  398. /**********           MAIN PROGRAM LOOP            ********/
  399. /*========================================================*/
  400. main (int argc, char *argv[])
  401. {
  402.   extern char *optarg;
  403.   extern int optind, optopt;
  404.   int c;                /* option char returned by getopt */
  405.   int errflag = 0;       /* error in command line options */
  406.   char *destgsm;
  407.   char *user;
  408.   char *smsc;
  409.   char *message;
  410.   char *msgfile;
  411.   char *host_or_ip;
  412.   struct in_addr server_ip;
  413.   struct sockaddr_in sockaddr;
  414.   int sockfd;
  415.   int addrlen;
  416.   char *cmdline;
  417.   int retval;
  418.   char *sendlog;
  419.   struct passwd *pwduentry;
  420.   /*--------------------------------------Initialisations */
  421.   cmdline = (char *) malloc ((BUFFSIZE + 1) * sizeof (char));
  422.   cmdline[0] = '';
  423.   destgsm = (char *) malloc ((MAXPHNUMLEN + 1) * sizeof (char));
  424.   destgsm[0] = '';
  425.   smsc = (char *) malloc ((MAXPHNUMLEN + 1) * sizeof (char));
  426.   smsc[0] = '';
  427.   msgfile = (char *) malloc ((PATH_MAX + 1) * sizeof (char));
  428.   msgfile[0] = '';
  429.   /* MAXUIDLEN + 3 to leave space for the quotes */
  430.   user = (char *) malloc ((MAXUIDLEN + 3) * sizeof (char));
  431.   user[0] = '';
  432.   /* MAXMSGLEN + 3 to leave space for the quotes */
  433.   message = (char *) malloc ((MAXMSGLEN + 3) * sizeof (char));
  434.   message[0] = '';
  435.   host_or_ip = (char *) malloc ((MINIBUFF + 1) * sizeof (char));
  436.   host_or_ip[0] = '';
  437.   sendlog = (char *) malloc ((BIGBUFF + 1) * sizeof (char));
  438.   sendlog[0] = '';
  439.   /* default values for parameters */
  440.   if ((pwduentry = getpwuid (getuid ())) == NULL)
  441.     syserr ("sendsms: can't get user entry in passwd file");
  442.   if (strlen (pwduentry->pw_name) > MAXUIDLEN) {
  443.     strncpy (user, pwduentry->pw_name, MAXUIDLEN);
  444.     fprintf (stderr, "sendsms: WARNING: username too long (max. %d), truncatedn",
  445.              MAXUIDLEN);
  446.   }
  447.   else {
  448.     strcpy (user, pwduentry->pw_name);
  449.   }
  450.   quote (user);
  451.   /*-------------------------Command line processing loop */
  452.   while ((c = getopt (argc, argv, ":d:s:m:f:u:")) != -1) {
  453.     switch (c) {
  454.       case 'd':                 /* destination GSM number */
  455.         if (strlen (optarg) > MAXPHNUMLEN) {
  456.   fprintf (stderr, "sendsms: -d parameter too long, max. is %dn",
  457.           MAXPHNUMLEN);
  458.   errflag++;
  459. }
  460. else
  461.   strcpy (destgsm, optarg);
  462.         break;
  463.       case 's':                            /* SMSC number */
  464.         if (strlen (optarg) > MAXPHNUMLEN) {
  465.   fprintf (stderr, "sendsms: -s parameter too long, max. is %dn",
  466.           MAXPHNUMLEN);
  467.   errflag++;
  468. }
  469. else
  470.           strcpy (smsc, optarg);
  471.         break;
  472.       case 'm':                        /* message to send */
  473.         if (strlen (optarg) > MAXMSGLEN) {
  474.   fprintf (stderr, "sendsms: warning: message too long (max. %d char.) - truncatedn",
  475.           MAXMSGLEN);
  476.           strncpy (message, optarg, MAXMSGLEN);
  477. }
  478. else
  479.           strcpy (message, optarg);
  480. quote (message);
  481.         break;
  482.       case 'f':              /* file to load message from */
  483.         if (strlen (optarg) > PATH_MAX) {
  484.   fprintf (stderr, "sendsms: warning: filename too long (max. %d char.)n",
  485.           PATH_MAX);
  486.   errflag++;
  487. }
  488. else
  489.           strcpy (msgfile, optarg);
  490.         break;
  491.       case 'u':                              /* sender ID */
  492.         if (strlen (optarg) > MAXUIDLEN) {
  493.   fprintf (stderr, "sendsms: warning: username too long (max. %d char.) - truncatedn",
  494.           MAXUIDLEN);
  495.           strncpy (user, optarg, MAXUIDLEN);
  496. }
  497. else
  498.           strcpy (user, optarg);
  499. quote (user);
  500.         break;
  501.       case ':':             /* parameter without argument */
  502.         fprintf (stderr, "sendsms: Option -%c requires an argument.n",
  503.                 optopt);
  504.         errflag++;
  505.         break;
  506.       case '?':               /* unrecognized option char */
  507.         fprintf (stderr, "sendsms: Unrecognized option: -%c.n", optopt);
  508.         errflag++;
  509.         break;
  510.       default:
  511.         fprintf (stderr, "sendsms: getopt() returned char. code 0%o ??n", c);
  512.     }                                       /* switch (c) */
  513.   }                                       /* while (c...) */
  514.   /*......................................................*/
  515.   /* now transfer the last element (server name) */
  516.   if (optind < argc) {
  517.     if (strlen (argv[optind]) > MINIBUFF) {
  518.       fprintf (stderr, "sendsms: <server name> parameter too long, max. is %dn",
  519.       MINIBUFF);
  520.       errflag++;
  521.     }
  522.     else
  523.       strcpy (host_or_ip, argv[optind]);
  524.   }
  525.   /*----------------------Check for required parameter(s) */
  526.   /* -d, either -m or -f and server name or address */
  527.   if (!errflag) {
  528.     if (strlen (destgsm) == 0) {
  529.       fprintf (stderr, "sendsms: Required parameter -d not present.n");
  530.       errflag++;
  531.     }
  532.     if ((strlen (message) == 0) && (strlen (msgfile) == 0)) {
  533.       fprintf (stderr, "sendsms: You must provide either -m or -f.n");
  534.       errflag++;
  535.     }
  536.     if (strlen (host_or_ip) == 0) {
  537.       fprintf (stderr, "sendsms: Required parameter <server name> not present.n");
  538.       errflag++;
  539.     }
  540.   }                                      /* if (!errflag) */
  541.   /*-------------------Check for conflicting parameter(s) */
  542.   /* -m with -f */
  543.   if ((strlen (message) > 0) && (strlen (msgfile) > 0)) {
  544.       fprintf (stderr, "sendsms: Conflicting parameters -m and -f.n");
  545.       errflag++;
  546.   }
  547.   /*-----------------------On error, display usage & exit */
  548.   if (errflag) {
  549.     fprintf (stderr, "nsendsms ver. %s (%s), SMS Client for Unixn", 
  550.             SMS_CLI_VERSION, SMS_CLI_DATE);
  551.     fprintf (stderr, "(c) Les Ateliers du Heron, 1998 for Scitex Europe, S.A.n");
  552.     fprintf (stderr, "nUsage: sendsms -d dest [-s smsc] (-m msg | -f file) [-u user] servern");
  553.     fprintf (stderr, "nWhere: dest   = destination GSM numbern");
  554.     fprintf (stderr, "       smsc   = SMSC number (opt)n");
  555.     fprintf (stderr, "       msg    = message to be sent (max. %d char.)n", MAXMSGLEN);
  556.     fprintf (stderr, "       file   = file containing the message (- for stdin)n");
  557.     fprintf (stderr, "       user   = sender ID (max. %d char. - opt)n", MAXUIDLEN);
  558.     fprintf (stderr, "       server = SMS Server name or ip addr.n");
  559.     exit (2);
  560.   }
  561.   /* DEBUG ...............................................*/
  562. #ifdef INCL_DEBUG_CODE
  563.   fprintf (stdout, "Those are the parameters :n");
  564.   fprintf (stdout, "dest     = [%s]n", destgsm);
  565.   fprintf (stdout, "smsc     = [%s]n", smsc);
  566.   fprintf (stdout, "message  = [%s]n", message);
  567.   fprintf (stdout, "msgfile  = [%s]n", msgfile);
  568.   fprintf (stdout, "user     = [%s]n", user);
  569.   fprintf (stdout, "raw host = [%s]n", host_or_ip);
  570. #endif
  571.   /*---------------------------Start real processing loop */
  572.   /* first resolve server name */
  573.   server_ip.s_addr = resolve (host_or_ip);
  574.   
  575.   /* load message from file is required */
  576.   if (strlen (msgfile) > 0) {
  577.     if (load_from_file (message, msgfile) == 0)
  578.       syserr ("sendsms: error loading message from file or empty file");
  579.     quote (message);
  580.   }
  581.   
  582.   /* create the socket */
  583.   if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) == -1)
  584.     syserr ("sendsms: can't create socket");
  585.   
  586.   /* build the server socket address parameters */
  587.   sockaddr.sin_family = AF_INET;
  588.   sockaddr.sin_port = htons (DEFSMSPORT);
  589.   sockaddr.sin_addr.s_addr = server_ip.s_addr;
  590.   addrlen = sizeof (sockaddr);
  591.   
  592.   /* now connect to the server */
  593.   if (connect (sockfd, (struct sockaddr *)&sockaddr, addrlen) == -1)
  594.     syserr ("sendsms: can't connect to server");
  595.     
  596.   /*......................................Start of dialog */
  597.   /* slurp server announce and catch prompt */
  598.   if (!slurp_n_catch (sockfd, 1, SERVPROMPT))
  599.     syserr ("sendsms: can't get server prompt");
  600.     
  601.   /* set sender ID - get ok */
  602.   sprintf (cmdline, "set user = %sn", user);
  603.   tellsock (sockfd, cmdline);
  604.   if (!slurp_n_catch (sockfd, 1, "Ok"))
  605.     syserr ("sendsms: failed to set sender ID (user name)");
  606.     
  607.   /* set dest GSM - get ok */
  608.   sprintf (cmdline, "set dest = %sn", destgsm);
  609.   tellsock (sockfd, cmdline);
  610.   if (!slurp_n_catch (sockfd, 1, "Ok"))
  611.     syserr ("sendsms: failed to set destination GSM number");
  612.     
  613.   /* set smsc if needs be - get ok */
  614.   if (strlen (smsc) > 0) {
  615.     sprintf (cmdline, "set smsc = %sn", smsc);
  616.     tellsock (sockfd, cmdline);
  617.     if (!slurp_n_catch (sockfd, 1, "Ok"))
  618.       syserr ("sendsms: failed to set new SMSC number");
  619.   }
  620.   
  621.   /* set message - get ok */
  622.   sprintf (cmdline, "set message = %sn", message);
  623.   tellsock (sockfd, cmdline);
  624.   if (!slurp_n_catch (sockfd, 1, "Ok"))
  625.     syserr ("sendsms: failed to set message to be transmitted");
  626.     
  627.   /* send - get feedback (message sent) */
  628.   sprintf (cmdline, "sendn");
  629.   tellsock (sockfd, cmdline);
  630.   if (get_gsm_answer (sockfd, sendlog, BIGBUFF, 20)) {
  631.     /* timeout needs to be as large as 20 here, because of the
  632.      * huge time it takes to send and verify a PIN code (at a
  633.      * min. 13 secs. */
  634. #ifdef INCL_DEBUG_CODE
  635.     fprintf (stderr, "SMS send dialog:n%sn", sendlog);
  636. #endif
  637.     if (strstr (sendlog, "message sent")) {
  638.       fprintf (stderr, "message successfully sentn");
  639.       retval = 0;                              /* success */
  640.     }
  641.     else {
  642.       fprintf (stderr, "failed to send messagen");
  643.       retval = 102;                     /* sending failed */
  644.     }
  645.   }
  646.   else {
  647.     fprintf (stderr, "no answer from servern");
  648.     retval = 101;                            /* no answer */
  649.   }
  650.     
  651.   /* close connection */
  652.   sprintf (cmdline, "byen");
  653.   tellsock (sockfd, cmdline);
  654.   /*------------------------------------------Conclusions */
  655.   /* close socket */
  656.   if (close (sockfd) == -1)
  657.     syserr ("sendsms: can't close socket");
  658.   
  659.   /* free what's need to be */
  660.   free (destgsm);
  661.   free (smsc);
  662.   free (message);
  663.   free (msgfile);
  664.   free (host_or_ip);
  665.   free (cmdline);
  666.   free (sendlog);
  667.   /*------------------------------------------End program */
  668.   exit (retval);
  669. }                                              /* main () */
  670. /*==========================================================
  671.  * EOF : sendsms.c
  672.  *===================*/