|
|
1.1 ! root 1: /* ! 2: * Virtio 9p system.posix* xattr callback ! 3: * ! 4: * Copyright IBM, Corp. 2010 ! 5: * ! 6: * Authors: ! 7: * Aneesh Kumar K.V <[email protected]> ! 8: * ! 9: * This work is licensed under the terms of the GNU GPL, version 2. See ! 10: * the COPYING file in the top-level directory. ! 11: * ! 12: */ ! 13: ! 14: #include <sys/types.h> ! 15: #include <attr/xattr.h> ! 16: #include "hw/virtio.h" ! 17: #include "virtio-9p.h" ! 18: #include "fsdev/file-op-9p.h" ! 19: #include "virtio-9p-xattr.h" ! 20: ! 21: #define MAP_ACL_ACCESS "user.virtfs.system.posix_acl_access" ! 22: #define MAP_ACL_DEFAULT "user.virtfs.system.posix_acl_default" ! 23: #define ACL_ACCESS "system.posix_acl_access" ! 24: #define ACL_DEFAULT "system.posix_acl_default" ! 25: ! 26: static ssize_t mp_pacl_getxattr(FsContext *ctx, const char *path, ! 27: const char *name, void *value, size_t size) ! 28: { ! 29: char buffer[PATH_MAX]; ! 30: return lgetxattr(rpath(ctx, path, buffer), MAP_ACL_ACCESS, value, size); ! 31: } ! 32: ! 33: static ssize_t mp_pacl_listxattr(FsContext *ctx, const char *path, ! 34: char *name, void *value, size_t osize) ! 35: { ! 36: ssize_t len = sizeof(ACL_ACCESS); ! 37: ! 38: if (!value) { ! 39: return len; ! 40: } ! 41: ! 42: if (osize < len) { ! 43: errno = ERANGE; ! 44: return -1; ! 45: } ! 46: ! 47: strncpy(value, ACL_ACCESS, len); ! 48: return 0; ! 49: } ! 50: ! 51: static int mp_pacl_setxattr(FsContext *ctx, const char *path, const char *name, ! 52: void *value, size_t size, int flags) ! 53: { ! 54: char buffer[PATH_MAX]; ! 55: return lsetxattr(rpath(ctx, path, buffer), MAP_ACL_ACCESS, value, ! 56: size, flags); ! 57: } ! 58: ! 59: static int mp_pacl_removexattr(FsContext *ctx, ! 60: const char *path, const char *name) ! 61: { ! 62: int ret; ! 63: char buffer[PATH_MAX]; ! 64: ret = lremovexattr(rpath(ctx, path, buffer), MAP_ACL_ACCESS); ! 65: if (ret == -1 && errno == ENODATA) { ! 66: /* ! 67: * We don't get ENODATA error when trying to remove a ! 68: * posix acl that is not present. So don't throw the error ! 69: * even in case of mapped security model ! 70: */ ! 71: errno = 0; ! 72: ret = 0; ! 73: } ! 74: return ret; ! 75: } ! 76: ! 77: static ssize_t mp_dacl_getxattr(FsContext *ctx, const char *path, ! 78: const char *name, void *value, size_t size) ! 79: { ! 80: char buffer[PATH_MAX]; ! 81: return lgetxattr(rpath(ctx, path, buffer), MAP_ACL_DEFAULT, value, size); ! 82: } ! 83: ! 84: static ssize_t mp_dacl_listxattr(FsContext *ctx, const char *path, ! 85: char *name, void *value, size_t osize) ! 86: { ! 87: ssize_t len = sizeof(ACL_DEFAULT); ! 88: ! 89: if (!value) { ! 90: return len; ! 91: } ! 92: ! 93: if (osize < len) { ! 94: errno = ERANGE; ! 95: return -1; ! 96: } ! 97: ! 98: strncpy(value, ACL_DEFAULT, len); ! 99: return 0; ! 100: } ! 101: ! 102: static int mp_dacl_setxattr(FsContext *ctx, const char *path, const char *name, ! 103: void *value, size_t size, int flags) ! 104: { ! 105: char buffer[PATH_MAX]; ! 106: return lsetxattr(rpath(ctx, path, buffer), MAP_ACL_DEFAULT, value, ! 107: size, flags); ! 108: } ! 109: ! 110: static int mp_dacl_removexattr(FsContext *ctx, ! 111: const char *path, const char *name) ! 112: { ! 113: int ret; ! 114: char buffer[PATH_MAX]; ! 115: ret = lremovexattr(rpath(ctx, path, buffer), MAP_ACL_DEFAULT); ! 116: if (ret == -1 && errno == ENODATA) { ! 117: /* ! 118: * We don't get ENODATA error when trying to remove a ! 119: * posix acl that is not present. So don't throw the error ! 120: * even in case of mapped security model ! 121: */ ! 122: errno = 0; ! 123: ret = 0; ! 124: } ! 125: return ret; ! 126: } ! 127: ! 128: ! 129: XattrOperations mapped_pacl_xattr = { ! 130: .name = "system.posix_acl_access", ! 131: .getxattr = mp_pacl_getxattr, ! 132: .setxattr = mp_pacl_setxattr, ! 133: .listxattr = mp_pacl_listxattr, ! 134: .removexattr = mp_pacl_removexattr, ! 135: }; ! 136: ! 137: XattrOperations mapped_dacl_xattr = { ! 138: .name = "system.posix_acl_default", ! 139: .getxattr = mp_dacl_getxattr, ! 140: .setxattr = mp_dacl_setxattr, ! 141: .listxattr = mp_dacl_listxattr, ! 142: .removexattr = mp_dacl_removexattr, ! 143: }; ! 144: ! 145: XattrOperations passthrough_acl_xattr = { ! 146: .name = "system.posix_acl_", ! 147: .getxattr = pt_getxattr, ! 148: .setxattr = pt_setxattr, ! 149: .listxattr = pt_listxattr, ! 150: .removexattr = pt_removexattr, ! 151: }; ! 152: ! 153: XattrOperations none_acl_xattr = { ! 154: .name = "system.posix_acl_", ! 155: .getxattr = notsup_getxattr, ! 156: .setxattr = notsup_setxattr, ! 157: .listxattr = notsup_listxattr, ! 158: .removexattr = notsup_removexattr, ! 159: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.