File: cmsg.3

package info (click to toggle)
manpages-pt 20040726-8
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 2,988 kB
  • sloc: sh: 45; makefile: 16
file content (217 lines) | stat: -rw-r--r-- 5,863 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
.\" This man page is Copyright (C) 1999 Andi Kleen <ak@muc.de>.
.\" 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.
.\" $Id: cmsg.3,v 1.1 2000/10/20 13:05:09 ricardo Exp $
.TH CMSG 3 "2 Oct 1998" "Linux Man Page" "Linux Programmer's Manual" 
.SH NOME
CMSG_ALIGN, CMSG_SPACE, CMSG_NXTHDR, CMSG_FIRSTHDR \- Accesso a dados acessrios.
.SH SINOPSE
.B #include <sys/socket.h>
.br
.sp 2
.BI "struct cmsghdr *CMSG_FIRSTHDR(struct msghdr *" msgh ");"
.br
.BI "struct cmsghdr *CMSG_NXTHDR(struct msghdr *" msgh ", struct cmsghdr *" cmsg ");"
.br
.BI "size_t CMSG_ALIGN(size_t " length ");"
.br
.BI "size_t CMSG_SPACE(size_t " length ");"
.br
.BI "size_t CMSG_LEN(size_t " length ");"
.br
.BI "void *CMSG_DATA(struct cmsghdr *" cmsg ");"       
.sp
.nf
.ta 8n 20n 32n
struct cmsghdr {
	socklen_t	cmsg_len;	/* total de bytes de dados, incluindo o cabealho */
	int	cmsg_level;	/* protocolo original */
	int	cmsg_type;	/* tipo protocolo-especfico */
/* followed by
	unsigned char	cmsg_data[]; */
};
.ta
.fi
.SH DESCRIO
Estas macros servem para criar e acessar mensagens de controle (tambm chamadas
dados acessrios) que no so parte do contedo do socket.
Esta informao pode incluir a interface onde o pacote foi recebido, uma miscelnea
de cabealhos raramente usados, uma descrio de erro mais detalhada, um conjunto de
descritores de arquivo ou credenciais unix. Por exemplo, pode se usar mensagens de
controle para enviar campos de cabealho adicionais tais como opes IP.
Os dados so enviados com
.BR sendmsg (2)
e recebidos com
.BR recvmsg (2).
Veja as manpages para mais informaes. 
.PP
Os dados acessrios consistem numa seqncia de 
.B struct cmsghdr 
seguidas de dados adicionais, que devem ser acessadas apenas com as macros descritas nesta
manpage e no diretamente. Veja os tipos de mensagens de controle nas manpages dos protocolos.
O tamanho mximo do buffer auxiliar do socket pode ser definido com
.B net.core.optmem_max
do sysctl. Ver
.BR socket (7).  
.PP
.B CMSG_FIRSTHDR 
retorna um ponteiro para o primeiro
.B cmsghdr 
do buffer acessrio associado ao
.BR msghdr .
.PP
.B CMSG_NXTHDR 
retorna o prximo
.B cmsghdr 
vlido depois do
.B cmsghdr. 
indicado, e retorna
.B NULL 
se no houver mais espao suficiente no buffer.
.PP
.BR CMSG_ALIGN ,
given a length, returns it including the required alignment. This is a 
constant expression.
.PP
.B CMSG_SPACE
retorna o nmero de bytes de um elemento acessrio com um contedo do comprimento indicado.
Esta expresso  constante.
.PP
.B CMSG_DATA
retorna um ponteiro para os dados de um
.BR cmsghdr . 
.PP
.B CMSG_LEN
retorna o valor do membro
.I cmsg_len
do struct
.B cmsghdr 
considerando qualquer alinhamento necessrio. Esta expresso  constante.
.PP
Para criar dados acessrios, inicialize o membro
.I msg_controllen
do
.B msghdr 
com o comprimento do buffer de mensagem de controle. Use
.B CMSG_FIRSTHDR 
no
.B msghdr 
para recuperar a primeira mensagem de controle e
.B CMSG_NEXTHDR
para as seguintes.
Para cada mensagem de controle, inicialize
.I cmsg_len
(com 
.BR CMSG_LEN ), 
e os outros campos e a poro de dados de
.B cmsghdr 
com
.BR CMSG_DATA .
No final, coloque a soma dos comprimentos de todas as mensagens de controle
(dados em
.B CMSG_SPACE )
no campo
.I msg_controllen 
do
.B msghdr 
Para mais informaes sobre o
.BR msghdr ,
veja
.BR recvmsg (2). 
.PP
Quando o buffer de mensagens de controle no comportar todas as mensagens,
o flag
.B MSG_CTRUNC 
do
.I msg_flags 
de
.BR msghdr 
ser ativado.
.SH EXEMPLO
Este cdigo procura a opo
.B IP_TTL 
num buffer acessrio recebido:
.PP
.RS
.nf
.ta 8n 16n 32n
struct msghdr msgh; 
struct cmsghdr *cmsg;
int *ttlptr;
int received_ttl;

/* Receber dados acessrios em msgh */ 
for (cmsg = CMSG_FIRSTHDR(&msgh); 
     cmsg != NULL; 
     cmsg = CMSG_NXTHDR(&msgh,cmsg) {
	if (cmsg->cmsg_level == SOL_IP 
	  && cmsg->cmsg_type == IP_TTL) { 
		ttlptr = (int *) CMSG_DATA(cmsg);
		received_ttl = *ttlptr; 
		break;
	}
}
if (cmsg == NULL) {
	/* Erro: IP_TTL desabilitado ou buffer muito curto
	 * ou erro de I/O .
	 */ 
} 
.ta
.fi
.RE
.PP
O cdigo abaixo transmite um array de descritores de arquivo atravs de um socket Unix usando
.BR SCM_RIGHTS :
.PP
.RS
.nf
.ta 8n 16n 32n
struct msghdr msg = {0};
struct cmsghdr *cmsg;
int myfds[NUM_FD]; /* Descritores de arquivo a transmitir. */ 
char buf[CMSG_SPACE(sizeof myfds)];  /* buffer de dados acessrios */
int *fdptr;

msg.msg_control = buf; 
msg.msg_controllen = sizeof buf;
cmsg = CMSG_FIRSTHDR(&msg); 
cmsg->cmsg_level = SOL_SOCKET;
cmsg->cmsg_type = SCM_RIGHTS;
cmsg->cmsg_len = CMSG_LEN(sizeof(int) * NUM_FD); 
/* Inicializar o contedo: */ 
fdptr = (int *)CMSG_DATA(cmsg); 
memcpy(fdptr, myfds, NUM_FD * sizeof(int)); 
/* Soma dos comprimentos de todas as mensagens de controle no buffer: */
msg.msg_controllen = cmsg->cmsg_len;
.ta
.fi
.RE
.SH OBSERVAES
Os dados acessrios devem ser acessados apenas com as macros definidas aqui
para manter a portabilidade.
.B CMSG_ALIGN
 uma extenso linux, e deve ser evitada em programas portveis.
.PP
No linux,
.BR CMSG_LEN , 
.BR CMSG_DATA ,
e
.B CMSG_ALIGN
so constantes (se receberem um argumento constante), e podem ser usados
para declarar o tamanho de variveis globais. Isto pode, no entanto, no ser
portvel.
.SH DE ACORDO COM
O modelo de dados acessrios segue o draft POSIX.1003.1g, 4.4BSD-Lite, a API IPv6
avanada descrita no RFC2292 e a Single Unix specification v2.
.B
CMSG_ALIGN 
 uma extenso linux. 
.SH VER TAMBM
.BR sendmsg "(2), " recvmsg (2)
.PP
RFC 2292
.SH TRADUZIDO POR LDP-BR em 21/08/2000.
\&\fR\&\f(CWPaulo Csar Mendes <drpc@ism.com.br> (traduo)\fR
\&\fR\&\f(CWxxxxxxxxxxxxxxxxxxxxxxxxx <xxx@xxxxxx.xxx.xx> (reviso)\fR