mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-06-28 15:28:30 +00:00
Improve cosmo's conformance to libc-test
This change addresses various open source compatibility issues, so that we pass 313/411 of the tests in https://github.com/jart/libc-test where earlier today we were passing about 30/411 of them, due to header toil. Please note that Glibc only passes 341/411 so 313 today is pretty good! - Make the conformance of libc/isystem/ headers nearly perfect - Import more of the remaining math library routines from Musl - Fix inconsistencies with type signatures of calls like umask - Write tests for getpriority/setpriority which work great now - conform to `struct sockaddr *` on remaining socket functions - Import a bunch of uninteresting stdlib functions e.g. rand48 - Introduce readdir_r, scandir, pthread_kill, sigsetjmp, etc.. Follow the instructions in our `tool/scripts/cosmocc` toolchain to run these tests yourself. You use `make CC=cosmocc` on the test repository
This commit is contained in:
parent
467a332e38
commit
e557058ac8
189 changed files with 5091 additions and 884 deletions
|
@ -439,6 +439,39 @@ struct dirent *readdir(DIR *dir) {
|
|||
return e;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads directory entry reentrantly.
|
||||
*
|
||||
* @param dir is the object opendir() or fdopendir() returned
|
||||
* @param output is where directory entry is copied if not eof
|
||||
* @param result will receive `output` pointer, or null on eof
|
||||
* @return 0 on success, or errno on error
|
||||
* @returnserrno
|
||||
* @threadsafe
|
||||
*/
|
||||
errno_t readdir_r(DIR *dir, struct dirent *output, struct dirent **result) {
|
||||
int err, olderr;
|
||||
struct dirent *entry;
|
||||
_lockdir(dir);
|
||||
olderr = errno;
|
||||
errno = 0;
|
||||
entry = readdir_impl(dir);
|
||||
err = errno;
|
||||
errno = olderr;
|
||||
if (err) {
|
||||
_unlockdir(dir);
|
||||
return err;
|
||||
}
|
||||
if (entry) {
|
||||
memcpy(output, entry, entry->d_reclen);
|
||||
} else {
|
||||
output = 0;
|
||||
}
|
||||
_unlockdir(dir);
|
||||
*result = output;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes directory object returned by opendir().
|
||||
* @return 0 on success or -1 w/ errno
|
||||
|
@ -464,6 +497,7 @@ int closedir(DIR *dir) {
|
|||
|
||||
/**
|
||||
* Returns offset into directory data.
|
||||
* @threadsafe
|
||||
*/
|
||||
long telldir(DIR *dir) {
|
||||
long rc;
|
||||
|
@ -475,6 +509,7 @@ long telldir(DIR *dir) {
|
|||
|
||||
/**
|
||||
* Returns file descriptor associated with DIR object.
|
||||
* @threadsafe
|
||||
*/
|
||||
int dirfd(DIR *dir) {
|
||||
int rc;
|
||||
|
@ -492,6 +527,7 @@ int dirfd(DIR *dir) {
|
|||
|
||||
/**
|
||||
* Seeks to beginning of directory stream.
|
||||
* @threadsafe
|
||||
*/
|
||||
void rewinddir(DIR *dir) {
|
||||
_lockdir(dir);
|
||||
|
@ -517,6 +553,7 @@ void rewinddir(DIR *dir) {
|
|||
|
||||
/**
|
||||
* Seeks in directory stream.
|
||||
* @threadsafe
|
||||
*/
|
||||
void seekdir(DIR *dir, long off) {
|
||||
long i;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue