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 406 by douglas, 2004-12-30T22:08:35-08:00 vs.
Revision 418 by douglas, 2005-03-02T22:36:24-08:00

# Line 9 | Line 9
9   #include "Matcher/Matcher.hpp"
10  
11   #include <menes-api/exename.hpp>
12 < #include <menes-api/files.hpp>
13 < #include <menes-app/application.hpp>
12 > #include <menes-app/simple.hpp>
13  
15 extern "C"
16 {
14   #include <sys/types.h>
18 #include <unistd.h>
15   #include <signal.h>
20 }
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;
34 >                        api::Cerr << "Usage: " << Spectre2::program << " [-config=config] [-fork] [-D]" << ios::NewLine;
35  
36 <                        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;
40 <
41 <                                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;
49 <        }
50 < } spectre;
49 >
50 >        Spectre2 spectre(config);
51 >
52 >        return 0;
53 > }
54  
55   extern "C"
56   {
# Line 56 | Line 58 | extern "C"
58          void stop(int signal, ::siginfo_t* info, void* uap);
59   }
60  
61 < Spectre2::Spectre2(const ext::String& config, const ext::String& pid) : pid(pid)
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);
72  
# Line 78 | Line 86 | Spectre2::Spectre2(const ext::String& co
86                  action.sa_flags = SA_SIGINFO;
87  
88                  api::Posix::CheckError(::sigemptyset(&action.sa_mask));
89 <                api::Posix::CheckError(::sigaction(SIGHUP, &action, NULL));
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 <        _mforeach (ext::Vector<Daemon*>, daemon, daemons) (*daemon)->start();
96 >        _foreach (ext::Vector<Daemon*>, daemon, daemons) (*daemon)->start();
97 >        _foreach (ext::Vector<Daemon*>, daemon, daemons) (*daemon)->wait();
98   }
99  
100   Spectre2::~Spectre2()
# Line 93 | 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  
# Line 101 | Line 110 | extern "C"
110   {
111          void reload(int signal, ::siginfo_t* info, void* uap)
112          {
113 <                _mforeach (ext::Vector<Daemon*>, daemon, Spectre2::daemons) (*daemon)->reload();
113 >                _foreach (ext::Vector<Daemon*>, daemon, Spectre2::daemons) (*daemon)->reload();
114          }
115  
116          void stop(int signal, ::siginfo_t* info, void* uap)
117          {
118 <                _mforeach (ext::Vector<Daemon*>, daemon, Spectre2::daemons) (*daemon)->stop();
118 >                _foreach (ext::Vector<Daemon*>, daemon, Spectre2::daemons) (*daemon)->stop();
119          }
120   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines