int VLDB_GetEntryByName(char *namep, struct nvldbentry *entryp) { struct vldbentry oentry; int code; if (newvlserver == vltype_old) { tryold: code = ubik_VL_GetEntryByNameO(cstruct, 0, namep, &oentry); if (!code) ovlentry_to_nvlentry(&oentry, entryp); return code; } code = ubik_VL_GetEntryByNameN(cstruct, 0, namep, 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; }
struct afscp_volume * afscp_VolumeByName(struct afscp_cell *cell, const char *vname, afs_int32 intype) { union allvldbentry u; struct afscp_volume *ret, key; struct afscp_server *server; afs_int32 code, vtype, type, srv; void *s; #ifdef AFSCP_DEBUG struct in_addr i; #endif if (intype == RWVOL) vtype = VLSF_RWVOL; else if (intype == ROVOL) vtype = VLSF_ROVOL; else if (intype == BACKVOL) vtype = VLSF_BACKVOL; else { afscp_errno = EINVAL; return NULL; } memset(&key, 0, sizeof(key)); strlcpy(key.name, vname, sizeof(key.name)); key.voltype = vtype; s = tfind(&key, &cell->volsbyname, ncompare); if (s) { ret = *(struct afscp_volume **)s; return ret; } type = 0; code = ubik_VL_GetEntryByNameU(cell->vlservers, 0, (char *)vname, &u.u); if (code == RXGEN_OPCODE) { type = 1; code = ubik_VL_GetEntryByNameN(cell->vlservers, 0, (char *)vname, &u.n); if (code == RXGEN_OPCODE) { type = 2; code = ubik_VL_GetEntryByNameO(cell->vlservers, 0, (char *)vname, &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: ret->id = u.u.volumeId[intype]; for (srv = 0; srv < u.u.nServers; srv++) { if ((u.u.serverFlags[srv] & vtype) == 0) continue; afs_dprintf(("uvldbentry server %d flags: %x\n", srv, u.u.serverFlags[srv])); 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: ret->id = u.n.volumeId[intype]; 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) continue; ret->servers[ret->nservers++] = server->index; } break; case 2: ret->id = u.o.volumeId[intype]; 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) continue; ret->servers[ret->nservers++] = server->index; } break; } if (!ret->nservers || !ret->id) { free(ret); return NULL; } ret->voltype = intype; #ifdef AFSCP_DEBUG server = afscp_ServerByIndex(ret->servers[0]); if (server != NULL) i.s_addr = server->addrs[0]; else i.s_addr = 0; #endif afs_dprintf(("New volume BYNAME %s (%lu) on %s (%d)\n", ret->name, afs_printable_uint32_lu(ret->id), inet_ntoa(i), ret->servers[0])); s = tsearch(&key, &cell->volsbyname, ncompare); if (s) *(struct afscp_volume **)s = ret; key.id = ret->id; s = tsearch(&key, &cell->volsbyid, icompare); if (s) *(struct afscp_volume **)s = ret; return ret; }