stream-unix: Do not bind a name for client sockets.
authorBen Pfaff <blp@nicira.com>
Mon, 27 Feb 2012 19:13:00 +0000 (11:13 -0800)
committerBen Pfaff <blp@nicira.com>
Thu, 8 Mar 2012 00:33:15 +0000 (16:33 -0800)
There's no reason for a Unix domain client socket to bind a name.  I don't
know why we've always done that.  Stevens's "Unix Network Programming"
Unix domain socket client example doesn't do a bind.

Removes the 'unlink_path' parameter from new_fd_stream() since it is now
always passed as NULL.

Signed-off-by: Ben Pfaff <blp@nicira.com>
lib/stream-fd.c
lib/stream-fd.h
lib/stream-tcp.c
lib/stream-unix.c
python/ovs/stream.py

index 7bf5ebd4dc5f903001115218160b17acee0827aa..38dba7c71211923dfab685751154fa94c8cb8b77 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2009, 2010 Nicira Networks.
+ * Copyright (c) 2008, 2009, 2010, 2012 Nicira Networks.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -42,7 +42,6 @@ struct stream_fd
 {
     struct stream stream;
     int fd;
-    char *unlink_path;
 };
 
 static const struct stream_class stream_fd_class;
@@ -55,21 +54,17 @@ static void maybe_unlink_and_free(char *path);
  * and stores a pointer to the stream in '*streamp'.  Initial connection status
  * 'connect_status' is interpreted as described for stream_init().
  *
- * When '*streamp' is closed, then 'unlink_path' (if nonnull) will be passed to
- * fatal_signal_unlink_file_now() and then freed with free().
- *
  * Returns 0 if successful, otherwise a positive errno value.  (The current
  * implementation never fails.) */
 int
 new_fd_stream(const char *name, int fd, int connect_status,
-              char *unlink_path, struct stream **streamp)
+              struct stream **streamp)
 {
     struct stream_fd *s;
 
     s = xmalloc(sizeof *s);
     stream_init(&s->stream, &stream_fd_class, connect_status, name);
     s->fd = fd;
-    s->unlink_path = unlink_path;
     *streamp = &s->stream;
     return 0;
 }
@@ -86,7 +81,6 @@ fd_close(struct stream *stream)
 {
     struct stream_fd *s = stream_fd_cast(stream);
     close(s->fd);
-    maybe_unlink_and_free(s->unlink_path);
     free(s);
 }
 
index d2a34eb2ac1cf21f4241a111ca0c96afae003f5d..b42615fa64784cbd9cc41d784d1ac09d1298c414 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2009 Nicira Networks.
+ * Copyright (c) 2008, 2009, 2012 Nicira Networks.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,7 +26,7 @@ struct pstream;
 struct sockaddr;
 
 int new_fd_stream(const char *name, int fd, int connect_status,
-                      char *unlink_path, struct stream **streamp);
+                  struct stream **streamp);
 int new_fd_pstream(const char *name, int fd,
                    int (*accept_cb)(int fd, const struct sockaddr *,
                                     size_t sa_len, struct stream **),
index 9a7614db73b4f49c30b02e72b41b4362b912b1d8..052ad8cb54c6a8a7bd4d2f77352c22152379d135 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2009, 2010 Nicira Networks.
+ * Copyright (c) 2008, 2009, 2010, 2012 Nicira Networks.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -58,7 +58,7 @@ new_tcp_stream(const char *name, int fd, int connect_status,
         return errno;
     }
 
-    retval = new_fd_stream(name, fd, connect_status, NULL, streamp);
+    retval = new_fd_stream(name, fd, connect_status, streamp);
     if (!retval) {
         struct stream *stream = *streamp;
         stream_set_remote_ip(stream, remote->sin_addr.s_addr);
index d7dde8fc44f1e3c819c4d3eb6aab147fa08e90cb..d2e8e82382ab2b3bd6bcb8cd929a5d511688868f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks.
+ * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira Networks.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -39,28 +39,19 @@ 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)
 {
     const char *connect_path = suffix;
-    char *bind_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);
+    fd = make_unix_socket(SOCK_STREAM, true, false, NULL, connect_path);
     if (fd < 0) {
-        VLOG_ERR("%s: connection to %s failed: %s",
-                 bind_path, connect_path, strerror(-fd));
-        free(bind_path);
+        VLOG_ERR("%s: connection failed (%s)", connect_path, strerror(-fd));
         return -fd;
     }
 
-    return new_fd_stream(name, fd, check_connection_completion(fd),
-                         bind_path, streamp);
+    return new_fd_stream(name, fd, check_connection_completion(fd), streamp);
 }
 
 const struct stream_class unix_stream_class = {
@@ -116,7 +107,7 @@ 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);
 }
 
 const struct pstream_class punix_pstream_class = {
index 7ea9e46e8b59c7b6d175460ef31a268d5b8f1607..08c6293adf5a94f8b4d085b100fa849bfb641645 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2010, 2011 Nicira Networks
+# Copyright (c) 2010, 2011, 2012 Nicira Networks
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -27,7 +27,6 @@ vlog = ovs.vlog.Vlog("stream")
 class Stream(object):
     """Bidirectional byte stream.  Currently only Unix domain sockets
     are implemented."""
-    n_unix_sockets = 0
 
     # States.
     __S_CONNECTING = 0
@@ -46,10 +45,9 @@ class Stream(object):
         False."""
         return name.startswith("unix:")
 
-    def __init__(self, socket, name, bind_path, status):
+    def __init__(self, socket, name, status):
         self.socket = socket
         self.name = name
-        self.bind_path = bind_path
         if status == errno.EAGAIN:
             self.state = Stream.__S_CONNECTING
         elif status == 0:
@@ -76,18 +74,15 @@ class Stream(object):
         if not Stream.is_valid_name(name):
             return errno.EAFNOSUPPORT, None
 
-        Stream.n_unix_sockets += 1
-        bind_path = "/tmp/stream-unix.%d.%d" % (os.getpid(),
-                                                Stream.n_unix_sockets)
         connect_path = name[5:]
         error, sock = ovs.socket_util.make_unix_socket(socket.SOCK_STREAM,
-                                                       True, bind_path,
+                                                       True, None,
                                                        connect_path)
         if error:
             return error, None
         else:
             status = ovs.socket_util.check_connection_completion(sock)
-            return 0, Stream(sock, name, bind_path, status)
+            return 0, Stream(sock, name, status)
 
     @staticmethod
     def open_block((error, stream)):
@@ -117,9 +112,6 @@ class Stream(object):
 
     def close(self):
         self.socket.close()
-        if self.bind_path is not None:
-            ovs.fatal_signal.unlink_file_now(self.bind_path)
-            self.bind_path = None
 
     def __scs_connecting(self):
         retval = ovs.socket_util.check_connection_completion(self.socket)
@@ -288,7 +280,7 @@ class PassiveStream(object):
             try:
                 sock, addr = self.socket.accept()
                 ovs.socket_util.set_nonblocking(sock)
-                return 0, Stream(sock, "unix:%s" % addr, None, 0)
+                return 0, Stream(sock, "unix:%s" % addr, 0)
             except socket.error, e:
                 error = ovs.socket_util.get_exception_errno(e)
                 if error != errno.EAGAIN: