summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBalbir Singh <balbir@linux.vnet.ibm.com>2009-04-21 14:27:28 +0530
committerBalbir Singh <balbir@linux.vnet.ibm.com>2009-04-21 14:27:28 +0530
commit01b53987d3587d026fcfc0f0486fed24e8737feb (patch)
tree86d8e01ec2dad15500e52fae15d26b19c086710a
parentd47ac40b87f246f2f1badbf25d8e814614296051 (diff)
parent8d8a747b161508ebfd48a6dac52f1438e2714a2b (diff)
downloadlibcg-01b53987d3587d026fcfc0f0486fed24e8737feb.tar.gz
libcg-01b53987d3587d026fcfc0f0486fed24e8737feb.tar.xz
libcg-01b53987d3587d026fcfc0f0486fed24e8737feb.zip
Merge branch 'master' of ssh://balbir_singh@libcg.git.sourceforge.net/gitroot/libcg
-rw-r--r--configure.in3
-rw-r--r--scripts/init.d/cgconfig14
-rw-r--r--scripts/init.d/cgred11
-rw-r--r--src/api.c110
-rw-r--r--src/daemon/cgrulesengd.c4
5 files changed, 70 insertions, 72 deletions
diff --git a/configure.in b/configure.in
index 0d82f96..cb54d15 100644
--- a/configure.in
+++ b/configure.in
@@ -48,9 +48,6 @@ fi
AM_PROG_LEX
AC_PROG_LIBTOOL
-# Checks for libraries.
-AC_CHECK_LIB([cgroup], [cgroup_create_cgroup])
-
# Checks for header files.
AC_HEADER_DIRENT
AC_HEADER_STDC
diff --git a/scripts/init.d/cgconfig b/scripts/init.d/cgconfig
index 6e6bcd6..6b01d9c 100644
--- a/scripts/init.d/cgconfig
+++ b/scripts/init.d/cgconfig
@@ -69,6 +69,7 @@ umount_fs() {
}
start() {
+ echo -n "Starting cgconfig service: "
if [ -f /var/lock/subsys/$servicename ]
then
log_warning_msg "lock file already exists"
@@ -77,11 +78,11 @@ start() {
if [ $? -eq 0 ]
then
- #log_progress_msg "Starting cgconfig service: "
cgconfigparser -l $CONFIG_FILE
retval=$?
if [ $retval -ne 0 ]
then
+ log_failure_msg "Failed to parse " $CONFIG_FILE
return $retval
fi
fi
@@ -136,7 +137,14 @@ start() {
done
touch /var/lock/subsys/$servicename
- return $?
+ retval=$?
+ if [ $retval -ne 0 ]
+ then
+ log_failure_msg "Failed to touch " /var/lock/subsys/$servicename
+ return $retval
+ fi
+ log_success_msg
+ return 0
}
move_all_to_init_class() {
@@ -169,9 +177,11 @@ move_all_to_init_class() {
stop() {
+ echo -n "Stopping cgconfig service: "
move_all_to_init_class
umount_fs
rm -f /var/lock/subsys/$servicename
+ log_success_msg
}
trapped() {
diff --git a/scripts/init.d/cgred b/scripts/init.d/cgred
index 73ca480..fa824df 100644
--- a/scripts/init.d/cgred
+++ b/scripts/init.d/cgred
@@ -67,7 +67,7 @@ start()
{
echo $"Starting CGroup Rules Engine Daemon..."
if [ -f "/var/lock/subsys/$servicename" ] ; then
- echo "$servicename is already running with PID `cat ${pidfile}`"
+ log_failure_msg "$servicename is already running with PID `cat ${pidfile}`"
return 1
fi
daemon --check $servicename --pidfile $pidfile $processname $OPTIONS
@@ -87,6 +87,7 @@ stop()
rm -f /var/lock/subsys/$servicename
rm -f $pidfile
fi
+ log_success_msg
}
# See how we are called
@@ -116,9 +117,13 @@ case "$1" in
echo $"Reloading rules configuration..."
kill -s 12 `cat ${pidfile}`
RETVAL=$?
- echo
+ if [ $RETVAL -eq 0 ] ; then
+ log_success_msg
+ else
+ log_failure_msg
+ fi
else
- echo $"$servicename is not running."
+ log_failure_msg "$servicename is not running."
fi
;;
*)
diff --git a/src/api.c b/src/api.c
index a45802e..4d5b524 100644
--- a/src/api.c
+++ b/src/api.c
@@ -25,6 +25,10 @@
* for mistakes in APIs for reading statistics.
*/
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
#include <dirent.h>
#include <errno.h>
#include <libcgroup.h>
@@ -762,6 +766,43 @@ char *cg_build_path(char *name, char *path, char *type)
return path;
}
+static int __cgroup_attach_task_pid(char *path, pid_t tid)
+{
+ int ret = 0;
+ FILE *tasks = NULL;
+
+ tasks = fopen(path, "w");
+ if (!tasks) {
+ switch (errno) {
+ case EPERM:
+ return ECGROUPNOTOWNER;
+ case ENOENT:
+ return ECGROUPNOTEXIST;
+ default:
+ return ECGROUPNOTALLOWED;
+ }
+ }
+ ret = fprintf(tasks, "%d", tid);
+ if (ret < 0) {
+ last_errno = errno;
+ ret = ECGOTHER;
+ goto err;
+ }
+ ret = fflush(tasks);
+ if (ret) {
+ last_errno = errno;
+ ret = ECGOTHER;
+ goto err;
+ }
+ fclose(tasks);
+ return 0;
+err:
+ cgroup_dbg("Error writing tid %d to %s:%s\n",
+ tid, path, strerror(errno));
+ fclose(tasks);
+ return ret;
+}
+
/** cgroup_attach_task_pid is used to assign tasks to a cgroup.
* struct cgroup *cgroup: The cgroup to assign the thread to.
* pid_t tid: The thread to be assigned to the cgroup.
@@ -773,7 +814,6 @@ char *cg_build_path(char *name, char *path, char *type)
int cgroup_attach_task_pid(struct cgroup *cgroup, pid_t tid)
{
char path[FILENAME_MAX];
- FILE *tasks = NULL;
int i, ret = 0;
if (!cgroup_initialized) {
@@ -789,37 +829,11 @@ int cgroup_attach_task_pid(struct cgroup *cgroup, pid_t tid)
cg_mount_table[i].name))
continue;
strncat(path, "/tasks", sizeof(path) - strlen(path));
-
- tasks = fopen(path, "w");
- if (!tasks) {
- pthread_rwlock_unlock(&cg_mount_table_lock);
- switch (errno) {
- case EPERM:
- return ECGROUPNOTOWNER;
- case ENOENT:
- return ECGROUPNOTEXIST;
- default:
- return ECGROUPNOTALLOWED;
- }
- }
- ret = fprintf(tasks, "%d", tid);
- if (ret < 0) {
- cgroup_dbg("Error writing tid %d to %s:%s\n",
- tid, path, strerror(errno));
- fclose(tasks);
- last_errno = errno;
- return ECGOTHER;
- }
-
- ret = fflush(tasks);
+ ret = __cgroup_attach_task_pid(path, tid);
if (ret) {
- last_errno = errno;
- cgroup_dbg("Error writing tid %d to %s:%s\n",
- tid, path, strerror(errno));
- fclose(tasks);
- return ECGOTHER;
+ pthread_rwlock_unlock(&cg_mount_table_lock);
+ return ret;
}
- fclose(tasks);
}
pthread_rwlock_unlock(&cg_mount_table_lock);
} else {
@@ -835,40 +849,10 @@ int cgroup_attach_task_pid(struct cgroup *cgroup, pid_t tid)
if (!cg_build_path(cgroup->name, path,
cgroup->controller[i]->name))
continue;
-
strncat(path, "/tasks", sizeof(path) - strlen(path));
-
- tasks = fopen(path, "w");
- if (!tasks) {
- cgroup_dbg("fopen failed for %s:%s", path,
- strerror(errno));
-
- switch (errno) {
- case EPERM:
- return ECGROUPNOTOWNER;
- case ENOENT:
- return ECGROUPNOTEXIST;
- default:
- return ECGROUPNOTALLOWED;
- }
- }
- ret = fprintf(tasks, "%d", tid);
- if (ret < 0) {
- last_errno = errno;
- cgroup_dbg("Error writing tid %d to %s:%s\n",
- tid, path, strerror(errno));
- fclose(tasks);
- return ECGOTHER;
- }
- ret = fflush(tasks);
- if (ret) {
- last_errno = errno;
- cgroup_dbg("Error writing tid %d to %s:%s\n",
- tid, path, strerror(errno));
- fclose(tasks);
- return ECGOTHER;
- }
- fclose(tasks);
+ ret = __cgroup_attach_task_pid(path, tid);
+ if (ret)
+ return ret;
}
}
return 0;
diff --git a/src/daemon/cgrulesengd.c b/src/daemon/cgrulesengd.c
index 8efdce1..4e00e18 100644
--- a/src/daemon/cgrulesengd.c
+++ b/src/daemon/cgrulesengd.c
@@ -386,8 +386,10 @@ int cgre_create_netlink_socket_process_msg()
continue;
while (NLMSG_OK(nlh, recv_len)) {
cn_hdr = NLMSG_DATA(nlh);
- if (nlh->nlmsg_type == NLMSG_NOOP)
+ if (nlh->nlmsg_type == NLMSG_NOOP) {
+ nlh = NLMSG_NEXT(nlh, recv_len);
continue;
+ }
if ((nlh->nlmsg_type == NLMSG_ERROR) ||
(nlh->nlmsg_type == NLMSG_OVERRUN))
break;