blob: 7dfc2f71ee09532dc2b13fb6461929a4ce9df7bf [file] [log] [blame]
// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef LIB_FDIO_VFS_H_
#define LIB_FDIO_VFS_H_
#include <zircon/compiler.h>
#include <zircon/listnode.h>
#include <zircon/processargs.h>
#include <zircon/types.h>
#include <stdio.h>
#include <unistd.h> // ssize_t
__BEGIN_CDECLS
// On Fuchsia, the Block Device is transmitted by file descriptor, rather than
// by path. This can prevent some racy behavior relating to FS start-up.
#ifdef __Fuchsia__
#define FS_HANDLE_ROOT_ID PA_HND(PA_USER0, 0)
#define FS_HANDLE_BLOCK_DEVICE_ID PA_HND(PA_USER0, 1)
#endif
// POSIX defines st_blocks to be the number of 512 byte blocks allocated
// to the file. The "blkcnt" field of vnattr attempts to accomplish
// this same goal, but by indirecting through VNATTR_BLKSIZE, we
// reserve the right to change this "block size unit" (which is distinct from
// "blksize", because POSIX) whenever we want.
#define VNATTR_BLKSIZE 512
typedef struct vnattr {
uint32_t valid; // mask of which bits to set for setattr
uint32_t mode;
uint64_t inode;
uint64_t size;
uint64_t blksize; // Block size for filesystem I/O
uint64_t blkcount; // Number of VNATTR_BLKSIZE byte blocks allocated
uint64_t nlink;
uint64_t create_time; // posix time (seconds since epoch)
uint64_t modify_time; // posix time
} vnattr_t;
// mask that identifies what fields to set in setattr
#define ATTR_CTIME 0000001
#define ATTR_MTIME 0000002
#define ATTR_ATIME 0000004 // not yet implemented
// bits compatible with POSIX stat
#define V_TYPE_MASK 0170000
#define V_TYPE_SOCK 0140000
#define V_TYPE_LINK 0120000
#define V_TYPE_FILE 0100000
#define V_TYPE_BDEV 0060000
#define V_TYPE_DIR 0040000
#define V_TYPE_CDEV 0020000
#define V_TYPE_PIPE 0010000
#define V_ISUID 0004000
#define V_ISGID 0002000
#define V_ISVTX 0001000
#define V_IRWXU 0000700
#define V_IRUSR 0000400
#define V_IWUSR 0000200
#define V_IXUSR 0000100
#define V_IRWXG 0000070
#define V_IRGRP 0000040
#define V_IWGRP 0000020
#define V_IXGRP 0000010
#define V_IRWXO 0000007
#define V_IROTH 0000004
#define V_IWOTH 0000002
#define V_IXOTH 0000001
#define VTYPE_TO_DTYPE(mode) (((mode)&V_TYPE_MASK) >> 12)
#define DTYPE_TO_VTYPE(type) (((type)&15) << 12)
typedef struct vdirent {
uint64_t ino;
uint8_t size;
uint8_t type;
char name[0];
} __PACKED vdirent_t;
__END_CDECLS
#endif // LIB_FDIO_VFS_H_