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

手机短信编程

开发平台:

Unix_Linux

  1. /*==========================================================
  2.  * Program : stuff.c                       Project : smslink
  3.  * Author  : Philippe Andersson.
  4.  * Date    : 09/11/99
  5.  * Version : 0.16b
  6.  * Notice  : (c) Les Ateliers du Heron, 1998 for Scitex Europe, S.A.
  7.  * Comment : Library of functions for the smslink servers.
  8.  *
  9.  * Modification History :
  10.  * - 0.01a (25/08/98) : Initial release.
  11.  * - 0.02a (27/08/98) : Added tellsock().
  12.  * - 0.03a (01/09/98) : Added semaphore deletion to daemons_death().
  13.  * - 0.04a (03/09/98) : Added shared memory release to daemons_death().
  14.  * - 0.05a (06/09/98) : Inserted #ifdef's to have it compile under
  15.  *   RedHat (GNU Libc 6).
  16.  * - 0.06a (19/10/98) : Added gsmdevcpy ().
  17.  * - 0.07a (20/10/98) : Included GSM communication functions.
  18.  * - 0.08b (13/12/98) : Adapted gsmdevcpy() for struct gsms_def
  19.  *   new member "owner".
  20.  * - 0.09b (14/02/99) : Included code in daemon's death to
  21.  *   clean ACL linked list.
  22.  * - 0.10b (29/06/99) : Moved 3 functions from server.y to here
  23.  *   (misc. string handling functions).
  24.  * - 0.11b (03/07/99) : Added function trim(). Cosmetics.
  25.  * - 0.12b (17/08/99) : Included code in deamons_death() to
  26.  *   remove the checkpoint file before quitting.
  27.  * - 0.13b (18/08/99) : Added an exit function specific for
  28.  *   sms2mailgw.
  29.  * - 0.14b (19/08/99) : Moved the server-specific functions to
  30.  *   serv_stuff.c and the gateway-specific ones to gw-stuff.c.
  31.  * - 0.15b (21/10/99) : Moved tellsock() over from serv_stuff.c.
  32.  * - 0.16b (09/11/99) : Added nicedate() function.
  33.  *========================================================*/
  34. #include <unistd.h>
  35. #include <stdio.h>                         /* for fprintf */
  36. #include <stdlib.h>                  /* for errno & stuff */
  37. #include <errno.h>
  38. #include <string.h>
  39. #include <syslog.h>
  40. #include <sys/time.h>           /* for the struct timeval */
  41. #include <sys/types.h>
  42. #include <sys/ipc.h>
  43. #include <sys/sem.h>                        /* semaphores */
  44. #include <sys/shm.h>                     /* shared memory */
  45. #include <sys/ioctl.h>            /* for the ioctl() call */
  46. #include <dial/modems.h>           /* requires 'libmodem' */
  47. #include "sms_serv.h"
  48. /*========================================================*/
  49. /* For debugging purposes only - comment out for normal compile */
  50. /* #define INCL_DEBUG_CODE */
  51. /*========================================================*/
  52. /*################### misc. string handling ##############*/
  53. /*========================================================*/
  54. int shiftleft (s, i)
  55. char *s;
  56. int i;
  57. {
  58.   int l;
  59.   int j, k;
  60.   
  61.   l = strlen (s);
  62.   if (i >= l) {
  63.     s[0] = '';
  64.     return (0);
  65.   }
  66.   
  67.   for (j = 0, k = i; k < l; k++, j++) {
  68.     s[j] = s[k];
  69.   }
  70.   
  71.   s[j] = '';
  72.   
  73.   /* exit */
  74.   return (strlen (s));
  75. }                                         /* shiftleft () */
  76. /*========================================================*/
  77. int dequote (s)
  78. char *s;
  79. {
  80.   int l;
  81.   
  82.   /* check for front quote and remove it */
  83.   if (s[0] == '"') {
  84.     l = shiftleft (s, 1);
  85.   }
  86.   else {
  87.     l = strlen (s);
  88.   }
  89.   /* check for back quote and remove it (l = new strlen) */
  90.   if (s[l - 1] == '"')
  91.     s[l - 1] = '';
  92.     
  93.   /* exit */
  94.   return (strlen (s));
  95. }                                           /* dequote () */
  96. /*========================================================*/
  97. int trim (char *string)
  98. {
  99.   char *p;
  100.   int WS = TRUE;
  101.   p = string;
  102.   while (*p) {
  103.     switch (*p) {
  104.       case 'n' : {
  105.         if (WS)
  106.   shiftleft (p, 1);
  107. else {
  108.   *p = ' ';
  109.   WS = TRUE;
  110.   p++;
  111. }
  112. break;
  113.       }
  114.       case 'r' : {
  115.         if (WS)
  116.   shiftleft (p, 1);
  117. else {
  118.   *p = ' ';
  119.   WS = TRUE;
  120.   p++;
  121. }
  122. break;
  123.       }
  124.       case ' ' : {
  125.         if (WS)
  126.   shiftleft (p, 1);
  127.   else {
  128.   WS = TRUE;
  129.   p++;
  130. }
  131. break;
  132.       }
  133.       
  134.       default : {
  135.         WS = FALSE;
  136. p++;
  137. break;
  138.       }
  139.     }                                      /* switch (*p) */
  140.   }                                         /* while (*p) */
  141.   return (strlen (string));
  142. }                                              /* trim () */
  143. /*========================================================*/
  144. int deslashdot (char *s)
  145. /* Cleans phone numbers */
  146. {
  147.   char *ptr;
  148.   
  149.   ptr = s;
  150.   while (*ptr) {
  151.     if ((!isdigit (ptr[0])) && (ptr[0] != '+')) {
  152.       shiftleft (ptr, 1);
  153.     }
  154.     else {
  155.       ptr++;
  156.     }
  157.   }                                       /* while (*ptr) */
  158.   return (strlen (s));
  159. }                                        /* deslashdot () */
  160. /*========================================================*/
  161. char *nicedate (char *s)
  162. /* takes a date in YYYYMMDD format and returns a string
  163.    formatted as Mmm D, YYYY                               */
  164. {
  165.   char *out;
  166.   char *ptr;
  167.   char y[5];
  168.   char m[3];
  169.   char d[3];
  170.   char mn[4];
  171.   int i;
  172.   char monthlist[37] = "JanFebMarAprMayJunJulAugSepOctNovDec";
  173.   /*---------------------------------------Initialization */
  174.   out = (char *) malloc (20 * sizeof (char));
  175.   if (! out) {
  176.     syslog ((FACILITY | LOG_ERR), "can't malloc().");
  177.     syserr ("sms: can't malloc()");
  178.   }
  179.   out[0] = '';
  180.   y[0] = '';
  181.   m[0] = '';
  182.   d[0] = '';
  183.   mn[0] = '';
  184.   /*-------------------------------------------Parse date */
  185.   strncpy (y, s, 4);
  186.   y[4] = '';
  187.   ptr = s + 4;
  188.   strncpy (m, ptr, 2);
  189.   m[2] = '';
  190.   ptr += 2;
  191.   strncpy (d, ptr, 2);
  192.   d[2] = '';
  193.   
  194.   /*--------------------------------------Generate string */
  195.   i = atoi (m) - 1;
  196.   ptr = monthlist + (3 * i);
  197.   strncpy (mn, ptr, 3); 
  198.   mn[3] = '';
  199.   sprintf (out, "%s %d, %s", mn, atoi (d), y);
  200.   /*-------------------------------------------Conclusion */
  201.   return (out);
  202. }                                          /* nicedate () */
  203. /*========================================================*/
  204. /*========================================================*/
  205. /*################# Socket communication #################*/
  206. /*========================================================*/
  207. void tellsock (int sock, char *string)
  208. {
  209.   int length;
  210.   
  211.   length = strlen (string);
  212.   if (write (sock, string, length) != length)
  213.     syserr ("sms_serv: error while writing to socket");
  214. }                                          /* tellsock () */
  215. /*========================================================*/
  216. /*========================================================*/
  217. /*#################### Error Handling ####################*/
  218. /*========================================================*/
  219. void syserr (char *msg)
  220. {
  221.   extern int errno, sys_nerr;
  222. #ifdef LINUX_LC6
  223.   extern const char *const sys_errlist[];
  224. #else
  225.   extern char * sys_errlist[];
  226. #endif                                /* #ifdef LINUX_LC6 */
  227.   fprintf (stderr, "ERROR %s", msg);
  228.   if (errno > 0 && errno < sys_nerr)
  229.     fprintf (stderr, " (%d ; %s)n", errno, sys_errlist[errno]);
  230.   else
  231.     fprintf (stderr, "n");
  232.   exit (1);
  233. }                                            /* syserr () */
  234. /*========================================================*/
  235. void fatal (char *msg)
  236. {
  237.   fprintf (stderr, "FATAL ERROR %sn", msg);
  238.   exit (2);
  239. }                                             /* fatal () */
  240. /*==========================================================
  241.  * EOF : stuff.c
  242.  *===================*/