]> git.vomp.tv Git - vompserver.git/blob - mvpserver.c
Server ID sent in broadcast reply
[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   if (threadIsActive()) stop();
30 }
31
32 int MVPServer::stop()
33 {
34   if (!threadIsActive()) return 0;
35
36   threadCancel();
37   log.log("MVPServer", Log::INFO, "Stopped MVPServer thread");
38
39   udpr.stop();
40   log.shutdown();
41
42   close(listeningSocket);
43
44   return 1;
45 }
46
47 int MVPServer::run()
48 {
49   if (threadIsActive()) return 1;
50
51   log.init(Log::DEBUG, "/tmp/vompserver.log", 1);
52
53   char serverName[1024];
54   bool nameSuccess = false;
55
56   // Try to get a server name from vomp.conf
57   const char* configDir = cPlugin::ConfigDirectory();
58   if (!configDir)
59   {
60     log.log("Client", Log::DEBUG, "No config dir!");
61   }
62   else
63   {
64     char configFileName[PATH_MAX];
65     snprintf(configFileName, PATH_MAX, "%s/vomp.conf", configDir);
66
67     Config c;
68     if (c.init(configFileName))
69     {
70       char* fc = c.getValueString("General", "Server name");
71       if (fc)
72       {
73         strncpy(serverName, fc, 1024);
74         delete[] fc;
75         nameSuccess = true;
76       }
77     }
78     c.shutdown();
79   }
80
81   if (!nameSuccess)
82   {
83     if (gethostname(serverName, 1024)) // if fail
84     {
85       strcpy(serverName, "-");
86     }
87   }
88
89   serverName[1023] = '\0';
90
91   if (!udpr.run(serverName))
92   {
93     log.log("MVPServer", Log::CRIT, "Could not start UDP replier");
94     log.shutdown();
95     return 0;
96   }
97
98   // start thread here
99   if (!threadStart())
100   {
101     log.log("MVPServer", Log::CRIT, "Could not start MVPServer thread");
102     udpr.stop();
103     log.shutdown();
104     return 0;
105   }
106
107   log.log("MVPServer", Log::DEBUG, "MVPServer run success");
108   return 1;
109 }
110
111 void MVPServer::threadMethod()
112 {
113   // I want to die as soon as I am cancelled because I'll be in accept()
114   pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
115   pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
116
117   struct sockaddr_in address;
118   address.sin_family = AF_INET;
119   address.sin_port = htons(3024);
120   address.sin_addr.s_addr = INADDR_ANY;
121   socklen_t length = sizeof(address);
122
123   listeningSocket = socket(AF_INET, SOCK_STREAM, 0);
124   if (listeningSocket < 0)
125   {
126     log.log("MVPServer", Log::CRIT, "Could not get TCP socket in vompserver");
127     return;
128   }
129
130   int value=1;
131   setsockopt(listeningSocket,SOL_SOCKET,SO_REUSEADDR,&value,sizeof(value));
132
133   if (bind(listeningSocket,(struct sockaddr *)&address,sizeof(address)) < 0)
134   {
135     log.log("MVPServer", Log::CRIT, "Could not bind to socket in vompserver");
136     close(listeningSocket);
137     return;
138   }
139
140   listen(listeningSocket, 5);
141
142   int clientSocket;
143
144   while(1)
145   {
146     clientSocket = accept(listeningSocket,(struct sockaddr *)&address, &length);
147     MVPClient* m = new MVPClient(clientSocket);
148     m->run();
149   }
150 }
151
152
153 ULLONG ntohll(ULLONG a)
154 {
155   return htonll(a);
156 }
157
158 ULLONG htonll(ULLONG a)
159 {
160   #if BYTE_ORDER == BIG_ENDIAN
161     return a;
162   #else
163     ULLONG b = 0;
164
165     b = ((a << 56) & 0xFF00000000000000ULL)
166       | ((a << 40) & 0x00FF000000000000ULL)
167       | ((a << 24) & 0x0000FF0000000000ULL)
168       | ((a <<  8) & 0x000000FF00000000ULL)
169       | ((a >>  8) & 0x00000000FF000000ULL)
170       | ((a >> 24) & 0x0000000000FF0000ULL)
171       | ((a >> 40) & 0x000000000000FF00ULL)
172       | ((a >> 56) & 0x00000000000000FFULL) ;
173
174     return b;
175   #endif
176 }