#include "list.h"
#include "fd.h"
+/* Whether the given address conforms to the IPv4 address format. */
+static inline bool is_valid_ipv4_address(const char *address)
+{
+ struct in_addr test_it;
+ return inet_pton(AF_INET, address, &test_it) != 0;
+}
+
/**
* Parse and validate IPv4 address/netmask string.
*
return result;
}
+/* Whether a string conforms to IPv6 address format (RFC 4291). */
+static inline bool is_valid_ipv6_address(const char *address)
+{
+ struct in6_addr test_it;
+ return inet_pton(AF_INET6, address, &test_it) != 0;
+}
+
/**
* Perform basic syntax checking on the host-part of an URL:
*
* \param transport Transport protocol name (e.g. "udp", "tcp"), or NULL.
* \return Pointer to static result buffer.
*
- * \sa getservent(3), services(5), nsswitch.conf(5).
+ * \sa getservbyport(3), services(5), nsswitch.conf(5).
*/
const char *stringify_port(int port, const char *transport)
{
return service;
}
+#ifndef SOCK_DCCP
+#define SOCK_DCCP 6 /**< Linux socket type. */
+#endif
+
/**
* Determine the socket type for a given layer-4 protocol.
*
if (ai)
freeaddrinfo(ai);
if (ret < 0) {
- PARA_ERROR_LOG("can not create %s socket %s#%d.\n",
+ PARA_NOTICE_LOG("can not create %s socket %s#%d.\n",
layer4_name(l4type), host? host : (passive?
"[loopback]" : "[localhost]"), port_number);
}
return -ERRNO_TO_PARA_ERROR(errno);
}
+#ifndef DCCP_SOCKOPT_AVAILABLE_CCIDS
+#define DCCP_SOCKOPT_AVAILABLE_CCIDS 12 /**< List of supported CCIDs. */
+#endif
+
/**
* Probe the list of DCCP CCIDs configured on this host.
* \param ccid_array Pointer to return statically allocated array in.
socklen_t nccids = sizeof(ccids);
int ret, fd;
- ret = fd = makesock(IPPROTO_DCCP, 1, NULL, 0, NULL);
+ ret = fd = makesock(IPPROTO_DCCP, true /* passive */, NULL, 0, NULL);
if (ret < 0)
return ret;
return nccids;
}
+/**
+ * The buffer size of the sun_path component of struct sockaddr_un.
+ *
+ * While glibc doesn't define UNIX_PATH_MAX, it documents it has being limited
+ * to 108 bytes. On NetBSD it is only 104 bytes though. We trust UNIX_PATH_MAX
+ * if it is defined and use the size of the ->sun_path member otherwise. This
+ * should be safe everywhere.
+ */
+#ifndef UNIX_PATH_MAX
+#define UNIX_PATH_MAX (sizeof(((struct sockaddr_un *)0)->sun_path))
+#endif
+
/*
* Prepare a structure for AF_UNIX socket addresses.
*