/*
- * Copyright (C) 2005-2011 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2005-2013 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
#define AI_ADDRCONFIG 0
#endif
-#include <dirent.h>
#include <regex.h>
-#include <openssl/rc4.h>
#include "para.h"
#include "error.h"
-#include "crypt.h"
#include "net.h"
#include "string.h"
#include "list.h"
* \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;
}
/**
return ia;
}
-/**
- * Send a binary buffer.
- *
- * \param fd The file descriptor.
- * \param buf The buffer to be sent.
- * \param len The length of \a buf.
- *
- * Send out the buffer and try to resend the remaining part in case of short
- * writes.
- *
- * \return Standard.
- */
-int send_bin_buffer(int fd, const char *buf, size_t len)
-{
- if (!len)
- PARA_CRIT_LOG("len == 0\n");
- return write_all(fd, buf, &len);
-}
-
-/**
- * Send a \p NULL-terminated buffer.
- *
- * \param fd The file descriptor.
- * \param buf The null-terminated buffer to be send.
- *
- * This is equivalent to send_bin_buffer(fd, buf, strlen(buf)).
- *
- * \return Standard.
- */
-int send_buffer(int fd, const char *buf)
-{
- return send_bin_buffer(fd, buf, strlen(buf));
-}
-
-/**
- * Send a buffer given by a format string.
- *
- * \param fd The file descriptor.
- * \param fmt A format string.
- *
- * \return Standard.
- */
-__printf_2_3 int send_va_buffer(int fd, const char *fmt, ...)
-{
- char *msg;
- int ret;
-
- PARA_VSPRINTF(fmt, msg);
- ret = send_buffer(fd, msg);
- free(msg);
- return ret;
-}
-
/**
* Receive data from a file descriptor.
*
#ifndef HAVE_UCRED
ssize_t send_cred_buffer(int sock, char *buf)
{
- return send_buffer(sock, buf);
+ return write_buffer(sock, buf);
}
int recv_cred_buffer(int fd, char *buf, size_t size)
{