示例#1
0
static ClassRegister *
newClassRegister(char *fname, char *ns)
{
  ClassRegister  *cr =
      (ClassRegister *) malloc(sizeof(ClassRegister) + sizeof(ClassBase));
  ClassBase      *cb = (ClassBase *) (cr + 1);
  FILE           *in;
  char            fin[1024];
  long            s,
                  total = 0;
  ClObjectHdr     hdr;
  ClVersionRecord *vrp = (ClVersionRecord *) & hdr;
  int             vRec = 0,
      first = 1;

  cr->hdl = cb;
  // cr->ft = ClassRegisterFT;
  cr->vr = NULL;
  cr->assocs = cr->topAssocs = 0;

  strcpy(fin, fname);
  strcat(fin, "/classSchemas");
  fprintf(stderr, "Opening %s\n", fname);
  in = fopen(fin, "r");

  if (in == NULL) {
    fprintf(stderr, "-*- classSchema directory %s not found\n", fname);
    return NULL;
  }

  cr->fn = strdup(fin);
  cb->ht = UtilFactory->newHashTable(61,
                                     UtilHashTable_charKey |
                                     UtilHashTable_ignoreKeyCase);
  MRWInit(&cb->mrwLock);

  while ((s = fread(&hdr, 1, sizeof(hdr), in)) == sizeof(hdr)) {
    CMPIConstClass *cc = NULL;
    char           *buf = NULL;
    char           *cn;

    if (first) {
      if (vrp->size == sizeof(ClVersionRecord) && vrp->type == HDR_Version)
        vRec = 1;
      else if (vrp->size == sizeof(ClVersionRecord) << 24
               && vrp->type == HDR_Version) {
        mlogf(M_ERROR, M_SHOW, "--- %s is in wrong endian format\n", fin);
        fclose(in);
        return NULL;
      }
    }

    if (vRec == 0 && hdr.type != HDR_Class) {
      mlogf(M_ERROR, M_SHOW, "--- %s contains non-class record(s)\n", fin);
      fclose(in);
      return NULL;
    }

    buf = (char *) malloc(hdr.size);
    if (buf == NULL) {
      mlogf(M_ERROR, M_SHOW,
            "--- %s contains record(s) that are too long\n", fin);
      fclose(in);
      return NULL;
    }

    s = hdr.size;
    *((ClObjectHdr *) buf) = hdr;

    if (fread(buf + sizeof(hdr), 1, hdr.size - sizeof(hdr), in) ==
        hdr.size - sizeof(hdr)) {
      if (vRec) {
        cr->vr = (ClVersionRecord *) buf;
        vrp = NEW(ClVersionRecord);
        memcpy(vrp, cr->vr, sizeof(ClVersionRecord));
        if (strcmp(cr->vr->id, "sfcb-rep")) {
          mlogf(M_ERROR, M_SHOW,
                "--- %s contains invalid version record - directory skipped\n",
                fin);
          fclose(in);
          free(cr);
          free(buf);
          free(vrp);
          return NULL;
        }
        vRec = 0;
      } else {
        vrp = NULL;
      }

      if (first) {
        int             v = -1;
        first = 0;
        if (ClVerifyObjImplLevel(vrp))
          continue;
        if (vrp)
          v = vrp->objImplLevel;
        mlogf(M_ERROR, M_SHOW,
              "--- %s contains unsupported object implementation format (%d) - directory skipped\n",
              fin, v);
        fclose(in);
        free(cr);
        free(buf);
        if (vrp) {
          free(vrp);
        }
        return NULL;
      }

      cc = NEW(CMPIConstClass);
      cc->hdl = buf;
      cc->ft = CMPIConstClassFT;
      cc->ft->relocate(cc);
      cn = (char *) cc->ft->getCharClassName(cc);
      if (strncmp(cn, "DMY_", 4) != 0) {

        total += s;
        cb->ht->ft->put(cb->ht, cn, cc);
        if (cc->ft->isAssociation(cc)) {
          cr->assocs++;
          if (cc->ft->getCharSuperClassName(cc) == NULL)
            cr->topAssocs++;
        }
      }
    } else {
      mlogf(M_ERROR, M_SHOW,
            "--- %s contains invalid record(s) - directory skipped\n",
            fin);
      fclose(in);
      free(cr);
      free(buf);
      return NULL;
    }
  }

  fclose(in);

  if (cr->vr) {
    mlogf(M_INFO, M_SHOW,
          "--- ClassProvider for %s (%d.%d) using %ld bytes\n", fname,
          cr->vr->version, cr->vr->level, total);
  } else
    mlogf(M_INFO, M_SHOW,
          "--- ClassProvider for %s (no-version) using %ld bytes\n", fname,
          total);

  buildClassSource(cr, ns);

  return cr;
}
示例#2
0
static ClassRegister *
newClassRegister(char *fname)
{
  ClassRegister  *cr = (ClassRegister *) calloc(1,
                                                sizeof(ClassRegister) +
                                                sizeof(ClassBase));
  ClassBase      *cb = (ClassBase *) (cr + 1);
  char            fin[1024];
  long            s,
                  total = 0;
  ClObjectHdr     hdr;
  ClVersionRecord *vrp = (ClVersionRecord *) & hdr;
  int             vRec = 0,
      first = 1;

  z_off_t         pos = 0;
  ClassRecord    *crec;

  cr->hdl = cb;
  cr->ft = ClassRegisterFT;
  cr->vr = NULL;
  cr->assocs = cr->topAssocs = 0;

  strcpy(fin, fname);
  strcat(fin, "/classSchemas");
  cr->f = gzopen(fin, "r");
  if (cr->f == NULL) {
    strcat(fin, ".gz");
    cr->f = gzopen(fin, "r");
  }

  cb->ht = UtilFactory->newHashTable(61,
                                     UtilHashTable_charKey |
                                     UtilHashTable_ignoreKeyCase);
  cb->it =
      UtilFactory->newHashTable(61,
                                UtilHashTable_charKey |
                                UtilHashTable_ignoreKeyCase);
  MRWInit(&cb->mrwLock);

  if (cr->f == NULL)
    return cr;

  cr->fn = strdup(fin);
  cr->vr = NULL;
  pos = gztell(cr->f);

  while ((s = gzread(cr->f, &hdr, sizeof(hdr))) == sizeof(hdr)) {
    CMPIConstClass *cc = NULL;
    char           *buf = NULL;
    const char     *cn,
                   *pn;

    if (first) {
      if (vrp->size == sizeof(ClVersionRecord) && vrp->type == HDR_Version)
        vRec = 1;
      else if (vrp->size == sizeof(ClVersionRecord) << 24
               && vrp->type == HDR_Version) {
        mlogf(M_ERROR, M_SHOW,
              "--- %s is in wrong endian format - directory skipped\n",
              fin);
        return NULL;
      }
    }

    if (vRec == 0 && hdr.type != HDR_Class
        && hdr.type != HDR_IncompleteClass) {
      mlogf(M_ERROR, M_SHOW,
            "--- %s contains non-class record(s) - directory skipped %d\n",
            fin, hdr.type);
      return NULL;
    }

    buf = (char *) malloc(hdr.size);
    if (buf == NULL) {
      mlogf(M_ERROR, M_SHOW,
            "--- %s contains record(s) that are too long - directory skipped\n",
            fin);
      return NULL;
    }

    s = hdr.size;
    *((ClObjectHdr *) buf) = hdr;

    if (gzread(cr->f, buf + sizeof(hdr), hdr.size - sizeof(hdr)) ==
        hdr.size - sizeof(hdr)) {
      if (vRec) {
        cr->vr = (ClVersionRecord *) buf;
        if (strcmp(cr->vr->id, "sfcb-rep")) {
          mlogf(M_ERROR, M_SHOW,
                "--- %s contains invalid version record - directory skipped\n",
                fin);
          return NULL;
        }
        pos = gztell(cr->f);
        vRec = 0;
      }

      if (first) {
        int             v = -1;
        first = 0;
        if (ClVerifyObjImplLevel(cr->vr))
          continue;
        if (cr->vr)
          v = cr->vr->objImplLevel;
        mlogf(M_ERROR, M_SHOW,
              "--- %s contains unsupported object implementation format (%d) - directory skipped\n",
              fin, v);
        return NULL;
      }

      cc = NEW(CMPIConstClass);
      cc->hdl = buf;
      cc->ft = CMPIConstClassFT;
      cc->ft->relocate(cc);
      cn = (char *) cc->ft->getCharClassName(cc);

      if (strncmp(cn, "DMY_", 4) != 0) {
        total += sizeof(ClassRecord);
        crec = (ClassRecord *) calloc(1, sizeof(ClassRecord));

        if ((pn = cc->ft->getCharSuperClassName(cc))) {
          crec->parent = strdup(pn);
        }
        crec->position = pos;
        crec->length = s;
        cr->ft->putClass(cr, strdup(cn), crec);

        if (cc->ft->isAssociation(cc)) {
          crec->flags |= CREC_isAssociation;
          cr->assocs++;
          if (pn == NULL)
            cr->topAssocs++;
        }
      }
      first = 0;
    } else {
      mlogf(M_ERROR, M_SHOW,
            "--- %s contains invalid record(s) - directory skipped\n",
            fin);
      return NULL;
    }
    pos = gztell(cr->f);
    free(buf);
    free(cc);
  }

  if (cr->vr) {
    mlogf(M_INFO, M_SHOW,
          "--- Caching ClassProviderSf for %s (%d.%d-%d) using %ld bytes\n",
          fin, cr->vr->version, cr->vr->level, cr->vr->objImplLevel,
          total);
  } else
    mlogf(M_INFO, M_SHOW,
          "--- Caching ClassProviderSf for %s (no-version) using %ld bytes\n",
          fin, total);

  buildInheritanceTable(cr);

  return cr;
}
示例#3
0
static ClassRegister *
newClassRegister(ClassSchema * cs, const char *ns)
{
  ClassRegister  *cr = malloc(sizeof(*cr) + sizeof(ClassBase));
  ClassBase      *cb = (ClassBase *) (cr + 1);
  long            s,
                  total = 0;
  ClObjectHdr    *hdr;
  ClVersionRecord *vrp = (ClVersionRecord *) cs->versionRecord;
  ClassDir       *cd = cs->classes;
  int             first = 1;

  cr->hdl = cb;
  cr->ft = ClassRegisterFT;
  cr->vr = vrp;
  cr->assocs = cr->topAssocs = 0;

  cb->ht = UtilFactory->newHashTable(61,
                                     UtilHashTable_charKey |
                                     UtilHashTable_ignoreKeyCase);
  MRWInit(&cb->mrwLock);
  cr->fn = strdup(ns);

  if (vrp && vrp->size == sizeof(ClVersionRecord) << 24
      && vrp->type == HDR_Version) {
    mlogf(M_ERROR, M_SHOW,
          "--- %s is in wrong endian format - namespace skipped\n", ns);
    return NULL;
  }

  while (cd && cd->hdr) {
    CMPIConstClass *cc = NULL;
    char           *cn;

    hdr = cd->hdr;
    if (hdr->type != HDR_Class) {
      mlogf(M_ERROR, M_SHOW,
            "--- %s contains non-class record(s) - namespace skipped\n",
            ns);
      return NULL;
    }

    s = hdr->size;

    if (first) {
      int             v = -1;
      first = 0;
      if (ClVerifyObjImplLevel(cr->vr))
        continue;
      if (cr->vr)
        v = cr->vr->objImplLevel;
      mlogf(M_ERROR, M_SHOW,
            "--- %s contains unsupported object implementation format (%d) - namespace skipped\n",
            ns, v);
      return NULL;
    }

    cc = NEW(CMPIConstClass);
    cc->hdl = hdr;
    cc->ft = CMPIConstClassFT;
    cc->ft->relocate(cc);
    cn = (char *) cc->ft->getCharClassName(cc);
    if (strncmp(cn, "DMY_", 4) != 0) {
      total += s;
      cb->ht->ft->put(cb->ht, cn, cc);
      if (cc->ft->isAssociation(cc)) {
        cr->assocs++;
        if (cc->ft->getCharSuperClassName(cc) == NULL)
          cr->topAssocs++;
      }
    } else {
      mlogf(M_ERROR, M_SHOW,
            "--- %s contains invalid record(s) - namespace skipped\n", ns);
      return NULL;
    }
    first = 0;
    cd += 1;
  }

  if (cr->vr) {
    mlogf(M_INFO, M_SHOW,
          "--- ClassProvider for %s (%d.%d-%d) using %ld bytes\n", ns,
          cr->vr->version, cr->vr->level, cr->vr->objImplLevel, total);
  } else
    mlogf(M_INFO, M_SHOW,
          "--- ClassProvider for %s (no-version) using %ld bytes\n", ns,
          total);

  buildInheritanceTable(cr);

  return cr;
}