Implement __zipos_dup (#972)

* Implement __zipos_dup

Makes ZiposHandle reference-counted by an `rc` field in a union with its
freelist `next` pointer. The functions `__zipos_free` and `__zipos_keep`
function as incref/decref for it. Adds `__zipos_postdup` to fix metadata
on file descriptors after dup-like operations, and adds zipos support to
`sys_dup_nt` + `sys_close_nt`.

* Remove noop __zipos_postdup

rc is never a zipos file because it is always a previously unused file
descriptor. fd is never a zipos file because that case has been handled
above by __zipos_fcntl.
This commit is contained in:
Jōshin 2023-12-01 03:08:30 -05:00 committed by GitHub
parent 6556dd2673
commit d1a745c17c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 138 additions and 39 deletions

View file

@ -75,7 +75,7 @@ TEST(dup, bigNumber) {
ASSERT_SYS(0, 0, close(100));
}
TEST(dup2, zipos) {
TEST(dup2, ziposdest) {
ASSERT_SYS(0, 3, creat("real", 0644));
ASSERT_SYS(0, 4, open("/zip/libc/testlib/hyperion.txt", O_RDONLY));
ASSERT_SYS(0, 2, write(3, "hi", 2));
@ -86,6 +86,15 @@ TEST(dup2, zipos) {
ASSERT_SYS(0, 0, close(3));
}
TEST(dup2, zipossrc) {
char b[8];
ASSERT_SYS(0, 3, open("/zip/libc/testlib/hyperion.txt", O_RDONLY));
ASSERT_SYS(0, 4, dup2(3, 4));
ASSERT_SYS(0, 8, read(4, b, 8));
ASSERT_SYS(0, 0, close(4));
ASSERT_SYS(0, 0, close(3));
}
#ifdef __x86_64__
TEST(dup, clearsCloexecFlag) {
static bool once;