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);
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:
Linux/glibc also has:
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.
getlogin() i getlogin_r(): POSIX.1-2001, POSIX.1-2008.
System V zawiera funkcję cuserid(), która posługuje się raczej rzeczywistym identyfikatorem użytkownika niż efektywnym identyfikatorem użytkownika. Funkcję cuserid() włączono w wersji POSIX z roku 1988, ale usunięto ją w wersji z roku 1990. Była obecna w SUSv2, ale została usunięta w POSIX.1-2001.
OpenBSD ma getlogin() i setlogin() oraz nazwę użytkownika powiązanego z sesją, nawet jeśli nie ma on terminala sterującego.
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().
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.
5 lutego 2023 r. | Linux man-pages 6.03 |