d244b20f9e66a5094694b16733cddd41b6f27165
[swifty.git] / src / lib_swift.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 #include <arpa/inet.h>
6 #include <netinet/in.h>
7 #include <sys/types.h>
8 #include <sys/socket.h>
9 #include <unistd.h>
10
11 #include "lib_swift.h"
12
13 struct sockSwiftaddr transformFromAddrToSwift(struct listsockaddr lsa)
14 {
15         struct sockSwiftaddr ssa;
16         int i;
17         
18         for (i = 0; i < lsa.N; i++)
19         {
20                 ssa.sin_addr.s_addr[i] = lsa.sa[i].sin_addr.s_addr;
21         }
22         
23         return ssa;
24 }
25
26 struct listsockaddr transformFromSwiftToAddr(struct sockSwiftaddr ssa)
27 {
28         struct listsockaddr lsa;
29         int i;
30         
31         lsa.N = ssa.sin_addr.N;
32         
33         for ( i = 0; i < lsa.N; i++) {
34                 lsa.sa[i].sin_family = ssa.sin_family;
35                 lsa.sa[i].sin_port = ssa.sin_port;
36                 lsa.sa[i].sin_addr.s_addr = ssa.sin_addr.s_addr[i];
37         }
38         
39         return lsa;
40 }
41
42 int listenfromSwift (Swift s, void *buf, size_t len, int flags,
43                  struct sockSwiftaddr * __restrict__ from, socklen_t *fromlen)
44 {
45         struct sockaddr s_other;
46         struct listsockaddr lsa;
47         socklen_t slen=sizeof(s_other);
48
49         Dprintf("wait to receive messages");
50         
51         int rec = recvfrom(s->socketListener, buf, len, flags,
52                 (struct sockaddr * __restrict__)&s_other, &slen);
53         
54         // fill listsockaddr
55         memcpy(&lsa.sa[0], &s_other, sizeof(s_other));
56         lsa.N = 1;
57         
58         *from = transformFromAddrToSwift(lsa);
59         
60         return rec;
61 }
62
63 int bindSwift(Swift s, const struct sockSwiftaddr *my_addr, socklen_t addrlen)
64 {
65         Dprintf("bind swift socket");
66         return bind(s->socketListener, 
67                 (const struct sockaddr *)&s->socketListenerAddr,
68                 sizeof(s->socketListenerAddr));
69 }
70
71 Swift socketSwift()
72 {
73         Dprintf("create swift socket"); 
74         Swift s = calloc(1,sizeof(*s));
75
76         Dprintf("create swift socket listener");        
77         CHECK(s->socketListener = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP));
78
79         Dprintf("create swift socket data");    
80         CHECK(s->socketData = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP));
81
82         memset((char *) &s->socketListenerAddr, 0, sizeof(s->socketListenerAddr));
83         
84         s->socketListenerAddr.sin_family = AF_INET;
85         s->socketListenerAddr.sin_port = htons(SWIFT_PORT);
86         s->socketListenerAddr.sin_addr.s_addr = htonl(INADDR_ANY);
87         
88         return s;
89 }
90
91 void closeSwift(Swift s)
92 {
93         Dprintf("close swift socket");
94         close(s->socketListener);
95         
96         free(s);
97 }
98
99