| From 5ed3b4ded6cf3e4de6fc8c8739b84231b0285b0e Mon Sep 17 00:00:00 2001 |
| From: Dario Binacchi <dario.binacchi@amarulasolutions.com> |
| Date: Fri, 5 May 2023 08:57:45 +0200 |
| Subject: [PATCH] Don't compile programs using fork() on MMU-less systems |
| |
| Systems that lack a MMU cannot use fork() to create the child process. |
| The patch does not compile the affected programs on MMU-less systems. |
| |
| Co-developed-by: Marc Kleine-Budde <mkl@pengutronix.de> |
| Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de> |
| Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com> |
| Upstream: https://github.com/linux-can/can-utils/commit/5ed3b4ded6cf3e4de6fc8c8739b84231b0285b0e |
| --- |
| CMakeLists.txt | 15 ++++++++++++--- |
| GNUmakefile.am | 10 +++++++--- |
| Makefile | 16 +++++++++++++--- |
| check_cc.sh | 16 ++++++++++++++++ |
| configure.ac | 2 ++ |
| fork_test.c | 27 +++++++++++++++++++++++++++ |
| 6 files changed, 77 insertions(+), 9 deletions(-) |
| create mode 100755 check_cc.sh |
| create mode 100644 fork_test.c |
| |
| diff --git a/CMakeLists.txt b/CMakeLists.txt |
| index 09ccd805de66..aee8ff7fca02 100644 |
| --- a/CMakeLists.txt |
| +++ b/CMakeLists.txt |
| @@ -2,6 +2,7 @@ cmake_minimum_required(VERSION 3.3) |
| |
| project(can-utils LANGUAGES C) |
| |
| +include (CheckFunctionExists) |
| include (CheckSymbolExists) |
| include (GNUInstallDirs) |
| |
| @@ -25,12 +26,13 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSCM_TXTIME=SO_TXTIME") |
| include_directories (.) |
| include_directories (./include) |
| |
| +check_function_exists(fork HAVE_FORK) |
| + |
| set(PROGRAMS_CANLIB |
| asc2log |
| canbusload |
| candump |
| cangen |
| - canlogserver |
| canplayer |
| cansend |
| cansequence |
| @@ -39,6 +41,10 @@ set(PROGRAMS_CANLIB |
| slcanpty |
| ) |
| |
| +if(HAVE_FORK) |
| + list(APPEND PROGRAMS_CANLIB canlogserver) |
| +endif() |
| + |
| set(PROGRAMS_J1939 |
| j1939acd |
| j1939cat |
| @@ -49,7 +55,6 @@ set(PROGRAMS_J1939 |
| |
| set(PROGRAMS |
| ${PROGRAMS_CANLIB} |
| - bcmserver |
| canfdtest |
| cangw |
| cansniffer |
| @@ -57,13 +62,17 @@ set(PROGRAMS |
| isotpperf |
| isotprecv |
| isotpsend |
| - isotpserver |
| isotpsniffer |
| isotptun |
| slcan_attach |
| slcand |
| ) |
| |
| +if(HAVE_FORK) |
| + list(APPEND PROGRAMS bcmserver) |
| + list(APPEND PROGRAMS isotpserver) |
| +endif() |
| + |
| add_executable(can-calc-bit-timing |
| calc-bit-timing/can-calc-bit-timing.c |
| ) |
| diff --git a/GNUmakefile.am b/GNUmakefile.am |
| index 5a7ad75f682e..e818754db3a4 100644 |
| --- a/GNUmakefile.am |
| +++ b/GNUmakefile.am |
| @@ -75,14 +75,12 @@ EXTRA_DIST += \ |
| |
| bin_PROGRAMS = \ |
| asc2log \ |
| - bcmserver \ |
| can-calc-bit-timing \ |
| canbusload \ |
| candump \ |
| canfdtest \ |
| cangen \ |
| cangw \ |
| - canlogserver \ |
| canplayer \ |
| cansend \ |
| cansequence \ |
| @@ -91,7 +89,6 @@ bin_PROGRAMS = \ |
| isotpperf \ |
| isotprecv \ |
| isotpsend \ |
| - isotpserver \ |
| isotpsniffer \ |
| isotptun \ |
| j1939acd \ |
| @@ -106,6 +103,13 @@ bin_PROGRAMS = \ |
| slcanpty \ |
| testj1939 |
| |
| +if HAVE_FORK |
| +bin_PROGRAMS += \ |
| + bcmserver \ |
| + canlogserver \ |
| + isotpserver |
| +endif |
| + |
| j1939acd_LDADD = libj1939.la |
| j1939cat_LDADD = libj1939.la |
| j1939spy_LDADD = libj1939.la |
| diff --git a/Makefile b/Makefile |
| index 29eef997b290..a26ff3d75e67 100644 |
| --- a/Makefile |
| +++ b/Makefile |
| @@ -45,6 +45,8 @@ MAKEFLAGS := -k |
| |
| CFLAGS := -O2 -Wall -Wno-parentheses |
| |
| +HAVE_FORK := $(shell ./check_cc.sh "$(CC)" fork_test.c) |
| + |
| CPPFLAGS += \ |
| -I. \ |
| -Iinclude \ |
| @@ -66,10 +68,14 @@ PROGRAMS_ISOTP := \ |
| isotpperf \ |
| isotprecv \ |
| isotpsend \ |
| - isotpserver \ |
| isotpsniffer \ |
| isotptun |
| |
| +ifeq ($(HAVE_FORK),1) |
| +PROGRAMS_ISOTP += \ |
| + isotpserver |
| +endif |
| + |
| PROGRAMS_J1939 := \ |
| j1939acd \ |
| j1939cat \ |
| @@ -87,14 +93,12 @@ PROGRAMS := \ |
| $(PROGRAMS_J1939) \ |
| $(PROGRAMS_SLCAN) \ |
| asc2log \ |
| - bcmserver \ |
| can-calc-bit-timing \ |
| canbusload \ |
| candump \ |
| canfdtest \ |
| cangen \ |
| cansequence \ |
| - canlogserver \ |
| canplayer \ |
| cansend \ |
| cansniffer \ |
| @@ -103,6 +107,12 @@ PROGRAMS := \ |
| mcp251xfd-dump \ |
| slcanpty |
| |
| +ifeq ($(HAVE_FORK),1) |
| +PROGRAMS += \ |
| + canlogserver \ |
| + bcmserver |
| +endif |
| + |
| all: $(PROGRAMS) |
| |
| clean: |
| diff --git a/check_cc.sh b/check_cc.sh |
| new file mode 100755 |
| index 000000000000..d85ad129da9d |
| --- /dev/null |
| +++ b/check_cc.sh |
| @@ -0,0 +1,16 @@ |
| +#!/bin/sh |
| +# SPDX-License-Identifier: GPL-2.0-only |
| +# check_cc.sh - Helper to test userspace compilation support |
| +# Copyright (c) 2015 Andrew Lutomirski |
| + |
| +CC="$1" |
| +TESTPROG="$2" |
| +shift 2 |
| + |
| +if [ -n "$CC" ] && $CC -o /dev/null "$TESTPROG" -O0 "$@"; then |
| + echo 1 |
| +else |
| + echo 0 |
| +fi |
| + |
| +exit 0 |
| diff --git a/configure.ac b/configure.ac |
| index 5493c9c7ccdf..9bf62a5c6409 100644 |
| --- a/configure.ac |
| +++ b/configure.ac |
| @@ -76,6 +76,8 @@ AC_CHECK_FUNCS([ \ |
| strtoul \ |
| ]) |
| |
| +AM_CONDITIONAL(HAVE_FORK, test "$ac_cv_func_fork_works" = "yes") |
| + |
| # glibc versions before 2.17 needs to link with -lrt for clock_nanosleep |
| AC_SEARCH_LIBS([clock_nanosleep], [rt]) |
| |
| diff --git a/fork_test.c b/fork_test.c |
| new file mode 100644 |
| index 000000000000..036692392483 |
| --- /dev/null |
| +++ b/fork_test.c |
| @@ -0,0 +1,27 @@ |
| +/* SPDX-License-Identifier: GPL-2.0-only */ |
| +/* |
| + * Copyright (C) 2023 Dario Binacchi <dario.binacchi@amarulasolutions.com> |
| + * |
| + * This program is free software; you can redistribute it and/or modify |
| + * it under the terms of the version 2 of the GNU General Public License |
| + * as published by the Free Software Foundation |
| + * |
| + * 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 <http://www.gnu.org/licenses/>. |
| + */ |
| + |
| +#include <stdio.h> |
| +#include <sys/types.h> |
| +#include <unistd.h> |
| + |
| +int main(int argc, char **argv) |
| +{ |
| + fork(); |
| + |
| + return 0; |
| +} |
| -- |
| 2.32.0 |
| |