X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=net.c;h=0aaa428df08a49ed7cc7a60b6c050563425e5def;hp=59b8616a56be2cd0dec066a5c431d3fbea9cab43;hb=b3c2f654796cfc9c96f7c784fbdeebdef6f7928e;hpb=2ed89c59f0efcd0a2763f47c7d3455663241e623 diff --git a/net.c b/net.c index 59b8616a..0aaa428d 100644 --- a/net.c +++ b/net.c @@ -20,14 +20,20 @@ #include "para.h" #include "net.h" -#include "gcc-compat.h" +#include "string.h" #include #include "error.h" -#include "string.h" extern void (*crypt_function_recv)(unsigned long len, const unsigned char *indata, unsigned char *outdata); extern void (*crypt_function_send)(unsigned long len, const unsigned char *indata, unsigned char *outdata); + +#ifndef HAVE_UCRED + struct ucred { + uid_t uid, pid, gid; +}; +#endif /* HAVE_UCRED */ + /** * initialize a struct sockaddr_in * @param addr A pointer to the struct to be initialized @@ -74,7 +80,7 @@ static int sendall(int fd, const char *buf, size_t *len) total += n; bytesleft -= n; if (total < *len) - PARA_DEBUG_LOG("short write (%d byte(s) left)", + PARA_DEBUG_LOG("short write (%zd byte(s) left)", *len - total); } *len = total; /* return number actually sent here */ @@ -131,7 +137,7 @@ int send_buffer(int fd, const char *buf) * * @return Positive on success, \p -E_SEND on errors. */ -__printf_2_3 int send_va_buffer(int fd, char *fmt, ...) +__printf_2_3 int send_va_buffer(int fd, const char *fmt, ...) { char *msg; int ret; @@ -254,7 +260,7 @@ int para_connect(int fd, struct sockaddr_in *their_addr) * * \sa accept(2). */ -int para_accept(int fd, void *addr, size_t size) +int para_accept(int fd, void *addr, socklen_t size) { int new_fd; @@ -364,6 +370,7 @@ ssize_t send_cred_buffer(int sock, char *buf) msg.msg_iovlen = 1; msg.msg_control = control; msg.msg_controllen = sizeof(control); +#ifdef HAVE_UCRED /* attach the ucred struct */ cmsg = CMSG_FIRSTHDR(&msg); cmsg->cmsg_level = SOL_SOCKET; @@ -371,6 +378,7 @@ ssize_t send_cred_buffer(int sock, char *buf) cmsg->cmsg_len = CMSG_LEN(sizeof(struct ucred)); *(struct ucred *)CMSG_DATA(cmsg) = c; msg.msg_controllen = cmsg->cmsg_len; +#endif ret = sendmsg(sock, &msg, 0); if (ret < 0) ret = -E_SENDMSG; @@ -391,21 +399,25 @@ static void dispose_fds(int *fds, int num) * \param fd the socket file descriptor * \param buf the buffer to store the message * \param size the size of \a buffer - * \param cred the credentials are returned here + * + * \return negative on errors, the user id on success. * * \sa okir's Black Hats Manual * \sa recvmsg(2) */ -int recv_cred_buffer(int fd, char *buf, size_t size, struct ucred *cred) +int recv_cred_buffer(int fd, char *buf, size_t size) { char control[255]; struct msghdr msg; struct cmsghdr *cmsg; struct iovec iov; - int result; + int result = 0; int yes = 1; + struct ucred cred; +#ifdef HAVE_UCRED setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &yes, sizeof(int)); +#endif memset(&msg, 0, sizeof(msg)); memset(buf, 0, size); iov.iov_base = buf; @@ -416,13 +428,14 @@ int recv_cred_buffer(int fd, char *buf, size_t size, struct ucred *cred) msg.msg_controllen = sizeof(control); if (recvmsg(fd, &msg, 0) < 0) return -E_RECVMSG; - result = -SCM_CREDENTIALS; +#ifdef HAVE_UCRED + result = -E_SCM_CREDENTIALS; cmsg = CMSG_FIRSTHDR(&msg); while (cmsg) { if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_CREDENTIALS) { - memcpy(cred, CMSG_DATA(cmsg), sizeof(struct ucred)); - result = iov.iov_len; + memcpy(&cred, CMSG_DATA(cmsg), sizeof(struct ucred)); + result = cred.uid; } else if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS) { @@ -432,6 +445,7 @@ int recv_cred_buffer(int fd, char *buf, size_t size, struct ucred *cred) } cmsg = CMSG_NXTHDR(&msg, cmsg); } +#endif return result; } @@ -445,7 +459,7 @@ int recv_cred_buffer(int fd, char *buf, size_t size, struct ucred *cred) * \return The file descriptor of the created socket, negative * on errors. * - * \sa get_socket() + * \sa get_socket() * \sa setsockopt(2) * \sa bind(2) * \sa listen(2) @@ -494,11 +508,12 @@ int recv_pattern(int fd, const char *pattern, size_t bufsize) if (n < len) goto out; - buf[n] = '\0'; if (strncasecmp(buf, pattern, len)) goto out; ret = 1; out: free(buf); + if (ret < 0) + PARA_NOTICE_LOG("did not receive pattern '%s'\n", buf); return ret; }