diff options
Diffstat (limited to '')
-rw-r--r-- | copier.c | 12 | ||||
-rw-r--r-- | editasroot.c | 6 |
2 files changed, 9 insertions, 9 deletions
@@ -22,6 +22,7 @@ main(int argc, char *argv[]) path = argv[0]; parentfd = atoi(argv[1]); + /* Send content of file to parent */ filefd = open(path, O_RDWR); /* O_RDWR establishes that we can indeed write to the file */ if (filefd < 0) { fprintf(stderr, "%s: open %s O_RDWR: %s\n", argv0, path, strerror(errno)); @@ -37,13 +38,18 @@ main(int argc, char *argv[]) exit(1); } - r = read(parentfd, &b, 1); - if (r != 1) { - if (r) + /* Wait for parent to start sending the new file content, + * so that O_TRUNC does not cause the file to be truncated + * without new content being sent in case the parent exited + * abnormally. */ + r = recv(parentfd, &b, 1, MSG_PEEK); + if (r <= 0) { + if (r < 0) fprintf(stderr, "%s: read %s: %s\n", argv0, path, strerror(errno)); exit(1); } + /* Rewrite file with content sent from parent */ filefd = open(path, O_WRONLY | O_TRUNC); if (filefd < 0) { fprintf(stderr, "%s: open %s O_WRONLY|O_TRUNC: %s\n", argv0, path, strerror(errno)); diff --git a/editasroot.c b/editasroot.c index 09479f8..0a092cd 100644 --- a/editasroot.c +++ b/editasroot.c @@ -230,12 +230,6 @@ main(int argc, char *argv[]) /* Start file editor */ run_editor(editor, path, fds[0]); - /* Signal to child that editor exited as expected */ - if (write(fds[0], &(char){1}, 1) != 1) { - fprintf(stderr, "%s: write <socket to child>: %s", argv0, strerror(errno)); - exit(1); - } - /* Rewrite file from tmpfile and unlink tmpfile */ fd = open(path, O_RDONLY); if (fd < 0) { |