1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * MGMTD Frontend Server
5 * Copyright (C) 2021 Vmware, Inc.
6 * Pushpasis Sarkar <spushpasis@vmware.com>
12 #include "mgmtd/mgmt.h"
13 #include "mgmtd/mgmt_fe_server.h"
14 #include "mgmtd/mgmt_fe_adapter.h"
16 #ifdef REDIRECT_DEBUG_TO_STDERR
17 #define MGMTD_FE_SRVR_DBG(fmt, ...) \
18 fprintf(stderr, "%s: " fmt "\n", __func__, ##__VA_ARGS__)
19 #define MGMTD_FE_SRVR_ERR(fmt, ...) \
20 fprintf(stderr, "%s: ERROR, " fmt "\n", __func__, ##__VA_ARGS__)
21 #else /* REDIRECT_DEBUG_TO_STDERR */
22 #define MGMTD_FE_SRVR_DBG(fmt, ...) \
25 zlog_debug("%s: " fmt, __func__, ##__VA_ARGS__); \
27 #define MGMTD_FE_SRVR_ERR(fmt, ...) \
28 zlog_err("%s: ERROR: " fmt, __func__, ##__VA_ARGS__)
29 #endif /* REDIRECT_DEBUG_TO_STDERR */
31 static int mgmt_fe_listen_fd
= -1;
32 static struct thread_master
*mgmt_fe_listen_tm
;
33 static struct thread
*mgmt_fe_listen_ev
;
34 static void mgmt_fe_server_register_event(enum mgmt_fe_event event
);
36 static void mgmt_fe_conn_accept(struct thread
*thread
)
41 if (mgmt_fe_listen_fd
< 0)
44 /* We continue hearing server listen socket. */
45 mgmt_fe_server_register_event(MGMTD_FE_SERVER
);
47 memset(&su
, 0, sizeof(union sockunion
));
49 /* We can handle IPv4 or IPv6 socket. */
50 client_conn_fd
= sockunion_accept(mgmt_fe_listen_fd
, &su
);
51 if (client_conn_fd
< 0) {
53 "Failed to accept MGMTD Frontend client connection : %s",
54 safe_strerror(errno
));
57 set_nonblocking(client_conn_fd
);
58 set_cloexec(client_conn_fd
);
60 MGMTD_FE_SRVR_DBG("Got a new MGMTD Frontend connection");
62 mgmt_fe_create_adapter(client_conn_fd
, &su
);
65 static void mgmt_fe_server_register_event(enum mgmt_fe_event event
)
67 if (event
== MGMTD_FE_SERVER
) {
68 thread_add_read(mgmt_fe_listen_tm
, mgmt_fe_conn_accept
,
69 NULL
, mgmt_fe_listen_fd
,
71 assert(mgmt_fe_listen_ev
);
73 assert(!"mgmt_fe_server_post_event() called incorrectly");
77 static void mgmt_fe_server_start(const char *hostname
)
81 struct sockaddr_un addr
;
85 old_mask
= umask(0077);
87 sock
= socket(AF_UNIX
, SOCK_STREAM
, PF_UNSPEC
);
89 MGMTD_FE_SRVR_ERR("Failed to create server socket: %s",
90 safe_strerror(errno
));
91 goto mgmt_fe_server_start_failed
;
94 addr
.sun_family
= AF_UNIX
,
95 strlcpy(addr
.sun_path
, MGMTD_FE_SERVER_PATH
, sizeof(addr
.sun_path
));
96 unlink(addr
.sun_path
);
97 ret
= bind(sock
, (struct sockaddr
*)&addr
, sizeof(addr
));
100 "Failed to bind server socket to '%s'. Err: %s",
101 addr
.sun_path
, safe_strerror(errno
));
102 goto mgmt_fe_server_start_failed
;
105 ret
= listen(sock
, MGMTD_FE_MAX_CONN
);
107 MGMTD_FE_SRVR_ERR("Failed to listen on server socket: %s",
108 safe_strerror(errno
));
109 goto mgmt_fe_server_start_failed
;
115 mgmt_fe_listen_fd
= sock
;
116 mgmt_fe_server_register_event(MGMTD_FE_SERVER
);
118 MGMTD_FE_SRVR_DBG("Started MGMTD Frontend Server!");
121 mgmt_fe_server_start_failed
:
125 mgmt_fe_listen_fd
= -1;
129 int mgmt_fe_server_init(struct thread_master
*master
)
131 if (mgmt_fe_listen_tm
) {
132 MGMTD_FE_SRVR_DBG("MGMTD Frontend Server already running!");
136 mgmt_fe_listen_tm
= master
;
138 mgmt_fe_server_start("localhost");
143 void mgmt_fe_server_destroy(void)
145 if (mgmt_fe_listen_tm
) {
146 MGMTD_FE_SRVR_DBG("Closing MGMTD Frontend Server!");
148 if (mgmt_fe_listen_ev
) {
149 THREAD_OFF(mgmt_fe_listen_ev
);
150 mgmt_fe_listen_ev
= NULL
;
153 if (mgmt_fe_listen_fd
>= 0) {
154 close(mgmt_fe_listen_fd
);
155 mgmt_fe_listen_fd
= -1;
158 mgmt_fe_listen_tm
= NULL
;