Setting tag sliver-openvswitch-2.2.90-1
[sliver-openvswitch.git] / lib / stream-unix.c
index 14680ac..b3d70b6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks.
+ * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,7 +16,6 @@
 
 #include <config.h>
 #include "stream.h"
-#include <assert.h>
 #include <errno.h>
 #include <inttypes.h>
 #include <netdb.h>
@@ -30,6 +29,7 @@
 #include "packets.h"
 #include "poll-loop.h"
 #include "socket-util.h"
+#include "dirs.h"
 #include "util.h"
 #include "stream-provider.h"
 #include "stream-fd.h"
@@ -39,32 +39,30 @@ VLOG_DEFINE_THIS_MODULE(stream_unix);
 
 /* Active UNIX socket. */
 
-/* Number of unix sockets created so far, to ensure binding path uniqueness. */
-static int n_unix_sockets;
-
 static int
-unix_open(const char *name, char *suffix, struct stream **streamp)
+unix_open(const char *name, char *suffix, struct stream **streamp,
+          uint8_t dscp OVS_UNUSED)
 {
-    const char *connect_path = suffix;
-    char *bind_path;
+    char *connect_path;
     int fd;
 
-    bind_path = xasprintf("/tmp/stream-unix.%ld.%d",
-                          (long int) getpid(), n_unix_sockets++);
-    fd = make_unix_socket(SOCK_STREAM, true, false, bind_path, connect_path);
+    connect_path = abs_file_name(ovs_rundir(), suffix);
+    fd = make_unix_socket(SOCK_STREAM, true, NULL, connect_path);
+
     if (fd < 0) {
-        VLOG_ERR("%s: connection to %s failed: %s",
-                 bind_path, connect_path, strerror(-fd));
-        free(bind_path);
+        VLOG_DBG("%s: connection failed (%s)",
+                 connect_path, ovs_strerror(-fd));
+        free(connect_path);
         return -fd;
     }
 
-    return new_fd_stream(name, fd, check_connection_completion(fd),
-                         bind_path, streamp);
+    free(connect_path);
+    return new_fd_stream(name, fd, check_connection_completion(fd), streamp);
 }
 
-struct stream_class unix_stream_class = {
+const struct stream_class unix_stream_class = {
     "unix",                     /* name */
+    false,                      /* needs_probes */
     unix_open,                  /* open */
     NULL,                       /* close */
     NULL,                       /* connect */
@@ -77,38 +75,41 @@ struct stream_class unix_stream_class = {
 \f
 /* Passive UNIX socket. */
 
-static int punix_accept(int fd, const struct sockaddr *sa, size_t sa_len,
-                        struct stream **streamp);
+static int punix_accept(int fd, const struct sockaddr_storage *ss,
+                        size_t ss_len, struct stream **streamp);
 
 static int
 punix_open(const char *name OVS_UNUSED, char *suffix,
-           struct pstream **pstreamp)
+           struct pstream **pstreamp, uint8_t dscp OVS_UNUSED)
 {
+    char *bind_path;
     int fd, error;
 
-    fd = make_unix_socket(SOCK_STREAM, true, true, suffix, NULL);
+    bind_path = abs_file_name(ovs_rundir(), suffix);
+    fd = make_unix_socket(SOCK_STREAM, true, bind_path, NULL);
     if (fd < 0) {
-        VLOG_ERR("%s: binding failed: %s", suffix, strerror(errno));
+        VLOG_ERR("%s: binding failed: %s", bind_path, ovs_strerror(errno));
+        free(bind_path);
         return errno;
     }
 
     if (listen(fd, 10) < 0) {
         error = errno;
-        VLOG_ERR("%s: listen: %s", name, strerror(error));
+        VLOG_ERR("%s: listen: %s", name, ovs_strerror(error));
         close(fd);
+        free(bind_path);
         return error;
     }
 
-    return new_fd_pstream(name, fd, punix_accept,
-                          xstrdup(suffix), pstreamp);
+    return new_fd_pstream(name, fd, punix_accept, NULL, bind_path, pstreamp);
 }
 
 static int
-punix_accept(int fd, const struct sockaddr *sa, size_t sa_len,
+punix_accept(int fd, const struct sockaddr_storage *ss, size_t ss_len,
              struct stream **streamp)
 {
-    const struct sockaddr_un *sun = (const struct sockaddr_un *) sa;
-    int name_len = get_unix_name_len(sa_len);
+    const struct sockaddr_un *sun = (const struct sockaddr_un *) ss;
+    int name_len = get_unix_name_len(ss_len);
     char name[128];
 
     if (name_len > 0) {
@@ -116,14 +117,16 @@ punix_accept(int fd, const struct sockaddr *sa, size_t sa_len,
     } else {
         strcpy(name, "unix");
     }
-    return new_fd_stream(name, fd, 0, NULL, streamp);
+    return new_fd_stream(name, fd, 0, streamp);
 }
 
-struct pstream_class punix_pstream_class = {
+const struct pstream_class punix_pstream_class = {
     "punix",
+    false,
     punix_open,
     NULL,
     NULL,
-    NULL
+    NULL,
+    NULL,
 };