OpenVPN 3 Core Library
Loading...
Searching...
No Matches
daemon.hpp
Go to the documentation of this file.
1// OpenVPN -- An application to securely tunnel IP networks
2// over a single port, with support for SSL/TLS-based
3// session authentication and key exchange,
4// packet encryption, packet authentication, and
5// packet compression.
6//
7// Copyright (C) 2012- OpenVPN Inc.
8//
9// SPDX-License-Identifier: MPL-2.0 OR AGPL-3.0-only WITH openvpn3-openssl-exception
10//
11
12#ifndef OPENVPN_COMMON_DAEMON_H
13#define OPENVPN_COMMON_DAEMON_H
14
15#include <sys/types.h>
16#include <unistd.h>
17
18#include <string>
19
28
29namespace openvpn {
30
32
33class LogReopen : public LogSetup
34{
35 public:
36 LogReopen(const std::string &log_fn,
37 const bool combine_out_err)
38 : log_fn_(log_fn),
39 combine_out_err_(combine_out_err)
40 {
41 }
42
43 virtual void reopen() override
44 {
45 try
46 {
47 // open redirection log file, but don't redirect yet
48 RedirectStd redir(std::string(),
49 log_fn_,
53
54 // now do the redirect
55 redir.redirect();
56 }
57 catch (const std::exception &e)
58 {
59 std::cerr << "LogReopen: " << e.what() << std::endl;
60 }
61 }
62
63 private:
64 const std::string log_fn_;
65 const bool combine_out_err_;
66};
67
68inline LogSetup::Ptr log_setup(const std::string &log_fn,
69 const SetUserGroup *user_group,
70 const bool log_append,
71 const int log_versions,
72 const bool stdin_to_dev_null,
73 const bool combine_out_err)
74{
75 if (!log_append && log_versions >= 1)
76 log_rotate(log_fn, log_versions);
77 RedirectStd redir(stdin_to_dev_null ? "/dev/null" : "",
78 log_fn,
81 combine_out_err);
82 // if user_group specified, do chown on log file
83 try
84 {
85 if (user_group && redir.out.defined())
86 user_group->chown(redir.out(), log_fn);
87 }
88 catch (const std::exception &)
89 {
90 }
91 redir.redirect();
92
93 // possibly return a LogReopen object
94 if (!log_versions)
95 return LogSetup::Ptr(new LogReopen(log_fn, combine_out_err));
96 else
97 return LogSetup::Ptr();
98}
99
100inline void daemonize()
101{
102 // ignore daemon() deprecated on macOS
103#if defined(__APPLE__)
104#pragma clang diagnostic push
105#pragma clang diagnostic ignored "-Wdeprecated-declarations"
106#endif
107 if (daemon(1, 1) < 0)
108 throw daemon_err("daemon() failed");
109#if defined(__APPLE__)
110#pragma clang diagnostic pop
111#endif
112}
113
114inline LogSetup::Ptr daemonize(const std::string &log_fn,
115 const SetUserGroup *user_group,
116 const bool log_append,
117 const int log_versions)
118{
119 LogSetup::Ptr ret = log_setup(log_fn, user_group, log_append, log_versions, true, true);
120 daemonize();
121 return ret;
122}
123
124inline void write_pid(const std::string &fn)
125{
126 write_string(fn, to_string(::getpid()) + '\n');
127}
128
130{
131 public:
132 WritePid(const char *pid_fn_arg) // must remain in scope for lifetime of object
133 : pid_fn(pid_fn_arg)
134 {
135 if (pid_fn)
137 }
138
140 {
141 if (pid_fn)
142 ::unlink(pid_fn);
143 }
144
145 private:
146 WritePid(const WritePid &) = delete;
147 WritePid &operator=(const WritePid &) = delete;
148
149 const char *const pid_fn;
150};
151} // namespace openvpn
152
153#endif
const std::string log_fn_
Definition daemon.hpp:64
LogReopen(const std::string &log_fn, const bool combine_out_err)
Definition daemon.hpp:36
virtual void reopen() override
Definition daemon.hpp:43
const bool combine_out_err_
Definition daemon.hpp:65
RCPtr< LogSetup > Ptr
Definition logsetup.hpp:23
static constexpr int FLAGS_OVERWRITE
Definition redir.hpp:119
static constexpr mode_t MODE_USER_GROUP
Definition redir.hpp:125
static constexpr int FLAGS_APPEND
Definition redir.hpp:120
bool defined() const
Definition scoped_fd.hpp:58
void chown(const std::string &fn) const
Definition usergroup.hpp:96
WritePid(const WritePid &)=delete
WritePid(const char *pid_fn_arg)
Definition daemon.hpp:132
WritePid & operator=(const WritePid &)=delete
const char *const pid_fn
Definition daemon.hpp:149
#define OPENVPN_EXCEPTION(C)
Support deferred server-side state creation when client connects.
Definition ovpncli.cpp:95
std::string to_string(T value)
Definition to_string.hpp:33
void daemonize()
Definition daemon.hpp:100
LogSetup::Ptr log_setup(const std::string &log_fn, const SetUserGroup *user_group, const bool log_append, const int log_versions, const bool stdin_to_dev_null, const bool combine_out_err)
Definition daemon.hpp:68
void log_rotate(const std::string &fn, const int max_versions)
Definition logrotate.hpp:20
void write_string(const std::string &filename, const std::string &str)
Definition file.hpp:199
void write_pid(const std::string &fn)
Definition daemon.hpp:124
void redirect() noexcept override
Definition redir.hpp:47
std::string ret