From 5ed3b4ded6cf3e4de6fc8c8739b84231b0285b0e Mon Sep 17 00:00:00 2001 From: Dario Binacchi 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 Signed-off-by: Marc Kleine-Budde Signed-off-by: Dario Binacchi 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 + * + * 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 . + */ + +#include +#include +#include + +int main(int argc, char **argv) +{ + fork(); + + return 0; +} -- 2.32.0