summaryrefslogtreecommitdiff
path: root/broadcaster.c
diff options
context:
space:
mode:
authormiau <miaukatzemiau@priveasy.de>2011-12-05 20:46:56 (GMT)
committermiau <miaukatzemiau@priveasy.de>2011-12-05 20:46:56 (GMT)
commitdcce1a8d1335e89dcf9d64bb2202e34d8f58f3cd (patch)
tree12d31d3fd80edb05be8c0b19883266bd4173a382 /broadcaster.c
parent7563a58379c27532fe7c086881d8b6c562d28ac1 (diff)
remove OpenWRT-specific Makefile; move src/ to /
Diffstat (limited to 'broadcaster.c')
-rw-r--r--broadcaster.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/broadcaster.c b/broadcaster.c
new file mode 100644
index 0000000..66d6b58
--- /dev/null
+++ b/broadcaster.c
@@ -0,0 +1,65 @@
+/*
+** broadcaster.c -- a datagram "client" like talker.c, except
+** this one can broadcast
+*/
+
+#include "common.h"
+
+int main(int argc, char **argv)
+{
+ int fd;
+ struct sockaddr_in6 addr;
+ int broadcast = 1;
+
+ /* assemble packet, parse cmd line */
+ if (argc < 3 || argc > 4) {
+ fprintf(stderr, "usage: %s interface task [message|-]\n", argv[0]);
+ exit(1);
+ }
+ char buf[MAXBUFLEN],
+ *task = argv[2],
+ *message = (argc == 4) ? argv[3] : "";
+ int task_len = strlen(task),
+ total_len = task_len + 1;
+ strcpy(buf, task);
+ buf[task_len] = 0;
+ if (strcmp(message, "-") == 0) {
+ /* read payload from stdin */
+ int i;
+ while ((MAXBUFLEN - total_len - 1 > 0)
+ && ((i = read(0, &(buf[total_len]), MAXBUFLEN - total_len - 1)) > 0))
+ total_len += i;
+ ENP(i, "read(stdin)");
+ if (read(0, &i, 1) != 0) {
+ fprintf(stderr, "payload to long: max %d bytes\n", MAXBUFLEN - 1);
+ exit(1);
+ }
+ }else{
+ /* use cmd line for payload */
+ total_len += strlen(message);
+ if (total_len <= MAXBUFLEN)
+ strcpy(buf + 1 + task_len, message);
+ }
+ if (total_len > MAXBUFLEN) {
+ fprintf(stderr,"payload to long: max %d bytes, was %d\n",
+ MAXBUFLEN - 1, total_len);
+ exit(1);
+ }
+
+ /* setup socket */
+ ENP((fd = socket(AF_INET6, SOCK_DGRAM, 0)), "socket");
+ addr.sin6_family = AF_INET6;
+ addr.sin6_port = htons(SERVERPORT);
+ addr.sin6_flowinfo = 0;
+ inet_pton(AF_INET6, "ff02::1", &(addr.sin6_addr));
+ if ((addr.sin6_scope_id = if_nametoindex(argv[1])) == 0) {
+ fprintf(stderr, "interface not found\n");
+ exit(1);
+ }
+
+ /* send packet */
+ ENP(sendto(fd, buf, total_len, 0, (struct sockaddr *) &addr, sizeof addr),
+ "sendto");
+
+ return 0;
+}
contact: Jan Huwald // Impressum