From ed3f8adf640080ecae89edf27c7283e62c41beb0 Mon Sep 17 00:00:00 2001 From: Alex Nikiforov <a.nikifo...@samsung.com> Date: Mon, 4 Jul 2011 15:17:38 +0400 Subject: [PATCH 1/2] cgrulesengd: cgclassify: fix read/write with vector operation readv/writev, move PID check from server to client, if PID is not valid we dont need any read/write
--- src/api.c | 15 ++++++++++++--- src/daemon/cgrulesengd.c | 23 +++++++++++------------ src/tools/cgclassify.c | 8 ++++++-- 3 files changed, 29 insertions(+), 17 deletions(-) diff --git a/src/api.c b/src/api.c index d5022c2..01b0fb2 100644 --- a/src/api.c +++ b/src/api.c @@ -43,6 +43,7 @@ #include <sys/socket.h> #include <fcntl.h> #include <sys/syscall.h> +#include <sys/uio.h> #include <unistd.h> #include <fts.h> #include <ctype.h> @@ -3704,6 +3705,7 @@ int cgroup_register_unchanged_process(pid_t pid, int flags) int ret = 1; char buff[sizeof(CGRULE_SUCCESS_STORE_PID)]; struct sockaddr_un addr; + struct iovec iov[2] = {}; /* [pid] [flags] */ sk = socket(PF_UNIX, SOCK_STREAM, 0); if (sk < 0) @@ -3720,11 +3722,18 @@ int cgroup_register_unchanged_process(pid_t pid, int flags) ret = 0; goto close; } - if (write(sk, &pid, sizeof(pid)) < 0) - goto close; - if (write(sk, &flags, sizeof(flags)) < 0) + /* FIXME - change for writev() */ + /* prepare vectors for reading */ + iov[0].iov_base = &pid; + iov[0].iov_len = sizeof(pid); + iov[1].iov_base = &flags; + iov[1].iov_len = sizeof(flags); + + if( writev(sk, iov, 2) < 0 ) { + //cgroup_dbg("read error: %s\n", strerror(errno)); goto close; + } if (read(sk, buff, sizeof(buff)) < 0) goto close; diff --git a/src/daemon/cgrulesengd.c b/src/daemon/cgrulesengd.c index 2f42a57..42d15f1 100644 --- a/src/daemon/cgrulesengd.c +++ b/src/daemon/cgrulesengd.c @@ -40,6 +40,7 @@ #include <stdio.h> #include <stdlib.h> #include <sys/socket.h> +#include <sys/uio.h> #include <sys/syslog.h> #include <string.h> #include <linux/netlink.h> @@ -550,8 +551,7 @@ static void cgre_receive_unix_domain_msg(int sk_unix) pid_t pid; struct sockaddr_un caddr; socklen_t caddr_len; - struct stat buff_stat; - char path[FILENAME_MAX]; + struct iovec iov[2] = {}; /* [pid] [flags] */ caddr_len = sizeof(caddr); fd_client = accept(sk_unix, (struct sockaddr *)&caddr, &caddr_len); @@ -559,19 +559,18 @@ static void cgre_receive_unix_domain_msg(int sk_unix) cgroup_dbg("accept error: %s\n", strerror(errno)); return; } - if (read(fd_client, &pid, sizeof(pid)) < 0) { - cgroup_dbg("read error: %s\n", strerror(errno)); - goto close; - } - sprintf(path, "/proc/%d", pid); - if (stat(path, &buff_stat)) { - cgroup_dbg("There is not such process (PID: %d)", pid); - goto close; - } - if (read(fd_client, &flags, sizeof(flags)) < 0) { + + /* prepare vectors for reading */ + iov[0].iov_base = &pid; + iov[0].iov_len = sizeof(pid); + iov[1].iov_base = &flags; + iov[1].iov_len = sizeof(flags); + + if( readv(fd_client, iov, 2) < 0 ) { cgroup_dbg("read error: %s\n", strerror(errno)); goto close; } + if (flags == CGROUP_DAEMON_CANCEL_UNCHANGE_PROCESS) { cgre_remove_unchanged_process(pid); } else { diff --git a/src/tools/cgclassify.c b/src/tools/cgclassify.c index 397b725..f103667 100644 --- a/src/tools/cgclassify.c +++ b/src/tools/cgclassify.c @@ -121,7 +121,8 @@ int main(int argc, char *argv[]) struct cgroup_group_spec *cgroup_list[CG_HIER_MAX]; int c; char *endptr; - + char path[FILENAME_MAX]; + struct stat buff_stat; if (argc < 2) { usage(1, argv[0]); @@ -168,7 +169,10 @@ int main(int argc, char *argv[]) for (i = optind; i < argc; i++) { pid = (uid_t) strtol(argv[i], &endptr, 10); - if (endptr[0] != '\0') { + + /* is it correct and valid PID ? */ + snprintf(path, FILENAME_MAX,"/proc/%d", pid); + if (stat(path, &buff_stat)) { /* the input argument was not a number */ fprintf(stderr, "Error: %s is not valid pid.\n", argv[i]); -- 1.7.4.1 ------------------------------------------------------------------------------ All of the data generated in your IT infrastructure is seriously valuable. Why? It contains a definitive record of application performance, security threats, fraudulent activity, and more. Splunk takes this data and makes sense of it. IT sense. And common sense. http://p.sf.net/sfu/splunk-d2d-c2 _______________________________________________ Libcg-devel mailing list Libcg-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libcg-devel