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; }
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; }
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; }