diff options
| author | David Pursell <dpursell@google.com> | 2016-01-29 10:39:41 -0800 |
|---|---|---|
| committer | David Pursell <dpursell@google.com> | 2016-02-02 09:52:02 -0800 |
| commit | 756e1c81e84c7353e0e518d9b53065357d27937b (patch) | |
| tree | 120a20778894c583c4721954f6b7bedd3637b156 /libcutils/sockets.cpp | |
| parent | 85c65dab429f1f47b6f07e26f9637084fb314eb5 (diff) | |
| download | system_core-756e1c81e84c7353e0e518d9b53065357d27937b.tar.gz system_core-756e1c81e84c7353e0e518d9b53065357d27937b.tar.bz2 system_core-756e1c81e84c7353e0e518d9b53065357d27937b.zip | |
libcutils: add socket_get_local_port().
Tests that require a local server currently hardcode a test value,
which can run into conflicts depending on what's currently running on
the machine.
This CL adds socket_get_local_port(), which lets us pass 0 so the
system picks an open port and we can query which port it chose.
Bug: http://b/26236380
Change-Id: I01d1558884e7636081d9a357db6faa86929934f6
Diffstat (limited to 'libcutils/sockets.cpp')
| -rw-r--r-- | libcutils/sockets.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/libcutils/sockets.cpp b/libcutils/sockets.cpp new file mode 100644 index 000000000..d9ab14611 --- /dev/null +++ b/libcutils/sockets.cpp @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +// This file contains socket implementation that can be shared between +// platforms as long as the correct headers are included. + +#include <cutils/sockets.h> + +#if !defined(_WIN32) +#include <netinet/in.h> +#endif + +int socket_get_local_port(cutils_socket_t sock) { + sockaddr_storage addr; + socklen_t addr_size = sizeof(addr); + + if (getsockname(sock, reinterpret_cast<sockaddr*>(&addr), &addr_size) == 0) { + // sockaddr_in and sockaddr_in6 always overlap the port field. + return ntohs(reinterpret_cast<sockaddr_in*>(&addr)->sin_port); + } + return -1; +} |
