0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2025-01-03 07:31:54 +00:00

Merge commit 'a95fff37' into thread-merge-2.16

This commit is contained in:
Maria Matejka 2024-11-28 10:57:37 +01:00
commit 1ce352ebf5
6 changed files with 70 additions and 20 deletions

View File

@ -15,6 +15,7 @@
#include "lib/resource.h" #include "lib/resource.h"
#include "lib/obstacle.h" #include "lib/obstacle.h"
#include "lib/timer.h" #include "lib/timer.h"
#include "lib/tlists.h"
/* Configuration structure */ /* Configuration structure */
struct config { struct config {
@ -26,6 +27,7 @@ struct config {
list logfiles; /* Configured log files (sysdep) */ list logfiles; /* Configured log files (sysdep) */
list tests; /* Configured unit tests (f_bt_test_suite) */ list tests; /* Configured unit tests (f_bt_test_suite) */
list symbols; /* Configured symbols in config order */ list symbols; /* Configured symbols in config order */
TLIST_STRUCT_DEF(cli_config, struct cli_config) cli; /* Configured CLI sockets */
struct rfile *mrtdump_file; /* Configured MRTDump file */ struct rfile *mrtdump_file; /* Configured MRTDump file */
const char *syslog_name; /* Name used for syslog (NULL -> no syslog) */ const char *syslog_name; /* Name used for syslog (NULL -> no syslog) */

View File

@ -12,6 +12,8 @@
#include "lib/resource.h" #include "lib/resource.h"
#include "lib/lists.h" #include "lib/lists.h"
#include "lib/event.h" #include "lib/event.h"
#include "lib/tlists.h"
#include "conf/conf.h"
#define CLI_RX_BUF_SIZE 4096 #define CLI_RX_BUF_SIZE 4096
#define CLI_TX_BUF_SIZE 4096 #define CLI_TX_BUF_SIZE 4096
@ -45,6 +47,18 @@ typedef struct cli {
uint async_msg_size; /* Total size of async messages queued in tx_buf */ uint async_msg_size; /* Total size of async messages queued in tx_buf */
} cli; } cli;
struct cli_config {
#define TLIST_PREFIX cli_config
#define TLIST_TYPE struct cli_config
#define TLIST_ITEM n
#define TLIST_DEFINED_BEFORE
#define TLIST_WANT_ADD_TAIL
TLIST_DEFAULT_NODE;
const char *name;
uint uid, gid, mode;
};
#include "lib/tlists.h"
extern pool *cli_pool; extern pool *cli_pool;
extern struct cli *this_cli; /* Used during parsing */ extern struct cli *this_cli; /* Used during parsing */

View File

@ -17,7 +17,7 @@ static struct log_config *this_log;
CF_DECLS CF_DECLS
CF_KEYWORDS(LOG, SYSLOG, ALL, DEBUG, TRACE, INFO, REMOTE, WARNING, ERROR, AUTH, FATAL, BUG, STDERR, SOFT, UDP, PORT) CF_KEYWORDS(LOG, SYSLOG, ALL, DEBUG, TRACE, INFO, REMOTE, WARNING, ERROR, AUTH, FATAL, BUG, STDERR, SOFT, UDP, PORT, CLI)
CF_KEYWORDS(NAME, CONFIRM, UNDO, CHECK, TIMEOUT, DEBUG, LATENCY, LIMIT, WATCHDOG, WARNING, STATUS) CF_KEYWORDS(NAME, CONFIRM, UNDO, CHECK, TIMEOUT, DEBUG, LATENCY, LIMIT, WATCHDOG, WARNING, STATUS)
CF_KEYWORDS(PING, WAKEUP, SOCKETS, SCHEDULING, EVENTS, TIMERS, ALLOCATOR) CF_KEYWORDS(PING, WAKEUP, SOCKETS, SCHEDULING, EVENTS, TIMERS, ALLOCATOR)
CF_KEYWORDS(GRACEFUL, RESTART, FIXED) CF_KEYWORDS(GRACEFUL, RESTART, FIXED)
@ -122,7 +122,6 @@ mrtdump_base:
} }
; ;
conf: THREADS expr { conf: THREADS expr {
if ($2 < 1) cf_error("Number of threads must be at least one."); if ($2 < 1) cf_error("Number of threads must be at least one.");
new_config->thread_count = $2; new_config->thread_count = $2;

View File

@ -1684,7 +1684,7 @@ err:
} }
int int
sk_open_unix(sock *s, struct birdloop *loop, char *name) sk_open_unix(sock *s, struct birdloop *loop, const char *name)
{ {
struct sockaddr_un sa; struct sockaddr_un sa;
int fd; int fd;

View File

@ -400,9 +400,12 @@ cmd_reconfig_status(void)
* Command-Line Interface * Command-Line Interface
*/ */
static sock *cli_sk;
static char *path_control_socket = PATH_CONTROL_SOCKET; static char *path_control_socket = PATH_CONTROL_SOCKET;
static struct cli_config *main_control_socket_config = NULL;
static struct cli_listener {
sock *s;
struct cli_config *config;
} *main_control_socket = NULL;
static void static void
cli_write(cli *c) cli_write(cli *c)
@ -531,33 +534,65 @@ cli_connect(sock *s, uint size UNUSED)
return 1; return 1;
} }
static void static struct cli_listener *
cli_init_unix(uid_t use_uid, gid_t use_gid) cli_listener(struct cli_config *cf)
{ {
sock *s; struct cli_listener *l = mb_allocz(cli_pool, sizeof *l);
l->config = cf;
cli_init(); sock *s = l->s = sk_new(cli_pool);
s = cli_sk = sk_new(cli_pool);
s->type = SK_UNIX_PASSIVE; s->type = SK_UNIX_PASSIVE;
s->rx_hook = cli_connect; s->rx_hook = cli_connect;
s->err_hook = cli_connect_err; s->err_hook = cli_connect_err;
s->data = cf;
s->rbsize = 1024; s->rbsize = 1024;
s->fast_rx = 1; s->fast_rx = 1;
/* Return value intentionally ignored */ /* Return value intentionally ignored */
unlink(path_control_socket); unlink(cf->name);
if (sk_open_unix(s, &main_birdloop, path_control_socket) < 0) if (sk_open_unix(s, &main_birdloop, cf->name) < 0)
die("Cannot create control socket %s: %m", path_control_socket); {
log(L_ERR "Cannot create control socket %s: %m", cf->name);
return NULL;
}
if (use_uid || use_gid) if (cf->uid || cf->gid)
if (chown(path_control_socket, use_uid, use_gid) < 0) if (chown(cf->name, cf->uid, cf->gid) < 0)
die("chown: %m"); {
log(L_ERR "Cannot chown control socket %s: %m", cf->name);
return NULL;
}
if (chmod(path_control_socket, 0660) < 0) if (chmod(cf->name, cf->mode) < 0)
die("chmod: %m"); {
log(L_ERR "Cannot chmod control socket %s: %m", cf->name);
return NULL;
}
return l;
} }
static void
cli_init_unix(uid_t use_uid, gid_t use_gid)
{
ASSERT_DIE(main_control_socket_config == NULL);
main_control_socket_config = mb_alloc(&root_pool, sizeof *main_control_socket_config);
*main_control_socket_config = (struct cli_config) {
.name = path_control_socket,
.uid = use_uid,
.gid = use_gid,
.mode = 0660,
};
ASSERT_DIE(main_control_socket == NULL);
cli_init();
main_control_socket = cli_listener(main_control_socket_config);
if (!main_control_socket)
die("Won't run without control socket");
}
/* /*
* PID file * PID file
*/ */

View File

@ -114,7 +114,7 @@ extern volatile sig_atomic_t async_shutdown_flag;
void io_init(void); void io_init(void);
void io_loop(void); void io_loop(void);
void io_log_dump(void); void io_log_dump(void);
int sk_open_unix(struct birdsock *s, struct birdloop *, char *name); int sk_open_unix(struct birdsock *s, struct birdloop *, const char *name);
enum rf_mode { enum rf_mode {
RF_APPEND = 1, RF_APPEND = 1,