return 1;
}
-static int read_audiod_pipe(int fd)
+static int read_audiod_pipe(fd_set *rfds)
{
static char *buf;
static int bufsize, loaded;
- int ret;
+ int ret, ret2;
+ size_t sz;
+ if (audiod_pipe < 0)
+ return 0;
if (loaded >= bufsize) {
if (bufsize > 1000 * 1000) {
loaded = 0;
buf = para_realloc(buf, bufsize);
}
assert(loaded < bufsize);
- ret = read(fd, buf + loaded, bufsize - loaded);
- if (ret <= 0)
- return ret;
- loaded += ret;
- ret = for_each_stat_item(buf, loaded, update_item);
- if (ret < 0)
- return ret;
- if (ret > 0 && ret < loaded)
- memmove(buf, buf + loaded - ret, ret);
- loaded = ret;
+ ret = read_nonblock(audiod_pipe, buf + loaded, bufsize - loaded,
+ rfds, &sz);
+ loaded += sz;
+ ret2 = for_each_stat_item(buf, loaded, update_item);
+ if (ret < 0 || ret2 < 0) {
+ loaded = 0;
+ return ret2 < 0? ret2 : ret;
+ }
+ sz = ret2; /* what is left */
+ if (sz > 0 && sz < loaded)
+ memmove(buf, buf + loaded - sz, sz);
+ loaded = sz;
return 1;
}
{
fd_set rfds;
int ret;
- int max_fileno, cp_numread = 1;
+ int max_fileno;
char command_buf[4096] = "";
int cbo = 0; /* command buf offset */
struct timeval tv;
if (ret > 0)
handle_signal(ret);
/* read command pipe if ready */
- if (command_pipe >= 0 && mode == COMMAND_MODE &&
- FD_ISSET(command_pipe, &rfds)) {
- cp_numread = read(command_pipe, command_buf + cbo,
- sizeof(command_buf) - 1 - cbo);
- if (cp_numread >= 0)
- cbo += cp_numread;
- else {
- if (cp_numread < 0)
- PARA_ERROR_LOG("read error (%d)", cp_numread);
+ if (command_pipe >= 0 && mode == COMMAND_MODE) {
+ size_t sz;
+ ret = read_nonblock(command_pipe, command_buf + cbo,
+ sizeof(command_buf) - 1 - cbo, &rfds, &sz);
+ cbo += sz;
+ sz = cbo;
+ cbo = for_each_line(command_buf, cbo, &add_output_line, NULL);
+ if (sz != cbo)
+ wrefresh(bot.win);
+ if (ret < 0) {
+ PARA_NOTICE_LOG("closing command pipe: %s",
+ para_strerror(-ret));
close(command_pipe);
command_pipe = -1;
+ return 0;
}
}
- if (audiod_pipe >= 0 && FD_ISSET(audiod_pipe, &rfds))
- if (read_audiod_pipe(audiod_pipe) <= 0) {
- close(audiod_pipe);
- audiod_pipe = -1;
- clear_all_items();
- free(stat_content[SI_BASENAME]);
- stat_content[SI_BASENAME] =
- para_strdup("audiod not running!?");
- print_all_items();
- }
+ ret = read_audiod_pipe(&rfds);
+ if (ret < 0) {
+ PARA_NOTICE_LOG("closing audiod pipe: %s\n", para_strerror(-ret));
+ close(audiod_pipe);
+ audiod_pipe = -1;
+ clear_all_items();
+ free(stat_content[SI_BASENAME]);
+ stat_content[SI_BASENAME] =
+ para_strdup("stat command terminated!?");
+ print_all_items();
+ }
check_return:
switch (mode) {
case COMMAND_MODE:
- if (cp_numread <= 0 && !cbo) /* command complete */
- return 0;
- if (cbo)
- cbo = for_each_line(command_buf, cbo,
- &add_output_line, NULL);
- if (cp_numread <= 0)
- cbo = 0;
- wrefresh(bot.win);
ret = wgetch(top.win);
if (ret != ERR && ret != KEY_RESIZE) {
if (command_pipe) {