ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/Spectre2/Spectre2.cpp
Revision: 418
Committed: 2005-03-02T22:36:24-08:00 (20 years, 3 months ago) by douglas
File size: 2593 byte(s)
Log Message:
Um, yeah.

File Contents

# Content
1 // Spectre 2
2 //
3 // Douglas Thrift
4 //
5 // $Id$
6
7 #include "Mounter.hpp"
8 #include "Unmounter.hpp"
9 #include "Matcher/Matcher.hpp"
10
11 #include <menes-api/exename.hpp>
12 #include <menes-app/simple.hpp>
13
14 #include <sys/types.h>
15 #include <signal.h>
16
17 int Main(const app::Options& options)
18 {
19 api::Path config(Spectre2::prefix + "/etc/spectre.xml");
20 bool fork(false);
21
22 _foreach (const app::ArgumentList, arg, app::GetArguments())
23 {
24 Matcher matcher;
25
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 api::Cerr << "Usage: " << Spectre2::program << " [-config=config] [-fork] [-D]" << ios::NewLine;
35
36 return 1;
37 }
38 }
39
40 if (!config.Exists())
41 {
42 api::Cerr << Spectre2::program << ": configuration file " << config.GetPath() << " does not exist." << ios::NewLine;
43
44 return 2;
45 }
46
47 if (fork && api::Posix::CheckError(::fork()))
48 return 0;
49
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);
72
73 fout << ::getpid() << ios::NewLine;
74 }
75
76 Mounter mounter(config);
77 Unmounter unmounter(config);
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()
101 {
102 api::Posix::CheckError(::unlink(pid.NullTerminate()));
103 }
104
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 }

Properties

Name Value
svn:eol-style native
svn:keywords Id