From 2adaa7bdfab5b62ed18a57a94fe150ca66026328 Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Mon, 13 Oct 2014 13:38:28 +0100 Subject: [PATCH] Do not assert on SIGTERM and backup modified buffers on signal induced termination --- src/buffer_manager.cc | 9 +++++++++ src/buffer_manager.hh | 2 ++ src/file.cc | 13 +++++++++++++ src/file.hh | 1 + src/main.cc | 12 ++++++++++-- 5 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/buffer_manager.cc b/src/buffer_manager.cc index b55ecf73..400c9f5b 100644 --- a/src/buffer_manager.cc +++ b/src/buffer_manager.cc @@ -105,6 +105,15 @@ void BufferManager::set_last_used_buffer(Buffer& buffer) m_buffers.emplace(m_buffers.begin(), &buffer); } +void BufferManager::backup_modified_buffers() +{ + for (auto& buf : m_buffers) + { + if ((buf->flags() & Buffer::Flags::File) and buf->is_modified()) + write_buffer_to_backup_file(*buf); + } +} + CandidateList BufferManager::complete_buffer_name(StringView prefix, ByteCount cursor_pos) { diff --git a/src/buffer_manager.hh b/src/buffer_manager.hh index 474833c4..da0dea8f 100644 --- a/src/buffer_manager.hh +++ b/src/buffer_manager.hh @@ -34,6 +34,8 @@ public: Buffer& get_buffer(StringView name); void set_last_used_buffer(Buffer& buffer); + void backup_modified_buffers(); + CandidateList complete_buffer_name(StringView prefix, ByteCount cursor_pos = -1); diff --git a/src/file.cc b/src/file.cc index 66064bbf..11159805 100644 --- a/src/file.cc +++ b/src/file.cc @@ -209,6 +209,19 @@ void write_buffer_to_file(Buffer& buffer, StringView filename) buffer.run_hook_in_own_context("BufWritePost", buffer.name()); } +void write_buffer_to_backup_file(Buffer& buffer) +{ + char pattern[PATH_MAX+1]; + snprintf(pattern, PATH_MAX+1, ".%s.kak.XXXXXX", + real_path(buffer.name()).c_str()); + int fd = mkstemp(pattern); + if (fd >= 0) + { + write_buffer_to_fd(buffer, fd); + close(fd); + } +} + String find_file(StringView filename, memoryview paths) { struct stat buf; diff --git a/src/file.hh b/src/file.hh index 3fe4bee9..e3c03fba 100644 --- a/src/file.hh +++ b/src/file.hh @@ -36,6 +36,7 @@ Buffer* create_buffer_from_file(String filename); void write_buffer_to_file(Buffer& buffer, StringView filename); void write_buffer_to_fd(Buffer& buffer, int fd); +void write_buffer_to_backup_file(Buffer& buffer); String find_file(StringView filename, memoryview paths); diff --git a/src/main.cc b/src/main.cc index 654d3dc5..42d9bf1c 100644 --- a/src/main.cc +++ b/src/main.cc @@ -252,10 +252,18 @@ void signal_handler(int signal) case SIGQUIT: text = "SIGQUIT"; break; case SIGTERM: text = "SIGTERM"; break; } - on_assert_failed(text); + if (signal != SIGTERM) + on_assert_failed(text); + if (Server::has_instance()) Server::instance().close_session(); - abort(); + if (BufferManager::has_instance()) + BufferManager::instance().backup_modified_buffers(); + + if (signal == SIGTERM) + exit(-1); + else + abort(); } int run_client(StringView session, StringView init_command)