Home | History | Annotate | Download | only in gen
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 
     22 /*
     23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 /*	Copyright (c) 1988 AT&T	*/
     28 /*	  All Rights Reserved  	*/
     29 
     30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     31 
     32 #pragma weak _getlogin = getlogin
     33 #pragma weak _getlogin_r = getlogin_r
     34 
     35 #include "lint.h"
     36 #include <sys/types.h>
     37 #include <sys/stat.h>
     38 #include <fcntl.h>
     39 #include <string.h>
     40 #include <stdlib.h>
     41 #include <limits.h>
     42 #include "utmpx.h"
     43 #include <unistd.h>
     44 #include <errno.h>
     45 #include <thread.h>
     46 #include <synch.h>
     47 #include <mtlib.h>
     48 #include "tsd.h"
     49 
     50 /*
     51  * XXX - _POSIX_LOGIN_NAME_MAX limits the length of a login name.  The utmpx
     52  * interface provides for a 32 character login name, but for the sake of
     53  * compatibility, we are still using the old utmp-imposed limit.
     54  */
     55 
     56 /*
     57  * POSIX.1c Draft-6 version of the function getlogin_r.
     58  * It was implemented by Solaris 2.3.
     59  */
     60 char *
     61 getlogin_r(char *answer, int namelen)
     62 {
     63 	int		uf;
     64 	off64_t		me;
     65 	struct futmpx	ubuf;
     66 
     67 	if (namelen < _POSIX_LOGIN_NAME_MAX) {
     68 		errno = ERANGE;
     69 		return (NULL);
     70 	}
     71 
     72 	if ((me = (off64_t)ttyslot()) < 0)
     73 		return (NULL);
     74 	if ((uf = open64(UTMPX_FILE, 0)) < 0)
     75 		return (NULL);
     76 	(void) lseek64(uf, me * sizeof (ubuf), SEEK_SET);
     77 	if (read(uf, &ubuf, sizeof (ubuf)) != sizeof (ubuf)) {
     78 		(void) close(uf);
     79 		return (NULL);
     80 	}
     81 	(void) close(uf);
     82 	if (ubuf.ut_user[0] == '\0')
     83 		return (NULL);
     84 	(void) strncpy(&answer[0], &ubuf.ut_user[0],
     85 	    _POSIX_LOGIN_NAME_MAX - 1);
     86 	answer[_POSIX_LOGIN_NAME_MAX - 1] = '\0';
     87 	return (&answer[0]);
     88 }
     89 
     90 /*
     91  * POSIX.1c standard version of the function getlogin_r.
     92  * User gets it via static getlogin_r from the header file.
     93  */
     94 int
     95 __posix_getlogin_r(char *name, int namelen)
     96 {
     97 	int nerrno = 0;
     98 	int oerrno = errno;
     99 
    100 	errno = 0;
    101 	if (getlogin_r(name, namelen) == NULL) {
    102 		if (errno == 0)
    103 			nerrno = EINVAL;
    104 		else
    105 			nerrno = errno;
    106 	}
    107 	errno = oerrno;
    108 	return (nerrno);
    109 }
    110 
    111 char *
    112 getlogin(void)
    113 {
    114 	char *answer = tsdalloc(_T_LOGIN, _POSIX_LOGIN_NAME_MAX, NULL);
    115 
    116 	if (answer == NULL)
    117 		return (NULL);
    118 	return (getlogin_r(answer, _POSIX_LOGIN_NAME_MAX));
    119 }
    120