qemu/tools/virtiofsd/passthrough_helpers.h
<<
>>
Prefs
   1/*
   2 * FUSE: Filesystem in Userspace
   3 *
   4 * Redistribution and use in source and binary forms, with or without
   5 * modification, are permitted provided that the following conditions
   6 * are met:
   7 * 1. Redistributions of source code must retain the above copyright
   8 *    notice, this list of conditions and the following disclaimer.
   9 * 2. Redistributions in binary form must reproduce the above copyright
  10 *    notice, this list of conditions and the following disclaimer in the
  11 *    documentation and/or other materials provided with the distribution.
  12 *
  13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  23 * SUCH DAMAGE
  24 */
  25
  26/*
  27 * Creates files on the underlying file system in response to a FUSE_MKNOD
  28 * operation
  29 */
  30static int mknod_wrapper(int dirfd, const char *path, const char *link,
  31                         int mode, dev_t rdev)
  32{
  33    int res;
  34
  35    if (S_ISREG(mode)) {
  36        res = openat(dirfd, path, O_CREAT | O_EXCL | O_WRONLY, mode);
  37        if (res >= 0) {
  38            res = close(res);
  39        }
  40    } else if (S_ISDIR(mode)) {
  41        res = mkdirat(dirfd, path, mode);
  42    } else if (S_ISLNK(mode) && link != NULL) {
  43        res = symlinkat(link, dirfd, path);
  44    } else if (S_ISFIFO(mode)) {
  45        res = mkfifoat(dirfd, path, mode);
  46    } else {
  47        res = mknodat(dirfd, path, mode, rdev);
  48    }
  49
  50    return res;
  51}
  52