X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=net.c;h=c28cf0964b0468bc9e616dc2c014536bc84e2ad0;hp=c11f67c4bac3f7f316daa317ae71ed8ebe6f10a9;hb=6b291ea777418071bb21c20aa7804447d95422bc;hpb=72e9bdf7c5c09ca4c20cad56c68a9a155cceff43 diff --git a/net.c b/net.c index c11f67c4..c28cf096 100644 --- a/net.c +++ b/net.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2014 Andre Noll + * Copyright (C) 2005 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -48,7 +48,7 @@ * \param netmask Value of the netmask part in \a cidr or the * default of 32 if not specified. * - * \return Pointer to \a addr if succesful, NULL on error. + * \return Pointer to \a addr if successful, NULL on error. * \sa RFC 4632 */ char *parse_cidr(const char *cidr, @@ -208,7 +208,7 @@ const char *stringify_port(int port, const char *transport) struct servent *se = getservbyport(htons(port), transport); if (se == NULL) - snprintf(service, sizeof(service), "%u", port); + snprintf(service, sizeof(service), "%d", port); else snprintf(service, sizeof(service), "%s", se->s_name); } @@ -601,7 +601,7 @@ static inline int estimated_header_overhead(const int af_type) * * \param sockfd The socket file descriptor. * - * The socket must be connected. See RFC 1122, 3.3.3. If the protocol familiy + * The socket must be connected. See RFC 1122, 3.3.3. If the protocol family * could not be determined, \p AF_INET is assumed. * * \return The maximum message size of the address family type. @@ -622,11 +622,9 @@ int generic_max_transport_msg_size(int sockfd) } /** - * Look up the local or remote side of a connected socket structure. + * Look up the remote side of a connected socket structure. * * \param fd The socket descriptor of the connected socket. - * \param getname Either \p getsockname() for local, or \p getpeername() for - * remote side. * * \return A static character string identifying hostname and port of the * chosen side in numeric host:port format. @@ -634,7 +632,7 @@ int generic_max_transport_msg_size(int sockfd) * \sa getsockname(2), getpeername(2), parse_url(), getnameinfo(3), * services(5), nsswitch.conf(5). */ -static char *__get_sock_name(int fd, typeof(getsockname) getname) +char *remote_name(int fd) { struct sockaddr_storage ss; const struct sockaddr *sa; @@ -643,7 +641,7 @@ static char *__get_sock_name(int fd, typeof(getsockname) getname) static char output[sizeof(hbuf) + sizeof(sbuf) + 4]; int ret; - if (getname(fd, (struct sockaddr *)&ss, &sslen) < 0) { + if (getpeername(fd, (struct sockaddr *)&ss, &sslen) < 0) { PARA_ERROR_LOG("can not determine address from fd %d: %s\n", fd, strerror(errno)); snprintf(output, sizeof(output), "(unknown)"); @@ -663,36 +661,6 @@ static char *__get_sock_name(int fd, typeof(getsockname) getname) return output; } -/** - * Look up the local side of a connected socket structure. - * - * \param sockfd The file descriptor of the socket. - * - * \return A pointer to a static buffer containing hostname an port. This - * buffer must not be freed by the caller. - * - * \sa remote_name(). - */ -char *local_name(int sockfd) -{ - return __get_sock_name(sockfd, getsockname); -} - -/** - * Look up the remote side of a connected socket structure. - * - * \param sockfd The file descriptor of the socket. - * - * \return Analogous to the return value of \ref local_name() but for the - * remote side. - * - * \sa local_name(). - */ -char *remote_name(int sockfd) -{ - return __get_sock_name(sockfd, getpeername); -} - /** * Extract IPv4 or IPv6-mapped-IPv4 address from sockaddr_storage. * @@ -880,8 +848,7 @@ static int init_unix_addr(struct sockaddr_un *u, const char *name) * Prepare, create, and bind a socket for local communication. * * \param name The socket pathname. - * \param unix_addr Pointer to the \p AF_UNIX socket structure. - * \param mode The desired mode of the socket. + * \param mode The desired permissions of the socket. * * This function creates a local socket for sequenced, reliable, * two-way, connection-based byte streams. @@ -892,19 +859,19 @@ static int init_unix_addr(struct sockaddr_un *u, const char *name) * \sa bind(2) * \sa chmod(2) */ -int create_local_socket(const char *name, struct sockaddr_un *unix_addr, - mode_t mode) +int create_local_socket(const char *name, mode_t mode) { + struct sockaddr_un unix_addr; int fd, ret; - ret = init_unix_addr(unix_addr, name); + ret = init_unix_addr(&unix_addr, name); if (ret < 0) return ret; ret = socket(PF_UNIX, SOCK_STREAM, 0); if (ret < 0) return -ERRNO_TO_PARA_ERROR(errno); fd = ret; - ret = bind(fd, (struct sockaddr *) unix_addr, UNIX_PATH_MAX); + ret = bind(fd, (struct sockaddr *)&unix_addr, UNIX_PATH_MAX); if (ret < 0) { ret = -ERRNO_TO_PARA_ERROR(errno); goto err; @@ -963,16 +930,18 @@ int recv_cred_buffer(int fd, char *buf, size_t size) return recv_buffer(fd, buf, size) > 0? 1 : -E_RECVMSG; } #else /* HAVE_UCRED */ + /** - * Send \p NULL-terminated buffer and Unix credentials of the current process. + * Send a buffer and the credentials of the current process to a socket. * - * \param sock The socket file descriptor. - * \param buf The buffer to be sent. + * \param sock The file descriptor of the sending socket. + * \param buf The zero-terminated buffer to send. * - * \return On success, this call returns the number of characters sent. On - * error, \p -E_SENDMSG is returned. + * \return On success, this call returns the number of bytes sent. On errors, + * \p -E_SENDMSG is returned. * - * \sa sendmsg(2), okir's Black Hats Manual. + * \sa \ref recv_cred_buffer, sendmsg(2), socket(7), unix(7), okir's Black Hats + * Manual. */ ssize_t send_cred_buffer(int sock, char *buf) { @@ -985,7 +954,7 @@ ssize_t send_cred_buffer(int sock, char *buf) /* Response data */ iov.iov_base = buf; - iov.iov_len = strlen(buf); + iov.iov_len = strlen(buf); c.pid = getpid(); c.uid = getuid(); c.gid = getgid(); @@ -1003,7 +972,7 @@ ssize_t send_cred_buffer(int sock, char *buf) *(struct ucred *)CMSG_DATA(cmsg) = c; msg.msg_controllen = cmsg->cmsg_len; ret = sendmsg(sock, &msg, 0); - if (ret < 0) + if (ret < 0) ret = -E_SENDMSG; return ret; } @@ -1019,13 +988,13 @@ static void dispose_fds(int *fds, unsigned num) /** * Receive a buffer and the Unix credentials of the sending process. * - * \param fd the socket file descriptor. - * \param buf the buffer to store the message. - * \param size the size of \a buffer. + * \param fd The file descriptor of the receiving socket. + * \param buf The buffer to store the received message. + * \param size The length of \a buf in bytes. * - * \return negative on errors, the user id on success. + * \return Negative on errors, the user id of the sending process on success. * - * \sa recvmsg(2), okir's Black Hats Manual. + * \sa \ref send_cred_buffer and the references given there. */ int recv_cred_buffer(int fd, char *buf, size_t size) { @@ -1058,7 +1027,7 @@ int recv_cred_buffer(int fd, char *buf, size_t size) } else if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS) { - dispose_fds((int *) CMSG_DATA(cmsg), + dispose_fds((int *)CMSG_DATA(cmsg), (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int)); }