diff --git a/gamemode-zig/c/client_impl.c b/gamemode-zig/c/client_impl.c deleted file mode 100644 index f53d0635..00000000 --- a/gamemode-zig/c/client_impl.c +++ /dev/null @@ -1,395 +0,0 @@ -/* - -Copyright (c) 2017-2019, Feral Interactive -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Feral Interactive nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - - */ - -#define _GNU_SOURCE - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -// For developmental purposes -#define DO_TRACE 0 - -// D-Bus name, path, iface -#define DAEMON_DBUS_NAME "com.feralinteractive.GameMode" -#define DAEMON_DBUS_PATH "/com/feralinteractive/GameMode" -#define DAEMON_DBUS_IFACE "com.feralinteractive.GameMode" - -#define PORTAL_DBUS_NAME "org.freedesktop.portal.Desktop" -#define PORTAL_DBUS_PATH "/org/freedesktop/portal/desktop" -#define PORTAL_DBUS_IFACE "org.freedesktop.portal.GameMode" - -// Cleanup macros -#define _cleanup_(x) __attribute__((cleanup(x))) -#define _cleanup_bus_ _cleanup_(hop_off_the_bus) -#define _cleanup_msg_ _cleanup_(cleanup_msg) -#define _cleanup_dpc_ _cleanup_(cleanup_pending_call) -#define _cleanup_fds_ _cleanup_(cleanup_fd_array) - -#ifdef NDEBUG -#define DEBUG(...) -#else -#define DEBUG(...) fprintf(stderr, __VA_ARGS__) -#endif - -#if DO_TRACE -#define TRACE(...) fprintf(stderr, __VA_ARGS__) -#else -#define TRACE(...) -#endif - -// Prototypes -static int log_error(const char *fmt, ...) __attribute__((format(printf, 1, 2))); - -// Storage for error strings -static char error_string[512] = { 0 }; - -// memory helpers -static void cleanup_fd_array(int **fdlist) -{ - if (fdlist == NULL || *fdlist == NULL) - return; - - int errsave = errno; - for (int *fd = *fdlist; *fd != -1; fd++) { - TRACE("GM Closing fd %d\n", *fd); - (void)close(*fd); - } - - errno = errsave; - free(*fdlist); -} - -// Allocate a -1 termianted array of ints -static inline int *alloc_fd_array(int n) -{ - int *fds; - - size_t count = (size_t)n + 1; /* -1, terminated */ - fds = (int *)malloc(sizeof(int) * count); - for (size_t i = 0; i < count; i++) - fds[i] = -1; - - return fds; -} - -// Helper to check if we are running inside a flatpak -static int in_flatpak(void) -{ - static int status = -1; - - if (status == -1) { - struct stat sb; - int r; - - r = lstat("/.flatpak-info", &sb); - status = r == 0 && sb.st_size > 0; - } - - return status; -} - -static int log_error(const char *fmt, ...) -{ - va_list args; - int n; - - va_start(args, fmt); - n = vsnprintf(error_string, sizeof(error_string), fmt, args); - va_end(args); - - if (n < 0) - DEBUG("Failed to format error string"); - else if ((size_t)n >= sizeof(error_string)) - DEBUG("Error log overflow"); - - fprintf(stderr, "GameMode ERROR: %s\n", error_string); - - return -1; -} - -static void hop_off_the_bus(DBusConnection **bus) -{ - if (bus == NULL) - return; - - dbus_connection_unref(*bus); -} - -static DBusConnection *hop_on_the_bus(void) -{ - DBusConnection *bus; - DBusError err; - - dbus_error_init(&err); - - bus = dbus_bus_get(DBUS_BUS_SESSION, &err); - - if (bus == NULL) { - log_error("Could not connect to bus: %s", err.message); - dbus_error_free(&err); - } - - return bus; -} - -/* cleanup functions */ -static void cleanup_msg(DBusMessage **msg) -{ - if (msg == NULL || *msg == NULL) - return; - - dbus_message_unref(*msg); -} - -static void cleanup_pending_call(DBusPendingCall **call) -{ - if (call == NULL || *call == NULL) - return; - - dbus_pending_call_unref(*call); -} - -/* internal API */ -static int make_request(DBusConnection *bus, int native, int use_pidfds, const char *method, - pid_t *pids, int npids, DBusError *error) -{ - _cleanup_msg_ DBusMessage *msg = NULL; - _cleanup_dpc_ DBusPendingCall *call = NULL; - _cleanup_fds_ int *fds = NULL; - char action[256] = { - 0, - }; - DBusError err; - DBusMessageIter iter; - int res = -1; - - TRACE("GM: Incoming request: %s, npids: %d, native: %d pifds: %d\n", - method, - npids, - native, - use_pidfds); - - if (use_pidfds) { - fds = alloc_fd_array(npids); - - res = open_pidfds(pids, fds, npids); - if (res != npids) { - dbus_set_error(error, DBUS_ERROR_FAILED, "Could not open pidfd for %d", (int)pids[res]); - return -1; - } - - if (strstr(method, "ByPID")) - snprintf(action, sizeof(action), "%sFd", method); - else - snprintf(action, sizeof(action), "%sByPIDFd", method); - method = action; - } - - TRACE("GM: Making request: %s, npids: %d, native: %d pifds: %d\n", - method, - npids, - native, - use_pidfds); - - // If we are inside a flatpak we need to talk to the portal instead - const char *dest = native ? DAEMON_DBUS_NAME : PORTAL_DBUS_NAME; - const char *path = native ? DAEMON_DBUS_PATH : PORTAL_DBUS_PATH; - const char *iface = native ? DAEMON_DBUS_IFACE : PORTAL_DBUS_IFACE; - - msg = dbus_message_new_method_call(dest, path, iface, method); - - if (!msg) { - dbus_set_error_const(error, DBUS_ERROR_FAILED, "Could not create dbus message"); - return -1; - } - - dbus_message_iter_init_append(msg, &iter); - - for (int i = 0; i < npids; i++) { - dbus_int32_t p; - int type; - - if (use_pidfds) { - type = DBUS_TYPE_UNIX_FD; - p = (dbus_int32_t)fds[i]; - } else { - type = DBUS_TYPE_INT32; - p = (dbus_int32_t)pids[i]; - } - dbus_message_iter_append_basic(&iter, type, &p); - } - - dbus_connection_send_with_reply(bus, msg, &call, -1); - dbus_connection_flush(bus); - dbus_message_unref(msg); - msg = NULL; - - dbus_pending_call_block(call); - msg = dbus_pending_call_steal_reply(call); - - if (msg == NULL) { - dbus_set_error_const(error, DBUS_ERROR_FAILED, "Did not receive a reply"); - return -1; - } - - dbus_error_init(&err); - res = -1; - if (dbus_set_error_from_message(&err, msg)) { - dbus_set_error(error, - err.name, - "Could not call method '%s' on '%s': %s", - method, - dest, - err.message); - } else if (!dbus_message_iter_init(msg, &iter) || - dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) { - dbus_set_error(error, DBUS_ERROR_INVALID_SIGNATURE, "Failed to parse response"); - } else { - dbus_message_iter_get_basic(&iter, &res); - } - - /* free the local error */ - if (dbus_error_is_set(&err)) - dbus_error_free(&err); - - return res; -} - -static int gamemode_request(const char *method, pid_t for_pid) -{ - _cleanup_bus_ DBusConnection *bus = NULL; - static int use_pidfs = 1; - DBusError err; - pid_t pids[2]; - int npids; - int native; - int res = -1; - - native = !in_flatpak(); - - /* pid[0] is the client, i.e. the game - * pid[1] is the requestor, i.e. this process - * - * we setup the array such that pids[1] will always be a valid - * pid, because if we are going to use the pidfd based API, - * both pids are being sent, even if they are the same - */ - pids[1] = getpid(); - pids[0] = for_pid != 0 ? for_pid : pids[1]; - - TRACE("GM: [%d] request '%s' received (by: %d) [portal: %s]\n", - (int)pids[0], - method, - (int)pids[1], - (native ? "n" : "y")); - - bus = hop_on_the_bus(); - - if (bus == NULL) - return -1; - - dbus_error_init(&err); -retry: - if (for_pid != 0 || use_pidfs) - npids = 2; - else - npids = 1; - - res = make_request(bus, native, use_pidfs, method, pids, npids, &err); - - if (res == -1 && use_pidfs && dbus_error_is_set(&err)) { - TRACE("GM: Request with pidfds failed (%s). Retrying.\n", err.message); - use_pidfs = 0; - dbus_error_free(&err); - goto retry; - } - - if (res == -1 && dbus_error_is_set(&err)) - log_error("D-Bus error: %s", err.message); - - TRACE("GM: [%d] request '%s' done: %d\n", (int)pids[0], method, res); - - if (dbus_error_is_set(&err)) - dbus_error_free(&err); - - return res; -} - -// Get the error string -extern const char *real_gamemode_error_string(void) -{ - return error_string; -} - -// Wrapper to call RegisterGame -extern int real_gamemode_request_start(void) -{ - return gamemode_request("RegisterGame", 0); -} - -// Wrapper to call UnregisterGame -extern int real_gamemode_request_end(void) -{ - return gamemode_request("UnregisterGame", 0); -} - -// Wrapper to call QueryStatus -extern int real_gamemode_query_status(void) -{ - return gamemode_request("QueryStatus", 0); -} - -// Wrapper to call RegisterGameByPID -extern int real_gamemode_request_start_for(pid_t pid) -{ - return gamemode_request("RegisterGameByPID", pid); -} - -// Wrapper to call UnregisterGameByPID -extern int real_gamemode_request_end_for(pid_t pid) -{ - return gamemode_request("UnregisterGameByPID", pid); -} - -// Wrapper to call QueryStatusByPID -extern int real_gamemode_query_status_for(pid_t pid) -{ - return gamemode_request("QueryStatusByPID", pid); -} diff --git a/gamemode-zig/c/client_loader.c b/gamemode-zig/c/client_loader.c deleted file mode 100644 index 08c86d06..00000000 --- a/gamemode-zig/c/client_loader.c +++ /dev/null @@ -1,35 +0,0 @@ -/* - -Copyright (c) 2017-2019, Feral Interactive -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Feral Interactive nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - - */ - -// Simply include the header with GAMEMODE_AUTO set -// This will ensure it calls the functions when it's loaded -#define GAMEMODE_AUTO -#include "gamemode_client.h" diff --git a/gamemode-zig/c/common/build-config.h b/gamemode-zig/c/common/build-config.h deleted file mode 100644 index e311c300..00000000 --- a/gamemode-zig/c/common/build-config.h +++ /dev/null @@ -1,4 +0,0 @@ -#define LIBEXECDIR "" -#define SYSCONFDIR "" -#define GAMEMODE_VERSION "" -#define HAVE_FN_PIDFD_OPEN 1 \ No newline at end of file diff --git a/gamemode-zig/c/common/common-helpers.c b/gamemode-zig/c/common/common-helpers.c deleted file mode 100644 index cfbdd362..00000000 --- a/gamemode-zig/c/common/common-helpers.c +++ /dev/null @@ -1,42 +0,0 @@ -/* - -Copyright (c) 2017-2019, Feral Interactive -Copyright (c) 2019, Red Hat -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Feral Interactive nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - - */ - -#define _GNU_SOURCE -#include "common-helpers.h" - -/* Starting with C99 we can use "inline" without "static" and thus avoid - * having multiple (local) definitions of the same inline function. One - * consequence of that is that if the compiler decides to *not* inline - * a specific call to the function the linker will expect an definition. - */ -extern inline void cleanup_close(int *fd); -extern inline void cleanup_free(void *ptr); diff --git a/gamemode-zig/c/common/common-helpers.h b/gamemode-zig/c/common/common-helpers.h deleted file mode 100644 index d079b3fd..00000000 --- a/gamemode-zig/c/common/common-helpers.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - -Copyright (c) 2017-2019, Feral Interactive -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Feral Interactive nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - - */ - -#pragma once - -#include -#include -#include -#include - -/** - * Value clamping helper, works like MIN/MAX but constraints a value within the range. - */ -#define CLAMP(l, u, value) MAX(MIN(l, u), MIN(MAX(l, u), value)) - -/** - * Little helper to safely print into a buffer, returns a pointer into the buffer - */ -#define buffered_snprintf(b, s, ...) \ - (snprintf(b, sizeof(b), s, __VA_ARGS__) < (ssize_t)sizeof(b) ? b : NULL) - -/** - * Little helper to safely print into a buffer, returns a newly allocated string - */ -#define safe_snprintf(b, s, ...) \ - (snprintf(b, sizeof(b), s, __VA_ARGS__) < (ssize_t)sizeof(b) ? strndup(b, sizeof(b)) : NULL) - -/** - * Helper function: Test, if haystack ends with needle. - */ -static inline const char *strtail(const char *haystack, const char *needle) -{ - char *pos = strstr(haystack, needle); - if (pos && (strlen(pos) == strlen(needle))) - return pos; - return NULL; -} - -/** - * Helper function for autoclosing file-descriptors. Does nothing if the argument - * is NULL or the referenced integer < 0. - */ -inline void cleanup_close(int *fd_ptr) -{ - if (fd_ptr == NULL || *fd_ptr < 0) - return; - - (void)close(*fd_ptr); -} - -/** - * Helper macro for autoclosing file-descriptors: use by prefixing the variable, - * like "autoclose_fd int fd = -1;". - */ -#define autoclose_fd __attribute__((cleanup(cleanup_close))) - -/** - * Helper function for auto-freeing dynamically allocated memory. Does nothing - * if *ptr is NULL (ptr must not be NULL). - */ -inline void cleanup_free(void *ptr) -{ - /* The function is defined to work with 'void *' because - * that will make sure it compiles without warning also - * for all types; what we are getting passed into is a - * pointer to a pointer though, so we need to cast */ - void *target = *(void **)ptr; - free(target); /* free can deal with NULL */ -} - -/** - * Helper macro for auto-freeing dynamically allocated memory: use by - * prefixing the variable, like "autofree char *data = NULL;". - */ -#define autofree __attribute__((cleanup(cleanup_free))) diff --git a/gamemode-zig/c/common/common-pidfds.c b/gamemode-zig/c/common/common-pidfds.c deleted file mode 100644 index 00929f70..00000000 --- a/gamemode-zig/c/common/common-pidfds.c +++ /dev/null @@ -1,200 +0,0 @@ -/* - -Copyright (c) 2017-2019, Feral Interactive -Copyright (c) 2019, Red Hat -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Feral Interactive nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ -#define _GNU_SOURCE -#include - -#include "common-helpers.h" -#include "common-pidfds.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if !HAVE_FN_PIDFD_OPEN -#include - -#ifndef __NR_pidfd_open -#define __NR_pidfd_open 434 -#endif - -static int pidfd_open(pid_t pid, unsigned int flags) -{ - return (int)syscall(__NR_pidfd_open, pid, flags); -} -#endif - -/* pidfd functions */ -int open_pidfds(pid_t *pids, int *fds, int count) -{ - int i = 0; - - for (i = 0; i < count; i++) { - int pid = pids[i]; - int fd = pidfd_open(pid, 0); - - if (fd < 0) - break; - - fds[i] = fd; - } - - return i; -} - -static int parse_pid(const char *str, pid_t *pid) -{ - unsigned long long int v; - char *end; - pid_t p; - - errno = 0; - v = strtoull(str, &end, 0); - if (end == str) - return -ENOENT; - else if (errno != 0) - return -errno; - - p = (pid_t)v; - - if (p < 1 || (unsigned long long int)p != v) - return -ERANGE; - - if (pid) - *pid = p; - - return 0; -} - -static int parse_status_field_pid(const char *val, pid_t *pid) -{ - const char *t; - - t = strrchr(val, '\t'); - if (t == NULL) - return -ENOENT; - - return parse_pid(t, pid); -} - -static int pidfd_to_pid(int fdinfo, int pidfd, pid_t *pid) -{ - autofree char *key = NULL; - autofree char *val = NULL; - char name[256] = { - 0, - }; - bool found = false; - FILE *f = NULL; - size_t keylen = 0; - size_t vallen = 0; - ssize_t n; - int fd; - int r = 0; - - *pid = 0; - - buffered_snprintf(name, "%d", pidfd); - - fd = openat(fdinfo, name, O_RDONLY | O_CLOEXEC | O_NOCTTY); - - if (fd != -1) - f = fdopen(fd, "r"); - - if (f == NULL) - return -errno; - - do { - n = getdelim(&key, &keylen, ':', f); - if (n == -1) { - r = errno; - break; - } - - n = getdelim(&val, &vallen, '\n', f); - if (n == -1) { - r = errno; - break; - } - - // TODO: strstrip (key); - - if (!strncmp(key, "Pid", 3)) { - r = parse_status_field_pid(val, pid); - found = r > -1; - } - - } while (r == 0 && !found); - - fclose(f); - - if (r < 0) - return r; - else if (!found) - return -ENOENT; - - return 0; -} - -int pidfds_to_pids(int *fds, pid_t *pids, int count) -{ - int fdinfo = -1; - int r = 0; - int i; - - fdinfo = open_fdinfo_dir(); - if (fdinfo == -1) - return -1; - - for (i = 0; i < count && r == 0; i++) - r = pidfd_to_pid(fdinfo, fds[i], &pids[i]); - - (void)close(fdinfo); - - if (r != 0) - errno = -r; - - return i; -} - -/* misc directory helpers */ -int open_fdinfo_dir(void) -{ - return open("/proc/self/fdinfo", O_RDONLY | O_NONBLOCK | O_DIRECTORY | O_CLOEXEC | O_NOCTTY); -} diff --git a/gamemode-zig/c/common/common-pidfds.h b/gamemode-zig/c/common/common-pidfds.h deleted file mode 100644 index b158517e..00000000 --- a/gamemode-zig/c/common/common-pidfds.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - -Copyright (c) 2017-2019, Feral Interactive -Copyright (c) 2019, Red Hat -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Feral Interactive nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#include - -/* Open pidfds for up to count process ids specified in pids. The - * pointer fds needs to point to an array with at least count - * entries. Will stop when it encounters an error (and sets errno). - * Returns the number of successfully opened pidfds (or -1 in case - * of other errors. */ -int open_pidfds(pid_t *pids, int *fds, int count); - -/* Translate up to count process ids to the corresponding process ids. - * The pointer pids needs to point to an array with at least count - * entries. Will stop when it encounters an error (and sets errno). - * Returns the number of successfully translated pidfds (or -1 in - * case of other errors. */ -int pidfds_to_pids(int *fds, pid_t *pids, int count); - -/* Helper to open the fdinfo directory for the current process, i.e. - * does open("/proc/self/fdinfo", ...). Returns the file descriptor - * for the directory, ownership is transferred and caller needs to - * call close on it. */ -int open_fdinfo_dir(void);