return ret;
}
-static int read_audiod_pipe(int fd, line_handler_t *line_handler)
-{
- static char buf[4096];
- const ssize_t bufsize = sizeof(buf) - 1;
- static ssize_t loaded;
- ssize_t ret;
-
- if (loaded >= bufsize)
- loaded = 0;
- ret = read(fd, buf + loaded, bufsize - loaded);
- if (ret > 0) {
- loaded += ret;
- buf[loaded] = '\0';
- loaded = for_each_line(buf, loaded, line_handler, NULL);
- }
- return ret;
-}
-
static int find_cmd_byname(char *name)
{
int i;
para_install_sighandler(SIGCHLD);
para_install_sighandler(SIGWINCH);
para_install_sighandler(SIGUSR1);
-// signal(SIGPIPE, SIG_IGN);
- signal(SIGHUP, SIG_IGN);
+ para_sigaction(SIGHUP, SIG_IGN);
}
__noreturn static void do_exit(int ret)
{
- signal(SIGTERM, SIG_IGN);
+ para_sigaction(SIGTERM, SIG_IGN);
kill(0, SIGTERM);
exit(ret);
}
wrefresh(top.win);
}
+/*
+ * print status line if line starts with known command.
+ */
+static int update_item(int item_num, char *buf)
+{
+ free(stat_content[item_num]);
+ stat_content[item_num] = para_strdup(buf);
+ print_stat_item(item_num);
+ return 1;
+}
+
+static int read_audiod_pipe(int fd)
+{
+ static char buf[8192];
+ static int loaded;
+ int ret;
+
+ if (loaded >= sizeof(buf)) /* overflow */
+ return 0;
+ ret = read(fd, buf + loaded, sizeof(buf) - loaded);
+ if (ret <= 0)
+ return ret;
+ loaded += ret;
+ ret = for_each_stat_item(buf, loaded, update_item);
+ if (ret < 0)
+ return ret;
+ loaded = ret;
+ return 1;
+}
+
static void print_all_items(void)
{
int i;
goto reap_next_child;
}
-/*
- * print status line if line starts with known command.
- */
-static int check_stat_line(char *line, __a_unused void *data)
-{
- int i;
-
-// PARA_INFO_LOG("%s: checking: %s\n", __func__, line);
- i = stat_line_valid(line);
- if (i >= 0) {
- line += strlen(status_item_list[i]) + 1;
- if (*line == ' ')
- line++;
- free(stat_content[i]);
- stat_content[i] = para_strdup(line);
- print_stat_item(i);
- }
- return 1;
-}
-
/*
* This sucker modifies its first argument. *handler and *arg are
* pointers to 0-terminated strings (inside line). Crap.
return;
case SIGINT:
PARA_WARNING_LOG("caught SIGINT, reset");
- /* Nothing to do. SIGINT killed our child, para_client stat.
- * This get noticed by do_select which resets everything
+ /* Nothing to do. SIGINT killed our child which gets noticed
+ * by do_select and resets everything.
*/
return;
case SIGUSR1:
}
}
if (audiod_pipe >= 0 && FD_ISSET(audiod_pipe, &rfds))
- if (read_audiod_pipe(audiod_pipe, check_stat_line) <= 0) {
+ if (read_audiod_pipe(audiod_pipe) <= 0) {
close(audiod_pipe);
audiod_pipe = -1;
clear_all_items();
{
unsigned lines;
int fvr = first_visible_rbe(&lines);
+
if (fvr < 0 || fvr + 1 >= ringbuffer_filled(bot_win_rb)) {
print_in_bar(COLOR_ERRMSG, "top of buffer is shown\n");
return;
}
scroll_position = fvr + 1;
for (; scroll_position > 0; scroll_position--) {
- fvr = first_visible_rbe(&lines);
+ first_visible_rbe(&lines);
if (lines == bot.lines)
break;
}