Skip to content

Commit

Permalink
zebra: separate zebra ZAPI server open and accept
Browse files Browse the repository at this point in the history
Separate zebra's ZAPI server socket handling into two phases:
an early phase that opens the socket, and a later phase that
starts listening for client connections.

Signed-off-by: Mark Stapp <[email protected]>
(cherry picked from commit 506097a)
  • Loading branch information
Mark Stapp authored and mergify[bot] committed Dec 3, 2024
1 parent 63be9cf commit 6f677fc
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 5 deletions.
3 changes: 3 additions & 0 deletions zebra/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -418,6 +418,9 @@ int main(int argc, char **argv)
zebra_if_init();
zebra_debug_init();

/* Open Zebra API server socket */
zserv_open(zserv_path);

/*
* Initialize NS( and implicitly the VRF module), and make kernel
* routing socket. */
Expand Down
32 changes: 30 additions & 2 deletions zebra/zserv.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ extern struct zebra_privs_t zserv_privs;

/* The listener socket for clients connecting to us */
static int zsock;
static bool started_p;

/* The lock that protects access to zapi client objects */
static pthread_mutex_t client_mutex;
Expand Down Expand Up @@ -890,9 +891,16 @@ void zserv_close(void)

/* Free client list's mutex */
pthread_mutex_destroy(&client_mutex);

started_p = false;
}

void zserv_start(char *path)

/*
* Open zebra's ZAPI listener socket. This is done early during startup,
* before zebra is ready to listen and accept client connections.
*/
void zserv_open(const char *path)
{
int ret;
mode_t old_mask;
Expand Down Expand Up @@ -934,6 +942,26 @@ void zserv_start(char *path)
path, safe_strerror(errno));
close(zsock);
zsock = -1;
}

umask(old_mask);
}

/*
* Start listening for ZAPI client connections.
*/
void zserv_start(const char *path)
{
int ret;

/* This may be called more than once during startup - potentially once
* per netns - but only do this work once.
*/
if (started_p)
return;

if (zsock <= 0) {
flog_err_sys(EC_LIB_SOCKET, "Zserv socket open failed");
return;
}

Expand All @@ -947,7 +975,7 @@ void zserv_start(char *path)
return;
}

umask(old_mask);
started_p = true;

zserv_event(NULL, ZSERV_ACCEPT);
}
Expand Down
15 changes: 12 additions & 3 deletions zebra/zserv.h
Original file line number Diff line number Diff line change
Expand Up @@ -254,16 +254,25 @@ extern void zserv_init(void);
*/
extern void zserv_close(void);

/*
* Open Zebra API server socket.
*
* Create and open the server socket.
*
* path
* where to place the Unix domain socket
*/
extern void zserv_open(const char *path);

/*
* Start Zebra API server.
*
* Allocates resources, creates the server socket and begins listening on the
* socket.
* Allocates resources and begins listening on the server socket.
*
* path
* where to place the Unix domain socket
*/
extern void zserv_start(char *path);
extern void zserv_start(const char *path);

/*
* Send a message to a connected Zebra API client.
Expand Down

0 comments on commit 6f677fc

Please sign in to comment.