getlogin_r(3) odczytanie nazwy użytkownika

Other Alias

getlogin, cuserid

SKŁADNIA

#include <unistd.h>

char *getlogin(void);
int getlogin_r(char *buf, size_t bufsize);

#include <stdio.h>

char *cuserid(char *string);

Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)):

getlogin_r(): _REENTRANT || _POSIX_C_SOURCE >= 199506L
cuserid(): _XOPEN_SOURCE

OPIS

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.

WARTOŚĆ ZWRACANA

getlogin() po pomyślnym zakończeniu zwraca wskaźnik do nazwy użytkownika. W przypadku błędu zwracany jest NULL,a errno jest ustawiane na wartość wskazującą na rodzaj błędu. getlogin_r() zwraca 0, jeśli skończy się sukcesem, lub wartość niezerową, gdy wystąpi błąd.

BŁĘDY

POSIX określa:
EMFILE
Proces wywołujący osiągnął już maksymalną dopuszczalną liczbę otwartych plików.
ENFILE
System osiągnął już maksymalną dopuszczalną liczbę otwartych plików.
ENXIO
Proces wywołujący nie ma przypisanego terminala sterującego.
ERANGE
(getlogin_r) Długość nazwy użytkownika, łącznie z końcowym znakiem null, ("\0") jest większa niż bufsize.

Linuksowe glibc zwraca także:

ENOENT
Brak odpowiedniego wpisu w pliku utmp.
ENOMEM
Zabrakło pamięci na przydzielenie struktury passwd.
ENOTTY
Standardowe wejście nie odnosi się do terminala (patrz BŁĘDY IMPLEMENTACJI).

PLIKI

/etc/passwd
plik bazy danych z hasłami
/var/run/utmp
(tradycyjnie /etc/utmp; niektóre wersje libc używały /var/adm/utmp)

ATRYBUTY

Wielowątkowość (patrz pthreads(7))

Funkcja getlogin() nie jest bezpieczna dla wątków.

Funkcja getlogin_r() jest bezpieczna dla wątków.

Funkcja cuserid() jest bezpieczna dla wątków z wyjątkiem sytuacji, gdy jest wywoływana z parametrem NULL.

ZGODNE Z

getlogin() i getlogin_r() są opisane w POSIX.1-2001.

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.

BŁĘDY IMPLEMENTACJI

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().

O STRONIE

Angielska wersja tej strony pochodzi z wydania 3.71 projektu Linux man-pages. Opis projektu, informacje dotyczące zgłaszania błędów, oraz najnowszą wersję oryginału można znaleźć pod adresem http://www.kernel.org/doc/man-pages/.

TŁUMACZENIE

Autorami polskiego tłumaczenia niniejszej strony podręcznika man są: Andrzej Krzysztofowicz (PTM) <[email protected]>, Robert Luberda <[email protected]> i Michał Kułach <[email protected]>.

Polskie tłumaczenie jest częścią projektu manpages-pl; uwagi, pomoc, zgłaszanie błędów na stronie http://sourceforge.net/projects/manpages-pl/. Jest zgodne z wersją 3.71 oryginału.