2 * Test recvfrom "syscall".
10 #include <sys/socket.h>
11 #include <netinet/in.h>
14 #include "swift_types.h"
22 static void recvfrom_dummy(void);
23 static void recvfrom_invalid_descriptor(void);
24 static void recvfrom_descriptor_is_not_a_socket(void);
25 static void recvfrom_socket_is_not_bound(void);
26 static void recvfrom_after_sendto_ok(void);
27 static void recvfrom_after_sendmsg_ok(void);
29 // Additional function
30 static void fill_sockaddr_sw(struct sockaddr_sw *local_addr, struct sockaddr_sw *remote_addr, char * local_address, char * hash, char * dest_address);
32 void recvfrom_test_suite(void)
36 recvfrom_invalid_descriptor();
37 recvfrom_descriptor_is_not_a_socket();
38 recvfrom_socket_is_not_bound();
39 recvfrom_after_sendto_ok();
40 recvfrom_after_sendmsg_ok();
43 static void recvfrom_dummy(void)
48 static void recvfrom_invalid_descriptor(void)
50 struct sockaddr_sw local_addr;
51 struct sockaddr_sw remote_addr;
55 fill_sockaddr_sw(&local_addr, &remote_addr, "127.0.0.1", "myHash", "127.0.0.1");
56 bytes_recv = recvfrom(-1, buffer, BUFSIZ, 0, (struct sockaddr *) &remote_addr, sizeof(remote_addr));
58 test(bytes_recv < 0 && errno == EBADF);
61 static void recvfrom_descriptor_is_not_a_socket(void)
63 struct sockaddr_sw local_addr;
64 struct sockaddr_sw remote_addr;
68 fill_sockaddr_sw(&local_addr, &remote_addr, "127.0.0.1", "myHash", "127.0.0.1");
69 bytes_recv = recvfrom(1, buffer, BUFSIZ, 0, (struct sockaddr *) &remote_addr, sizeof(remote_addr));
71 test(bytes_recv < 0 && errno == ENOTSOCK);
74 static void recvfrom_socket_is_not_bound(void)
77 struct sockaddr_sw local_addr;
78 struct sockaddr_sw remote_addr;
82 sockfd = socket(PF_INET, SOCK_DGRAM, IPPROTO_SWIFT);
83 DIE(sockfd < 0, "socket");
85 fill_sockaddr_sw(&local_addr, &remote_addr, "127.0.0.1", "myHash", "127.0.0.1");
86 bytes_recv = recvfrom(sockfd, buffer, BUFSIZ, 0, (struct sockaddr *) &remote_addr, sizeof(remote_addr));
88 test( bytes_recv < 0 && errno == EAFNOSUPPORT );
91 static void recvfrom_after_sendto_ok(void)
96 static void recvfrom_after_sendmsg_ok(void)
101 static void fill_sockaddr_sw(struct sockaddr_sw *local_addr, struct sockaddr_sw *remote_addr, char * local_address, char * hash, char * dest_address)
103 local_addr->sin_addr.s_addr = htonl((int)local_address);
104 memcpy(&local_addr->sw_hash, hash, sizeof(struct sw_hash));
106 remote_addr->sin_addr.s_addr = htonl((int)dest_address);
107 memcpy(&remote_addr->sw_hash, hash, sizeof(struct sw_hash));