#include <dirent.h>
+#include <round.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#undef halt
#undef exit
#undef exec
-#undef join
+#undef wait
#undef create
#undef remove
#undef open
}
int
-pintos_join (pid_t child)
+pintos_wait (pid_t child)
{
int status = 0;
waitpid (child, &status, 0);
int
pintos_filesize (int fd)
{
- off_t old = lseek (fd, 0, SEEK_CUR);
- off_t size = lseek (fd, 0, SEEK_END);
- lseek (fd, old, SEEK_SET);
- return size;
+ struct stat s;
+ fstat (fd, &s);
+ return s.st_size;
}
int
close (fd);
}
-bool
-pintos_mmap (int fd, void *addr, unsigned length)
+mapid_t
+pintos_mmap (int fd, void *addr)
{
- return mmap (addr, length, PROT_READ | PROT_WRITE,
- MAP_SHARED | MAP_FIXED, fd, 0) == addr;
+ size_t page_size = getpagesize ();
+ int length = pintos_filesize (fd);
+ uintptr_t ptr = (uintptr_t) mmap (addr, length, PROT_READ | PROT_WRITE,
+ MAP_SHARED | MAP_FIXED, fd, 0);
+ return ptr | DIV_ROUND_UP (size, page_size);
}
bool
pintos_munmap (void *addr, unsigned length)
{
- return munmap (addr, length) == 0;
+ size_t page_size = getpagesize ();
+ uintptr_t page_mask = page_size - 1;
+ void *base = (void *) ((uintptr_t) addr & ~page_mask);
+ size_t length = ((uintptr_t) addr & page_mask) * page_size;
+ return munmap (base, length);
}
bool