Enhance Pickup to do native pickupgroup pickup when no arguments are specified (close...
[asterisk/asterisk.git] / utils / smsq.c
old mode 100755 (executable)
new mode 100644 (file)
index c256ff2..f6baf0a
@@ -1,3 +1,22 @@
+/*
+ * 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.
+ */
+
 #include <stdio.h>
 #include <popt.h>
 #include <sys/types.h>
 #include <unistd.h>
 #include <time.h>
 
-// SMS queuing application for use with asterisk app_sms
-// by Adrian Kennard, 2004
+#include <asterisk/compat.h>
+#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;
@@ -65,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],
@@ -75,7 +107,7 @@ 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;
    snprintf (dirname, sizeof(dirname), "sms/%s", dir);
    d = opendir (dirname);
@@ -90,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)
@@ -100,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)
    {
@@ -118,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);
    }
@@ -129,13 +161,13 @@ 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, "\nMaxRetries: %d\n", retries);
@@ -150,27 +182,31 @@ static char txqcheck (char *dir, char *queue, char subaddress, char *channel, ch
          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;
-   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)
@@ -186,7 +222,7 @@ static void rxqcheck (char *dir, char *queue, char *process)
          FILE *f;
          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)
@@ -229,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"))
@@ -237,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;
                }
@@ -248,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)
                      {
@@ -269,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)
                      {
@@ -287,7 +323,7 @@ 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,
@@ -367,13 +403,13 @@ static void rxqcheck (char *dir, char *queue, char *process)
             }
             setenv ("ud16", temp, 1);
          }
-         // run the command
+         /* run the command */
          system (process);
       }
    closedir (d);
 }
 
-// Main app
+/* Main app */
 int
 main (int argc, const char *argv[])
 {
@@ -417,7 +453,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"},
@@ -485,7 +521,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)
@@ -564,7 +600,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)
@@ -585,7 +621,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;
@@ -642,15 +678,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;
-      snprintf (temp, sizeof(temp), "sms/.smsq-%d", 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 (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)
       {
@@ -713,7 +749,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)
@@ -725,7 +761,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);
       }