@@ -47,6 +47,9 @@ ssize_t safe_sendto(const char *file, const int lineno, char len_strict,
ssize_t safe_sendmsg(const char *file, const int lineno, size_t msg_len,
int sockfd, const struct msghdr *msg, int flags);
+ssize_t safe_recv(const char *file, const int lineno, size_t len,
+ int sockfd, void *buf, size_t size, int flags);
+
ssize_t safe_recvmsg(const char *file, const int lineno, size_t msg_len,
int sockfd, struct msghdr *msg, int flags);
@@ -42,6 +42,9 @@
#define SAFE_SENDMSG(msg_len, fd, msg, flags) \
safe_sendmsg(__FILE__, __LINE__, msg_len, fd, msg, flags)
+#define SAFE_RECV(msg_len, fd, buf, size, flags) \
+ safe_recv(__FILE__, __LINE__, (msg_len), (fd), (buf), (size), (flags))
+
#define SAFE_RECVMSG(msg_len, fd, msg, flags) \
safe_recvmsg(__FILE__, __LINE__, msg_len, fd, msg, flags)
@@ -273,6 +273,31 @@ ssize_t safe_sendmsg(const char *file, const int lineno, size_t len,
return rval;
}
+ssize_t safe_recv(const char *file, const int lineno, size_t len,
+ int sockfd, void *buf, size_t size, int flags)
+{
+ ssize_t rval;
+
+ rval = recv(sockfd, buf, size, flags);
+
+ if (rval == -1) {
+ tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
+ "recv(%d, %p, %zu, %d) failed", sockfd, buf, size,
+ flags);
+ } else if (rval < 0) {
+ tst_brkm_(file, lineno, TBROK | TERRNO, NULL,
+ "Invalid recv(%d, %p, %zu, %d) return value %zd",
+ sockfd, buf, size, flags, rval);
+ } else if (len && (size_t)rval != len) {
+ tst_brkm_(file, lineno, TBROK, NULL,
+ "recv(%d, %p, %zu, %d) ret(%zd) != len(%zu)",
+ sockfd, buf, size, flags, rval, len);
+ }
+
+ return rval;
+
+}
+
ssize_t safe_recvmsg(const char *file, const int lineno, size_t len,
int sockfd, struct msghdr *msg, int flags)
{