]> git.vomp.tv Git - vompserver.git/blob - mvpserver.c
Bootp server
[vompserver.git] / mvpserver.c
1 /*
2     Copyright 2004-2005 Chris Tallon
3
4     This file is part of VOMP.
5
6     VOMP is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     VOMP is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with VOMP; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 */
20
21 #include "mvpserver.h"
22
23 MVPServer::MVPServer()
24 {
25 }
26
27 MVPServer::~MVPServer()
28 {
29   stop();
30 }
31
32 int MVPServer::stop()
33 {
34   if (threadIsActive()) threadCancel();
35   close(listeningSocket);
36
37   udpr.shutdown();
38   bootpd.shutdown();
39
40   log.log("Main", Log::INFO, "Stopped main server thread");
41   log.shutdown();
42
43   config.shutdown();
44
45   return 1;
46 }
47
48 int MVPServer::run()
49 {
50   if (threadIsActive()) return 1;
51
52   // Start config
53   const char* configDir = cPlugin::ConfigDirectory();
54   if (!configDir)
55   {
56     dsyslog("VOMP: Could not get config dir from VDR");
57   }
58   else
59   {
60     char configFileName[PATH_MAX];
61     snprintf(configFileName, PATH_MAX, "%s/vomp.conf", configDir);
62     if (config.init(configFileName))
63     {
64       dsyslog("VOMP: Config file found");
65     }
66     else
67     {
68       dsyslog("VOMP: Config file not found");
69     }
70   }
71
72   // Start logging
73
74   char* cfgLogFilename = config.getValueString("General", "Log file");
75   if (cfgLogFilename)
76   {
77     log.init(Log::DEBUG, cfgLogFilename);
78     delete[] cfgLogFilename;
79     log.log("Main", Log::INFO, "Logging started");
80   }
81   else
82   {
83     dsyslog("VOMP: Logging disabled");
84   }
85
86   // Work out a name for this server
87
88   char* serverName;
89
90   // Try to get from vomp.conf
91   serverName = config.getValueString("General", "Server name");
92   if (!serverName) // If not, get the hostname
93   {
94     serverName = new char[1024];
95     if (gethostname(serverName, 1024)) // if not, just use "-"
96     {
97       strcpy(serverName, "-");
98     }
99   }
100
101   int udpSuccess = udpr.run(serverName);
102
103   delete[] serverName;
104
105   if (!udpSuccess)
106   {
107     log.log("Main", Log::CRIT, "Could not start UDP replier");
108     stop();
109     return 0;
110   }
111
112   if (config.getValueString("General", "Bootp server"))
113   {
114     if (!bootpd.run())
115     {
116       log.log("Main", Log::CRIT, "Could not start Bootpd");
117       stop();
118       return 0;
119     }
120   }
121   else
122   {
123     log.log("Main", Log::INFO, "Not starting Bootpd");
124   }
125
126   // start thread here
127   if (!threadStart())
128   {
129     log.log("Main", Log::CRIT, "Could not start MVPServer thread");
130     stop();
131     return 0;
132   }
133
134   log.log("Main", Log::DEBUG, "MVPServer run success");
135   return 1;
136 }
137
138 void MVPServer::threadMethod()
139 {
140   // I want to die as soon as I am cancelled because I'll be in accept()
141   pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
142   pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
143
144   struct sockaddr_in address;
145   address.sin_family = AF_INET;
146   address.sin_port = htons(3024);
147   address.sin_addr.s_addr = INADDR_ANY;
148   socklen_t length = sizeof(address);
149
150   listeningSocket = socket(AF_INET, SOCK_STREAM, 0);
151   if (listeningSocket < 0)
152   {
153     log.log("MVPServer", Log::CRIT, "Could not get TCP socket in vompserver");
154     return;
155   }
156
157   int value=1;
158   setsockopt(listeningSocket,SOL_SOCKET,SO_REUSEADDR,&value,sizeof(value));
159
160   if (bind(listeningSocket,(struct sockaddr *)&address,sizeof(address)) < 0)
161   {
162     log.log("MVPServer", Log::CRIT, "Could not bind to socket in vompserver");
163     close(listeningSocket);
164     return;
165   }
166
167   listen(listeningSocket, 5);
168
169   int clientSocket;
170
171   while(1)
172   {
173     clientSocket = accept(listeningSocket,(struct sockaddr *)&address, &length);
174     MVPClient* m = new MVPClient(clientSocket);
175     m->run();
176   }
177 }