diff --git a/lib/libspl/Makefile.am b/lib/libspl/Makefile.am index d27932aff9..fbde2b57f0 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 0000000000..dca7162034 --- /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 0000000000..cda56e64c9 --- /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 2b057cc730..256b28c1b7 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; + size_t len = PATH_MAX; + int name[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1}; - (void) pthread_mutex_lock(&mtx); + if (sysctl(name, nitems(name), execname, &len, NULL, 0) != 0) + return (-1); - if (strlen(execname) == 0) { - int error, name[4]; - size_t len; - - 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; - } - - (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 6352a1a340..a640556bcb 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)); }