X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=interactive.c;h=1376cf1d72739b3f7c9c3218dd96666a5d475812;hb=HEAD;hp=041376a1057bcf2e98a4c23c2b23c42d73a68345;hpb=4314f515abc204cc1696427f34aa9822d1a7150b;p=paraslash.git diff --git a/interactive.c b/interactive.c index 041376a1..1376cf1d 100644 --- a/interactive.c +++ b/interactive.c @@ -189,8 +189,6 @@ static char **i9e_completer(const char *text, int start, __a_unused int end) * * This function attaches the i9e input queue to an output queue of \a * producer. - * - * \return Standard. */ void i9e_attach_to_stdout(struct btr_node *producer) { @@ -258,18 +256,6 @@ static void clear_bottom_line(void) rl_point = point; } -static bool input_available(void) -{ - fd_set rfds; - struct timeval tv = {0, 0}; - int ret; - - FD_ZERO(&rfds); - FD_SET(i9ep->ici->fds[0], &rfds); - ret = para_select(1, &rfds, NULL, &tv); - return ret > 0; -} - static void i9e_line_handler(char *line) { int ret; @@ -294,14 +280,14 @@ free_line: free(line); } -static int i9e_post_select(__a_unused struct sched *s, __a_unused void *context) +static int i9e_post_monitor(__a_unused struct sched *s, __a_unused void *context) { int ret; struct i9e_client_info *ici = i9ep->ici; char *buf; size_t sz, consumed = 0; - ret = -E_I9E_EOF; + ret = -E_EOF; if (i9ep->input_eof) goto rm_btrn; ret = -E_I9E_TERM_RQ; @@ -310,7 +296,7 @@ static int i9e_post_select(__a_unused struct sched *s, __a_unused void *context) ret = 0; if (i9ep->caught_sigint) goto rm_btrn; - while (input_available()) { + while (read_ok(i9ep->ici->fds[0]) > 0) { if (i9ep->stdout_btrn) { while (i9ep->key_sequence_length < sizeof(i9ep->key_sequence) - 1) { buf = i9ep->key_sequence + i9ep->key_sequence_length; @@ -320,14 +306,14 @@ static int i9e_post_select(__a_unused struct sched *s, __a_unused void *context) goto rm_btrn; } if (ret == 0) { - ret = -E_I9E_EOF; + ret = -E_EOF; goto rm_btrn; } buf[1] = '\0'; i9ep->key_sequence_length++; rl_stuff_char((int)(unsigned char)*buf); rl_callback_read_char(); - if (!input_available()) + if (read_ok(i9ep->ici->fds[0]) <= 0) break; } i9ep->key_sequence_length = 0; @@ -374,7 +360,7 @@ out: return ret; } -static void i9e_pre_select(struct sched *s, __a_unused void *context) +static void i9e_pre_monitor(struct sched *s, __a_unused void *context) { int ret; @@ -389,7 +375,7 @@ static void i9e_pre_select(struct sched *s, __a_unused void *context) return; } if (ret > 0) - para_fd_set(i9ep->ici->fds[1], &s->wfds, &s->max_fileno); + sched_monitor_writefd(i9ep->ici->fds[1], s); } /* * fd[0] might have been reset to blocking mode if our job was moved to @@ -400,7 +386,7 @@ static void i9e_pre_select(struct sched *s, __a_unused void *context) if (ret < 0) PARA_WARNING_LOG("set to nonblock failed: (fd0 %d, %s)\n", i9ep->ici->fds[0], para_strerror(-ret)); - para_fd_set(i9ep->ici->fds[0], &s->rfds, &s->max_fileno); + sched_monitor_readfd(i9ep->ici->fds[0], s); } static void update_winsize(void) @@ -477,8 +463,8 @@ int i9e_open(struct i9e_client_info *ici, struct sched *s) return ret; i9ep->task = task_register(&(struct task_info) { .name = "i9e", - .pre_select = i9e_pre_select, - .post_select = i9e_post_select, + .pre_monitor = i9e_pre_monitor, + .post_monitor = i9e_post_monitor, .context = i9ep, }, s); @@ -605,23 +591,21 @@ void i9e_signal_dispatch(int sig_num) } /** - * Wrapper for select(2) which does not restart on interrupts. + * Wrapper for poll(2) which handles EINTR and returns paraslash error codes. * - * \param n \sa \ref para_select(). - * \param readfds \sa \ref para_select(). - * \param writefds \sa \ref para_select(). - * \param timeout_tv \sa \ref para_select(). + * \param fds See poll(2). + * \param nfds See poll(2). + * \param timeout See poll(2). * - * \return \sa \ref para_select(). + * \return See poll(2). * - * The only difference between this function and \ref para_select() is that - * \ref i9e_select() returns zero if the select call returned \p EINTR. + * The only difference between this function and \ref xpoll() is that \ref + * i9e_poll() returns zero if the system call was interrupted while xpoll() + * restarts the system call in this case. */ -int i9e_select(int n, fd_set *readfds, fd_set *writefds, - struct timeval *timeout_tv) +int i9e_poll(struct pollfd *fds, nfds_t nfds, int timeout) { - int ret = select(n, readfds, writefds, NULL, timeout_tv); - + int ret = poll(fds, nfds, timeout); if (ret < 0) { if (errno == EINTR) ret = 0; @@ -650,7 +634,7 @@ int i9e_select(int n, fd_set *readfds, fd_set *writefds, int i9e_extract_completions(const char *word, char **string_list, char ***result) { - char **matches = para_malloc(sizeof(char *)); + char **matches = alloc(sizeof(char *)); int match_count = 0, matches_len = 1; char **p; int len = strlen(word); @@ -661,8 +645,8 @@ int i9e_extract_completions(const char *word, char **string_list, match_count++; if (match_count >= matches_len) { matches_len *= 2; - matches = para_realloc(matches, - matches_len * sizeof(char *)); + matches = arr_realloc(matches, matches_len, + sizeof(char *)); } matches[match_count - 1] = para_strdup(*p); } @@ -698,7 +682,7 @@ char **i9e_complete_commands(const char *word, struct i9e_completer *completers) if (is_prefix(word, cmd, len)) match_count++; } - matches = para_malloc((match_count + 1) * sizeof(*matches)); + matches = arr_alloc(match_count + 1, sizeof(*matches)); for (i = 0, match_count = 0; (cmd = completers[i].name); i++) if (is_prefix(word, cmd, len)) matches[match_count++] = para_strdup(cmd); @@ -782,7 +766,7 @@ int i9e_print_completions(struct i9e_completer *completers) if (*p == ' ') p++; n = end - p + 1; - ci.word = para_malloc(n + 1); + ci.word = alloc(n + 1); strncpy(ci.word, p, n); ci.word[n] = '\0'; create_matches: @@ -810,3 +794,25 @@ create_matches: free(ci.word); return ret; } + +/** + * Complete on severity strings. + * + * \param ci See struct \ref i9e_completer. + * \param cr See struct \ref i9e_completer. + * + * This is used by para_client and para_audioc which need the same completion + * primitive for the ll server/audiod command. Both define their own completer + * which is implemented as a trivial wrapper that calls this function. + */ +void i9e_ll_completer(struct i9e_completion_info *ci, + struct i9e_completion_result *cr) +{ + char *sev[] = {SEVERITIES, NULL}; + + if (ci->word_num != 1) { + cr->matches = NULL; + return; + } + i9e_extract_completions(ci->word, sev, &cr->matches); +}