.\" This man page is Copyright (C) 1999 Andi Kleen <ak@muc.de>.
.\"
.\" %%%LICENSE_START(VERBATIM_ONE_PARA)
.\" Permission is granted to distribute possibly modified copies
.\" of this page provided the header is included verbatim,
.\" and in case of nontrivial modification author and date
.\" of the modification is added to the header.
.\" %%%LICENSE_END
.\"
.\" Modified, 2003-12-02, Michael Kerrisk, <mtk.manpages@gmail.com>
.\" Modified, 2003-09-23, Adam Langley
.\" Modified, 2004-05-27, Michael Kerrisk, <mtk.manpages@gmail.com>
.\"	Added SOCK_SEQPACKET
.\" 2008-05-27, mtk, Provide a clear description of the three types of
.\"     address that can appear in the sockaddr_un structure: pathname,
.\"     unnamed, and abstract.
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.\" This file is distributed under the same license as original manpage
.\" Copyright of the original manpage:
.\" Copyright © 1999 Andi Kleen 
.\" Copyright © of Polish translation:
.\" Andrzej M. Krzysztofowicz (PTM) <ankry@mif.pg.gda.pl>, 2003.
.\" Robert Luberda <robert@debian.org>, 2006, 2012.
.\" Michał Kułach <michal.kulach@gmail.com>, 2013, 2014.
.TH UNIX 7 2012\-05\-10 Linux "Podręcznik programisty Linuksa"
.SH NAZWA
unix \- gniazda lokalnej komunikacji międzyprocesowej
.SH SKŁADNIA
\fB#include <sys/socket.h>\fP
.br
\fB#include <sys/un.h>\fP

\fIunix_socket\fP\fB = socket(AF_UNIX, type, 0);\fP
.br
\fIerror\fP\fB = socketpair(AF_UNIX, type, 0, int *\fP\fIsv\fP\fB);\fP
.SH OPIS
Rodzina gniazd \fBAF_UNIX\fP (znana również jako \fBAF_LOCAL\fP) służy do wydajnej
komunikacji pomiędzy procesami na tej samej maszynie. Zgodnie z tradycją,
gniazda domeny uniksowej mogą być albo anonimowe (tworzone przez
\fBsocketpair\fP(2)), albo skojarzone z plikiem typu gniazda. Linux wspiera
również abstrakcyjną przestrzeń nazw, niezależną od systemu plików.

Poprawne typy to: \fBSOCK_STREAM\fP dla gniazd strumieniowych, \fBSOCK_DGRAM\fP
dla  gniazd datagramowych, które zachowują granice komunikatów (w przypadku
większości implementacji Uniksa gniazda uniksowe są zawsze niezawodne i nie
zmieniają kolejności datagramów), oraz (od wersji Linuksa 2.6.4)
\fBSOCK_SEQPACKET\fP dla gniazd zorientowanych połączeniowo, które zachowują
granice komunikatu i dostarczają komunikaty w kolejności ich wysyłania.

Za pośrednictwem pomocniczych danych można przez gniazda domeny uniksowej
przekazywać do innych procesów deskryptory plików i uwierzytelnienia
procesów.
.SS "Format adresu"
Adres gniazda domeny uniksowej jest reprezentowany przez następującą
strukturę:
.in +4n
.nf

#define UNIX_PATH_MAX    108

struct sockaddr_un {
    sa_family_t sun_family;               /* AF_UNIX */
    char        sun_path[UNIX_PATH_MAX];  /* ścieżka dostępu */
};
.fi
.in
.PP
\fIsun_family\fP zawsze zawiera \fBAF_UNIX\fP.

W strukturze rozróżniane są trzy typy adresów:
.IP * 3
\fIpathname\fP: gniazdo domeny uniksowej może zostać związane z zakończoną
znakiem NULL nazwą ścieżki systemowej za pomocą \fBbind\fP(2). Jeśli adres
gniazda jest zwracany przez \fBgetsockname\fP(2), \fBgetpeername\fP(2) i
\fBaccept\fP(2), to jego długością jest

    offsetof(struct sockaddr_un, sun_path) + strlen(sun_path) + 1

a \fIsun_path\fP zawiera nazwę ścieżki zakończoną znakiem NULL.
.IP *
.\" There is quite some variation across implementations: FreeBSD
.\" says the length is 16 bytes, HP-UX 11 says it's zero bytes.
\fIunnamed\fP: Gniazdo strumieniowe nie związane z nazwą ścieżki za pomocą
\fBbind\fP(2) nie jest nazwane. Podobnie dwa gniazda utworzone przez
\fBsocketpair\fP(2) nie są nazwane. Jeśli adres nienazwanego gniazda jest
zwracany przez \fBgetsockname\fP(2), \fBgetpeername\fP(2) i \fBaccept\fP(2), to jego
długością jest \fIsizeof(sa_family_t)\fP, a zawartość \fIsun_path\fP nie powinna
być sprawdzana.
.IP *
\fIabstract\fP: adres gniazda abstrakcyjnego jest rozróżniany po tym, że
\fIsun_path[0]\fP jest bajtem NULL ("\e0"). Adres gniazda znajduje się w
przestrzeni nazw podanej w dodatkowych bajtach w \fIsun_path\fP, które są
pokryte przez długość struktury adresu (Bajty NULL w nazwie nie mają żadnego
specjalnego znaczenia). Nazwa nie ma żadnego powiązania z nazwą pliku w
systemie plików. Adres gniazda abstrakcyjnego zwracany przez
\fBgetsockname\fP(2), \fBgetpeername\fP(2) oraz \fBaccept\fP(2) ma w polu \fIaddrlen\fP
ustawioną długość większą niż \fIsizeof(sa_family_t)\fP (tj. większą niż 2), a
nazwa gniazda zawarta jest w pierwszych \fI(addrlen \- sizeof(sa_family_t))\fP
bajtach pola \fIsun_path\fP. Przestrzeń nazw gniazd abstrakcyjnych jest
nieprzenaszalnym rozszerzeniem Linuksa.
.SS "Opcje gniazda"
Ze względów historycznych następujące opcje gniazd są podawane przy typie
\fBSOL_SOCKET\fP, pomimo że są one specyficzne dla \fBAF_UNIX\fP. Można je ustawić
za pomocą \fBsetsockopt\fP(2), a odczytać za pomocą \fBgetsockopt\fP(2), podając
\fBSOL_SOCKET\fP jako rodzinę gniazd.
.TP 
\fBSO_PASSCRED\fP
Włącza otrzymywanie uwierzytelnień od procesu wysyłającego komunikat
pomocniczy. Przy włączonej tej opcji i niepołączonym jeszcze gnieździe,
unikatowa nazwa gniazda z abstrakcyjnej przestrzeni nazw jest generowana
automatycznie. Oczekiwany jest logiczny znacznik typu całkowitego.
.SS "Automatyczne przypisywanie adresów"
.\" i.e., sizeof(short)
Jeśli w wywołaniu \fBbind\fP(2) podane zostanie \fIaddrlen\fP równe
\fIsizeof(sa_family_t)\fP lub opcja \fBSO_PASSCRED\fP gniazda była ustawiona dla
gniazda nieprzypisanego do adresu, wtedy gniazdo jest automatycznie
przypisywane do adresu abstrakcyjnego. Adres ten składa się z bajtu NULL, po
którym następuje 5 bajtów ze zbioru znaków \fI[0\-9a\-f]\fP. W związku z tym
liczba automatycznie przypisywanych adresów jest ograniczona przez 2^20. (W
Linuksie 2.1.15, w którym dodano możliwość automatycznego przypisywania
adresów, i w kolejnych wersjach używane było 8 bajtów, a limit wynosił 2^32
adresów. Zostało to zmienione na 5 bajtów w Linuksie 2.3.15).
.SS "API gniazd"
W kolejnych paragrafach opisano pewne szczegóły implementacji API gniazd
domeny UNIX specyficzne dla Linuksa oraz cechy niewspierane.

Gniazda z domeny uniksowej nie obsługują zawiadomienia o danych
autonomicznych (flaga \fBMSG_OOB\fP funkcji \fBsend\fP(2) i \fBrecv\fP(2)).

Flaga \fBMSG_MORE\fP funkcji \fBsend\fP(2) nie jest obsługiwana dla gniazd domeny
uniksowej.

Użycie \fBMSG_TRUNC\fP w argumencie \fIflags\fP funkcji \fBrecv\fP(2) nie jest
obsługiwane dla gniazd domeny uniksowej.

Opcja \fBSO_SNDBUF\fP działa w przypadku gniazd domeny uniksowej, ale opcja
\fBSO_RCVBUF\fP już nie. Dla gniazd datagramowych wartość \fBSO_SNDBUF\fP nakłada
górny limit na rozmiar wychodzących datagramów. Limit ten jest liczony jako
podwojona (patrz \fBsocket\fP(7)) wartość opcji minus 32 bajty wymagane na
informacje nie będące danymi.
.SS "Komunikaty pomocnicze"
Dane pomocnicze są wysyłane i odbierane za pomocą \fBsendmsg\fP(2) i
\fBrecvmsg\fP(2). Ze względów historycznych komunikaty pomocnicze poniższych
typów są podawane przy typie \fBSOL_SOCKET\fP, pomimo że są one specyficzne dla
\fBAF_UNIX\fP. Aby je wysłać, należy ustawić pole \fIcmsg_level\fP struktury
\fIcmsghdr\fP na \fBSOL_SOCKET\fP, a pole \fIcmsg_type\fP na typ. Więcej informacji
można znaleźć w \fBcmsg\fP(3).
.TP 
\fBSCM_RIGHTS\fP
Odbieranie od innego procesu lub wysyłanie do niego zbioru otwartych
deskryptorów plików. Porcja danych zawiera tablicę liczb całkowitych
będących deskryptorami plików. Przekazane deskryptory plików zachowują się
tak, jakby zostały utworzone za pomocą \fBdup\fP(2).
.TP 
\fBSCM_CREDENTIALS\fP
Odbieranie lub wysyłanie uwierzytelnień uniksowych. Może służyć do
autoryzacji. Uwierzytelnienia są przekazywane jako komunikat pomocniczy typu
\fIstruct ucred\fP, zdefiniowanego w \fI<sys/socket.h>\fP następująco:

.in +4n
.nf
struct ucred {
    pid_t pid;  /* identyfikator procesu wysyłającego */
    uid_t uid;  /* ident. użytkownika procesu wysyłającego */
    gid_t gid;  /* ident. grupy procesu wysyłającego */
};
.fi
.in

Począwszy od wersji 2.8 biblioteki glibc, aby uzyskać dostęp do definicji
powyższej struktury, należy zdefiniować makro \fB_GNU_SOURCE\fP (przed
dołączeniem \fIjakichkolwiek\fP plików nagłówkowych).

Jądro sprawdza uwierzytelnienia podane przez wysyłającego. Proces o
efektywnym ID użytkownika równym 0 może podać wartości, które różnią się od
jego własnych. W pozostałych przepadkach wysyłający musi podać swój własny
identyfikator procesu (o ile nie ma ustawionego znacznika \fBCAP_SYS_ADMIN\fP),
swój własny identyfikator użytkownika, efektywny identyfikator użytkownika
lub ustawiony identyfikator użytkownika (o ile nie ma ustawionego znacznika
\fBCAP_SETUID\fP) oraz swój własny identyfikator grupy, efektywny identyfikator
grupy lub ustawiony identyfikator grupy (o ile nie ma ustawionego znacznika
\fBCAP_SETGID\fP). Aby otrzymać komunikat typu \fIstruct ucred\fP, dla gniazda
musi być włączona opcja \fBSO_PASSCRED\fP.
.SS "Kontrolki systemowe (ioctl)"
Następujące wywołania \fBioctl\fP(2) zwracają informacje w parametrze
\fIvalue\fP. Poprawna składnia to:
.PP
.RS
.nf
\fBint\fP\fI value\fP\fB;\fP
\fIerror\fP\fB = ioctl(\fP\fIunix_socket\fP\fB, \fP\fIioctl_type\fP\fB, &\fP\fIvalue\fP\fB);\fP
.fi
.RE
.PP
\fIioctl_type\fP może przyjmować wartość:
.TP 
\fBSIOCINQ\fP
.\" FIXME http://sources.redhat.com/bugzilla/show_bug.cgi?id=12002,
.\" filed 2010-09-10, may cause SIOCINQ to be defined in glibc headers
.\" SIOCOUTQ also has an effect for UNIX domain sockets, but not
.\" quite what userland might expect. It seems to return the number
.\" of bytes allocated for buffers containing pending output.
.\" That number is normally larger than the number of bytes of pending
.\" output. Since this info is, from userland's point of view, imprecise,
.\" and it may well change, probably best not to document this now.
Zwraca ilość nieprzeczytanych jeszcze danych znajdujących się w kolejce
buforu odbierającego. Gniazdo nie może się znajdować w stanie "LISTEN"; w
przeciwnym wypadku zostanie zwrócony błąd (\fBEINVAL\fP). \fBSIOCINQ\fP jest
zdefiniowany w \fI<linux/sockios.h>\fP. Alternatywnie można użyć
synonimu \fBFIONREAD\fP zdefiniowanego w \fI<sys/ioctl.h>\fP.
.SH BŁĘDY
.TP 
\fBEADDRINUSE\fP
Podany adres lokalny jest zajęty lub obiekt gniazda w systemie plików już
istnieje.
.TP 
\fBECONNREFUSED\fP
Adres zdalny podany w \fBconnect\fP(2) nie odnosił się do gniazda
nasłuchującego. Błąd może także wystąpić jeśli nazwa docelowego pliku nie
jest gniazdem.
.TP 
\fBECONNRESET\fP
Zdalne gniazdo zostało nieoczekiwanie zamknięte.
.TP 
\fBEFAULT\fP
Nieprawidłowy adres pamięci użytkownika.
.TP 
\fBEINVAL\fP
Podano nieprawidłowy argument. Najczęstszą przyczyną jest brak ustawionego
\fBAF_UNIX\fP w polu \fIsun_type\fP przekazywanych gniazdu adresów lub
nieprawidłowy dla danej operacji stan gniazda.
.TP 
\fBEISCONN\fP
Wywołano \fBconnect\fP(2) dla już połączonego gniazda lub podano adres docelowy
dla połączonego gniazda.
.TP 
\fBENOENT\fP
Nie istnieje ścieżka dla zdalnego adresu przekazanego do \fBconnect\fP(2).
.TP 
\fBENOMEM\fP
Brak pamięci.
.TP 
\fBENOTCONN\fP
Operacja na gnieździe wymaga adresu docelowego, a gniazdo nie jest
połączone.
.TP 
\fBEOPNOTSUPP\fP
Operacja strumieniowa wywołana dla gniazda niestrumieniowego lub próba
użycia opcji danych autonomicznych.
.TP 
\fBEPERM\fP
Wysyłający podał nieprawidłowe uwierzytelnienia w \fIstruct ucred\fP.
.TP 
\fBEPIPE\fP
Zdalne gniazdo strumieniowe zostało zamknięte. Gdy włączone, wysyłany jest
jednocześnie sygnał \fBSIGPIPE\fP. Można tego uniknąć, przekazując znacznik
\fBMSG_NOSIGNAL\fP do \fBsendmsg\fP(2) lub \fBrecvmsg\fP(2).
.TP 
\fBEPROTONOSUPPORT\fP
Podanym protokołem nie jest \fBAF_UNIX\fP.
.TP 
\fBEPROTOTYPE\fP
Typ gniazda zdalnego różni się od typu gniazda lokalnego (\fBSOCK_DGRAM\fP
wobec \fBSOCK_STREAM\fP)
.TP 
\fBESOCKTNOSUPPORT\fP
Nieznany typ gniazda.
.PP
Inne błędy mogą zostać wygenerowane przez podstawową warstwę gniazd lub
przez system plików podczas tworzenia obiektu gniazda w systemie
plików. Więcej informacji można znaleźć na odpowiednich stronach
podręcznika.
.SH WERSJE
\fBSCM_CREDENTIALS\fP oraz abstrakcyjna przestrzeń nazw zostały wprowadzone w
Linuksie 2.2 i nie należy ich używać w przenośnych programach. (Niektóre
systemy wywodzące się z BSD również wspierają przekazywanie uwierzytelnień,
ale implementacje różnią się szczegółami).
.SH UWAGI
W linuksowej implementacji dla gniazda widocznych w systemie plików są
stosowane uprawnienia katalogu, w którym się znajdują. Ich właściciela,
grupę oraz prawa dostępu można zmieniać. Gdy proces nie ma uprawnień do
zapisu i przeszukiwania (uruchamiania) do katalogu, w którym tworzone jest
gniazdo, jego utworzenie się nie powiedzie. Połączenie z obiektem gniazda
wymaga praw odczytu/zapisu. Takie zachowanie różni się od zachowania wielu
systemów wywodzących się z BSD, które ignorują uprawnienia dla gniazd
uniksowych. Programy przenośne ze względów bezpieczeństwa nie powinny
polegać na tej cesze.

W trakcie łączenia się z gniazdem mającym przypisaną nazwę pliku, tworzony
jest plik specjalny gniazda w systemie plików, który musi zostać usunięty
(za pomocą \fBunlink\fP(2)) przez wywołującego, gdy już nie będzie
potrzebny. Stosuje się tu zwykła uniksowa składnia opóźnionego zamknięcia
(ang. close\-behind): gniazdo można skasować w dowolnym momencie, ale
zostanie ono ostatecznie usunięte z systemu plików po zamknięciu ostatniego
odwołania do niego.

Aby przekazać deskryptory plików lub uwierzytelnienia poprzez \fBSOCK_STREAM\fP
trzeba wysłać/odebrać co najmniej jeden bajt niepomocniczych danych w tym
samym wywołaniu \fBsendmsg\fP(2) lub \fBrecvmsg\fP(2)

Gniazda strumieniowe z domeny uniksowej nie obsługują zawiadomienia o danych
autonomicznych.
.SH PRZYKŁAD
Patrz \fBbind\fP(2).

Przykład użycia \fBSCM_RIGHTS\fP można znaleźć w \fBcmsg\fP(3).
.SH "ZOBACZ TAKŻE"
\fBrecvmsg\fP(2), \fBsendmsg\fP(2), \fBsocket\fP(2), \fBsocketpair\fP(2), \fBcmsg\fP(3),
\fBcapabilities\fP(7), \fBcredentials\fP(7), \fBsocket\fP(7)
.SH "O STRONIE"
Angielska wersja tej strony pochodzi z wydania 3.71 projektu Linux
\fIman\-pages\fP. 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/.
.SH TŁUMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika man są:
Andrzej M. Krzysztofowicz (PTM) <ankry@mif.pg.gda.pl>,
Robert Luberda <robert@debian.org>
i
Michał Kułach <michal.kulach@gmail.com>.
.PP
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ą \fB 3.71 \fPoryginału.
