Emacs/cc-ide: More robust function movement
[mediaserv.git] / main.cc
1 // $Id$
2 //
3 // Copyright (C) 2006 
4
5 // TODO: open log-file as non-root
6 // TODO: open socket as root ?
7 // TODO: so best should be: start mediaserv as root and then drop privileges
8 // TODO: mime-db
9
10 // Definition of non-inline non-template functions
11
12 //#include "main.hh"
13 //#include "main.ih"
14
15 // Custom includes
16 #include <unistd.h>
17 #include <sys/types.h>
18 #include <pwd.h>
19 #include <grp.h>
20
21 #include <iostream>
22
23 #include "Utils/Exception.hh"
24 #include "Utils/DaemonTools.hh"
25 #include "Server/HTTPLogger.hh"
26 #include "Server/SimpleHTTPServer.hh"
27 #include "Socket/Protocols/INet/TCPSocketHandle.hh"
28
29 //#include "main.mpp"
30 #define prefix_
31 ///////////////////////////////cc.p////////////////////////////////////////
32
33 #define THROW_SYSERR(cmd,e) if (e) throw senf::SystemException(#cmd,errno)
34
35 int main(int argc, char** argv)
36 {
37     try {
38         struct ::passwd * pw = getpwnam("media"); THROW_SYSERR( getpwnam, !pw );
39         struct ::group * gr = getgrnam("media"); THROW_SYSERR( getgrnam, !gr );
40         THROW_SYSERR( setegid,::setegid(gr->gr_gid) < 0 );
41         THROW_SYSERR( seteuid, ::seteuid(pw->pw_uid) < 0 );
42         g0dil::mediaserv::HTTPLogger logger ("log/access.log");
43         THROW_SYSERR( seteuid, ::seteuid(0) < 0 );
44         THROW_SYSERR( setegid, ::setegid(0) );
45         try {
46             // We have to make sure not to access any sytem files after the chroot
47             // (initgroups accesses /etc/group, redirect_stdio accesses /dev/null)
48             senf::redirect_stdio();
49             THROW_SYSERR( initgroups, ::initgroups("media",gr->gr_gid) < 0 );
50             THROW_SYSERR( chdir, chdir("wwwroot") < 0 );
51             THROW_SYSERR( chroot, chroot(".") < 0 );
52             senf::TCPv4ServerSocketHandle socket (argv[1]);
53             THROW_SYSERR( setregid, ::setregid(gr->gr_gid,gr->gr_gid) < 0 );
54             THROW_SYSERR( setreuid, ::setreuid(pw->pw_uid,pw->pw_uid) < 0 );
55             senf::daemonize();
56             socket.blocking(false);
57             socket.protocol().reuseaddr(true);
58             g0dil::mediaserv::SimpleHTTPServer server (socket,logger);
59             
60             senf::Scheduler::instance().process();
61         }
62         catch (std::exception const & ex) {
63             logger.failedRequest(ex.what());
64         }
65     }
66     catch (std::exception const & ex) {
67         std::cerr << ex.what() << "\n";
68         exit(1);
69     }
70     return 0;
71 }
72
73 ///////////////////////////////cc.e////////////////////////////////////////
74 #undef prefix_
75 //#include "main.mpp"
76
77 \f
78 // Local Variables:
79 // mode: c++
80 // End: