Single API for ast_store_lock_info and ast_remove_lock_info.
[asterisk/asterisk.git] / utils / smsq.c
old mode 100755 (executable)
new mode 100644 (file)
index 2f90b9d..0516097
@@ -1,22 +1,48 @@
-#include <stdio.h>
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2004 - 2005
+ *
+ * SMS queuing application for use with asterisk app_sms
+ * by Adrian Kennard
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*** MODULEINFO
+       <support_level>extended</support_level>
+ ***/
+
+#include "asterisk.h"
+
 #include <popt.h>
-#include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
-#include <malloc.h>
 #include <dirent.h>
-#include <string.h>
 #include <ctype.h>
-#include <stdlib.h>
-#include <unistd.h>
 #include <time.h>
 
-// SMS queuing application for use with asterisk app_sms
-// by Adrian Kennard, 2004
+#ifdef SOLARIS
+#define     POPT_ARGFLAG_SHOW_DEFAULT 0x00800000
+#endif
+#if !defined(POPT_ARGFLAG_SHOW_DEFAULT)
+#define     POPT_ARGFLAG_SHOW_DEFAULT 0x00800000
+#endif
+
 
-/* reads next USC character from null terminated UTF-8 string and advanced pointer */
-/* for non valid UTF-8 sequences, returns character as is */
-/* Does not advance pointer for null termination */
+/*!
+ * \brief reads next USC character from null terminated UTF-8 string and advanced pointer
+ * for non valid UTF-8 sequences.
+ * \return character as is Does \b NOT advance pointer for null termination
+*/
 static int utf8decode (unsigned char **pp)
 {
    unsigned char *p = *pp;
@@ -66,8 +92,13 @@ static int utf8decode (unsigned char **pp)
    return *p;                   /* not sensible */
 }
 
-// check for any queued messages in specific queue (queue="" means any queue)
-// returns 0 if nothing queued, 1 if queued and outgoing set up OK, 2 of outgoing exists
+/*!
+ * \brief check for any queued messages in specific queue (queue="" means any queue)
+ * \param dir,queue,subaddress,channel,callerid,wait,delay,retries,concurrent
+ * \retval 0 if nothing queued
+ * \retval 1 if queued and outgoing set up OK
+ * \retval 2 of outgoing exists
+*/
 static char txqcheck (char *dir, char *queue, char subaddress, char *channel, char *callerid, int wait, int delay, int retries, int concurrent)
 {
    char ogname[100],
@@ -76,9 +107,9 @@ static char txqcheck (char *dir, char *queue, char subaddress, char *channel, ch
     *p=NULL;
    FILE *f;
    DIR *d;
-   int ql = strlen (queue);
+   int ql = strlen (queue), qfl = ql;
    struct dirent *fn;
-   sprintf (dirname, "sms/%s", dir);
+   snprintf (dirname, sizeof(dirname), "sms/%s", dir);
    d = opendir (dirname);
    if (!d)
       return 0;
@@ -91,9 +122,9 @@ static char txqcheck (char *dir, char *queue, char subaddress, char *channel, ch
       return 0;
    }
    if (!ql)
-   {                            // not searching any specific queue, so use whatr we found as the queue
+   {                            /* not searching any specific queue, so use whatr we found as the queue */
       queue = fn->d_name;
-      ql = p - queue;
+      qfl = ql = p - queue;
    }
    p = strchr (queue, '-');
    if (p && p < queue + ql)
@@ -101,7 +132,7 @@ static char txqcheck (char *dir, char *queue, char subaddress, char *channel, ch
       ql = p - queue;
       subaddress = p[1];
    }
-   sprintf (temp, "sms/.smsq-%d", getpid ());
+   snprintf (temp, sizeof(temp), "sms/.smsq-%d", (int)getpid ());
    f = fopen (temp, "w");
    if (!f)
    {
@@ -119,7 +150,7 @@ static char txqcheck (char *dir, char *queue, char subaddress, char *channel, ch
          p = channel;
       p = strchr (p, 'X');
       if (p)
-         fprintf (f, "%.*s%c%s\n", p - channel, channel, subaddress, p + 1);
+         fprintf (f, "%.*s%c%s\n", (int)(p - channel), channel, subaddress, p + 1);
       else
          fprintf (f, "%s\n", channel);
    }
@@ -130,15 +161,15 @@ static char txqcheck (char *dir, char *queue, char subaddress, char *channel, ch
    {
       p = strchr (callerid, 'X');
       if (p)
-         fprintf (f, "%.*s%c%s", p - callerid, callerid, subaddress, p + 1);
+         fprintf (f, "%.*s%c%s", (int)(p - callerid), callerid, subaddress, p + 1);
       else
          fprintf (f, "%s", callerid);
    }
    fprintf (f, ">\n");
    fprintf (f, "Application: SMS\n");
-   fprintf (f, "Data: %.*s", ql, queue);
+   fprintf (f, "Data: %.*s", qfl, queue);
    if (dir[1] == 't')
-      fprintf (f, "|s");
+      fprintf (f, ",s");
    fprintf (f, "\nMaxRetries: %d\n", retries);
    fprintf (f, "RetryTime: %d\n", delay);
    fprintf (f, "WaitTime: %d\n", wait);
@@ -149,30 +180,34 @@ static char txqcheck (char *dir, char *queue, char subaddress, char *channel, ch
       while (try < concurrent)
       {
          try++;
-         sprintf (ogname, "outgoing/smsq.%s.%s.%d", dir, queue, try);
+         snprintf(ogname, sizeof(ogname), "outgoing/smsq.%s.%s.%d", dir, queue, try);
          if (!link (temp, ogname))
-         {                      // queued OK
+         {                      /* queued OK */
             unlink (temp);
             return 1;
          }
       }
    }
-   // failed to create call queue
+   /* failed to create call queue */
    unlink (temp);
    return 2;
 }
 
-// Process received queue entries and run through a process, setting environment variables
+/*!
+ * \brief Process received queue entries
+ * Run through a process, setting environment variables
+*/
 static void rxqcheck (char *dir, char *queue, char *process)
 {
-   unsigned char *p;
+   char *p;
+   void *pp = &p;
    char dirname[100],
      temp[100];
    DIR *d;
    int ql = strlen (queue);
    struct dirent *fn;
-   sprintf (temp, "sms/.smsq-%d", getpid ());
-   sprintf (dirname, "sms/%s", dir);
+   snprintf(temp, sizeof(temp), "sms/.smsq-%d", (int)getpid ());
+   snprintf(dirname, sizeof(dirname), "sms/%s", dir);
    d = opendir (dirname);
    if (!d)
       return;
@@ -180,14 +215,14 @@ static void rxqcheck (char *dir, char *queue, char *process)
       if ((*fn->d_name != '.'
            && ((!ql && (p = strchr (fn->d_name, '.'))) || (ql && !strncmp (fn->d_name, queue, ql) && fn->d_name[ql] == '.'))))
       {                         /* process file */
-         char filename[NAME_MAX + 10];
+         char filename[1010];
          char line[1000];
          unsigned short ud[160];
          unsigned char udl = 0;
          FILE *f;
-         sprintf (filename, "sms/%s/%s", dir, fn->d_name);
+         snprintf (filename, sizeof(filename), "sms/%s/%s", dir, fn->d_name);
          if (rename (filename, temp))
-            continue;           // cannot access file
+            continue;           /* cannot access file */
          f = fopen (temp, "r");
          unlink (temp);
          if (!f)
@@ -230,7 +265,7 @@ static void rxqcheck (char *dir, char *queue, char *process)
             while (isspace (*p))
                *p++ = 0;
             if (*p == '=')
-            {                   // =
+            {                   /* = */
                *p++ = 0;
                if (!strcmp (line, "oa") || !strcmp (line, "da") || !strcmp (line, "scts") || !strcmp (line, "pid")
                    || !strcmp (line, "dcs") || !strcmp (line, "mr") || !strcmp (line, "vp"))
@@ -238,10 +273,10 @@ static void rxqcheck (char *dir, char *queue, char *process)
                else if ((!strcmp (line, "srr") || !strcmp (line, "rp")) && atoi (p))
                   setenv (line, "", 1);
                else if (!strcmp (line, "ud"))
-               {                // read the user data as UTF-8
+               {                /* read the user data as UTF-8 */
                   long v;
                   udl = 0;
-                  while ((v = utf8decode (&p)) && udl < 160)
+                  while ((v = utf8decode (pp)) && udl < 160)
                      if (v && v <= 0xFFFF)
                         ud[udl++] = v;
                }
@@ -249,12 +284,12 @@ static void rxqcheck (char *dir, char *queue, char *process)
             {
                *p++ = 0;
                if (*p == '#')
-               {                // ## 
+               {                /* ##  */
                   p++;
                   if (!strcmp (line, "udh"))
                      setenv (line, p, 1);
                   else if (!strcmp (line, "ud"))
-                  {             // read user data UCS-2
+                  {             /* read user data UCS-2 */
                      udl = 0;
                      while (*p && udl < 160)
                      {
@@ -270,9 +305,9 @@ static void rxqcheck (char *dir, char *queue, char *process)
                      }
                   }
                } else
-               {                // #
+               {                /* # */
                   if (!strcmp (line, "ud"))
-                  {             // read user data UCS-1
+                  {             /* read user data UCS-1 */
                      udl = 0;
                      while (*p && udl < 160)
                      {
@@ -288,93 +323,94 @@ static void rxqcheck (char *dir, char *queue, char *process)
             }
          }
          fclose (f);
-         // set up user data variables
+         /* set up user data variables */
          {
-            char temp[481];
-            int n,
-              p;
-            for (n = 0, p = 0; p < udl; p++)
+            char tmp[481];
+            int n, x;
+            for (n = 0, x = 0; x < udl; x++)
             {
-               unsigned short v = ud[p];
+               unsigned short v = ud[x];
                if (v)
                {
                   if (v < 0x80)
-                     temp[n++] = v;
+                     tmp[n++] = v;
                   else if (v < 0x800)
                   {
-                     temp[n++] = (0xC0 + (v >> 6));
-                     temp[n++] = (0x80 + (v & 0x3F));
+                     tmp[n++] = (0xC0 + (v >> 6));
+                     tmp[n++] = (0x80 + (v & 0x3F));
                   } else
                   {
-                     temp[n++] = (0xE0 + (v >> 12));
-                     temp[n++] = (0x80 + ((v >> 6) & 0x3F));
-                     temp[n++] = (0x80 + (v & 0x3F));
+                     tmp[n++] = (0xE0 + (v >> 12));
+                     tmp[n++] = (0x80 + ((v >> 6) & 0x3F));
+                     tmp[n++] = (0x80 + (v & 0x3F));
                   }
                }
             }
-            temp[n] = 0;
-            setenv ("ud", temp, 1);
-            for (n = 0, p = 0; p < udl; p++)
+            tmp[n] = 0;
+            setenv ("ud", tmp, 1);
+            for (n = 0, x = 0; x < udl; x++)
             {
-               unsigned short v = ud[p];
+               unsigned short v = ud[x];
                if (v < ' ' || v == '\\')
                {
-                  temp[n++] = '\\';
+                  tmp[n++] = '\\';
                   if (v == '\\')
-                     temp[n++] = '\\';
+                     tmp[n++] = '\\';
                   else if (v == '\n')
-                     temp[n++] = 'n';
+                     tmp[n++] = 'n';
                   else if (v == '\r')
-                     temp[n++] = 'r';
+                     tmp[n++] = 'r';
                   else if (v == '\t')
-                     temp[n++] = 't';
+                     tmp[n++] = 't';
                   else if (v == '\f')
-                     temp[n++] = 'f';
+                     tmp[n++] = 'f';
                   else
                   {
-                     temp[n++] = '0' + (v >> 6);
-                     temp[n++] = '0' + ((v >> 3) & 7);
-                     temp[n++] = '0' + (v & 7);
+                     tmp[n++] = '0' + (v >> 6);
+                     tmp[n++] = '0' + ((v >> 3) & 7);
+                     tmp[n++] = '0' + (v & 7);
                   }
                } else if (v < 0x80)
-                  temp[n++] = v;
+                  tmp[n++] = v;
                else if (v < 0x800)
                {
-                  temp[n++] = (0xC0 + (v >> 6));
-                  temp[n++] = (0x80 + (v & 0x3F));
+                  tmp[n++] = (0xC0 + (v >> 6));
+                  tmp[n++] = (0x80 + (v & 0x3F));
                } else
                {
-                  temp[n++] = (0xE0 + (v >> 12));
-                  temp[n++] = (0x80 + ((v >> 6) & 0x3F));
-                  temp[n++] = (0x80 + (v & 0x3F));
+                  tmp[n++] = (0xE0 + (v >> 12));
+                  tmp[n++] = (0x80 + ((v >> 6) & 0x3F));
+                  tmp[n++] = (0x80 + (v & 0x3F));
                }
             }
-            temp[n] = 0;
-            setenv ("ude", temp, 1);
-            for (p = 0; p < udl && ud[p] < 0x100; p++);
-            if (p == udl)
+            tmp[n] = 0;
+            setenv ("ude", tmp, 1);
+            for (x = 0; x < udl && ud[x] < 0x100; x++);
+            if (x == udl)
             {
-               for (n = 0, p = 0; p < udl; p++)
+               for (n = 0, x = 0; x < udl; x++)
                {
-                  sprintf (temp + n, "%02X", ud[p]);
+                  sprintf (tmp + n, "%02hX", ud[x]);
                   n += 2;
                }
-               setenv ("ud8", temp, 1);
+               setenv ("ud8", tmp, 1);
             }
-            for (n = 0, p = 0; p < udl; p++)
+            for (n = 0, x = 0; x < udl; x++)
             {
-               sprintf (temp + n, "%04X", ud[p]);
+               sprintf (tmp + n, "%04hX", ud[x]);
                n += 4;
             }
-            setenv ("ud16", temp, 1);
+            setenv ("ud16", tmp, 1);
+         }
+         /* run the command */
+         if (system (process) == -1) {
+            fprintf(stderr, "Failed to fork process '%s'\n", process);
          }
-         // run the command
-         system (process);
       }
    closedir (d);
 }
 
-// Main app
+/* Main app */
 int
 main (int argc, const char *argv[])
 {
@@ -418,7 +454,7 @@ main (int argc, const char *argv[])
       *defaultsubaddress = "9",
       subaddress = 0,
       *scts = 0;
-   poptContext optCon;          // context for parsing command-line options
+   poptContext optCon;          /* context for parsing command-line options */
    const struct poptOption optionsTable[] = {
       {"queue", 'q', POPT_ARG_STRING | POPT_ARGFLAG_SHOW_DEFAULT, &queue, 0, "Queue [inc sub address]", "number[-X]"},
       {"da", 'd', POPT_ARG_STRING, &da, 0, "Destination address", "number"},
@@ -486,7 +522,7 @@ main (int argc, const char *argv[])
       fprintf (stderr, "Command line arguments always treated as UTF-8\n");
       return 1;
    }
-   //  if (!where && poptPeekArg (optCon)) where = (char *) poptGetArg (optCon);
+   /*  if (!where && poptPeekArg (optCon)) where = (char *) poptGetArg (optCon); */
    if (!mt && !mo && process)
       mt = 1;
    if (!mt && !mo && oa)
@@ -565,7 +601,7 @@ main (int argc, const char *argv[])
    {                            /* multiple command line arguments in UTF-8 */
       while (poptPeekArg (optCon) && udl < 160)
       {
-         unsigned char *a = (char *) poptGetArg (optCon);
+         unsigned char *a = (unsigned char *) poptGetArg (optCon);
          if (udl && udl < 160)
             ud[udl++] = ' ';    /* space between arguments */
          while (udl < 160 && *a)
@@ -586,7 +622,7 @@ main (int argc, const char *argv[])
       return 1;
    }
    if (udfile)
-   {                            // get message from file
+   {                            /* get message from file */
       unsigned char dat[1204],
        *p = dat,
          *e;
@@ -643,15 +679,15 @@ main (int argc, const char *argv[])
    }
 
    if (oa || da)
-   {                            // send message
+   {                            /* send message */
       char temp[100],
         queuename[100],
        *dir = (mo ? rx ? "sms/morx" : "sms/motx" : rx ? "sms/mtrx" : "sms/mttx");
       FILE *f;
-      sprintf (temp, "sms/.smsq-%d", getpid ());
-      mkdir ("sms", 0777);      // ensure directory exists
-      mkdir (dir, 0777);        // ensure directory exists
-      sprintf (queuename, "%s/%s.%ld-%d", dir, *queue ? queue : "0", (long)time (0), getpid ());
+      snprintf (temp, sizeof(temp), "sms/.smsq-%d", (int)getpid ());
+      mkdir ("sms", 0777);      /* ensure directory exists */
+      mkdir (dir, 0777);        /* ensure directory exists */
+      snprintf (queuename, sizeof(queuename), "%s/%s.%ld-%d", dir, *queue ? queue : "0", (long)time (0), (int)getpid ());
       f = fopen (temp, "w");
       if (!f)
       {
@@ -694,13 +730,13 @@ main (int argc, const char *argv[])
             {                   /* use one byte hex */
                fprintf (f, "ud#");
                for (p = 0; p < udl; p++)
-                  fprintf (f, "%02X", ud[p]);
+                  fprintf (f, "%02hX", ud[p]);
             }
          } else
          {                      /* use two byte hex */
             fprintf (f, "ud##");
             for (p = 0; p < udl; p++)
-               fprintf (f, "%04X", ud[p]);
+               fprintf (f, "%04hX", ud[p]);
          }
          fprintf (f, "\n");
       }
@@ -714,7 +750,7 @@ main (int argc, const char *argv[])
    }
 
    if (!nodial && tx && !process)
-   {                            // dial to send messages
+   {                            /* dial to send messages */
       char ret=0,
         try = 3;
       if (nowait)
@@ -726,7 +762,7 @@ main (int argc, const char *argv[])
          else
             ret = txqcheck ("mttx", queue, subaddress, mttxchannel, mttxcallerid, mttxwait, mttxdelay, mttxretries, concurrent);
          if (ret < 2)
-            break;              // sent, or queued OK
+            break;              /* sent, or queued OK */
          if (try)
             sleep (1);
       }