int VLDB_GetEntryByID(afs_uint32 volid, afs_int32 voltype, struct nvldbentry *entryp) { struct vldbentry oentry; int code; if (newvlserver == vltype_old) { tryold: code = ubik_VL_GetEntryByID(cstruct, 0, volid, voltype, &oentry); if (!code) ovlentry_to_nvlentry(&oentry, entryp); return code; } code = ubik_VL_GetEntryByIDN(cstruct, 0, volid, voltype, entryp); if (newvlserver == vltype_unknown) { if (code == RXGEN_OPCODE) { newvlserver = vltype_old; /* Doesn't support new interface */ goto tryold; } else if (!code) { newvlserver = vltype_new; } } return code; }
afs_int32 bc_GetEntryByID(struct ubik_client *uclient, afs_int32 volID, afs_int32 volType, struct vldbentry *vldbEntryPtr) { afs_int32 code = 0; code = ubik_VL_GetEntryByID(uclient, 0, volID, volType, vldbEntryPtr); return (code); }
static int uss_vol_GetEntryByID(struct ubik_client *cstruct, afs_uint32 volid, afs_int32 voltype, struct nvldbentry *entryp) { struct vldbentry oentry; int code; code = ubik_VL_GetEntryByIDN(cstruct, 0, volid, voltype, entryp); if (code == RXGEN_OPCODE) { code = ubik_VL_GetEntryByID(cstruct, 0, volid, voltype, &oentry); if (!code) ovlentry_to_nvlentry(&oentry, entryp); } return code; }
struct afscp_volume * afscp_VolumeById(struct afscp_cell *cell, afs_uint32 id) { union allvldbentry u; struct afscp_volume *ret, key; struct afscp_server *server; afs_int32 code, vtype, type, srv; int voltype = -1; char idbuffer[16]; void *s; #ifdef AFSCP_DEBUG struct in_addr i; #endif memset(&key, 0, sizeof(key)); key.id = id; s = tfind(&key, &cell->volsbyid, icompare); if (s) { ret = *(struct afscp_volume **)s; return ret; } snprintf(idbuffer, sizeof(idbuffer), "%lu", afs_printable_uint32_lu(id)); type = 0; code = ubik_VL_GetEntryByNameU(cell->vlservers, 0, idbuffer, &u.u); if (code == RXGEN_OPCODE) { type = 1; code = ubik_VL_GetEntryByIDN(cell->vlservers, 0, id, -1, &u.n); if (code == RXGEN_OPCODE) { type = 2; code = ubik_VL_GetEntryByID(cell->vlservers, 0, id, -1, &u.o); } } if (code != 0) { afscp_errno = code; return NULL; } ret = calloc(1, sizeof(struct afscp_volume)); if (ret == NULL) { afscp_errno = ENOMEM; return NULL; } strlcpy(ret->name, u.u.name, sizeof(ret->name)); ret->nservers = 0; ret->cell = cell; switch (type) { case 0: if (id == u.u.volumeId[RWVOL]) { vtype = VLSF_RWVOL; voltype = RWVOL; } else if (id == u.u.volumeId[ROVOL]) { vtype = VLSF_ROVOL; voltype = ROVOL; } else if (id == u.u.volumeId[BACKVOL]) { vtype = VLSF_BACKVOL; voltype = BACKVOL; } else { vtype = 0; voltype = -1; } for (srv = 0; srv < u.u.nServers; srv++) { if ((u.u.serverFlags[srv] & vtype) == 0) continue; if ((u.u.serverFlags[srv] & VLSF_UUID) == 0) server = afscp_ServerByAddr(cell, u.u.serverNumber[srv].time_low); else server = afscp_ServerById(cell, &u.u.serverNumber[srv]); if (!server) continue; ret->servers[ret->nservers++] = server->index; } break; case 1: if (id == u.n.volumeId[RWVOL]) { vtype = VLSF_RWVOL; voltype = RWVOL; } else if (id == u.n.volumeId[ROVOL]) { vtype = VLSF_ROVOL; voltype = ROVOL; } else if (id == u.n.volumeId[BACKVOL]) { vtype = VLSF_BACKVOL; voltype = BACKVOL; } else { vtype = 0; voltype = -1; } for (srv = 0; srv < u.n.nServers; srv++) { if ((u.n.serverFlags[srv] & vtype) == 0) continue; server = afscp_ServerByAddr(cell, u.n.serverNumber[srv]); if (server == NULL) continue; ret->servers[ret->nservers++] = server->index; } break; case 2: if (id == u.o.volumeId[RWVOL]) { vtype = VLSF_RWVOL; voltype = RWVOL; } else if (id == u.o.volumeId[ROVOL]) { vtype = VLSF_ROVOL; voltype = ROVOL; } else if (id == u.o.volumeId[BACKVOL]) { vtype = VLSF_BACKVOL; voltype = BACKVOL; } else { vtype = 0; voltype = -1; } for (srv = 0; srv < u.o.nServers; srv++) { if ((u.o.serverFlags[srv] & vtype) == 0) continue; server = afscp_ServerByAddr(cell, u.o.serverNumber[srv]); if (server == NULL) continue; ret->servers[ret->nservers++] = server->index; } break; } ret->voltype = voltype; #ifdef AFSCP_DEBUG server = afscp_ServerByIndex(ret->servers[0]); if (server) i.s_addr = server->addrs[0]; else i.s_addr = 0; #endif afs_dprintf(("New volume BYID %s (%lu) on %s (%d)\n", ret->name, afs_printable_uint32_lu(ret->id), inet_ntoa(i), ret->servers[0])); s = tsearch(&key, &cell->volsbyid, icompare); if (s) *(struct afscp_volume **)s = ret; strlcpy(key.name, ret->name, sizeof(key.name)); s = tsearch(&key, &cell->volsbyname, ncompare); if (s) *(struct afscp_volume **)s = ret; return ret; }