summaryrefslogtreecommitdiffstats
path: root/src/dabOutput/dabOutputUdp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/dabOutput/dabOutputUdp.cpp')
-rw-r--r--src/dabOutput/dabOutputUdp.cpp82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/dabOutput/dabOutputUdp.cpp b/src/dabOutput/dabOutputUdp.cpp
new file mode 100644
index 0000000..1410071
--- /dev/null
+++ b/src/dabOutput/dabOutputUdp.cpp
@@ -0,0 +1,82 @@
+#include <cstring>
+#include <cstdio>
+#include <limits.h>
+#include "dabOutput.h"
+#include "UdpSocket.h"
+
+#ifdef _WIN32
+# include <fscfg.h>
+# include <sdci.h>
+#else
+# include <netinet/in.h>
+# include <sys/types.h>
+# include <sys/socket.h>
+# include <sys/ioctl.h>
+# include <linux/if_packet.h>
+# include <linux/netdevice.h>
+# include <net/if_arp.h>
+#endif
+
+int DabOutputUdp::Open(const char* name)
+{
+ // we are going to modify it
+ char* hostport = strdup(name); // the name is actually an tuple host:port
+
+ char* address;
+ long port;
+ address = strchr(hostport, ':');
+ if (address == NULL) {
+ etiLog.printHeader(TcpLog::ERR,
+ "\"%s\" is an invalid format for UDP address: "
+ "should be [address]:port - > aborting\n",
+ hostport);
+ goto udp_open_fail;
+ }
+
+ // terminate string hostport after the host, and advance address to the port number
+ *(address++) = 0;
+
+ port = strtol(address, (char **)NULL, 10);
+ if ((port == LONG_MIN) || (port == LONG_MAX)) {
+ etiLog.printHeader(TcpLog::ERR,
+ "can't convert port number in UDP address %s\n", address);
+ goto udp_open_fail;
+ }
+ if (port == 0) {
+ etiLog.printHeader(TcpLog::ERR,
+ "can't use port number 0 in UDP address\n");
+ goto udp_open_fail;
+ }
+ address = hostport;
+ if (strlen(address) > 0) {
+ if (this->packet_->getAddress().setAddress(address) == -1) {
+ etiLog.printHeader(TcpLog::ERR, "can't set address %s (%s: %s) "
+ "-> aborting\n", address, inetErrDesc, inetErrMsg);
+ goto udp_open_fail;
+ }
+ }
+ this->packet_->getAddress().setPort(port);
+
+ if (this->socket_->create() == -1) {
+ etiLog.printHeader(TcpLog::ERR, "can't create UDP socket (%s: %s) "
+ "-> aborting\n)", inetErrDesc, inetErrMsg);
+ goto udp_open_fail;
+ }
+
+ //sprintf(hostport, "%s:%i", this->packet_->getAddress().getHostAddress(),
+ // this->packet_->getAddress().getPort());
+ return 0;
+
+udp_open_fail:
+ // strdup forces us to free
+ free(hostport);
+ return -1;
+}
+
+
+int DabOutputUdp::Write(void* buffer, int size)
+{
+ this->packet_->setLength(0);
+ this->packet_->addData(buffer, size);
+ return this->socket_->send(*this->packet_);
+}