Statistics
| Branch: | Revision:

root / hw / virtio-9p-xattr.c @ fc22118d

History | View | Annotate | Download (3.6 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 fc22118d Aneesh Kumar K.V
77 fc22118d Aneesh Kumar K.V
    /* Now fetch the xattr and find the actual size */
78 fc22118d Aneesh Kumar K.V
    orig_value = qemu_malloc(xattr_len);
79 fc22118d Aneesh Kumar K.V
    xattr_len = llistxattr(rpath(ctx, path), orig_value, xattr_len);
80 fc22118d Aneesh Kumar K.V
81 fc22118d Aneesh Kumar K.V
    /* store the orig pointer */
82 fc22118d Aneesh Kumar K.V
    orig_value_start = orig_value;
83 fc22118d Aneesh Kumar K.V
    while (xattr_len > parsed_len) {
84 fc22118d Aneesh Kumar K.V
        xops = get_xattr_operations(ctx->xops, orig_value);
85 fc22118d Aneesh Kumar K.V
        if (!xops) {
86 fc22118d Aneesh Kumar K.V
            goto next_entry;
87 fc22118d Aneesh Kumar K.V
        }
88 fc22118d Aneesh Kumar K.V
89 fc22118d Aneesh Kumar K.V
        if (!value) {
90 fc22118d Aneesh Kumar K.V
            size += xops->listxattr(ctx, path, orig_value, value, vsize);
91 fc22118d Aneesh Kumar K.V
        } else {
92 fc22118d Aneesh Kumar K.V
            size = xops->listxattr(ctx, path, orig_value, value, vsize);
93 fc22118d Aneesh Kumar K.V
            if (size < 0) {
94 fc22118d Aneesh Kumar K.V
                goto err_out;
95 fc22118d Aneesh Kumar K.V
            }
96 fc22118d Aneesh Kumar K.V
            value += size;
97 fc22118d Aneesh Kumar K.V
            vsize -= size;
98 fc22118d Aneesh Kumar K.V
        }
99 fc22118d Aneesh Kumar K.V
next_entry:
100 fc22118d Aneesh Kumar K.V
        /* Got the next entry */
101 fc22118d Aneesh Kumar K.V
        attr_len = strlen(orig_value) + 1;
102 fc22118d Aneesh Kumar K.V
        parsed_len += attr_len;
103 fc22118d Aneesh Kumar K.V
        orig_value += attr_len;
104 fc22118d Aneesh Kumar K.V
    }
105 fc22118d Aneesh Kumar K.V
    if (value) {
106 fc22118d Aneesh Kumar K.V
        size = value - ovalue;
107 fc22118d Aneesh Kumar K.V
    }
108 fc22118d Aneesh Kumar K.V
109 fc22118d Aneesh Kumar K.V
err_out:
110 fc22118d Aneesh Kumar K.V
    qemu_free(orig_value_start);
111 fc22118d Aneesh Kumar K.V
    return size;
112 fc22118d Aneesh Kumar K.V
}
113 fc22118d Aneesh Kumar K.V
114 fc22118d Aneesh Kumar K.V
int v9fs_set_xattr(FsContext *ctx, const char *path, const char *name,
115 fc22118d Aneesh Kumar K.V
                   void *value, size_t size, int flags)
116 fc22118d Aneesh Kumar K.V
{
117 fc22118d Aneesh Kumar K.V
    XattrOperations *xops = get_xattr_operations(ctx->xops, name);
118 fc22118d Aneesh Kumar K.V
    if (xops) {
119 fc22118d Aneesh Kumar K.V
        return xops->setxattr(ctx, path, name, value, size, flags);
120 fc22118d Aneesh Kumar K.V
    }
121 fc22118d Aneesh Kumar K.V
    errno = -EOPNOTSUPP;
122 fc22118d Aneesh Kumar K.V
    return -1;
123 fc22118d Aneesh Kumar K.V
124 fc22118d Aneesh Kumar K.V
}
125 fc22118d Aneesh Kumar K.V
126 fc22118d Aneesh Kumar K.V
int v9fs_remove_xattr(FsContext *ctx,
127 fc22118d Aneesh Kumar K.V
                      const char *path, const char *name)
128 fc22118d Aneesh Kumar K.V
{
129 fc22118d Aneesh Kumar K.V
    XattrOperations *xops = get_xattr_operations(ctx->xops, name);
130 fc22118d Aneesh Kumar K.V
    if (xops) {
131 fc22118d Aneesh Kumar K.V
        return xops->removexattr(ctx, path, name);
132 fc22118d Aneesh Kumar K.V
    }
133 fc22118d Aneesh Kumar K.V
    errno = -EOPNOTSUPP;
134 fc22118d Aneesh Kumar K.V
    return -1;
135 fc22118d Aneesh Kumar K.V
136 fc22118d Aneesh Kumar K.V
}
137 fc22118d Aneesh Kumar K.V
138 fc22118d Aneesh Kumar K.V
XattrOperations *mapped_xattr_ops[] = {
139 fc22118d Aneesh Kumar K.V
    &mapped_user_xattr,
140 fc22118d Aneesh Kumar K.V
    NULL,
141 fc22118d Aneesh Kumar K.V
};
142 fc22118d Aneesh Kumar K.V
143 fc22118d Aneesh Kumar K.V
XattrOperations *passthrough_xattr_ops[] = {
144 fc22118d Aneesh Kumar K.V
    &passthrough_user_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
/* for .user none model should be same as passthrough */
149 fc22118d Aneesh Kumar K.V
XattrOperations *none_xattr_ops[] = {
150 fc22118d Aneesh Kumar K.V
    &passthrough_user_xattr,
151 fc22118d Aneesh Kumar K.V
    NULL,
152 fc22118d Aneesh Kumar K.V
};