manager: add basic support for loading name fragment files
This commit is contained in:
parent
57d42a5f66
commit
223dabab49
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
||||||
CFLAGS=-Wall -Wextra -O0 -g -pipe -D_GNU_SOURCE -fdiagnostics-show-option -Wno-unused-parameter
|
CFLAGS=-Wall -Wextra -O0 -g -pipe -D_GNU_SOURCE -fdiagnostics-show-option -Wno-unused-parameter
|
||||||
LIBS=-lrt
|
LIBS=-lrt
|
||||||
|
|
||||||
systemd: main.o name.o util.o set.o hashmap.o strv.o job.o manager.o conf-parser.o
|
systemd: main.o name.o util.o set.o hashmap.o strv.o job.o manager.o conf-parser.o load-fragment.o
|
||||||
$(CC) $(CFLAGS) -o $@ $^ $(LIBS)
|
$(CC) $(CFLAGS) -o $@ $^ $(LIBS)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
|
56
manager.c
56
manager.c
|
@ -7,6 +7,7 @@
|
||||||
#include "hashmap.h"
|
#include "hashmap.h"
|
||||||
#include "macro.h"
|
#include "macro.h"
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
|
#include "load-fragment.h"
|
||||||
|
|
||||||
Manager* manager_new(void) {
|
Manager* manager_new(void) {
|
||||||
Manager *m;
|
Manager *m;
|
||||||
|
@ -166,27 +167,20 @@ static int detect_type(Name *name) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fragment_load(Name *n) {
|
static int service_load_sysv(Service *s) {
|
||||||
assert(n);
|
|
||||||
|
|
||||||
/*... */
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int sysv_load(Service *s) {
|
|
||||||
assert(s);
|
assert(s);
|
||||||
|
|
||||||
/*... */
|
/* Load service data from SysV init scripts, preferably with
|
||||||
|
* LSB headers ... */
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fstab_load(Name *n) {
|
static int name_load_fstab(Name *n) {
|
||||||
assert(n);
|
assert(n);
|
||||||
assert(n->meta.type == NAME_MOUNT || n->meta.type == NAME_AUTOMOUNT);
|
assert(n->meta.type == NAME_MOUNT || n->meta.type == NAME_AUTOMOUNT);
|
||||||
|
|
||||||
/*... */
|
/* Load mount data from /etc/fstab */
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -194,7 +188,15 @@ static int fstab_load(Name *n) {
|
||||||
static int snapshot_load(Snapshot *s) {
|
static int snapshot_load(Snapshot *s) {
|
||||||
assert(s);
|
assert(s);
|
||||||
|
|
||||||
/*... */
|
/* Load snapshots from disk */
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int name_load_dropin(Name *n) {
|
||||||
|
assert(n);
|
||||||
|
|
||||||
|
/* Load dependencies from drop-in directories */
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -213,18 +215,18 @@ static int load(Name *name) {
|
||||||
if (name->meta.type == NAME_SERVICE) {
|
if (name->meta.type == NAME_SERVICE) {
|
||||||
|
|
||||||
/* Load a .service file */
|
/* Load a .service file */
|
||||||
if ((r = fragment_load(name)) == 0)
|
if ((r = name_load_fragment(name)) == 0)
|
||||||
goto finish;
|
goto finish;
|
||||||
|
|
||||||
/* Load a classic init script */
|
/* Load a classic init script */
|
||||||
if (r == -ENOENT)
|
if (r == -ENOENT)
|
||||||
if ((r = sysv_load(SERVICE(name))) == 0)
|
if ((r = service_load_sysv(SERVICE(name))) == 0)
|
||||||
goto finish;
|
goto finish;
|
||||||
|
|
||||||
} else if (name->meta.type == NAME_MOUNT ||
|
} else if (name->meta.type == NAME_MOUNT ||
|
||||||
name->meta.type == NAME_AUTOMOUNT) {
|
name->meta.type == NAME_AUTOMOUNT) {
|
||||||
|
|
||||||
if ((r = fstab_load(name)) == 0)
|
if ((r = name_load_fstab(name)) == 0)
|
||||||
goto finish;
|
goto finish;
|
||||||
|
|
||||||
} else if (name->meta.type == NAME_SNAPSHOT) {
|
} else if (name->meta.type == NAME_SNAPSHOT) {
|
||||||
|
@ -233,7 +235,7 @@ static int load(Name *name) {
|
||||||
goto finish;
|
goto finish;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if ((r = fragment_load(name)) == 0)
|
if ((r = name_load_fragment(name)) == 0)
|
||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,6 +243,9 @@ static int load(Name *name) {
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
finish:
|
finish:
|
||||||
|
if ((r = name_load_dropin(name)) < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
name->meta.state = NAME_LOADED;
|
name->meta.state = NAME_LOADED;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -250,6 +255,12 @@ static int dispatch_load_queue(Manager *m) {
|
||||||
|
|
||||||
assert(m);
|
assert(m);
|
||||||
|
|
||||||
|
/* Make sure we are not run recursively */
|
||||||
|
if (m->dispatching_load_queue)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
m->dispatching_load_queue = true;
|
||||||
|
|
||||||
/* Dispatches the load queue. Takes a name from the queue and
|
/* Dispatches the load queue. Takes a name from the queue and
|
||||||
* tries to load its data until the queue is empty */
|
* tries to load its data until the queue is empty */
|
||||||
|
|
||||||
|
@ -258,11 +269,11 @@ static int dispatch_load_queue(Manager *m) {
|
||||||
LIST_REMOVE(Meta, m->load_queue, meta);
|
LIST_REMOVE(Meta, m->load_queue, meta);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m->dispatching_load_queue = false;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int manager_load_name(Manager *m, const char *name, Name **_ret) {
|
int manager_load_name(Manager *m, const char *name, Name **_ret) {
|
||||||
Name *ret;
|
Name *ret;
|
||||||
NameType t;
|
NameType t;
|
||||||
|
@ -271,9 +282,12 @@ int manager_load_name(Manager *m, const char *name, Name **_ret) {
|
||||||
assert(m);
|
assert(m);
|
||||||
assert(name);
|
assert(name);
|
||||||
assert(_ret);
|
assert(_ret);
|
||||||
/* This will load the service information files, but not actually
|
|
||||||
* start any services or anything */
|
|
||||||
|
|
||||||
|
if (!name_is_valid(name))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
/* This will load the service information files, but not actually
|
||||||
|
* start any services or anything */
|
||||||
|
|
||||||
if ((ret = manager_get_name(m, name)))
|
if ((ret = manager_get_name(m, name)))
|
||||||
goto finish;
|
goto finish;
|
||||||
|
|
|
@ -27,6 +27,8 @@ struct Manager {
|
||||||
/* Jobs to be added resp. removed. */
|
/* Jobs to be added resp. removed. */
|
||||||
Hashmap *jobs_to_add; /* Name object => Job object 1:1 */
|
Hashmap *jobs_to_add; /* Name object => Job object 1:1 */
|
||||||
Set *jobs_to_remove;
|
Set *jobs_to_remove;
|
||||||
|
|
||||||
|
bool dispatching_load_queue:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
Manager* manager_new(void);
|
Manager* manager_new(void);
|
||||||
|
|
Loading…
Reference in New Issue