dbs_sEnv * dbs_Open(pwr_tStatus *sts, dbs_sEnv *ep, const char *filename) { FILE *f; co_mFormat srcFormat, ownFormat; PDR pdrs; dbs_sSect sect; *sts = DBS__SUCCESS; memset(ep, 0, sizeof(*ep)); f = fopen(filename, "r"); if (f == NULL) { *sts = errno_GetStatus(); return NULL; } if (fread(&ep->file, sizeof(ep->file), 1, f) == 0) { *sts = errno_GetStatus(); fclose(f); return NULL; } fseek(f, ep->file.offset, SEEK_SET); if (fread(§, sizeof(sect), 1, f) == 0) { *sts = errno_GetStatus(); fclose(f); return NULL; } ep->nSect = sect.size / dbs_dAlign(sizeof(sect)); #if 0 srcFormat.m = ntohl(ep->file.format.m); #else srcFormat.m = ep->file.format.m; #endif co_GetOwnFormat(&ownFormat); if (srcFormat.m != ownFormat.m) { pdrmem_create(&pdrs, &ep->file, sizeof(ep->file), PDR_DECODE, srcFormat, ownFormat); if (!pdr_dbs_sFile(&pdrs, &ep->file)) { *sts = DBS__PDRFILE; fclose(f); return NULL; } } fseek(f, 0, SEEK_SET); ep->f = f; return ep; }
void ivol_BuildNode ( pwr_tStatus *status, ivol_sNode *lnp, const co_mFormat *formatp ) { gdb_sVolume *vp; pwr_sMountObject *MountObject; cdh_uVolumeId sys_vid; pwr_tObjid sys_oid; pwr_tObjid oid; gdb_sObject *op; gdb_sObject *vop; gdb_sObject *mop; pool_sQlink *vl; gdb_sClass *cp; pool_sQlink *cl; co_mFormat fm; pwr_tTime time; pwr_dStatus(sts, status, GDH__SUCCESS); /* Fill in remaining node information. */ gdbroot->db->nod_oid = lnp->nod_oid; gdbroot->my_node->nod_oid = gdbroot->db->nod_oid; gdbroot->my_node->vol_oid = gdbroot->db->vol_oid; /* Create the system volume and mount it in the root voulme. */ sys_vid.pwr = gdbroot->db->vid; sys_vid.v.vid_3 = cdh_eVid3_local; sys_oid.vid = sys_vid.pwr; sys_oid.oix = pwr_cNObjectIx; time_GetTime(&time); vp = gdb_LoadVolume(sts, sys_vid.pwr, "", pwr_eClass_SystemVolume, gdbroot->db->nid, time, gdb_mLoad_build, co_GetOwnFormat(&fm)); if (vp == NULL) errh_Bugcheck(*sts, ""); /* Create the volume object. */ vop = loadObject(sts, vp, vp->g.name.orig, sys_oid, pwr_eClass_SystemVolume, sizeof(pwr_sSystemVolume), pwr_cNObjid, net_mGo__, pwr_cNObjid); if (vop == NULL) errh_Bugcheck(*sts, ""); vop->u.n.flags.b.bodyDecoded = 1; /* Create the 'pwrNode' object. */ oid = vol_Oid(sts, vp, pwr_eClass_NodeHier); op = loadObject(sts, vp, "pwrNode", oid, pwr_eClass_NodeHier, sizeof(pwr_sNodeHier), sys_oid, net_mGo__, pwr_cNObjid); if (op == NULL) errh_Bugcheck(*sts, ""); op->u.n.flags.b.bodyDecoded = 1; errh_Info("Created pwrNode, oid: %s", cdh_ObjidToString(NULL, oid, 1)); /* Create a mount object in the root volume, to mount the 'pwrNode' object. */ pwr_Assert(gdbroot->my_volume != NULL); oid = vol_Oid(sts, gdbroot->my_volume, pwr_eClass_MountObject); mop = loadObject(sts, gdbroot->my_volume, "pwrNode", oid, pwr_eClass_MountObject, sizeof(pwr_sMountObject), gdbroot->db->vol_oid, net_mGo_isMountClient, op->g.oid); if (mop == NULL) errh_Bugcheck(*sts, ""); mop->u.n.flags.b.bodyDecoded = 1; MountObject = pool_Address(NULL, gdbroot->rtdb, mop->u.n.body); strcpy(MountObject->Description, "Mounts the system volume object pwr_Node."); MountObject->Object = op->g.oid; /* Build all native volumes. */ for ( vl = pool_Qsucc(sts, gdbroot->pool, &gdbroot->db->vol_lh); vl != &gdbroot->db->vol_lh; vl = pool_Qsucc(sts, gdbroot->pool, vl) ) { vp = pool_Qitem(vl, gdb_sVolume, l.vol_ll); if (vp->l.flags.b.isNative) ivol_BuildVolume(sts, vp); } /* Link class definitions. */ for ( cl = pool_Qsucc(sts, gdbroot->pool, &gdbroot->db->class_lh); cl != &gdbroot->db->class_lh; ) { cp = pool_Qitem(cl, gdb_sClass, class_ll); /* NOTA BENE !! mvol_LinkClass will change the linkage. */ cl = pool_Qsucc(sts, gdbroot->pool, cl); mvol_LinkClass(sts, cp, gdb_mAdd__); } /* Link Sub classes to attributes. */ for ( cl = pool_Qsucc(sts, gdbroot->pool, &gdbroot->db->class_lh); cl != &gdbroot->db->class_lh; ) { cp = pool_Qitem(cl, gdb_sClass, class_ll); cl = pool_Qsucc(sts, gdbroot->pool, cl); if (cp->hasSc) mvol_LinkSubClassToAttribute(sts, cp); } /* Build ScObjects for native volumes. */ for ( vl = pool_Qsucc(sts, gdbroot->pool, &gdbroot->db->vol_lh); vl != &gdbroot->db->vol_lh; vl = pool_Qsucc(sts, gdbroot->pool, vl) ) { vp = pool_Qitem(vl, gdb_sVolume, l.vol_ll); if (vp->l.flags.b.isNative) buildScObjects(sts, vp); } /* Build class attribute tree */ mvol_BuildCatt(sts); convFctn = dvms_GetFctns(formatp); if (convFctn != NULL) decodeObjects(formatp->b.bo); convFctn = NULL; mountClients(sts, gdbroot->my_volume); }
static gdb_sVolume * mountVolume ( pwr_tStatus *sts, gdb_sObject *op ) { gdb_sVolume *vp; gdb_sMountServer *msp; void *p; pwr_tObjid soid = pwr_cNObjid; gdb_sObject *vop; co_mFormat fm; pwr_tTime time; if (op->g.oid.vid != gdbroot->db->vid) errh_Bugcheck(GDH__WEIRD, "only root volumes can mount"); p = pool_Address(sts, gdbroot->rtdb, op->u.n.body); if (p == NULL) return NULL; switch (op->g.cid) { case pwr_eClass_MountObject: soid = ((pwr_sMountObject *)p)->Object; if ( cdh_ObjidIsNull(soid)) { *sts = GDH__NOMOUNTOBJECT; return NULL; } vp = vol_MountVolume(sts, soid.vid); break; case pwr_eClass_MountVolume: soid.vid = ((pwr_sMountVolume *)p)->Volume; if ( soid.vid == 0) { *sts = GDH__NOMOUNTOBJECT; return NULL; } vp = vol_MountVolume(sts, soid.vid); break; case pwr_eClass_CreateVolume: soid.vid = ((pwr_sCreateVolume *)p)->Volume; time_GetTime(&time); vp = gdb_LoadVolume(sts, soid.vid, op->g.f.name.orig, pwr_eClass_DynamicVolume, gdbroot->db->nid, time, gdb_mLoad_build, co_GetOwnFormat(&fm)); /* Create the volume object. */ vop = loadObject(sts, vp, vp->g.name.orig, soid, pwr_eClass_DynamicVolume, sizeof(pwr_sDynamicVolume), pwr_cNObjid, net_mGo__, pwr_cNObjid); if (vop == NULL) errh_Bugcheck(*sts, ""); break; } if (vp == NULL) return NULL; pwr_Assert(cdh_ObjidIsEqual(op->g.soid, soid)); if (!op->u.n.flags.b.inMountClientList) { msp = vol_AddMountClient(sts, op); if (msp == NULL) return NULL; } return vp; }