From ed3f8adf640080ecae89edf27c7283e62c41beb0 Mon Sep 17 00:00:00 2001
From: Alex Nikiforov <[email protected]>
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/libcg-devel