SYSCALL_CLONE = 67,
SYSCALL_GETTID = 68,
+
+ SYSCALL_FSYNC = 69,
+ SYSCALL_FDATASYNC = 70,
+ SYSCALL_SIGPENDING = 71,
+ SYSCALL_PREAD = 72,
+ SYSCALL_PWRITE = 73,
+ SYSCALL_ACCESS = 74,
+ SYSCALL_UMASK = 75,
+ SYSCALL_SETUID = 76,
+ SYSCALL_SETGID = 77,
};
#endif
return;
}
+ if (syscall_no == SYSCALL_FSYNC || syscall_no == SYSCALL_FDATASYNC) {
+ int fd = (int)regs->ebx;
+ if (!current_process || fd < 0 || fd >= PROCESS_MAX_FILES || !current_process->files[fd]) {
+ regs->eax = (uint32_t)-EBADF;
+ } else {
+ regs->eax = 0;
+ }
+ return;
+ }
+
/* ---- Socket syscalls ---- */
socket_syscall_dispatch(regs, syscall_no);
/* If socket dispatch handled it, eax is set and we return.
SYS_SET_THREAD_AREA = 57,
SYS_CLONE = 67,
SYS_GETTID = 68,
+ SYS_FSYNC = 69,
+ SYS_FDATASYNC = 70,
};
/* Raw syscall wrappers — up to 5 args via INT 0x80 */
int setpgid(int pid, int pgid);
int getpgrp(void);
int gettid(void);
+int fsync(int fd);
+int fdatasync(int fd);
void* brk(void* addr);
void _exit(int status) __attribute__((noreturn));
return _syscall0(SYS_GETTID);
}
+int fsync(int fd) {
+ return __syscall_ret(_syscall1(SYS_FSYNC, fd));
+}
+
+int fdatasync(int fd) {
+ return __syscall_ret(_syscall1(SYS_FDATASYNC, fd));
+}
+
void* brk(void* addr) {
return (void*)_syscall1(SYS_BRK, (int)addr);
}