]> git.stg.codes - stg.git/blob - projects/stargazer/plugins/configuration/sgconfig/stgconfig.cpp
Reduced scopes plus graceful connection shutdown.
[stg.git] / projects / stargazer / plugins / configuration / sgconfig / stgconfig.cpp
1 /*
2  *    This program is free software; you can redistribute it and/or modify
3  *    it under the terms of the GNU General Public License as published by
4  *    the Free Software Foundation; either version 2 of the License, or
5  *    (at your option) any later version.
6  *
7  *    This program is distributed in the hope that it will be useful,
8  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
9  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  *    GNU General Public License for more details.
11  *
12  *    You should have received a copy of the GNU General Public License
13  *    along with this program; if not, write to the Free Software
14  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
15  */
16
17 /*
18  *    Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
19  */
20
21 #include "stgconfig.h"
22
23 #include "stg/plugin_creator.h"
24 #include "stg/common.h"
25
26 #include <algorithm>
27 #include <csignal>
28
29 #include <unistd.h>
30
31 //-----------------------------------------------------------------------------
32 //-----------------------------------------------------------------------------
33 //-----------------------------------------------------------------------------
34 static PLUGIN_CREATOR<STG_CONFIG> stgc;
35 //-----------------------------------------------------------------------------
36 //-----------------------------------------------------------------------------
37 //-----------------------------------------------------------------------------
38 int STG_CONFIG_SETTINGS::ParseSettings(const MODULE_SETTINGS & s)
39 {
40 int p;
41 PARAM_VALUE pv;
42 std::vector<PARAM_VALUE>::const_iterator pvi;
43 ///////////////////////////
44 pv.param = "Port";
45 pvi = std::find(s.moduleParams.begin(), s.moduleParams.end(), pv);
46 if (pvi == s.moduleParams.end())
47     {
48     errorStr = "Parameter \'Port\' not found.";
49     printfd(__FILE__, "Parameter 'Port' not found\n");
50     return -1;
51     }
52 if (ParseIntInRange(pvi->value[0], 2, 65535, &p))
53     {
54     errorStr = "Cannot parse parameter \'Port\': " + errorStr;
55     printfd(__FILE__, "%s\n", errorStr.c_str());
56     return -1;
57     }
58 port = static_cast<uint16_t>(p);
59
60 return 0;
61 }
62 //-----------------------------------------------------------------------------
63 //-----------------------------------------------------------------------------
64 //-----------------------------------------------------------------------------
65 extern "C" PLUGIN * GetPlugin()
66 {
67 return stgc.GetPlugin();
68 }
69 //-----------------------------------------------------------------------------
70 //-----------------------------------------------------------------------------
71 //-----------------------------------------------------------------------------
72 STG_CONFIG::STG_CONFIG()
73     : errorStr(),
74       stgConfigSettings(),
75       thread(),
76       nonstop(false),
77       isRunning(false),
78       logger(GetPluginLogger(GetStgLogger(), "conf_sg")),
79       config(logger),
80       settings()
81 {
82 }
83 //-----------------------------------------------------------------------------
84 int STG_CONFIG::ParseSettings()
85 {
86 int ret = stgConfigSettings.ParseSettings(settings);
87 if (ret)
88     errorStr = stgConfigSettings.GetStrError();
89 return ret;
90 }
91 //-----------------------------------------------------------------------------
92 int STG_CONFIG::Start()
93 {
94 if (isRunning)
95     return 0;
96
97 nonstop = true;
98
99 config.SetPort(stgConfigSettings.GetPort());
100
101 if (config.Prepare())
102     {
103     errorStr = config.GetStrError();
104     return -1;
105     }
106
107 if (pthread_create(&thread, NULL, Run, this))
108     {
109     errorStr = "Cannot create thread.";
110     printfd(__FILE__, "Cannot create thread\n");
111     logger("Cannot create thread.");
112     return -1;
113     }
114 errorStr = "";
115 return 0;
116 }
117 //-----------------------------------------------------------------------------
118 int STG_CONFIG::Stop()
119 {
120 if (!isRunning)
121     return 0;
122
123 config.Stop();
124
125 //5 seconds to thread stops itself
126 for (int i = 0; i < 25; i++)
127     {
128     if (!isRunning)
129         break;
130
131     struct timespec ts = {0, 200000000};
132     nanosleep(&ts, NULL);
133     }
134
135 if (isRunning)
136     return -1;
137
138 return 0;
139 }
140 //-----------------------------------------------------------------------------
141 void * STG_CONFIG::Run(void * d)
142 {
143 sigset_t signalSet;
144 sigfillset(&signalSet);
145 pthread_sigmask(SIG_BLOCK, &signalSet, NULL);
146
147 STG_CONFIG * stgConf = static_cast<STG_CONFIG *>(d);
148 stgConf->isRunning = true;
149
150 stgConf->config.Run();
151
152 stgConf->isRunning = false;
153 return NULL;
154 }
155 //-----------------------------------------------------------------------------