}
int openat(int dirfd, const char *path, int flags, ...) {
- return _check(_sc3(SYS_OPENAT, dirfd, (int)path, flags));
+ va_list ap;
+ va_start(ap, flags);
+ int mode = va_arg(ap, int);
+ va_end(ap);
+ return _check(_sc4(SYS_OPENAT, dirfd, (int)path, flags, mode));
}
int fstatat(int dirfd, const char *path, struct stat *buf, int flags) {
return cur;
}
+int pivot_root(const char *new_root, const char *put_old) {
+ return _check(_sc2(SYS_PIVOT_ROOT, (int)new_root, (int)put_old));
+}
+
int mkfifo(const char *path, mode_t mode) {
(void)path; (void)mode;
errno = ENOSYS;
/* AdrOS df utility — display filesystem disk space usage */
#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
int main(void) {
+ int fd = open("/proc/mounts", O_RDONLY);
+ if (fd < 0) {
+ fprintf(stderr, "df: cannot open /proc/mounts\n");
+ return 1;
+ }
printf("Filesystem Size Used Avail Use%% Mounted on\n");
- printf("overlayfs - - - - /\n");
- printf("devfs - - - - /dev\n");
- printf("procfs - - - - /proc\n");
+ char buf[1024];
+ int n;
+ while ((n = read(fd, buf, sizeof(buf))) > 0)
+ write(STDOUT_FILENO, buf, (size_t)n);
+ close(fd);
return 0;
}
#include <stdio.h>
#include <string.h>
#include <unistd.h>
+#include <sys/stat.h>
static int pflag = 0; /* -p: create parent directories */
for (char* p = tmp + 1; *p; p++) {
if (*p == '/') {
*p = '\0';
- mkdir(tmp); /* ignore errors — parent may already exist */
+ mkdir(tmp, 0755); /* ignore errors — parent may already exist */
*p = '/';
}
}
- return mkdir(tmp);
+ return mkdir(tmp, 0755);
}
int main(int argc, char** argv) {
if (pflag) {
r = mkdir_p(argv[i]);
} else {
- r = mkdir(argv[i]);
+ r = mkdir(argv[i], 0755);
}
if (r < 0) {
fprintf(stderr, "mkdir: cannot create directory '%s'\n", argv[i]);
int rc = 0;
for (int i = 1; i < argc; i++) {
struct stat st;
- if (stat(argv[i], (void*)&st) < 0) {
+ if (stat(argv[i], &st) < 0) {
fprintf(stderr, "stat: cannot stat '%s'\n", argv[i]);
rc = 1;
continue;
#define O_WRONLY 0x0001
#define O_RDWR 0x0002
#define O_CREAT 0x0040
+#define O_EXCL 0x0080
+#define O_NOCTTY 0x0100
#define O_TRUNC 0x0200
#define O_APPEND 0x0400
#define O_NONBLOCK 0x0800
+#define O_DIRECTORY 0x10000
+#define O_NOFOLLOW 0x20000
#define O_CLOEXEC 0x80000
#define F_DUPFD 0
#define FD_CLOEXEC 1
+/* AT_* constants for *at() syscalls */
+#define AT_FDCWD -100
+#define AT_SYMLINK_NOFOLLOW 0x100
+#define AT_REMOVEDIR 0x200
+#define AT_SYMLINK_FOLLOW 0x400
+#define AT_EACCESS 0x0400
+
/* Record lock types */
#define F_RDLCK 0
#define F_WRLCK 1
int stat(const char* path, struct stat* buf);
int fstat(int fd, struct stat* buf);
-int mkdir(const char* path, ...);
-int chmod(const char* path, int mode);
+int lstat(const char* path, struct stat* buf);
+int mkdir(const char* path, mode_t mode);
+int chmod(const char* path, mode_t mode);
+int fchmod(int fd, mode_t mode);
#endif
#include <stdint.h>
#include <stddef.h>
+#include <sys/types.h>
#include <signal.h>
+struct stat;
+struct rusage;
+
#define SEEK_SET 0
#define SEEK_CUR 1
#define SEEK_END 2
int write(int fd, const void* buf, size_t count);
int open(const char* path, int flags, ...);
int close(int fd);
-int lseek(int fd, int offset, int whence);
+off_t lseek(int fd, off_t offset, int whence);
int dup(int oldfd);
int dup2(int oldfd, int newfd);
int pipe(int fds[2]);
int getppid(void);
int chdir(const char* path);
char* getcwd(char* buf, size_t size);
-int mkdir(const char* path, ...); /* mode_t optional in AdrOS */
+int mkdir(const char* path, mode_t mode);
int unlink(const char* path);
int rmdir(const char* path);
int setsid(void);
int gettid(void);
int fsync(int fd);
int fdatasync(int fd);
-int pread(int fd, void* buf, size_t count, int offset);
-int pwrite(int fd, const void* buf, size_t count, int offset);
+ssize_t pread(int fd, void* buf, size_t count, off_t offset);
+ssize_t pwrite(int fd, const void* buf, size_t count, off_t offset);
int access(const char* path, int mode);
int getuid(void);
int getgid(void);
int setgid(int gid);
int seteuid(int euid);
int setegid(int egid);
-int truncate(const char* path, int length);
-int ftruncate(int fd, int length);
+int truncate(const char* path, off_t length);
+int ftruncate(int fd, off_t length);
unsigned int alarm(unsigned int seconds);
#define LOCK_SH 1
#define LOCK_EX 2
int waitpid(int pid, int* status, int options);
int getdents(int fd, void* buf, size_t count);
-int chmod(const char* path, int mode);
+int chmod(const char* path, mode_t mode);
int chown(const char* path, int owner, int group);
int link(const char* oldpath, const char* newpath);
int symlink(const char* target, const char* linkpath);
int execveat(int dirfd, const char* path, char* const argv[], char* const envp[], int flags);
int dup3(int oldfd, int newfd, int flags);
int openat(int dirfd, const char* path, int flags, ...);
-int fstatat(int dirfd, const char* path, void* buf, int flags);
+int fstatat(int dirfd, const char* path, struct stat* buf, int flags);
int unlinkat(int dirfd, const char* path, int flags);
int mount(const char* source, const char* target, const char* fs_type, unsigned long flags, const void* data);
int umount2(const char* target, int flags);
int umount(const char* target);
-int wait4(int pid, int* status, int options, void* rusage);
-int waitid(int idtype, int id, void* info, int options);
+pid_t wait4(pid_t pid, int* status, int options, struct rusage* rusage);
+int waitid(int idtype, int id, siginfo_t* info, int options);
int sigreturn(void);
int sigqueue(int pid, int sig, const union sigval value);
int set_thread_area(void* desc);
+int pivot_root(const char* new_root, const char* put_old);
char* getlogin(void);
int getlogin_r(char* buf, size_t bufsize);
int tcgetpgrp(int fd);
#include "stdlib.h"
#include "sys/select.h"
#include "sys/time.h"
+#include "sys/stat.h"
+#include "sys/resource.h"
#include "signal.h"
int read(int fd, void* buf, size_t count) {
}
int open(const char* path, int flags, ...) {
- (void)flags; /* mode arg unused by kernel currently */
+ __builtin_va_list ap;
+ __builtin_va_start(ap, flags);
+ int mode = __builtin_va_arg(ap, int);
+ __builtin_va_end(ap);
+ (void)mode; /* kernel ignores mode currently */
return __syscall_ret(_syscall2(SYS_OPEN, (int)path, flags));
}
return __syscall_ret(_syscall1(SYS_CLOSE, fd));
}
-int lseek(int fd, int offset, int whence) {
- return __syscall_ret(_syscall3(SYS_LSEEK, fd, offset, whence));
+off_t lseek(int fd, off_t offset, int whence) {
+ return __syscall_ret(_syscall3(SYS_LSEEK, fd, (int)offset, whence));
}
int dup(int oldfd) {
return buf;
}
-int mkdir(const char* path, ...) {
+int mkdir(const char* path, mode_t mode) {
+ (void)mode; /* kernel ignores mode currently */
return __syscall_ret(_syscall1(SYS_MKDIR, (int)path));
}
return __syscall_ret(_syscall1(SYS_FDATASYNC, fd));
}
-int pread(int fd, void* buf, size_t count, int offset) {
- return __syscall_ret(_syscall4(SYS_PREAD, fd, (int)buf, (int)count, offset));
+ssize_t pread(int fd, void* buf, size_t count, off_t offset) {
+ return __syscall_ret(_syscall4(SYS_PREAD, fd, (int)buf, (int)count, (int)offset));
}
-int pwrite(int fd, const void* buf, size_t count, int offset) {
- return __syscall_ret(_syscall4(SYS_PWRITE, fd, (int)buf, (int)count, offset));
+ssize_t pwrite(int fd, const void* buf, size_t count, off_t offset) {
+ return __syscall_ret(_syscall4(SYS_PWRITE, fd, (int)buf, (int)count, (int)offset));
}
int access(const char* path, int mode) {
return __syscall_ret(_syscall1(SYS_SETEGID, egid));
}
-int truncate(const char* path, int length) {
- return __syscall_ret(_syscall2(SYS_TRUNCATE, (int)path, length));
+int truncate(const char* path, off_t length) {
+ return __syscall_ret(_syscall2(SYS_TRUNCATE, (int)path, (int)length));
}
-int ftruncate(int fd, int length) {
- return __syscall_ret(_syscall2(SYS_FTRUNCATE, fd, length));
+int ftruncate(int fd, off_t length) {
+ return __syscall_ret(_syscall2(SYS_FTRUNCATE, fd, (int)length));
}
unsigned int alarm(unsigned int seconds) {
return __syscall_ret(_syscall3(SYS_GETDENTS, fd, (int)buf, (int)count));
}
-int stat(const char* path, void* buf) {
+int stat(const char* path, struct stat* buf) {
return __syscall_ret(_syscall2(SYS_STAT, (int)path, (int)buf));
}
-int fstat(int fd, void* buf) {
+int fstat(int fd, struct stat* buf) {
return __syscall_ret(_syscall2(SYS_FSTAT, fd, (int)buf));
}
-int chmod(const char* path, int mode) {
- return __syscall_ret(_syscall2(SYS_CHMOD, (int)path, mode));
+int lstat(const char* path, struct stat* buf) {
+ return stat(path, buf); /* no symlinks in AdrOS, same as stat */
+}
+
+int chmod(const char* path, mode_t mode) {
+ return __syscall_ret(_syscall2(SYS_CHMOD, (int)path, (int)mode));
+}
+
+int fchmod(int fd, mode_t mode) {
+ (void)fd; (void)mode;
+ errno = ENOSYS;
+ return -1;
}
int chown(const char* path, int owner, int group) {
}
int openat(int dirfd, const char* path, int flags, ...) {
- return __syscall_ret(_syscall3(SYS_OPENAT, dirfd, (int)path, flags));
+ __builtin_va_list ap;
+ __builtin_va_start(ap, flags);
+ int mode = __builtin_va_arg(ap, int);
+ __builtin_va_end(ap);
+ return __syscall_ret(_syscall4(SYS_OPENAT, dirfd, (int)path, flags, mode));
}
-int fstatat(int dirfd, const char* path, void* buf, int flags) {
+int fstatat(int dirfd, const char* path, struct stat* buf, int flags) {
return __syscall_ret(_syscall4(SYS_FSTATAT, dirfd, (int)path, (int)buf, flags));
}
return umount2(target, 0);
}
-int wait4(int pid, int* status, int options, void* rusage) {
- return __syscall_ret(_syscall4(SYS_WAIT4, pid, (int)status, options, (int)rusage));
+pid_t wait4(pid_t pid, int* status, int options, struct rusage* rusage) {
+ return __syscall_ret(_syscall4(SYS_WAIT4, (int)pid, (int)status, options, (int)rusage));
}
-int waitid(int idtype, int id, void* info, int options) {
+int waitid(int idtype, int id, siginfo_t* info, int options) {
return __syscall_ret(_syscall4(SYS_WAITID, idtype, id, (int)info, options));
}
int set_thread_area(void* desc) {
return __syscall_ret(_syscall1(SYS_SET_THREAD_AREA, (int)desc));
}
+
+int pivot_root(const char* new_root, const char* put_old) {
+ return __syscall_ret(_syscall2(SYS_PIVOT_ROOT, (int)new_root, (int)put_old));
+}