#include "fstool.h"
#include "util.h"
+#include <ensc_vector/vector.h>
#include <lib/vserver.h>
#include <lib/vserver-internal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
+#include <assert.h>
+
+#define ENSC_WRAPPERS_STDLIB 1
+#include <wrappers.h>
struct option const
CMDLINE_OPTIONS[] = {
{ 0,0,0,0 }
};
-char const CMDLINE_OPTIONS_SHORT[] = "Radn";
+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)
WRITE_MSG(fd, "Usage: ");
WRITE_STR(fd, cmd);
WRITE_MSG(fd,
- " [-Radn] [--] <file>*\n\n"
+ " [-Radnx] [--] <file>*\n\n"
" Options:\n"
" -R ... recurse through directories\n"
" -a ... display files starting with '.' also\n"
" -d ... list directories like other files instead of\n"
" listing their content\n"
" -n ... do not try to do xid -> vserver-name mapping\n"
+ " -x ... do not cross filesystems\n\n"
"Please report bugs to " PACKAGE_BUGREPORT "\n");
exit(res);
}
}
void
-checkParams(struct Arguments const UNUSED * args, int UNUSED argc)
+fixupParams(struct Arguments UNUSED * args, int UNUSED argc)
{
+ Vector_init(&xid_name_mapping, sizeof (struct XidNameMapping));
}
-static xid_t
-getFileContext(char const *name, struct stat const *exp_st)
+static int
+cmpMap(void const *xid_v, void const *map_v)
{
- int fd = open(name, O_RDONLY);
- xid_t res;
-
- if (fd==-1) {
- perror("open()");
- return VC_NOCTX;
+ 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));
}
- if (exp_st)
- checkForRace(fd, name, exp_st);
+ assert(res!=0);
+
+ return res->name;
+}
- res = vc_X_get_filecontext(fd);
- if (res==VC_NOCTX)
- perror("vc_X_get_filecontext()");
+static xid_t
+getFileContext(char const *name)
+{
+ xid_t res;
+ uint32_t mask = VC_IATTR_XID;
- close(fd);
+ if (vc_get_iattr(name, &res, 0, &mask)==-1)
+ perror("vc_get_iattr()");
- return res;
+ 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)];
memset(buf, ' ', sizeof buf);
- if (S_ISLNK(exp_st->st_mode)) {
- memcpy(buf, "-------", 7);
- write(1, buf, sizeof buf);
+#if 1
+ ctx = getFileContext(name);
+#else
+# warning Compiling in debug-code
+ ctx = random() % 10 + 49213;
+#endif
+
+ if (ctx==VC_NOCTX) {
+ memcpy(buf, "!!ERR!!", 7);
+ Vwrite(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 (l<sizeof(buf)) Vwrite(1, buf, sizeof(buf)-l);
+ Vwrite(1, vname, l);
+
need_write = false;
}
- else if (global_args->do_mapping) {
- char const * vname = vc_getVserverByCtx(ctx, 0,0);
- if (!vname) buf[0] = '\0';
- else {
- size_t l = strlen(vname);
- if (l<sizeof(buf)) write(1, buf, sizeof(buf)-l);
- write(1, vname, l);
-
- free((char *)vname);
- need_write = false;
- }
- }
}
if (need_write) {
size_t l = utilvserver_fmt_ulong(buf, ctx);
- if (l<sizeof(buf)) write(1, buf+l, sizeof(buf)-l);
- write(1, buf, l);
+ if (l<sizeof(buf)) Vwrite(1, buf+l, sizeof(buf)-l);
+ Vwrite(1, buf, l);
}
- write(1, " ", 2);
- write(1, display_name, strlen(display_name));
- write(1, "\n", 1);
+ Vwrite(1, " ", 2);
+ Vwrite(1, display_name, strlen(display_name));
+ Vwrite(1, "\n", 1);
return ctx!=VC_NOCTX;
}