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:
- EMFILE
- Zostało osiągnięte ograniczenie na
liczbę otwartych deskryptorów plików dla
procesu.
- ENFILE
- Zostało osiągnięte systemowe
ograniczenie na całkowitą liczbę otwartych
plików.
- ENXIO
- Proces wywołujący nie ma przypisanego
terminala sterującego.
- ERANGE
- (getlogin_r) The length of the username, including the
terminating null byte ('\0'), is larger than bufsize.
Linux/glibc also has:
- 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).
- /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.
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().
logname(1),
geteuid(2),
getuid(2),
utmp(5)
Autorami polskiego tłumaczenia niniejszej strony podręcznika
są: Andrzej Krzysztofowicz <
[email protected]>, Robert
Luberda <
[email protected]> i Michał Kułach
<
[email protected]>
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
[email protected]