X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fsocket-util.c;h=912c47e097f8e80c807cabf3cfddcab343594184;hb=7103dec49eb569c3196239da6c178a29c3003e2b;hp=d2ee8ea4fb7ad9267dc0132d3d55e0c390bf9eb9;hpb=36775dad3505929f8370166c33e8e0f04ca96c1c;p=openvswitch diff --git a/lib/socket-util.c b/lib/socket-util.c index d2ee8ea4..912c47e0 100644 --- a/lib/socket-util.c +++ b/lib/socket-util.c @@ -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; +}