]>
Commit | Line | Data |
---|---|---|
d614a753 | 1 | /* Copyright (C) 1991-2020 Free Software Foundation, Inc. |
8a523922 | 2 | This file is part of the GNU C Library. |
28f540f4 | 3 | |
8a523922 | 4 | The GNU C Library is free software; you can redistribute it and/or |
41bdb6e2 AJ |
5 | modify it under the terms of the GNU Lesser General Public |
6 | License as published by the Free Software Foundation; either | |
7 | version 2.1 of the License, or (at your option) any later version. | |
28f540f4 | 8 | |
8a523922 UD |
9 | The GNU C Library is distributed in the hope that it will be useful, |
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
41bdb6e2 | 12 | Lesser General Public License for more details. |
28f540f4 | 13 | |
41bdb6e2 | 14 | You should have received a copy of the GNU Lesser General Public |
59ba27a6 | 15 | License along with the GNU C Library; if not, see |
5a82c748 | 16 | <https://www.gnu.org/licenses/>. */ |
28f540f4 | 17 | |
28f540f4 RM |
18 | #include <errno.h> |
19 | #include <unistd.h> | |
20 | #include <string.h> | |
21 | #include <stdio.h> | |
22 | #include <limits.h> | |
23 | #include <fcntl.h> | |
24 | ||
25 | #include <utmp.h> | |
26 | ||
c8727fa6 UD |
27 | static char name[UT_NAMESIZE + 1]; |
28 | ||
28f540f4 RM |
29 | /* Return the login name of the user, or NULL if it can't be determined. |
30 | The returned pointer, if not NULL, is good only until the next call. */ | |
31 | ||
c8727fa6 UD |
32 | #ifdef STATIC |
33 | STATIC | |
34 | #endif | |
28f540f4 | 35 | char * |
23396375 | 36 | getlogin (void) |
28f540f4 | 37 | { |
ee188d55 RM |
38 | char tty_pathname[2 + 2 * NAME_MAX]; |
39 | char *real_tty_path = tty_pathname; | |
8c0677fe | 40 | int err; |
28f540f4 | 41 | char *result = NULL; |
8a523922 | 42 | struct utmp *ut, line, buffer; |
28f540f4 | 43 | |
a3e59be8 UD |
44 | /* Get name of tty connected to fd 0. Return NULL if not a tty or |
45 | if fd 0 isn't open. Note that a lot of documentation says that | |
46 | getlogin() is based on the controlling terminal---what they | |
47 | really mean is "the terminal connected to standard input". The | |
48 | getlogin() implementation of DEC Unix, SunOS, Solaris, HP-UX all | |
49 | return NULL if fd 0 has been closed, so this is the compatible | |
50 | thing to do. Note that ttyname(open("/dev/tty")) on those | |
51 | systems returns /dev/tty, so that is not a possible solution for | |
52 | getlogin(). */ | |
8c0677fe BH |
53 | err = __ttyname_r (0, real_tty_path, sizeof (tty_pathname)); |
54 | if (err != 0) | |
55 | { | |
56 | __set_errno (err); | |
57 | return NULL; | |
58 | } | |
28f540f4 RM |
59 | |
60 | real_tty_path += 5; /* Remove "/dev/". */ | |
61 | ||
8a523922 | 62 | __setutent (); |
58e07151 | 63 | strncpy (line.ut_line, real_tty_path, sizeof line.ut_line); |
8a523922 | 64 | if (__getutline_r (&line, &buffer, &ut) < 0) |
28f540f4 | 65 | { |
ee188d55 RM |
66 | if (errno == ESRCH) |
67 | /* The caller expects ENOENT if nothing is found. */ | |
c4029823 | 68 | __set_errno (ENOENT); |
ee188d55 | 69 | result = NULL; |
28f540f4 | 70 | } |
ee188d55 | 71 | else |
a3e59be8 UD |
72 | { |
73 | strncpy (name, ut->ut_user, UT_NAMESIZE); | |
74 | name[UT_NAMESIZE] = '\0'; | |
75 | result = name; | |
76 | } | |
ee188d55 | 77 | |
8a523922 | 78 | __endutent (); |
28f540f4 | 79 | |
28f540f4 RM |
80 | return result; |
81 | } |