From 1e47b86f420df44d18b5f35982fec34d747ab9e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juhani=20Krekel=C3=A4?= Date: Sat, 28 Aug 2021 18:43:25 +0300 Subject: [PATCH] Sortix patches --- Makefile.in | 2 -- af_unix.c | 4 +++- configure | 4 ++-- connect.c | 6 +++--- dns.c | 2 +- links.h | 1 + os_dep.c | 8 ++++++++ select.c | 16 ++++++++++++++++ tixbuildinfo | 6 ++++++ 9 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 tixbuildinfo diff --git a/Makefile.in b/Makefile.in index a8aff73..6316782 100644 --- a/Makefile.in +++ b/Makefile.in @@ -35,8 +35,6 @@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include -DESTDIR = - pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ diff --git a/af_unix.c b/af_unix.c index 8600135..1a56529 100644 --- a/af_unix.c +++ b/af_unix.c @@ -205,6 +205,7 @@ int bind_to_af_unix(unsigned char *name) #endif EINTRLOOP(rs, bind(s_unix_fd, &s_unix.s, s_unix_l)); if (rs) { +attempt_connect: /*debug("bind: %d, %s", errno, strerror(errno));*/ if (af == PF_INET && errno == EADDRNOTAVAIL) { /* do not try to connect if the user has not configured loopback interface */ @@ -217,7 +218,7 @@ int bind_to_af_unix(unsigned char *name) #if defined(SOL_SOCKET) && defined(SO_REUSEADDR) EINTRLOOP(rs, setsockopt(s_unix_fd, SOL_SOCKET, SO_REUSEADDR, (void *)&a1, sizeof a1)); #endif - EINTRLOOP(rs, connect(s_unix_fd, &s_unix.s, s_unix_l)); + rs = blocking_connect(s_unix_fd, &s_unix.s, s_unix_l); if (rs) { retry: /*debug("connect: %d, %s", errno, strerror(errno));*/ @@ -255,6 +256,7 @@ retry_unlink: } EINTRLOOP(rs, listen(s_unix_fd, 100)); if (rs) { + if (errno == EADDRINUSE) goto attempt_connect; error("ERROR: listen failed: %d", errno); close_and_fail: EINTRLOOP(rs, close(s_unix_fd)); diff --git a/configure b/configure index 2ff8ec4..76331bf 100755 --- a/configure +++ b/configure @@ -118,7 +118,7 @@ libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' -mandir='${prefix}/man' +mandir='${prefix}/share/man' # Initialize some other variables. subdirs= @@ -235,7 +235,7 @@ Directory and file names: --includedir=DIR C header files in DIR [PREFIX/include] --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] --infodir=DIR info documentation in DIR [PREFIX/info] - --mandir=DIR man documentation in DIR [PREFIX/man] + --mandir=DIR man documentation in DIR [PREFIX/share/man] --srcdir=DIR find the sources in DIR [configure dir or ..] --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names diff --git a/connect.c b/connect.c index 8a6ad34..8d393fd 100644 --- a/connect.c +++ b/connect.c @@ -672,7 +672,7 @@ static void try_connect(struct connection *c) #if defined(__aarch64__) && defined(__ILP32__) errno = EINPROGRESS; /* arm64 ilp32 bug */ #endif - EINTRLOOP(rs, connect(s, (struct sockaddr *)(void *)&sa, sizeof sa)); + rs = connect(s, (struct sockaddr *)(void *)&sa, sizeof sa); #ifdef SUPPORT_IPV6 } else if (addr->af == AF_INET6) { struct sockaddr_in6 sa; @@ -686,14 +686,14 @@ static void try_connect(struct connection *c) #if defined(__aarch64__) && defined(__ILP32__) errno = EINPROGRESS; /* arm64 ilp32 bug */ #endif - EINTRLOOP(rs, connect(s, (struct sockaddr *)(void *)&sa, sizeof sa)); + rs = connect(s, (struct sockaddr *)(void *)&sa, sizeof sa); #endif } else { rs = -1; errno = EINVAL; } if (rs) { - if (errno != EALREADY && errno != EINPROGRESS) { + if (errno != EALREADY && errno != EINPROGRESS && errno != EINTR) { #ifdef BEOS if (errno == EWOULDBLOCK) errno = ETIMEDOUT; #endif diff --git a/dns.c b/dns.c index 4d7484e..ef94d9e 100644 --- a/dns.c +++ b/dns.c @@ -773,7 +773,7 @@ int ipv6_full_access(void) sin6.sin6_family = AF_INET6; sin6.sin6_port = htons(1024); memcpy(&sin6.sin6_addr.s6_addr, "\052\001\004\060\000\015\000\000\002\314\236\377\376\044\176\032", 16); - EINTRLOOP(c, connect(h, (struct sockaddr *)(void *)&sin6, sizeof sin6)); + c = blocking_connect(h, (struct sockaddr *)(void *)&sin6, sizeof sin6); EINTRLOOP(rs, close(h)); if (!c) return 1; #endif diff --git a/links.h b/links.h index 885d3a4..141023c 100644 --- a/links.h +++ b/links.h @@ -1140,6 +1140,7 @@ extern int terminate_loop; int can_write(int fd); int can_read(int fd); int can_read_timeout(int fd, int sec); +int blocking_connect(int fd, struct sockaddr *addr, socklen_t addrlen); int close_std_handle(int); void restore_std_handle(int, int); unsigned long select_info(int); diff --git a/os_dep.c b/os_dep.c index 8ebf95c..4222b67 100644 --- a/os_dep.c +++ b/os_dep.c @@ -3434,6 +3434,14 @@ int os_default_charset(void) return 0; } +// PATCH: Always use UTF-8 instead of language-specific terminal charsets +#elif defined(__sortix__) + +int os_default_charset(void) +{ + return utf8_table; +} + #elif !defined(DOS) int os_default_charset(void) diff --git a/select.c b/select.c index d92599b..3e24c5c 100644 --- a/select.c +++ b/select.c @@ -125,6 +125,22 @@ int can_read(int fd) } +// PATCH: Handle connect not being restartable +int blocking_connect(int fd, struct sockaddr *addr, socklen_t addrlen) +{ + int connect_error; + socklen_t len = sizeof(connect_error); + + if (!connect(fd, addr, addrlen)) return 0; + if (errno != EINTR) return -1; + + can_do_io(fd, 1, -1); // Wait until connected/failed + getsockopt(fd, SOL_SOCKET, SO_ERROR, &connect_error, &len); + errno = connect_error; + return !connect_error ? 0 : -1; +} + + int close_std_handle(int std) { #ifndef DOS diff --git a/tixbuildinfo b/tixbuildinfo new file mode 100644 index 0000000..ec55952 --- /dev/null +++ b/tixbuildinfo @@ -0,0 +1,6 @@ +tix.version=1 +tix.class=srctix +pkg.name=links +pkg.build-libraries=libssl libz libevent? xz? +pkg.build-system=configure +pkg.location-independent=true