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