getlogin.c revision 71579
11573Srgrimes/* 21573Srgrimes * Copyright (c) 1988, 1993 31573Srgrimes * The Regents of the University of California. All rights reserved. 41573Srgrimes * 51573Srgrimes * Redistribution and use in source and binary forms, with or without 61573Srgrimes * modification, are permitted provided that the following conditions 71573Srgrimes * are met: 81573Srgrimes * 1. Redistributions of source code must retain the above copyright 91573Srgrimes * notice, this list of conditions and the following disclaimer. 101573Srgrimes * 2. Redistributions in binary form must reproduce the above copyright 111573Srgrimes * notice, this list of conditions and the following disclaimer in the 121573Srgrimes * documentation and/or other materials provided with the distribution. 131573Srgrimes * 3. All advertising materials mentioning features or use of this software 141573Srgrimes * must display the following acknowledgement: 151573Srgrimes * This product includes software developed by the University of 161573Srgrimes * California, Berkeley and its contributors. 171573Srgrimes * 4. Neither the name of the University nor the names of its contributors 181573Srgrimes * may be used to endorse or promote products derived from this software 191573Srgrimes * without specific prior written permission. 201573Srgrimes * 211573Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 221573Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 231573Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 241573Srgrimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 251573Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 261573Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 271573Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 281573Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 291573Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 301573Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 311573Srgrimes * SUCH DAMAGE. 3253859Swes * 3353859Swes * $FreeBSD: head/lib/libc/gen/getlogin.c 71579 2001-01-24 13:01:12Z deischen $ 341573Srgrimes */ 351573Srgrimes 361573Srgrimes#if defined(LIBC_SCCS) && !defined(lint) 371573Srgrimesstatic char sccsid[] = "@(#)getlogin.c 8.1 (Berkeley) 6/4/93"; 381573Srgrimes#endif /* LIBC_SCCS and not lint */ 391573Srgrimes 401573Srgrimes#include <sys/param.h> 4170557Sdeischen#include <errno.h> 421573Srgrimes#include <pwd.h> 431573Srgrimes#include <utmp.h> 441573Srgrimes#include <stdio.h> 451573Srgrimes#include <string.h> 461573Srgrimes#include <unistd.h> 4771579Sdeischen#include "namespace.h" 4871579Sdeischen#include <pthread.h> 4971579Sdeischen#include "un-namespace.h" 501573Srgrimes 5170557Sdeischen#include <libc_private.h> 521573Srgrimes 5371579Sdeischen#define THREAD_LOCK() if (__isthreaded) _pthread_mutex_lock(&logname_mutex) 5471579Sdeischen#define THREAD_UNLOCK() if (__isthreaded) _pthread_mutex_unlock(&logname_mutex) 5570557Sdeischen 5671579Sdeischenextern int _getlogin(char *, int); 5770557Sdeischen 5871579Sdeischenint _logname_valid; /* known to setlogin() */ 5971579Sdeischenstatic pthread_mutex_t logname_mutex = PTHREAD_MUTEX_INITIALIZER; 6071579Sdeischen 6170557Sdeischenstatic char * 6270557Sdeischengetlogin_basic(int *status) 631573Srgrimes{ 6423320Sache static char logname[MAXLOGNAME]; 651573Srgrimes 661573Srgrimes if (_logname_valid == 0) { 6733666Sjb#ifdef __NETBSD_SYSCALLS 6871579Sdeischen if (_getlogin(logname, sizeof(logname) - 1) < 0) { 6933666Sjb#else 7070557Sdeischen if (_getlogin(logname, sizeof(logname)) < 0) { 7133666Sjb#endif 7270557Sdeischen *status = errno; 7370557Sdeischen return (NULL); 7470557Sdeischen } 751573Srgrimes _logname_valid = 1; 761573Srgrimes } 7770557Sdeischen *status = 0; 7870557Sdeischen return (*logname ? logname : NULL); 791573Srgrimes} 8053859Swes 8170557Sdeischenchar * 8270557Sdeischengetlogin(void) 8370557Sdeischen{ 8470557Sdeischen char *result; 8570557Sdeischen int status; 8653859Swes 8770557Sdeischen THREAD_LOCK(); 8870557Sdeischen result = getlogin_basic(&status); 8970557Sdeischen THREAD_UNLOCK(); 9070557Sdeischen return (result); 9170557Sdeischen} 9270557Sdeischen 9370557Sdeischenint 9453859Swesgetlogin_r(char *logname, int namelen) 9553859Swes{ 9670557Sdeischen char *result; 9770557Sdeischen int len; 9870557Sdeischen int status; 9970557Sdeischen 10070557Sdeischen THREAD_LOCK(); 10170557Sdeischen result = getlogin_basic(&status); 10270557Sdeischen if (status == 0) { 10370557Sdeischen if ((len = strlen(result) + 1) > namelen) 10470557Sdeischen status = ERANGE; 10570557Sdeischen else 10670557Sdeischen strncpy(logname, result, len); 10753859Swes } 10870557Sdeischen THREAD_UNLOCK(); 10970557Sdeischen return (status); 11053859Swes} 111