Statistics
| Branch: | Revision:

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

History | View | Annotate | Download (2.9 kB)

1
/*
2
 * Virtio 9p user. xattr callback
3
 *
4
 * Copyright IBM, Corp. 2010
5
 *
6
 * Authors:
7
 * Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
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>
15
#include "hw/virtio.h"
16
#include "virtio-9p.h"
17
#include "fsdev/file-op-9p.h"
18
#include "virtio-9p-xattr.h"
19

    
20

    
21
static ssize_t mp_user_getxattr(FsContext *ctx, const char *path,
22
                                const char *name, void *value, size_t size)
23
{
24
    char buffer[PATH_MAX];
25
    if (strncmp(name, "user.virtfs.", 12) == 0) {
26
        /*
27
         * Don't allow fetch of user.virtfs namesapce
28
         * in case of mapped security
29
         */
30
        errno = ENOATTR;
31
        return -1;
32
    }
33
    return lgetxattr(rpath(ctx, path, buffer), name, value, size);
34
}
35

    
36
static ssize_t mp_user_listxattr(FsContext *ctx, const char *path,
37
                                 char *name, void *value, size_t size)
38
{
39
    int name_size = strlen(name) + 1;
40
    if (strncmp(name, "user.virtfs.", 12) == 0) {
41

    
42
        /*  check if it is a mapped posix acl */
43
        if (strncmp(name, "user.virtfs.system.posix_acl_", 29) == 0) {
44
            /* adjust the name and size */
45
            name += 12;
46
            name_size -= 12;
47
        } else {
48
            /*
49
             * Don't allow fetch of user.virtfs namesapce
50
             * in case of mapped security
51
             */
52
            return 0;
53
        }
54
    }
55
    if (!value) {
56
        return name_size;
57
    }
58

    
59
    if (size < name_size) {
60
        errno = ERANGE;
61
        return -1;
62
    }
63

    
64
    strncpy(value, name, name_size);
65
    return name_size;
66
}
67

    
68
static int mp_user_setxattr(FsContext *ctx, const char *path, const char *name,
69
                            void *value, size_t size, int flags)
70
{
71
    char buffer[PATH_MAX];
72
    if (strncmp(name, "user.virtfs.", 12) == 0) {
73
        /*
74
         * Don't allow fetch of user.virtfs namesapce
75
         * in case of mapped security
76
         */
77
        errno = EACCES;
78
        return -1;
79
    }
80
    return lsetxattr(rpath(ctx, path, buffer), name, value, size, flags);
81
}
82

    
83
static int mp_user_removexattr(FsContext *ctx,
84
                               const char *path, const char *name)
85
{
86
    char buffer[PATH_MAX];
87
    if (strncmp(name, "user.virtfs.", 12) == 0) {
88
        /*
89
         * Don't allow fetch of user.virtfs namesapce
90
         * in case of mapped security
91
         */
92
        errno = EACCES;
93
        return -1;
94
    }
95
    return lremovexattr(rpath(ctx, path, buffer), name);
96
}
97

    
98
XattrOperations mapped_user_xattr = {
99
    .name = "user.",
100
    .getxattr = mp_user_getxattr,
101
    .setxattr = mp_user_setxattr,
102
    .listxattr = mp_user_listxattr,
103
    .removexattr = mp_user_removexattr,
104
};
105

    
106
XattrOperations passthrough_user_xattr = {
107
    .name = "user.",
108
    .getxattr = pt_getxattr,
109
    .setxattr = pt_setxattr,
110
    .listxattr = pt_listxattr,
111
    .removexattr = pt_removexattr,
112
};