+ vfree((void*)name.value);
+ return DO_STATUS(errno);
+}
+
+__DEFINE_LXSYSCALL2(int, fstat, int, fd, struct file_stat*, stat)
+{
+ int errno = 0;
+ struct v_fd* fds;
+
+ if ((errno = vfs_getfd(fd, &fds))) {
+ goto done;
+ }
+
+ struct v_inode* vino = fds->file->inode;
+ struct device* fdev = vino->sb->dev;
+
+ *stat = (struct file_stat){ .st_ino = vino->id,
+ .st_blocks = vino->lb_usage,
+ .st_size = vino->fsize,
+ .mode = vino->itype,
+ .st_ioblksize = PG_SIZE,
+ .st_blksize = vino->sb->blksize };
+
+ if (VFS_DEVFILE(vino->itype)) {
+ struct device* rdev = (struct device*)vino->data;
+ if (!rdev || rdev->magic != DEV_STRUCT_MAGIC) {
+ errno = EINVAL;
+ goto done;
+ }
+
+ stat->st_rdev = (dev_t){ .meta = rdev->class->meta,
+ .devident = device_id_from_class(rdev->class),
+ .dev_uid = rdev->dev_uid };
+ }
+
+ if (fdev) {
+ u32_t devident = device_id_from_class(fdev->class);
+ stat->st_dev = (dev_t){ .meta = fdev->class->meta,
+ .devident = devident,
+ .dev_uid = fdev->dev_uid };
+ }
+
+done: