diff options
author | miau <miaukatzemiau@priveasy.de> | 2011-12-05 20:46:56 (GMT) |
---|---|---|
committer | miau <miaukatzemiau@priveasy.de> | 2011-12-05 20:46:56 (GMT) |
commit | dcce1a8d1335e89dcf9d64bb2202e34d8f58f3cd (patch) | |
tree | 12d31d3fd80edb05be8c0b19883266bd4173a382 /broadcaster.c | |
parent | 7563a58379c27532fe7c086881d8b6c562d28ac1 (diff) |
remove OpenWRT-specific Makefile; move src/ to /
Diffstat (limited to 'broadcaster.c')
-rw-r--r-- | broadcaster.c | 65 |
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; +} |