diff --git a/Knot.files b/Knot.files index 222900e458b2da1b34f74b220d33177e68e35df1..7157f4c36ad5ca986846ef945e121c884fc763e2 100644 --- a/Knot.files +++ b/Knot.files @@ -499,8 +499,6 @@ src/utils/kxdpgun/ip_route.h src/utils/kxdpgun/load_queries.c src/utils/kxdpgun/load_queries.h src/utils/kxdpgun/main.c -src/utils/kxdpgun/popenve.c -src/utils/kxdpgun/popenve.h src/utils/kzonecheck/main.c src/utils/kzonecheck/zone_check.c src/utils/kzonecheck/zone_check.h diff --git a/src/utils/Makefile.inc b/src/utils/Makefile.inc index 67f331cc52ac0ba490bac8c2445fcac11c6152c1..5241536f2b54800844a8ecced2243f2e54946829 100644 --- a/src/utils/Makefile.inc +++ b/src/utils/Makefile.inc @@ -90,9 +90,7 @@ kxdpgun_SOURCES = \ utils/kxdpgun/ip_route.h \ utils/kxdpgun/load_queries.c \ utils/kxdpgun/load_queries.h \ - utils/kxdpgun/main.c \ - utils/kxdpgun/popenve.c \ - utils/kxdpgun/popenve.h + utils/kxdpgun/main.c kxdpgun_CPPFLAGS = $(AM_CPPFLAGS) kxdpgun_LDADD = libcontrib.la libknot.la $(pthread_LIBS) $(cap_ng_LIBS) $(libmnl_LIBS) diff --git a/src/utils/kxdpgun/popenve.c b/src/utils/kxdpgun/popenve.c deleted file mode 100644 index 116a2c2f9349507162149a09425d959e6948906f..0000000000000000000000000000000000000000 --- a/src/utils/kxdpgun/popenve.c +++ /dev/null @@ -1,101 +0,0 @@ -/* Copyright (C) 2020 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz> - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <https://www.gnu.org/licenses/>. - */ - -#include <errno.h> -#include <fcntl.h> -#include <stdlib.h> -#include <unistd.h> - -#include "utils/kxdpgun/popenve.h" - -#ifdef ENABLE_CAP_NG -#include <cap-ng.h> - -static void drop_capabilities(void) -{ - /* Drop all capabilities. */ - if (capng_have_capability(CAPNG_EFFECTIVE, CAP_SETPCAP)) { - capng_clear(CAPNG_SELECT_BOTH); - capng_apply(CAPNG_SELECT_BOTH); - } -} -#else /* ENABLE_CAP_NG */ -static void drop_capabilities(void) { } -#endif - -int kpopenvef(const char *binfile, char *const args[], char *const env[], bool drop_cap) -{ - int pipefds[2]; - if (pipe(pipefds) < 0) { - return -errno; - } - if (fcntl(pipefds[0], F_SETFD, FD_CLOEXEC) < 0) { - int fcntlerrno = errno; - close(pipefds[0]); - close(pipefds[1]); - return -fcntlerrno; - } - - pid_t forkpid = fork(); - if (forkpid < 0) { - int forkerrno = errno; - close(pipefds[0]); - close(pipefds[1]); - return -forkerrno; - } - - if (forkpid == 0) { -dup_stdout: - if (dup2(pipefds[1], STDOUT_FILENO) < 0) { - if (errno == EINTR) { - goto dup_stdout; - } - perror("dup_stdout"); - close(pipefds[0]); - close(pipefds[1]); - exit(EXIT_FAILURE); - } - close(pipefds[1]); - - if (drop_cap) { - drop_capabilities(); - } - - execve(binfile, args, env); - perror("execve"); - exit(EXIT_FAILURE); - } - - close(pipefds[1]); - return pipefds[0]; -} - -FILE *kpopenve(const char *binfile, char *const args[], char *const env[], bool drop_cap) -{ - int p = kpopenvef(binfile, args, env, drop_cap); - if (p < 0) { - errno = -p; - return NULL; - } - - FILE *res = fdopen(p, "r"); - if (res == NULL) { - int fdoerrno = errno; - close(p); - errno = fdoerrno; - } - return res; -} diff --git a/src/utils/kxdpgun/popenve.h b/src/utils/kxdpgun/popenve.h deleted file mode 100644 index feb84145327589f86a3c900bdee7b7866261ee04..0000000000000000000000000000000000000000 --- a/src/utils/kxdpgun/popenve.h +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright (C) 2020 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz> - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <https://www.gnu.org/licenses/>. - */ - -#pragma once - -#include <stdbool.h> -#include <stdio.h> - -/*! - * \brief Hybrid of popen() and execve() returning a file descriptor - * - * This function is a safer altervative to popen(), it is the same to - * popen() as execve() is to system(). - * - * Warning: this function is designed to be as simple as possible, - * for reliable operation proper checking for transient - * error is needed. - * - * \param binfile Executable file to be executed. - * \param args NULL-terminated arguments; first shall be the prog name! - * \param env NULL-terminated environment variables "key=value" - * \param drop_cap Drop capabilities for the subprocess. - * - * \retval < 0 Error occured, set to -errno. - * \return > 0 File descriptor of the pipe reading end. - */ -int kpopenvef(const char *binfile, char *const args[], char *const env[], bool drop_cap); - -/*! - * \brief Variant of kpopenvef() returning FILE* - * - * Warning: the same warning as for kpopenvef() applies here too. - * - * \param binfile Executable file to be executed. - * \param args NULL-terminated arguments; first shall be the prog name! - * \param env NULL-terminated environment variables "key=value" - * \param drop_cap Drop capabilities for the subprocess. - * - * \retval NULL Error occured, see errno. - * \return Pointer to open file descriptor. - */ -FILE *kpopenve(const char *binfile, char *const args[], char *const env[], bool drop_cap);