summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/buffer_manager.cc9
-rw-r--r--src/buffer_manager.hh2
-rw-r--r--src/file.cc13
-rw-r--r--src/file.hh1
-rw-r--r--src/main.cc12
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<String> 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<String> 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)