diff options
author | Vitezslav Crhonek <vcrhonek@redhat.com> | 2012-11-22 09:42:13 +0100 |
---|---|---|
committer | Vitezslav Crhonek <vcrhonek@redhat.com> | 2012-11-22 09:42:13 +0100 |
commit | edf21faa3a4d80f6e0a2404c1fe3168a213fdd3c (patch) | |
tree | 646d0d41f8ce4d94acd55f24e18e8719d07b0bba | |
parent | dba1707afb860047e9a1250ce876dbddedcb70ff (diff) | |
download | openlmi-providers-edf21faa3a4d80f6e0a2404c1fe3168a213fdd3c.tar.gz openlmi-providers-edf21faa3a4d80f6e0a2404c1fe3168a213fdd3c.tar.xz openlmi-providers-edf21faa3a4d80f6e0a2404c1fe3168a213fdd3c.zip |
Service:
- Use popen instead evil tmpnam in service enumeration functions.
- Pass service name to systemctl after a "--" argument list terminator.
-rw-r--r-- | src/service/util/serviceutil.c | 60 | ||||
-rwxr-xr-x | src/service/util/serviceutil.sh | 4 |
2 files changed, 28 insertions, 36 deletions
diff --git a/src/service/util/serviceutil.c b/src/service/util/serviceutil.c index 717900b..f5e3b67 100644 --- a/src/service/util/serviceutil.c +++ b/src/service/util/serviceutil.c @@ -33,16 +33,12 @@ #define STATUS_BUFSIZE 2000 #define MAX_SLIST_CNT 1000 -/* FIXME don't use tmpnam function */ - char *suscript = "/usr/libexec/serviceutil.sh"; char *sdscript = "/usr/libexec/servicedisc.sh"; typedef struct { FILE *fp; - char name[L_tmpnam]; FILE *fp2; - char name2[L_tmpnam]; } Control; void @@ -69,28 +65,29 @@ Service_Find_All(void) Control *cc = malloc(sizeof(Control)); SList *slist; - if (cc && tmpnam(cc->name)) + if (cc) { - snprintf(cmdbuffer, STATUS_BUFSIZE, "%s > %s", sdscript, cc->name); - if (system(cmdbuffer) == 0) - cc->fp = fopen(cc->name, "r"); + cc->fp = popen(sdscript, "r"); + if (cc->fp) + { + slist = malloc(sizeof(SList)); + slist->name = malloc(MAX_SLIST_CNT * sizeof(char *)); + slist->cnt = 0; + while (fgets(svname, sizeof(svname), cc->fp) != NULL) + { + slist->name[slist->cnt] = strndup(svname, strlen(svname) - 1); + slist->cnt++; + } + pclose(cc->fp); + free(cc); + return slist; + } else { free(cc); cc=NULL; return NULL; } - slist = malloc(sizeof(SList)); - slist->name = malloc(MAX_SLIST_CNT * sizeof(char *)); - slist->cnt = 0; - while (fgets(svname, sizeof(svname), cc->fp) != NULL) - { - slist->name[slist->cnt] = strndup(svname, strlen(svname) - 1); - slist->cnt++; - } - fclose(cc->fp); - free(cc); - return slist; } else { @@ -107,20 +104,17 @@ Service_Begin_Enum(const char *service) memset(&cmdbuffer, '\0', sizeof(cmdbuffer)); - if (cc && tmpnam(cc->name) && tmpnam(cc->name2)) + if (cc) { - snprintf(cmdbuffer, STATUS_BUFSIZE, "%s status %s > %s", suscript, service, cc->name); - if (system(cmdbuffer) == 0) + snprintf(cmdbuffer, STATUS_BUFSIZE, "%s status %s", suscript, service); + cc->fp = popen(cmdbuffer, "r"); + if (cc->fp) { - cc->fp = fopen(cc->name, "r"); - snprintf(cmdbuffer, STATUS_BUFSIZE, "%s is-enabled %s > %s", suscript, service, cc->name2); - if (system(cmdbuffer) == 0) - { - cc->fp2 = fopen(cc->name2, "r"); - } - else + snprintf(cmdbuffer, STATUS_BUFSIZE, "%s is-enabled %s", suscript, service); + cc->fp2 = popen(cmdbuffer, "r"); + if (!cc->fp2) { - fclose(cc->fp); + pclose(cc->fp); free(cc); cc=NULL; } @@ -198,10 +192,8 @@ Service_End_Enum(void *handle) Control *cc = (Control *) handle; if (cc) { - fclose(cc->fp); - fclose(cc->fp2); - remove(cc->name); - remove(cc->name2); + pclose(cc->fp); + pclose(cc->fp2); free(cc); } } diff --git a/src/service/util/serviceutil.sh b/src/service/util/serviceutil.sh index a7a518c..5c26651 100755 --- a/src/service/util/serviceutil.sh +++ b/src/service/util/serviceutil.sh @@ -32,10 +32,10 @@ if [ -f $SYSTEMD_SDIR/$SUNIT_NAME ]; then case "$1" in start|stop|reload|restart|try-restart|condrestart|reload-or-restart|reload-or-try-restart|enable|disable|is-enabled) - systemctl $1 $SUNIT_NAME + systemctl -- $1 $SUNIT_NAME ;; status) - output=`systemctl status $SUNIT_NAME` + output=`systemctl -- status $SUNIT_NAME` if echo "$output" | grep Active: | grep inactive > /dev/null 2>&1; then echo "stopped" elif echo "$output" | grep Active: | grep failed > /dev/null 2>&1; then |