Statistics
| Branch: | Revision:

root / hw / virtio-9p-xattr.c @ 6b331efb

History | View | Annotate | Download (3.8 kB)

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