X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fvserver-stat.c;h=e81c38d4b24b5d7e4131ea7b96d3c487775a77f1;hb=c6d15ec933126d74645ffbe0cfd2e8e931664e0d;hp=269edb0c4faf3aee7aa02dd2c30cbfbada8a4553;hpb=83fd153555610839df8100ac8f67d1ac294e9054;p=util-vserver.git diff --git a/src/vserver-stat.c b/src/vserver-stat.c index 269edb0..e81c38d 100644 --- a/src/vserver-stat.c +++ b/src/vserver-stat.c @@ -309,13 +309,15 @@ registerXidCgroups(struct Vector *vec, struct process_info *process) char vhi_name[65], filename[128], cgroup[129], + name[129], buf[30]; int fd; - ssize_t cgroup_len; + ssize_t cgroup_len, name_len; unsigned long long rss = 0; char *endptr; size_t len; uint64_t stime_total, utime_total; + int per_ss = 0; if (vc_virt_stat(xid, &vstat) == -1) { @@ -341,10 +343,14 @@ registerXidCgroups(struct Vector *vec, struct process_info *process) perror("read(cgroup/mnt)"); return; } - close(fd); - cgroup[cgroup_len] = '/'; - cgroup_len += 1; - cgroup[cgroup_len] = 0; + if (cgroup_len > 0) { + close(fd); + while (cgroup[cgroup_len - 1] == '\n' || cgroup[cgroup_len - 1] == '\r') + cgroup_len--; + cgroup[cgroup_len] = '/'; + cgroup_len += 1; + cgroup[cgroup_len] = 0; + } } if ((fd = open(DEFAULTCONFDIR "/cgroup/base", O_RDONLY)) != -1) { @@ -354,14 +360,21 @@ registerXidCgroups(struct Vector *vec, struct process_info *process) return; } close(fd); - cgroup_len += len; - if (cgroup[cgroup_len - 1] != '/') { - cgroup[cgroup_len] = '/'; - cgroup_len += 1; + if (len > 0) { + while (cgroup[cgroup_len + len - 1] == '\n' || cgroup[cgroup_len + len - 1] == '\r') + len--; + cgroup_len += len; + if (cgroup[cgroup_len - 1] != '/') { + cgroup[cgroup_len] = '/'; + cgroup_len += 1; + } + cgroup[cgroup_len] = 0; } - cgroup[cgroup_len] = 0; } + if (access(DEFAULTCONFDIR "/cgroup/per-ss", F_OK) == 0) + per_ss = 1; + len = strlen(vhi_name); if ((len + sizeof("/cgroup/name")) >= sizeof(filename)) { WRITE_MSG(2, "too long context name: "); @@ -380,35 +393,36 @@ registerXidCgroups(struct Vector *vec, struct process_info *process) WRITE_MSG(2, "\n"); return; } - len = strlen(dir); - if ((len + cgroup_len) >= sizeof(cgroup)) { + name_len = strlen(dir); + if (name_len >= sizeof(name)) { WRITE_MSG(2, "cgroup name too long: "); WRITE_STR(2, dir); WRITE_MSG(2, "\n"); return; } - strcpy(cgroup + cgroup_len, dir); - cgroup_len += len; + strcpy(name, dir); } else { - ssize_t ret; - ret = read(fd, cgroup + cgroup_len, sizeof(cgroup) - cgroup_len); - if (ret == -1) { + name_len = read(fd, name, sizeof(name)); + if (name_len == -1) { perror("read(cgroup/name)"); return; } - cgroup_len += ret; + if (name_len > 0) { + while (name[name_len - 1] == '\n' || name[name_len - 1] == '\r') + name_len--; + name[name_len] = '\0'; + } close(fd); } - if ((cgroup_len + sizeof("/memory.usage_in_bytes")) > sizeof(filename)) { + if ((cgroup_len + name_len + sizeof("/memory/memory.usage_in_bytes")) > sizeof(filename)) { WRITE_MSG(2, "cgroup name too long: "); WRITE_STR(2, cgroup); WRITE_MSG(2, "\n"); return; } - strcpy(filename, cgroup); - strcpy(filename + cgroup_len, "/memory.usage_in_bytes"); + snprintf(filename, sizeof(filename), "%s%s%s/memory.usage_in_bytes", cgroup, (per_ss ? "/memory" : ""), name); if ((fd = open(filename, O_RDONLY)) == -1) perror("open(memory.usage_in_bytes)"); @@ -425,8 +439,7 @@ registerXidCgroups(struct Vector *vec, struct process_info *process) } } - strcpy(filename, cgroup); - strcpy(filename + cgroup_len, "/cpuacct.stat"); + snprintf(filename, sizeof(filename), "%s%s%s/cpuacct.stat", cgroup, (per_ss ? "/cpuacct" : ""), name); if ((fd = open(filename, O_RDONLY)) == -1) { utime_total = 0;