From 35b0b0f19479436d980ef20bfe2ff26a0a19f9ea Mon Sep 17 00:00:00 2001 From: Stefan Date: Sun, 11 Apr 2021 09:06:21 +0200 Subject: [PATCH] Editor command: filename / sensible-editor * Generating a unique file name in tmp_dir folder * Changed exec of vim to exec of sensible-editor * Test file exists and create file with "private" rights * Send a preview of the message in the window * Delete temp file --- src/command/cmd_funcs.c | 59 ++++++++++++++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 9 deletions(-) diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index cd6d8308..c85b6c78 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -9314,33 +9314,74 @@ cmd_change_password(ProfWin* window, const char* const command, gchar** args) gboolean cmd_editor(ProfWin* window, const char* const command, gchar** args) { - const char* filename = "/tmp/profanity.txt"; + /* Build temp file name */ + GString * tempfile = g_string_new(g_get_tmp_dir()); + g_string_append(tempfile, "/profanity-"); + xmpp_ctx_t* const ctx = connection_get_ctx(); + if(!ctx) { + cons_show("Editor: Not connection"); + return TRUE; + } + char* uuid = xmpp_uuid_gen(ctx); + g_string_append(tempfile, uuid); + if (uuid) { + xmpp_free(ctx, uuid); + } + g_string_append(tempfile, ".txt"); + + // tempfile should be something like + // /tmp/profanity-f2f271dd-98c8-4118-8d47-3bd49c8e2e63.txt + const char* filename = tempfile->str; + + // Check if file exists and create file + if (g_file_test(filename, G_FILE_TEST_EXISTS)) { + cons_show("Editor: The temp file exists"); + g_string_free (tempfile, TRUE); + return TRUE; + } + + GError* creation_error = NULL; + GFile* file = g_file_new_for_path(filename); + GFileOutputStream* fos = g_file_create (file, + G_FILE_CREATE_PRIVATE, NULL, + &creation_error); + if ( creation_error ) { + cons_show("Editor: Error during file creation"); + return TRUE; + } + g_object_unref(fos); + + // Fork / exec pid_t pid = fork(); if( pid == 0 ) { - int x = execl("/usr/bin/vim", "/usr/bin/vim", filename, (char *) NULL); + int x = execl("/usr/bin/sensible-editor", "/usr/bin/sensible-editor", g_file_get_path(file), (char *) NULL); if ( x == -1 ) { - cons_show_error("Failed to exec vim"); + cons_show_error("Failed to exec sensible-editor"); } } else { int status = 0; waitpid(pid, &status, 0); - ui_redraw(); - - int fd_input_file = open(filename, O_RDONLY); + int fd_input_file = open(g_file_get_path(file), O_RDONLY); const size_t COUNT = 8192; char buf[COUNT]; ssize_t size_read = read(fd_input_file, buf, COUNT); if(size_read > 0 && size_read <= COUNT ) { buf[size_read-1] = '\0'; GString* text = g_string_new(buf); - //ProfWin* window = wins_get_current(); - //cmd_process_input(window, text->str); + ProfWin* win = wins_get_current(); + win_println(win, THEME_DEFAULT, "!", "EDITOR PREVIEW: %s", text->str); rl_insert_text(text->str); g_string_free(text, TRUE); } close(fd_input_file); ui_redraw(); + GError* deletion_error = NULL; + g_file_delete (file, NULL, &deletion_error); + if ( deletion_error ) { + cons_show("Editor: Error during file deletion"); + return TRUE; + } + g_object_unref(file); } - return TRUE; }