From 635965049bfd8172adae73557c17cd19f6ea5964 Mon Sep 17 00:00:00 2001 From: miau Date: Mon, 11 Jul 2011 13:24:52 +0200 Subject: corrected OpenWRT makefile builds now when placed in backfire/package untested if used with feeds diff --git a/Makefile b/Makefile index bcc7075..2e163a0 100644 --- a/Makefile +++ b/Makefile @@ -4,12 +4,6 @@ PKG_NAME:=udp-broadcast PKG_VERSION:=1.0.0 PKG_RELEASE:=1 -PKG_BUILD_DIR:=$(BUILD_DIR)/udp-broadcast-$(PKG_VERSION) -PKG_SOURCE:=udp-broadcast-$(PKG_VERSION).tar.gz -PKG_SOURCE_URL:=@SF/udp-broadcast -PKG_MD5SUM:=9b7dc52656f5cbec846a7ba3299f73bd -PKG_CAT:=zcat - include $(INCLUDE_DIR)/package.mk define Package/udp-broadcast @@ -17,20 +11,32 @@ define Package/udp-broadcast CATEGORY:=Network DEFAULT:=n TITLE:=UDP broadcast utility - DESCRIPTION:=UDP broadcast utility\\\ - send and recive udp broadcast\\\ - form a larger network. URL:=http://www.freifunk-jena.de/ endef +define Package/udp-broadcast/description + Send udp based broadcast messages and process them using the included demon. +endef + +define Build/Prepare + mkdir -p $(PKG_BUILD_DIR) + $(CP) ./src/* $(PKG_BUILD_DIR)/ +endef + define Build/Configure - $(call Build/Configure/Default,--with-linux-headers=$(LINUX_DIR)) endef -define Package/bridge/install - $(INSTALL_DIR) $(1)/usr/sbin - $(INSTALL_BIN) $(PKG_BUILD_DIR)/broadcast $(1)/usr/sbin/ - $(INSTALL_BIN) $(PKG_BUILD_DIR)/listener $(1)/usr/sbin/ +define Build/Compile + $(MAKE) -C $(PKG_BUILD_DIR) \ + CC="$(TARGET_CC)" \ + CFLAGS="$(TARGET_CFLAGS) -Wall" \ + LDFLAGS="$(TARGET_LDFLAGS)" +endef + +define Package/udp-broadcast/install + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/broadcaster $(1)/usr/sbin/ + $(INSTALL_BIN) $(PKG_BUILD_DIR)/listener $(1)/usr/sbin/ endef $(eval $(call BuildPackage,udp-broadcast)) diff --git a/broadcaster.c b/broadcaster.c deleted file mode 100644 index 9c02f79..0000000 --- a/broadcaster.c +++ /dev/null @@ -1,74 +0,0 @@ -/* -** broadcaster.c -- a datagram "client" like talker.c, except -** this one can broadcast -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "common.h" - -int main(int argc, char *argv[]) -{ - int sockfd; - struct sockaddr_in their_addr; // connector's address information - struct hostent *he; - int numbytes; - int broadcast = 1; - - // assemble packet - if (argc < 3 || argc > 4) { - fprintf(stderr,"usage: broadcaster hostname task [message]\n"); - exit(1); - } - char buf[MAXBUFLEN], - *task = argv[2], - *message = (argc == 4) ? argv[3] : NULL; - int task_len = strlen(task), - total_len = task_len + 1 + strlen(message); - if (total_len > MAXBUFLEN) { - fprintf(stderr,"payload to long: max %d bytes, was %d\n", MAXBUFLEN, total_len); - exit(1); - } - strcpy(buf, task); - buf[task_len] = 0; - strcpy(buf + 1 + task_len, message); - - if ((he=gethostbyname(argv[1])) == NULL) { // get the host info - perror("gethostbyname"); - exit(1); - } - - if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { - perror("socket"); - exit(1); - } - - // this call is what allows broadcast packets to be sent: - if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast, - sizeof broadcast) == -1) { - perror("setsockopt (SO_BROADCAST)"); - exit(1); - } - - their_addr.sin_family = AF_INET; // host byte order - their_addr.sin_port = htons(SERVERPORT); // short, network byte order - their_addr.sin_addr = *((struct in_addr *)he->h_addr); - memset(their_addr.sin_zero, '\0', sizeof their_addr.sin_zero); - - if ((numbytes=sendto(sockfd, buf, total_len, 0, - (struct sockaddr *)&their_addr, sizeof their_addr)) == -1) { - perror("sendto"); - exit(1); - } - - return 0; -} diff --git a/common.h b/common.h deleted file mode 100644 index c64c764..0000000 --- a/common.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef UDP_BROADCAST_COMMON -#define UDP_BROADCAST_COMMON - -#define SERVERPORT 4950 // the port users will be connecting to -#define SERVERPORT_S "4950" -#define MAXBUFLEN 100 - -#endif // UDP_BROADCAST_COMMON diff --git a/listener.c b/listener.c deleted file mode 100644 index c0d81ef..0000000 --- a/listener.c +++ /dev/null @@ -1,119 +0,0 @@ -/* -** listener.c -- a datagram sockets "server" demo -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "common.h" - -// get sockaddr, IPv4 or IPv6: -void *get_in_addr(struct sockaddr *sa) -{ - if (sa->sa_family == AF_INET) { - return &(((struct sockaddr_in*)sa)->sin_addr); - } - - return &(((struct sockaddr_in6*)sa)->sin6_addr); -} - -int main(int argc, char *argv[], char *envp[]) -{ - int sockfd; - struct addrinfo hints, *servinfo, *p; - int rv; - int numbytes; - struct sockaddr_storage their_addr; - char buf[MAXBUFLEN]; - socklen_t addr_len; - char s[INET6_ADDRSTRLEN]; - - memset(&hints, 0, sizeof hints); - hints.ai_family = AF_UNSPEC; // set to AF_INET to force IPv4 - hints.ai_socktype = SOCK_DGRAM; - hints.ai_flags = AI_PASSIVE; // use my IP - - if ((rv = getaddrinfo(NULL, SERVERPORT_S, &hints, &servinfo)) != 0) { - fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); - return 1; - } - - // loop through all the results and bind to the first we can - for(p = servinfo; p != NULL; p = p->ai_next) { - if ((sockfd = socket(p->ai_family, p->ai_socktype, - p->ai_protocol)) == -1) { - perror("listener: socket"); - continue; - } - - if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) { - close(sockfd); - perror("listener: bind"); - continue; - } - - break; - } - - if (p == NULL) { - fprintf(stderr, "listener: failed to bind socket\n"); - return 2; - } - - freeaddrinfo(servinfo); - - // daemonize -#ifndef DEBUG - switch (fork()) { - case 0: - setsid(); - umask(0); - break; - case -1: - perror("fork (serious!)"); - exit(-1); - default: - exit(0); - } -#endif - - // receive loop - addr_len = sizeof their_addr; - while ((numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0, - (struct sockaddr *)&their_addr, &addr_len)) != -1) { - // decode packet & launch handler - buf[numbytes] = '\0'; - char *task = buf, - *cl_argv[3] = {task, (strlen(task) +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" + +int main(int argc, char *argv[]) +{ + int sockfd; + struct sockaddr_in their_addr; // connector's address information + struct hostent *he; + int numbytes; + int broadcast = 1; + + // assemble packet + if (argc < 3 || argc > 4) { + fprintf(stderr,"usage: broadcaster hostname task [message]\n"); + exit(1); + } + char buf[MAXBUFLEN], + *task = argv[2], + *message = (argc == 4) ? argv[3] : NULL; + int task_len = strlen(task), + total_len = task_len + 1 + strlen(message); + if (total_len > MAXBUFLEN) { + fprintf(stderr,"payload to long: max %d bytes, was %d\n", MAXBUFLEN, total_len); + exit(1); + } + strcpy(buf, task); + buf[task_len] = 0; + strcpy(buf + 1 + task_len, message); + + if ((he=gethostbyname(argv[1])) == NULL) { // get the host info + perror("gethostbyname"); + exit(1); + } + + if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { + perror("socket"); + exit(1); + } + + // this call is what allows broadcast packets to be sent: + if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast, + sizeof broadcast) == -1) { + perror("setsockopt (SO_BROADCAST)"); + exit(1); + } + + their_addr.sin_family = AF_INET; // host byte order + their_addr.sin_port = htons(SERVERPORT); // short, network byte order + their_addr.sin_addr = *((struct in_addr *)he->h_addr); + memset(their_addr.sin_zero, '\0', sizeof their_addr.sin_zero); + + if ((numbytes=sendto(sockfd, buf, total_len, 0, + (struct sockaddr *)&their_addr, sizeof their_addr)) == -1) { + perror("sendto"); + exit(1); + } + + return 0; +} diff --git a/src/common.h b/src/common.h new file mode 100644 index 0000000..c64c764 --- /dev/null +++ b/src/common.h @@ -0,0 +1,8 @@ +#ifndef UDP_BROADCAST_COMMON +#define UDP_BROADCAST_COMMON + +#define SERVERPORT 4950 // the port users will be connecting to +#define SERVERPORT_S "4950" +#define MAXBUFLEN 100 + +#endif // UDP_BROADCAST_COMMON diff --git a/src/listener.c b/src/listener.c new file mode 100644 index 0000000..c0d81ef --- /dev/null +++ b/src/listener.c @@ -0,0 +1,119 @@ +/* +** listener.c -- a datagram sockets "server" demo +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" + +// get sockaddr, IPv4 or IPv6: +void *get_in_addr(struct sockaddr *sa) +{ + if (sa->sa_family == AF_INET) { + return &(((struct sockaddr_in*)sa)->sin_addr); + } + + return &(((struct sockaddr_in6*)sa)->sin6_addr); +} + +int main(int argc, char *argv[], char *envp[]) +{ + int sockfd; + struct addrinfo hints, *servinfo, *p; + int rv; + int numbytes; + struct sockaddr_storage their_addr; + char buf[MAXBUFLEN]; + socklen_t addr_len; + char s[INET6_ADDRSTRLEN]; + + memset(&hints, 0, sizeof hints); + hints.ai_family = AF_UNSPEC; // set to AF_INET to force IPv4 + hints.ai_socktype = SOCK_DGRAM; + hints.ai_flags = AI_PASSIVE; // use my IP + + if ((rv = getaddrinfo(NULL, SERVERPORT_S, &hints, &servinfo)) != 0) { + fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); + return 1; + } + + // loop through all the results and bind to the first we can + for(p = servinfo; p != NULL; p = p->ai_next) { + if ((sockfd = socket(p->ai_family, p->ai_socktype, + p->ai_protocol)) == -1) { + perror("listener: socket"); + continue; + } + + if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) { + close(sockfd); + perror("listener: bind"); + continue; + } + + break; + } + + if (p == NULL) { + fprintf(stderr, "listener: failed to bind socket\n"); + return 2; + } + + freeaddrinfo(servinfo); + + // daemonize +#ifndef DEBUG + switch (fork()) { + case 0: + setsid(); + umask(0); + break; + case -1: + perror("fork (serious!)"); + exit(-1); + default: + exit(0); + } +#endif + + // receive loop + addr_len = sizeof their_addr; + while ((numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0, + (struct sockaddr *)&their_addr, &addr_len)) != -1) { + // decode packet & launch handler + buf[numbytes] = '\0'; + char *task = buf, + *cl_argv[3] = {task, (strlen(task)