// Let systemd know that we are shutting down
sd_notify(0, "STOPPING=1\n" "STATUS=Shutting down...");
+ // Save the configuration
+ r = nw_daemon_save(daemon);
+ if (r)
+ goto ERROR;
+
// Cleanup everything
nw_daemon_cleanup(daemon);
return 0;
}
+/*
+ Saves the configuration to disk
+*/
+int nw_daemon_save(nw_daemon* daemon) {
+ int r;
+
+ DEBUG("Saving configuration...\n");
+
+ // Save settings
+ r = nw_config_write(daemon->config);
+ if (r)
+ return r;
+
+ // Save ports
+ r = nw_ports_save(daemon->ports);
+ if (r)
+ return r;
+
+ // Save zones
+ r = nw_zones_save(daemon->zones);
+ if (r)
+ return r;
+
+ return 0;
+}
+
/*
Netlink
*/
int nw_daemon_reload(nw_daemon* daemon);
+int nw_daemon_save(nw_daemon* daemon);
+
/*
Netlink
*/
#include "daemon.h"
#include "logging.h"
+#include "port.h"
static int cap_acquire_setpcap(void) {
cap_flag_value_t value;
return NULL;
}
+int nw_port_save(nw_port* port) {
+ int r;
+
+ r = nw_config_write(port->config);
+ if (r)
+ return r;
+
+ return 0;
+}
+
const char* nw_port_name(nw_port* port) {
return port->name;
}
nw_port* nw_port_ref(nw_port* port);
nw_port* nw_port_unref(nw_port* port);
+int nw_port_save(nw_port* port);
+
const char* nw_port_name(nw_port* port);
char* nw_port_bus_path(nw_port* port);
return NULL;
}
+int nw_ports_save(nw_ports* ports) {
+ struct nw_ports_entry* entry = NULL;
+ int r;
+
+ STAILQ_FOREACH(entry, &ports->entries, nodes) {
+ r = nw_port_save(entry->port);
+ if (r)
+ return r;
+ }
+
+ return 0;
+}
+
static int nw_ports_add_port(nw_ports* ports, nw_port* port) {
// Allocate a new entry
struct nw_ports_entry* entry = calloc(1, sizeof(*entry));
nw_ports* nw_ports_ref(nw_ports* ports);
nw_ports* nw_ports_unref(nw_ports* ports);
+int nw_ports_save(nw_ports* ports);
+
int nw_ports_enumerate(nw_ports* ports);
struct nw_port* nw_ports_get_by_name(nw_ports* ports, const char* name);
return NULL;
}
+int nw_zone_save(nw_zone* zone) {
+ int r;
+
+ r = nw_config_write(zone->config);
+ if (r)
+ return r;
+
+ return 0;
+}
+
const char* nw_zone_name(nw_zone* zone) {
return zone->name;
}
nw_zone* nw_zone_ref(nw_zone* zone);
nw_zone* nw_zone_unref(nw_zone* zone);
+int nw_zone_save(nw_zone* zone);
+
const char* nw_zone_name(nw_zone* zone);
char* nw_zone_bus_path(nw_zone* zone);
return NULL;
}
+int nw_zones_save(nw_zones* zones) {
+ struct nw_zones_entry* entry = NULL;
+ int r;
+
+ STAILQ_FOREACH(entry, &zones->entries, nodes) {
+ r = nw_zone_save(entry->zone);
+ if (r)
+ return r;
+ }
+
+ return 0;
+}
+
static int nw_zones_add_zone(nw_zones* zones, nw_zone* zone) {
// Allocate a new entry
struct nw_zones_entry* entry = calloc(1, sizeof(*entry));
nw_zones* nw_zones_ref(nw_zones* zones);
nw_zones* nw_zones_unref(nw_zones* zones);
+int nw_zones_save(nw_zones* zones);
+
int nw_zones_enumerate(nw_zones* zones);
size_t nw_zones_num(nw_zones* zones);