chiark / gitweb /
Get rid of write_safe
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 28 Jan 2014 23:23:38 +0000 (18:23 -0500)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 29 Jan 2014 00:07:12 +0000 (19:07 -0500)
Current glibc implementation is safe. Kernel does this atomically,
and write is actually implemented through writev. So if write is
async-signal-safe, than writev pretty much must be too.

src/journal/journal-send.c
src/shared/util.c
src/test/test-util.c

index 960c5776b0350bf2e6b9828a19361d8b3c9d0efe..ca9199f7187d79657c5c115c4b25758d1ebba340 100644 (file)
@@ -314,7 +314,7 @@ _public_ int sd_journal_sendv(const struct iovec *iov, int n) {
         if (buffer_fd < 0)
                 return buffer_fd;
 
-        n = writev_safe(buffer_fd, w, j);
+        n = writev(buffer_fd, w, j);
         if (n < 0) {
                 close_nointr_nofail(buffer_fd);
                 return -errno;
index 2b91ef8a8f9b203f71304c26bc50b420f5a52274..30512d16462bf5c528660a66a9ab8e10380ed402 100644 (file)
@@ -6093,24 +6093,6 @@ int getpeersec(int fd, char **ret) {
         return 0;
 }
 
-int writev_safe(int fd, const struct iovec *w, int j) {
-        for (int i = 0; i < j; i++) {
-                size_t written = 0;
-
-                while (written < w[i].iov_len) {
-                        ssize_t r;
-
-                        r = write(fd, (char*) w[i].iov_base + written, w[i].iov_len - written);
-                        if (r < 0 && errno != -EINTR)
-                                return -errno;
-
-                        written += r;
-                }
-        }
-
-        return 0;
-}
-
 int mkostemp_safe(char *pattern, int flags) {
         unsigned long tries = TMP_MAX;
         char *s;
index 43bb0249a20e8833cca18d47ff24d9a1b8772d08..9d6f4be5023690386848683314238f219a818b59 100644 (file)
@@ -580,8 +580,8 @@ static void test_in_set(void) {
         assert_se(!IN_SET(0, 1, 2, 3, 4));
 }
 
-static void test_writev_safe(void) {
-        char name[] = "/tmp/test-writev_safe.XXXXXX";
+static void test_writing_tmpfile(void) {
+        char name[] = "/tmp/test-systemd_writing_tmpfile.XXXXXX";
         _cleanup_free_ char *contents;
         size_t size;
         int fd, r;
@@ -592,10 +592,10 @@ static void test_writev_safe(void) {
         IOVEC_SET_STRING(iov[2], "");
 
         fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
-        printf("test_writev_safe: %s", name);
+        printf("tmpfile: %s", name);
 
-        r = writev_safe(fd, iov, 3);
-        assert(r == 0);
+        r = writev(fd, iov, 3);
+        assert(r >= 0);
 
         r = read_full_file(name, &contents, &size);
         assert(r == 0);
@@ -640,7 +640,7 @@ int main(int argc, char *argv[]) {
         test_fstab_node_to_udev_node();
         test_get_files_in_directory();
         test_in_set();
-        test_writev_safe();
+        test_writing_tmpfile();
 
         return 0;
 }