From fe90d24fd0cb9cd3b246b8a7936d060f502f47de Mon Sep 17 00:00:00 2001 From: Omar Polo Date: Thu, 4 Feb 2021 13:42:35 +0000 Subject: [PATCH] add compat for setproctitle This adds a check for setproctitle and for the (linux) prctl PR_SET_NAME. If setproctitle is not available, on linux we provide an implementation that use prctl (taken from tmux compat layer.) --- compat/setproctitle.c | 54 +++++++++++++++++++++++++++++++++++++++++++ configure | 10 ++++++++ have/pr_set_name.c | 24 +++++++++++++++++++ have/setproctitle.c | 23 ++++++++++++++++++ 4 files changed, 111 insertions(+) create mode 100644 compat/setproctitle.c create mode 100644 have/pr_set_name.c create mode 100644 have/setproctitle.c diff --git a/compat/setproctitle.c b/compat/setproctitle.c new file mode 100644 index 0000000..e387409 --- /dev/null +++ b/compat/setproctitle.c @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2016 Nicholas Marriott + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include + +#include "../config.h" + +#if HAVE_PR_SET_NAME + +#include + +void +setproctitle(const char *fmt, ...) +{ + char title[16], name[16], *cp; + va_list ap; + int used; + + va_start(ap, fmt); + vsnprintf(title, sizeof title, fmt, ap); + va_end(ap); + + used = snprintf(name, sizeof name, "%s: %s", getprogname(), title); + if (used >= (int)sizeof name) { + cp = strrchr(name, ' '); + if (cp != NULL) + *cp = '\0'; + } + prctl(PR_SET_NAME, name); +} +#else +void +setproctitle(const char *fmt, ...) +{ + (void)fmt; +} +#endif diff --git a/configure b/configure index be767b4..32f40ed 100755 --- a/configure +++ b/configure @@ -48,7 +48,9 @@ HAVE_EXPLICIT_BZERO= HAVE_GETPROGNAME= HAVE_LIBTLS= HAVE_OPENSSL= +HAVE_PR_SET_NAME= HAVE_RECALLOCARRAY= +HAVE_SETPROCTITLE= HAVE_STRLCAT= HAVE_STRLCPY= HAVE_STRTONUM= @@ -219,7 +221,9 @@ runtest explicit_bzero EXPLICIT_BZERO || true runtest getprogname GETPROGNAME || true runtest libtls LIBTLS || true runtest openssl OPENSSL || true +runtest pr_set_name PR_SET_NAME || true runtest recallocarray RECALLOCARRAY || true +runtest setproctitle SETPROCTITLE || true runtest strlcat STRLCAT || true runtest strlcpy STRLCPY || true runtest strtonum STRTONUM || true @@ -260,7 +264,9 @@ cat <<__HEREDOC__ #define HAVE_ERR ${HAVE_ERR} #define HAVE_EXPLICIT_BZERO ${HAVE_EXPLICIT_BZERO} #define HAVE_GETPROGNAME ${HAVE_GETPROGNAME} +#define HAVE_PR_SET_NAME ${HAVE_PR_SET_NAME} #define HAVE_RECALLOCARRAY ${HAVE_RECALLOCARRAY} +#define HAVE_SETPROCTITLE ${SETPROCTITLE} #define HAVE_STRLCAT ${HAVE_STRLCAT} #define HAVE_STRLCPY ${HAVE_STRLCPY} #define HAVE_STRTONUM ${HAVE_STRTONUM} @@ -297,6 +303,10 @@ if [ ${HAVE_RECALLOCARRAY} -eq 0 ]; then echo "extern void* recallocarray(void*, size_t, size_t, size_t);" COMPAT="${COMPAT} compat/recallocarray.o" fi +if [ ${HAVE_SETPROCTITLE} -eq 0 ]; then + echo "extern void setproctitle(const char *fmt, ...);" + COMPAT="${COMPAT} compat/setproctitle.o" +fi if [ ${HAVE_STRLCAT} -eq 0 ]; then echo "extern size_t strlcat(char*, const char*, size_t);" COMPAT="${COMPAT} compat/strlcat.o" diff --git a/have/pr_set_name.c b/have/pr_set_name.c new file mode 100644 index 0000000..2970511 --- /dev/null +++ b/have/pr_set_name.c @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2021 Omar Polo + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include + +int +main(void) +{ + prctl(PR_SET_NAME, "foo"); +} diff --git a/have/setproctitle.c b/have/setproctitle.c new file mode 100644 index 0000000..69a5f8c --- /dev/null +++ b/have/setproctitle.c @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021 Omar Polo + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +int +main(void) +{ + setproctitle("%s", "frobnicator"); +}