X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=net.c;h=d4472c0e2805ecb898ef4caae85a96980fe6d447;hp=5af967b99b13313565bb3ab830457c5cb607b414;hb=39f4ce8ef309f5ee3e800494a726cda1412916be;hpb=c9d743cd9a0ac9788884fafd70e6cf5e78941290 diff --git a/net.c b/net.c index 5af967b9..d4472c0e 100644 --- a/net.c +++ b/net.c @@ -28,12 +28,6 @@ extern void (*crypt_function_recv)(unsigned long len, const unsigned char *indat 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 @@ -195,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; } @@ -338,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 * @@ -370,7 +380,6 @@ 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; @@ -378,7 +387,6 @@ 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; @@ -415,9 +423,7 @@ int recv_cred_buffer(int fd, char *buf, size_t size) 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; @@ -428,7 +434,6 @@ int recv_cred_buffer(int fd, char *buf, size_t size) msg.msg_controllen = sizeof(control); if (recvmsg(fd, &msg, 0) < 0) return -E_RECVMSG; -#ifdef HAVE_UCRED result = -E_SCM_CREDENTIALS; cmsg = CMSG_FIRSTHDR(&msg); while (cmsg) { @@ -445,9 +450,9 @@ int recv_cred_buffer(int fd, char *buf, size_t size) } cmsg = CMSG_NXTHDR(&msg, cmsg); } -#endif return result; } +#endif /* HAVE_UCRED */ /** how many pending connections queue will hold */ #define BACKLOG 10 @@ -508,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; }