Beispiel #1
0
/* Load config from registry */
static int load_from_registry(const char * confname)
{
  option68_t * opt;
  int err = 0;
  char paths[2][64];

  snprintf(paths[0], sizeof(paths[0]), cuk_fmt, confname);
  strncpy(paths[1], lmk_str, sizeof(paths[1]));

  for (opt = option68_enum(0); opt; opt = opt->next) {
    char path[128], str[512];
    int  k, val;
    if (!opt->save)
      continue;

    for (k=0; k<2; ++k) {
      strncpy(path, paths[k], sizeof(path));
      strncat(path, opt->name, sizeof(path));

      TRACE68(config68_cat, "conf68: trying -- '%s'\n", path);
      switch (opt->type) {
      case opt68_BOL: case opt68_INT:
        err = registry68_geti(0, path, &val);
        if (!err)
          err = option68_iset(opt, val, opt68_PRIO, opt68_CFG);
        if (!err)
          TRACE68(config68_cat,
                  "conf68: load '%s' <- %d\n", path, val);
        break;
      case opt68_ENU: case opt68_STR:
        err = registry68_gets(0, path, str, sizeof(str));
        if (!err)
          err = option68_set(opt, str, opt68_PRIO, opt68_CFG);
          TRACE68(config68_cat,
                  "conf68: load '%s' <- '%s'\n", path, str);
        break;
      default:
        assert(!"invalid option type");
        err = -1;
        break;
      }
    }
  }

  return 0;
}
Beispiel #2
0
static int getopt(const char * key, int op, sc68_dialval_t * val)
{
  option68_t * opt = option68_get(key, opt68_ALWAYS);
  const int org = opt68_CFG;

  if (opt) {
    const int isset = opt->org != opt68_UDF;

    TRACE68(dial_cat,
            P "Got an option \"%s\" %sset opcode:%d\n",
            key, isset?"":"not ", op);

    switch (op) {

    case SC68_DIAL_GETI:
      if (isset && (opt->type == opt68_BOL ||
                    opt->type == opt68_INT ||
                    opt->type == opt68_ENU)) {
        val->i = opt->val.num;
        return 0;
      }
      break;

    case SC68_DIAL_GETS:
      if (isset && opt->type == opt68_STR) {
        val->s = opt->val.str;
        return 0;
      }
      break;

    case SC68_DIAL_ENUM:
      if (isset && opt->type == opt68_ENU &&
          val->i >= 0 && val->i < (int)opt->sets) {
        val->s = val->i[(const char **)opt->set];
        return 0;
      }
      break;

    case SC68_DIAL_SETI:
      return option68_iset(opt, val->i, opt68_ALWAYS, org);

    case SC68_DIAL_SETS:
      return option68_set(opt, val->s, opt68_ALWAYS, org);

    case SC68_DIAL_MIN:
      val->i = opt->min;
      return 0;

    case SC68_DIAL_MAX:
      val->i = opt->max;
      return 0;

    case SC68_DIAL_CNT:
      val->i = opt->sets;
      return 0;

    case SC68_DIAL_CAT:
      val->s = opt->cat;
      return 0;

    case SC68_DIAL_DESC:
      val->s = opt->desc;
      return 0;


    }
  }

  return -1;
}