* \sa setsockopt(2)
*/
void flowopt_add(struct flowopts *fo, int lev, int opt,
- char *name, const void *val, int len)
+ const char *name, const void *val, int len)
{
struct pre_conn_opt *new = para_malloc(sizeof(*new));
}
void flowopt_add_bool(struct flowopts *fo, int lev, int opt,
- char *optname, bool on_or_off)
+ const char *optname, bool on_or_off)
{
int on = on_or_off; /* kernel takes 'int' */
}
/**
- * Maximum transport-layer message size (MMS_S) as per RFC 1122, 3.3.3
- * Socket must be connected.
+ * Get the maximum transport-layer message size (MMS_S).
+ *
+ * \param sockfd The socket file descriptor.
+ *
+ * The socket must be connected. See RFC 1122, 3.3.3. If the protocol familiy
+ * could not be determined, \p AF_INET is assumed.
+ *
+ * \return The maximum message size of the address family type.
*/
int generic_max_transport_msg_size(int sockfd)
{
return generic_mtu(af_type) - estimated_header_overhead(af_type);
}
-/**
- * Print numeric host and port number (beware - uses static char).
- *
- * \param sa The IPv4/IPv6 socket address to use.
- *
- * \return Host string in numeric host:port format, \sa parse_url().
- * \sa getnameinfo(3), services(5), nsswitch.conf(5)
- */
-static char *host_and_port(const struct sockaddr_storage *ss)
-{
- const struct sockaddr *sa = normalize_ip_address(ss);
- char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
- static char output[sizeof(hbuf) + sizeof(sbuf) + 4];
- int ret;
-
- ret = getnameinfo(sa, salen(sa),
- hbuf, sizeof(hbuf),
- sbuf, sizeof(sbuf),
- NI_NUMERICHOST | NI_NUMERICSERV);
- if (ret) {
- snprintf(output, sizeof(output), "(unknown)");
- PARA_WARNING_LOG("hostname lookup error (%s).\n",
- gai_strerror(ret));
- } else if (sa->sa_family == AF_INET6) {
- snprintf(output, sizeof(output), "[%s]:%s", hbuf, sbuf);
- } else {
- snprintf(output, sizeof(output), "%s:%s", hbuf, sbuf);
- }
- return output;
-}
-
/**
* Look up the local or remote side of a connected socket structure.
*
* remote side.
*
* \return A static character string identifying hostname and port of the
- * chosen side.
+ * chosen side in numeric host:port format.
*
- * \sa getsockname(2), getpeername(2).
+ * \sa getsockname(2), getpeername(2), parse_url(), getnameinfo(3),
+ * services(5), nsswitch.conf(5).
*/
-static char *__get_sock_name(int fd, int (*getname)(int, struct sockaddr*,
- socklen_t *))
+static char *__get_sock_name(int fd, typeof(getsockname) getname)
{
struct sockaddr_storage ss;
+ const struct sockaddr *sa;
socklen_t sslen = sizeof(ss);
+ char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
+ static char output[sizeof(hbuf) + sizeof(sbuf) + 4];
+ int ret;
if (getname(fd, (struct sockaddr *)&ss, &sslen) < 0) {
- static char *dont_know = "(don't know)";
PARA_ERROR_LOG("can not determine address from fd %d: %s\n",
fd, strerror(errno));
- return dont_know;
+ snprintf(output, sizeof(output), "(unknown)");
+ return output;
}
- return host_and_port(&ss);
+ sa = normalize_ip_address(&ss);
+ ret = getnameinfo(sa, salen(sa), hbuf, sizeof(hbuf), sbuf,
+ sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV);
+ if (ret) {
+ PARA_WARNING_LOG("hostname lookup error (%s).\n",
+ gai_strerror(ret));
+ snprintf(output, sizeof(output), "(lookup error)");
+ } else if (sa->sa_family == AF_INET6)
+ snprintf(output, sizeof(output), "[%s]:%s", hbuf, sbuf);
+ else
+ snprintf(output, sizeof(output), "%s:%s", hbuf, sbuf);
+ return output;
}
/**