mirror of
https://gitlab.com/sortix/sortix.git
synced 2023-02-13 20:55:38 -05:00
Add network interface support to init(8).
This commit is contained in:
parent
08ddcc89b8
commit
3da0728fd5
4 changed files with 75 additions and 3 deletions
53
init/init.c
53
init/init.c
|
@ -38,6 +38,7 @@
|
||||||
#include <ioleast.h>
|
#include <ioleast.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
|
#include <net/if.h>
|
||||||
#include <poll.h>
|
#include <poll.h>
|
||||||
#include <psctl.h>
|
#include <psctl.h>
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
|
@ -242,6 +243,7 @@ struct daemon_config
|
||||||
int argc;
|
int argc;
|
||||||
char** argv;
|
char** argv;
|
||||||
enum exit_code_meaning exit_code_meaning;
|
enum exit_code_meaning exit_code_meaning;
|
||||||
|
bool per_if;
|
||||||
bool need_tty;
|
bool need_tty;
|
||||||
enum log_method log_method;
|
enum log_method log_method;
|
||||||
enum log_format log_format;
|
enum log_format log_format;
|
||||||
|
@ -1197,6 +1199,14 @@ static bool daemon_process_command(struct daemon_config* daemon_config,
|
||||||
else
|
else
|
||||||
daemon_config->log_size = (off_t) value;
|
daemon_config->log_size = (off_t) value;
|
||||||
}
|
}
|
||||||
|
else if ( !strcmp(argv[0], "per") )
|
||||||
|
{
|
||||||
|
if ( !strcmp(argv[1], "if") )
|
||||||
|
daemon_config->per_if = true;
|
||||||
|
else
|
||||||
|
warning("%s:%ji: unknown %s: %s",
|
||||||
|
path, (intmax_t) line_number, argv[0], argv[1]);
|
||||||
|
}
|
||||||
else if ( !strcmp(argv[0], "need") )
|
else if ( !strcmp(argv[0], "need") )
|
||||||
{
|
{
|
||||||
if ( !strcmp(argv[1], "tty") )
|
if ( !strcmp(argv[1], "tty") )
|
||||||
|
@ -1310,6 +1320,17 @@ static bool daemon_process_command(struct daemon_config* daemon_config,
|
||||||
default_config.log_rotate_on_start;
|
default_config.log_rotate_on_start;
|
||||||
else if ( !strcmp(argv[1], "log-size") )
|
else if ( !strcmp(argv[1], "log-size") )
|
||||||
daemon_config->log_line_size = default_config.log_line_size;
|
daemon_config->log_line_size = default_config.log_line_size;
|
||||||
|
else if ( !strcmp(argv[1], "per") )
|
||||||
|
{
|
||||||
|
if ( argc < 3 )
|
||||||
|
warning("%s:%ji: expected parameter: %s: %s",
|
||||||
|
path, (intmax_t) line_number, argv[0], argv[1]);
|
||||||
|
else if ( !strcmp(argv[2], "if") )
|
||||||
|
daemon_config->per_if = false;
|
||||||
|
else
|
||||||
|
warning("%s:%ji: %s %s: unknown: %s", path,
|
||||||
|
(intmax_t) line_number, argv[0], argv[1], argv[2]);
|
||||||
|
}
|
||||||
else if ( !strcmp(argv[1], "need") )
|
else if ( !strcmp(argv[1], "need") )
|
||||||
{
|
{
|
||||||
if ( argc < 3 )
|
if ( argc < 3 )
|
||||||
|
@ -1734,8 +1755,36 @@ static void daemon_configure_sub(struct daemon* daemon,
|
||||||
static void daemon_configure(struct daemon* daemon,
|
static void daemon_configure(struct daemon* daemon,
|
||||||
struct daemon_config* daemon_config)
|
struct daemon_config* daemon_config)
|
||||||
{
|
{
|
||||||
// Parameterized daemons will be instatiated here later on.
|
if ( daemon_config->per_if )
|
||||||
daemon_configure_sub(daemon, daemon_config, NULL);
|
{
|
||||||
|
struct if_nameindex* ifs = if_nameindex();
|
||||||
|
if ( !ifs )
|
||||||
|
fatal("if_nameindex: %m");
|
||||||
|
for ( size_t i = 0; ifs[i].if_name; i++ )
|
||||||
|
{
|
||||||
|
const char* netif = ifs[i].if_name;
|
||||||
|
char* parameterized_name;
|
||||||
|
if ( asprintf(¶meterized_name, "%s.%s",
|
||||||
|
daemon_config->name, netif) < 0 )
|
||||||
|
fatal("malloc: %m");
|
||||||
|
struct daemon* parameterized =
|
||||||
|
daemon_create_unconfigured(parameterized_name);
|
||||||
|
free(parameterized_name);
|
||||||
|
if ( !(parameterized->netif = strdup(netif)) )
|
||||||
|
fatal("malloc: %m");
|
||||||
|
char* name_clone = strdup(parameterized->name);
|
||||||
|
if ( !name_clone )
|
||||||
|
fatal("malloc: %m");
|
||||||
|
int flags = DEPENDENCY_FLAG_REQUIRE | DEPENDENCY_FLAG_AWAIT;
|
||||||
|
if ( !daemon_add_dependency(daemon, parameterized, flags) )
|
||||||
|
fatal("malloc: %m");
|
||||||
|
daemon_configure_sub(parameterized, daemon_config, netif);
|
||||||
|
}
|
||||||
|
if_freenameindex(ifs);
|
||||||
|
daemon->configured = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
daemon_configure_sub(daemon, daemon_config, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct daemon* daemon_create(struct daemon_config* daemon_config)
|
static struct daemon* daemon_create(struct daemon_config* daemon_config)
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
|
require network optional
|
||||||
require time optional
|
require time optional
|
||||||
|
|
0
share/init/network
Normal file
0
share/init/network
Normal file
|
@ -149,8 +149,10 @@ The following daemons are provided by the system:
|
||||||
.It Sy base
|
.It Sy base
|
||||||
Virtual daemon that depends on the core operating system daemons.
|
Virtual daemon that depends on the core operating system daemons.
|
||||||
It depends on the
|
It depends on the
|
||||||
|
.Sy network
|
||||||
|
and
|
||||||
.Sy time
|
.Sy time
|
||||||
daemon.
|
daemons.
|
||||||
.It Sy local
|
.It Sy local
|
||||||
Virtual daemon that starts daemons pertinent to the local system.
|
Virtual daemon that starts daemons pertinent to the local system.
|
||||||
The system provides a default implementation that does nothing.
|
The system provides a default implementation that does nothing.
|
||||||
|
@ -158,6 +160,11 @@ The system administrator is meant to override the daemon in
|
||||||
.Pa /etc/init/local
|
.Pa /etc/init/local
|
||||||
by depending on daemons outside of the base system that should run on the local
|
by depending on daemons outside of the base system that should run on the local
|
||||||
system.
|
system.
|
||||||
|
.It Sy network
|
||||||
|
Virtual daemon that becomes ready when an attempt has been made to establish
|
||||||
|
network connectivity.
|
||||||
|
Daemons can depend on this daemon if they need the network to have been
|
||||||
|
established before they start.
|
||||||
.It Sy time
|
.It Sy time
|
||||||
Virtual daemon that becomes ready when the current date and time has been
|
Virtual daemon that becomes ready when the current date and time has been
|
||||||
established.
|
established.
|
||||||
|
@ -388,6 +395,21 @@ daemon readiness protocol.
|
||||||
Upon exit, the original terminal settings are restored and
|
Upon exit, the original terminal settings are restored and
|
||||||
.Xr init 8
|
.Xr init 8
|
||||||
reclaims ownership of the terminal.
|
reclaims ownership of the terminal.
|
||||||
|
.It Sy per if
|
||||||
|
Specifies that an instance of the daemon should run for each network interface.
|
||||||
|
The daemon becomes a virtual daemon that depends on on the instantiated daemons
|
||||||
|
for each network interface.
|
||||||
|
The name of each instantiated daemon is the name of the virtual daemon plus
|
||||||
|
.Sq "."
|
||||||
|
plus the name of the network interface (e.g.
|
||||||
|
.Sy exampled
|
||||||
|
running on the loopback interface
|
||||||
|
.Sy lo0
|
||||||
|
would be
|
||||||
|
.Sy example.lo0 ) .
|
||||||
|
The name of the network interface is appended as a command line argument on the
|
||||||
|
command line of each instantiated daemon.
|
||||||
|
It is not possible to depend on the instantiated daemons.
|
||||||
.It Sy require Ar dependency Oo Ar flag ... Oc
|
.It Sy require Ar dependency Oo Ar flag ... Oc
|
||||||
When the daemon is needed, start the
|
When the daemon is needed, start the
|
||||||
.Ar dependency
|
.Ar dependency
|
||||||
|
|
Loading…
Add table
Reference in a new issue