home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 2 / goldfish_vol2_cd1.bin / files / comm / misc / cyberpager / source / spooler / main.c < prev    next >
C/C++ Source or Header  |  1994-02-07  |  5KB  |  263 lines

  1. #include "spooler.h"
  2. #include "/include/memory.h"
  3.  
  4. /* our memory pool header */
  5. #define POOLSIZE 4096
  6. APTR pool;
  7.  
  8. /* storage for library bases */
  9. struct Library *UtilityBase;
  10. struct Library *PagerSupportBase;
  11.  
  12. /* our pager-support.library handle */
  13. APTR ph;
  14.  
  15. #define ARG_TEMPLATE "TO/M/A,URGENT/S,LOGLEVEL/N/K,MESSAGE/F"
  16.   enum ReadArgsArray {
  17.       ARG_DEST,
  18.       ARG_URGENT,
  19.       ARG_LOGLEVEL,
  20.       ARG_PAGE,
  21.       ARG_sizeof
  22.   };
  23.  
  24. static UBYTE dialCommand[1024];
  25.  
  26. static void DoUrgent(LONG *logLevel)
  27. {
  28.     STRPTR urgentModem;
  29.  
  30.     urgentModem = FindPagerConfigDefault(ph, "URGENTMODEM", "0");
  31.  
  32.     sprintf(dialCommand, "Run DialIXO modem %s", urgentModem);
  33.  
  34.     if (logLevel)
  35.         sprintf(&dialCommand[strlen(dialCommand)], " loglevel %ld", *logLevel);
  36.  
  37.     ULog(ph, 0, dialCommand);
  38.  
  39.     SystemTags(dialCommand, SYS_UserShell, TRUE, TAG_DONE);
  40. }
  41.  
  42. static STRPTR GetPageText(STRPTR pageText)
  43. {
  44.     STRPTR messagePtr, newPtr;
  45.     ULONG messageLen, inputLen;
  46.  
  47.     if (pageText) {
  48.         messageLen = strlen(pageText);
  49.  
  50.         /* remove white space at end of message */
  51.         while (messageLen && isspace(pageText[messageLen - 1]))
  52.             pageText[--messageLen] = '\0';
  53.  
  54.         if (messagePtr = MyAllocVec(messageLen + 1)) {
  55.             CopyMem(pageText, messagePtr, messageLen);
  56.             messagePtr[messageLen] = '\0';
  57.             return messagePtr;
  58.         }
  59.         else
  60.             return NULL;
  61.     }
  62.     else {
  63.         messageLen = 0;
  64.  
  65.         if (messagePtr = MyAllocVec(1)) {
  66.             messagePtr[0] = '\0';
  67.  
  68.             while (FGets(Input(), inputBuffer, sizeof(inputBuffer) - 1)) {
  69.                 inputLen = strlen(inputBuffer);
  70.  
  71.                 if (!(newPtr = MyAllocVec(messageLen + inputLen + 1))) {
  72.                     MyFreeVec(messagePtr);
  73.                     return NULL;
  74.                 }
  75.  
  76.                 CopyMem(messagePtr, newPtr, messageLen);
  77.                 MyFreeVec(messagePtr);
  78.  
  79.                 messagePtr = newPtr;
  80.  
  81.                 CopyMem(inputBuffer, &messagePtr[messageLen], inputLen);
  82.  
  83.                 messageLen += inputLen;
  84.  
  85.                 messagePtr[messageLen] = '\0';
  86.             }
  87.  
  88.             /* remove white space at end of message */
  89.             while (messageLen && isspace(messagePtr[messageLen - 1]))
  90.                 messagePtr[--messageLen] = '\0';
  91.         }
  92.  
  93.         return messagePtr;
  94.     }
  95. }
  96.  
  97. int DoDest(STRPTR to, STRPTR pageText)
  98. {
  99.     PagerAlias_t *als, nonAls;
  100.     int result = 0;
  101.     STRPTR ptr;
  102.     UBYTE c;
  103.  
  104.     ptr = to;
  105.  
  106.     /* check to see if this is a non-alias specification */
  107.  
  108.     while (c = *ptr++) {
  109.         if (c == ':') {
  110.             if (nonAls.als_Service = MyAllocVec(strlen(to) + 1)) {
  111.                 strcpy(nonAls.als_Service, to);
  112.  
  113.                 nonAls.als_Service[ptr - to - 1] = '\0';
  114.  
  115.                 nonAls.als_Name = to;
  116.                 nonAls.als_PIN = &nonAls.als_Service[ptr - to];
  117.                 nonAls.als_MaxMessageLen = 0;
  118.                 nonAls.als_MaxPageLen = 0;
  119.  
  120.                 SetLogWho(ph, to);
  121.  
  122.                 result = DoPage(&nonAls, pageText);
  123.  
  124.                 SetLogWho(ph, NULL);
  125.  
  126.                 return result;
  127.             }
  128.             else {
  129.                 ErrorMsg("out of memory!");
  130.                 return 5;
  131.             }
  132.         }
  133.     }
  134.  
  135.     /* it's not a non-alias so try and read it as an alias */
  136.  
  137.     if (!(als = FindPagerAlias(ph, to))) {
  138.         ErrorMsg("couldn't find \"%s\" alias.", to);
  139.         ULog(ph, -1, "couldn't find \"%s\" alias.", to);
  140.         result = 5;
  141.     }
  142.  
  143.     if (!result) {
  144.         SetLogWho(ph, als->als_Name);
  145.  
  146.         result = DoPage(als, pageText);
  147.  
  148.         SetLogWho(ph, NULL);
  149.  
  150.         FreePagerAlias(als);
  151.     }
  152.  
  153.     return result;
  154. }
  155.  
  156. static int DoArgs(void)
  157. {
  158.     struct RDArgs *RArgs;
  159.     STRPTR ArgArray[ARG_sizeof];
  160.     int result = 0;
  161.     STRPTR alwaysUrgent;
  162.     STRPTR pageText;
  163.     STRPTR *destList;
  164.  
  165.     /* do the stuff needed to call ReadArgs to parse the command line */
  166.     memset(ArgArray, 0, sizeof(ArgArray));
  167.  
  168.     if (RArgs = ReadArgs(ARG_TEMPLATE, (LONG *)&ArgArray, NULL)) {
  169.         if (ArgArray[ARG_LOGLEVEL])
  170.             SetLogLevel(ph, *((LONG *)ArgArray[ARG_LOGLEVEL]));
  171.  
  172.         destList = (STRPTR *)ArgArray[ARG_DEST];
  173.  
  174.         if (!destList) {
  175.             ErrorMsg("no destinations specified.");
  176.         }
  177.         else {
  178.             if (pageText = GetPageText(ArgArray[ARG_PAGE])) {
  179.                 if (pageText[0]) {
  180.                     while (*destList && !result)
  181.                         result = DoGroup(*destList++, pageText);
  182.                 }
  183.                 else {
  184.                     ErrorMsg("no message specified - page not spooled");
  185.                 }
  186.             }
  187.             else {
  188.                 ErrorMsg("out of memory!");
  189.                 result = 5;
  190.             }
  191.  
  192.             if (!result)
  193.                 if (ArgArray[ARG_URGENT])
  194.                     DoUrgent((LONG *)ArgArray[ARG_LOGLEVEL]);
  195.                 else if (alwaysUrgent = FindPagerConfig(ph, "ALWAYSURGENT")) {
  196.                     if (PagerConfigYesNo(alwaysUrgent))
  197.                         DoUrgent((LONG *)ArgArray[ARG_LOGLEVEL]);
  198.  
  199.                     FreePagerConfig(alwaysUrgent);
  200.                 }
  201.         }
  202.  
  203.         FreeArgs(RArgs);
  204.     }
  205.     else {
  206.         PrintFault(IoErr(), PROGNAME);
  207.         result = 5;
  208.     }
  209.  
  210.     return result;
  211. }
  212.  
  213. void __regargs main(char *cmdptr, int cmdlen, struct WBStartup *WBMsg)
  214. {
  215.     int result;
  216.  
  217.     /* punt if started from Workbench */
  218.     if (WBMsg)
  219.         XCEXIT(20);
  220.  
  221. #ifdef _DEBUG
  222. #define SUPPORT_LIB "pager:libs/pager-support-debug.library"
  223. #else
  224. #define SUPPORT_LIB "pager:libs/pager-support.library"
  225. #endif
  226.  
  227.     if (UtilityBase = OpenLibrary("utility.library", 37)) {
  228.         if (PagerSupportBase = OpenLibrary(SUPPORT_LIB, 0)) {
  229.             if (pool = CreatePool(MEMF_CLEAR, POOLSIZE, POOLSIZE / 2)) {
  230.                 if (ph = AllocPagerHandle(PROGNAME)) {
  231.                     result = DoArgs();
  232.  
  233.                     FreePagerHandle(ph);
  234.                 }
  235.                 else {
  236.                     ErrorMsg("couldn't allocate support library handle.");
  237.                     result = 10;
  238.                 }
  239.  
  240.                 DeletePool(pool);
  241.             }
  242.             else {
  243.                 ErrorMsg("out of memory!");
  244.                 result = 20;
  245.             }
  246.  
  247.             CloseLibrary(PagerSupportBase);
  248.         }
  249.         else {
  250.             ErrorMsg("couldn't open %s.\n", SUPPORT_LIB);
  251.             result = 20;
  252.         }
  253.  
  254.         CloseLibrary(UtilityBase);
  255.     }
  256.     else {
  257.         ErrorMsg("couldn't open %s.\n", "utility.library");
  258.         result = 20;
  259.     }
  260.  
  261.     XCEXIT(result);
  262. }
  263.