getgroups(2) System Calls Manual getgroups(2) NAZWA getgroups, setgroups - pobiera/ustawia liste identyfikatorow grup dodatkowych BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include int getgroups(int size, gid_t list[]); #include int setgroups(size_t size, const gid_t *_Nullable list); Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)): setgroups(): Od glibc 2.19: _DEFAULT_SOURCE glibc 2.19 i wczesniejsze: _BSD_SOURCE OPIS getgroups() zwraca w list identyfikatory grup dodatkowych dla wywolujacego procesu. Argument size powinien byc ustawiony na maksymalna liczbe elementow, jakie moga byc przechowywane w buforze, na ktory wskazuje list. Jesli wywolujacy proces jest czlonkiem wiecej niz size grup dodatkowych, wystapi blad. Nie jest okreslone, czy efektywny ID grupy procesu wywolujacego bedzie znajdowac sie na zwroconej liscie (zatem aplikacja powinna wywolac rowniez getegid(2) i dodac lub usunac otrzymana wartosc). Jesli size jest rowne zero, to list nie jest modyfikowane, lecz zwracana jest ogolna liczba dodatkowych grup procesu. Pozwala to wywolujacemu okreslic rozmiar dynamicznie przydzielanej list, do uzycia w kolejnych wywolaniach do getgroups(2). setgroups() ustawia identyfikatory grup dodatkowych procesu wywolujacego. Konieczne sa odpowiednie przywileje (zob. opis bledu EPERM ponizej). Argument size okresla liczbe identyfikatorow grup dodatkowych w buforze, na ktory wskazuje list. Proces moze porzucic wszystkie swoje grupy dodatkowe ponizszym wywolaniem: setgroups(0, NULL); WARTOSC ZWRACANA Po pomyslnym zakonczeniu getgroups() zwraca liczbe grup dodatkowych. Po bledzie zwracane jest -1 i ustawiane errno wskazujac blad. Po pomyslnym zakonczeniu setgroups() zwraca zero. Po bledzie zwracane jest -1 i ustawiane errno wskazujac blad. BLEDY EFAULT list ma nieprawidlowy adres. getgroups() moze dodatkowo zawiesc z nastepujacym bledem: EINVAL size jest mniejsze niz liczba grup dodatkowych, ale niezerowe. setgroups() moze dodatkowo zawiesc z nastepujacymi bledami: EINVAL size jest wieksze niz NGROUPS_MAX (32 przed Linuksem 2.6.4; 65536 od Linuksa 2.6.4). ENOMEM Brak pamieci. EPERM Proces wywolujacy ma niewystarczajace przywileje (wywolujacy nie posiada przywileju (ang. capability) CAP_SETGID w przestrzeni nazw uzytkownika, w ktorej wystepuje). EPERM (od Linuksa 3.19) Odmowiono uzycia setgroups() w tej przestrzeni nazw uzytkownika. Wiecej informacji w opisie /proc/pid/setgroups w user_namespaces(7). WERSJE Roznice biblioteki C/jadra Na poziomie jadra, identyfikatory uzytkownika i grupy sa atrybutami przynaleznymi watkowi. Jednak POSIX wymaga, aby wszystkie watki procesu dzielily te same poswiadczenia. Implementacja watkowania NPTL obsluguje wymagania POSIX za pomoca funkcji opakowujacych dla roznych wywolan systemowych zmieniajacych UID-y i GID-y procesow. Te funkcje opakowujace (w tym te dla setgroups()) wykorzystuja technike oparta na sygnalach aby zapewnic, ze gdy jeden watek zmieni swe poswiadczenia, wszystkie inne watki procesu rowniez to uczynia. Wiecej szczegolow w podreczniku nptl(7). STANDARDY getgroups() POSIX.1-2008. setgroups() Brak. HISTORIA getgroups() SVr4, 4.3BSD, POSIX.1-2001. setgroups() SVr4, 4.3BSD. Poniewaz setgroups() wymaga przywileju, nie jest opisana w POSIX.1. Pierwotne linuksowe wywolania systemowe getgroups() obslugiwaly jedynie 16-bitowe identyfikatory grup. Nastepnie, w Linuksie 2.4 dodano getgroups32(), obslugujace identyfikatora 32-bitowe. Funkcja opakowujaca getgroups() biblioteki glibc obsluguje te warianty pomiedzy wersjami jadra w sposob przezroczysty. UWAGI Proces moze posiadac maksymalnie NGROUPS_MAX grup dodatkowych oprocz efektywnego ID grupy. Stala NGROUPS_MAX jest definiowana w . Zbior grup dodatkowych jest dziedziczony po procesie rodzicielskim i jest zachowywany na przestrzeni execve(2). Maksymalna liczba grup dodatkowych moze byc odnaleziona w czasie uruchomienia za pomoca sysconf(3): long ngroups_max; ngroups_max = sysconf(_SC_NGROUPS_MAX); Maksymalna zwracana wartosc getgroups() nie moze byc wieksza od powyzszej. Od Linuksa 2.6.4, maksymalna liczba grup dodatkowych jest rowniez ujawniana w typowo linuksowym pliku tylko do odczytu: /proc/sys/kernel/ngroups_max. ZOBACZ TAKZE getgid(2), setgid(2), getgrouplist(3), group_member(3), initgroups(3), capabilities(7), credentials(7) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Przemek Borys , Andrzej Krzysztofowicz i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.06 31 pazdziernika 2023 r. getgroups(2)