clean up code, verify it behaves the same as emscripten with js

This commit is contained in:
Mark McCaskey
2019-05-28 10:06:22 -07:00
parent fc15bc58f6
commit 3a4517d5d6

View File

@ -815,70 +815,33 @@ pub fn ___syscall220(ctx: &mut Ctx, _which: i32, mut varargs: VarArgs) -> i32 {
let dirp_addr: i32 = varargs.get(ctx); let dirp_addr: i32 = varargs.get(ctx);
let count: u32 = varargs.get(ctx); let count: u32 = varargs.get(ctx);
//let dir = dbg!(emscripten_memory_pointer!(ctx.memory(0), dbg!(fd)) as *mut libc::DIR);
let dirp = emscripten_memory_pointer!(ctx.memory(0), dirp_addr) as *mut u8; let dirp = emscripten_memory_pointer!(ctx.memory(0), dirp_addr) as *mut u8;
let mut pos = 0;
// need to persist stream across calls? // need to persist stream across calls?
let dir: *mut libc::DIR = unsafe { libc::fdopendir(fd) }; let dir: *mut libc::DIR = unsafe { libc::fdopendir(fd) };
dbg!("Start loop"); let mut pos = 0;
while pos + 280 <= dbg!(count) as usize { let offset = 280;
dbg!("Pre readdir"); while pos + offset <= count as usize {
let dirent = unsafe { readdir(dir) }; let dirent = unsafe { readdir(dir) };
dbg!("post readdir");
if dirent.is_null() { if dirent.is_null() {
break; break;
} }
dbg!("dirent is not null");
unsafe { unsafe {
*(dirp.add(pos) as *mut u64) = dbg!((*dirent).d_ino); *(dirp.add(pos) as *mut u64) = (*dirent).d_ino;
#[cfg(not(target_os = "macos"))] *(dirp.add(pos + 8) as *mut u64) = pos as u64 + offset as u64;
{ *(dirp.add(pos + 16) as *mut u16) = offset as u16;
*(dirp.add(pos + 8) as *mut u64) = 280 //dbg!((*dirent).d_off); *(dirp.add(pos + 18) as *mut u8) = (*dirent).d_type;
} let upper_bound = std::cmp::min((*dirent).d_reclen, 254) as usize;
#[cfg(target_os = "macos")]
{
*(dirp.add(pos + 8) as *mut u64) = if pos + 280 > count as usize {
count.into()
} else {
dbg!((*dirent).d_seekoff);
pos as u64 + 56 //280
}; //;
}
dbg!((*dirent).d_namlen);
*(dirp.add(pos + 16) as *mut u16) = 280; //dbg!((*dirent).d_reclen);
*(dirp.add(pos + 18) as *mut u8) = dbg!((*dirent).d_type);
let upper_bound = std::cmp::min((*dirent).d_reclen, 255) as usize;
let mut i = 0; let mut i = 0;
while i < upper_bound { while i < upper_bound {
*(dirp.add(pos + 19 + i) as *mut i8) = (*dirent).d_name[i]; *(dirp.add(pos + 19 + i) as *mut i8) = (*dirent).d_name[i];
//dbg!((*dirent).d_name[i] as u8 as char);
//dbg!((*dirent).d_name[i] as u8 as char);
i += 1; i += 1;
} }
*(dirp.add(pos + 19 + i) as *mut i8) = 0 as i8; *(dirp.add(pos + 19 + i) as *mut i8) = 0 as i8;
} }
dbg!("dirent written to memory"); pos += offset;
pos += 280;
/*unsafe {
eprintln!(
"{}",
std::ffi::CStr::from_bytes_with_nul_unchecked({
let arr = *(dirent as *const u8 as *const [u8; 256]);
&arr.to_vec()
.into_iter()
.map(|b| b as u8)
.collect::<Vec<u8>>()[..20]
})
.to_str()
.unwrap()
);
}*/
} }
pos as i32
dbg!(pos as i32)
} }
/// fallocate /// fallocate