Subversion Repositories general

Compare Revisions

Ignore whitespace Rev 1186 → Rev 1187

/rebootd/trunk/src/network.c
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));
}
}