1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Copyright (C) 2021 Vmware, Inc.
6 * Pushpasis Sarkar <spushpasis@vmware.com>
12 #include "mgmtd/mgmt.h"
13 #include "mgmtd/mgmt_be_server.h"
14 #include "mgmtd/mgmt_be_adapter.h"
16 #define MGMTD_BE_SRVR_DBG(fmt, ...) \
17 DEBUGD(&mgmt_debug_be, "%s:" fmt, __func__, ##__VA_ARGS__)
18 #define MGMTD_BE_SRVR_ERR(fmt, ...) \
19 zlog_err("%s: ERROR: " fmt, __func__, ##__VA_ARGS__)
21 static int mgmt_be_listen_fd
= -1;
22 static struct event_loop
*mgmt_be_listen_tm
;
23 static struct event
*mgmt_be_listen_ev
;
24 static void mgmt_be_server_register_event(enum mgmt_be_event event
);
26 static void mgmt_be_conn_accept(struct event
*thread
)
31 if (mgmt_be_listen_fd
< 0)
34 /* We continue hearing server listen socket. */
35 mgmt_be_server_register_event(MGMTD_BE_SERVER
);
37 memset(&su
, 0, sizeof(union sockunion
));
39 /* We can handle IPv4 or IPv6 socket. */
40 client_conn_fd
= sockunion_accept(mgmt_be_listen_fd
, &su
);
41 if (client_conn_fd
< 0) {
43 "Failed to accept MGMTD Backend client connection : %s",
44 safe_strerror(errno
));
47 set_nonblocking(client_conn_fd
);
48 set_cloexec(client_conn_fd
);
50 MGMTD_BE_SRVR_DBG("Got a new MGMTD Backend connection");
52 mgmt_be_create_adapter(client_conn_fd
, &su
);
55 static void mgmt_be_server_register_event(enum mgmt_be_event event
)
57 if (event
== MGMTD_BE_SERVER
) {
58 event_add_read(mgmt_be_listen_tm
, mgmt_be_conn_accept
,
59 NULL
, mgmt_be_listen_fd
,
61 assert(mgmt_be_listen_ev
);
63 assert(!"mgmt_be_server_post_event() called incorrectly");
67 static void mgmt_be_server_start(const char *hostname
)
71 struct sockaddr_un addr
;
75 old_mask
= umask(0077);
77 sock
= socket(AF_UNIX
, SOCK_STREAM
, PF_UNSPEC
);
79 MGMTD_BE_SRVR_ERR("Failed to create server socket: %s",
80 safe_strerror(errno
));
81 goto mgmt_be_server_start_failed
;
84 addr
.sun_family
= AF_UNIX
,
85 strlcpy(addr
.sun_path
, MGMTD_BE_SERVER_PATH
, sizeof(addr
.sun_path
));
86 unlink(addr
.sun_path
);
87 ret
= bind(sock
, (struct sockaddr
*)&addr
, sizeof(addr
));
90 "Failed to bind server socket to '%s'. Err: %s",
91 addr
.sun_path
, safe_strerror(errno
));
92 goto mgmt_be_server_start_failed
;
95 ret
= listen(sock
, MGMTD_BE_MAX_CONN
);
97 MGMTD_BE_SRVR_ERR("Failed to listen on server socket: %s",
98 safe_strerror(errno
));
99 goto mgmt_be_server_start_failed
;
105 mgmt_be_listen_fd
= sock
;
106 mgmt_be_server_register_event(MGMTD_BE_SERVER
);
108 MGMTD_BE_SRVR_DBG("Started MGMTD Backend Server!");
111 mgmt_be_server_start_failed
:
115 mgmt_be_listen_fd
= -1;
119 int mgmt_be_server_init(struct event_loop
*master
)
121 if (mgmt_be_listen_tm
) {
122 MGMTD_BE_SRVR_DBG("MGMTD Backend Server already running!");
126 mgmt_be_listen_tm
= master
;
128 mgmt_be_server_start("localhost");
133 void mgmt_be_server_destroy(void)
135 if (mgmt_be_listen_tm
) {
136 MGMTD_BE_SRVR_DBG("Closing MGMTD Backend Server!");
138 if (mgmt_be_listen_ev
) {
139 EVENT_OFF(mgmt_be_listen_ev
);
140 mgmt_be_listen_ev
= NULL
;
143 if (mgmt_be_listen_fd
>= 0) {
144 close(mgmt_be_listen_fd
);
145 mgmt_be_listen_fd
= -1;
148 mgmt_be_listen_tm
= NULL
;