summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVitezslav Crhonek <vcrhonek@redhat.com>2012-11-22 09:42:13 +0100
committerVitezslav Crhonek <vcrhonek@redhat.com>2012-11-22 09:42:13 +0100
commitedf21faa3a4d80f6e0a2404c1fe3168a213fdd3c (patch)
tree646d0d41f8ce4d94acd55f24e18e8719d07b0bba /src
parentdba1707afb860047e9a1250ce876dbddedcb70ff (diff)
downloadopenlmi-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.
Diffstat (limited to 'src')
-rw-r--r--src/service/util/serviceutil.c60
-rwxr-xr-xsrc/service/util/serviceutil.sh4
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