Package: manpages
Version: 4.08-1
Severity: normal
Hello,
ipv6(7) says in the ERROR paragraph that binding to a link-local v6
address without specifying a valid interface index in sin6_scope_id
returns the error ENODEV. This is a bit misleading because specifying 0
or a valid but wrong interface index returns EINVAL or EADDRNOTAVAIL
respectively.
Here is an easy test program
------------------------------->8-------------------------------
#include <arpa/inet.h>
#include <errno.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <unistd.h>
int main(int argc, char *const argv[])
{
uint32_t scope_id = 0;
char *addr;
in_port_t port = 12345;
int c;
struct sockaddr_in6 sa;
int s, ret;
while ((c = getopt(argc, argv, "i:p:")) != -1) {
switch (c) {
case 'i':
scope_id = atoi(optarg);
break;
case 'p':
port = atoi(optarg);
break;
default:
fprintf(stderr, "Usage: %s [-i scope_id] [-p port]
addr\n", argv[0]);
return EXIT_FAILURE;
}
}
if (optind >= argc) {
fprintf(stderr, "Usage: %s [-i scope_id] [-p port] addr\n",
argv[0]);
return EXIT_FAILURE;
}
sa.sin6_family = AF_INET6;
inet_pton(AF_INET6, argv[optind], &sa.sin6_addr);
sa.sin6_port = htons(port);
sa.sin6_scope_id = scope_id;
s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
if (s < 0) {
fprintf(stderr, "Failed to create socket, errno=%d\n", errno);
return EXIT_FAILURE;
}
ret = bind(s, (void *)&sa, sizeof(sa));
if (ret < 0) {
fprintf(stderr, "Failed to bind socket, errno=%d\n", errno);
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
------------------------------->8-------------------------------
And with this I get:
$ ./testprog -i 42 -p 12342 fe80::f2de:f1ff:fe44:529d
Failed to bind socket, errno=19
$ ./testprog -i 3 -p 12342 fe80::f2de:f1ff:fe44:529d
$ ./testprog -i 2 -p 12342 fe80::f2de:f1ff:fe44:529d
Failed to bind socket, errno=99
$ ./testprog -i 0 -p 12342 fe80::f2de:f1ff:fe44:529d
Failed to bind socket, errno=22
while interface 3 has the address passed as last parameter.
Best regards
Uwe
-- System Information:
Debian Release: stretch/sid
APT prefers testing
APT policy: (800, 'testing'), (600, 'unstable'), (500, 'testing-debug'),
(500, 'stable'), (1, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386
Kernel: Linux 3.16.0-4-amd64 (SMP w/4 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
manpages depends on no packages.
manpages recommends no packages.
Versions of packages manpages suggests:
ii man-db [man-browser] 2.7.5-2
-- no debconf information