diff --git a/src/inetd.c b/src/inetd.c index c6dc36dd..e32fe19c 100644 --- a/src/inetd.c +++ b/src/inetd.c @@ -225,10 +225,11 @@ static void socket_cb(uev_t *w, void *arg, int events) */ int inetd_check_loop(struct sockaddr *sa, socklen_t len, char *name) { + int pos; svc_t *svc; char pname[NI_MAXHOST]; - for (svc = svc_inetd_iterator(1); svc; svc = svc_inetd_iterator(0)) { + for (svc = svc_inetd_iterator(&pos, 1); svc; svc = svc_inetd_iterator(&pos, 0)) { inetd_t *i = &svc->inetd; if (!i->builtin || i->type != SOCK_DGRAM) @@ -665,9 +666,10 @@ int inetd_filter_str(inetd_t *inetd, char *str, size_t len) svc_t *inetd_find_svc(char *path, char *service, char *proto) { + int pos; svc_t *svc; - for (svc = svc_inetd_iterator(1); svc; svc = svc_inetd_iterator(0)) { + for (svc = svc_inetd_iterator(&pos, 1); svc; svc = svc_inetd_iterator(&pos, 0)) { if (strncmp(path, svc->cmd, strlen(svc->cmd))) continue; diff --git a/src/svc.c b/src/svc.c index 0a62ebac..054b8b05 100644 --- a/src/svc.c +++ b/src/svc.c @@ -204,17 +204,18 @@ svc_t *svc_inetd_iterator(int *pos, int first) /** * svc_dynamic_iterator - Naive iterator over all registered dynamic services. + * @pos: Iterator variable, preserves state between calls * @first: Get first &svc_t object, or next until end. * * Returns: * The first dynamically loaded &svc_t when @first is set, otherwise the * next dynamically loaded &svc_t until the end when %NULL is returned. */ -svc_t *svc_dynamic_iterator(int first) +svc_t *svc_dynamic_iterator(int *pos, int first) { svc_t *svc; - for (svc = svc_iterator(first); svc; svc = svc_iterator(0)) { + for (svc = svc_iterator1(pos, first); svc; svc = svc_iterator1(pos, 0)) { if (svc->mtime.tv_sec) return svc; } @@ -225,6 +226,7 @@ svc_t *svc_dynamic_iterator(int first) /** * svc_named_iterator - Iterates over all instances of a service. + * @pos: Iterator variable, preserves state between calls * @first: Get first &svc_t object, or next until end. * @cmd: Service name to look for. * @@ -233,11 +235,11 @@ svc_t *svc_dynamic_iterator(int first) * &svc_t instance with the same @cmd until the end when %NULL is * returned. */ -svc_t *svc_named_iterator(int first, char *cmd) +svc_t *svc_named_iterator(int *pos, int first, char *cmd) { svc_t *svc; - for (svc = svc_iterator(first); svc; svc = svc_iterator(0)) { + for (svc = svc_iterator1(pos, first); svc; svc = svc_iterator1(pos, 0)) { char *name = basename(svc->cmd); if (!strncmp(name, cmd, strlen(name))) @@ -250,6 +252,7 @@ svc_t *svc_named_iterator(int first, char *cmd) /** * svc_job_iterator - Iterates over all instances of a service. + * @pos: Iterator variable, preserves state between calls * @first: Get first &svc_t object, or next until end. * @job: Job to look for. * @@ -258,11 +261,11 @@ svc_t *svc_named_iterator(int first, char *cmd) * &svc_t instance with the same @job until the end when %NULL is * returned. */ -svc_t *svc_job_iterator(int first, int job) +svc_t *svc_job_iterator(int *pos, int first, int job) { svc_t *svc; - for (svc = svc_iterator(first); svc; svc = svc_iterator(0)) { + for (svc = svc_iterator1(pos, first); svc; svc = svc_iterator1(pos, 0)) { if (svc->job == job) return svc; } diff --git a/src/svc.h b/src/svc.h index 4b08238d..c359e41d 100644 --- a/src/svc.h +++ b/src/svc.h @@ -155,11 +155,11 @@ svc_t *svc_find_by_jobid (int job, int id); svc_t *svc_find_by_nameid (char *name, int id); svc_t *svc_iterator (int first); -svc_t *svc_inetd_iterator (int first); -svc_t *svc_dynamic_iterator (int first); -svc_t *svc_named_iterator (int first, char *cmd); -svc_t *svc_job_iterator (int first, int job); svc_t *svc_iterator1 (int *pos, int first); +svc_t *svc_inetd_iterator (int *pos, int first); +svc_t *svc_dynamic_iterator (int *pos, int first); +svc_t *svc_named_iterator (int *pos, int first, char *cmd); +svc_t *svc_job_iterator (int *pos, int first, int job); void svc_foreach (void (*cb)(svc_t *)); void svc_foreach_dynamic (void (*cb)(svc_t *));