1 // SPDX-License-Identifier: CDDL-1.0 2 /* 3 * CDDL HEADER START 4 * 5 * The contents of this file are subject to the terms of the 6 * Common Development and Distribution License, Version 1.0 only 7 * (the "License"). You may not use this file except in compliance 8 * with the License. 9 * 10 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 11 * or https://opensource.org/licenses/CDDL-1.0. 12 * See the License for the specific language governing permissions 13 * and limitations under the License. 14 * 15 * When distributing Covered Code, include this CDDL HEADER in each 16 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 17 * If applicable, add the following below this CDDL HEADER, with the 18 * fields enclosed by brackets "[]" replaced with your own identifying 19 * information: Portions Copyright [yyyy] [name of copyright owner] 20 * 21 * CDDL HEADER END 22 */ 23 /* 24 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 25 * Use is subject to license terms. 26 */ 27 28 29 #include <limits.h> 30 #include <pthread.h> 31 #include <stdlib.h> 32 #include <string.h> 33 #include <unistd.h> 34 #include "libspl_impl.h" 35 36 37 const char * getexecname(void)38getexecname(void) 39 { 40 static char execname[PATH_MAX + 1] = ""; 41 static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; 42 43 char *ptr = execname; 44 ssize_t rc; 45 46 (void) pthread_mutex_lock(&mtx); 47 48 if (strlen(execname) == 0) { 49 rc = getexecname_impl(execname); 50 if (rc == -1) { 51 execname[0] = '\0'; 52 ptr = NULL; 53 } else { 54 execname[rc] = '\0'; 55 } 56 } 57 58 (void) pthread_mutex_unlock(&mtx); 59 return (ptr); 60 } 61