From 27b10cb334eb873e57b89f4e86526aafebea905f Mon Sep 17 00:00:00 2001 From: Dennis Bonke Date: Mon, 3 Feb 2025 21:34:09 +0100 Subject: [PATCH] WIP --- abis/linux/fcntl.h | 4 ++++ options/posix/generic/grp.cpp | 25 ++++++++++++++++++++++--- options/posix/generic/pwd.cpp | 25 ++++++++++++++++++++++--- options/posix/generic/unistd.cpp | 16 ++++++++++++++-- sysdeps/managarm/generic/file.cpp | 11 +++++++++++ sysdeps/managarm/generic/socket.cpp | 1 + 6 files changed, 74 insertions(+), 8 deletions(-) diff --git a/abis/linux/fcntl.h b/abis/linux/fcntl.h index 61777b3bba..dd27a53955 100644 --- a/abis/linux/fcntl.h +++ b/abis/linux/fcntl.h @@ -65,6 +65,10 @@ #define F_SEAL_GROW 0x0004 #define F_SEAL_WRITE 0x0008 +#define F_OFD_GETLK 36 +#define F_OFD_SETLK 37 +#define F_OFD_SETLKW 38 + #define F_RDLCK 0 #define F_WRLCK 1 #define F_UNLCK 2 diff --git a/options/posix/generic/grp.cpp b/options/posix/generic/grp.cpp index 5175ab6288..eacd92f11a 100644 --- a/options/posix/generic/grp.cpp +++ b/options/posix/generic/grp.cpp @@ -337,9 +337,28 @@ int putgrent(const struct group *g, FILE *f) { return r < 0 ? -1 : 0; } -struct group *fgetgrent(FILE *) { - __ensure(!"Not implemented"); - __builtin_unreachable(); +struct group *fgetgrent(FILE *file) { + static group entry; + char line[512]; + + // if(!open_global_file()) { + // return nullptr; + // } + + if(fgets(line, 512, file)) { + clear_entry(&entry); + if(!extract_entry(line, &entry)) { + errno = EINVAL; + return nullptr; + } + return &entry; + } + + if(ferror(file)) { + errno = EIO; + } + + return nullptr; } int getgrouplist(const char *user, gid_t gid, gid_t *groups, int *ngroups) { diff --git a/options/posix/generic/pwd.cpp b/options/posix/generic/pwd.cpp index 6ef908020c..b82a554382 100644 --- a/options/posix/generic/pwd.cpp +++ b/options/posix/generic/pwd.cpp @@ -287,7 +287,26 @@ int putpwent(const struct passwd *p, FILE *f) { return fprintf(f, "%s:%s:%u:%u:%s:%s:%s\n", p->pw_name, p->pw_passwd, p->pw_uid, p->pw_gid, p->pw_gecos, p->pw_dir, p->pw_shell) < 0 ? -1 : 0; } -struct passwd *fgetpwent(FILE *) { - __ensure(!"Not implemented"); - __builtin_unreachable(); +struct passwd *fgetpwent(FILE *file) { + static passwd entry; + char line[NSS_BUFLEN_PASSWD]; + + // if(!open_global_file()) { + // return nullptr; + // } + + if (fgets(line, NSS_BUFLEN_PASSWD, file)) { + clear_entry(&entry); + if(!extract_entry(line, &entry)) { + errno = EINVAL; // I suppose this can be a valid errno? + return nullptr; + } + return &entry; + } + + if(ferror(file)) { + errno = EIO; + } + + return nullptr; } diff --git a/options/posix/generic/unistd.cpp b/options/posix/generic/unistd.cpp index cb5f143e70..b16d5fcb08 100644 --- a/options/posix/generic/unistd.cpp +++ b/options/posix/generic/unistd.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -908,8 +909,17 @@ char *getpass(const char *prompt) { } char *get_current_dir_name(void) { - __ensure(!"Not implemented"); - __builtin_unreachable(); + char *pwd; + struct stat dotstat, pwdstat; + + pwd = getenv ("PWD"); + if(pwd != NULL && stat(".", &dotstat) == 0 + && stat(pwd, &pwdstat) == 0 && pwdstat.st_dev == dotstat.st_dev + && pwdstat.st_ino == dotstat.st_ino) + /* The PWD value is correct. Use it. */ + return strdup(pwd); + + return getcwd((char *) NULL, 0); } // This is a Linux extension @@ -997,6 +1007,7 @@ int usleep(useconds_t usecs) { } int dup(int fd) { + mlibc::infoLogger() << "mlibc: dup called" << frg::endlog; int newfd; MLIBC_CHECK_OR_ENOSYS(mlibc::sys_dup, -1); if(int e = mlibc::sys_dup(fd, 0, &newfd); e) { @@ -1007,6 +1018,7 @@ int dup(int fd) { } int dup2(int fd, int newfd) { + mlibc::infoLogger() << "mlibc: dup2 called" << frg::endlog; MLIBC_CHECK_OR_ENOSYS(mlibc::sys_dup2, -1); if(int e = mlibc::sys_dup2(fd, 0, newfd); e) { errno = e; diff --git a/sysdeps/managarm/generic/file.cpp b/sysdeps/managarm/generic/file.cpp index 36d041e0c6..f60a0fb99f 100644 --- a/sysdeps/managarm/generic/file.cpp +++ b/sysdeps/managarm/generic/file.cpp @@ -406,6 +406,17 @@ int sys_fcntl(int fd, int request, va_list args, int *result) { lock->l_type = F_UNLCK; mlibc::infoLogger() << "\e[31mmlibc: F_GETLK is stubbed!\e[39m" << frg::endlog; return 0; + } else if (request == F_OFD_SETLK) { + mlibc::infoLogger() << "\e[31mmlibc: F_OFD_SETLK\e[39m" << frg::endlog; + return 0; + } else if (request == F_OFD_SETLKW) { + mlibc::infoLogger() << "\e[31mmlibc: F_OFD_SETLKW\e[39m" << frg::endlog; + return 0; + } else if (request == F_OFD_GETLK) { + struct flock *lock = va_arg(args, struct flock *); + lock->l_type = F_UNLCK; + mlibc::infoLogger() << "\e[31mmlibc: F_OFD_GETLK is stubbed!\e[39m" << frg::endlog; + return 0; } else if (request == F_ADD_SEALS) { auto seals = va_arg(args, int); auto handle = getHandleForFd(fd); diff --git a/sysdeps/managarm/generic/socket.cpp b/sysdeps/managarm/generic/socket.cpp index bfcb5195a7..e12c545534 100644 --- a/sysdeps/managarm/generic/socket.cpp +++ b/sysdeps/managarm/generic/socket.cpp @@ -300,6 +300,7 @@ sys_getsockopt(int fd, int layer, int number, void *__restrict buffer, socklen_t creds.pid = resp.pid(); creds.uid = resp.uid(); creds.gid = resp.gid(); + mlibc::infoLogger() << "GROTE KANKER: " << creds.pid << " and " << creds.uid << " and " << creds.gid << frg::endlog; memcpy(buffer, &creds, sizeof(struct ucred)); return 0; } else if (layer == SOL_SOCKET && number == SO_SNDBUF) {