aacdec: no need to read the offset table.
[paraslash.git] / net.c
diff --git a/net.c b/net.c
index 9c646e9046859d006a307824a108e9825de70967..d4472c0e2805ecb898ef4caae85a96980fe6d447 100644 (file)
--- a/net.c
+++ b/net.c
 
 #include "para.h"
 #include "net.h"
+#include "string.h"
 #include <netdb.h>
 #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);
 
+
 /**
  * initialize a struct sockaddr_in
  * @param addr A pointer to the struct to be initialized
@@ -73,7 +74,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 */
@@ -130,7 +131,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;
@@ -188,8 +189,11 @@ int recv_buffer(int fd, char *buf, ssize_t size)
 {
        int n;
 
-       if ((n = recv_bin_buffer(fd, buf, size - 1)) >= 0)
+       n = recv_bin_buffer(fd, buf, size - 1);
+       if (n >= 0)
                buf[n] = '\0';
+       else
+               *buf = '\0';
        return n;
 }
 
@@ -253,7 +257,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;
 
@@ -331,6 +335,19 @@ int create_pf_socket(const char *name, struct sockaddr_un *unix_addr, int mode)
        return fd;
 }
 
+#ifndef HAVE_UCRED
+       struct ucred {
+       uid_t uid, pid, gid;
+};
+ssize_t send_cred_buffer(int sock, char *buf)
+{
+       return send_buffer(sock, buf);
+}
+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 NULL terminated buffer and Unix credentials of the current process
  *
@@ -390,19 +407,21 @@ 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;
 
        setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &yes, sizeof(int));
        memset(&msg, 0, sizeof(msg));
@@ -415,13 +434,13 @@ 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;
+       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) {
@@ -433,6 +452,7 @@ int recv_cred_buffer(int fd, char *buf, size_t size, struct ucred *cred)
        }
        return result;
 }
+#endif /* HAVE_UCRED */
 
 /** how many pending connections queue will hold */
 #define BACKLOG 10
@@ -444,7 +464,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)
@@ -493,11 +513,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:
+       if (ret < 0)
+               PARA_NOTICE_LOG("did not receive pattern '%s'\n", pattern);
        free(buf);
        return ret;
 }