}
};
-static int para_open_stat_pipe(char *cmd)
-{
- int fds[3] = {0, 1, 0};
- pid_t pid;
- int ret = para_exec_cmdline_pid(&pid, cmd, fds);
- if (ret < 0)
- return ret;
- ret = mark_fd_nonblocking(fds[1]);
- if (ret > 0)
- return fds[1];
- close(fds[1]);
- return ret;
-}
-
static int find_cmd_byname(char *name)
{
int i;
str[len] = '\0';
num = 0;
}
- /* replace newlines by spaces */
+ /* replace control characters by spaces */
for (i = 0; i < len && str[i]; i++) {
- if (str[i] == '\n')
+ if (str[i] == '\n' || str[i] == '\r' || str[i] == '\f')
str[i] = ' ';
}
if (align == LEFT) {
static int open_stat_pipe(void)
{
static int init = 1;
+ int ret, fds[3] = {0, 1, 0};
+ pid_t pid;
if (init)
init = 0;
else
- sleep(1);
- return para_open_stat_pipe(conf.stat_cmd_arg);
+ /*
+ * Sleep a bit to avoid a busy loop. As the call to sleep() may
+ * be interrupted by SIGCHLD, we simply wait until the call
+ * succeeds.
+ */
+ while (sleep(2))
+ ; /* nothing */
+ ret = para_exec_cmdline_pid(&pid, conf.stat_cmd_arg, fds);
+ if (ret < 0)
+ return ret;
+ ret = mark_fd_nonblocking(fds[1]);
+ if (ret >= 0)
+ return fds[1];
+ close(fds[1]);
+ return ret;
}
/*