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

手机短信编程

开发平台:

Unix_Linux

  1. /*==========================================================
  2.  * Program : gsmdevices.c                  Project : smslink
  3.  * Author  : Philippe Andersson.
  4.  * Date    : 19/10/98
  5.  * Version : 0.01a
  6.  * Notice  : Shamelessly copied from Riccardo Facchetti's modems.c
  7.  *           in libmodem-1.0.0 (c) 1997 Riccardo Facchetti under GNU GPL.
  8.  *           (c) Les Ateliers du Heron, 1998 for Scitex Europe, S.A.
  9.  * Comment : Handling routines for /etc/gsmdevices database.
  10.  *
  11.  * Modification History :
  12.  * - 0.01a (13/08/98) : Initial release.
  13.  *========================================================*/
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <string.h>
  17. #include <sys/types.h>
  18. #include <dial/modems.h>
  19. #include <dial/mdmerrno.h>
  20. #include <termios.h>
  21. #include "sms_serv.h"
  22. #define BUFSIZE 128
  23. static int gsmdeventry = 0;
  24. static FILE *gsmdevfp;
  25. /*========================================================*/
  26. static int open_gsmdevs (void)
  27. /*
  28.  * open/close_gsmdevs: open and close the /etc/gsmdevices file
  29.  */
  30. {
  31.     if ((gsmdevfp = fopen (GSMDEVFILE, "r")) == NULL)
  32.         return FAILURE;
  33.     return SUCCESS;
  34. }                                      /* open_gsmdevs () */
  35. /*========================================================*/
  36. static void close_gsmdevs (void)
  37. {
  38.     fclose (gsmdevfp);
  39. }                                     /* close_gsmdevs () */
  40. /*========================================================*/
  41. struct gsms_def *getgsmdevbynam (char *line)
  42. /*
  43.  * getgsmdevbynam: returns a pointer to the gsmdev entry named
  44.  *            (char *) line, NULL if line is not present in
  45.  *            /etc/gsmdevices.
  46.  */
  47. {
  48.     static struct gsms_def mdm;
  49.     char *buffer;
  50.     buffer = mdmalloc(BUFSIZE);
  51.     if (!buffer) {
  52. mdmerrno = -EMDMEM;
  53. return NULL;
  54.     }
  55.     mdmerrno = 0;
  56.     if (open_gsmdevs() == FAILURE) {
  57. mdmfree (buffer);
  58.         mdmerrno = -ENOMDMFILE;
  59.         return NULL;
  60.     }
  61.     while (fgets (buffer, BUFSIZE, gsmdevfp) != NULL) {
  62.         buffer[strlen (buffer) - 1] = '';
  63.         if (buffer[0] == '#' || buffer[0] == '' || buffer[0] == 'n')
  64.             continue;
  65.         if (demangle_gsmdev_entry (&mdm, buffer) == FAILURE) {
  66.             mdmerrno = -EMDMBADCONF;
  67.             continue;
  68.         }
  69.         if (!strcmp (mdm.device, line)) {
  70.             close_gsmdevs ();
  71.     mdmfree (buffer);
  72.             return (&mdm);
  73.         }
  74.     }
  75.     close_gsmdevs ();
  76.     mdmerrno = -ENOMDMLINE;
  77.     return NULL;
  78. }                                    /* getgsmdevbynam () */
  79. /*========================================================*/
  80. int getgsmdevscount (int validation)
  81. /*
  82.  * getgsmdevscount: count the number of valid (?) entries in
  83.  *            /etc/gsmdevices.
  84.  */
  85. {
  86.     static struct gsms_def mdm;
  87.     char *buffer;
  88.     int nvalidentries = 0;
  89.     buffer = mdmalloc(BUFSIZE);
  90.     if (!buffer) {
  91. mdmerrno = -EMDMEM;
  92. return (0);
  93.     }
  94.     mdmerrno = 0;
  95.     if (open_gsmdevs() == FAILURE) {
  96. mdmfree (buffer);
  97.         mdmerrno = -ENOMDMFILE;
  98.         return (0);
  99.     }
  100.     while (fgets (buffer, BUFSIZE, gsmdevfp) != NULL) {
  101.         buffer[strlen (buffer) - 1] = '';
  102.         if (buffer[0] == '#' || buffer[0] == '' || buffer[0] == 'n')
  103.             continue;
  104.         if (validation && (demangle_gsmdev_entry (&mdm, buffer) == FAILURE)) {
  105.             mdmerrno = -EMDMBADCONF;
  106.             continue;
  107.         }
  108. nvalidentries++;
  109.     }
  110.     close_gsmdevs ();
  111.     return (nvalidentries);
  112. }                                   /* getgsmdevscount () */
  113. /*========================================================*/
  114. void setgsmdevs (void)
  115. /*
  116.  * setgsmdevs: set the library for modem sequential search from the first to the
  117.  *          end. See getnextgsmdev ().
  118.  */
  119. {
  120.     gsmdeventry = 0;
  121. }                                        /* setgsmdevs () */
  122. /*========================================================*/
  123. struct gsms_def *getnextgsmdev (void)
  124. /*
  125.  * getnextgsmdev: get the next modem entry in /etc/gsmdevices
  126.  *             file returns NULL if we are over the last entry.
  127.  */
  128. {
  129.     static struct gsms_def mdm;
  130.     int i = 0;
  131.     char *buffer;
  132.     buffer = mdmalloc (BUFSIZE);
  133.     if (!buffer) {
  134. mdmerrno = -EMDMEM;
  135. return NULL;
  136.     }
  137.     mdmerrno = 0;
  138.     if (open_gsmdevs () == FAILURE) {
  139. mdmfree (buffer);
  140.         mdmerrno = -ENOMDMFILE;
  141.         return NULL;
  142.     }
  143.     while (fgets (buffer, BUFSIZE, gsmdevfp) != NULL) {
  144.         buffer[strlen (buffer) - 1] = '';
  145.         if (buffer[0] == '#' || buffer[0] == '' || buffer[0] == 'n')
  146.             continue;
  147.         if (i == gsmdeventry) {
  148.             if (demangle_gsmdev_entry (&mdm, buffer) == FAILURE) {
  149.                 mdmerrno = -EMDMBADCONF;
  150.                 continue;
  151.             }
  152.             gsmdeventry++;
  153.             close_gsmdevs ();
  154.     mdmfree (buffer);
  155.             return (&mdm);
  156.         }
  157.         i++;
  158.     }
  159.     close_gsmdevs ();
  160.     mdmfree(buffer);
  161.     return NULL;
  162. }                                     /* getnextgsmdev () */
  163. /*========================================================*/
  164. static int demangle_gsmdev_entry (struct gsms_def *mdm, char *mdmstr)
  165. /*
  166.  * demangle_gsmdev_entry: get a gsmdev pointer that point to an existing
  167.  * gsm_def structure and a string to demangle. Returns FAILURE or SUCCESS.
  168.  * The buffer pointed to by mdmstr is modified in the process.
  169.  */
  170. {
  171.     char *ptr, *pptr;
  172.     /*....................................mdm->free (int) */
  173.     /* is left uninitialized - dynamic data */
  174.     
  175.     /*...............................mdm->device (char *) */
  176.     if ((ptr = strchr (mdmstr, ':')) == NULL)
  177.         return FAILURE;
  178.     *ptr = '';
  179.     if ((strlen (mdmstr) == 0) || (strlen (mdmstr) > MAXDEVLEN))
  180.         return (FAILURE);
  181.     strcpy (mdm->device, mdmstr);
  182.     ptr++;
  183.     /*..................................mdm->PIN (char *) */
  184.     if (*ptr == ':') {
  185.         /* empty field */
  186.         mdm->PIN[0] = '';
  187.         *ptr = '';
  188.         ptr++;
  189.     }
  190.     else {
  191.         if ((pptr = strchr (ptr, ':')) == NULL)
  192.             return FAILURE;
  193.         *pptr = '';
  194.         if (strlen (ptr) > PINLEN)
  195.             return (FAILURE);
  196. strcpy (mdm->PIN, ptr);
  197.         ptr = pptr + 1;
  198.     }
  199.     /*..................................mdm->PUK (char *) */
  200.     if (*ptr == ':') {
  201.         /* empty field */
  202.         mdm->PUK[0] = '';
  203.         *ptr = '';
  204.         ptr++;
  205.     }
  206.     else {
  207.         if ((pptr = strchr (ptr, ':')) == NULL)
  208.             return FAILURE;
  209.         *pptr = '';
  210.         if (strlen (ptr) > PUKLEN)
  211.             return (FAILURE);
  212.         strcpy (mdm->PUK, ptr);
  213.         ptr = pptr + 1;
  214.     }
  215.     /*.................................mdm->addr (char *) */
  216.     if (*ptr == ':') {
  217.         /* empty field */
  218.         mdm->addr[0] = '';
  219.         *ptr = '';
  220.         ptr++;
  221.     }
  222.     else {
  223.         if ((pptr = strchr (ptr, ':')) == NULL)
  224.             return FAILURE;
  225.         *pptr = '';
  226.         if (strlen (ptr) > MAXPHNUMLEN)
  227.             return (FAILURE);
  228.         strcpy (mdm->addr, ptr);
  229.         ptr = pptr + 1;
  230.     }
  231.     /*...............................mdm->defsca (char *) */
  232.     if (*ptr == ':') {
  233.         /* empty field */
  234.         mdm->defsca[0] = '';
  235.         *ptr = '';
  236.         ptr++;
  237.     }
  238.     else {
  239.         if ((pptr = strchr (ptr, ':')) == NULL)
  240.             return FAILURE;
  241.         *pptr = '';
  242.         if (strlen (ptr) > MAXPHNUMLEN)
  243.             return (FAILURE);
  244.         strcpy (mdm->defsca, ptr);
  245.         ptr = pptr + 1;
  246.     }
  247.     /*.............................mdm->provider (char *) */
  248.     /*                                 !!! Last field !!! */
  249.     if (*ptr == 'n' || *ptr == '' || *ptr == ':') {
  250.         mdm->provider[0] = '';
  251.         return SUCCESS;
  252.     }
  253.     else
  254.         if (strlen (ptr) > MAXDEVLEN)
  255.             return (FAILURE);
  256.         strcpy (mdm->provider, ptr);
  257.     return SUCCESS;
  258. }                             /* demangle_gsmdev_entry () */
  259. /*==========================================================
  260.  * EOF : gsmdevices.c
  261.  *===================*/