aboutsummaryrefslogtreecommitdiff
path: root/src/system.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/system.c')
-rw-r--r--src/system.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/system.c b/src/system.c
index 2f95661..ccb7ccd 100644
--- a/src/system.c
+++ b/src/system.c
@@ -122,3 +122,49 @@ int ftag_execvp(char *const *cmd, int can_exit)
}
return status;
}
+
+char *edit(const char *initial_content)
+{
+ char tmp_file[32];
+ int tmp_fd;
+ int rc;
+ char *env_editor;
+ char editor_cmd[512];
+ char *cmd[] = {
+ "sh",
+ "-c",
+ editor_cmd,
+ NULL
+ };
+ char *new_content;
+ strcpy(tmp_file, "/tmp/ftag-XXXXXX");
+ tmp_fd = mkstemp(tmp_file);
+ sys_check(tmp_fd != -1, "mkstemp");
+ rc = write(tmp_fd, initial_content, strlen(initial_content));
+ sys_check(rc != -1, "write");
+ env_editor = getenv("EDITOR");
+ if (env_editor)
+ strbuild(editor_cmd, "%s %s", env_editor, tmp_file);
+ else
+ strbuild(editor_cmd, "%s %s", "nano", tmp_file);
+ ftag_execvp(cmd, 1);
+ new_content = file_to_string(tmp_fd);
+ close(tmp_fd);
+ return new_content;
+}
+
+char *file_to_string(int fd)
+{
+ struct stat st;
+ char *content;
+ int rc;
+ rc = lseek(fd, 0L, SEEK_SET);
+ sys_check(rc != -1, "lseek");
+ rc = fstat(fd, &st);
+ sys_check(rc != -1, "stat");
+ content = malloc(st.st_size + 1);
+ rc = read(fd, content, st.st_size);
+ sys_check(rc != -1, "read");
+ content[st.st_size] = '\0';
+ return content;
+}