procps/procps-ng-3.3.8-readeof.patch
2013-05-29 13:55:21 +00:00

86 lines
2.8 KiB
Diff

--- proc/readproc.c
+++ proc/readproc.c 2013-05-29 10:55:48.129939330 +0000
@@ -544,7 +544,7 @@ static int file2str(const char *director
if (ub->buf) ub->buf[0] = '\0';
else ub->buf = xcalloc((ub->siz = buffGRW));
sprintf(path, "%s/%s", directory, what);
- if (-1 == (fd = open(path, O_RDONLY, 0))) return -1;
+ if (-1 == (fd = open(path, O_RDONLY, O_NOATIME))) return -1;
while (0 < (num = read(fd, ub->buf + tot_read, ub->siz - tot_read))) {
tot_read += num;
if (tot_read < ub->siz) break;
@@ -559,41 +559,42 @@ static int file2str(const char *director
static char** file2strvec(const char* directory, const char* what) {
char buf[2048]; /* read buf bytes at a time */
- char *p, *rbuf = 0, *endbuf, **q, **ret;
- int fd, tot = 0, n, c, end_of_file = 0;
- int align;
+ char *p, *rbuf = (char*)0, *endbuf, **q, **ret;
+ int fd, c;
+ ssize_t n, align, tot = 0;
sprintf(buf, "%s/%s", directory, what);
- fd = open(buf, O_RDONLY, 0);
+ fd = open(buf, O_RDONLY, O_NOATIME);
if(fd==-1) return NULL;
/* read whole file into a memory buffer, allocating as we go */
- while ((n = read(fd, buf, sizeof buf - 1)) >= 0) {
- if (n < (int)(sizeof buf - 1))
- end_of_file = 1;
- if (n == 0 && rbuf == 0) {
- close(fd);
- return NULL; /* process died between our open and read */
- }
+ do {
+ n = read(fd, buf, sizeof(buf) - 1);
if (n < 0) {
- if (rbuf)
- free(rbuf);
- close(fd);
- return NULL; /* read error */
+ tot = 0;
+ break; /* read error! */
+ }
+ if (n == 0) {
+ if(rbuf == (char*)0)
+ tot = 0; /* process died between our open and read */
+ break; /* we're done */
}
- if (end_of_file && (n == 0 || buf[n-1]))/* last read char not null */
- buf[n++] = '\0'; /* so append null-terminator */
rbuf = xrealloc(rbuf, tot + n); /* allocate more memory */
memcpy(rbuf + tot, buf, n); /* copy buffer into it */
tot += n; /* increment total byte ctr */
- if (end_of_file)
- break;
- }
+ } while (n >= (sizeof(buf) - 1));
+
close(fd);
- if (n <= 0 && !end_of_file) {
+
+ if (tot == 0) {
if (rbuf) free(rbuf);
- return NULL; /* read error */
+ return NULL; /* read error */
+ }
+ if (rbuf[tot-1]) { /* last read char not null */
+ rbuf = xrealloc(rbuf, tot + 1); /* allocate more memory */
+ rbuf[tot++] = '\0'; /* and append null-terminator */
}
+
endbuf = rbuf + tot; /* count space for pointers */
align = (sizeof(char*)-1) - ((tot + sizeof(char*)-1) & (sizeof(char*)-1));
for (c = 0, p = rbuf; p < endbuf; p++) {
@@ -626,7 +627,7 @@ static int read_unvectored(char *restric
unsigned n = 0;
snprintf(path, sizeof(path), "%s/%s", whom, what);
- fd = open(path, O_RDONLY);
+ fd = open(path, O_RDONLY, O_NOATIME);
if(fd==-1) return 0;
for(;;){