~michael-owens/ltnet/trunk

« back to all changes in this revision

Viewing changes to command_stop.cpp

  • Committer: Michael Owens
  • Date: 2008-09-18 21:40:39 UTC
  • Revision ID: owensmk@owensmk-20080918214039-lzu3cxp32anryna5
Compiles but will not work with debian build without libconfigduo, which is not
in Ubuntu.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <linterra/std/apr.h>
 
2
 
 
3
#include "log.h"
 
4
#include "platform.h"
 
5
#include "command_stop.h"
 
6
 
 
7
using namespace linterra;
 
8
using namespace linterra::server;
 
9
 
 
10
static const apr_getopt_option_t opt_array[] = {
 
11
    { "config",    'c', TRUE,  "Use configuration file (must be first if used)" },
 
12
    { "help",      'h', FALSE, "show help"              }, 
 
13
    { "pidfile",   'p', TRUE,  "pid file location"      }, 
 
14
    { "verbose",   'v', TRUE,  "verbosity (1-4)"        }, 
 
15
    { NULL,         0,  0,      NULL                    }, 
 
16
};
 
17
 
 
18
command_stop::command_stop() : command()
 
19
{
 
20
    init();
 
21
}
 
22
 
 
23
command_stop::~command_stop()
 
24
{
 
25
 
 
26
}
 
27
 
 
28
const char* command_stop::name() const
 
29
{
 
30
    return "stop";
 
31
}
 
32
 
 
33
const char* command_stop::description() const
 
34
{
 
35
    return "Stop the server";
 
36
}
 
37
 
 
38
void command_stop::init()
 
39
{
 
40
    opt_file = false;
 
41
}
 
42
 
 
43
void command_stop::print_help()
 
44
{
 
45
    const char* text =
 
46
    "Command: ltd stop\n\n"
 
47
    "Stop the server. This command will look for the server's pid in\n"
 
48
    "the default pid file (" DEFAULT_PID_FILE "). Use the -p or --pidfile\n"
 
49
    "switch to use an alternate pid file";
 
50
 
 
51
    printf("%s\n\n", text);
 
52
    print_default_help(opt_array, "");
 
53
}
 
54
 
 
55
int command_stop::run(libconfig::Config& config, apr_getopt_t* opt)
 
56
{
 
57
    apr_status_t apr_rv;
 
58
 
 
59
    bool loaded_config_file = false;
 
60
 
 
61
    // Parse the command line, record all options, and proceed to execution
 
62
    // after while() loop.
 
63
 
 
64
    while(1)
 
65
    {
 
66
        int optch;
 
67
        const char *optarg;
 
68
 
 
69
        apr_rv = apr_getopt_long(opt, opt_array, &optch, &optarg);
 
70
        
 
71
        if(APR_STATUS_IS_EOF(apr_rv))
 
72
        {
 
73
            break;
 
74
        }
 
75
        else if(apr_rv)
 
76
        {
 
77
            break;
 
78
        }
 
79
 
 
80
        switch(optch) 
 
81
        {
 
82
            case 'c':
 
83
            {
 
84
                // Parse configuration file
 
85
                if(linterra::server::config_init(optarg) != 0)
 
86
                {
 
87
                    exit(1);
 
88
                }
 
89
                
 
90
                break;
 
91
            }
 
92
 
 
93
            case 'h':
 
94
            {
 
95
                print_help();
 
96
 
 
97
                return -1;
 
98
            }
 
99
 
 
100
            case 'p':
 
101
            {
 
102
                ensure_config();
 
103
 
 
104
                libconfig::Setting& setting = config.lookup("core");
 
105
 
 
106
                if(setting.exists("pid_file"))
 
107
                {
 
108
                    setting.remove("pid_file");
 
109
                }
 
110
 
 
111
                libconfig::Setting& s = setting.add("pid_file", libconfig::Setting::TypeString);
 
112
                s = optarg;
 
113
 
 
114
                break;
 
115
            }
 
116
 
 
117
            case 'v':
 
118
            {
 
119
                ensure_config();
 
120
 
 
121
                libconfig::Setting& setting = config.lookup("core");
 
122
 
 
123
                if(setting.exists("verbosity"))
 
124
                {
 
125
                    setting.remove("verbosity");
 
126
                }
 
127
 
 
128
                // Convert from string to int
 
129
                i32 v;
 
130
                buffer value = optarg;
 
131
                value >> v;
 
132
 
 
133
                libconfig::Setting& s = setting.add("verbosity", libconfig::Setting::TypeInt);
 
134
                s = v;
 
135
 
 
136
                break;
 
137
            }
 
138
        }
 
139
    }
 
140
 
 
141
    if (apr_rv != APR_EOF)
 
142
    {
 
143
        printf("server: Bad option(s)\n");
 
144
        print_help();
 
145
 
 
146
        return -1;
 
147
    }
 
148
 
 
149
    ensure_config();
 
150
 
 
151
    // Get the PID from the pid file
 
152
    const char* pid_file = DEFAULT_PID_FILE;
 
153
    if(config.lookupValue("core.pid_file", pid_file) == false)
 
154
    {
 
155
        pid_file = DEFAULT_PID_FILE;
 
156
    }
 
157
 
 
158
    // Check that the pid file exists.
 
159
    apr::subpool pool;
 
160
    apr::file_info stat = apr::stat(pid_file, pool.handle);
 
161
 
 
162
    if(stat.valid() == false)
 
163
    {
 
164
        LOGFATAL("PID file " << (std::string)pid_file << " does not exist");
 
165
 
 
166
        exit(1);
 
167
    }
 
168
 
 
169
    buffer file;
 
170
    if(file.read_file(pid_file) == false)
 
171
    {
 
172
        LOGFATAL("Could not read pid file: " << pid_file);
 
173
    }
 
174
 
 
175
    int pid;
 
176
    file >> pid;
 
177
 
 
178
    LOGINFO("stop command: sending TERM signal to " << pid);
 
179
 
 
180
    // Send TERM signal
 
181
    kill(pid, SIGTERM);
 
182
 
 
183
    return 1;
 
184
}