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 418 by douglas, 2005-03-02T22:36:24-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 >        api::Path config(Spectre2::prefix + "/etc/spectre.xml");
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 == "-D")
31 >                        Spectre2::debug = true;
32 >                else
33                  {
34 <                        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;
34 >                        api::Cerr << "Usage: " << Spectre2::program << " [-config=config] [-fork] [-D]" << ios::NewLine;
35  
36 <                                return 1;
42 <                        }
36 >                        return 1;
37                  }
38 +        }
39  
40 <                if (fork && api::Posix::CheckError(::fork())) return 0;
40 >        if (!config.Exists())
41 >        {
42 >                api::Cerr << Spectre2::program << ": configuration file " << config.GetPath() << " does not exist." << ios::NewLine;
43  
44 <                Spectre2(config, pid);
44 >                return 2;
45 >        }
46  
47 +        if (fork && api::Posix::CheckError(::fork()))
48                  return 0;
50        }
51 } spectre;
49  
50 < Spectre2::Spectre2(const ext::String& config, const ext::String& pid) : pid(pid)
50 >        Spectre2 spectre(config);
51 >
52 >        return 0;
53 > }
54 >
55 > extern "C"
56   {
57 +        void reload(int signal, ::siginfo_t* info, void* uap);
58 +        void stop(int signal, ::siginfo_t* info, void* uap);
59 + }
60 +
61 + Spectre2::Spectre2(const api::Path& config)
62 + {
63 +        {
64 +                _H<xml::Document> document(xml::Parse(config.GetPath()));
65 +
66 +                pid = *document/"spectre"/"pid";
67 +        }
68 +
69          {
70                  api::FileWriter out(pid);
71                  ios::FormatWriter fout(out);
# Line 61 | Line 75 | Spectre2::Spectre2(const ext::String& co
75  
76          Mounter mounter(config);
77          Unmounter unmounter(config);
78 <        Daemon* daemons[] = { static_cast<Daemon*>(&mounter), static_cast<Daemon*>(&unmounter) };
79 <        SignalHandler handler(daemons, sizeof (daemons) / sizeof (*daemons));
78 >
79 >        daemons.InsertLast(dynamic_cast<Daemon*>(&mounter));
80 >        daemons.InsertLast(dynamic_cast<Daemon*>(&unmounter));
81 >
82 >        {
83 >                struct ::sigaction action;
84 >
85 >                action.sa_sigaction = reload;
86 >                action.sa_flags = SA_SIGINFO;
87 >
88 >                api::Posix::CheckError(::sigemptyset(&action.sa_mask));
89 >                api::Posix::CheckError(::sigaction(SIGUSR1, &action, NULL));
90 >
91 >                action.sa_sigaction = stop;
92 >
93 >                api::Posix::CheckError(::sigaction(SIGTERM, &action, NULL));
94 >        }
95 >
96 >        _foreach (ext::Vector<Daemon*>, daemon, daemons) (*daemon)->start();
97 >        _foreach (ext::Vector<Daemon*>, daemon, daemons) (*daemon)->wait();
98   }
99  
100   Spectre2::~Spectre2()
# Line 70 | Line 102 | Spectre2::~Spectre2()
102          api::Posix::CheckError(::unlink(pid.NullTerminate()));
103   }
104  
105 < ext::String Spectre2::program(api::GetExecutablePath().GetName());
105 > ext::String Spectre2::program(api::GetExecutablePath().GetName()), Spectre2::prefix(_Spectre2_prefix_), Spectre2::root(_Spectre2_root_);
106   bool Spectre2::debug(false);
107 + ext::Vector<Daemon*> Spectre2::daemons;
108 +
109 + extern "C"
110 + {
111 +        void reload(int signal, ::siginfo_t* info, void* uap)
112 +        {
113 +                _foreach (ext::Vector<Daemon*>, daemon, Spectre2::daemons) (*daemon)->reload();
114 +        }
115 +
116 +        void stop(int signal, ::siginfo_t* info, void* uap)
117 +        {
118 +                _foreach (ext::Vector<Daemon*>, daemon, Spectre2::daemons) (*daemon)->stop();
119 +        }
120 + }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines