projects
/
project
/
procd.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
make procd wait for ubus to come up
[project/procd.git]
/
inittab.c
diff --git
a/inittab.c
b/inittab.c
index
32be11f
..
c8540b1
100644
(file)
--- a/
inittab.c
+++ b/
inittab.c
@@
-20,11
+20,13
@@
#include <stdlib.h>
#include <unistd.h>
#include <regex.h>
#include <stdlib.h>
#include <unistd.h>
#include <regex.h>
+#include <ctype.h>
#include <libubox/utils.h>
#include <libubox/list.h>
#include "procd.h"
#include <libubox/utils.h>
#include <libubox/list.h>
#include "procd.h"
+#include "rcS.h"
#define TAG_ID 0
#define TAG_RUNLVL 1
#define TAG_ID 0
#define TAG_RUNLVL 1
@@
-39,7
+41,7
@@
const char *console;
struct init_handler {
const char *name;
void (*cb) (struct init_action *a);
struct init_handler {
const char *name;
void (*cb) (struct init_action *a);
- int
atomic
;
+ int
multi
;
};
struct init_action {
};
struct init_action {
@@
-52,7
+54,6
@@
struct init_action {
struct init_handler *handler;
struct uloop_process proc;
struct init_handler *handler;
struct uloop_process proc;
- int pending;
int respawn;
struct uloop_timeout tout;
};
int respawn;
struct uloop_timeout tout;
};
@@
-60,11
+61,9
@@
struct init_action {
static const char *tab = "/etc/inittab";
static char *ask = "/sbin/askfirst";
static const char *tab = "/etc/inittab";
static char *ask = "/sbin/askfirst";
-static struct init_action *pending;
-
static LIST_HEAD(actions);
static LIST_HEAD(actions);
-static void fork_
script
(struct init_action *a)
+static void fork_
worker
(struct init_action *a)
{
a->proc.pid = fork();
if (!a->proc.pid) {
{
a->proc.pid = fork();
if (!a->proc.pid) {
@@
-74,7
+73,7
@@
static void fork_script(struct init_action *a)
}
if (a->proc.pid > 0) {
}
if (a->proc.pid > 0) {
- DEBUG(
2
, "Launched new %s action, pid=%d\n",
+ DEBUG(
4
, "Launched new %s action, pid=%d\n",
a->handler->name,
(int) a->proc.pid);
uloop_process_add(&a->proc);
a->handler->name,
(int) a->proc.pid);
uloop_process_add(&a->proc);
@@
-85,26
+84,28
@@
static void child_exit(struct uloop_process *proc, int ret)
{
struct init_action *a = container_of(proc, struct init_action, proc);
{
struct init_action *a = container_of(proc, struct init_action, proc);
- DEBUG(2, "pid:%d\n", proc->pid);
- if (a->tout.cb) {
- uloop_timeout_set(&a->tout, a->respawn);
- } else {
- a->pending = 0;
- pending = NULL;
- procd_state_next();
- }
+ DEBUG(4, "pid:%d\n", proc->pid);
+ uloop_timeout_set(&a->tout, a->respawn);
}
static void respawn(struct uloop_timeout *tout)
{
struct init_action *a = container_of(tout, struct init_action, tout);
}
static void respawn(struct uloop_timeout *tout)
{
struct init_action *a = container_of(tout, struct init_action, tout);
- fork_
script
(a);
+ fork_
worker
(a);
}
}
-static void r
unscript(struct init_action *a
)
+static void r
cdone(struct runqueue *q
)
{
{
- a->proc.cb = child_exit;
- fork_script(a);
+ procd_state_next();
+}
+
+static void runrc(struct init_action *a)
+{
+ if (!a->argv[1] || !a->argv[2]) {
+ ERROR("valid format is rcS <S|K> <param>\n");
+ return;
+ }
+ rcS(a->argv[1], a->argv[2], rcdone);
}
static void askfirst(struct init_action *a)
}
static void askfirst(struct init_action *a)
@@
-116,7
+117,7
@@
static void askfirst(struct init_action *a)
i = stat(a->id, &s);
chdir("/");
if (i || (console && !strcmp(console, a->id))) {
i = stat(a->id, &s);
chdir("/");
if (i || (console && !strcmp(console, a->id))) {
- DEBUG(
2
, "Skipping %s\n", a->id);
+ DEBUG(
4
, "Skipping %s\n", a->id);
return;
}
return;
}
@@
-128,7
+129,7
@@
static void askfirst(struct init_action *a)
a->respawn = 500;
a->proc.cb = child_exit;
a->respawn = 500;
a->proc.cb = child_exit;
- fork_
script
(a);
+ fork_
worker
(a);
}
static void askconsole(struct init_action *a)
}
static void askconsole(struct init_action *a)
@@
-139,7
+140,7
@@
static void askconsole(struct init_action *a)
regex_t pat_cmdline;
regmatch_t matches[2];
regex_t pat_cmdline;
regmatch_t matches[2];
- if (
!fd
)
+ if (
fd < 0
)
return;
r = read(fd, line, sizeof(line) - 1);
return;
r = read(fd, line, sizeof(line) - 1);
@@
-156,7
+157,7
@@
static void askconsole(struct init_action *a)
i = stat(tty, &s);
chdir("/");
if (i) {
i = stat(tty, &s);
chdir("/");
if (i) {
- DEBUG(
2
, "skipping %s\n", tty);
+ DEBUG(
4
, "skipping %s\n", tty);
goto err_out;
}
console = strdup(tty);
goto err_out;
}
console = strdup(tty);
@@
-169,26
+170,40
@@
static void askconsole(struct init_action *a)
a->respawn = 500;
a->proc.cb = child_exit;
a->respawn = 500;
a->proc.cb = child_exit;
- fork_script(a);
+ fork_worker(a);
+
err_out:
regfree(&pat_cmdline);
}
err_out:
regfree(&pat_cmdline);
}
+static void rcrespawn(struct init_action *a)
+{
+ a->tout.cb = respawn;
+ a->respawn = 500;
+
+ a->proc.cb = child_exit;
+ fork_worker(a);
+}
+
static struct init_handler handlers[] = {
{
.name = "sysinit",
static struct init_handler handlers[] = {
{
.name = "sysinit",
- .cb = run
script
,
+ .cb = run
rc
,
}, {
.name = "shutdown",
}, {
.name = "shutdown",
- .cb = run
script
,
+ .cb = run
rc
,
}, {
.name = "askfirst",
.cb = askfirst,
}, {
.name = "askfirst",
.cb = askfirst,
- .
atomic
= 1,
+ .
multi
= 1,
}, {
.name = "askconsole",
.cb = askconsole,
}, {
.name = "askconsole",
.cb = askconsole,
- .atomic = 1,
+ .multi = 1,
+ }, {
+ .name = "respawn",
+ .cb = rcrespawn,
+ .multi = 1,
}
};
}
};
@@
-212,15
+227,12
@@
void procd_inittab_run(const char *handler)
list_for_each_entry(a, &actions, list)
if (!strcmp(a->handler->name, handler)) {
list_for_each_entry(a, &actions, list)
if (!strcmp(a->handler->name, handler)) {
- if (a->handler->
atomic
) {
+ if (a->handler->
multi
) {
a->handler->cb(a);
continue;
}
a->handler->cb(a);
continue;
}
- if (pending || a->pending)
- break;
- a->pending = 1;
- pending = a;
a->handler->cb(a);
a->handler->cb(a);
+ break;
}
}
}
}
@@
-238,7
+250,7
@@
void procd_inittab(void)
return;
}
return;
}
- regcomp(&pat_inittab, "([a-zA-Z0-9]*):([a-zA-Z0-9]*):([a-zA-Z0-9]*):(
[a-zA-Z0-9/[.-.]. ]
*)", REG_EXTENDED);
+ regcomp(&pat_inittab, "([a-zA-Z0-9]*):([a-zA-Z0-9]*):([a-zA-Z0-9]*):(
.
*)", REG_EXTENDED);
line = malloc(LINE_LEN);
a = malloc(sizeof(struct init_action));
memset(a, 0, sizeof(struct init_action));
line = malloc(LINE_LEN);
a = malloc(sizeof(struct init_action));
memset(a, 0, sizeof(struct init_action));
@@
-247,6
+259,11
@@
void procd_inittab(void)
char *tags[TAG_PROCESS + 1];
char *tok;
int i;
char *tags[TAG_PROCESS + 1];
char *tok;
int i;
+ int len = strlen(line);
+
+ while (isspace(line[len - 1]))
+ len--;
+ line[len] = 0;
if (*line == '#')
continue;
if (*line == '#')
continue;
@@
-254,7
+271,7
@@
void procd_inittab(void)
if (regexec(&pat_inittab, line, 5, matches, 0))
continue;
if (regexec(&pat_inittab, line, 5, matches, 0))
continue;
- DEBUG(
2
, "Parsing inittab - %s", line);
+ DEBUG(
4
, "Parsing inittab - %s", line);
for (i = TAG_ID; i <= TAG_PROCESS; i++) {
line[matches[i].rm_eo] = '\0';
for (i = TAG_ID; i <= TAG_PROCESS; i++) {
line[matches[i].rm_eo] = '\0';
@@
-262,7
+279,7
@@
void procd_inittab(void)
};
tok = strtok(tags[TAG_PROCESS], " ");
};
tok = strtok(tags[TAG_PROCESS], " ");
- for (i = 0; i < (MAX_ARGS -
i -
1) && tok; i++) {
+ for (i = 0; i < (MAX_ARGS - 1) && tok; i++) {
a->argv[i] = tok;
tok = strtok(NULL, " ");
}
a->argv[i] = tok;
tok = strtok(NULL, " ");
}