errno = 0;
parsed = strtoul(str, NULL, 10);
if (errno)
- return pr_errno(errno, "'%s' is not an unsigned integer", str);
+ return pr_errno(errno,
+ "Value '%s' at '%s' is not an unsigned integer", str,
+ field->name);
if (parsed < field->min || field->max < parsed) {
- return pr_err("'%lu' is out of bounds (%u-%u).", parsed,
- field->min, field->max);
+ return pr_err("Value '%lu' at '%s' is out of range (%u-%u).",
+ parsed, field->name, field->min, field->max);
}
*((unsigned int *) result) = parsed;
{
struct addrinfo *addrs;
struct addrinfo *addr;
+ unsigned long port;
int fd; /* "file descriptor" */
int error;
continue;
}
- printf("Success.\n");
+ error = getsockname(fd, addr->ai_addr, &addr->ai_addrlen);
+ if (error) {
+ close(fd);
+ freeaddrinfo(addrs);
+ return pr_errno(errno, "getsockname() failed");
+ }
+
+ port = (unsigned char)(addr->ai_addr->sa_data[0]) << 8;
+ port += (unsigned char)(addr->ai_addr->sa_data[1]);
+ printf("Success, bound to address '%s', port '%ld'.\n",
+ (addr->ai_canonname != NULL) ? addr->ai_canonname : "any",
+ port);
freeaddrinfo(addrs);
*result = fd;
return 0; /* Happy path */