#include <arpa/telnet.h> #include <ctype.h> #include <fcntl.h> #include <netdb.h> #include <netinet/in.h> #include "signal.h" #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <syslog.h> #include <sys/wait.h> #include <sys/time.h> #include <sys/resource.h> #include <sys/socket.h> #include <unistd.h> #include "machine.h" void delay ( void ); void update ( void ); char read_buffer [ 160 ]; int read_pntr = 0; int idle = 0; int input; int output; int main( int, char **argv ) { signal( SIGPIPE, SIG_IGN ); input = atoi( argv[1] ); output = atoi( argv[2] ); fprintf( stderr, "[Daemon] Starting\n" ); fcntl( input, F_SETFL, O_NDELAY ); for( ; ; ) { delay( ); update( ); } return 0; } void delay( ) { struct timeval time; time.tv_usec = 100000; time.tv_sec = 0; if( select( 0, NULL, NULL, NULL, &time ) < 0 ) { fprintf( stderr, "[BUG] Delay: error in select.\n" ); exit( 1 ); } return; } void update( ) { char buf [ 80 ]; int addr; struct hostent* from; int nRead; int i; #define sa int( sizeof( struct in_addr ) ) if( read_pntr < sa && ( nRead = read( input, &read_buffer[read_pntr], 10 ) ) > 0 ) read_pntr += nRead; if( read_pntr < sa ) { if( ++idle > 10000 ) { if( write( output, "Alive?", 7 ) < 0 ) { fprintf( stderr, "[Daemon] Exiting\n" ); exit( 1 ); } idle = 0; } return; } memcpy( &addr, read_buffer, sizeof( int ) ); addr = ntohl( addr ); sprintf( buf, "%d.%d.%d.%d", ( addr >> 24 ) & 0xFF, ( addr >> 16 ) & 0xFF, ( addr >> 8 ) & 0xFF, ( addr ) & 0xFF ); from = gethostbyaddr( read_buffer, sa, AF_INET ); if( from != NULL ) write( output, from->h_name, 1+strlen( from->h_name ) ); else write( output, buf, 1+strlen( buf ) ); for( i = sa; i < read_pntr; i++ ) read_buffer[i-sa] = read_buffer[i]; read_pntr -= sa; #undef sa return; }