void printformat_module_dest_args(const char *module, TEXT_DEST_REC *dest, int formatnum, va_list va) { char *arglist[MAX_FORMAT_PARAMS]; char buffer[DEFAULT_FORMAT_ARGLIST_SIZE]; FORMAT_REC *formats; THEME_REC *theme; char *str; theme = window_get_theme(dest->window); formats = g_hash_table_lookup(default_formats, module); format_read_arglist(va, &formats[formatnum], arglist, sizeof(arglist)/sizeof(char *), buffer, sizeof(buffer)); if (!sending_print_starting) { sending_print_starting = TRUE; signal_emit_id(signal_print_starting, 1, dest); sending_print_starting = FALSE; } signal_emit_id(signal_print_format, 5, theme, module, dest, GINT_TO_POINTER(formatnum), arglist); str = format_get_text_theme_charargs(theme, module, dest, formatnum, arglist); if (str != NULL && *str != '\0') print_line(dest, str); g_free(str); }
static void sig_print_text(TEXT_DEST_REC *dest, const char *text) { THEME_REC *theme; char *str, *tmp; g_return_if_fail(dest != NULL); g_return_if_fail(text != NULL); if (dest->window == NULL) { str = strip_codes(text); printf("NO WINDOWS: %s\n", str); g_free(str); return; } msg_beep_check(dest); if ((dest->level & MSGLEVEL_NEVER) == 0) dest->window->last_line = time(NULL); /* add timestamp/server tag here - if it's done in print_line() it would be written to log files too */ theme = window_get_theme(dest->window); tmp = format_get_line_start(theme, dest, time(NULL)); str = !theme->info_eol ? format_add_linestart(text, tmp) : format_add_lineend(text, tmp); g_free_not_null(tmp); format_send_to_gui(dest, str); g_free(str); signal_emit_id(signal_gui_print_text_finished, 1, dest->window); }
static void sig_pidwait(void *pid, void *statusp) { PROCESS_REC *rec; char *str; int status = GPOINTER_TO_INT(statusp); rec = process_find_pid(GPOINTER_TO_INT(pid)); if (rec == NULL) return; /* process exited - print the last line if there wasn't a newline at end. */ if (line_split("\n", 1, &str, &rec->databuf) > 0 && *str != '\0') signal_emit_id(signal_exec_input, 2, rec, str); if (!rec->silent) { if (WIFSIGNALED(status)) { status = WTERMSIG(status); printtext(NULL, NULL, MSGLEVEL_CLIENTNOTICE, "process %d (%s) terminated with signal %d (%s)", rec->id, rec->args, status, g_strsignal(status)); } else { status = WIFEXITED(status) ? WEXITSTATUS(status) : -1; printtext(NULL, NULL, MSGLEVEL_CLIENTNOTICE, "process %d (%s) terminated with return code %d", rec->id, rec->args, status); } } process_destroy(rec, status); }
static void sig_exec_input_reader(PROCESS_REC *rec) { char tmpbuf[512], *str; unsigned int recvlen; int err, ret; g_return_if_fail(rec != NULL); recvlen = 0; err = g_io_channel_read(rec->in, tmpbuf, sizeof(tmpbuf), &recvlen); if (err != 0 && err != G_IO_ERROR_AGAIN && errno != EINTR) recvlen = -1; do { ret = line_split(tmpbuf, recvlen, &str, &rec->databuf); if (ret == -1) { /* link to terminal closed? */ g_source_remove(rec->read_tag); rec->read_tag = -1; break; } if (ret > 0) { signal_emit_id(signal_exec_input, 2, rec, str); if (recvlen > 0) recvlen = 0; } } while (ret > 0); }
void printformat_module_dest_charargs(const char *module, TEXT_DEST_REC *dest, int formatnum, char **arglist) { THEME_REC *theme; char *str; theme = window_get_theme(dest->window); if (!sending_print_starting) { sending_print_starting = TRUE; signal_emit_id(signal_print_starting, 1, dest); sending_print_starting = FALSE; } signal_emit_id(signal_print_format, 5, theme, module, dest, GINT_TO_POINTER(formatnum), arglist); str = format_get_text_theme_charargs(theme, module, dest, formatnum, arglist); if (str != NULL && *str != '\0') print_line(dest, str); g_free(str); }
static void printtext_dest_args(TEXT_DEST_REC *dest, const char *text, va_list va) { char *str; if (!sending_print_starting) { sending_print_starting = TRUE; signal_emit_id(signal_print_starting, 1, dest); sending_print_starting = FALSE; } str = printtext_get_args(dest, text, va); print_line(dest, str); g_free(str); }
/* NOTE! str must be dynamically allocated and must not be freed after! */ static void rawlog_add(RAWLOG_REC *rawlog, char *str) { if (rawlog->lines->length >= rawlog_lines && rawlog_lines > 0) { void *tmp = g_queue_pop_head(rawlog->lines); g_free(tmp); } if (rawlog->logging) { write_buffer(rawlog->handle, str, strlen(str)); write_buffer(rawlog->handle, "\n", 1); } g_queue_push_tail(rawlog->lines, str); signal_emit_id(signal_rawlog, 2, rawlog, str); }
static int child_check(void) { GSList *tmp, *next; int status; /* wait for each pid.. */ for (tmp = pids; tmp != NULL; tmp = next) { next = tmp->next; if (waitpid(GPOINTER_TO_INT(tmp->data), &status, WNOHANG) > 0) { /* process terminated, remove from list */ pids = g_slist_remove(pids, tmp->data); signal_emit_id(signal_pidwait, 1, GPOINTER_TO_INT(tmp->data)); } } return 1; }
/* NOTE! str must be dynamically allocated and must not be freed after! */ static void rawlog_add(RAWLOG_REC *rawlog, char *str) { if (rawlog->nlines < rawlog_lines || rawlog_lines <= 2) rawlog->nlines++; else { g_free(rawlog->lines->data); rawlog->lines = g_slist_remove(rawlog->lines, rawlog->lines->data); } if (rawlog->logging) { write(rawlog->handle, str, strlen(str)); write(rawlog->handle, "\n", 1); } rawlog->lines = g_slist_append(rawlog->lines, str); signal_emit_id(signal_rawlog, 2, rawlog, str); }
/* Like printtext(), but don't handle %s etc. */ void printtext_string(void *server, const char *target, int level, const char *text) { TEXT_DEST_REC dest; char *str; g_return_if_fail(text != NULL); format_create_dest(&dest, server, target, level, NULL); if (!sending_print_starting) { sending_print_starting = TRUE; signal_emit_id(signal_print_starting, 1, &dest); sending_print_starting = FALSE; } str = printtext_expand_formats(text, &dest.flags); print_line(&dest, str); g_free(str); }
/* Like printtext_window(), but don't handle %s etc. */ void printtext_string_window(WINDOW_REC *window, int level, const char *text) { TEXT_DEST_REC dest; char *str; g_return_if_fail(text != NULL); format_create_dest(&dest, NULL, NULL, level, window != NULL ? window : active_win); if (!sending_print_starting) { sending_print_starting = TRUE; signal_emit_id(signal_print_starting, 1, &dest); sending_print_starting = FALSE; } str = printtext_expand_formats(text, &dest.flags); print_line(&dest, str); g_free(str); }
static void print_line(TEXT_DEST_REC *dest, const char *text) { THEME_REC *theme; char *str, *tmp, *stripped; g_return_if_fail(dest != NULL); g_return_if_fail(text != NULL); theme = window_get_theme(dest->window); tmp = format_get_level_tag(theme, dest); str = !theme->info_eol ? format_add_linestart(text, tmp) : format_add_lineend(text, tmp); g_free_not_null(tmp); /* send both the formatted + stripped (for logging etc.) */ stripped = strip_codes(str); signal_emit_id(signal_print_text, 3, dest, str, stripped); g_free_and_null(dest->hilight_color); g_free(str); g_free(stripped); }