0,0 → 1,68 |
/****************************************************************** |
* rebootd. Copyleft 2005 Anatoli Klassen |
******************************************************************/ |
|
#include <string.h> |
#include <errno.h> |
#include <unistd.h> |
#include <syslog.h> |
#include <sys/socket.h> |
#include <netinet/in.h> |
#include <arpa/inet.h> |
|
#include "common.h" |
#include "rebootd.h" |
#include "network.h" |
|
int establish(const struct config *cfg) |
{ |
int s; |
struct sockaddr_in sa; |
|
memset(&sa, 0, sizeof(struct sockaddr_in)); |
|
sa.sin_family = AF_INET; |
sa.sin_port = htons(cfg->port); |
sa.sin_addr.s_addr = (cfg->interface.s_addr ? cfg->interface.s_addr : INADDR_ANY); |
|
if((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) |
return -1; |
|
if(bind(s, (struct sockaddr *)&sa, sizeof(struct sockaddr_in)) < 0) { |
close(s); |
return -1; |
} |
|
return s; |
} |
|
void listen_socket(const struct config *cfg, int soc) |
{ |
char buf[BUFSIZE]; |
int br; |
struct sockaddr_storage ss; |
socklen_t ss_size; |
|
for(;;) { |
ss_size = sizeof(ss); |
br = recvfrom(soc, buf, sizeof(buf)-1, 0, (struct sockaddr *)&ss, &ss_size); |
|
if(br < 0) { |
if(errno == EINTR) { |
if(reconfig_required || quit_required) break; |
} |
else { |
syslog(LOG_INFO, "cannot receive: %s", strerror(errno)); |
} |
|
continue; |
} |
|
buf[br] = '\0'; |
sleep(1); |
syslog(LOG_INFO, "got command"); |
|
handle_command(cfg, buf, sizeof(buf)); |
} |
} |
|