mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-07 11:48: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
|
@ -17,11 +17,12 @@
|
|||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/calls/internal.h"
|
||||
#include "libc/intrin/strace.internal.h"
|
||||
#include "libc/dce.h"
|
||||
#include "libc/intrin/asan.internal.h"
|
||||
#include "libc/intrin/strace.internal.h"
|
||||
#include "libc/sock/internal.h"
|
||||
#include "libc/sock/sock.h"
|
||||
#include "libc/sock/struct/sockaddr.h"
|
||||
#include "libc/sock/struct/sockaddr.internal.h"
|
||||
#include "libc/sock/syscall_fd.internal.h"
|
||||
#include "libc/sysv/errfuns.h"
|
||||
|
@ -38,7 +39,8 @@
|
|||
* @asyncsignalsafe
|
||||
* @restartable (unless SO_RCVTIMEO)
|
||||
*/
|
||||
int accept4(int fd, void *out_addr, uint32_t *inout_addrsize, int flags) {
|
||||
int accept4(int fd, struct sockaddr *out_addr, uint32_t *inout_addrsize,
|
||||
int flags) {
|
||||
int rc;
|
||||
char addrbuf[72];
|
||||
if (!out_addr || !inout_addrsize ||
|
||||
|
|
|
@ -17,11 +17,12 @@
|
|||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/calls/internal.h"
|
||||
#include "libc/intrin/strace.internal.h"
|
||||
#include "libc/dce.h"
|
||||
#include "libc/intrin/asan.internal.h"
|
||||
#include "libc/intrin/strace.internal.h"
|
||||
#include "libc/sock/internal.h"
|
||||
#include "libc/sock/sock.h"
|
||||
#include "libc/sock/struct/sockaddr.h"
|
||||
#include "libc/sock/struct/sockaddr.internal.h"
|
||||
#include "libc/sock/syscall_fd.internal.h"
|
||||
#include "libc/sysv/errfuns.h"
|
||||
|
@ -40,7 +41,7 @@
|
|||
* @error ENETDOWN, EPFNOSUPPORT, etc.
|
||||
* @asyncsignalsafe
|
||||
*/
|
||||
int bind(int fd, const void *addr, uint32_t addrsize) {
|
||||
int bind(int fd, const struct sockaddr *addr, uint32_t addrsize) {
|
||||
int rc;
|
||||
if (!addr || (IsAsan() && !__asan_is_valid(addr, addrsize))) {
|
||||
rc = efault();
|
||||
|
|
|
@ -17,11 +17,12 @@
|
|||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/calls/internal.h"
|
||||
#include "libc/intrin/strace.internal.h"
|
||||
#include "libc/dce.h"
|
||||
#include "libc/intrin/asan.internal.h"
|
||||
#include "libc/intrin/strace.internal.h"
|
||||
#include "libc/sock/internal.h"
|
||||
#include "libc/sock/sock.h"
|
||||
#include "libc/sock/struct/sockaddr.h"
|
||||
#include "libc/sock/struct/sockaddr.internal.h"
|
||||
#include "libc/sock/syscall_fd.internal.h"
|
||||
#include "libc/sysv/errfuns.h"
|
||||
|
@ -37,7 +38,7 @@
|
|||
* @asyncsignalsafe
|
||||
* @restartable (unless SO_RCVTIMEO)
|
||||
*/
|
||||
int connect(int fd, const void *addr, uint32_t addrsize) {
|
||||
int connect(int fd, const struct sockaddr *addr, uint32_t addrsize) {
|
||||
int rc;
|
||||
if (addr && !(IsAsan() && !__asan_is_valid(addr, addrsize))) {
|
||||
if (!IsWindows()) {
|
||||
|
|
|
@ -17,11 +17,12 @@
|
|||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/calls/internal.h"
|
||||
#include "libc/intrin/strace.internal.h"
|
||||
#include "libc/dce.h"
|
||||
#include "libc/intrin/asan.internal.h"
|
||||
#include "libc/intrin/strace.internal.h"
|
||||
#include "libc/sock/internal.h"
|
||||
#include "libc/sock/sock.h"
|
||||
#include "libc/sock/struct/sockaddr.h"
|
||||
#include "libc/sock/struct/sockaddr.internal.h"
|
||||
#include "libc/sock/syscall_fd.internal.h"
|
||||
#include "libc/sysv/errfuns.h"
|
||||
|
@ -31,7 +32,7 @@
|
|||
* @return 0 on success or -1 w/ errno
|
||||
* @see getsockname()
|
||||
*/
|
||||
int getpeername(int fd, void *out_addr, uint32_t *out_addrsize) {
|
||||
int getpeername(int fd, struct sockaddr *out_addr, uint32_t *out_addrsize) {
|
||||
int rc;
|
||||
if (!out_addr || !out_addrsize ||
|
||||
(IsAsan() && (!__asan_is_valid(out_addrsize, 4) ||
|
||||
|
|
|
@ -17,11 +17,12 @@
|
|||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/calls/internal.h"
|
||||
#include "libc/intrin/strace.internal.h"
|
||||
#include "libc/dce.h"
|
||||
#include "libc/intrin/asan.internal.h"
|
||||
#include "libc/intrin/strace.internal.h"
|
||||
#include "libc/sock/internal.h"
|
||||
#include "libc/sock/sock.h"
|
||||
#include "libc/sock/struct/sockaddr.h"
|
||||
#include "libc/sock/struct/sockaddr.internal.h"
|
||||
#include "libc/sock/syscall_fd.internal.h"
|
||||
#include "libc/sysv/errfuns.h"
|
||||
|
@ -31,7 +32,7 @@
|
|||
* @return 0 on success or -1 w/ errno
|
||||
* @see getpeername()
|
||||
*/
|
||||
int getsockname(int fd, void *out_addr, uint32_t *out_addrsize) {
|
||||
int getsockname(int fd, struct sockaddr *out_addr, uint32_t *out_addrsize) {
|
||||
int rc;
|
||||
if (!out_addrsize || !out_addrsize ||
|
||||
(IsAsan() && (!__asan_is_valid(out_addrsize, 4) ||
|
||||
|
|
|
@ -17,14 +17,15 @@
|
|||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/calls/internal.h"
|
||||
#include "libc/intrin/strace.internal.h"
|
||||
#include "libc/calls/struct/iovec.h"
|
||||
#include "libc/calls/struct/iovec.internal.h"
|
||||
#include "libc/dce.h"
|
||||
#include "libc/intrin/asan.internal.h"
|
||||
#include "libc/intrin/strace.internal.h"
|
||||
#include "libc/nt/winsock.h"
|
||||
#include "libc/sock/internal.h"
|
||||
#include "libc/sock/sock.h"
|
||||
#include "libc/sock/struct/sockaddr.h"
|
||||
#include "libc/sock/struct/sockaddr.internal.h"
|
||||
#include "libc/sock/syscall_fd.internal.h"
|
||||
#include "libc/sysv/errfuns.h"
|
||||
|
@ -47,7 +48,8 @@
|
|||
* @restartable (unless SO_RCVTIMEO)
|
||||
*/
|
||||
ssize_t recvfrom(int fd, void *buf, size_t size, uint32_t flags,
|
||||
void *opt_out_srcaddr, uint32_t *opt_inout_srcaddrsize) {
|
||||
struct sockaddr *opt_out_srcaddr,
|
||||
uint32_t *opt_inout_srcaddrsize) {
|
||||
ssize_t rc;
|
||||
uint32_t sz;
|
||||
union sockaddr_storage_bsd bsd;
|
||||
|
@ -65,7 +67,8 @@ ssize_t recvfrom(int fd, void *buf, size_t size, uint32_t flags,
|
|||
} else {
|
||||
sz = sizeof(bsd);
|
||||
if ((rc = sys_recvfrom(fd, buf, size, flags, &bsd, &sz)) != -1) {
|
||||
sockaddr2linux(&bsd, sz, opt_out_srcaddr, opt_inout_srcaddrsize);
|
||||
sockaddr2linux(&bsd, sz, (void *)opt_out_srcaddr,
|
||||
opt_inout_srcaddrsize);
|
||||
}
|
||||
}
|
||||
} else if (__isfdopen(fd)) {
|
||||
|
|
|
@ -18,14 +18,15 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/assert.h"
|
||||
#include "libc/calls/internal.h"
|
||||
#include "libc/intrin/strace.internal.h"
|
||||
#include "libc/calls/struct/iovec.h"
|
||||
#include "libc/calls/struct/iovec.internal.h"
|
||||
#include "libc/dce.h"
|
||||
#include "libc/intrin/asan.internal.h"
|
||||
#include "libc/intrin/strace.internal.h"
|
||||
#include "libc/macros.internal.h"
|
||||
#include "libc/sock/internal.h"
|
||||
#include "libc/sock/sock.h"
|
||||
#include "libc/sock/struct/sockaddr.h"
|
||||
#include "libc/sock/struct/sockaddr.internal.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/sysv/errfuns.h"
|
||||
|
@ -52,7 +53,7 @@
|
|||
* @restartable (unless SO_RCVTIMEO)
|
||||
*/
|
||||
ssize_t sendto(int fd, const void *buf, size_t size, uint32_t flags,
|
||||
const void *opt_addr, uint32_t addrsize) {
|
||||
const struct sockaddr *opt_addr, uint32_t addrsize) {
|
||||
ssize_t rc;
|
||||
uint32_t bsdaddrsize;
|
||||
union sockaddr_storage_bsd bsd;
|
||||
|
|
|
@ -29,21 +29,14 @@ uint32_t *GetHostIps(void);
|
|||
|
||||
int nointernet(void);
|
||||
int socket(int, int, int);
|
||||
int accept4(int, void *, uint32_t *, int);
|
||||
int bind(int, const void *, uint32_t);
|
||||
int connect(int, const void *, uint32_t);
|
||||
int listen(int, int);
|
||||
int shutdown(int, int);
|
||||
int getsockname(int, void *, uint32_t *);
|
||||
int getpeername(int, void *, uint32_t *);
|
||||
ssize_t send(int, const void *, size_t, int);
|
||||
ssize_t recv(int, void *, size_t, int);
|
||||
ssize_t recvfrom(int, void *, size_t, uint32_t, void *, uint32_t *);
|
||||
ssize_t sendfile(int, int, int64_t *, size_t);
|
||||
int getsockopt(int, int, int, void *, uint32_t *);
|
||||
int setsockopt(int, int, int, const void *, uint32_t);
|
||||
int socketpair(int, int, int, int[2]);
|
||||
ssize_t sendto(int, const void *, size_t, uint32_t, const void *, uint32_t);
|
||||
int sockatmark(int);
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
|
|
|
@ -8,10 +8,11 @@ struct msghdr { /* Linux+NT ABI */
|
|||
void *msg_name; /* optional address */
|
||||
uint32_t msg_namelen; /* size of msg_name */
|
||||
struct iovec *msg_iov; /* scatter/gather array */
|
||||
uint64_t msg_iovlen; /* iovec count */
|
||||
int msg_iovlen; /* iovec count */
|
||||
void *msg_control; /* credentials and stuff */
|
||||
uint64_t msg_controllen; /* size of msg_control */
|
||||
uint32_t msg_flags; /* MSG_XXX */
|
||||
uint32_t msg_controllen; /* size of msg_control */
|
||||
uint32_t __pad0; /* reconcile abi */
|
||||
int msg_flags; /* MSG_XXX */
|
||||
};
|
||||
|
||||
ssize_t recvmsg(int, struct msghdr *, int);
|
||||
|
|
|
@ -36,6 +36,14 @@ struct sockaddr_storage {
|
|||
int inet_aton(const char *, struct in_addr *);
|
||||
char *inet_ntoa(struct in_addr);
|
||||
int accept(int, struct sockaddr *, uint32_t *);
|
||||
int accept4(int, struct sockaddr *, uint32_t *, int);
|
||||
int bind(int, const struct sockaddr *, uint32_t);
|
||||
int connect(int, const struct sockaddr *, uint32_t);
|
||||
int getsockname(int, struct sockaddr *, uint32_t *);
|
||||
int getpeername(int, struct sockaddr *, uint32_t *);
|
||||
ssize_t recvfrom(int, void *, size_t, uint32_t, struct sockaddr *, uint32_t *);
|
||||
ssize_t sendto(int, const void *, size_t, uint32_t, const struct sockaddr *,
|
||||
uint32_t);
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue