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 97968ee..0516097
@@ -1,15 +1,35 @@
-#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 <dirent.h>
-#include <string.h>
 #include <ctype.h>
-#include <stdlib.h>
-#include <unistd.h>
 #include <time.h>
-#include <asterisk/compat.h>
+
 #ifdef SOLARIS
 #define     POPT_ARGFLAG_SHOW_DEFAULT 0x00800000
 #endif
 #define     POPT_ARGFLAG_SHOW_DEFAULT 0x00800000
 #endif
 
-/* SMS queuing application for use with asterisk app_sms */
-/* by Adrian Kennard, 2004 - 2005 */
 
-/* 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;
@@ -72,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],
@@ -107,7 +132,7 @@ static char txqcheck (char *dir, char *queue, char subaddress, char *channel, ch
       ql = p - queue;
       subaddress = p[1];
    }
-   snprintf (temp, sizeof(temp), "sms/.smsq-%d", getpid ());
+   snprintf (temp, sizeof(temp), "sms/.smsq-%d", (int)getpid ());
    f = fopen (temp, "w");
    if (!f)
    {
@@ -125,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);
    }
@@ -136,7 +161,7 @@ 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);
    }
@@ -144,7 +169,7 @@ static char txqcheck (char *dir, char *queue, char subaddress, char *channel, ch
    fprintf (f, "Application: SMS\n");
    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);
@@ -168,16 +193,20 @@ static char txqcheck (char *dir, char *queue, char subaddress, char *channel, ch
    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;
-   snprintf(temp, sizeof(temp), "sms/.smsq-%d", getpid ());
+   snprintf(temp, sizeof(temp), "sms/.smsq-%d", (int)getpid ());
    snprintf(dirname, sizeof(dirname), "sms/%s", dir);
    d = opendir (dirname);
    if (!d)
@@ -247,7 +276,7 @@ static void rxqcheck (char *dir, char *queue, char *process)
                {                /* 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;
                }
@@ -296,86 +325,87 @@ static void rxqcheck (char *dir, char *queue, char *process)
          fclose (f);
          /* 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 */
-         system (process);
+         if (system (process) == -1) {
+            fprintf(stderr, "Failed to fork process '%s'\n", process);
+         }
       }
    closedir (d);
 }
@@ -571,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)
@@ -654,10 +684,10 @@ main (int argc, const char *argv[])
         queuename[100],
        *dir = (mo ? rx ? "sms/morx" : "sms/motx" : rx ? "sms/mtrx" : "sms/mttx");
       FILE *f;
-      snprintf (temp, sizeof(temp), "sms/.smsq-%d", 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), getpid ());
+      snprintf (queuename, sizeof(queuename), "%s/%s.%ld-%d", dir, *queue ? queue : "0", (long)time (0), (int)getpid ());
       f = fopen (temp, "w");
       if (!f)
       {
@@ -700,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");
       }