X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=util-vserver%2Fsrc%2Flsxid.c;h=bfcb47dbd81f75c9d45ca149ac83c89677821f8f;hb=f095183802c5263915fe8f45e54a632615e9c38a;hp=36cb18919d46ab0afcd186d3925be71f33e35c8a;hpb=869ef86707f88fe8924fdc30c434a21e128390d9;p=util-vserver.git diff --git a/util-vserver/src/lsxid.c b/util-vserver/src/lsxid.c index 36cb189..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)==-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,31 +144,28 @@ handleFile(char const *name, char const *display_name, memset(buf, ' ', sizeof buf); - if (!S_ISREG(exp_st->st_mode)) { - memcpy(buf, "-------", 7); +#if 1 + ctx = getFileContext(name); +#else +# warning Compiling in debug-code + ctx = random() % 10 + 49213; +#endif + + if (ctx==VC_NOCTX) { + memcpy(buf, "!!ERR!!", 7); write(1, buf, sizeof buf); need_write = false; } - else { - ctx = getFileContext(name, exp_st); - - if (ctx==VC_NOCTX) { - memcpy(buf, "!!ERR!!", 7); - write(1, buf, sizeof buf); + else if (global_args->do_mapping) { + char const * vname = lookupContext(ctx); + if (!vname) buf[0] = '\0'; + else { + size_t l = strlen(vname); + if (ldo_mapping) { - char const * vname = vc_getVserverByCtx(ctx, 0,0); - if (!vname) buf[0] = '\0'; - else { - size_t l = strlen(vname); - if (l