Statistics
| Branch: | Revision:

root / hw / virtio-9p-xattr-user.c @ f19410ca

History | View | Annotate | Download (2.8 kB)

1 fc22118d Aneesh Kumar K.V
/*
2 fc22118d Aneesh Kumar K.V
 * Virtio 9p user. 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 <sys/types.h>
15 fc22118d Aneesh Kumar K.V
#include "virtio.h"
16 fc22118d Aneesh Kumar K.V
#include "virtio-9p.h"
17 fc22118d Aneesh Kumar K.V
#include "file-op-9p.h"
18 fc22118d Aneesh Kumar K.V
#include "virtio-9p-xattr.h"
19 fc22118d Aneesh Kumar K.V
20 fc22118d Aneesh Kumar K.V
21 fc22118d Aneesh Kumar K.V
static ssize_t mp_user_getxattr(FsContext *ctx, const char *path,
22 fc22118d Aneesh Kumar K.V
                                const char *name, void *value, size_t size)
23 fc22118d Aneesh Kumar K.V
{
24 fc22118d Aneesh Kumar K.V
    if (strncmp(name, "user.virtfs.", 12) == 0) {
25 fc22118d Aneesh Kumar K.V
        /*
26 fc22118d Aneesh Kumar K.V
         * Don't allow fetch of user.virtfs namesapce
27 fc22118d Aneesh Kumar K.V
         * in case of mapped security
28 fc22118d Aneesh Kumar K.V
         */
29 fc22118d Aneesh Kumar K.V
        errno = ENOATTR;
30 fc22118d Aneesh Kumar K.V
        return -1;
31 fc22118d Aneesh Kumar K.V
    }
32 fc22118d Aneesh Kumar K.V
    return lgetxattr(rpath(ctx, path), name, value, size);
33 fc22118d Aneesh Kumar K.V
}
34 fc22118d Aneesh Kumar K.V
35 fc22118d Aneesh Kumar K.V
static ssize_t mp_user_listxattr(FsContext *ctx, const char *path,
36 fc22118d Aneesh Kumar K.V
                                 char *name, void *value, size_t size)
37 fc22118d Aneesh Kumar K.V
{
38 fc22118d Aneesh Kumar K.V
    int name_size = strlen(name) + 1;
39 fc22118d Aneesh Kumar K.V
    if (strncmp(name, "user.virtfs.", 12) == 0) {
40 70fc55eb Aneesh Kumar K.V
41 70fc55eb Aneesh Kumar K.V
        /*  check if it is a mapped posix acl */
42 70fc55eb Aneesh Kumar K.V
        if (strncmp(name, "user.virtfs.system.posix_acl_", 29) == 0) {
43 70fc55eb Aneesh Kumar K.V
            /* adjust the name and size */
44 70fc55eb Aneesh Kumar K.V
            name += 12;
45 70fc55eb Aneesh Kumar K.V
            name_size -= 12;
46 70fc55eb Aneesh Kumar K.V
        } else {
47 70fc55eb Aneesh Kumar K.V
            /*
48 70fc55eb Aneesh Kumar K.V
             * Don't allow fetch of user.virtfs namesapce
49 70fc55eb Aneesh Kumar K.V
             * in case of mapped security
50 70fc55eb Aneesh Kumar K.V
             */
51 70fc55eb Aneesh Kumar K.V
            return 0;
52 70fc55eb Aneesh Kumar K.V
        }
53 fc22118d Aneesh Kumar K.V
    }
54 fc22118d Aneesh Kumar K.V
    if (!value) {
55 fc22118d Aneesh Kumar K.V
        return name_size;
56 fc22118d Aneesh Kumar K.V
    }
57 fc22118d Aneesh Kumar K.V
58 fc22118d Aneesh Kumar K.V
    if (size < name_size) {
59 fc22118d Aneesh Kumar K.V
        errno = ERANGE;
60 fc22118d Aneesh Kumar K.V
        return -1;
61 fc22118d Aneesh Kumar K.V
    }
62 fc22118d Aneesh Kumar K.V
63 fc22118d Aneesh Kumar K.V
    strncpy(value, name, name_size);
64 fc22118d Aneesh Kumar K.V
    return name_size;
65 fc22118d Aneesh Kumar K.V
}
66 fc22118d Aneesh Kumar K.V
67 fc22118d Aneesh Kumar K.V
static int mp_user_setxattr(FsContext *ctx, const char *path, const char *name,
68 fc22118d Aneesh Kumar K.V
                            void *value, size_t size, int flags)
69 fc22118d Aneesh Kumar K.V
{
70 fc22118d Aneesh Kumar K.V
    if (strncmp(name, "user.virtfs.", 12) == 0) {
71 fc22118d Aneesh Kumar K.V
        /*
72 fc22118d Aneesh Kumar K.V
         * Don't allow fetch of user.virtfs namesapce
73 fc22118d Aneesh Kumar K.V
         * in case of mapped security
74 fc22118d Aneesh Kumar K.V
         */
75 fc22118d Aneesh Kumar K.V
        errno = EACCES;
76 fc22118d Aneesh Kumar K.V
        return -1;
77 fc22118d Aneesh Kumar K.V
    }
78 fc22118d Aneesh Kumar K.V
    return lsetxattr(rpath(ctx, path), name, value, size, flags);
79 fc22118d Aneesh Kumar K.V
}
80 fc22118d Aneesh Kumar K.V
81 fc22118d Aneesh Kumar K.V
static int mp_user_removexattr(FsContext *ctx,
82 fc22118d Aneesh Kumar K.V
                               const char *path, const char *name)
83 fc22118d Aneesh Kumar K.V
{
84 fc22118d Aneesh Kumar K.V
    if (strncmp(name, "user.virtfs.", 12) == 0) {
85 fc22118d Aneesh Kumar K.V
        /*
86 fc22118d Aneesh Kumar K.V
         * Don't allow fetch of user.virtfs namesapce
87 fc22118d Aneesh Kumar K.V
         * in case of mapped security
88 fc22118d Aneesh Kumar K.V
         */
89 fc22118d Aneesh Kumar K.V
        errno = EACCES;
90 fc22118d Aneesh Kumar K.V
        return -1;
91 fc22118d Aneesh Kumar K.V
    }
92 fc22118d Aneesh Kumar K.V
    return lremovexattr(rpath(ctx, path), name);
93 fc22118d Aneesh Kumar K.V
}
94 fc22118d Aneesh Kumar K.V
95 fc22118d Aneesh Kumar K.V
XattrOperations mapped_user_xattr = {
96 fc22118d Aneesh Kumar K.V
    .name = "user.",
97 fc22118d Aneesh Kumar K.V
    .getxattr = mp_user_getxattr,
98 fc22118d Aneesh Kumar K.V
    .setxattr = mp_user_setxattr,
99 fc22118d Aneesh Kumar K.V
    .listxattr = mp_user_listxattr,
100 fc22118d Aneesh Kumar K.V
    .removexattr = mp_user_removexattr,
101 fc22118d Aneesh Kumar K.V
};
102 fc22118d Aneesh Kumar K.V
103 fc22118d Aneesh Kumar K.V
XattrOperations passthrough_user_xattr = {
104 fc22118d Aneesh Kumar K.V
    .name = "user.",
105 fc22118d Aneesh Kumar K.V
    .getxattr = pt_getxattr,
106 fc22118d Aneesh Kumar K.V
    .setxattr = pt_setxattr,
107 fc22118d Aneesh Kumar K.V
    .listxattr = pt_listxattr,
108 fc22118d Aneesh Kumar K.V
    .removexattr = pt_removexattr,
109 fc22118d Aneesh Kumar K.V
};