mirror of
https://github.com/troglobit/finit.git
synced 2026-10-26 12:14:37 +00:00
Refactor svc_iterator() into a proper iterator, add first flag
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
This commit is contained in:
1 parent
95518df62d
commit
8992e7bf2b
7 files changed
+83
-73
No files matched your search
+2
-2
@@ -95,13 +95,13 @@ static void pidfile_callback(void *arg, int fd, int events)
|
|||||||
static void pidfile_reconf(void *arg)
|
static void pidfile_reconf(void *arg)
|
||||||
{
|
{
|
||||||
static char cond[MAX_COND_LEN];
|
static char cond[MAX_COND_LEN];
|
||||||
svc_t *svc;
|
svc_t *svc, *iter = NULL;
|
||||||
int restart = 0;
|
int restart = 0;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
restart = 0;
|
restart = 0;
|
||||||
|
|
||||||
for (svc = svc_iterator(NULL); svc; svc = svc_iterator(svc)) {
|
for (svc = svc_iterator(&iter, 1); svc; svc = svc_iterator(&iter, 0)) {
|
||||||
mkcond(cond, sizeof(cond), svc->cmd);
|
mkcond(cond, sizeof(cond), svc->cmd);
|
||||||
if (svc->state == SVC_RUNNING_STATE &&
|
if (svc->state == SVC_RUNNING_STATE &&
|
||||||
!svc_is_changed(svc) &&
|
!svc_is_changed(svc) &&
|
||||||
|
|||||||
@@ -225,7 +225,8 @@ static void send_svc(int sd, svc_t *svc)
|
|||||||
static void api_cb(uev_t *w, void *arg, int events)
|
static void api_cb(uev_t *w, void *arg, int events)
|
||||||
{
|
{
|
||||||
int sd, lvl;
|
int sd, lvl;
|
||||||
static svc_t *svc;
|
svc_t *svc;
|
||||||
|
static svc_t *iter = NULL;
|
||||||
struct init_request rq;
|
struct init_request rq;
|
||||||
|
|
||||||
sd = accept(w->fd, NULL, NULL);
|
sd = accept(w->fd, NULL, NULL);
|
||||||
@@ -351,7 +352,7 @@ static void api_cb(uev_t *w, void *arg, int events)
|
|||||||
* simultaneous client connections, but will
|
* simultaneous client connections, but will
|
||||||
* have to do for now.
|
* have to do for now.
|
||||||
*/
|
*/
|
||||||
svc = svc_iterator(rq.runlevel ? NULL : svc);
|
svc = svc_iterator(&iter, rq.runlevel);
|
||||||
send_svc(sd, svc);
|
send_svc(sd, svc);
|
||||||
goto leave;
|
goto leave;
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -88,10 +88,10 @@ static int svc_has_cond(svc_t *svc)
|
|||||||
|
|
||||||
static void cond_update(const char *name)
|
static void cond_update(const char *name)
|
||||||
{
|
{
|
||||||
svc_t *svc;
|
svc_t *svc, *iter = NULL;
|
||||||
|
|
||||||
_d("%s", name);
|
_d("%s", name);
|
||||||
for (svc = svc_iterator(NULL); svc; svc = svc_iterator(svc)) {
|
for (svc = svc_iterator(&iter, 1); svc; svc = svc_iterator(&iter, 0)) {
|
||||||
if (!svc_has_cond(svc) || !cond_affects(name, svc->cond))
|
if (!svc_has_cond(svc) || !cond_affects(name, svc->cond))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -225,10 +225,10 @@ static void socket_cb(uev_t *w, void *arg, int events)
|
|||||||
*/
|
*/
|
||||||
int inetd_check_loop(struct sockaddr *sa, socklen_t len, char *name)
|
int inetd_check_loop(struct sockaddr *sa, socklen_t len, char *name)
|
||||||
{
|
{
|
||||||
svc_t *svc;
|
svc_t *svc, *iter = NULL;
|
||||||
char pname[NI_MAXHOST];
|
char pname[NI_MAXHOST];
|
||||||
|
|
||||||
for (svc = svc_inetd_iterator(NULL); svc; svc = svc_inetd_iterator(svc)) {
|
for (svc = svc_inetd_iterator(&iter, 1); svc; svc = svc_inetd_iterator(&iter, 0)) {
|
||||||
inetd_t *i = &svc->inetd;
|
inetd_t *i = &svc->inetd;
|
||||||
|
|
||||||
if (!i->builtin || i->type != SOCK_DGRAM)
|
if (!i->builtin || i->type != SOCK_DGRAM)
|
||||||
@@ -665,9 +665,9 @@ int inetd_filter_str(inetd_t *inetd, char *str, size_t len)
|
|||||||
|
|
||||||
svc_t *inetd_find_svc(char *path, char *service, char *proto)
|
svc_t *inetd_find_svc(char *path, char *service, char *proto)
|
||||||
{
|
{
|
||||||
svc_t *svc;
|
svc_t *svc, *iter = NULL;
|
||||||
|
|
||||||
for (svc = svc_inetd_iterator(NULL); svc; svc = svc_inetd_iterator(svc)) {
|
for (svc = svc_inetd_iterator(&iter, 1); svc; svc = svc_inetd_iterator(&iter, 0)) {
|
||||||
if (strncmp(path, svc->cmd, strlen(svc->cmd)))
|
if (strncmp(path, svc->cmd, strlen(svc->cmd)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -1027,9 +1027,9 @@ void service_step_all(int types)
|
|||||||
*/
|
*/
|
||||||
void service_runtask_clean(void)
|
void service_runtask_clean(void)
|
||||||
{
|
{
|
||||||
svc_t *svc;
|
svc_t *svc, *iter = NULL;
|
||||||
|
|
||||||
for (svc = svc_iterator(NULL); svc; svc = svc_iterator(svc)) {
|
for (svc = svc_iterator(&iter, 1); svc; svc = svc_iterator(&iter, 0)) {
|
||||||
if (!svc_is_runtask(svc))
|
if (!svc_is_runtask(svc))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -1056,9 +1056,9 @@ void service_runtask_clean(void)
|
|||||||
*/
|
*/
|
||||||
int service_runtask_completed(int skip)
|
int service_runtask_completed(int skip)
|
||||||
{
|
{
|
||||||
svc_t *svc;
|
svc_t *svc, *iter = NULL;
|
||||||
|
|
||||||
for (svc = svc_iterator(NULL); svc; svc = svc_iterator(svc)) {
|
for (svc = svc_iterator(&iter, 1); svc; svc = svc_iterator(&iter, 0)) {
|
||||||
if (!svc_is_runtask(svc))
|
if (!svc_is_runtask(svc))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|||||||
@@ -51,10 +51,10 @@ svc_t *svc_new(char *cmd, int id, int type)
|
|||||||
{
|
{
|
||||||
int job = -1;
|
int job = -1;
|
||||||
char *desc;
|
char *desc;
|
||||||
svc_t *svc;
|
svc_t *svc, *iter = NULL;
|
||||||
|
|
||||||
/* Find first job n:o if registering multiple instances */
|
/* Find first job n:o if registering multiple instances */
|
||||||
for (svc = svc_iterator(NULL); svc; svc = svc_iterator(svc)) {
|
for (svc = svc_iterator(&iter, 1); svc; svc = svc_iterator(&iter, 0)) {
|
||||||
if (!strcmp(svc->cmd, cmd)) {
|
if (!strcmp(svc->cmd, cmd)) {
|
||||||
job = svc->job;
|
job = svc->job;
|
||||||
break;
|
break;
|
||||||
@@ -103,36 +103,46 @@ int svc_del(svc_t *svc)
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* svc_iterator - Naive iterator over all registered services.
|
* svc_iterator - Naive iterator over all registered services.
|
||||||
* @iter: %NULL for first entry, use returned value for subsequent calls
|
* @iter: Iterator, must be a valid pointer
|
||||||
|
* @first: If set, get first &svc_t, otherwise get next
|
||||||
*
|
*
|
||||||
* Returns:
|
* Returns:
|
||||||
* The first &svc_t when %NULL is given as argument, otherwise the next
|
* An &svc_t pointer, or %NULL when no more entries can be found.
|
||||||
* &svc_t until the end when %NULL is returned.
|
|
||||||
*/
|
*/
|
||||||
svc_t *svc_iterator(svc_t *iter)
|
svc_t *svc_iterator(svc_t **iter, int first)
|
||||||
{
|
{
|
||||||
if (!iter)
|
svc_t *svc;
|
||||||
return TAILQ_FIRST(&svc_list);
|
|
||||||
|
|
||||||
if (iter && iter != TAILQ_END(&svc_list))
|
if (!iter) {
|
||||||
return TAILQ_NEXT(iter, link);
|
errno = EINVAL;
|
||||||
|
return NULL;
|
||||||
return NULL;
|
}
|
||||||
|
|
||||||
|
if (first)
|
||||||
|
svc = TAILQ_FIRST(&svc_list);
|
||||||
|
else
|
||||||
|
svc = *iter;
|
||||||
|
|
||||||
|
if (svc)
|
||||||
|
*iter = TAILQ_NEXT(svc, link);
|
||||||
|
|
||||||
|
return svc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* svc_inetd_iterator - Naive iterator over all registered inetd services.
|
* svc_inetd_iterator - Naive iterator over all registered inetd services.
|
||||||
* @iter: %NULL for first entry, use returned value for subsequent calls
|
* @iter: Iterator, must be a valid pointer
|
||||||
|
* @first: If set, get first &svc_t, otherwise get next
|
||||||
*
|
*
|
||||||
* Returns:
|
* Returns:
|
||||||
* The first inetd &svc_t when %NULL is given as argument, otherwise the
|
* The first inetd &svc_t when %NULL is given as argument, otherwise the
|
||||||
* next inetd &svc_t until the end when %NULL is returned.
|
* next inetd &svc_t until the end when %NULL is returned.
|
||||||
*/
|
*/
|
||||||
svc_t *svc_inetd_iterator(svc_t *iter)
|
svc_t *svc_inetd_iterator(svc_t **iter, int first)
|
||||||
{
|
{
|
||||||
svc_t *svc;
|
svc_t *svc;
|
||||||
|
|
||||||
for (svc = svc_iterator(iter); svc; svc = svc_iterator(svc)) {
|
for (svc = svc_iterator(iter, first); svc; svc = svc_iterator(iter, 0)) {
|
||||||
if (svc_is_inetd(svc))
|
if (svc_is_inetd(svc))
|
||||||
return svc;
|
return svc;
|
||||||
}
|
}
|
||||||
@@ -143,19 +153,20 @@ svc_t *svc_inetd_iterator(svc_t *iter)
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* svc_named_iterator - Iterates over all instances of a service.
|
* svc_named_iterator - Iterates over all instances of a service.
|
||||||
* @iter: %NULL for first entry, use returned value for subsequent calls
|
* @iter: Iterator, must be a valid pointer
|
||||||
* @cmd: Service name to look for.
|
* @first: If set, get first &svc_t, otherwise get next
|
||||||
|
* @cmd: Service name to look for.
|
||||||
*
|
*
|
||||||
* Returns:
|
* Returns:
|
||||||
* The first matching &svc_t when %NULL is given as argument, otherwise
|
* The first matching &svc_t when %NULL is given as argument, otherwise
|
||||||
* the next &svc_t with the same @cmd name until the end when %NULL is
|
* the next &svc_t with the same @cmd name until the end when %NULL is
|
||||||
* returned.
|
* returned.
|
||||||
*/
|
*/
|
||||||
svc_t *svc_named_iterator(svc_t *iter, char *cmd)
|
svc_t *svc_named_iterator(svc_t **iter, int first, char *cmd)
|
||||||
{
|
{
|
||||||
svc_t *svc;
|
svc_t *svc;
|
||||||
|
|
||||||
for (svc = svc_iterator(iter); svc; svc = svc_iterator(svc)) {
|
for (svc = svc_iterator(iter, first); svc; svc = svc_iterator(iter, 0)) {
|
||||||
char *name = basename(svc->cmd);
|
char *name = basename(svc->cmd);
|
||||||
|
|
||||||
if (!strncmp(name, cmd, strlen(name)))
|
if (!strncmp(name, cmd, strlen(name)))
|
||||||
@@ -168,19 +179,20 @@ svc_t *svc_named_iterator(svc_t *iter, char *cmd)
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* svc_job_iterator - Iterates over all instances of a service.
|
* svc_job_iterator - Iterates over all instances of a service.
|
||||||
* @iter: %NULL for first entry, use returned value for subsequent calls
|
* @iter: Iterator, must be a valid pointer
|
||||||
* @job: Job to look for.
|
* @first: If set, get first &svc_t, otherwise get next
|
||||||
|
* @job: Job to look for.
|
||||||
*
|
*
|
||||||
* Returns:
|
* Returns:
|
||||||
* The first matching &svc_t when %NULL is given as argument, otherwise
|
* The first matching &svc_t when %NULL is given as argument, otherwise
|
||||||
* the next &svc_t with the same @job ID until the end when %NULL is
|
* the next &svc_t with the same @job ID until the end when %NULL is
|
||||||
* returned.
|
* returned.
|
||||||
*/
|
*/
|
||||||
svc_t *svc_job_iterator(svc_t *iter, int job)
|
svc_t *svc_job_iterator(svc_t **iter, int first, int job)
|
||||||
{
|
{
|
||||||
svc_t *svc;
|
svc_t *svc;
|
||||||
|
|
||||||
for (svc = svc_iterator(iter); svc; svc = svc_iterator(svc)) {
|
for (svc = svc_iterator(iter, first); svc; svc = svc_iterator(iter, 0)) {
|
||||||
if (svc->job == job)
|
if (svc->job == job)
|
||||||
return svc;
|
return svc;
|
||||||
}
|
}
|
||||||
@@ -195,12 +207,12 @@ svc_t *svc_job_iterator(svc_t *iter, int job)
|
|||||||
*/
|
*/
|
||||||
void svc_foreach(void (*cb)(svc_t *))
|
void svc_foreach(void (*cb)(svc_t *))
|
||||||
{
|
{
|
||||||
svc_t *svc;
|
svc_t *svc, *iter = NULL;
|
||||||
|
|
||||||
if (!cb)
|
if (!cb)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (svc = svc_iterator(NULL); svc; svc = svc_iterator(svc))
|
for (svc = svc_iterator(&iter, 1); svc; svc = svc_iterator(&iter, 0))
|
||||||
cb(svc);
|
cb(svc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -212,12 +224,12 @@ void svc_foreach(void (*cb)(svc_t *))
|
|||||||
*/
|
*/
|
||||||
void svc_foreach_type(int types, void (*cb)(svc_t *))
|
void svc_foreach_type(int types, void (*cb)(svc_t *))
|
||||||
{
|
{
|
||||||
svc_t *svc;
|
svc_t *svc, *iter = NULL;
|
||||||
|
|
||||||
if (!cb)
|
if (!cb)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (svc = svc_iterator(NULL); svc; svc = svc_iterator(svc)) {
|
for (svc = svc_iterator(&iter, 1); svc; svc = svc_iterator(&iter, 0)) {
|
||||||
if (!(svc->type & types))
|
if (!(svc->type & types))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -235,9 +247,9 @@ void svc_foreach_type(int types, void (*cb)(svc_t *))
|
|||||||
*/
|
*/
|
||||||
svc_t *svc_stop_completed(void)
|
svc_t *svc_stop_completed(void)
|
||||||
{
|
{
|
||||||
svc_t *svc;
|
svc_t *svc, *iter = NULL;
|
||||||
|
|
||||||
for (svc = svc_iterator(NULL); svc; svc = svc_iterator(svc)) {
|
for (svc = svc_iterator(&iter, 1); svc; svc = svc_iterator(&iter, 0)) {
|
||||||
if (svc->state == SVC_STOPPING_STATE)
|
if (svc->state == SVC_STOPPING_STATE)
|
||||||
return svc;
|
return svc;
|
||||||
}
|
}
|
||||||
@@ -254,9 +266,9 @@ svc_t *svc_stop_completed(void)
|
|||||||
*/
|
*/
|
||||||
svc_t *svc_find(char *cmd, int id)
|
svc_t *svc_find(char *cmd, int id)
|
||||||
{
|
{
|
||||||
svc_t *svc;
|
svc_t *svc, *iter = NULL;
|
||||||
|
|
||||||
for (svc = svc_iterator(NULL); svc; svc = svc_iterator(svc)) {
|
for (svc = svc_iterator(&iter, 1); svc; svc = svc_iterator(&iter, 0)) {
|
||||||
if (svc->id == id && !strncmp(svc->cmd, cmd, strlen(svc->cmd)))
|
if (svc->id == id && !strncmp(svc->cmd, cmd, strlen(svc->cmd)))
|
||||||
return svc;
|
return svc;
|
||||||
}
|
}
|
||||||
@@ -273,9 +285,9 @@ svc_t *svc_find(char *cmd, int id)
|
|||||||
*/
|
*/
|
||||||
svc_t *svc_find_by_pid(pid_t pid)
|
svc_t *svc_find_by_pid(pid_t pid)
|
||||||
{
|
{
|
||||||
svc_t *svc;
|
svc_t *svc, *iter = NULL;
|
||||||
|
|
||||||
for (svc = svc_iterator(NULL); svc; svc = svc_iterator(svc)) {
|
for (svc = svc_iterator(&iter, 1); svc; svc = svc_iterator(&iter, 0)) {
|
||||||
if (svc->pid == pid)
|
if (svc->pid == pid)
|
||||||
return svc;
|
return svc;
|
||||||
}
|
}
|
||||||
@@ -293,9 +305,9 @@ svc_t *svc_find_by_pid(pid_t pid)
|
|||||||
*/
|
*/
|
||||||
svc_t *svc_find_by_jobid(int job, int id)
|
svc_t *svc_find_by_jobid(int job, int id)
|
||||||
{
|
{
|
||||||
svc_t *svc;
|
svc_t *svc, *iter = NULL;
|
||||||
|
|
||||||
for (svc = svc_iterator(NULL); svc; svc = svc_iterator(svc)) {
|
for (svc = svc_iterator(&iter, 1); svc; svc = svc_iterator(&iter, 0)) {
|
||||||
if (svc->job == job && svc->id == id)
|
if (svc->job == job && svc->id == id)
|
||||||
return svc;
|
return svc;
|
||||||
}
|
}
|
||||||
@@ -314,9 +326,9 @@ svc_t *svc_find_by_jobid(int job, int id)
|
|||||||
svc_t *svc_find_by_nameid(char *name, int id)
|
svc_t *svc_find_by_nameid(char *name, int id)
|
||||||
{
|
{
|
||||||
char *ptr;
|
char *ptr;
|
||||||
svc_t *svc;
|
svc_t *svc, *iter = NULL;
|
||||||
|
|
||||||
for (svc = svc_iterator(NULL); svc; svc = svc_iterator(svc)) {
|
for (svc = svc_iterator(&iter, 1); svc; svc = svc_iterator(&iter, 0)) {
|
||||||
ptr = strrchr(svc->cmd, '/');
|
ptr = strrchr(svc->cmd, '/');
|
||||||
if (ptr)
|
if (ptr)
|
||||||
ptr++;
|
ptr++;
|
||||||
@@ -342,12 +354,10 @@ svc_t *svc_find_by_nameid(char *name, int id)
|
|||||||
*/
|
*/
|
||||||
void svc_mark_dynamic(void)
|
void svc_mark_dynamic(void)
|
||||||
{
|
{
|
||||||
svc_t *svc = svc_iterator(NULL);
|
svc_t *svc, *iter = NULL;
|
||||||
|
|
||||||
while (svc) {
|
for (svc = svc_iterator(&iter, 1); svc; svc = svc_iterator(&iter, 0))
|
||||||
*((int *)&svc->dirty) = -1;
|
*((int *)&svc->dirty) = -1;
|
||||||
svc = svc_iterator(svc);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void svc_mark_dirty(svc_t *svc)
|
void svc_mark_dirty(svc_t *svc)
|
||||||
@@ -369,14 +379,13 @@ void svc_mark_clean(svc_t *svc)
|
|||||||
*/
|
*/
|
||||||
void svc_clean_dynamic(void (*cb)(svc_t *))
|
void svc_clean_dynamic(void (*cb)(svc_t *))
|
||||||
{
|
{
|
||||||
svc_t *svc = svc_iterator(NULL);
|
svc_t *svc, *iter = NULL;
|
||||||
|
|
||||||
while (svc) {
|
for (svc = svc_iterator(&iter, 1); svc; svc = svc_iterator(&iter, 0)) {
|
||||||
if (svc->dirty == -1 && cb) {
|
if (svc->dirty == -1 && cb) {
|
||||||
cb(svc);
|
cb(svc);
|
||||||
svc_mark_clean(svc);
|
svc_mark_clean(svc);
|
||||||
}
|
}
|
||||||
svc = svc_iterator(svc);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -407,9 +416,9 @@ int svc_clean_bootstrap(svc_t *svc)
|
|||||||
*/
|
*/
|
||||||
void svc_prune_bootstrap(void)
|
void svc_prune_bootstrap(void)
|
||||||
{
|
{
|
||||||
svc_t *svc;
|
svc_t *svc, *iter = NULL;
|
||||||
|
|
||||||
for (svc = svc_iterator(NULL); svc; svc = svc_iterator(svc)) {
|
for (svc = svc_iterator(&iter, 1); svc; svc = svc_iterator(&iter, 0)) {
|
||||||
if (!svc->pid)
|
if (!svc->pid)
|
||||||
svc_clean_bootstrap(svc);
|
svc_clean_bootstrap(svc);
|
||||||
}
|
}
|
||||||
@@ -442,9 +451,9 @@ int svc_enabled(svc_t *svc)
|
|||||||
int svc_next_id(char *cmd)
|
int svc_next_id(char *cmd)
|
||||||
{
|
{
|
||||||
int id = 0;
|
int id = 0;
|
||||||
svc_t *svc;
|
svc_t *svc, *iter = NULL;
|
||||||
|
|
||||||
for (svc = svc_iterator(NULL); svc; svc = svc_iterator(svc)) {
|
for (svc = svc_iterator(&iter, 1); svc; svc = svc_iterator(&iter, 0)) {
|
||||||
if (!strcmp(svc->cmd, cmd) && id < svc->id)
|
if (!strcmp(svc->cmd, cmd) && id < svc->id)
|
||||||
id = svc->id;
|
id = svc->id;
|
||||||
}
|
}
|
||||||
@@ -454,10 +463,10 @@ int svc_next_id(char *cmd)
|
|||||||
|
|
||||||
int svc_is_unique(svc_t *svc)
|
int svc_is_unique(svc_t *svc)
|
||||||
{
|
{
|
||||||
svc_t *s;
|
svc_t *s, *iter = NULL;
|
||||||
int unique = 1;
|
int unique = 1;
|
||||||
|
|
||||||
for (s = svc_iterator(NULL); s; s = svc_iterator(svc)) {
|
for (s = svc_iterator(&iter, 1); s; s = svc_iterator(&iter, 0)) {
|
||||||
if (svc->type == SVC_TYPE_FREE)
|
if (svc->type == SVC_TYPE_FREE)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -488,21 +497,21 @@ int svc_parse_jobstr(char *str, size_t len, int (*found)(svc_t *), int (not_foun
|
|||||||
token = strtok_r(input, " ", &pos);
|
token = strtok_r(input, " ", &pos);
|
||||||
while (token) {
|
while (token) {
|
||||||
int id = 1;
|
int id = 1;
|
||||||
svc_t *svc;
|
svc_t *svc, *iter = NULL;
|
||||||
char *ptr = strchr(token, ':');
|
char *ptr = strchr(token, ':');
|
||||||
|
|
||||||
if (isdigit(token[0])) {
|
if (isdigit(token[0])) {
|
||||||
int job = atonum(token);
|
int job = atonum(token);
|
||||||
|
|
||||||
if (!ptr) {
|
if (!ptr) {
|
||||||
svc = svc_job_iterator(NULL, job);
|
svc = svc_job_iterator(&iter, 1, job);
|
||||||
if (!svc && not_found)
|
if (!svc && not_found)
|
||||||
result += not_found(NULL, job);
|
result += not_found(NULL, job);
|
||||||
|
|
||||||
while (svc) {
|
while (svc) {
|
||||||
if (found)
|
if (found)
|
||||||
result += found(svc);
|
result += found(svc);
|
||||||
svc = svc_job_iterator(svc, job);
|
svc = svc_job_iterator(&iter, 0, job);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
*ptr++ = 0;
|
*ptr++ = 0;
|
||||||
@@ -517,14 +526,14 @@ int svc_parse_jobstr(char *str, size_t len, int (*found)(svc_t *), int (not_foun
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!ptr) {
|
if (!ptr) {
|
||||||
svc = svc_named_iterator(NULL, token);
|
svc = svc_named_iterator(&iter, 1, token);
|
||||||
if (!svc && not_found)
|
if (!svc && not_found)
|
||||||
result += not_found(token, id);
|
result += not_found(token, id);
|
||||||
|
|
||||||
while (svc) {
|
while (svc) {
|
||||||
if (found)
|
if (found)
|
||||||
result += found(svc);
|
result += found(svc);
|
||||||
svc = svc_named_iterator(svc, token);
|
svc = svc_named_iterator(&iter, 0, token);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
*ptr++ = 0;
|
*ptr++ = 0;
|
||||||
|
|||||||
@@ -135,10 +135,10 @@ svc_t *svc_find_by_pid (pid_t pid);
|
|||||||
svc_t *svc_find_by_jobid (int job, int id);
|
svc_t *svc_find_by_jobid (int job, int id);
|
||||||
svc_t *svc_find_by_nameid (char *name, int id);
|
svc_t *svc_find_by_nameid (char *name, int id);
|
||||||
|
|
||||||
svc_t *svc_iterator (svc_t *iter);
|
svc_t *svc_iterator (svc_t **iter, int first);
|
||||||
svc_t *svc_inetd_iterator (svc_t *iter);
|
svc_t *svc_inetd_iterator (svc_t **iter, int first);
|
||||||
svc_t *svc_named_iterator (svc_t *iter, char *cmd);
|
svc_t *svc_named_iterator (svc_t **iter, int first, char *cmd);
|
||||||
svc_t *svc_job_iterator (svc_t *iter, int job);
|
svc_t *svc_job_iterator (svc_t **iter, int first, int job);
|
||||||
|
|
||||||
void svc_foreach (void (*cb)(svc_t *));
|
void svc_foreach (void (*cb)(svc_t *));
|
||||||
void svc_foreach_type (int types, void (*cb)(svc_t *));
|
void svc_foreach_type (int types, void (*cb)(svc_t *));
|
||||||
|
|||||||
Reference in new issue
Block a user