1 use core::{mem, slice};
2 
3 use data::*;
4 use error::*;
5 use number::*;
6 
7 pub trait Scheme {
handle(&self, packet: &mut Packet)8     fn handle(&self, packet: &mut Packet) {
9         let res = match packet.a {
10             SYS_OPEN => self.open(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.d, packet.uid, packet.gid),
11             SYS_CHMOD => self.chmod(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.d as u16, packet.uid, packet.gid),
12             SYS_RMDIR => self.rmdir(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.uid, packet.gid),
13             SYS_UNLINK => self.unlink(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.uid, packet.gid),
14 
15             SYS_DUP => self.dup(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }),
16             SYS_READ => self.read(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }),
17             SYS_WRITE => self.write(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }),
18             SYS_LSEEK => self.seek(packet.b, packet.c, packet.d),
19             SYS_FCHMOD => self.fchmod(packet.b, packet.c as u16),
20             SYS_FCHOWN => self.fchown(packet.b, packet.c as u32, packet.d as u32),
21             SYS_FCNTL => self.fcntl(packet.b, packet.c, packet.d),
22             SYS_FEVENT => self.fevent(packet.b, packet.c),
23             SYS_FMAP => if packet.d >= mem::size_of::<Map>() {
24                 self.fmap(packet.b, unsafe { &*(packet.c as *const Map) })
25             } else {
26                 Err(Error::new(EFAULT))
27             },
28             SYS_FUNMAP => self.funmap(packet.b),
29             SYS_FPATH => self.fpath(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }),
30             SYS_FRENAME => self.frename(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }, packet.uid, packet.gid),
31             SYS_FSTAT => if packet.d >= mem::size_of::<Stat>() {
32                 self.fstat(packet.b, unsafe { &mut *(packet.c as *mut Stat) })
33             } else {
34                 Err(Error::new(EFAULT))
35             },
36             SYS_FSTATVFS => if packet.d >= mem::size_of::<StatVfs>() {
37                 self.fstatvfs(packet.b, unsafe { &mut *(packet.c as *mut StatVfs) })
38             } else {
39                 Err(Error::new(EFAULT))
40             },
41             SYS_FSYNC => self.fsync(packet.b),
42             SYS_FTRUNCATE => self.ftruncate(packet.b, packet.c),
43             SYS_FUTIMENS => if packet.d >= mem::size_of::<TimeSpec>() {
44                 self.futimens(packet.b, unsafe { slice::from_raw_parts(packet.c as *const TimeSpec, packet.d / mem::size_of::<TimeSpec>()) })
45             } else {
46                 Err(Error::new(EFAULT))
47             },
48             SYS_CLOSE => self.close(packet.b),
49             _ => Err(Error::new(ENOSYS))
50         };
51 
52         packet.a = Error::mux(res);
53     }
54 
55     /* Scheme operations */
56 
57     #[allow(unused_variables)]
open(&self, path: &[u8], flags: usize, uid: u32, gid: u32) -> Result<usize>58     fn open(&self, path: &[u8], flags: usize, uid: u32, gid: u32) -> Result<usize> {
59         Err(Error::new(ENOENT))
60     }
61 
62     #[allow(unused_variables)]
chmod(&self, path: &[u8], mode: u16, uid: u32, gid: u32) -> Result<usize>63     fn chmod(&self, path: &[u8], mode: u16, uid: u32, gid: u32) -> Result<usize> {
64         Err(Error::new(ENOENT))
65     }
66 
67     #[allow(unused_variables)]
rmdir(&self, path: &[u8], uid: u32, gid: u32) -> Result<usize>68     fn rmdir(&self, path: &[u8], uid: u32, gid: u32) -> Result<usize> {
69         Err(Error::new(ENOENT))
70     }
71 
72     #[allow(unused_variables)]
unlink(&self, path: &[u8], uid: u32, gid: u32) -> Result<usize>73     fn unlink(&self, path: &[u8], uid: u32, gid: u32) -> Result<usize> {
74         Err(Error::new(ENOENT))
75     }
76 
77     /* Resource operations */
78     #[allow(unused_variables)]
dup(&self, old_id: usize, buf: &[u8]) -> Result<usize>79     fn dup(&self, old_id: usize, buf: &[u8]) -> Result<usize> {
80         Err(Error::new(EBADF))
81     }
82 
83     #[allow(unused_variables)]
read(&self, id: usize, buf: &mut [u8]) -> Result<usize>84     fn read(&self, id: usize, buf: &mut [u8]) -> Result<usize> {
85         Err(Error::new(EBADF))
86     }
87 
88     #[allow(unused_variables)]
write(&self, id: usize, buf: &[u8]) -> Result<usize>89     fn write(&self, id: usize, buf: &[u8]) -> Result<usize> {
90         Err(Error::new(EBADF))
91     }
92 
93     #[allow(unused_variables)]
seek(&self, id: usize, pos: usize, whence: usize) -> Result<usize>94     fn seek(&self, id: usize, pos: usize, whence: usize) -> Result<usize> {
95         Err(Error::new(EBADF))
96     }
97 
98     #[allow(unused_variables)]
fchmod(&self, id: usize, mode: u16) -> Result<usize>99     fn fchmod(&self, id: usize, mode: u16) -> Result<usize> {
100         Err(Error::new(EBADF))
101     }
102 
103     #[allow(unused_variables)]
fchown(&self, id: usize, uid: u32, gid: u32) -> Result<usize>104     fn fchown(&self, id: usize, uid: u32, gid: u32) -> Result<usize> {
105         Err(Error::new(EBADF))
106     }
107 
108     #[allow(unused_variables)]
fcntl(&self, id: usize, cmd: usize, arg: usize) -> Result<usize>109     fn fcntl(&self, id: usize, cmd: usize, arg: usize) -> Result<usize> {
110         Err(Error::new(EBADF))
111     }
112 
113     #[allow(unused_variables)]
fevent(&self, id: usize, flags: usize) -> Result<usize>114     fn fevent(&self, id: usize, flags: usize) -> Result<usize> {
115         Err(Error::new(EBADF))
116     }
117 
118     #[allow(unused_variables)]
fmap(&self, id: usize, map: &Map) -> Result<usize>119     fn fmap(&self, id: usize, map: &Map) -> Result<usize> {
120         Err(Error::new(EBADF))
121     }
122 
123     #[allow(unused_variables)]
funmap(&self, address: usize) -> Result<usize>124     fn funmap(&self, address: usize) -> Result<usize> {
125         Err(Error::new(EBADF))
126     }
127 
128     #[allow(unused_variables)]
fpath(&self, id: usize, buf: &mut [u8]) -> Result<usize>129     fn fpath(&self, id: usize, buf: &mut [u8]) -> Result<usize> {
130         Err(Error::new(EBADF))
131     }
132 
133     #[allow(unused_variables)]
frename(&self, id: usize, path: &[u8], uid: u32, gid: u32) -> Result<usize>134     fn frename(&self, id: usize, path: &[u8], uid: u32, gid: u32) -> Result<usize> {
135         Err(Error::new(EBADF))
136     }
137 
138     #[allow(unused_variables)]
fstat(&self, id: usize, stat: &mut Stat) -> Result<usize>139     fn fstat(&self, id: usize, stat: &mut Stat) -> Result<usize> {
140         Err(Error::new(EBADF))
141     }
142 
143     #[allow(unused_variables)]
fstatvfs(&self, id: usize, stat: &mut StatVfs) -> Result<usize>144     fn fstatvfs(&self, id: usize, stat: &mut StatVfs) -> Result<usize> {
145         Err(Error::new(EBADF))
146     }
147 
148     #[allow(unused_variables)]
fsync(&self, id: usize) -> Result<usize>149     fn fsync(&self, id: usize) -> Result<usize> {
150         Err(Error::new(EBADF))
151     }
152 
153     #[allow(unused_variables)]
ftruncate(&self, id: usize, len: usize) -> Result<usize>154     fn ftruncate(&self, id: usize, len: usize) -> Result<usize> {
155         Err(Error::new(EBADF))
156     }
157 
158     #[allow(unused_variables)]
futimens(&self, id: usize, times: &[TimeSpec]) -> Result<usize>159     fn futimens(&self, id: usize, times: &[TimeSpec]) -> Result<usize> {
160         Err(Error::new(EBADF))
161     }
162 
163     #[allow(unused_variables)]
close(&self, id: usize) -> Result<usize>164     fn close(&self, id: usize) -> Result<usize> {
165         Err(Error::new(EBADF))
166     }
167 }
168