summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/pseudo/files
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-devtools/pseudo/files')
-rw-r--r--meta/recipes-devtools/pseudo/files/0001-Use-epoll-API-on-Linux.patch292
-rw-r--r--meta/recipes-devtools/pseudo/files/b6b68db896f9963558334aff7fca61adde4ec10f.patch48
-rwxr-xr-xmeta/recipes-devtools/pseudo/files/build-oldlibc20
-rw-r--r--meta/recipes-devtools/pseudo/files/efe0be279901006f939cd357ccee47b651c786da.patch99
-rw-r--r--meta/recipes-devtools/pseudo/files/fastopreply.patch76
-rw-r--r--meta/recipes-devtools/pseudo/files/glibc238.patch59
-rw-r--r--meta/recipes-devtools/pseudo/files/moreretries.patch19
-rw-r--r--meta/recipes-devtools/pseudo/files/older-glibc-symbols.patch57
-rw-r--r--meta/recipes-devtools/pseudo/files/toomanyfiles.patch59
9 files changed, 136 insertions, 593 deletions
diff --git a/meta/recipes-devtools/pseudo/files/0001-Use-epoll-API-on-Linux.patch b/meta/recipes-devtools/pseudo/files/0001-Use-epoll-API-on-Linux.patch
deleted file mode 100644
index 42557b17a7..0000000000
--- a/meta/recipes-devtools/pseudo/files/0001-Use-epoll-API-on-Linux.patch
+++ /dev/null
@@ -1,292 +0,0 @@
-From 9e407e0be01695e7b927f5820ade87ee9602c248 Mon Sep 17 00:00:00 2001
-From: Alexander Kanavin <alex.kanavin@gmail.com>
-Date: Fri, 15 Sep 2017 17:00:14 +0300
-Subject: [PATCH] Use epoll API on Linux
-
-Also a couple of other modifications due to epoll having
-a different approach to how the working set of fds is defined
-and used:
-1) open_client() returns an index into the array of clients
-2) close_client() has a protection against being called twice
-with the same client (which would mess up the active_clients
-counter)
-
-Upstream-Status: Submitted [Seebs CC'd by email]
-Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com>
-
----
- enums/exit_status.in | 3 +
- pseudo_server.c | 189 ++++++++++++++++++++++++++++++++++++++++++++++++++-
- 2 files changed, 190 insertions(+), 2 deletions(-)
-
-diff --git a/enums/exit_status.in b/enums/exit_status.in
-index 6be44d3..88f94cd 100644
---- a/enums/exit_status.in
-+++ b/enums/exit_status.in
-@@ -18,3 +18,6 @@ listen_fd, "server loop had no valid listen fd"
- pseudo_loaded, "server couldn't get out of pseudo environment"
- pseudo_prefix, "couldn't get valid pseudo prefix"
- pseudo_invocation, "invalid server command arguments"
-+epoll_create, "epoll_create() failed"
-+epoll_ctl, "epoll_ctl() failed"
-+
-diff --git a/pseudo_server.c b/pseudo_server.c
-index ff16efd..14d34de 100644
---- a/pseudo_server.c
-+++ b/pseudo_server.c
-@@ -40,6 +40,12 @@
- #include "pseudo_client.h"
- #include "pseudo_db.h"
-
-+// This has to come after pseudo includes, as that's where PSEUDO_PORT defines are
-+#ifdef PSEUDO_PORT_LINUX
-+#include <sys/epoll.h>
-+#endif
-+
-+
- static int listen_fd = -1;
-
- typedef struct {
-@@ -59,6 +65,7 @@ static int active_clients = 0, highest_client = 0, max_clients = 0;
-
- #define LOOP_DELAY 2
- #define DEFAULT_PSEUDO_SERVER_TIMEOUT 30
-+#define EPOLL_MAX_EVENTS 10
- int pseudo_server_timeout = DEFAULT_PSEUDO_SERVER_TIMEOUT;
- static int die_peacefully = 0;
- static int die_forcefully = 0;
-@@ -80,6 +87,9 @@ quit_now(int signal) {
- static int messages = 0, responses = 0;
- static struct timeval message_time = { .tv_sec = 0 };
-
-+#ifdef PSEUDO_PORT_LINUX
-+static void pseudo_server_loop_epoll(void);
-+#endif
- static void pseudo_server_loop(void);
-
- /* helper function to make a directory, just like mkdir -p.
-@@ -369,12 +379,16 @@ pseudo_server_start(int daemonize) {
- kill(ppid, SIGUSR1);
- }
- }
-+#ifdef PSEUDO_PORT_LINUX
-+ pseudo_server_loop_epoll();
-+#else
- pseudo_server_loop();
-+#endif
- return 0;
- }
-
- /* mess with internal tables as needed */
--static void
-+static unsigned int
- open_client(int fd) {
- pseudo_client_t *new_clients;
- int i;
-@@ -390,7 +404,7 @@ open_client(int fd) {
- ++active_clients;
- if (i > highest_client)
- highest_client = i;
-- return;
-+ return i;
- }
- }
-
-@@ -414,9 +428,11 @@ open_client(int fd) {
-
- max_clients += 16;
- ++active_clients;
-+ return max_clients - 16;
- } else {
- pseudo_diag("error allocating new client, fd %d\n", fd);
- close(fd);
-+ return 0;
- }
- }
-
-@@ -433,6 +449,10 @@ close_client(int client) {
- client, highest_client);
- return;
- }
-+ if (clients[client].fd == -1) {
-+ pseudo_debug(PDBGF_SERVER, "client %d already closed\n", client);
-+ return;
-+ }
- close(clients[client].fd);
- clients[client].fd = -1;
- free(clients[client].tag);
-@@ -566,6 +586,171 @@ serve_client(int i) {
- }
- }
-
-+#ifdef PSEUDO_PORT_LINUX
-+static void pseudo_server_loop_epoll(void)
-+{
-+ struct sockaddr_un client;
-+ socklen_t len;
-+ int i;
-+ int rc;
-+ int fd;
-+ int timeout;
-+ struct epoll_event ev, events[EPOLL_MAX_EVENTS];
-+ int loop_timeout = pseudo_server_timeout;
-+
-+ clients = malloc(16 * sizeof(*clients));
-+
-+ clients[0].fd = listen_fd;
-+ clients[0].pid = getpid();
-+
-+ for (i = 1; i < 16; ++i) {
-+ clients[i].fd = -1;
-+ clients[i].pid = 0;
-+ clients[i].tag = NULL;
-+ clients[i].program = NULL;
-+ }
-+
-+ active_clients = 1;
-+ max_clients = 16;
-+ highest_client = 0;
-+
-+ pseudo_debug(PDBGF_SERVER, "server loop started.\n");
-+ if (listen_fd < 0) {
-+ pseudo_diag("got into loop with no valid listen fd.\n");
-+ exit(PSEUDO_EXIT_LISTEN_FD);
-+ }
-+
-+ timeout = LOOP_DELAY * 1000;
-+
-+ int epollfd = epoll_create1(0);
-+ if (epollfd == -1) {
-+ pseudo_diag("epoll_create1() failed.\n");
-+ exit(PSEUDO_EXIT_EPOLL_CREATE);
-+ }
-+ ev.events = EPOLLIN;
-+ ev.data.u64 = 0;
-+ if (epoll_ctl(epollfd, EPOLL_CTL_ADD, clients[0].fd, &ev) == -1) {
-+ pseudo_diag("epoll_ctl() failed with listening socket.\n");
-+ exit(PSEUDO_EXIT_EPOLL_CTL);
-+ }
-+
-+ pdb_log_msg(SEVERITY_INFO, NULL, NULL, NULL, "server started (pid %d)", getpid());
-+
-+ for (;;) {
-+ rc = epoll_wait(epollfd, events, EPOLL_MAX_EVENTS, timeout);
-+ if (rc == 0 || (rc == -1 && errno == EINTR)) {
-+ /* If there's no clients, start timing out. If there
-+ * are active clients, never time out.
-+ */
-+ if (active_clients == 1) {
-+ loop_timeout -= LOOP_DELAY;
-+ /* maybe flush database to disk */
-+ pdb_maybe_backup();
-+ if (loop_timeout <= 0) {
-+ pseudo_debug(PDBGF_SERVER, "no more clients, got bored.\n");
-+ die_peacefully = 1;
-+ } else {
-+ /* display this if not exiting */
-+ pseudo_debug(PDBGF_SERVER | PDBGF_BENCHMARK, "%d messages handled in %.4f seconds, %d responses\n",
-+ messages,
-+ (double) message_time.tv_sec +
-+ (double) message_time.tv_usec / 1000000.0,
-+ responses);
-+ }
-+ }
-+ } else if (rc > 0) {
-+ loop_timeout = pseudo_server_timeout;
-+ for (i = 0; i < rc; ++i) {
-+ if (clients[events[i].data.u64].fd == listen_fd) {
-+ if (!die_forcefully) {
-+ len = sizeof(client);
-+ if ((fd = accept(listen_fd, (struct sockaddr *) &client, &len)) != -1) {
-+ /* Don't allow clients to end up on fd 2, because glibc's
-+ * malloc debug uses that fd unconditionally.
-+ */
-+ if (fd == 2) {
-+ int newfd = fcntl(fd, F_DUPFD, 3);
-+ close(fd);
-+ fd = newfd;
-+ }
-+ pseudo_debug(PDBGF_SERVER, "new client fd %d\n", fd);
-+ /* A new client implicitly cancels any
-+ * previous shutdown request, or a
-+ * shutdown for lack of clients.
-+ */
-+ pseudo_server_timeout = DEFAULT_PSEUDO_SERVER_TIMEOUT;
-+ die_peacefully = 0;
-+
-+ ev.events = EPOLLIN;
-+ ev.data.u64 = open_client(fd);
-+ if (ev.data.u64 != 0 && epoll_ctl(epollfd, EPOLL_CTL_ADD, clients[ev.data.u64].fd, &ev) == -1) {
-+ pseudo_diag("epoll_ctl() failed with accepted socket.\n");
-+ exit(PSEUDO_EXIT_EPOLL_CTL);
-+ }
-+ } else if (errno == EMFILE) {
-+ pseudo_debug(PDBGF_SERVER, "Hit max open files, dropping a client.\n");
-+ /* In theory there is a potential race here where if we close a client,
-+ it may have sent us a fastop message which we don't act upon.
-+ If we don't close a filehandle we'll loop indefinitely thought.
-+ Only close one per loop iteration in the interests of caution */
-+ for (int j = 1; j <= highest_client; ++j) {
-+ if (clients[j].fd != -1) {
-+ close_client(j);
-+ break;
-+ }
-+ }
-+ }
-+ }
-+ } else {
-+ struct timeval tv1, tv2;
-+ int rc;
-+ gettimeofday(&tv1, NULL);
-+ rc = serve_client(events[i].data.u64);
-+ gettimeofday(&tv2, NULL);
-+ ++messages;
-+ if (rc == 0)
-+ ++responses;
-+ message_time.tv_sec += (tv2.tv_sec - tv1.tv_sec);
-+ message_time.tv_usec += (tv2.tv_usec - tv1.tv_usec);
-+ if (message_time.tv_usec < 0) {
-+ message_time.tv_usec += 1000000;
-+ --message_time.tv_sec;
-+ } else while (message_time.tv_usec > 1000000) {
-+ message_time.tv_usec -= 1000000;
-+ ++message_time.tv_sec;
-+ }
-+ }
-+ if (die_forcefully)
-+ break;
-+ }
-+ pseudo_debug(PDBGF_SERVER, "server loop complete [%d clients left]\n", active_clients);
-+ } else {
-+ pseudo_diag("epoll_wait failed: %s\n", strerror(errno));
-+ break;
-+ }
-+ if (die_peacefully || die_forcefully) {
-+ pseudo_debug(PDBGF_SERVER, "quitting.\n");
-+ pseudo_debug(PDBGF_SERVER | PDBGF_BENCHMARK, "server %d exiting: handled %d messages in %.4f seconds\n",
-+ getpid(), messages,
-+ (double) message_time.tv_sec +
-+ (double) message_time.tv_usec / 1000000.0);
-+ pdb_log_msg(SEVERITY_INFO, NULL, NULL, NULL, "server %d exiting: handled %d messages in %.4f seconds",
-+ getpid(), messages,
-+ (double) message_time.tv_sec +
-+ (double) message_time.tv_usec / 1000000.0);
-+ /* and at this point, we'll start refusing connections */
-+ close(clients[0].fd);
-+ /* This is a good place to insert a delay for
-+ * debugging race conditions during startup. */
-+ /* usleep(300000); */
-+ exit(0);
-+ }
-+ }
-+
-+}
-+
-+#endif
-+
- /* get clients, handle messages, shut down.
- * This doesn't actually do any work, it just calls a ton of things which
- * do work.
---
-2.14.1
-
diff --git a/meta/recipes-devtools/pseudo/files/b6b68db896f9963558334aff7fca61adde4ec10f.patch b/meta/recipes-devtools/pseudo/files/b6b68db896f9963558334aff7fca61adde4ec10f.patch
deleted file mode 100644
index 3045a3b736..0000000000
--- a/meta/recipes-devtools/pseudo/files/b6b68db896f9963558334aff7fca61adde4ec10f.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From b6b68db896f9963558334aff7fca61adde4ec10f Mon Sep 17 00:00:00 2001
-From: Seebs <seebs@seebs.net>
-Date: Thu, 13 Apr 2017 18:12:01 -0500
-Subject: Prevent bash from segfaulting when unloading pseudo
-
-bash's extremely fancy internal awareness of how the environment looks
-means that, if you directly call the underlying libc "unsetenv" on
-a variable, bash can end up trying to access a null pointer. Fixing
-this generically is actually rather hard; you can't really avoid
-writing to environ on fork() or popen(), even if you change all
-execv*() functions to use the execv*e() variants. So for now, instead
-of unsetting the variable, set it to an empty string.
-
-Thanks to Saur in IRC for spotting this and helping debug it.
-
-Signed-off-by: Seebs <seebs@seebs.net>
-
-Upstream-Status: Backport
-
-diff --git a/ChangeLog.txt b/ChangeLog.txt
-index a2d30e9..8ba1ffa 100644
---- a/ChangeLog.txt
-+++ b/ChangeLog.txt
-@@ -1,3 +1,8 @@
-+2017-04-13:
-+ * (seebs) don't unset LD_PRELOAD or the like, because if you
-+ do that, bash can segfault because it "knows" how many
-+ fields are in environ.
-+
- 2017-02-24:
- * (seebs) import posix_acl_default fix from Anton Gerasimov
- <anton@advancedtelematic.com>
-diff --git a/pseudo_util.c b/pseudo_util.c
-index 172990b..6a1fac2 100644
---- a/pseudo_util.c
-+++ b/pseudo_util.c
-@@ -844,7 +844,7 @@ void pseudo_dropenv() {
- if (ld_preload && strlen(ld_preload)) {
- SETENV(PRELINK_LIBRARIES, ld_preload, 1);
- } else {
-- UNSETENV(PRELINK_LIBRARIES);
-+ SETENV(PRELINK_LIBRARIES, "", 1);
- }
- }
- }
---
-cgit v0.10.2
-
diff --git a/meta/recipes-devtools/pseudo/files/build-oldlibc b/meta/recipes-devtools/pseudo/files/build-oldlibc
new file mode 100755
index 0000000000..85c438de4e
--- /dev/null
+++ b/meta/recipes-devtools/pseudo/files/build-oldlibc
@@ -0,0 +1,20 @@
+#!/bin/sh
+#
+# Script to re-generate pseudo-prebuilt-2.33.tar.xz
+#
+# Copyright (C) 2021 Richard Purdie
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+
+for i in x86_64 aarch64 i686; do
+ if [ ! -e $i-nativesdk-libc.tar.xz ]; then
+ wget http://downloads.yoctoproject.org/releases/uninative/3.2/$i-nativesdk-libc.tar.xz
+ fi
+ tar -xf $i-nativesdk-libc.tar.xz --wildcards \*/lib/libpthread\* \*/lib/libdl\*
+ cd $i-linux/lib
+ ln -s libdl.so.2 libdl.so
+ ln -s libpthread.so.0 libpthread.so
+ cd ../..
+done
+tar -cJf pseudo-prebuilt-2.33.tar.xz *-linux \ No newline at end of file
diff --git a/meta/recipes-devtools/pseudo/files/efe0be279901006f939cd357ccee47b651c786da.patch b/meta/recipes-devtools/pseudo/files/efe0be279901006f939cd357ccee47b651c786da.patch
deleted file mode 100644
index 64fc58c4fe..0000000000
--- a/meta/recipes-devtools/pseudo/files/efe0be279901006f939cd357ccee47b651c786da.patch
+++ /dev/null
@@ -1,99 +0,0 @@
-From efe0be279901006f939cd357ccee47b651c786da Mon Sep 17 00:00:00 2001
-From: Seebs <seebs@seebs.net>
-Date: Fri, 24 Feb 2017 12:47:38 -0600
-Subject: Don't try to record 0-length posix_acl_default xattrs
-
-Based on a submission from Anton Gerasimov <anton@advancedtelematic.com>
-
-On some systems, with some kernel configs, "cp -a" apparently tries to
-set an empty ACL list, with a valid header but no contents, which causes
-strange and mysterious behavior later if we actually create such an entry.
-So filter that out, also sanity-check a couple of other things.
-
-Signed-off-by: Seebs <seebs@seebs.net>
-
-Upstream-Status: Backport
-
-diff --git a/ChangeLog.txt b/ChangeLog.txt
-index ae2a6e9..a2d30e9 100644
---- a/ChangeLog.txt
-+++ b/ChangeLog.txt
-@@ -1,3 +1,6 @@
-+2017-02-24:
-+ * (seebs) import posix_acl_default fix from Anton Gerasimov
-+ <anton@advancedtelematic.com>
- 2017-02-01:
- * (seebs) handle xattr deletion slightly more carefully.
- * (seebs) tag this as 1.8.2
-diff --git a/ports/linux/xattr/pseudo_wrappers.c b/ports/linux/xattr/pseudo_wrappers.c
-index 46bc053..d69d53e 100644
---- a/ports/linux/xattr/pseudo_wrappers.c
-+++ b/ports/linux/xattr/pseudo_wrappers.c
-@@ -62,9 +62,9 @@ static int
- posix_permissions(const acl_header *header, int entries, int *extra, int *mode) {
- int acl_seen = 0;
- if (le32(header->version) != 2) {
-- pseudo_diag("Fatal: ACL support no available for header version %d.\n",
-+ pseudo_diag("Fatal: ACL support not available for header version %d.\n",
- le32(header->version));
-- return 1;
-+ return -1;
- }
- *mode = 0;
- *extra = 0;
-@@ -140,12 +140,38 @@ static int shared_setxattr(const char *path, int fd, const char *name, const voi
- pseudo_debug(PDBGF_XATTR, "setxattr(%s [fd %d], %s => '%.*s')\n",
- path ? path : "<no path>", fd, name, (int) size, (char *) value);
-
-+ /* Filter out erroneous sizes for POSIX ACL
-+ * see posix_acl_xattr_count in include/linux/posix_acl_xattr.h of Linux source code */
-+ /* I don't think there's any posix_acl_* values that aren't in this format */
-+ if (!strncmp(name, "system.posix_acl_", 17)) {
-+ // ACL is corrupt, issue an error
-+ if(size < sizeof(acl_header) || (size - sizeof(acl_header)) % sizeof(acl_entry) != 0) {
-+ pseudo_debug(PDBGF_XATTR, "invalid data size for %s: %d\n",
-+ name, (int) size);
-+ errno = EINVAL;
-+ return -1;
-+ }
-+
-+ // ACL is empty, do nothing
-+ if((size - sizeof(acl_header)) / sizeof(acl_entry) == 0) {
-+ /* on some systems, "cp -a" will attempt to clone the
-+ * posix_acl_default entry for a directory (which would specify
-+ * default ACLs for new files in that directory), but if the
-+ * original was empty, we get a header but no entries. With
-+ * real xattr, that ends up being silently discarded, apparently,
-+ * so we discard it too.
-+ */
-+ pseudo_debug(PDBGF_XATTR, "0-length ACL entry %s.\n", name);
-+ return 0;
-+ }
-+ }
- /* this may be a plain chmod */
- if (!strcmp(name, "system.posix_acl_access")) {
- int extra;
- int mode;
- int entries = (size - sizeof(acl_header)) / sizeof(acl_entry);
-- if (!posix_permissions(value, entries, &extra, &mode)) {
-+ int res = posix_permissions(value, entries, &extra, &mode);
-+ if (res == 0) {
- pseudo_debug(PDBGF_XATTR, "posix_acl_access translated to mode %04o. Remaining attribute(s): %d.\n",
- mode, extra);
- buf.st_mode = mode;
-@@ -164,8 +190,12 @@ static int shared_setxattr(const char *path, int fd, const char *name, const voi
- if (!extra) {
- return 0;
- }
-+ } else if (res == -1) {
-+ errno = EOPNOTSUPP;
-+ return -1;
- }
- }
-+
- if (!strcmp(name, "user.pseudo_data")) {
- pseudo_debug(PDBGF_XATTR | PDBGF_XATTRDB, "user.pseudo_data xattribute does not get to go in database.\n");
- return -1;
---
-cgit v0.10.2
-
diff --git a/meta/recipes-devtools/pseudo/files/fastopreply.patch b/meta/recipes-devtools/pseudo/files/fastopreply.patch
deleted file mode 100644
index 904c2d04e6..0000000000
--- a/meta/recipes-devtools/pseudo/files/fastopreply.patch
+++ /dev/null
@@ -1,76 +0,0 @@
-Ensure FASTOP messages get an ACK reply so that the client can be sure the server
-recieved them. This means if connections are terminated, data isn't lost.
-
-RP 2017/9/22
-
-Upstream-Status: Submitted
-
-Index: pseudo-1.8.2/pseudo_client.c
-===================================================================
---- pseudo-1.8.2.orig/pseudo_client.c
-+++ pseudo-1.8.2/pseudo_client.c
-@@ -1331,21 +1331,19 @@ pseudo_client_request(pseudo_msg_t *msg,
- * indicating a successful send.
- */
- pseudo_debug(PDBGF_CLIENT | PDBGF_VERBOSE, "sent!\n");
-- if (msg->type != PSEUDO_MSG_FASTOP) {
-- response = pseudo_msg_receive(connect_fd);
-- if (!response) {
-- pseudo_debug(PDBGF_CLIENT, "expected response did not occur; retrying\n");
-+ response = pseudo_msg_receive(connect_fd);
-+ if (!response) {
-+ pseudo_debug(PDBGF_CLIENT, "expected response did not occur; retrying\n");
-+ } else {
-+ if (response->type != PSEUDO_MSG_ACK) {
-+ pseudo_debug(PDBGF_CLIENT, "got non-ack response %d\n", response->type);
-+ return 0;
-+ } else if (msg->type != PSEUDO_MSG_FASTOP) {
-+ pseudo_debug(PDBGF_CLIENT | PDBGF_VERBOSE, "got response type %d\n", response->type);
-+ return response;
- } else {
-- if (response->type != PSEUDO_MSG_ACK) {
-- pseudo_debug(PDBGF_CLIENT, "got non-ack response %d\n", response->type);
-- return 0;
-- } else {
-- pseudo_debug(PDBGF_CLIENT | PDBGF_VERBOSE, "got response type %d\n", response->type);
-- return response;
-- }
-+ return 0;
- }
-- } else {
-- return 0;
- }
- }
- pseudo_diag("pseudo: server connection persistently failed, aborting.\n");
-Index: pseudo-1.8.2/pseudo_server.c
-===================================================================
---- pseudo-1.8.2.orig/pseudo_server.c
-+++ pseudo-1.8.2/pseudo_server.c
-@@ -463,6 +463,11 @@ close_client(int client) {
- --highest_client;
- }
-
-+static pseudo_msg_t server_fastop_reply = {
-+ .type = PSEUDO_MSG_ACK,
-+ .op = OP_NONE,
-+};
-+
- /* Actually process a request.
- */
- static int
-@@ -515,8 +520,14 @@ serve_client(int i) {
- * pseudo_server_response.
- */
- if (in->type != PSEUDO_MSG_SHUTDOWN) {
-- if (in->type == PSEUDO_MSG_FASTOP)
-+ if (in->type == PSEUDO_MSG_FASTOP) {
- send_response = 0;
-+ /* For fastops we reply now to say we got the data */
-+ if ((rc = pseudo_msg_send(clients[i].fd, &server_fastop_reply, 0, NULL)) != 0) {
-+ pseudo_debug(PDBGF_SERVER, "failed to send fastop ack to client %d [%d]: %d (%s)\n",
-+ i, (int) clients[i].pid, rc, strerror(errno));
-+ }
-+ }
- /* most messages don't need these, but xattr may */
- response_path = 0;
- response_pathlen = -1;
diff --git a/meta/recipes-devtools/pseudo/files/glibc238.patch b/meta/recipes-devtools/pseudo/files/glibc238.patch
new file mode 100644
index 0000000000..da4b8caee3
--- /dev/null
+++ b/meta/recipes-devtools/pseudo/files/glibc238.patch
@@ -0,0 +1,59 @@
+glibc 2.38 would include __isoc23_strtol and similar symbols. This is trggerd by
+_GNU_SOURCE but we have to set that for other definitions. Therefore play with defines
+to turn this off within pseudo_wrappers.c. Elsewhere we can switch to _DEFAULT_SOURCE
+rather than _GNU_SOURCE.
+
+Upstream-Status: Pending
+
+Index: git/pseudo_wrappers.c
+===================================================================
+--- git.orig/pseudo_wrappers.c
++++ git/pseudo_wrappers.c
+@@ -6,6 +6,15 @@
+ * SPDX-License-Identifier: LGPL-2.1-only
+ *
+ */
++/* glibc 2.38 would include __isoc23_strtol and similar symbols. This is trggerd by
++ * _GNU_SOURCE but we have to set that for other definitions. Therefore play with defines
++ * to turn this off.
++ */
++#include <features.h>
++#undef __GLIBC_USE_ISOC2X
++#undef __GLIBC_USE_C2X_STRTOL
++#define __GLIBC_USE_C2X_STRTOL 0
++
+ #include <assert.h>
+ #include <stdlib.h>
+ #include <limits.h>
+Index: git/pseudo_util.c
+===================================================================
+--- git.orig/pseudo_util.c
++++ git/pseudo_util.c
+@@ -8,6 +8,14 @@
+ */
+ /* we need access to RTLD_NEXT for a horrible workaround */
+ #define _GNU_SOURCE
++/* glibc 2.38 would include __isoc23_strtol and similar symbols. This is trggerd by
++ * _GNU_SOURCE but we have to set that for other definitions. Therefore play with defines
++ * to turn this off.
++ */
++#include <features.h>
++#undef __GLIBC_USE_ISOC2X
++#undef __GLIBC_USE_C2X_STRTOL
++#define __GLIBC_USE_C2X_STRTOL 0
+
+ #include <ctype.h>
+ #include <errno.h>
+Index: git/pseudo_client.c
+===================================================================
+--- git.orig/pseudo_client.c
++++ git/pseudo_client.c
+@@ -6,7 +6,7 @@
+ * SPDX-License-Identifier: LGPL-2.1-only
+ *
+ */
+-#define _GNU_SOURCE
++#define _DEFAULT_SOURCE
+
+ #include <stdio.h>
+ #include <signal.h>
diff --git a/meta/recipes-devtools/pseudo/files/moreretries.patch b/meta/recipes-devtools/pseudo/files/moreretries.patch
deleted file mode 100644
index adea2665b0..0000000000
--- a/meta/recipes-devtools/pseudo/files/moreretries.patch
+++ /dev/null
@@ -1,19 +0,0 @@
-Increase the number of retries in pseudo due to occasional slow
-server shutdowns.
-
-Upstream-Status: Pending
-RP 2016/2/28
-
-Index: git/pseudo_client.c
-===================================================================
---- git.orig/pseudo_client.c
-+++ git/pseudo_client.c
-@@ -1282,7 +1282,7 @@ pseudo_client_setup(void) {
- }
- }
-
--#define PSEUDO_RETRIES 20
-+#define PSEUDO_RETRIES 250
- static pseudo_msg_t *
- pseudo_client_request(pseudo_msg_t *msg, size_t len, const char *path) {
- pseudo_msg_t *response = 0;
diff --git a/meta/recipes-devtools/pseudo/files/older-glibc-symbols.patch b/meta/recipes-devtools/pseudo/files/older-glibc-symbols.patch
new file mode 100644
index 0000000000..c453b5f735
--- /dev/null
+++ b/meta/recipes-devtools/pseudo/files/older-glibc-symbols.patch
@@ -0,0 +1,57 @@
+If we link against a newer glibc 2.34 and then try and our LD_PRELOAD is run against a
+binary on a host with an older libc, we see symbol errors since in glibc 2.34, pthread
+and dl are merged into libc itself.
+
+We need to use the older form of linking so use glibc binaries from an older release
+to force this. We only use minimal symbols from these anyway.
+
+pthread_atfork is problematic, particularly on arm so use the internal glibc routine
+it maps too. This was always present in the main libc from 2.3.2 onwards.
+
+Yes this is horrible. Better solutions welcome.
+
+There is more info in the bug: [YOCTO #14521]
+
+Upstream-Status: Inappropriate [this patch is native and nativesdk]
+Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
+
+Tweak library search order, make prebuilt lib ahead of recipe lib
+Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
+---
+ Makefile.in | 2 +-
+ pseudo_wrappers.c | 5 ++++-
+ 2 files changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/Makefile.in b/Makefile.in
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -120,7 +120,7 @@ $(PSEUDODB): pseudodb.o $(SHOBJS) $(DBOBJS) pseudo_ipc.o | $(BIN)
+ libpseudo: $(LIBPSEUDO)
+
+ $(LIBPSEUDO): $(WRAPOBJS) pseudo_client.o pseudo_ipc.o $(SHOBJS) | $(LIB)
+- $(CC) $(CFLAGS) $(CFLAGS_PSEUDO) -shared -o $(LIBPSEUDO) \
++ $(CC) $(CFLAGS) -Lprebuilt/$(shell uname -m)-linux/lib/ $(CFLAGS_PSEUDO) -shared -o $(LIBPSEUDO) \
+ pseudo_client.o pseudo_ipc.o \
+ $(WRAPOBJS) $(SHOBJS) $(LDFLAGS) $(CLIENT_LDFLAGS)
+
+diff --git a/pseudo_wrappers.c b/pseudo_wrappers.c
+--- a/pseudo_wrappers.c
++++ b/pseudo_wrappers.c
+@@ -100,10 +100,13 @@ static void libpseudo_atfork_child(void)
+ pseudo_mutex_holder = 0;
+ }
+
++extern void *__dso_handle;
++extern int __register_atfork (void (*) (void), void (*) (void), void (*) (void), void *);
++
+ static void
+ _libpseudo_init(void) {
+ if (!_libpseudo_initted)
+- pthread_atfork(NULL, NULL, libpseudo_atfork_child);
++ __register_atfork (NULL, NULL, libpseudo_atfork_child, &__dso_handle == NULL ? NULL : __dso_handle);
+
+ pseudo_getlock();
+ pseudo_antimagic();
+--
+2.27.0
+
diff --git a/meta/recipes-devtools/pseudo/files/toomanyfiles.patch b/meta/recipes-devtools/pseudo/files/toomanyfiles.patch
deleted file mode 100644
index b085a4505d..0000000000
--- a/meta/recipes-devtools/pseudo/files/toomanyfiles.patch
+++ /dev/null
@@ -1,59 +0,0 @@
-Currently if we max out the maximum number of files, pseudo can deadlock, unable to
-accept new connections yet unable to move forward and unblock the other processes
-waiting either.
-
-Rather than hang, when this happens, close out inactive connections, allowing us
-to accept the new ones. The disconnected clients will simply reconnect. There is
-a small risk of data loss here sadly but its better than hanging.
-
-RP
-2017/4/25
-
-Upstream-Status: Submitted [Peter is aware of the issue]
-
-Index: pseudo-1.8.2/pseudo_server.c
-===================================================================
---- pseudo-1.8.2.orig/pseudo_server.c
-+++ pseudo-1.8.2/pseudo_server.c
-@@ -581,6 +581,7 @@ pseudo_server_loop(void) {
- int rc;
- int fd;
- int loop_timeout = pseudo_server_timeout;
-+ int hitmaxfiles;
-
- clients = malloc(16 * sizeof(*clients));
-
-@@ -597,6 +598,7 @@ pseudo_server_loop(void) {
- active_clients = 1;
- max_clients = 16;
- highest_client = 0;
-+ hitmaxfiles = 0;
-
- pseudo_debug(PDBGF_SERVER, "server loop started.\n");
- if (listen_fd < 0) {
-@@ -663,10 +665,15 @@ pseudo_server_loop(void) {
- message_time.tv_usec -= 1000000;
- ++message_time.tv_sec;
- }
-+ } else if (hitmaxfiles) {
-+ /* Only close one per loop iteration in the interests of caution */
-+ close_client(i);
-+ hitmaxfiles = 0;
- }
- if (die_forcefully)
- break;
- }
-+ hitmaxfiles = 0;
- if (!die_forcefully &&
- (FD_ISSET(clients[0].fd, &events) ||
- FD_ISSET(clients[0].fd, &reads))) {
-@@ -688,6 +698,9 @@ pseudo_server_loop(void) {
- */
- pseudo_server_timeout = DEFAULT_PSEUDO_SERVER_TIMEOUT;
- die_peacefully = 0;
-+ } else if (errno == EMFILE) {
-+ hitmaxfiles = 1;
-+ pseudo_debug(PDBGF_SERVER, "Hit max open files, dropping a client.\n");
- }
- }
- pseudo_debug(PDBGF_SERVER, "server loop complete [%d clients left]\n", active_clients);