| #include <sys/stat.h> |
| #include <fcntl.h> |
| #include <stdio.h> |
| #include <syscall_server.h> |
| |
| void translate_stat(struct stat* native, struct newlib_stat* newlib) { |
| newlib->st_dev = native->st_dev; |
| newlib->st_ino = native->st_ino; |
| newlib->st_mode = native->st_mode; |
| newlib->st_nlink = native->st_nlink; |
| newlib->st_uid = native->st_uid; |
| newlib->st_gid = native->st_gid; |
| newlib->st_rdev = native->st_rdev; |
| newlib->st_size = native->st_size; |
| newlib->st_atim = native->st_atim.tv_nsec; |
| newlib->st_mtim = native->st_mtim.tv_nsec; |
| newlib->st_ctim = native->st_ctim.tv_nsec; |
| newlib->st_blksize = native->st_blksize; |
| newlib->st_blocks = native->st_blocks; |
| } |
| int translate_flags(int newlib_flags) { |
| int native_flags = 0; |
| if (newlib_flags & NEWLIB_O_RDONLY) { |
| native_flags |= O_RDONLY; |
| newlib_flags &= ~NEWLIB_O_RDONLY; |
| } |
| if (newlib_flags & NEWLIB_O_WRONLY) { |
| native_flags |= O_WRONLY; |
| newlib_flags &= ~NEWLIB_O_WRONLY; |
| } |
| if (newlib_flags & NEWLIB_O_RDWR) { |
| native_flags |= O_RDWR; |
| newlib_flags &= ~NEWLIB_O_RDWR; |
| } |
| if (newlib_flags & NEWLIB_O_APPEND) { |
| native_flags |= O_APPEND; |
| newlib_flags &= ~NEWLIB_O_APPEND; |
| } |
| if (newlib_flags & NEWLIB_O_CREAT) { |
| native_flags |= O_CREAT; |
| newlib_flags &= ~NEWLIB_O_CREAT; |
| } |
| if (newlib_flags & NEWLIB_O_TRUNC) { |
| native_flags |= O_TRUNC; |
| newlib_flags &= ~NEWLIB_O_TRUNC; |
| } |
| if (newlib_flags & NEWLIB_O_EXCL) { |
| native_flags |= O_EXCL; |
| newlib_flags &= ~NEWLIB_O_EXCL; |
| } |
| if(newlib_flags != 0) |
| fprintf(stderr, "Warning: unsupported newlib flags passed to syscall...\n"); |
| return native_flags; |
| } |
| int translate_mode(int newlib_mode) { |
| int native_mode = 0; |
| if (newlib_mode & NEWLIB_S_IRUSR) { |
| native_mode |= S_IRUSR; |
| newlib_mode &= ~NEWLIB_S_IRUSR; |
| } |
| if (newlib_mode & NEWLIB_S_IWUSR) { |
| native_mode |= S_IWUSR; |
| newlib_mode &= ~NEWLIB_S_IWUSR; |
| } |
| if (newlib_mode & NEWLIB_S_IXUSR) { |
| native_mode |= S_IXUSR; |
| newlib_mode &= ~NEWLIB_S_IXUSR; |
| } |
| if (newlib_mode & NEWLIB_S_IRGRP) { |
| native_mode |= S_IRGRP; |
| newlib_mode &= ~NEWLIB_S_IRGRP; |
| } |
| if (newlib_mode & NEWLIB_S_IWGRP) { |
| native_mode |= S_IWGRP; |
| newlib_mode &= ~NEWLIB_S_IWGRP; |
| } |
| if (newlib_mode & NEWLIB_S_IXGRP) { |
| native_mode |= S_IXGRP; |
| newlib_mode &= ~NEWLIB_S_IXGRP; |
| } |
| if (newlib_mode & NEWLIB_S_IROTH) { |
| native_mode |= S_IROTH; |
| newlib_mode &= ~NEWLIB_S_IROTH; |
| } |
| if (newlib_mode & NEWLIB_S_IWOTH) { |
| native_mode |= S_IWOTH; |
| newlib_mode &= ~NEWLIB_S_IWOTH; |
| } |
| if (newlib_mode & NEWLIB_S_IXOTH) { |
| native_mode |= S_IXOTH; |
| newlib_mode &= ~NEWLIB_S_IXOTH; |
| } |
| if(newlib_mode != 0) |
| fprintf(stderr, "Warning: unsupported newlib mode passed to syscall...\n"); |
| return native_mode; |
| } |
| int translate_whence(int newlib_whence) { |
| int native_whence = 0; |
| if (newlib_whence == NEWLIB_SEEK_SET) |
| native_whence = SEEK_SET; |
| else if (newlib_whence == NEWLIB_SEEK_CUR) |
| native_whence = SEEK_CUR; |
| else if (newlib_whence == NEWLIB_SEEK_END) |
| native_whence = SEEK_END; |
| return native_whence; |
| } |