ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/Spectre2/Spectre2.cpp
Revision: 441
Committed: 2005-04-12T15:42:24-07:00 (20 years, 2 months ago) by douglas
File size: 2865 byte(s)
Log Message:
Yeah, whatever.

File Contents

# Content
1 // Spectre 2
2 //
3 // Douglas Thrift
4 //
5 // $Id$
6
7 #include "Mounter.hpp"
8 #include "Unmounter.hpp"
9
10 #include <menes-api/exename.hpp>
11 #include <menes-app/simple.hpp>
12
13 #include <sys/types.h>
14 #include <signal.h>
15
16 int Main(const app::Options& options)
17 {
18 api::Path config(Spectre2::prefix + "/etc/spectre.xml");
19 enum Mode { none, pid = 1, fork } mode(none);
20
21 _foreach (const app::ArgumentList, arg, app::GetArguments())
22 {
23 Matcher matcher;
24
25 if (*arg == matcher("^-config=(.*)$"))
26 config = matcher[1];
27 else if (*arg == "-pid")
28 mode = pid;
29 else if (*arg == "-fork")
30 mode = fork;
31 else if (*arg == "-D")
32 Spectre2::debug = true;
33 else if (*arg != matcher("^--.*$"))
34 {
35 api::Cerr << "Usage: " << Spectre2::program << " [-config=config] [-pid|-fork] [-D]" << ios::NewLine;
36
37 return 1;
38 }
39 }
40
41 if (!config.Exists())
42 {
43 api::Cerr << Spectre2::program << ": configuration file " << config.GetPath() << " does not exist." << ios::NewLine;
44
45 return 2;
46 }
47
48 switch (mode)
49 {
50 case pid:
51 try
52 {
53 _H<xml::Document> document(xml::Parse(config.GetPath()));
54 api::FileReader in(*document/"spectre"/"pid");
55
56 ios::ReadToWrite(in, api::Cout);
57 }
58 catch (const api::Error&)
59 {
60 return 1;
61 }
62 break;
63 case fork:
64 if (api::Posix::CheckError(::fork()))
65 return 0;
66 default:
67 {
68 Spectre2 spectre(config);
69 }
70 }
71
72 return 0;
73 }
74
75 extern "C"
76 {
77 void reload(int signal, ::siginfo_t* info, void* uap);
78 void stop(int signal, ::siginfo_t* info, void* uap);
79 }
80
81 Spectre2::Spectre2(const api::Path& config)
82 {
83 {
84 _H<xml::Document> document(xml::Parse(config.GetPath()));
85 _H<xml::Node> spectre(*document/"spectre");
86
87 pid = *spectre/"pid";
88 }
89
90 {
91 api::FileWriter out(pid);
92 ios::FormatWriter fout(out);
93
94 fout << ::getpid() << ios::NewLine;
95 }
96
97 Daemon daemon_(config);
98
99 daemon = &daemon_;
100
101 {
102 struct ::sigaction action;
103
104 action.sa_sigaction = reload;
105 action.sa_flags = SA_SIGINFO;
106
107 api::Posix::CheckError(::sigemptyset(&action.sa_mask));
108 api::Posix::CheckError(::sigaction(SIGUSR1, &action, NULL));
109
110 action.sa_sigaction = stop;
111
112 api::Posix::CheckError(::sigaction(SIGINT, &action, NULL));
113 api::Posix::CheckError(::sigaction(SIGTERM, &action, NULL));
114 }
115 }
116
117 Spectre2::~Spectre2()
118 {
119 api::Posix::CheckError(::unlink(pid.NullTerminate()));
120 }
121
122 ext::String Spectre2::program(api::GetExecutablePath().GetName()), Spectre2::prefix(_Spectre2_prefix_), Spectre2::root(_Spectre2_root_), Spectre2::mount(_Spectre2_mount_), Spectre2::umount(_Spectre2_umount_);
123 bool Spectre2::debug(false);
124 Daemon* Spectre2::daemon;
125
126 extern "C"
127 {
128 void reload(int signal, ::siginfo_t* info, void* uap)
129 {
130 if (Spectre2::debug)
131 api::Cout << "Reload" << ios::NewLine;
132
133 Spectre2::daemon->reload();
134 }
135
136 void stop(int signal, ::siginfo_t* info, void* uap)
137 {
138 if (Spectre2::debug)
139 api::Cout << "Stop" << ios::NewLine;
140
141 Spectre2::daemon->stop();
142 }
143 }

Properties

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