Annotation of qemu/hw/virtio-9p-posix-acl.c, revision 1.1.1.1

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 <aneesh.kumar@linux.vnet.ibm.com>
                      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 "virtio.h"
                     17: #include "virtio-9p.h"
                     18: #include "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:     return lgetxattr(rpath(ctx, path), MAP_ACL_ACCESS, value, size);
                     30: }
                     31: 
                     32: static ssize_t mp_pacl_listxattr(FsContext *ctx, const char *path,
                     33:                                  char *name, void *value, size_t osize)
                     34: {
                     35:     ssize_t len = sizeof(ACL_ACCESS);
                     36: 
                     37:     if (!value) {
                     38:         return len;
                     39:     }
                     40: 
                     41:     if (osize < len) {
                     42:         errno = ERANGE;
                     43:         return -1;
                     44:     }
                     45: 
                     46:     strncpy(value, ACL_ACCESS, len);
                     47:     return 0;
                     48: }
                     49: 
                     50: static int mp_pacl_setxattr(FsContext *ctx, const char *path, const char *name,
                     51:                             void *value, size_t size, int flags)
                     52: {
                     53:     return lsetxattr(rpath(ctx, path), MAP_ACL_ACCESS, value, size, flags);
                     54: }
                     55: 
                     56: static int mp_pacl_removexattr(FsContext *ctx,
                     57:                                const char *path, const char *name)
                     58: {
                     59:     int ret;
                     60:     ret  = lremovexattr(rpath(ctx, path), MAP_ACL_ACCESS);
                     61:     if (ret == -1 && errno == ENODATA) {
                     62:         /*
                     63:          * We don't get ENODATA error when trying to remote a
                     64:          * posix acl that is not present. So don't throw the error
                     65:          * even in case of mapped security model
                     66:          */
                     67:         errno = 0;
                     68:         ret = 0;
                     69:     }
                     70:     return ret;
                     71: }
                     72: 
                     73: static ssize_t mp_dacl_getxattr(FsContext *ctx, const char *path,
                     74:                                 const char *name, void *value, size_t size)
                     75: {
                     76:     return lgetxattr(rpath(ctx, path), MAP_ACL_DEFAULT, value, size);
                     77: }
                     78: 
                     79: static ssize_t mp_dacl_listxattr(FsContext *ctx, const char *path,
                     80:                                  char *name, void *value, size_t osize)
                     81: {
                     82:     ssize_t len = sizeof(ACL_DEFAULT);
                     83: 
                     84:     if (!value) {
                     85:         return len;
                     86:     }
                     87: 
                     88:     if (osize < len) {
                     89:         errno = ERANGE;
                     90:         return -1;
                     91:     }
                     92: 
                     93:     strncpy(value, ACL_DEFAULT, len);
                     94:     return 0;
                     95: }
                     96: 
                     97: static int mp_dacl_setxattr(FsContext *ctx, const char *path, const char *name,
                     98:                             void *value, size_t size, int flags)
                     99: {
                    100:     return lsetxattr(rpath(ctx, path), MAP_ACL_DEFAULT, value, size, flags);
                    101: }
                    102: 
                    103: static int mp_dacl_removexattr(FsContext *ctx,
                    104:                                const char *path, const char *name)
                    105: {
                    106:     return lremovexattr(rpath(ctx, path), MAP_ACL_DEFAULT);
                    107: }
                    108: 
                    109: 
                    110: XattrOperations mapped_pacl_xattr = {
                    111:     .name = "system.posix_acl_access",
                    112:     .getxattr = mp_pacl_getxattr,
                    113:     .setxattr = mp_pacl_setxattr,
                    114:     .listxattr = mp_pacl_listxattr,
                    115:     .removexattr = mp_pacl_removexattr,
                    116: };
                    117: 
                    118: XattrOperations mapped_dacl_xattr = {
                    119:     .name = "system.posix_acl_default",
                    120:     .getxattr = mp_dacl_getxattr,
                    121:     .setxattr = mp_dacl_setxattr,
                    122:     .listxattr = mp_dacl_listxattr,
                    123:     .removexattr = mp_dacl_removexattr,
                    124: };
                    125: 
                    126: XattrOperations passthrough_acl_xattr = {
                    127:     .name = "system.posix_acl_",
                    128:     .getxattr = pt_getxattr,
                    129:     .setxattr = pt_setxattr,
                    130:     .listxattr = pt_listxattr,
                    131:     .removexattr = pt_removexattr,
                    132: };
                    133: 
                    134: XattrOperations none_acl_xattr = {
                    135:     .name = "system.posix_acl_",
                    136:     .getxattr = notsup_getxattr,
                    137:     .setxattr = notsup_setxattr,
                    138:     .listxattr = notsup_listxattr,
                    139:     .removexattr = notsup_removexattr,
                    140: };

unix.superglobalmegacorp.com