Diffstat (limited to 'noncore/net/wellenreiter/libwellenreiter/source/wl_sock.cc') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/net/wellenreiter/libwellenreiter/source/wl_sock.cc | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/noncore/net/wellenreiter/libwellenreiter/source/wl_sock.cc b/noncore/net/wellenreiter/libwellenreiter/source/wl_sock.cc new file mode 100644 index 0000000..5714afb --- a/dev/null +++ b/noncore/net/wellenreiter/libwellenreiter/source/wl_sock.cc | |||
@@ -0,0 +1,91 @@ | |||
1 | /* | ||
2 | * Socket operations for wellenreiter | ||
3 | * | ||
4 | * $Id$ | ||
5 | */ | ||
6 | |||
7 | #include "wl_sock.hh" | ||
8 | #include "wl_log.hh" | ||
9 | |||
10 | /* Setup UDP Socket for incoming commands */ | ||
11 | int wl_setupsock(const char *host, int port) | ||
12 | { | ||
13 | struct sockaddr_in saddr; | ||
14 | int sock; | ||
15 | |||
16 | if((sock=socket(AF_INET, SOCK_DGRAM, 0)) < 0) | ||
17 | { | ||
18 | wl_logerr("Cannot set up socket: %s", strerror(errno)); | ||
19 | return -1; | ||
20 | } | ||
21 | |||
22 | memset(&saddr, 0, sizeof(saddr)); | ||
23 | saddr.sin_family = PF_INET; | ||
24 | saddr.sin_port = htons(port); | ||
25 | saddr.sin_addr.s_addr = inet_addr(host); | ||
26 | |||
27 | if(bind(sock,(struct sockaddr *)&saddr, sizeof(saddr)) < 0) | ||
28 | { | ||
29 | wl_logerr("Cannot bind socket: %s", strerror(errno)); | ||
30 | close(sock); | ||
31 | return -1; | ||
32 | } | ||
33 | |||
34 | return sock; | ||
35 | } | ||
36 | |||
37 | /* Send a string to commsock */ | ||
38 | int wl_send(const char *host, int port, const char *string, ...) | ||
39 | { | ||
40 | int sock; | ||
41 | char buffer[4096]; | ||
42 | struct sockaddr_in saddr; | ||
43 | va_list ap; | ||
44 | |||
45 | /* Generate string */ | ||
46 | memset(buffer, 0, sizeof(buffer)); | ||
47 | va_start(ap, string); | ||
48 | vsnprintf(buffer, sizeof(buffer)-1, string, ap); | ||
49 | va_end(ap); | ||
50 | |||
51 | saddr.sin_family = AF_INET; | ||
52 | saddr.sin_port = htons(port); | ||
53 | saddr.sin_addr.s_addr = inet_addr(host); | ||
54 | |||
55 | /* Setup socket */ | ||
56 | if((sock=socket(AF_INET, SOCK_DGRAM, 0)) < 0) | ||
57 | { | ||
58 | wl_logerr("Cannot set up socket: %s", strerror(errno)); | ||
59 | return -1; | ||
60 | } | ||
61 | |||
62 | if(sendto(sock, buffer, sizeof(buffer), 0, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) | ||
63 | { | ||
64 | wl_logerr("Cannot write to socket: %s", strerror(errno)); | ||
65 | close(sock); | ||
66 | return -1; | ||
67 | } | ||
68 | |||
69 | if(close(sock) < 0) | ||
70 | wl_logerr("Cannot close socket: %s", strerror(errno)); | ||
71 | |||
72 | return 0; | ||
73 | } | ||
74 | |||
75 | /* Check for new messages on commsock */ | ||
76 | int wl_recv(int *sock, char *out, int maxlen) | ||
77 | { | ||
78 | struct sockaddr_in *cliaddr; | ||
79 | socklen_t len=sizeof(struct sockaddr); | ||
80 | char retval[3]; | ||
81 | |||
82 | memset(out, 0, maxlen); | ||
83 | if(recvfrom(*sock, out, maxlen - 1, 0, (struct sockaddr *)cliaddr, &len) < 0) | ||
84 | return -1; | ||
85 | |||
86 | /* Get packet type and return it */ | ||
87 | memset(retval, 0, sizeof(retval)); | ||
88 | memcpy(retval, out, 2); | ||
89 | |||
90 | return atoi(retval); | ||
91 | } | ||