mirror of
https://github.com/SerenityOS/serenity.git
synced 2025-01-23 09:51:57 -05:00
2159f90e00
With the new InodeWatcher API, the old style of creating a watcher per inode will no longer work. Therefore the FileWatcher API has been updated to support multiple watches, and its users have also been refactored to the new style. At the moment, all operations done on a (Blocking)FileWatcher return Result objects, however, this may be changed in the future if it becomes too obnoxious. :^) Co-authored-by: Gunnar Beutner <gunnar@beutner.name>
89 lines
2.2 KiB
C++
89 lines
2.2 KiB
C++
/*
|
|
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
|
|
* Copyright (c) 2021, sin-ack <sin-ack@protonmail.com>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include <errno.h>
|
|
#include <fcntl.h>
|
|
#include <stdarg.h>
|
|
#include <string.h>
|
|
#include <syscall.h>
|
|
|
|
extern "C" {
|
|
|
|
int fcntl(int fd, int cmd, ...)
|
|
{
|
|
va_list ap;
|
|
va_start(ap, cmd);
|
|
u32 extra_arg = va_arg(ap, u32);
|
|
int rc = syscall(SC_fcntl, fd, cmd, extra_arg);
|
|
va_end(ap);
|
|
__RETURN_WITH_ERRNO(rc, rc, -1);
|
|
}
|
|
|
|
int create_inode_watcher(unsigned flags)
|
|
{
|
|
int rc = syscall(SC_create_inode_watcher, flags);
|
|
__RETURN_WITH_ERRNO(rc, rc, -1);
|
|
}
|
|
|
|
int inode_watcher_add_watch(int fd, const char* path, size_t path_length, unsigned event_mask)
|
|
{
|
|
Syscall::SC_inode_watcher_add_watch_params params { fd, { path, path_length }, event_mask };
|
|
int rc = syscall(SC_inode_watcher_add_watch, ¶ms);
|
|
__RETURN_WITH_ERRNO(rc, rc, -1);
|
|
}
|
|
|
|
int inode_watcher_remove_watch(int fd, int wd)
|
|
{
|
|
int rc = syscall(SC_inode_watcher_remove_watch, fd, wd);
|
|
__RETURN_WITH_ERRNO(rc, rc, -1);
|
|
}
|
|
|
|
int creat(const char* path, mode_t mode)
|
|
{
|
|
return open(path, O_CREAT | O_WRONLY | O_TRUNC, mode);
|
|
}
|
|
|
|
int open(const char* path, int options, ...)
|
|
{
|
|
if (!path) {
|
|
errno = EFAULT;
|
|
return -1;
|
|
}
|
|
auto path_length = strlen(path);
|
|
if (path_length > INT32_MAX) {
|
|
errno = EINVAL;
|
|
return -1;
|
|
}
|
|
va_list ap;
|
|
va_start(ap, options);
|
|
auto mode = (mode_t)va_arg(ap, unsigned);
|
|
va_end(ap);
|
|
Syscall::SC_open_params params { AT_FDCWD, { path, path_length }, options, mode };
|
|
int rc = syscall(SC_open, ¶ms);
|
|
__RETURN_WITH_ERRNO(rc, rc, -1);
|
|
}
|
|
|
|
int openat(int dirfd, const char* path, int options, ...)
|
|
{
|
|
if (!path) {
|
|
errno = EFAULT;
|
|
return -1;
|
|
}
|
|
auto path_length = strlen(path);
|
|
if (path_length > INT32_MAX) {
|
|
errno = EINVAL;
|
|
return -1;
|
|
}
|
|
va_list ap;
|
|
va_start(ap, options);
|
|
auto mode = (mode_t)va_arg(ap, unsigned);
|
|
va_end(ap);
|
|
Syscall::SC_open_params params { dirfd, { path, path_length }, options, mode };
|
|
int rc = syscall(SC_open, ¶ms);
|
|
__RETURN_WITH_ERRNO(rc, rc, -1);
|
|
}
|
|
}
|