vfs: Remove KFS, blockdev and devfs
[akaros.git] / kern / src / ns / convM2kdirent.c
1 /* Copyright (c) 2013-2018 Google Inc
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * Ron Minnich <rminnich@google.com>
4  *
5  * See LICENSE for details.  */
6
7 #include <vfs.h>
8 #include <slab.h>
9 #include <kmalloc.h>
10 #include <kref.h>
11 #include <string.h>
12 #include <stdio.h>
13 #include <assert.h>
14 #include <error.h>
15 #include <cpio.h>
16 #include <pmap.h>
17 #include <smp.h>
18 #include <net/ip.h>
19
20 /* Special akaros edition. */
21 unsigned int convM2kdirent(uint8_t * buf, unsigned int nbuf, struct kdirent *kd,
22                                                    char *strs)
23 {
24         struct dir *dir;
25         size_t conv_sz, name_sz;
26
27         if (nbuf < STAT_FIX_LEN_9P)
28                 return 0;
29         dir = kmalloc(sizeof(struct dir) + nbuf, MEM_WAIT);
30         conv_sz = convM2D(buf, nbuf, dir, (char*)&dir[1]);
31
32         kd->d_ino = dir->qid.path;
33         kd->d_off = 0;          /* ignored for 9ns readdir */
34         kd->d_type = 0;         /* TODO: might need this; never used this in the VFS */
35         name_sz = dir->name ? strlen(dir->name) : 0;
36         kd->d_reclen = name_sz;
37         /* Our caller should have made sure kd was big enough... */
38         memcpy(kd->d_name, dir->name, name_sz);
39         kd->d_name[name_sz] = 0;
40
41         kfree(dir);
42         return conv_sz;
43 }
44
45 static int mode_9ns_to_posix(int mode_9ns)
46 {
47         int mode_posix = 0;
48
49         if (mode_9ns & DMDIR)
50                 mode_posix |= __S_IFDIR;
51         else if (mode_9ns & DMSYMLINK)
52                 mode_posix |= __S_IFLNK;
53         else
54                 mode_posix |= __S_IFREG;
55         if (mode_9ns & DMREADABLE)
56                 mode_posix |= __S_READABLE;
57         if (mode_9ns & DMWRITABLE)
58                 mode_posix |= __S_WRITABLE;
59         mode_posix |= mode_9ns & 0777;
60         return mode_posix;
61 }
62
63 unsigned int convM2kstat(uint8_t * buf, unsigned int nbuf, struct kstat *ks)
64 {
65         struct dir *dir;
66         size_t conv_sz, name_sz;
67
68         if (nbuf < STAT_FIX_LEN_9P)
69                 return 0;
70         dir = kmalloc(sizeof(struct dir) + nbuf, MEM_WAIT);
71         conv_sz = convM2D(buf, nbuf, dir, (char*)&dir[1]);
72
73         ks->st_dev = dir->type;
74         ks->st_ino = dir->qid.path;
75         ks->st_mode = mode_9ns_to_posix(dir->mode);
76         ks->st_nlink = dir->mode & DMDIR ? 2 : 1;
77         ks->st_uid = dir->n_uid;
78         ks->st_gid = dir->n_gid;
79         ks->st_rdev = dir->dev;
80         ks->st_size = dir->length;
81         ks->st_blksize = 1;
82         ks->st_blocks = dir->length;
83         ks->st_atim = dir->atime;
84         ks->st_mtim = dir->mtime;
85         ks->st_ctim = dir->ctime;
86
87         kfree(dir);
88         return conv_sz;
89 }