.\" -*- coding: UTF-8 -*- .\" Copyright (c) 2016 Pavel Emelyanov .\" Copyright (c) 2016 Dmitry V. Levin .\" .\" %%%LICENSE_START(GPLv2+_DOC_FULL) .\" This is free documentation; you can redistribute it and/or .\" modify it under the terms of the GNU General Public License as .\" published by the Free Software Foundation; either version 2 of .\" the License, or (at your option) any later version. .\" .\" The GNU General Public License's references to "object code" .\" and "executables" are to be interpreted as the output of any .\" document formatting or typesetting system, including .\" intermediate and printed output. .\" .\" This manual is distributed in the hope that it will be useful, .\" but WITHOUT ANY WARRANTY; without even the implied warranty of .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the .\" GNU General Public License for more details. .\" .\" You should have received a copy of the GNU General Public .\" License along with this manual; if not, see .\" . .\" %%%LICENSE_END .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH SOCK_DIAG 7 "1 novembre 2020" Linux "Manuel du programmeur Linux" .SH NOM sock_diag – Obtention d’informations à propos des sockets .SH SYNOPSIS .nf \fB#include \fP \fB#include \fP \fB#include \fP /* pour sockets de domaine UNIX */ \fB#include \fP /* pour sockets IPv4 et IPv6 */ .PP \fBdiag_socket = socket(AF_NETLINK, \fP\fIsocket_type\fP\fB, NETLINK_SOCK_DIAG);\fP .fi .SH DESCRIPTION Le sous\-système netlink de \fBsock_diag\fP fournit un mécanisme pour obtenir les informations sur les sockets de diverses familles d’adresses du noyau. Ce sous\-système peut être utilisé pour obtenir des informations à propos de sockets particuliers ou pour obtenir la liste des sockets. .PP Dans la requête, l’appelant peut indiquer les informations supplémentaires qu’il désire obtenir à propos du socket, par exemple, les informations sur la mémoire ou les informations spécifiques à une famille d’adresses. .PP Lors d’une requête d’une liste de sockets, l’appelant peut indiquer des filtres à appliquer par le noyau pour sélectionner un sous\-ensemble de sockets. Pour l’instant, il est seulement possible de filtrer les sockets par état (connecté, à l’écoute,\ etc). .PP .\" Remarquez que \fBsock_diag\fP rapporte seulement les sockets ayant un nom. C’est\-à\-dire soit les sockets liés explicitement avec \fBbind\fP(2) ou les sockets qui ont été automatiquement liés à une adresse (par exemple, par \fBconnect\fP(2)). C’est le même ensemble de sockets disponible à l’aide de \fI/proc/net/unix\fP, \fI/proc/net/tcp\fP, \fI/proc/net/udp\fP,\ etc. .SS Requête La requête débute par un en\-tête \fIstruct\ nlmsghdr\fP décrit dans \fBnetlink\fP(7) avec un champ \fInlmsg_type\fP réglé à \fBSOCK_DIAG_BY_FAMILY\fP. Il est suivi par un en\-tête spécifique à une famille d’adresses qui débute par une partie commune partagée par toutes les familles d’adresses\ : .PP .in +4n .EX struct sock_diag_req { __u8 sdiag_family; __u8 sdiag_protocol; }; .EE .in .PP Les membres de cette structure sont les suivants\ : .TP \fIsdiag_family\fP Une famille d’adresses. Elle devrait être réglée à la constante \fBAF_*\fP appropriée. .TP \fIsdiag_protocol\fP Fonction de \fIsdiag_family\fP. Il devrait être réglé à la constante \fBIPPROTO_*\fP appropriée pour \fBAF_INET\fP et \fBAF_INET6\fP, et à\ 0 autrement. .PP .\" Si le champ \fInlmsg_flags\fP de l’en\-tête \fIstruct\ nlmsghdr\fP a l’indicateur \fBNLM_F_DUMP\fP défini, cela signifie qu’une liste de sockets est demandée. Sinon, il s’agit d’une requête concernant un socket particulier. .SS Réponse La réponse débute avec un en\-tête \fIstruct\ nlmsghdr\fP et est suivie par un tableau d’objets spécifique à la famille d’adresses. Le tableau est accessible avec les macros \fBNLMSG_*\fP standards de l’API de \fBnetlink\fP(3). .PP .\" Chaque objet est la liste NLA (attributs netlink) accessible avec les macros \fBRTA_*\fP de l’API de \fBrtnetlink\fP(3). .SS "Sockets de domaine UNIX" Pour les sockets de domaine UNIX, la requête est décrite dans la structure suivante\ : .PP .in +4n .EX struct unix_diag_req { __u8 sdiag_family; __u8 sdiag_protocol; __u16 pad; __u32 udiag_states; __u32 udiag_ino; __u32 udiag_show; __u32 udiag_cookie[2]; }; .EE .in .PP Les membres de cette structure sont les suivants\ : .TP \fIsdiag_family\fP La famille d’adresses. Elle devrait être \fBAF_UNIX\fP. .PP \fIsdiag_protocol\fP .PD 0 .TP .PD \fIpad\fP Ces champs devraient être réglés à 0. .TP \fIudiag_states\fP C’est un masque de bits définissant un filtre d’états des sockets. Seuls les sockets dont les états sont dans le masque seront rapportés. Il est ignoré lors d’une requête pour un socket particulier. Les valeurs autorisées sont\ : .PP .RS 12 1 << \fBTCP_ESTABLISHED\fP .PP 1 << \fBTCP_LISTEN\fP .RE .TP \fIudiag_ino\fP C’est un numéro d’inœud lors d’une requête pour un socket particulier. Il est ignoré lors d’une requête pour une liste de sockets. .TP \fIudiag_show\fP C’est un ensemble d’indicateurs définissant quelle sorte d’information rapporter. Chaque sorte d’information est rapportée sous forme d’attribut netlink comme décrit ci\-dessous\ : .RS .TP \fBUDIAG_SHOW_NAME\fP L’attribut rapporté dans la réponse à cette requête est \fBUNIX_DIAG_NAME\fP. La charge utile associée à cet attribut est le nom de chemin auquel le socket a été lié (une séquence d’octets de taille maximale \fBUNIX_PATH_MAX\fP). .TP \fBUDIAG_SHOW_VFS\fP L’attribut rapporté dans la réponse à cette requête est \fBUNIX_DIAG_VFS\fP. La charge utile associée à cet attribut est décrite dans la structure suivante\ : .IP .in +4n .EX struct unix_diag_vfs { __u32 udiag_vfs_dev; __u32 udiag_vfs_ino; }; .EE .in .IP Les membres de cette structure sont les suivants\ : .RS .TP \fIudiag_vfs_dev\fP Le numéro de périphérique de l’inœud correspondant de socket sur le disque. .TP \fIudiag_vfs_ino\fP Le numéro d’inœud de l’inœud correspondant de socket sur le disque. .RE .TP \fBUDIAG_SHOW_PEER\fP L’attribut rapporté dans la réponse à cette requête est \fBUNIX_DIAG_PEER\fP. La charge utile associée à cet attribut est une valeur __u32 qui est le numéro d’inœud du pair. Cet attribut est rapporté seulement pour les sockets connectés. .TP \fBUDIAG_SHOW_ICONS\fP L’attribut rapporté dans la réponse à cette requête est \fBUNIX_DIAG_ICONS\fP. La charge utile associée à cet attribut est un tableau de valeurs __u32 qui sont des numéros d’inœuds de sockets qui ont passé l’appel \fBconnect\fP(2), mais qui n’ont pas encore été traités par \fBaccept\fP(2). Cet attribut est rapporté seulement pour les sockets à l’écoute. .TP \fBUDIAG_SHOW_RQLEN\fP L’attribut rapporté dans la réponse à cette requête est \fBUNIX_DIAG_RQLEN\fP. La charge utile associée à cet attribut est décrite dans la structure suivante\ : .IP .in +4n .EX struct unix_diag_rqlen { __u32 udiag_rqueue; __u32 udiag_wqueue; }; .EE .in .IP Les membres de cette structure sont les suivants\ : .RS .TP \fIudiag_rqueue\fP Pour les sockets à l’écoute\ : le nombre de connexions en attente. La taille du tableau associé à l’attribut de la réponse \fBUNIX_DIAG_ICONS\fP est égale à cette valeur. .IP Pour les sockets établis\ : la quantité de données dans la file d’attente entrante. .TP \fIudiag_wqueue\fP Pour les sockets à l’écoute\ : la taille de l’arriéré qui est égale à la valeur passée comme second argument à \fBlisten\fP(2). .IP Pour les sockets établis\ : la quantité de mémoire disponible pour l’émission. .RE .TP \fBUDIAG_SHOW_MEMINFO\fP L’attribut rapporté dans la réponse à cette requête est \fBUNIX_DIAG_MEMINFO\fP. La charge utile associée à cet attribut est un tableau de valeurs __u32 décrites dans la sous\-section «\ Informations sur la mémoire de socket\ ». .PP Les attributs suivants sont rapportés sans requête particulière\ : .TP \fBUNIX_DIAG_SHUTDOWN\fP La charge utile associée à cet attribut est une valeur __u8 représentant les bits de l’état de \fBshutdown\fP(2). .RE .TP \fIudiag_cookie\fP C’est un tableau d’identificateurs opaques pouvant être utilisés avec \fIudiag_ino\fP pour indiquer un socket particulier. Il est ignoré lors de la requête d’une liste de sockets ainsi que lorsque ses éléments sont réglés à\ \-1. .PP La réponse à une requête de sockets de domaine UNIX est décrite sous forme de tableau de .PP .in +4n .EX struct unix_diag_msg { __u8 udiag_family; __u8 udiag_type; __u8 udiag_state; __u8 pad; __u32 udiag_ino; __u32 udiag_cookie[2]; }; .EE .in .PP suivis par les attributs de netlink. .PP Les membres de cette structure sont les suivants\ : .TP \fIudiag_family\fP Ce champ a la même signification que \fIstruct unix_diag_req\fP. .TP \fIudiag_type\fP Ce champ est réglé à \fBSOCK_PACKET\fP, \fBSOCK_STREAM\fP ou \fBSOCK_SEQPACKET\fP. .TP \fIudiag_state\fP Ce champ est réglé à \fBTCP_LISTEN\fP ou \fBTCP_ESTABLISHED\fP. .TP \fIpad\fP Ce champ est réglé à 0. .TP \fIudiag_ino\fP Ce champ est le numéro d’inœud de socket. .TP \fIudiag_cookie\fP .\" Ce champ est un tableau d’identificateurs opaques pouvant être utilisés dans des requêtes ultérieures. .SS "Sockets IPv4 et IPv6" Pour les sockets IPv4 et IPv6, la requête est décrite dans la structure suivante\ : .PP .in +4n .EX struct inet_diag_req_v2 { __u8 sdiag_family; __u8 sdiag_protocol; __u8 idiag_ext; __u8 pad; __u32 idiag_states; struct inet_diag_sockid id; }; .EE .in .PP où \fIstruct inet_diag_sockid\fP est défini comme suit\ : .PP .in +4n .EX struct inet_diag_sockid { __be16 idiag_sport; __be16 idiag_dport; __be32 idiag_src[4]; __be32 idiag_dst[4]; __u32 idiag_if; __u32 idiag_cookie[2]; }; .EE .in .PP Les champs de \fIstruct inet_diag_req_v2\fP sont comme suit\ : .TP \fIsdiag_family\fP Cela devrait être soit \fBAF_INET\fP ou \fBAF_INET6\fP pour les sockets IPv4 ou IPv6 respectivement. .TP \fIsdiag_protocol\fP Cela devrait être réglé à \fBIPPROTO_TCP\fP, \fBIPPROTO_UDP\fP ou \fBIPPROTO_UDPLITE\fP. .TP \fIidiag_ext\fP C’est un ensemble d’indicateurs définissant quelle sorte d’informations étendues à rapporter. Chaque sorte d’informations est rapportée sous forme d’attribut de netlink comme décrit ci\-dessous\ : .RS .TP \fBINET_DIAG_TOS\fP La charge utile associée à cet attribut est une valeur __u8 qui est le TOS du socket. .TP \fBINET_DIAG_TCLASS\fP La charge utile associée à cet attribut est une valeur __u8 qui est la TClass du socket —\ sockets IPv6 uniquement. Pour les sockets LISTEN et CLOSE, cela est suivi par l’attribut \fBINET_DIAG_SKV6ONLY\fP avec la valeur associée __u8 de charge utile signifiant si le socket est seulement IPv6 ou non. .TP \fBINET_DIAG_MEMINFO\fP La charge utile associée à cet attribut est décrite dans la structure suivante\ : .IP .in +4n .EX struct inet_diag_meminfo { __u32 idiag_rmem; __u32 idiag_wmem; __u32 idiag_fmem; __u32 idiag_tmem; }; .EE .in .IP Les membres de cette structure sont les suivants\ : .RS .TP 12 \fIidiag_rmem\fP La quantité de données dans la file de réception. .TP \fIidiag_wmem\fP La quantité de données mises dans la file par TCP mais non encore envoyées. .TP \fIidiag_fmem\fP La quantité de mémoire prévue pour une utilisation future (TCP uniquement). .TP \fIidiag_tmem\fP La quantité de données dans la file d’émission. .RE .TP \fBINET_DIAG_SKMEMINFO\fP La charge utile associée à cet attribut est un tableau de valeurs __u32 décrites ci\-dessous dans la sous\-section «\ Informations sur la mémoire de socket\ ». .TP \fBINET_DIAG_INFO\fP La charge utile associée à cet attribut est spécifique à la famille d’adresses. Pour les sockets TCP, c’est un objet de type \fIstruct\ tcp_info\fP. .TP \fBINET_DIAG_CONG\fP La charge utile associée avec cet attribut est une chaîne décrivant l’algorithme de contrôle de congestion utilisé. Uniquement pour les sockets TCP. .RE .TP \fIpad\fP Cela devrait être réglé à\ 0. .TP \fIidiag_states\fP C’est un masque de bits définissant un filtre d’états des sockets. Seuls les sockets dont les états sont dans le masque seront rapportés. Il est ignoré lors d’une requête pour un socket particulier. .TP \fIid\fP C’est un objet d’ID de socket utilisé dans les requêtes de vidage, dans les requêtes à propos de sockets particuliers et qui est rapporté dans chaque réponse. Au contraire des sockets de domaine UNIX, les sockets IPv4 et IPv6 sont identifiés en utilisant des adresses et des ports. Toutes les valeurs sont dans l’ordre d’octets du réseau. .PP Les champs de \fIstruct inet_diag_sockid\fP sont comme suit\ : .TP \fIidiag_sport\fP Le port de la source. .TP \fIidiag_dport\fP Le port de la destination. .TP \fIidiag_src\fP L’adresse de la source. .TP \fIidiag_dst\fP L’adresse de la destination. .TP \fIidiag_if\fP Le numéro d’interface auquel le socket est lié. .TP \fIidiag_cookie\fP C’est un tableau d’identificateurs opaques pouvant être utilisés dans d’autres champs de cette structure pour indiquer un socket particulier. Il est ignoré lors d’une requête pour une liste de sockets, de même que lorsque tous ses éléments sont réglés à\ \-1. .PP La réponse à une requête de sockets IPv4 ou IPv6 est décrite sous forme d'un tableau de .PP .in +4n .EX struct inet_diag_msg { __u8 idiag_family; __u8 idiag_state; __u8 idiag_timer; __u8 idiag_retrans; struct inet_diag_sockid id; __u32 idiag_expires; __u32 idiag_rqueue; __u32 idiag_wqueue; __u32 idiag_uid; __u32 idiag_inode; }; .EE .in .PP suivis par les attributs de netlink. .PP Les membres de cette structure sont les suivants\ : .TP \fIidiag_family\fP c’est le même champ que dans \fIstruct inet_diag_req_v2\fP. .TP \fIidiag_state\fP Cela indique l’état comme dans \fIstruct inet_diag_req_v2\fP. .TP \fIidiag_timer\fP Pour les sockets TCP, ce champ décrit le type de temporisateur actuellement actif pour le socket. Il est réglé à une des constantes suivantes\ : .IP .PD 0 .RS 12 .TP \fB0\fP aucun temporisateur actif .TP \fB1\fP un temporisateur de retransmission .TP \fB2\fP un temporisateur d’entretien .TP \fB3\fP un temporisateur TIME_WAIT .TP \fB4\fP un temporisateur de sonde de fenêtre nulle .RE .PD .IP Pour les sockets non TCP, ce champ doit être réglé à\ 0. .TP \fIidiag_retrans\fP Pour les valeurs 1, 2 et 4 d’\fIidiag_timer\fP, ce champ contient le nombre de retransmissions. Pour les autres valeurs d’\fIidiag_timer\fP, ce champ est réglé à\ 0. .TP \fIidiag_expires\fP Pour les sockets TCP ayant un temporisateur actif, ce champ indique son délai d’expiration en milliseconde. Pour les autres sockets, ce champ est réglé à\ 0. .TP \fIidiag_rqueue\fP Pour les sockets à l’écoute\ : le nombre de connexions en attente. .IP Pour les autres sockets\ : la quantité de données dans la file d’attente entrante. .TP \fIidiag_wqueue\fP Pour les sockets à l’écoute\ : la taille de l’arriéré. .IP Pour les autres sockets\ : la quantité de mémoire disponible pour l’envoi. .TP \fIidiag_uid\fP C’est l’UID du propriétaire du socket. .TP \fIidiag_inode\fP .\" Ce champ est le numéro d’inœud de socket. .SS "Informations sur la mémoire du socket" La charge utile associée avec les attributs \fBUNIX_DIAG_MEMINFO\fP et \fBINET_DIAG_SKMEMINFO\fP de netlink est un tableau des valeurs __u32 suivantes\ : .TP \fBSK_MEMINFO_RMEM_ALLOC\fP La quantité de données dans la file d’attente de réception. .TP \fBSK_MEMINFO_RCVBUF\fP Le tampon de réception de socket comme réglé par \fBSO_RCVBUF\fP. .TP \fBSK_MEMINFO_WMEM_ALLOC\fP La quantité de données dans la file d’émission. .TP \fBSK_MEMINFO_SNDBUF\fP Le tampon d’émission de socket comme réglé par \fBSO_SNDBUF\fP. .TP \fBSK_MEMINFO_FWD_ALLOC\fP La quantité de mémoire prévue pour une utilisation future (TCP uniquement). .TP \fBSK_MEMINFO_WMEM_QUEUED\fP La quantité de données mises en attente par TCP, mais pas encore envoyées. .TP \fBSK_MEMINFO_OPTMEM\fP La quantité de mémoire allouée pour les besoins du service du socket (par exemple, filtre du socket). .TP \fBSK_MEMINFO_BACKLOG\fP La quantité de paquets dans l’arriéré (pas encore traité). .SH VERSIONS \fBNETLINK_INET_DIAG\fP a été introduit dans Linux\ 2.6.14 et ne gère que les sockets \fBAF_INET\fP et \fBAF_INET6\fP. Dans Linux\ 3.3, il a été renommé \fBNETLINK_SOCK_DIAG\fP et étendu pour gérer les sockets \fBAF_UNIX\fP. .PP \fBUNIX_DIAG_MEMINFO\fP et \fBINET_DIAG_SKMEMINFO\fP ont été introduits dans Linux\ 3.6. .SH CONFORMITÉ L’API NETLINK_SOCK_DIAG est spécifique à Linux. .SH EXEMPLES L’exemple suivant affiche le numéro d’inœud, le numéro d’inœud du pair et le nom de tous les sockets de domaine UNIX dans l’espace de noms en cours. .PP .EX #include #include #include #include #include #include #include #include #include #include static int send_query(int fd) { struct sockaddr_nl nladdr = { .nl_family = AF_NETLINK }; struct { struct nlmsghdr nlh; struct unix_diag_req udr; } req = { .nlh = { .nlmsg_len = sizeof(req), .nlmsg_type = SOCK_DIAG_BY_FAMILY, .nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP }, .udr = { .sdiag_family = AF_UNIX, .udiag_states = \-1, .udiag_show = UDIAG_SHOW_NAME | UDIAG_SHOW_PEER } }; struct iovec iov = { .iov_base = &req, .iov_len = sizeof(req) }; struct msghdr msg = { .msg_name = &nladdr, .msg_namelen = sizeof(nladdr), .msg_iov = &iov, .msg_iovlen = 1 }; for (;;) { if (sendmsg(fd, &msg, 0) < 0) { if (errno == EINTR) continue; perror("sendmsg"); return \-1; } return 0; } } static int print_diag(const struct unix_diag_msg *diag, unsigned int len) { if (len < NLMSG_LENGTH(sizeof(*diag))) { fputs("short response\en", stderr); return \-1; } if (diag\->udiag_family != AF_UNIX) { fprintf(stderr, "unexpected family %u\en", diag\->udiag_family); return \-1; } unsigned int rta_len = len \- NLMSG_LENGTH(sizeof(*diag)); unsigned int peer = 0; size_t path_len = 0; char path[sizeof(((struct sockaddr_un *) 0)\->sun_path) + 1]; for (struct rtattr *attr = (struct rtattr *) (diag + 1); RTA_OK(attr, rta_len); attr = RTA_NEXT(attr, rta_len)) { switch (attr\->rta_type) { case UNIX_DIAG_NAME: if (!path_len) { path_len = RTA_PAYLOAD(attr); if (path_len > sizeof(path) \- 1) path_len = sizeof(path) \- 1; memcpy(path, RTA_DATA(attr), path_len); path[path_len] = \(aq\e0\(aq; } break; case UNIX_DIAG_PEER: if (RTA_PAYLOAD(attr) >= sizeof(peer)) peer = *(unsigned int *) RTA_DATA(attr); break; } } printf("inode=%u", diag\->udiag_ino); if (peer) printf(", peer=%u", peer); if (path_len) printf(", name=%s%s", *path ? "" : "@", *path ? path : path + 1); putchar(\(aq\en\(aq); return 0; } static int receive_responses(int fd) { long buf[8192 / sizeof(long)]; struct sockaddr_nl nladdr = { .nl_family = AF_NETLINK }; struct iovec iov = { .iov_base = buf, .iov_len = sizeof(buf) }; int flags = 0; for (;;) { struct msghdr msg = { .msg_name = &nladdr, .msg_namelen = sizeof(nladdr), .msg_iov = &iov, .msg_iovlen = 1 }; ssize_t ret = recvmsg(fd, &msg, flags); if (ret < 0) { if (errno == EINTR) continue; perror("recvmsg"); return \-1; } if (ret == 0) return 0; const struct nlmsghdr *h = (struct nlmsghdr *) buf; if (!NLMSG_OK(h, ret)) { fputs("!NLMSG_OK\en", stderr); return \-1; } for (; NLMSG_OK(h, ret); h = NLMSG_NEXT(h, ret)) { if (h\->nlmsg_type == NLMSG_DONE) return 0; if (h\->nlmsg_type == NLMSG_ERROR) { const struct nlmsgerr *err = NLMSG_DATA(h); if (h\->nlmsg_len < NLMSG_LENGTH(sizeof(*err))) { fputs("NLMSG_ERROR\en", stderr); } else { errno = \-err\->error; perror("NLMSG_ERROR"); } return \-1; } if (h\->nlmsg_type != SOCK_DIAG_BY_FAMILY) { fprintf(stderr, "unexpected nlmsg_type %u\en", (unsigned) h\->nlmsg_type); return \-1; } if (print_diag(NLMSG_DATA(h), h\->nlmsg_len)) return \-1; } } } int main(void) { int fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_SOCK_DIAG); if (fd < 0) { perror("socket"); return 1; } int ret = send_query(fd) || receive_responses(fd); close(fd); return ret; } .EE .SH "VOIR AUSSI" \fBnetlink\fP(3), \fBrtnetlink\fP(3), \fBnetlink\fP(7), \fBtcp\fP(7) .SH COLOPHON Cette page fait partie de la publication\ 5.10 du projet \fIman\-pages\fP Linux. Une description du projet et des instructions pour signaler des anomalies et la dernière version de cette page peuvent être trouvées à l'adresse \%https://www.kernel.org/doc/man\-pages/. .PP .SH TRADUCTION La traduction française de cette page de manuel a été créée par Christophe Blaess , Stéphan Rafin , Thierry Vignaud , François Micaux, Alain Portal , Jean-Philippe Guérard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas François , Florentin Duneau , Simon Paillard , Denis Barbier , David Prévot et Jean-Paul Guillonneau . .PP Cette traduction est une documentation libre ; veuillez vous reporter à la .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3 .UE concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE. .PP Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à .MT debian-l10n-french@lists.debian.org .ME .