home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 4 / FreshFish_May-June1994.bin / new / amigalibdisks / d992 / cyberpager / source / library / services.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-05  |  4.4 KB  |  173 lines

  1.  /*
  2.   * read the services file looking for a particular service.  returns a
  3.   * struct describing that service if found or NULL if not found (or an error
  4.   * occurs).  format of lines in the service file are:
  5.   * 
  6.   * ; indicates start of a comment
  7.   * 
  8.   * <service name> <phone number> <baud rate> <mage page length> <multiblock>
  9.   */
  10.  
  11. #include "memory.h"
  12.  
  13. #define TEMPLATE "NAME/A,PHONE/A,BAUD/N/A,MAXPAGELEN/N/A,MULTIBLOCK/A,PASSWORD/A"
  14.   enum templateArgs {
  15.       ARG_NAME,
  16.       ARG_PHONE,
  17.       ARG_BAUD,
  18.       ARG_LEN,
  19.       ARG_MBLK,
  20.       ARG_PASSWORD,
  21.       ARG_sizeof
  22.   };
  23.  
  24. #define INPUT_BUFFER_SIZE (1024)
  25.  
  26. PagerService_t *__saveds __asm FindPagerService(register __a0 PagerHandle_t * ph, register __a1 STRPTR serviceName)
  27. {
  28.     PrivatePagerService_t *psvc;
  29.     PagerService_t *svc;
  30.     ULONG line = 0;
  31.     STRPTR inputBuffer, ptr;
  32.     struct RDArgs *ArgsPtr, *MyArgs;
  33.     char *ArgArray[ARG_sizeof];
  34.     BOOL leave;
  35.     BPTR fh;
  36.  
  37.     ObtainSemaphore(&ph->ph_Sema);
  38.  
  39.     /* first look to see if we have already read this service in */
  40.  
  41.     for (psvc = (PrivatePagerService_t *) ph->ph_ServiceList.mlh_Head;
  42.          psvc->psvc_Node.mln_Succ;
  43.          psvc = (PrivatePagerService_t *) psvc->psvc_Node.mln_Succ)
  44.         if (stricmp(serviceName, psvc->psvc_Service.svc_Name) == 0) {
  45.             psvc->psvc_UseCount++;
  46.             ReleaseSemaphore(&ph->ph_Sema);
  47.             return &psvc->psvc_Service;
  48.         }
  49.  
  50.     /*
  51.      * oh, well.  need to read the services file to find information on
  52.      * this service
  53.      */
  54.  
  55.     svc = NULL;
  56.  
  57.     if (inputBuffer = MyAllocVec(INPUT_BUFFER_SIZE)) {
  58.         /* try and open the services file */
  59.  
  60.         if (fh = Open("pager:services", MODE_OLDFILE)) {
  61.             /* loop reading lines looking for the service desired */
  62.  
  63.             leave = FALSE;
  64.  
  65.             while (leave == FALSE && FGets(fh, inputBuffer, INPUT_BUFFER_SIZE - 1)) {
  66.                 line++;
  67.  
  68.                 /*
  69.                  * check to make sure the line isn't all
  70.                  * blank
  71.                  */
  72.  
  73.                 ptr = inputBuffer;
  74.                 while (isspace(*ptr))
  75.                     ptr++;
  76.  
  77.                 if (!*ptr)
  78.                     continue;
  79.  
  80.                 /*
  81.                  * check for comment character at beginning
  82.                  * of line
  83.                  */
  84.  
  85.                 if (*ptr == ';')
  86.                     continue;
  87.  
  88.                 /* setup to call ReadArgs() to parse the line */
  89.  
  90.                 if (MyArgs = (struct RDArgs *)AllocDosObject(DOS_RDARGS, TAG_DONE)) {
  91.                     MyArgs->RDA_Flags |= RDAF_NOPROMPT;
  92.                     MyArgs->RDA_Source.CS_Buffer = inputBuffer;
  93.                     MyArgs->RDA_Source.CS_Length = strlen(inputBuffer);
  94.                     MyArgs->RDA_Source.CS_CurChr = 0L;
  95.  
  96.                     memset((char *)ArgArray, 0, sizeof(ArgArray));
  97.                     if (ArgsPtr = ReadArgs(TEMPLATE, (LONG *)&ArgArray, MyArgs)) {
  98.                         if (stricmp(serviceName, ArgArray[ARG_NAME]) == 0) {
  99.  
  100.                             /*
  101.                              * we've found the
  102.                              * service so
  103.                              * allocate and fill
  104.                              * in a service
  105.                              * structure
  106.                              */
  107.                             leave = TRUE;
  108.  
  109.                             if (strlen(ArgArray[ARG_PASSWORD]) + 1 > sizeof(svc->svc_Password)) {
  110.                                 ULog(ph, -1, "Password too long in services file - line %ld: %s", line, inputBuffer);
  111.                             }
  112.                             else if (psvc = (PrivatePagerService_t *) MyAllocVec(sizeof(PrivatePagerService_t) + strlen(ArgArray[ARG_NAME]) + strlen(ArgArray[ARG_PHONE]) + 2)) {
  113.                                 psvc->psvc_Handle = ph;
  114.                                 psvc->psvc_UseCount = 1;
  115.                                 AddTail((struct List *)&ph->ph_ServiceList, (struct Node *)&psvc->psvc_Node);
  116.  
  117.                                 svc = &psvc->psvc_Service;
  118.  
  119.                                 svc->svc_Name = (STRPTR)&svc[1];
  120.                                 svc->svc_Phone = svc->svc_Name + strlen(ArgArray[ARG_NAME]) + 1;
  121.  
  122.                                 strcpy(svc->svc_Name, ArgArray[ARG_NAME]);
  123.                                 strcpy(svc->svc_Phone, ArgArray[ARG_PHONE]);
  124.                                 strcpy(svc->svc_Password, ArgArray[ARG_PASSWORD]);
  125.                                 svc->svc_BaudRate = *((LONG *)ArgArray[ARG_BAUD]);
  126.                                 svc->svc_MaxPageLen = *((LONG *)ArgArray[ARG_LEN]);
  127.                                 svc->svc_MultiBlock = PagerConfigYesNo(ArgArray[ARG_MBLK]);
  128.                             }
  129.                         }
  130.  
  131.                         FreeArgs(ArgsPtr);
  132.                     }
  133.                     else {
  134.                         Fault(IoErr(), NULL, inputBuffer, INPUT_BUFFER_SIZE - 1);
  135.                         ULog(ph, -1, "Error in services file - line %ld: %s", line, inputBuffer);
  136.                         leave = TRUE;
  137.                     }
  138.  
  139.                     FreeDosObject(DOS_RDARGS, MyArgs);
  140.                 }
  141.             }
  142.  
  143.             Close(fh);
  144.         }
  145.         else
  146.             ULog(ph, -1, "Couldn't open services file");
  147.  
  148.         MyFreeVec(inputBuffer);
  149.     }
  150.  
  151.     ReleaseSemaphore(&ph->ph_Sema);
  152.  
  153.     return svc;
  154. }
  155.  
  156. void __saveds __asm FreePagerService(register __a0 PagerService_t * svc)
  157. {
  158.     PrivatePagerService_t *psvc;
  159.  
  160.     if (svc) {
  161.         psvc = (PrivatePagerService_t *) ((size_t) svc - offsetof(PrivatePagerService_t, psvc_Service));
  162.  
  163.         ObtainSemaphore(&psvc->psvc_Handle->ph_Sema);
  164.  
  165.         if (--psvc->psvc_UseCount == 0) {
  166.             Remove((struct Node *)&psvc->psvc_Node);
  167.             MyFreeVec(svc);
  168.         }
  169.  
  170.         ReleaseSemaphore(&psvc->psvc_Handle->ph_Sema);
  171.     }
  172. }
  173.