inotify, faccessat2, fsync for Linux programs, and D-Bus credentials

What installing and starting Epiphany ran into:

- inotify: inotify_init/init1, add_watch, rm_watch, as a new kind of event
  descriptor. The filesystem reports creates, deletes, renames (with a
  cookie pairing MOVED_FROM and MOVED_TO), writes, close-after-write,
  truncation and attribute changes, to watches on the inode and on its
  directory with the name. ONESHOT, MASK_ADD, MASK_CREATE, ONLYDIR,
  DONT_FOLLOW, IGNORED on removal, Q_OVERFLOW, and Linux's coalescing of
  repeated events. The hooks cost one load when nothing is watched. Without
  it GLib found no file monitor and GNOME programs aborted.
- FIONREAD on inotify descriptors and pipes (inotifywait sizes its buffer
  by it).
- fsync and fdatasync had no Linux numbers since the first commit: GLib's
  atomic writes, gtk-update-icon-cache and dbus-uuidgen all got ENOSYS.
- faccessat2, the flags-taking faccessat musl uses for any flags.
- sendmsg accepts SCM_CREDENTIALS when they are the sender's own, as Linux
  checks; GDBus sends them in every handshake and was refused with EINVAL.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S1giNvrHTrPMPw7V6x1kQ4
This commit is contained in:
Nexoniarz 2026-10-25 06:40:28 +01:00
commit 3113eff7fe
9 changed files with 590 additions and 9 deletions

View file

@ -9,6 +9,7 @@
#include "fs/fsstat.h"
#include "uapi/posix.h"
#include "uapi/errno.h"
#include "uapi/inotify.h"
#include "core/kmem.h"
#include "dev/pty.h"
@ -112,6 +113,9 @@ fileclose(struct file *f)
FSSTAT_DROP(fsstat.file_used); // 1 -> 0
release(&ftable.lock);
// Before the path goes: the directory's watchers want the name.
if(ff.type == FD_INODE && ff.writable && ff.ip && ff.ip->type == T_FILE)
inotify_file(&ff, IN_CLOSE_WRITE);
if(ff.path)
kmfree(ff.path);
@ -375,8 +379,10 @@ filewrite(struct file *f, char *addr, int n)
if(r != n1)
break;
}
if(i > 0)
if(i > 0){
inotify_file(f, IN_MODIFY);
return i;
}
return r < 0 ? r : -1;
}
panic("filewrite");

View file

@ -231,3 +231,13 @@ pipe_poll(struct pipe *p, int readable, int writable)
release(&p->lock);
return rev;
}
// Bytes waiting to be read, for FIONREAD.
int
pipe_avail(struct pipe *p)
{
acquire(&p->lock);
int n = (int)(p->nwrite - p->nread);
release(&p->lock);
return n;
}