From 94b29432f28503be80a69fca09e54be7401a69be Mon Sep 17 00:00:00 2001 From: Benjamin Franzke Date: Tue, 12 Mar 2013 08:58:46 +0100 Subject: Add econfind which searches a beamer given a broadcast address --- .gitignore | 1 + Makefile | 4 +-- econfind.c | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 econfind.c diff --git a/.gitignore b/.gitignore index cf43a84..b6ee327 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ econproxy econserv +econfind diff --git a/Makefile b/Makefile index 48a76f2..0fb42f2 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,9 @@ CFLAGS=-std=gnu99 -ggdb -Wall -Wstrict-prototypes -Wmissing-prototypes -Wunused-result -Wextra -pedantic -all: econproxy econserv +all: econproxy econserv econfind %: %.c util.c util.h econproto.h econpacket.h gcc $(CFLAGS) -o $@ $< util.c econpacket.c clean: - rm -f econproxy econserv + rm -f econproxy econserv econfind diff --git a/econfind.c b/econfind.c new file mode 100644 index 0000000..b784404 --- /dev/null +++ b/econfind.c @@ -0,0 +1,108 @@ +/* + * Copyright © 2013 Benjamin Franzke + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "util.h" +#include "econproto.h" +#include "econpacket.h" + +static int +connect_broadcast(const char *addr, int port) +{ + int fd, ret; + struct sockaddr_in s; + int broadcast_enable = 1; + + memset(&s, 0, sizeof s); + s.sin_family = AF_INET; + s.sin_port = htons(port); + s.sin_addr.s_addr = inet_addr(addr); + + fd = socket(AF_INET, SOCK_DGRAM, 0); + if (fd == -1) + return -1; + ret = setsockopt(fd, SOL_SOCKET, SO_BROADCAST, + &broadcast_enable, sizeof(broadcast_enable)); + if (ret < 0) + exit(EXIT_FAILURE); + + + if (connect(fd, (struct sockaddr *) &s, sizeof s) < 0) { + fprintf(stderr, "Failed to connect: %s\n", strerror(errno)); + close(fd); + return -1; + } + + return fd; +} + +int +main(int argc, char *argv[]) +{ + int cfd, sfd; + struct econ_packet pkt; + struct in_addr in; + const char *ip; + + if (argc < 2) + exit(EXIT_FAILURE); + + + cfd = connect_broadcast(argv[1], ECON_PORTNUMBER); + if (cfd < 0) + exit(EXIT_FAILURE); + + in.s_addr = sock_get_ipv4_addr(cfd); + ip = inet_ntoa(in); + fprintf(stderr, "own ip: %s\n", inet_ntoa(in)); + sfd = bind_socket(SOCK_DGRAM, ip, STR(ECON_PORTNUMBER)); + + epkt_init(&pkt, E_CMD_EASYSEARCH); + if (epkt_send(cfd, &pkt) < 0) + exit(EXIT_FAILURE); + + if (epkt_read(sfd, &pkt) < 0) + exit(EXIT_FAILURE); + + if (pkt.hdr.commandID == E_CMD_CLIENTINFO) { + struct in_addr beamer; + + beamer.s_addr = *(uint32_t*)pkt.hdr.IPaddress; + printf("%s", inet_ntoa(beamer)); + if (pkt.hdr.datasize > 0) { + char *name = pkt.cmd.command.clientinfo.projName; + int state = pkt.cmd.command.clientinfo.projState; + + name[ECON_PROJNAME_MAXLEN-1] = '\0'; + printf(" - %s: %s", name, + state == E_PSTAT_NOUSE ? "no use" : "in use"); + } + printf("\n"); + } + + return 0; +} + -- cgit