2 * Test sw_recvfrom "syscall".
10 #include <sys/socket.h>
11 #include <netinet/in.h>
14 #include "swift_raw.h"
15 #include "swift_types.h"
23 static void recvfrom_dummy(void);
24 static void recvfrom_invalid_descriptor(void);
25 static void recvfrom_descriptor_is_not_a_socket(void);
26 static void recvfrom_socket_is_not_bound(void);
27 static void recvfrom_after_sendto_ok(void);
28 static void recvfrom_after_sendmsg_ok(void);
30 // Additional function
31 static void fill_sockaddr_sw(struct sockaddr_sw *local_addr, struct sockaddr_sw *remote_addr, char * local_address, char * hash, char * dest_address);
33 void recvfrom_test_suite(void)
37 recvfrom_invalid_descriptor();
38 recvfrom_descriptor_is_not_a_socket();
39 recvfrom_socket_is_not_bound();
40 recvfrom_after_sendto_ok();
41 recvfrom_after_sendmsg_ok();
44 static void recvfrom_dummy(void)
49 static void recvfrom_invalid_descriptor(void)
51 struct sockaddr_sw local_addr;
52 struct sockaddr_sw remote_addr;
56 fill_sockaddr_sw(&local_addr, &remote_addr, "127.0.0.1", "myHash", "127.0.0.1");
57 bytes_recv = sw_recvfrom(-1, buffer, BUFSIZ, 0, (struct sockaddr *) &remote_addr, sizeof(remote_addr));
59 test(bytes_recv < 0 && errno == EBADF);
62 static void recvfrom_descriptor_is_not_a_socket(void)
64 struct sockaddr_sw local_addr;
65 struct sockaddr_sw remote_addr;
69 fill_sockaddr_sw(&local_addr, &remote_addr, "127.0.0.1", "myHash", "127.0.0.1");
70 bytes_recv = sw_recvfrom(1, buffer, BUFSIZ, 0, (struct sockaddr *) &remote_addr, sizeof(remote_addr));
72 test(bytes_recv < 0 && errno == ENOTSOCK);
75 static void recvfrom_socket_is_not_bound(void)
78 struct sockaddr_sw local_addr;
79 struct sockaddr_sw remote_addr;
83 sockfd = sw_socket(PF_INET, SOCK_DGRAM, IPPROTO_SWIFT);
84 DIE(sockfd < 0, "sw_socket");
86 fill_sockaddr_sw(&local_addr, &remote_addr, "127.0.0.1", "myHash", "127.0.0.1");
87 bytes_recv = sw_recvfrom(sockfd, buffer, BUFSIZ, 0, (struct sockaddr *) &remote_addr, sizeof(remote_addr));
89 test( bytes_recv < 0 && errno == EAFNOSUPPORT );
92 static void recvfrom_after_sendto_ok(void)
97 static void recvfrom_after_sendmsg_ok(void)
102 static void fill_sockaddr_sw(struct sockaddr_sw *local_addr, struct sockaddr_sw *remote_addr, char * local_address, char * hash, char * dest_address)
104 local_addr->sin_addr.s_addr = htonl((int)local_address);
105 memcpy(&local_addr->sw_hash, hash, sizeof(struct sw_hash));
107 remote_addr->sin_addr.s_addr = htonl((int)dest_address);
108 memcpy(&remote_addr->sw_hash, hash, sizeof(struct sw_hash));