X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=util-vserver%2Fsrc%2Flsxid.c;h=bfcb47dbd81f75c9d45ca149ac83c89677821f8f;hb=a917f24ef7b003dcef54a3db2644cf9cb4bc2db2;hp=a3064cd1c6053f6334c17be88f255e4d7ca6071f;hpb=e0d0c3c5bdcd7fe1db5e7bfa956ad0b365f24d41;p=util-vserver.git diff --git a/util-vserver/src/lsxid.c b/util-vserver/src/lsxid.c index a3064cd..bfcb47d 100644 --- a/util-vserver/src/lsxid.c +++ b/util-vserver/src/lsxid.c @@ -23,6 +23,7 @@ #include "fstool.h" #include "util.h" +#include #include #include @@ -33,6 +34,10 @@ #include #include #include +#include + +#define ENSC_WRAPPERS_STDLIB 1 +#include struct option const CMDLINE_OPTIONS[] = { @@ -43,6 +48,13 @@ CMDLINE_OPTIONS[] = { char const CMDLINE_OPTIONS_SHORT[] = "Radnx"; +struct XidNameMapping { + xid_t xid; + char const * name; +}; + +static struct Vector xid_name_mapping; + void showHelp(int fd, char const *cmd, int res) { @@ -75,24 +87,56 @@ showVersion() void fixupParams(struct Arguments UNUSED * args, int UNUSED argc) { + Vector_init(&xid_name_mapping, sizeof (struct XidNameMapping)); +} + +static int +cmpMap(void const *xid_v, void const *map_v) +{ + xid_t const * const xid = xid_v; + struct XidNameMapping const * const map = map_v; + + return *xid - map->xid; +} + +static char const * +lookupContext(xid_t xid) +{ + struct XidNameMapping *res; + + res = Vector_search(&xid_name_mapping, &xid, cmpMap); + + if (res==0) { + vcCfgStyle style = vcCFG_AUTO; + char const * vcfg = vc_getVserverByCtx(xid, &style, 0); + + res = Vector_insert(&xid_name_mapping, &xid, cmpMap); + if (vcfg) res->name = vc_getVserverName(vcfg, style); + else res->name = 0; + res->xid = xid; + + free(const_cast(char *)(vcfg)); + } + + assert(res!=0); + + return res->name; } static xid_t -getFileContext(char const *name, struct stat const *exp_st) +getFileContext(char const *name) { xid_t res; uint32_t mask = VC_IATTR_XID; - if (vc_get_iattr_compat(name, exp_st->st_dev, exp_st->st_ino, - &res, 0, &mask, &exp_st->st_mode)==-1) - perror("vc_get_iattr_compat()"); + if (vc_get_iattr(name, &res, 0, &mask)==-1) + perror("vc_get_iattr()"); return (mask&VC_IATTR_XID) ? res : VC_NOCTX; } bool -handleFile(char const *name, char const *display_name, - struct stat const *exp_st) +handleFile(char const *name, char const *display_name) { xid_t ctx = 0; char buf[MAX(sizeof(ctx)*3+1, 20)]; @@ -100,7 +144,12 @@ handleFile(char const *name, char const *display_name, memset(buf, ' ', sizeof buf); - ctx = getFileContext(name, exp_st); +#if 1 + ctx = getFileContext(name); +#else +# warning Compiling in debug-code + ctx = random() % 10 + 49213; +#endif if (ctx==VC_NOCTX) { memcpy(buf, "!!ERR!!", 7); @@ -108,14 +157,13 @@ handleFile(char const *name, char const *display_name, need_write = false; } else if (global_args->do_mapping) { - char const * vname = vc_getVserverByCtx(ctx, 0,0); + char const * vname = lookupContext(ctx); if (!vname) buf[0] = '\0'; else { size_t l = strlen(vname); if (l