summaryrefslogtreecommitdiff
path: root/noncore/net/wellenreiter/libwellenreiter/source/wl_sock.cc
Unidiff
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.cc91
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 */
11int 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 */
38int 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 */
76int 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}