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