Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}