/* ****************************************************************************
*
* iListFix - 
*
* NOTE
* This function destroys its input string 's'.
*/
static int iListFix(int* iV, char* s, int* error)
{
  char* tmP   = s;
  char* endP  = &s[strlen(s)];
  int   ix    = 0;

  PA_M(("incoming list: '%s'", s));
  baWsStrip(s);

  while ((uint64_t) tmP < (uint64_t) endP)
  {
    tmP = strchr(s, ' ');
    if (tmP == NULL)
    {
      tmP = strchr(s, '\t');
    }

    if (tmP >= endP)
    {
      break;
    }

    if (tmP == NULL) /* last argument */
    {
      /* Check 's' for valid integer - reflect in *error parameter */
      iV[ix + 1] = baStoi(s);
      PA_M(("item %d in int-list: %d", ix + 1, iV[ix + 1]));
      ++ix;
      iV[0] = ix;
      break;
    }

    *tmP = 0;

    /* Check 's' for valid integer - reflect in *error parameter */
    iV[ix + 1] = baStoi(s);
    s = &tmP[1];

    LM_T(LmtPaIList, ("item %d in int-list: %d", ix + 1, iV[ix + 1]));
    LM_T(LmtPaIList, ("rest: '%s'", s));
    ++ix;

    baWsStrip(s);
  }

  LM_T(LmtPaIList, ("got %d items in int-list", ix));

  *error = PaOk;

  return ix;
}
/* ****************************************************************************
*
* sListFix - 
*/
static int sListFix(char** sV, char* s, int* error)
{
  char*    tmP   = s;
  char*    endP  = &s[strlen(s)];
  int64_t  ix    = 0;

  LM_T(LmtPaSList, ("incoming list: '%s'", s));
  LM_T(LmtPaSList, ("list vector at %p", sV));
  baWsStrip(s);

  while ((int64_t) tmP < (int64_t) endP)
  {
    // 1. eat beginning whitespace
    while ((*tmP == ' ') || (*tmP == '\t'))
    {
      ++tmP;
    }

    if (*tmP == 0)
    {
      break;
    }

    s = tmP;


    // 2. Now we're at the start of the string - find WS after it and NULL it (if needed)
    tmP = strchr(s, ' ');
    if (tmP)
    {
      *tmP = 0;
      ++tmP;
    }


    // 3. We have an option - record it!
    ++ix;
    sV[ix] = s;
    LM_T(LmtPaSList, ("Found item %d in string-list: '%s'", ix + 1, s));
    LM_T(LmtPaSList, ("rest: '%s'", s));

    // 4. Point 's' to end-of the recently found option (if needed)
    if (tmP)
    {
      s = tmP;
    }
    else
    {
      LM_T(LmtPaSList, ("A total of %d items in string-list", ix));
      sV[0] = (char*) ix;
      break;
    }
  }

  LM_T(LmtPaSList, ("got %d items in string-list", ix));

  *error = PaOk;
  return ix;
}
Example #3
0
/* ****************************************************************************
*
* paRcFileParse - parse startup file
*/
int paRcFileParse(void)
{
  char   dir[1024];
  char   path[1024];
  char   line[512];
  int    lineNo = 0;
  FILE*  fP;
  char   w[512];

  LM_ENTRY();

  if ((paRcFileName == NULL) || (paRcFileName[0] == 0))
  {
    LM_EXIT();
    return 0;
  }

  if (dirFind(dir, sizeof(dir)) == 0)
  {
    LM_T(LmtPaRcFile, ("RC file '%s' found in directory '%s'", paRcFileName, dir));
  }
  else
  {
    return 0;
  }

  snprintf(path, sizeof(path), "%s/%s", dir, paRcFileName);
  if ((fP = fopen(path, "r")) == NULL)
  {
    LM_RE(-1, ("error opening RC file '%s': %s", path, strerror(errno)));
  }

  LM_T(LmtPaRcFile, ("parsing RC file %s", path));

  while (fgets(line, sizeof(line), fP) != NULL)
  {
    char*         delim;
    char*         var;
    char*         val;
    PaiArgument*  aP;
    bool          varFound;
    char          envVarName[128];

    ++lineNo;
    LM_T(LmtPaRcFile, ("got line %d", lineNo));
    newlineStrip(line);
    LM_T(LmtPaRcFile, ("got line %d", lineNo));
    commentStrip(line, '#');
    LM_T(LmtPaRcFile, ("got line %d", lineNo));
    baWsStrip(line);
    LM_T(LmtPaRcFile, ("got line %d", lineNo));
    if (line[0] == 0)
    {
      continue;
    }

    LM_T(LmtPaRcFile, ("got line %d", lineNo));
    delim = strchr(line, '=');
    if (delim == NULL)
    {
      char w[512];

      snprintf(w, sizeof(w), "%s[%d]: no delimiter found", path, lineNo);
      PA_WARNING(PasParseError, w);
      continue;
    }

    *delim = 0;
    var    = line;
    val    = &delim[1];
    baWsStrip(var);
    baWsStrip(val);

    if (var[0] == 0)
    {
      fclose(fP);
      LM_RE(-1, ("%s[%d]: no variable ...", path, lineNo));
    }

    if (val[0] == 0)
    {
      fclose(fP);
      LM_RE(-1, ("%s[%d]: no value for variable %s", path, lineNo, var));
    }

    varFound = false;

    paIterateInit();
    while ((aP = paIterateNext(paiList)) != NULL)
    {
      paEnvName(aP, envVarName, sizeof(envVarName));

      if (strcmp(var, envVarName) == 0)
      {
        aP->from = PafRcFile;
        LM_T(LmtPaRcFileVal, ("got value '%s' for %s", val, envVarName));
        varFound = true;
        break;
      }
    }

    if (varFound == false)
    {
      char w[512];

      snprintf(w, sizeof(w), "%s[%d]: variable '%s' not recognized", path, lineNo, var);
      PA_WARNING(PasNoSuchVariable, w);
      continue;
    }

    switch (aP->type)
    {
    case PaString:
      strcpy((char*) aP->varP, val);
      break;

    case PaBoolean:
      if ((strcmp(val, "TRUE") == 0)
      ||  (strcmp(val, "ON")   == 0)
      ||  (strcmp(val, "yes")   == 0)
      ||  (strcmp(val, "1")    == 0))
        *((bool*) (int64_t) aP->varP) = true;
      else if ((strcmp(val, "FALSE") == 0)
      ||       (strcmp(val, "OFF")   == 0)
      ||       (strcmp(val, "no")   == 0)
      ||       (strcmp(val, "0")     == 0))
        *((bool*) (int64_t) aP->varP) = false;
      else
      {
        snprintf(w, sizeof(w), "bad value '%s' for boolean variable %s", val, envVarName);
        PA_WARNING(PasNoSuchBooleanValue, w);
      }
      break;

    case PaSList:
    case PaIList:
      LM_TODO(("lists ..."));
      break;

    case PaInt:
    case PaIntU:
      *((int64_t*) aP->varP) = baStoi(val);
      break;

    case PaShort:
    case PaShortU:
      *((int16_t*) (int64_t) aP->varP) = baStoi(val);
      break;

    case PaFloat:
      *((float*) (int64_t) aP->varP) = baStof(val);
      break;

    case PaDouble:
      *((double*) (int64_t) aP->varP) = baStod(val);
      break;

    case PaChar:
    case PaCharU:
      *((char*) (int64_t) aP->varP) = baStoi(val);
      break;

    default:
      snprintf(w, sizeof(w), "bad type %d for variable %s", aP->type, envVarName);
      PA_WARNING(PasNoSuchType, w);
    }
  }

  fclose(fP);
  return 0;
}