Annotation of qemu/hw/9pfs/virtio-9p-xattr.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Virtio 9p  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 "hw/virtio.h"
                     15: #include "virtio-9p.h"
                     16: #include "fsdev/file-op-9p.h"
                     17: #include "virtio-9p-xattr.h"
                     18: 
                     19: 
                     20: static XattrOperations *get_xattr_operations(XattrOperations **h,
                     21:                                              const char *name)
                     22: {
                     23:     XattrOperations *xops;
                     24:     for (xops = *(h)++; xops != NULL; xops = *(h)++) {
                     25:         if (!strncmp(name, xops->name, strlen(xops->name))) {
                     26:             return xops;
                     27:         }
                     28:     }
                     29:     return NULL;
                     30: }
                     31: 
                     32: ssize_t v9fs_get_xattr(FsContext *ctx, const char *path,
                     33:                        const char *name, void *value, size_t size)
                     34: {
                     35:     XattrOperations *xops = get_xattr_operations(ctx->xops, name);
                     36:     if (xops) {
                     37:         return xops->getxattr(ctx, path, name, value, size);
                     38:     }
                     39:     errno = -EOPNOTSUPP;
                     40:     return -1;
                     41: }
                     42: 
                     43: ssize_t pt_listxattr(FsContext *ctx, const char *path,
                     44:                      char *name, void *value, size_t size)
                     45: {
                     46:     int name_size = strlen(name) + 1;
                     47:     if (!value) {
                     48:         return name_size;
                     49:     }
                     50: 
                     51:     if (size < name_size) {
                     52:         errno = ERANGE;
                     53:         return -1;
                     54:     }
                     55: 
                     56:     strncpy(value, name, name_size);
                     57:     return name_size;
                     58: }
                     59: 
                     60: 
                     61: /*
                     62:  * Get the list and pass to each layer to find out whether
                     63:  * to send the data or not
                     64:  */
                     65: ssize_t v9fs_list_xattr(FsContext *ctx, const char *path,
                     66:                         void *value, size_t vsize)
                     67: {
                     68:     ssize_t size = 0;
                     69:     char buffer[PATH_MAX];
                     70:     void *ovalue = value;
                     71:     XattrOperations *xops;
                     72:     char *orig_value, *orig_value_start;
                     73:     ssize_t xattr_len, parsed_len = 0, attr_len;
                     74: 
                     75:     /* Get the actual len */
                     76:     xattr_len = llistxattr(rpath(ctx, path, buffer), value, 0);
                     77:     if (xattr_len <= 0) {
                     78:         return xattr_len;
                     79:     }
                     80: 
                     81:     /* Now fetch the xattr and find the actual size */
                     82:     orig_value = qemu_malloc(xattr_len);
                     83:     xattr_len = llistxattr(rpath(ctx, path, buffer), orig_value, xattr_len);
                     84: 
                     85:     /* store the orig pointer */
                     86:     orig_value_start = orig_value;
                     87:     while (xattr_len > parsed_len) {
                     88:         xops = get_xattr_operations(ctx->xops, orig_value);
                     89:         if (!xops) {
                     90:             goto next_entry;
                     91:         }
                     92: 
                     93:         if (!value) {
                     94:             size += xops->listxattr(ctx, path, orig_value, value, vsize);
                     95:         } else {
                     96:             size = xops->listxattr(ctx, path, orig_value, value, vsize);
                     97:             if (size < 0) {
                     98:                 goto err_out;
                     99:             }
                    100:             value += size;
                    101:             vsize -= size;
                    102:         }
                    103: next_entry:
                    104:         /* Got the next entry */
                    105:         attr_len = strlen(orig_value) + 1;
                    106:         parsed_len += attr_len;
                    107:         orig_value += attr_len;
                    108:     }
                    109:     if (value) {
                    110:         size = value - ovalue;
                    111:     }
                    112: 
                    113: err_out:
                    114:     qemu_free(orig_value_start);
                    115:     return size;
                    116: }
                    117: 
                    118: int v9fs_set_xattr(FsContext *ctx, const char *path, const char *name,
                    119:                    void *value, size_t size, int flags)
                    120: {
                    121:     XattrOperations *xops = get_xattr_operations(ctx->xops, name);
                    122:     if (xops) {
                    123:         return xops->setxattr(ctx, path, name, value, size, flags);
                    124:     }
                    125:     errno = -EOPNOTSUPP;
                    126:     return -1;
                    127: 
                    128: }
                    129: 
                    130: int v9fs_remove_xattr(FsContext *ctx,
                    131:                       const char *path, const char *name)
                    132: {
                    133:     XattrOperations *xops = get_xattr_operations(ctx->xops, name);
                    134:     if (xops) {
                    135:         return xops->removexattr(ctx, path, name);
                    136:     }
                    137:     errno = -EOPNOTSUPP;
                    138:     return -1;
                    139: 
                    140: }
                    141: 
                    142: XattrOperations *mapped_xattr_ops[] = {
                    143:     &mapped_user_xattr,
                    144:     &mapped_pacl_xattr,
                    145:     &mapped_dacl_xattr,
                    146:     NULL,
                    147: };
                    148: 
                    149: XattrOperations *passthrough_xattr_ops[] = {
                    150:     &passthrough_user_xattr,
                    151:     &passthrough_acl_xattr,
                    152:     NULL,
                    153: };
                    154: 
                    155: /* for .user none model should be same as passthrough */
                    156: XattrOperations *none_xattr_ops[] = {
                    157:     &passthrough_user_xattr,
                    158:     &none_acl_xattr,
                    159:     NULL,
                    160: };

unix.superglobalmegacorp.com

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