getlogin(3) Library Functions Manual getlogin(3)

getlogin, getlogin_r, cuserid - odczytanie nazwy użytkownika

Standardowa biblioteka C (libc, -lc)

#include <unistd.h>
char *getlogin(void);
int getlogin_r(char buf[.bufsize], size_t bufsize);
#include <stdio.h>
char *cuserid(char *string);
Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)):

getlogin_r():

    _POSIX_C_SOURCE >= 199506L

cuserid():

    Since glibc 2.24:
        (_XOPEN_SOURCE && ! (_POSIX_C_SOURCE >= 200112L)
            || _GNU_SOURCE
    Up to and including glibc 2.23:
        _XOPEN_SOURCE

getlogin() zwraca wskaźnik do napisu zawierającego nazwę użytkownika zalogowanego na terminalu sterującym procesu lub wskaźnik null, jeśli nie można tej informacji określić. Napis jest alokowany statycznie i może zostać nadpisany przez późniejsze wywołanie tej funkcji lub funkcji cuserid().

getlogin_r() zwraca tę samą nazwę użytkownika w tablicy buf o rozmiarze bufsize.

cuserid() zwraca wskaźnik do napisu zawierającego nazwę użytkownika skojarzonego z efektywnym identyfikatorem użytkownika procesu. Jeśli string nie jest wskaźnikiem null, to powinien być tablicą, która może pomieścić co najmniej L_cuserid znaków; napis jest zwracany w tej tablicy. W przeciwnym przypadku, zwracany jest wskaźnik do napisu w obszarze pamięci statycznej. Napis jest alokowany statycznie i może zostać nadpisany przez późniejsze wywołania tej funkcji lub funkcji getlogin().

Makro L_cuserid jest stałą całkowitą określającą, jaka duża tablica może być potrzebna do przechowania nazwy użytkownika. L_cuserid jest zadeklarowane w <stdio.h>.

Funkcje te pozwalają programowi pozytywnie zidentyfikować użytkownika, na prawach którego działa program (cuserid()) lub użytkownika zalogowanego w danej sesji (getlogin(). (Mogą to być różni użytkownicy, gdy wchodzą w grę programy z ustawionym bitem set-user-ID).

W większości zastosowań, bardziej przydatne dla określenia, kim jest użytkownik, jest posługiwanie się zmienną środowiskową LOGNAME. Jest to bardziej elastyczne, właśnie dlatego, że użytkownik może dowolnie ustawić LOGNAME.

getlogin() returns a pointer to the username when successful, and NULL on failure, with errno set to indicate the error. getlogin_r() returns 0 when successful, and nonzero on failure.

POSIX specifies:

Zostało osiągnięte ograniczenie na liczbę otwartych deskryptorów plików dla procesu.
Zostało osiągnięte systemowe ograniczenie na całkowitą liczbę otwartych plików.
Proces wywołujący nie ma przypisanego terminala sterującego.
(getlogin_r) The length of the username, including the terminating null byte ('\0'), is larger than bufsize.

Linux/glibc also has:

Brak odpowiedniego wpisu w pliku utmp.
Zabrakło pamięci na przydzielenie struktury passwd.
Standardowe wejście nie odnosi się do terminala (patrz USTERKI).

/etc/passwd
baza danych o hasłach
/var/run/utmp
(tradycyjnie /etc/utmp; niektóre wersje libc używały /var/adm/utmp)

Informacje o pojęciach używanych w tym rozdziale można znaleźć w podręczniku attributes(7).

Interfejs Atrybut Wartość
getlogin() Bezpieczeństwo wątkowe MT-Unsafe race:getlogin race:utent sig:ALRM timer locale
getlogin_r() Bezpieczeństwo wątkowe MT-Unsafe race:utent sig:ALRM timer locale
cuserid() Bezpieczeństwo wątkowe MT-Unsafe race:cuserid/!string locale

W powyższej tabeli utent w race:utent oznacza, że jeśli któraś z funkcji setutent(3), getutent(3) lub endutent(3) jest używana równolegle w różnych wątkach programu, może nastąpić sytuacja wyścigu danych. Ponieważ getlogin() i getlogin_r() wywołują te funkcje, stąd dla przypomnienia użytkownikom używamy race:utent.

OpenBSD ma getlogin() i setlogin() oraz nazwę użytkownika powiązanego z sesją, nawet jeśli nie ma on terminala sterującego.

POSIX.1-2008.
None.

POSIX.1-2001. OpenBSD.
System V, POSIX.1-1988. Removed in POSIX.1-1990. SUSv2. Removed in POSIX.1-2001.
System V has a cuserid() function which uses the real user ID rather than the effective user ID.

Na nieszczęście, raczej łatwo jest ogłupić getlogin(). Czasem nie działa ona wcale, gdyż jakiś program namieszał w pliku utmp. Często zwraca jedynie pierwszych 8 znaków nazwy logowania. Ponadto użytkownik obecnie zalogowany na terminalu sterującym programu nie musi być użytkownikiem, który ten program uruchomił. Ze względów związanych z bezpieczeństwem, należy unikać getlogin().

Proszę zauważyć, że glibc nie przestrzega wymagań POSIX i używa stdin zamiast /dev/tty. Jest to błąd. (Inne nowe systemy, takie jak SunOS 5.8, HP-UX 11.11 i FreeBSD 4.8, zwracają nazwę zalogowanego użytkownika także wtedy, gdy stdin został przekierowany).

Nikt dokładnie nie wie, co robi cuserid(); należy jej unikać w przenośnych programach. W ogóle należy jej unikać i używać zamiast niej getpwuid(geteuid()), jeśli jest to to, czego potrzeba. Nie należy używać cuserid().

logname(1), geteuid(2), getuid(2), utmp(5)

Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl>, Robert Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.

31 października 2023 r. Linux man-pages 6.06