From 0ad8fab5c7ed98016dca99e38f984ab58aedf5b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Walstr=C3=B6m?= Date: Wed, 18 Jun 2025 21:24:07 +0200 Subject: [PATCH] wpa_supplicant: Add support for pidfile when not daemonize --- ...d-pidfile-support-when-not-daemonize.patch | 232 ++++++++++++++++++ 1 file changed, 232 insertions(+) create mode 100644 patches/wpa_supplicant/0001-Add-pidfile-support-when-not-daemonize.patch diff --git a/patches/wpa_supplicant/0001-Add-pidfile-support-when-not-daemonize.patch b/patches/wpa_supplicant/0001-Add-pidfile-support-when-not-daemonize.patch new file mode 100644 index 00000000..2a12fddc --- /dev/null +++ b/patches/wpa_supplicant/0001-Add-pidfile-support-when-not-daemonize.patch @@ -0,0 +1,232 @@ +From 9df1957e656940a50b844da879911ab5981ad1a9 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Mattias=20Walstr=C3=B6m?= +Date: Wed, 18 Jun 2025 21:21:18 +0200 +Subject: [PATCH] Add pidfile support when not daemonize +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +Organization: Wires + +Adds pidfile.c from libite + +Signed-off-by: Mattias Walström +--- + wpa_supplicant/Makefile | 1 + + wpa_supplicant/pidfile.c | 153 ++++++++++++++++++++++++++++++++ + wpa_supplicant/wpa_supplicant.c | 7 +- + 3 files changed, 160 insertions(+), 1 deletion(-) + create mode 100644 wpa_supplicant/pidfile.c + +diff --git a/wpa_supplicant/Makefile b/wpa_supplicant/Makefile +index fd7d7a0bd..e14c7732a 100644 +--- a/wpa_supplicant/Makefile ++++ b/wpa_supplicant/Makefile +@@ -104,6 +104,7 @@ endif + OBJS = config.o + OBJS += notify.o + OBJS += bss.o ++OBJS += pidfile.o + OBJS += eap_register.o + OBJS += ../src/utils/common.o + OBJS += ../src/utils/config.o +diff --git a/wpa_supplicant/pidfile.c b/wpa_supplicant/pidfile.c +new file mode 100644 +index 000000000..29dfbe242 +--- /dev/null ++++ b/wpa_supplicant/pidfile.c +@@ -0,0 +1,153 @@ ++/* Updated by troglobit for libite/finit/uftpd projects 2016/07/04 */ ++/* $OpenBSD: pidfile.c,v 1.11 2015/06/03 02:24:36 millert Exp $ */ ++/* $NetBSD: pidfile.c,v 1.4 2001/02/19 22:43:42 cgd Exp $ */ ++ ++/*- ++ * Copyright (c) 1999 The NetBSD Foundation, Inc. ++ * All rights reserved. ++ * ++ * This code is derived from software contributed to The NetBSD Foundation ++ * by Jason R. Thorpe. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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. ++ */ ++ ++/** ++ * @file pidfile.c ++ * @author NetBSD Foundation Inc. ++ * @date 1999 ++ * @copyright 2-clause BSD License ++ */ ++ ++#include /* utimensat() */ ++#include /* utimensat() on *BSD */ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#ifndef pidfile ++static char *pidfile_path = NULL; ++static pid_t pidfile_pid = 0; ++ ++static void pidfile_cleanup(void); ++ ++const char *__pidfile_path = _PATH_VARRUN; /* Note: includes trailing slash '/' */ ++const char *__pidfile_name = NULL; ++extern char *__progname; ++ ++/** ++ * Create or update mtime of process PID file. ++ * @param basename Program name, or @c NULL, may start with '/' ++ * ++ * This function is intended to be used by UNIX daemons to save the PID of the main process ++ * responsible for handling signals. If @p basename is @c NULL the implicit @a __progname ++ * variable from the C-library is used. The @p basename may also start with '/', in which ++ * case it is interpreted as the absolute path to the PID file. ++ * ++ * @returns POSIX OK(0) on success, otherwise non-zero on error. ++ */ ++int pidfile(const char *basename) ++{ ++ int save_errno; ++ int atexit_already; ++ pid_t pid; ++ FILE *f; ++ ++ if (basename == NULL) ++ basename = __progname; ++ ++ pid = getpid(); ++ atexit_already = 0; ++ ++ if (pidfile_path != NULL) { ++ if (!access(pidfile_path, R_OK) && pid == pidfile_pid) { ++ utimensat(0, pidfile_path, NULL, 0); ++ return (0); ++ } ++ free(pidfile_path); ++ pidfile_path = NULL; ++ __pidfile_name = NULL; ++ atexit_already = 1; ++ } ++ ++ if (basename[0] != '/') { ++ if (asprintf(&pidfile_path, "%s.pid", basename) == -1) ++ return (-1); ++ } else { ++ if (asprintf(&pidfile_path, "%s", basename) == -1) ++ return (-1); ++ } ++ ++ if ((f = fopen(pidfile_path, "w")) == NULL) { ++ save_errno = errno; ++ free(pidfile_path); ++ pidfile_path = NULL; ++ errno = save_errno; ++ return (-1); ++ } ++ ++ if (fprintf(f, "%ld\n", (long)pid) <= 0 || fflush(f) != 0) { ++ save_errno = errno; ++ (void) fclose(f); ++ (void) unlink(pidfile_path); ++ free(pidfile_path); ++ pidfile_path = NULL; ++ errno = save_errno; ++ return (-1); ++ } ++ (void) fclose(f); ++ __pidfile_name = pidfile_path; ++ ++ /* ++ * LITE extension, no need to set up another atexit() handler ++ * if user only called us to update the mtime of the PID file ++ */ ++ if (atexit_already) ++ return (0); ++ ++ pidfile_pid = pid; ++ if (atexit(pidfile_cleanup) < 0) { ++ save_errno = errno; ++ (void) unlink(pidfile_path); ++ free(pidfile_path); ++ pidfile_path = NULL; ++ pidfile_pid = 0; ++ errno = save_errno; ++ return (-1); ++ } ++ ++ return (0); ++} ++ ++static void ++pidfile_cleanup(void) ++{ ++ if (pidfile_path != NULL && pidfile_pid == getpid()) { ++ (void) unlink(pidfile_path); ++ free(pidfile_path); ++ pidfile_path = NULL; ++ } ++} ++#endif +diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c +index dfbd63163..3a762ebc2 100644 +--- a/wpa_supplicant/wpa_supplicant.c ++++ b/wpa_supplicant/wpa_supplicant.c +@@ -123,6 +123,7 @@ const char *const wpa_supplicant_full_license5 = + "\n"; + #endif /* CONFIG_NO_STDOUT_DEBUG */ + ++int pidfile(const char *basename); + + static void wpa_bss_tmp_disallow_timeout(void *eloop_ctx, void *timeout_ctx); + static void wpas_verify_ssid_beacon(void *eloop_ctx, void *timeout_ctx); +@@ -1490,6 +1491,9 @@ static void wpa_supplicant_reconfig(int sig, void *signal_ctx) + /* Ignore errors since we cannot really do much to fix this */ + wpa_printf(MSG_DEBUG, "Could not reopen debug log file"); + } ++ ++ if (!global->params.daemonize) ++ pidfile(global->params.pid_file); + } + + +@@ -8555,7 +8559,6 @@ struct wpa_global * wpa_supplicant_init(struct wpa_params *params) + return global; + } + +- + /** + * wpa_supplicant_run - Run the %wpa_supplicant main event loop + * @global: Pointer to global data from wpa_supplicant_init() +@@ -8589,6 +8592,8 @@ int wpa_supplicant_run(struct wpa_global *global) + eloop_register_signal_terminate(wpa_supplicant_terminate, global); + eloop_register_signal_reconfig(wpa_supplicant_reconfig, global); + ++ if (!global->params.daemonize) ++ pidfile(global->params.pid_file); + eloop_run(); + + return 0; +-- +2.43.0 +