1ec8a32a0ef09fe8491416db7bb7c4a46bb74d28
[swifty.git] / test / server_lf.c
1 #include "../src/kernel/swift.h"
2
3 #include <sys/socket.h>
4 #include <sys/types.h>
5 #include <stdio.h>
6 #include <string.h>
7 #include <netinet/in.h>
8 #include <stdlib.h>
9 #include <fcntl.h>
10
11 #define ADDR 0x80BEA8C0
12
13 int main(int argc, const char *argv[])
14 {
15     int sock;
16
17     if (argc != 3) {
18         fprintf(stderr, "USAGE: %s listening_port output_file_name\n", argv[0]);
19         return -1;
20     }
21
22     sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_SWIFT);
23     if (sock < 0) {
24         perror("Failed to create socket");
25         return -1;
26     }
27
28     int size = sizeof(struct sockaddr_swift) + sizeof(struct swift_dest);
29     struct sockaddr_swift *saddr = malloc(size);
30     memset(saddr, 0, size);
31
32     saddr->count = 1;
33     saddr->dests[0].addr = ADDR;
34     saddr->dests[0].port = atoi(argv[1]);
35
36     if (bind(sock, (struct sockaddr *) saddr, size) < 0) {
37         perror("Failed to bind socket");
38         close(sock);
39         return -1;
40     }
41
42     int fd = open(argv[2], O_RDWR);
43     if (fd < 0) {
44         perror("Failed to open file");
45         close(sock);
46         return -1;
47     }
48
49     char buf[8192];
50     struct iovec iov[1];
51     struct msghdr msg;
52     struct sockaddr_swift *from = malloc(size);
53
54     memset(&msg, 0, sizeof(msg));
55     memset(&iov, 0, sizeof(iov));
56     memset(from, 0, size);
57
58     iov[0].iov_base = buf;
59     iov[0].iov_len = sizeof(buf);
60
61     msg.msg_iov = iov;
62     msg.msg_iovlen = 1;
63     msg.msg_name = from;
64     msg.msg_namelen = size;
65
66     while (1) {
67         int ret, fromlen;
68
69         ret = recvmsg(sock, &msg, 0);
70         if (ret < 0) {
71             perror("Failed to recv on socket");
72             close(fd);
73             return -1;
74         }
75
76         ret = write(fd, buf, ret, 0);
77         if (ret < 0) {
78             perror("Failed to write in file");
79             close(fd);
80             return -1;
81         }
82
83         printf("Received %d bytes on socket\n", ret);
84         printf("buf=%s\n", buf);
85
86         if (ret < 8192)
87             break;
88     }
89
90     if (close(sock) < 0) {
91         perror("Failed to close socket");
92         close(fd);
93         return -1;
94     }
95
96     close(fd);
97
98     free(saddr);
99     free(from);
100
101     return 0;
102 }