mirror of
https://github.com/openvswitch/ovs
synced 2025-08-31 14:25:26 +00:00
socket-util: Work around Unix domain socket path name limits on Linux.
Many Open vSwitch tests fail on Debian's automatic build machines because the builds occur in deeply nested directories with long names. OVS tries to bind and connect to Unix domain sockets using absolute path names, which in combination with long directory names means that the socket's name exceeds the limit for Unix domain socket names (108 bytes on Linux). This commit works around the problem on Linux by indirecting through /proc/self/fd/<dirfd>/<basename> when names exceed the maximum that can be used directly. Reported-by: Hector Oron <hector.oron@gmail.com> Reported-by: Sebastian Andrzej Siewior <sebastian@breakpoint.cc> Reported-by: Roger Leigh <rleigh@codelibre.net> Debian bug #602891. Debian bug #602911.
This commit is contained in:
64
tests/test-unix-socket.c
Normal file
64
tests/test-unix-socket.c
Normal file
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
* Copyright (c) 2010 Nicira Networks.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at:
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "util.h"
|
||||
#include "socket-util.h"
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
const char *sockname1;
|
||||
const char *sockname2;
|
||||
int sock1, sock2;
|
||||
|
||||
set_program_name(argv[0]);
|
||||
|
||||
if (argc != 2 && argc != 3) {
|
||||
ovs_fatal(0, "usage: %s SOCKETNAME1 [SOCKETNAME2]", argv[0]);
|
||||
}
|
||||
sockname1 = argv[1];
|
||||
sockname2 = argc > 2 ? argv[2] : sockname1;
|
||||
|
||||
signal(SIGALRM, SIG_DFL);
|
||||
alarm(5);
|
||||
|
||||
/* Create a listening socket under name 'sockname1'. */
|
||||
sock1 = make_unix_socket(SOCK_STREAM, false, false, sockname1, NULL);
|
||||
if (sock1 < 0) {
|
||||
ovs_fatal(-sock1, "%s: bind failed", sockname1);
|
||||
}
|
||||
if (listen(sock1, 1)) {
|
||||
ovs_fatal(errno, "%s: listen failed", sockname1);
|
||||
}
|
||||
|
||||
/* Connect to 'sockname2' (which should be the same file, perhaps under a
|
||||
* different name). */
|
||||
sock2 = make_unix_socket(SOCK_STREAM, false, false, NULL, sockname2);
|
||||
if (sock2 < 0) {
|
||||
ovs_fatal(-sock2, "%s: connect failed", sockname2);
|
||||
}
|
||||
|
||||
close(sock1);
|
||||
close(sock2);
|
||||
|
||||
return 0;
|
||||
}
|
Reference in New Issue
Block a user