static xid_t
getFileContext(char const *name, struct stat const *exp_st)
{
- int fd = open(name, O_RDONLY);
xid_t res;
+ uint32_t mask = VC_IATTR_XID;
- if (fd==-1) {
- perror("open()");
- return VC_NOCTX;
- }
-
- if (exp_st)
- checkForRace(fd, name, exp_st);
-
- res = vc_X_get_filecontext(fd);
- if (res==VC_NOCTX)
- perror("vc_X_get_filecontext()");
-
- close(fd);
+ 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()");
- return res;
+ return (mask&VC_IATTR_XID) ? res : VC_NOCTX;
}
bool
memset(buf, ' ', sizeof buf);
- if (!S_ISREG(exp_st->st_mode)) {
- memcpy(buf, "-------", 7);
+ ctx = getFileContext(name, exp_st);
+
+ 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 = 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;
}
- 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) {