MCPcopy Create free account
hub / github.com/LibertyOS-Development/kernel / write

Method write

src/fs/file.rs:207–271  ·  view source on GitHub ↗

Write

(&mut self, buffer: &[u8])

Source from the content-addressed store, hash-verified

205
206 // Write
207 fn write(&mut self, buffer: &[u8]) -> Result<usize, ()>
208 {
209 let bufferlen = buffer.len();
210 let mut address = self.address;
211 let mut bytes = 0;
212 let mut pos = 0;
213 while bytes < bufferlen
214 {
215 let mut blk = LinkBlk::read(address);
216 let data = blk.datamut();
217 let datalen = data.len();
218 for i in 0..datalen
219 {
220 if pos == self.offset
221 {
222 if bytes == bufferlen
223 {
224 break;
225 }
226 data[i] = buffer[bytes];
227 bytes += 1;
228 self.offset += 1;
229 }
230 pos += 1;
231 }
232
233 address = match blk.next()
234 {
235 Some(nextblk) =>
236 {
237 if bytes < bufferlen
238 {
239 nextblk.address()
240 }
241 else
242 {
243 0
244 }
245 }
246
247 None =>
248 {
249 if bytes < bufferlen
250 {
251 match LinkBlk::alloc()
252 {
253 Some(nextblk) => nextblk.address(),
254 None => return Err(()),
255 }
256 }
257 else
258 {
259 0
260 }
261 }
262 };
263
264 blk.set_next_address(address);

Callers

nothing calls this directly

Calls 8

datamutMethod · 0.80
set_next_addressMethod · 0.80
item_updateMethod · 0.80
readFunction · 0.70
ErrEnum · 0.50
lenMethod · 0.45
nextMethod · 0.45
addressMethod · 0.45

Tested by

no test coverage detected