Store username in Session.
[dftpd.git] / Listener.cpp
blob03858d1fedefa28e4421fed3cac94a268f8aef4a
1 #include <iostream>
2 #include <string.h>
3 #include <unistd.h>
4 #include <errno.h>
5 #include <netdb.h>
6 #include <fcntl.h>
7 #include <sys/types.h>
8 #include <sys/socket.h>
9 #include <netinet/in.h>
10 #include <arpa/inet.h>
11 #include "Listener.hpp"
12 #include "Server.hpp"
14 Listener::Listener()
15 : m_sock( 0 )
17 // Discover machine's IP address
18 char buf[128];
19 gethostname( buf, 128 );
21 hostent* h;
22 if( ( h = gethostbyname( buf ) ) == (void*)-1 )
24 throw strerror( errno );
26 m_ipaddr = inet_ntoa( *((in_addr*)h->h_addr) );
29 Listener::~Listener()
31 if( m_sock != 0 )
33 std::cout << "[Listener] Closing socket" << std::endl;
34 close( m_sock );
38 void Listener::Listen()
40 std::cout << "[Listener] Opening socket" << std::endl;
42 if( ( m_sock = socket( PF_INET, SOCK_STREAM, 0 ) ) == -1 )
44 throw strerror( errno );
47 // Set socket to non-blocking
48 if( fcntl( m_sock, F_SETFL, O_NONBLOCK ) == -1 )
50 throw strerror( errno );
53 // Reuse port
54 int yes = 1;
55 if( setsockopt( m_sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof( int ) ) == -1 )
57 throw strerror( errno );
60 sockaddr_in addr;
61 addr.sin_family = AF_INET;
62 addr.sin_port = htons( 21 );
63 addr.sin_addr.s_addr = inet_addr( m_ipaddr.c_str() );
64 memset( addr.sin_zero, 0, sizeof( addr.sin_zero ) );
66 if( bind( m_sock, (sockaddr*)&addr, sizeof( addr ) ) == -1 )
68 throw strerror( errno );
71 if( listen( m_sock, 5 ) == -1 )
73 throw strerror( errno );
77 void Listener::Tick()
79 // Check if there are some incoming connections
80 sockaddr_in addr;
81 socklen_t size = sizeof( addr );
83 int incoming = accept( m_sock, (sockaddr*)&addr, &size );
84 if( incoming == -1 )
86 if( errno == EAGAIN )
88 // No error, just no connections in queue
89 return;
91 throw strerror( errno );
94 ServerPtr server = m_server.lock();
95 if( !server )
97 throw "Listener lost server";
99 server->IncomingConnection( incoming );