ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/Spectre2/Spectre2.cpp
Revision: 417
Committed: 2005-03-02T14:49:53-08:00 (20 years, 3 months ago) by douglas
File size: 2475 byte(s)
Log Message:
Yeah, this is probably easier and saner.

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 ext::String config("spectre.xml"), pid("spectre.pid");
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 == matcher("^-pid=(.*)$"))
31 pid = matcher[1];
32 else if (*arg == "-D")
33 Spectre2::debug = true;
34 else
35 {
36 api::Cerr << "Usage: " << Spectre2::program << " [-config=config] [-fork] [-pid=pid] [-D]" << ios::NewLine;
37
38 return 1;
39 }
40 }
41
42 if (fork && api::Posix::CheckError(::fork()))
43 return 0;
44
45 api::Cerr << "Here!" << ios::NewLine;
46
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 {
60 {
61 api::FileWriter out(pid);
62 ios::FormatWriter fout(out);
63
64 fout << ::getpid() << ios::NewLine;
65 }
66
67 Mounter mounter(config);
68 Unmounter unmounter(config);
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()
92 {
93 api::Posix::CheckError(::unlink(pid.NullTerminate()));
94 }
95
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 }

Properties

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