1e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang//
2e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang// Copyright (C) 2015 The Android Open Source Project
3e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang//
4e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang// Licensed under the Apache License, Version 2.0 (the "License");
5e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang// you may not use this file except in compliance with the License.
6e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang// You may obtain a copy of the License at
7e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang//
8e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang//      http://www.apache.org/licenses/LICENSE-2.0
9e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang//
10e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang// Unless required by applicable law or agreed to in writing, software
11e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang// distributed under the License is distributed on an "AS IS" BASIS,
12e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang// See the License for the specific language governing permissions and
14e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang// limitations under the License.
15e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang//
16e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang
17e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang
18e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang#include <base/command_line.h>
19e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang#include <base/logging.h>
20e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang#include <brillo/syslog_logging.h>
21e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang#include "dhcp_client/daemon.h"
22e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang
23e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wangusing std::vector;
24e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang
25e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wangnamespace {
26e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang
27e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wangnamespace switches {
28e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang
29e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang// Don't daemon()ize; run in foreground.
30e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wangconst char kForeground[] = "foreground";
3188c688a6796c0b525da023e52febc911ecb4356aNingyuan Wang// Flag to show the help message.
32e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wangconst char kHelp[] = "help";
33e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang// The help message shown if help flag is passed to the program.
34e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wangconst char kHelpMessage[] = "\n help message \n";
35e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang
36e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang}  // namespace switches
37e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang
38e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang}  // namespace
39e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang
40e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang// Always logs to the syslog and logs to stderr if
41e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang// we are running in the foreground.
42e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wangvoid SetupLogging(bool foreground,
43e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang                  const char* daemon_name) {
44e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang  int log_flags = 0;
45e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang  log_flags |= brillo::kLogToSyslog;
46e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang  log_flags |= brillo::kLogHeader;
47e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang  if (foreground) {
48e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang    log_flags |= brillo::kLogToStderr;
49e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang  }
50e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang  brillo::InitLog(log_flags);
51e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang}
52e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang
53e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wangvoid OnStartup(const char* daemon_name, base::CommandLine* cl) {
54e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang  LOG(INFO) << __func__;
55e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang  SetupLogging(cl->HasSwitch(switches::kForeground), daemon_name);
56e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang  return;
57e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang}
58e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang
59e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wangint main(int argc, char* argv[]) {
60e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang  base::CommandLine::Init(argc, argv);
61e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang  base::CommandLine* cl = base::CommandLine::ForCurrentProcess();
62e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang
63e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang  if (cl->HasSwitch(switches::kHelp)) {
64e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang    LOG(INFO) << switches::kHelpMessage;
65e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang    return 0;
66e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang  }
67e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang
68e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang  dhcp_client::Daemon daemon(base::Bind(&OnStartup, argv[0], cl));
69e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang
70e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang  daemon.Run();
71e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang
72e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang  return 0;
73e44553d72dd6e5436cee30900ffec335fc477224Ningyuan Wang}
74