From c04295bb54b9292a7ee313c4e7a95ae3aa21da90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=BD=D0=B0=D0=B1?= Date: Sat, 10 Apr 2021 03:28:53 +0200 Subject: [PATCH] libspl: lift common bits of getexecname() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge the actual implementations of getexecname() and slightly clean up the FreeBSD one. Reviewed-by: Brian Behlendorf Signed-off-by: Ahelenia ZiemiaƄska Closes #11879 --- lib/libspl/Makefile.am | 2 + lib/libspl/getexecname.c | 59 +++++++++++++++++++++++++++++ lib/libspl/libspl_impl.h | 24 ++++++++++++ lib/libspl/os/freebsd/getexecname.c | 49 +++++------------------- lib/libspl/os/linux/getexecname.c | 37 +++--------------- 5 files changed, 99 insertions(+), 72 deletions(-) create mode 100644 lib/libspl/getexecname.c create mode 100644 lib/libspl/libspl_impl.h diff --git a/lib/libspl/Makefile.am b/lib/libspl/Makefile.am index fc4f27c64e3e..ff2dff93fada 100644 --- a/lib/libspl/Makefile.am +++ b/lib/libspl/Makefile.am @@ -21,6 +21,8 @@ libspl_assert_la_SOURCES = \ assert.c USER_C = \ + libspl_impl.h \ + getexecname.c \ list.c \ mkdirp.c \ page.c \ diff --git a/lib/libspl/getexecname.c b/lib/libspl/getexecname.c new file mode 100644 index 000000000000..dca7162034f7 --- /dev/null +++ b/lib/libspl/getexecname.c @@ -0,0 +1,59 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + + +#include +#include +#include +#include +#include +#include "libspl_impl.h" + + +const char * +getexecname(void) +{ + static char execname[PATH_MAX + 1] = ""; + static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; + + char *ptr = execname; + ssize_t rc; + + (void) pthread_mutex_lock(&mtx); + + if (strlen(execname) == 0) { + rc = getexecname_impl(execname); + if (rc == -1) { + execname[0] = '\0'; + ptr = NULL; + } else { + execname[rc] = '\0'; + } + } + + (void) pthread_mutex_unlock(&mtx); + return (ptr); +} diff --git a/lib/libspl/libspl_impl.h b/lib/libspl/libspl_impl.h new file mode 100644 index 000000000000..cda56e64c962 --- /dev/null +++ b/lib/libspl/libspl_impl.h @@ -0,0 +1,24 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + + +extern ssize_t getexecname_impl(char *execname); diff --git a/lib/libspl/os/freebsd/getexecname.c b/lib/libspl/os/freebsd/getexecname.c index 2b057cc73016..256b28c1b70e 100644 --- a/lib/libspl/os/freebsd/getexecname.c +++ b/lib/libspl/os/freebsd/getexecname.c @@ -20,52 +20,21 @@ * CDDL HEADER END */ - -#include +#include #include -#include -#include -#include #include #include #include -#include +#include "../../libspl_impl.h" -const char * -getexecname(void) +__attribute__((visibility("hidden"))) ssize_t +getexecname_impl(char *execname) { - static char execname[PATH_MAX + 1] = ""; - static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; - char *ptr = NULL; - ssize_t rc; - - (void) pthread_mutex_lock(&mtx); - - if (strlen(execname) == 0) { - int error, name[4]; - size_t len; + size_t len = PATH_MAX; + int name[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1}; - name[0] = CTL_KERN; - name[1] = KERN_PROC; - name[2] = KERN_PROC_PATHNAME; - name[3] = -1; - len = PATH_MAX; - error = sysctl(name, nitems(name), execname, &len, NULL, 0); - if (error != 0) { - rc = -1; - } else { - rc = len; - } - if (rc == -1) { - execname[0] = '\0'; - } else { - execname[rc] = '\0'; - ptr = execname; - } - } else { - ptr = execname; - } + if (sysctl(name, nitems(name), execname, &len, NULL, 0) != 0) + return (-1); - (void) pthread_mutex_unlock(&mtx); - return (ptr); + return (len); } diff --git a/lib/libspl/os/linux/getexecname.c b/lib/libspl/os/linux/getexecname.c index 6352a1a34015..a640556bcbec 100644 --- a/lib/libspl/os/linux/getexecname.c +++ b/lib/libspl/os/linux/getexecname.c @@ -19,41 +19,14 @@ * * CDDL HEADER END */ -/* - * Copyright 2007 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - #include -#include -#include -#include +#include #include +#include "../../libspl_impl.h" -const char * -getexecname(void) +__attribute__((visibility("hidden"))) ssize_t +getexecname_impl(char *execname) { - static char execname[PATH_MAX + 1] = ""; - static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; - char *ptr = NULL; - ssize_t rc; - - (void) pthread_mutex_lock(&mtx); - - if (strlen(execname) == 0) { - rc = readlink("/proc/self/exe", - execname, sizeof (execname) - 1); - if (rc == -1) { - execname[0] = '\0'; - } else { - execname[rc] = '\0'; - ptr = execname; - } - } else { - ptr = execname; - } - - (void) pthread_mutex_unlock(&mtx); - return (ptr); + return (readlink("/proc/self/exe", execname, PATH_MAX)); }