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

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>
1.1.1.2 ! root       15: #include "qemu-xattr.h"
1.1       root       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: };

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.