int script_action_show_source_process_cb (void *data, const char *command, int return_code, const char *out, const char *err) { char *pos, *filename, *filename_loaded, line[4096], *ptr_line; char *diff_command; const char *ptr_diff_command; struct t_script_repo *ptr_script; FILE *file; int length, diff_made; /* make C compiler happy */ (void) data; (void) out; if (return_code >= 0) { pos = strrchr (command, '/'); if (err && err[0]) { dogechat_printf (NULL, _("%s%s: error downloading script \"%s\": %s"), dogechat_prefix ("error"), SCRIPT_PLUGIN_NAME, (pos) ? pos + 1 : "?", err); return DOGECHAT_RC_OK; } if (pos) { ptr_script = script_repo_search_by_name_ext (pos + 1); if (ptr_script) { filename = script_config_get_script_download_filename (ptr_script, ".repository"); if (filename) { /* * read file and display content on script buffer * (only if script buffer is still displaying detail of * this script) */ if (script_buffer && script_buffer_detail_script && (script_buffer_detail_script == ptr_script)) { file = fopen (filename, "r"); if (file) { while (!feof (file)) { ptr_line = fgets (line, sizeof (line) - 1, file); if (ptr_line) { dogechat_printf_y (script_buffer, script_buffer_detail_script_last_line++, "%s", ptr_line); } } fclose (file); } else { dogechat_printf_y (script_buffer, script_buffer_detail_script_last_line++, _("Error: file not found")); } dogechat_printf_y (script_buffer, script_buffer_detail_script_last_line++, "%s----------------------------------------" "----------------------------------------", dogechat_color ("lightcyan")); } diff_made = 0; ptr_diff_command = script_config_get_diff_command (); if (ptr_diff_command && ptr_diff_command[0] && (ptr_script->status & SCRIPT_STATUS_NEW_VERSION)) { /* * diff command set => get the diff with a new process, * file will be deleted later (in callback of this new * process) */ filename_loaded = script_repo_get_filename_loaded (ptr_script); if (filename_loaded) { length = strlen (ptr_diff_command) + 1 + strlen (filename_loaded) + 1 + strlen (filename) + 1; diff_command = malloc (length); if (diff_command) { snprintf (diff_command, length, "%s %s %s", ptr_diff_command, filename_loaded, filename); script_buffer_detail_script_last_line++; script_buffer_detail_script_line_diff = script_buffer_detail_script_last_line; dogechat_printf_y (script_buffer, script_buffer_detail_script_last_line++, "%s", diff_command); dogechat_printf_y (script_buffer, script_buffer_detail_script_last_line++, "%s----------------------------------------" "----------------------------------------", dogechat_color ("magenta")); dogechat_hook_process (diff_command, 10000, &script_action_show_diff_process_cb, filename); diff_made = 1; free (diff_command); } free (filename_loaded); } } if (!diff_made) { /* no diff made: delete temporary file now */ unlink (filename); free (filename); } } } } } return DOGECHAT_RC_OK; }
int script_action_show_diff_process_cb (void *data, const char *command, int return_code, const char *out, const char *err) { char **lines, *filename; const char *color; int num_lines, i, diff_color; /* make C compiler happy */ (void) command; if (script_buffer && script_buffer_detail_script && ((return_code == DOGECHAT_HOOK_PROCESS_RUNNING) || (return_code >= 0))) { if (out) { lines = dogechat_string_split (out, "\n", 0, 0, &num_lines); if (lines) { diff_color = dogechat_config_boolean (script_config_look_diff_color); for (i = 0; i < num_lines; i++) { color = NULL; if (diff_color) { switch (lines[i][0]) { case '-': case '<': color = dogechat_color ("red"); break; case '+': case '>': color = dogechat_color ("green"); break; case '@': color = dogechat_color ("cyan"); break; } } dogechat_printf_y (script_buffer, script_buffer_detail_script_last_line++, "%s%s", (color) ? color : "", lines[i]); } dogechat_string_free_split (lines); } } else if (err) { lines = dogechat_string_split (err, "\n", 0, 0, &num_lines); if (lines) { for (i = 0; i < num_lines; i++) { dogechat_printf_y (script_buffer, script_buffer_detail_script_last_line++, "%s", lines[i]); } dogechat_string_free_split (lines); } } if (return_code >= 0) { dogechat_printf_y (script_buffer, script_buffer_detail_script_last_line++, "%s----------------------------------------" "----------------------------------------", dogechat_color ("magenta")); } } if ((return_code == DOGECHAT_HOOK_PROCESS_ERROR) || (return_code >= 0)) { /* last call to this callback: delete temporary file */ filename = (char *)data; unlink (filename); free (filename); } return DOGECHAT_RC_OK; }
void exec_end_command (struct t_exec_cmd *exec_cmd, int return_code) { struct t_gui_buffer *ptr_buffer; struct t_hashtable *hashtable; char str_number[32], *output; int i, buffer_type; if (exec_cmd->hsignal) { hashtable = dogechat_hashtable_new (32, DOGECHAT_HASHTABLE_STRING, DOGECHAT_HASHTABLE_STRING, NULL, NULL); if (hashtable) { dogechat_hashtable_set (hashtable, "command", exec_cmd->command); snprintf (str_number, sizeof (str_number), "%d", exec_cmd->number); dogechat_hashtable_set (hashtable, "number", str_number); dogechat_hashtable_set (hashtable, "name", exec_cmd->name); output = exec_decode_color (exec_cmd, exec_cmd->output[EXEC_STDOUT]); dogechat_hashtable_set (hashtable, "out", output); if (output) free (output); output = exec_decode_color (exec_cmd, exec_cmd->output[EXEC_STDERR]); dogechat_hashtable_set (hashtable, "err", output); if (output) free (output); snprintf (str_number, sizeof (str_number), "%d", return_code); dogechat_hashtable_set (hashtable, "rc", str_number); dogechat_hook_hsignal_send (exec_cmd->hsignal, hashtable); dogechat_hashtable_free (hashtable); } } else { ptr_buffer = dogechat_buffer_search ("==", exec_cmd->buffer_full_name); /* display the last line of output (if not ending with '\n') */ exec_display_line (exec_cmd, ptr_buffer, EXEC_STDOUT, exec_cmd->output[EXEC_STDOUT]); exec_display_line (exec_cmd, ptr_buffer, EXEC_STDERR, exec_cmd->output[EXEC_STDERR]); /* * display return code (only if command is not detached, if output is * NOT sent to buffer, and if command is not piped) */ if (exec_cmd->display_rc && !exec_cmd->detached && !exec_cmd->output_to_buffer && !exec_cmd->pipe_command) { buffer_type = dogechat_buffer_get_integer (ptr_buffer, "type"); if (return_code >= 0) { if (buffer_type == 1) { dogechat_printf_y (ptr_buffer, -1, ("%s: end of command %d (\"%s\"), " "return code: %d"), EXEC_PLUGIN_NAME, exec_cmd->number, exec_cmd->command, return_code); } else { dogechat_printf_tags (ptr_buffer, "exec_rc", _("%s: end of command %d (\"%s\"), " "return code: %d"), EXEC_PLUGIN_NAME, exec_cmd->number, exec_cmd->command, return_code); } } else { if (buffer_type == 1) { dogechat_printf_y (ptr_buffer, -1, _("%s: unexpected end of command %d " "(\"%s\")"), EXEC_PLUGIN_NAME, exec_cmd->number, exec_cmd->command); } else { dogechat_printf_tags (ptr_buffer, "exec_rc", _("%s: unexpected end of command %d " "(\"%s\")"), EXEC_PLUGIN_NAME, exec_cmd->number, exec_cmd->command); } } } } /* (re)set some variables after the end of command */ exec_cmd->hook = NULL; exec_cmd->pid = 0; exec_cmd->end_time = time (NULL); exec_cmd->return_code = return_code; for (i = 0; i < 2; i++) { if (exec_cmd->output[i]) { free (exec_cmd->output[i]); exec_cmd->output[i] = NULL; } exec_cmd->output_size[i] = 0; } /* schedule a timer to remove the executed command */ if (dogechat_config_integer (exec_config_command_purge_delay) >= 0) { dogechat_hook_timer (1 + (1000 * dogechat_config_integer (exec_config_command_purge_delay)), 0, 1, &exec_timer_delete_cb, exec_cmd); } }
void script_action_show (const char *name, int quiet) { struct t_script_repo *ptr_script; char *filename, *url; struct t_hashtable *options; if (name) { ptr_script = script_repo_search_by_name_ext (name); if (ptr_script) { script_buffer_show_detail_script (ptr_script); if (dogechat_config_boolean (script_config_look_display_source)) { dogechat_printf_y (script_buffer, script_buffer_detail_script_last_line++, _("Source code:")); dogechat_printf_y (script_buffer, script_buffer_detail_script_last_line++, "%s----------------------------------------" "----------------------------------------", dogechat_color ("lightcyan")); dogechat_printf_y (script_buffer, script_buffer_detail_script_last_line, _("Downloading script...")); dogechat_printf_y (script_buffer, script_buffer_detail_script_last_line + 1, "%s----------------------------------------" "----------------------------------------", dogechat_color ("lightcyan")); filename = script_config_get_script_download_filename (ptr_script, ".repository"); if (filename) { options = dogechat_hashtable_new (32, DOGECHAT_HASHTABLE_STRING, DOGECHAT_HASHTABLE_STRING, NULL, NULL); if (options) { url = script_build_download_url (ptr_script->url); if (url) { dogechat_hashtable_set (options, "file_out", filename); dogechat_hook_process_hashtable ( url, options, dogechat_config_integer (script_config_scripts_download_timeout) * 1000, &script_action_show_source_process_cb, NULL); free (url); } dogechat_hashtable_free (options); } free (filename); } } } else { if (!quiet) { dogechat_printf (NULL, _("%s: script \"%s\" not found"), SCRIPT_PLUGIN_NAME, name); } } } else script_buffer_show_detail_script (NULL); }
void exec_display_line (struct t_exec_cmd *exec_cmd, struct t_gui_buffer *buffer, int out, const char *line) { char *line_color, *line2, str_number[32], str_tags[1024]; int length; if (!exec_cmd || !line) return; /* * if output is sent to the buffer, the buffer must exist * (we don't send output by default to core buffer) */ if (exec_cmd->output_to_buffer && !exec_cmd->pipe_command && !buffer) return; /* decode colors */ line_color = exec_decode_color (exec_cmd, line); if (!line_color) return; exec_cmd->output_line_nb++; if (exec_cmd->pipe_command) { if (strstr (exec_cmd->pipe_command, "$line")) { /* replace $line by line content */ line2 = dogechat_string_replace (exec_cmd->pipe_command, "$line", line_color); if (line2) { dogechat_command (buffer, line2); free (line2); } } else { /* add line at the end of command, after a space */ length = strlen (exec_cmd->pipe_command) + 1 + strlen (line_color) + 1; line2 = malloc (length); if (line2) { snprintf (line2, length, "%s %s", exec_cmd->pipe_command, line_color); dogechat_command (buffer, line2); free (line2); } } } else if (exec_cmd->output_to_buffer) { if (exec_cmd->line_numbers) { length = 32 + strlen (line_color) + 1; line2 = malloc (length); if (line2) { snprintf (line2, length, "%d. %s", exec_cmd->output_line_nb, line_color); dogechat_command (buffer, line2); free (line2); } } else dogechat_command (buffer, (line_color[0]) ? line_color : " "); } else { snprintf (str_number, sizeof (str_number), "%d", exec_cmd->number); snprintf (str_tags, sizeof (str_tags), "exec_%s,exec_cmd_%s", (out == EXEC_STDOUT) ? "stdout" : "stderr", (exec_cmd->name) ? exec_cmd->name : str_number); if (dogechat_buffer_get_integer (buffer, "type") == 1) { snprintf (str_number, sizeof (str_number), "%d. ", exec_cmd->output_line_nb); dogechat_printf_y (buffer, -1, "%s%s", (exec_cmd->line_numbers) ? str_number : " ", line_color); } else { snprintf (str_number, sizeof (str_number), "%d\t", exec_cmd->output_line_nb); dogechat_printf_tags (buffer, str_tags, "%s%s", (exec_cmd->line_numbers) ? str_number : " \t", line_color); } } }