diff options
| author | David Oberhollenzer <david.oberhollenzer@tele2.at> | 2018-04-21 22:51:28 +0200 | 
|---|---|---|
| committer | David Oberhollenzer <david.oberhollenzer@tele2.at> | 2018-04-22 13:41:18 +0200 | 
| commit | 720220a3c3c42b92734e2a92f9094348451e187b (patch) | |
| tree | 0ead2efe5a2ea012c7f9d7945c4c26f1e09fb8e2 /lib/src | |
| parent | 160cd6b6aaffc12fb8cff0e6a9b8e1e0ba7053d0 (diff) | |
Add flags to selectively skip fields in service files
Signed-off-by: David Oberhollenzer <david.oberhollenzer@tele2.at>
Diffstat (limited to 'lib/src')
| -rw-r--r-- | lib/src/rdsvc.c | 45 | ||||
| -rw-r--r-- | lib/src/svcscan.c | 4 | 
2 files changed, 31 insertions, 18 deletions
| diff --git a/lib/src/rdsvc.c b/lib/src/rdsvc.c index ef3465f..546962d 100644 --- a/lib/src/rdsvc.c +++ b/lib/src/rdsvc.c @@ -204,15 +204,17 @@ static const struct svc_param {  	unsigned int allow_block : 1; +	int flags; +  	int (*handle)(service_t *svc, char *arg, rdline_t *rd);  } svc_params[] = { -	{ "description", 0, svc_desc }, -	{ "exec", 1, svc_exec }, -	{ "type", 0, svc_type }, -	{ "target", 0, svc_target }, -	{ "tty", 0, svc_tty }, -	{ "before", 0, svc_before }, -	{ "after", 0, svc_after }, +	{ "description", 0, 0, svc_desc }, +	{ "exec", 1, RDSVC_NO_EXEC, svc_exec }, +	{ "type", 0, 0, svc_type }, +	{ "target", 0, 0, svc_target }, +	{ "tty", 0, RDSVC_NO_CTTY, svc_tty }, +	{ "before", 0, RDSVC_NO_DEPS, svc_before }, +	{ "after", 0, RDSVC_NO_DEPS, svc_after },  };  static int splitkv(rdline_t *rd, char **k, char **v) @@ -257,7 +259,7 @@ static const struct svc_param *find_param(rdline_t *rd, const char *name)  } -service_t *rdsvc(int dirfd, const char *filename) +service_t *rdsvc(int dirfd, const char *filename, int flags)  {  	const struct svc_param *p;  	const char *arg, *args[1]; @@ -289,9 +291,11 @@ service_t *rdsvc(int dirfd, const char *filename)  	if (svc == NULL)  		goto fail_oom; -	svc->fname = strdup(filename); -	if (svc->fname == NULL) -		goto fail_oom; +	if (!(flags & RDSVC_NO_FNAME)) { +		svc->fname = strdup(filename); +		if (svc->fname == NULL) +			goto fail_oom; +	}  	memcpy(svc->name, filename, nlen); @@ -306,13 +310,19 @@ service_t *rdsvc(int dirfd, const char *filename)  		if (p->allow_block && *value == '{') {  			for (++value; *value == ' '; ++value)  				; -			if (*value != '\0' && p->handle(svc, value, &rd)) -				goto fail; + +			if (!(flags & p->flags)) { +				if (*value != '\0' && +				    p->handle(svc, value, &rd)) { +					goto fail; +				} +			}  			while ((ret = rdline(&rd)) == 0) {  				if (strcmp(rd.buffer, "}") == 0)  					break; - +				if (flags & p->flags) +					continue;  				if (p->handle(svc, rd.buffer, &rd))  					goto fail;  			} @@ -321,8 +331,11 @@ service_t *rdsvc(int dirfd, const char *filename)  				goto fail;  			if (ret > 0)  				goto fail_bra; -		} else if (p->handle(svc, value, &rd)) { -			goto fail; +		} else { +			if (flags & p->flags) +				continue; +			if (p->handle(svc, value, &rd)) +				goto fail;  		}  	} diff --git a/lib/src/svcscan.c b/lib/src/svcscan.c index 32c1dee..f4c7ef1 100644 --- a/lib/src/svcscan.c +++ b/lib/src/svcscan.c @@ -27,7 +27,7 @@  #include "service.h" -int svcscan(const char *directory, service_list_t *list) +int svcscan(const char *directory, service_list_t *list, int flags)  {  	int i, dfd, type, ret = 0;  	struct dirent *ent; @@ -82,7 +82,7 @@ int svcscan(const char *directory, service_list_t *list)  		if (type != S_IFREG && type != S_IFLNK)  			continue; -		svc = rdsvc(dfd, ent->d_name); +		svc = rdsvc(dfd, ent->d_name, flags);  		if (svc == NULL) {  			ret = -1;  			continue; | 
