ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/Spectre2/Spectre2.cpp
(Generate patch)

Comparing Spectre2/Spectre2.cpp (file contents):
Revision 402 by douglas, 2004-12-29T22:38:37-08:00 vs.
Revision 417 by douglas, 2005-03-02T14:49:53-08:00

# Line 4 | Line 4
4   //
5   // $Id$
6  
7 #include "SignalHandler.hpp"
7   #include "Mounter.hpp"
8   #include "Unmounter.hpp"
9   #include "Matcher/Matcher.hpp"
10  
11   #include <menes-api/exename.hpp>
12 < #include <menes-api/files.hpp>
14 < #include <menes-app/application.hpp>
12 > #include <menes-app/simple.hpp>
13  
16 extern "C"
17 {
14   #include <sys/types.h>
15 < #include <unistd.h>
20 < }
15 > #include <signal.h>
16  
17 < struct Spectre2Command : public app::Application
17 > int Main(const app::Options& options)
18   {
19 <        virtual int Run(const app::ArgumentList& args)
19 >        ext::String config("spectre.xml"), pid("spectre.pid");
20 >        bool fork(false);
21 >
22 >        _foreach (const app::ArgumentList, arg, app::GetArguments())
23          {
24 <                ext::String config("spectre.xml"), pid("spectre.pid");
27 <                bool fork(false);
24 >                Matcher matcher;
25  
26 <                _foreach (app::ArgumentList, arg, args)
26 >                if (*arg == matcher("^-config=(.*)$"))
27 >                        config = matcher[1];
28 >                else if (*arg == "-fork")
29 >                        fork = true;
30 >                else if (*arg == matcher("^-pid=(.*)$"))
31 >                        pid = matcher[1];
32 >                else if (*arg == "-D")
33 >                        Spectre2::debug = true;
34 >                else
35                  {
36 <                        Matcher matcher;
32 <
33 <                        if (*arg == matcher("^-config=(.*)$")) config = matcher[1];
34 <                        else if (*arg == "-fork") fork = true;
35 <                        else if (*arg == matcher("^-pid=(.*)$")) pid = matcher[1];
36 <                        else if (*arg == "-D") Spectre2::debug = true;
37 <                        else
38 <                        {
39 <                                api::Cerr << "Usage: " << Spectre2::program << " [-config=config] [-fork] [-pid=pid] [-D]" << ios::NewLine;
36 >                        api::Cerr << "Usage: " << Spectre2::program << " [-config=config] [-fork] [-pid=pid] [-D]" << ios::NewLine;
37  
38 <                                return 1;
42 <                        }
38 >                        return 1;
39                  }
40 +        }
41  
42 <                if (fork && api::Posix::CheckError(::fork())) return 0;
42 >        if (fork && api::Posix::CheckError(::fork()))
43 >                return 0;
44  
45 <                Spectre2(config, pid);
45 >        api::Cerr << "Here!" << ios::NewLine;
46  
47 <                return 0;
48 <        }
49 < } spectre;
47 >        Spectre2(config, pid);
48 >
49 >        return 0;
50 > }
51 >
52 > extern "C"
53 > {
54 >        void reload(int signal, ::siginfo_t* info, void* uap);
55 >        void stop(int signal, ::siginfo_t* info, void* uap);
56 > }
57  
58   Spectre2::Spectre2(const ext::String& config, const ext::String& pid) : pid(pid)
59   {
# Line 61 | Line 66 | Spectre2::Spectre2(const ext::String& co
66  
67          Mounter mounter(config);
68          Unmounter unmounter(config);
69 <        Daemon* daemons[] = { static_cast<Daemon*>(&mounter), static_cast<Daemon*>(&unmounter) };
70 <        SignalHandler handler(daemons, sizeof (daemons) / sizeof (*daemons));
69 >
70 >        daemons.InsertLast(dynamic_cast<Daemon*>(&mounter));
71 >        daemons.InsertLast(dynamic_cast<Daemon*>(&unmounter));
72 >
73 >        {
74 >                struct ::sigaction action;
75 >
76 >                action.sa_sigaction = reload;
77 >                action.sa_flags = SA_SIGINFO;
78 >
79 >                api::Posix::CheckError(::sigemptyset(&action.sa_mask));
80 >                api::Posix::CheckError(::sigaction(SIGUSR1, &action, NULL));
81 >
82 >                action.sa_sigaction = stop;
83 >
84 >                api::Posix::CheckError(::sigaction(SIGTERM, &action, NULL));
85 >        }
86 >
87 >        _foreach (ext::Vector<Daemon*>, daemon, daemons) (*daemon)->start();
88 >        _foreach (ext::Vector<Daemon*>, daemon, daemons) (*daemon)->wait();
89   }
90  
91   Spectre2::~Spectre2()
# Line 70 | Line 93 | Spectre2::~Spectre2()
93          api::Posix::CheckError(::unlink(pid.NullTerminate()));
94   }
95  
96 < ext::String Spectre2::program(api::GetExecutablePath().GetName());
96 > ext::String Spectre2::program(api::GetExecutablePath().GetName()), Spectre2::prefix(_Spectre2_prefix_), Spectre2::root(_Spectre2_root_);
97   bool Spectre2::debug(false);
98 + ext::Vector<Daemon*> Spectre2::daemons;
99 +
100 + extern "C"
101 + {
102 +        void reload(int signal, ::siginfo_t* info, void* uap)
103 +        {
104 +                _foreach (ext::Vector<Daemon*>, daemon, Spectre2::daemons) (*daemon)->reload();
105 +        }
106 +
107 +        void stop(int signal, ::siginfo_t* info, void* uap)
108 +        {
109 +                _foreach (ext::Vector<Daemon*>, daemon, Spectre2::daemons) (*daemon)->stop();
110 +        }
111 + }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines