From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lj1-f180.google.com (mail-lj1-f180.google.com [209.85.208.180]) by sourceware.org (Postfix) with ESMTPS id 7D2443858002 for ; Sun, 1 Aug 2021 17:03:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 7D2443858002 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=rtems.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-lj1-f180.google.com with SMTP id n6so20764601ljp.9 for ; Sun, 01 Aug 2021 10:03:40 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:reply-to :from:date:message-id:subject:to:cc; bh=XbsOXWTPG6hQro69+riLl+k/YehDkbpGtzMIhWnHYuQ=; b=K2lqafbv2SO83/nUN5FvL8ghn0qVAzb/9NhdMRROi8FZX7m8yTS/pC3wlQ+dmXZFz0 GsgQ9uYlm2BOcOXKZwA5wrW9wPTgOSKtHFm9Wi+P3VmIJ8epQwymr5BDRvXEA/zMYm8p I1HKzfx1f+dTymVBDrKgoR8rjQKiioz8Cj/wRVbuqWgHYh4yAVZaoWzrX+Fptyh2Cpfo N9m+buW04Xw7thc7dkw7BNwPD6fGW/d3qhlyZ3Qtb8epbEBJz9OVh/Pb0B4MxpzNbfEK CSqLZE3UOrUOPj1O/ma+W7mlC1YlxHBeBxBOv2kO2G3d0LSclrGXvhDFOd9xtbd2QDzT 33hQ== X-Gm-Message-State: AOAM533ZzGiM5SHX9MB13uxQgD+VvXEzColyQhubqUyHiOb6jJ+M/y30 xJyzlnLGe12SEOnfCx+252skQiPraj+JyQ== X-Google-Smtp-Source: ABdhPJwRwqdp3N1bBdJhrBmYI7W+qUJWumpbHOAyRTpeGn5H7C+MsClPdWMcy0LOqB64Ou8e+PfQEg== X-Received: by 2002:a2e:3011:: with SMTP id w17mr8934211ljw.276.1627837419167; Sun, 01 Aug 2021 10:03:39 -0700 (PDT) Received: from mail-lf1-f41.google.com (mail-lf1-f41.google.com. [209.85.167.41]) by smtp.gmail.com with ESMTPSA id f26sm656927ljp.137.2021.08.01.10.03.38 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sun, 01 Aug 2021 10:03:39 -0700 (PDT) Received: by mail-lf1-f41.google.com with SMTP id h2so29269982lfu.4 for ; Sun, 01 Aug 2021 10:03:38 -0700 (PDT) X-Received: by 2002:ac2:5337:: with SMTP id f23mr9318368lfh.289.1627837418511; Sun, 01 Aug 2021 10:03:38 -0700 (PDT) MIME-Version: 1.0 References: <20210731132205.536278-1-mfjoyce2004@gmail.com> <20210731132205.536278-2-mfjoyce2004@gmail.com> In-Reply-To: <20210731132205.536278-2-mfjoyce2004@gmail.com> Reply-To: joel@rtems.org From: Joel Sherrill Date: Sun, 1 Aug 2021 12:03:27 -0500 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH 1/1] libc: Added implementation for sig2str/str2sig. To: Matt Joyce Cc: Newlib Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-3037.7 required=5.0 tests=BAYES_00, FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: newlib@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Newlib mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 01 Aug 2021 17:03:43 -0000 I think this is OK. There was a lot of discussion to incorporate so others need to concur. On Sat, Jul 31, 2021 at 8:22 AM Matt Joyce wrote: > > Added implementations for sig2str() and str2sig() in libc/signal > in order to improve POSIX compliance. Added fucntion prototypes > in libc/include/sys/signal.h. > --- > newlib/libc/include/sys/signal.h | 17 ++ > newlib/libc/signal/Makefile.am | 4 +- > newlib/libc/signal/sig2str.c | 298 +++++++++++++++++++++++++++++++ > 3 files changed, 317 insertions(+), 2 deletions(-) > create mode 100644 newlib/libc/signal/sig2str.c > > diff --git a/newlib/libc/include/sys/signal.h b/newlib/libc/include/sys/signal.h > index 45cc0366c..9c1c0e3c2 100644 > --- a/newlib/libc/include/sys/signal.h > +++ b/newlib/libc/include/sys/signal.h > @@ -12,6 +12,7 @@ extern "C" { > #include > #include > #include > +#include > > #if !defined(_SIGSET_T_DECLARED) > #define _SIGSET_T_DECLARED > @@ -238,6 +239,22 @@ int sigqueue (pid_t, int, const union sigval); > > #endif /* __POSIX_VISIBLE >= 199309 */ > > +/* Using __MISC_VISIBLE until POSIX Issue 8 is officially released */ > +#if __MISC_VISIBLE > + > +/* POSIX Issue 8 adds sig2str() and str2sig() */ > + > +#if __STDINT_EXP(INT_MAX) > 0x7fff > +#define SIG2STR_MAX (sizeof("RTMAX+") + sizeof("4294967295") - 1) > +#else > +#define SIG2STR_MAX (sizeof("RTMAX+") + sizeof("65535") - 1) > +#endif > + > +int sig2str(int, char *); > +int str2sig(const char *__restrict, int *__restrict); > + > +#endif /* __MISC_VISIBLE */ > + > #if defined(___AM29K__) > /* These all need to be defined for ANSI C, but I don't think they are > meaningful. */ > diff --git a/newlib/libc/signal/Makefile.am b/newlib/libc/signal/Makefile.am > index a93dba7a9..89db26113 100644 > --- a/newlib/libc/signal/Makefile.am > +++ b/newlib/libc/signal/Makefile.am > @@ -4,7 +4,7 @@ AUTOMAKE_OPTIONS = cygnus > > INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) > > -LIB_SOURCES = psignal.c raise.c signal.c > +LIB_SOURCES = psignal.c raise.c signal.c sig2str.c > > libsignal_la_LDFLAGS = -Xcompiler -nostdlib > > @@ -21,6 +21,6 @@ endif # USE_LIBTOOL > > include $(srcdir)/../../Makefile.shared > > -CHEWOUT_FILES = psignal.def raise.def signal.def > +CHEWOUT_FILES = psignal.def raise.def signal.def sig2str.def > > CHAPTERS = signal.tex > diff --git a/newlib/libc/signal/sig2str.c b/newlib/libc/signal/sig2str.c > new file mode 100644 > index 000000000..c02fcacbd > --- /dev/null > +++ b/newlib/libc/signal/sig2str.c > @@ -0,0 +1,298 @@ > +/* SPDX-License-Identifier: BSD-2-Clause */ > +/* > + * Copyright (C) 2021 Matthew Joyce > + * > + * 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 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. > + */ > + > +/* > +FUNCTION > +<>---translate between signal number and name > +<>---translate between signal name and number > + > +INDEX > + sig2str > +INDEX > + str2sig > + > +SYNOPSIS > + #include > + int sig2str(int <[signum]>, char *<[str]>); > + > + int str2sig(const char *restrict <[str]>, int *restrict <[pnum]>); > + > +DESCRIPTION > +The <> function translates the signal number specified by <[signum]> to > +a signal name and stores this string in the location specified by <[str}>. The > +application must ensure that <[str]> points to a location that can store the > +string including the terminating null byte. The symbolic constant > +<[SIG2STR_MAX]> defined in `<>' gives the maximum number of bytes > +required. > + > +The <> function translates the signal name in the string pointed to by > +<[str]> to a signal number and stores this value in the location specified by > +<[pnum]>. > + > +RETURNS > +<> returns <<0>> if <[signum]>> is a valid, supported signal number. > +Otherwise, it returns <<-1>>. > + > +<> returns <<0>> if it stores a value in the location pointed to by > +<[pnum]>. Otherwise it returns <<-1>>. > +*/ > + > +#include > +#include > +#include > +#include > + > +#define SPACES_TO_N 6 /* Allows indexing to RT Signal number in str2sig */ > +#define NUM_OF_SIGS (sizeof(sig_array) / sizeof(sig_name_and_num)) > + > +typedef struct sig_name_and_num { > + const char *sig_name; > + const int sig_num; > +} sig_name_and_num; > + > +static const sig_name_and_num sig_array[] = { > + { "EXIT", 0 }, > + #ifdef SIGHUP > + { "HUP", SIGHUP }, > + #endif > + #ifdef SIGINT > + { "INT", SIGINT }, > + #endif > + #ifdef SIGQUIT > + { "QUIT", SIGQUIT }, > + #endif > + #ifdef SIGILL > + { "ILL", SIGILL }, > + #endif > + #ifdef SIGTRAP > + { "TRAP", SIGTRAP }, > + #endif > + #ifdef SIGABRT > + { "ABRT", SIGABRT }, > + #endif > + #ifdef SIGIOT > + { "IOT", SIGIOT}, > + #endif > + #ifdef SIGEMT > + { "EMT", SIGEMT }, > + #endif > + #ifdef SIGFPE > + { "FPE", SIGFPE }, > + #endif > + #ifdef SIGKILL > + { "KILL", SIGKILL }, > + #endif > + #ifdef SIGBUS > + { "BUS", SIGBUS }, > + #endif > + #ifdef SIGSEGV > + { "SEGV", SIGSEGV }, > + #endif > + #ifdef SIGSYS > + { "SYS", SIGSYS }, > + #endif > + #ifdef SIGPIPE > + { "PIPE", SIGPIPE }, > + #endif > + #ifdef SIGALRM > + { "ALRM", SIGALRM }, > + #endif > + #ifdef SIGTERM > + { "TERM", SIGTERM }, > + #endif > + #ifdef SIGURG > + { "URG", SIGURG }, > + #endif > + #ifdef SIGSTOP > + { "STOP", SIGSTOP }, > + #endif > + #ifdef SIGTSTP > + { "TSTP", SIGTSTP }, > + #endif > + #ifdef SIGCONT > + { "CONT", SIGCONT }, > + #endif > + #ifdef SIGCHLD > + { "CHLD", SIGCHLD }, > + #endif > + #ifdef SIGCLD > + { "CLD", SIGCLD }, > + #endif > + #ifdef SIGTTIN > + { "TTIN", SIGTTIN }, > + #endif > + #ifdef SIGTTOU > + { "TTOU", SIGTTOU }, > + #endif > + #ifdef SIGIO > + { "IO", SIGIO }, > + #endif > + #ifdef SIGPOLL > + { "POLL", SIGPOLL }, > + #endif > + #ifdef SIGWINCH > + { "WINCH", SIGWINCH }, > + #endif > + #ifdef SIGUSR1 > + { "USR1", SIGUSR1 }, > + #endif > + #ifdef SIGUSR2 > + { "USR2", SIGUSR2 }, > + #endif > + #ifdef SIGPWR > + { "PWR", SIGPWR }, > + #endif > + #ifdef SIGXCPU > + { "XCPU", SIGXCPU }, > + #endif > + #ifdef SIGXFSZ > + { "XFSZ", SIGXFSZ }, > + #endif > + #ifdef SIGVTALRM > + { "VTALRM", SIGVTALRM }, > + #endif > + #ifdef SIGPROF > + { "PROF", SIGPROF }, > + #endif > + #ifdef SIGLOST > + { "LOST", SIGLOST }, > + #endif > + /* The Issue 8 standard requires that SIGRTMIN and SIGRTMAX be included > + * as valid results to be saved from calls to sig2str/str2sig. */ > + #ifdef SIGRTMIN > + { "RTMIN", SIGRTMIN }, > + #endif > + #ifdef SIGRTMAX > + { "RTMAX", SIGRTMAX } > + #endif > +}; > + > +int > +sig2str(int signum, char *str) > +{ > + const sig_name_and_num *sptr; > + > + /* If signum falls in lower half of the real time signals range, define > + * the saved str value as "RTMIN+n" according to the Issue 8 standard */ > + if ((SIGRTMIN + 1) <= signum && > + signum <= (SIGRTMIN + SIGRTMAX) / 2) { > + sprintf(str, "RTMIN+%d", (signum-SIGRTMIN)); > + return 0; > + } > + > + /* If signum falls in upper half of the real time signals range, define > + * the saved str value as "RTMAX-m" according to the Issue 8 standard */ > + if ((((SIGRTMIN + SIGRTMAX) / 2) + 1) <= signum && > + signum <= (SIGRTMAX - 1)) { > + sprintf(str, "RTMAX-%d", (SIGRTMAX - signum)); > + return 0; > + } > + > + /* Otherwise, search for signal matching signum in sig_array. If found, > + * save its string value in str. */ > + for (sptr = sig_array; sptr < &sig_array[NUM_OF_SIGS]; sptr++) { > + if (sptr->sig_num == signum) { > + strcpy(str, sptr->sig_name); > + return 0; > + } > + } > + > + /* If signum is not a recognized signal number, return -1 */ > + return -1; > +} > + > +int > +str2sig(const char *restrict str, int *restrict pnum) > +{ > + unsigned long j = 0; > + char *endp; > + const sig_name_and_num *sptr; > + unsigned long is_valid_decimal; > + > + /* i686 Cygwin only supports one RT signal. For this case, skip checks > + * for "RTMIN+n" and "RTMAX-m". */ > + if (SIGRTMIN != SIGRTMAX) { > + > + /* If str is in RT signal range, get number of of RT signal, save it as an > + * integer. */ > + if (strncmp(str, "RTMIN+", SPACES_TO_N) == 0) { > + j = strtoul(&str[SPACES_TO_N], &endp, 10); > + > + /* If number is valid, save it in pnum. */ > + if (*endp == '\0') { > + if (1 <= j && > + j <= ((SIGRTMAX - SIGRTMIN)-1)) { > + *pnum = (SIGRTMIN + j); > + return 0; > + } > + return -1; > + } > + return -1; > + } > + > + /* If str is in RT signal range, get number of of RT signal, save it as an > + * integer. */ > + if (strncmp(str, "RTMAX-", SPACES_TO_N) == 0) { > + j = strtoul(&str[SPACES_TO_N], &endp, 10); // and endptr null check > + > + /* If number is valid, save it in pnum. */ > + if (*endp == '\0') { > + if (1 <= j && > + j <= ((SIGRTMAX - SIGRTMIN)-1)) { > + *pnum = (SIGRTMAX - j); > + return 0; > + } > + return -1; > + } > + return -1; > + } > + } > + > + /*If str is a valid signal name, save its corresponding number in pnum. */ > + for (sptr = sig_array; sptr < &sig_array[NUM_OF_SIGS]; sptr++) { > + if (strcmp(sptr->sig_name, str) == 0) { > + *pnum = sptr->sig_num; > + return 0; > + } > + } > + > + /* str was not found in sig_array. Check whether str is a string > + * representation of a valid integer. */ > + is_valid_decimal = strtoul(str, &endp, 10); > + > + if (*endp != '\0') { > + return -1; > + } > + > + /* If str is a representation of a decimal value, save its integer value > + * in pnum. */ > + if (1 <= is_valid_decimal && > + is_valid_decimal <= SIGRTMAX) { > + *pnum = is_valid_decimal; > + return 0; > + } > + return -1; > +} > -- > 2.31.1 >