Merge "citrix" branch into "master".
[openvswitch] / lib / socket-util.c
index d2ee8ea4fb7ad9267dc0132d3d55e0c390bf9eb9..912c47e097f8e80c807cabf3cfddcab343594184 100644 (file)
@@ -204,7 +204,7 @@ make_sockaddr_un(const char *name, struct sockaddr_un* un, socklen_t *un_len)
  *
  * Returns the socket's fd if successful, otherwise a negative errno value. */
 int
-make_unix_socket(int style, bool nonblock, bool passcred UNUSED,
+make_unix_socket(int style, bool nonblock, bool passcred OVS_UNUSED,
                  const char *bind_path, const char *connect_path)
 {
     int error;
@@ -557,3 +557,34 @@ write_fully(int fd, const void *p_, size_t size, size_t *bytes_written)
     }
     return 0;
 }
+
+/* Given file name 'file_name', fsyncs the directory in which it is contained.
+ * Returns 0 if successful, otherwise a positive errno value. */
+int
+fsync_parent_dir(const char *file_name)
+{
+    int error = 0;
+    char *dir;
+    int fd;
+
+    dir = dir_name(file_name);
+    fd = open(dir, O_RDONLY);
+    if (fd >= 0) {
+        if (fsync(fd)) {
+            if (errno == EINVAL || errno == EROFS) {
+                /* This directory does not support synchronization.  Not
+                 * really an error. */
+            } else {
+                error = errno;
+                VLOG_ERR("%s: fsync failed (%s)", dir, strerror(error));
+            }
+        }
+        close(fd);
+    } else {
+        error = errno;
+        VLOG_ERR("%s: open failed (%s)", dir, strerror(error));
+    }
+    free(dir);
+
+    return error;
+}