-
Notifications
You must be signed in to change notification settings - Fork 264
/
socket_server.cc
130 lines (112 loc) · 3.74 KB
/
socket_server.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
BAREOS® - Backup Archiving REcovery Open Sourced
Copyright (C) 2000-2011 Free Software Foundation Europe e.V.
Copyright (C) 2014-2018 Bareos GmbH & Co. KG
This program is Free Software; you can redistribute it and/or
modify it under the terms of version three of the GNU Affero General Public
License as published by the Free Software Foundation and included
in the file LICENSE.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
*/
/*
* Kern Sibbald, October MM
* Extracted from other source files by Marco van Wieringen, October 2014
*/
/**
* @file
* This file handles external connections made to the File daemon.
*/
#include "include/bareos.h"
#include "filed/filed.h"
#include "filed/dir_cmd.h"
#include "filed/sd_cmds.h"
#include "lib/bnet_sever_tcp.h"
/* Global variables */
static workq_t socket_workq;
static pthread_t tcp_server_tid;
static alist *sock_fds = NULL;
/**
* Connection request. We accept connections either from the Director or the Storage Daemon
*
* NOTE! We are running as a separate thread
*
* Send output one line at a time followed by a zero length transmission.
* Return when the connection is terminated or there is an error.
*
* Basic tasks done here:
* - If it was a connection from an SD, call handle_stored_connection()
* - Otherwise it was a connection from the DIR, call handle_director_connection()
*/
static void *HandleConnectionRequest(void *arg)
{
BareosSocket *bs = (BareosSocket *)arg;
char tbuf[100];
if (bs->recv() <= 0) {
Emsg1(M_ERROR, 0, _("Connection request from %s failed.\n"), bs->who());
Bmicrosleep(5, 0); /* make user wait 5 seconds */
bs->close();
delete bs;
return NULL;
}
Dmsg1(110, "Conn: %s\n", bs->msg);
/*
* See if its a director making a connection.
*/
if (bstrncmp(bs->msg, "Hello Director", 14)) {
Dmsg1(110, "Got a DIR connection at %s\n", bstrftimes(tbuf, sizeof(tbuf), (utime_t)time(NULL)));
return handle_director_connection(bs);
}
/*
* See if its a storage daemon making a connection.
*/
if (bstrncmp(bs->msg, "Hello Storage", 13)) {
Dmsg1(110, "Got a SD connection at %s\n", bstrftimes(tbuf, sizeof(tbuf), (utime_t)time(NULL)));
return handle_stored_connection(bs);
}
Emsg2(M_ERROR, 0, _("Invalid connection from %s. Len=%d\n"), bs->who(), bs->message_length);
return NULL;
}
void StartSocketServer(dlist *addrs)
{
IPADDR *p;
tcp_server_tid = pthread_self();
/*
* Become server, and handle requests
*/
foreach_dlist(p, addrs) {
Dmsg1(10, "filed: listening on port %d\n", p->GetPortHostOrder());
}
/*
* Permit MaxConnections connections.
*/
sock_fds = New(alist(10, not_owned_by_alist));
BnetThreadServerTcp(addrs,
me->MaxConnections,
sock_fds,
&socket_workq,
me->nokeepalive,
HandleConnectionRequest);
}
void StopSocketServer(bool wait)
{
Dmsg0(100, "StopSocketServer\n");
if (sock_fds) {
BnetStopThreadServerTcp(tcp_server_tid);
/*
* before thread_servers terminates,
* it calls cleanup_bnet_thread_server_tcp
*/
if (wait) {
pthread_join(tcp_server_tid, NULL);
delete(sock_fds);
sock_fds = NULL;
}
}
}