summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShih-wei Liao <sliao@google.com>2012-02-06 00:56:31 -0800
committerShih-wei Liao <sliao@google.com>2012-02-06 00:59:03 -0800
commit4797e12720504595096be0aaab96cb811d1d810e (patch)
treec8a9e1a848790a7b09cefdff441dca41f3fcf7a7
parente5cd7f4870e945467989aef4355506988ea46e1d (diff)
downloadgdk-4797e12720504595096be0aaab96cb811d1d810e.tar.gz
Portable setsockopt/getsockopt
Change-Id: I3061511fb5a6389e8d8879a825ecf16cdeedf488 Author: Chris Dearman <chris@mips.com>
-rw-r--r--headers/include/sys/socket.h90
-rw-r--r--libportable/Android.mk4
-rw-r--r--libportable/arch-mips/sockopt.c149
3 files changed, 241 insertions, 2 deletions
diff --git a/headers/include/sys/socket.h b/headers/include/sys/socket.h
new file mode 100644
index 0000000..d40d31a
--- /dev/null
+++ b/headers/include/sys/socket.h
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+#ifndef _SYS_SOCKET_H_
+#define _SYS_SOCKET_H_
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <linux/socket.h>
+
+__BEGIN_DECLS
+
+#define SOCK_STREAM 1
+#define SOCK_DGRAM 2
+#define SOCK_RAW 3
+#define SOCK_RDM 4
+#define SOCK_SEQPACKET 5
+#define SOCK_PACKET 10
+
+#ifdef __i386__
+# define __socketcall extern __attribute__((__cdecl__))
+#else
+# define __socketcall extern
+#endif
+
+/* BIONIC: second argument to shutdown() */
+enum {
+ SHUT_RD = 0, /* no more receptions */
+#define SHUT_RD SHUT_RD
+ SHUT_WR, /* no more transmissions */
+#define SHUT_WR SHUT_WR
+ SHUT_RDWR /* no more receptions or transmissions */
+#define SHUT_RDWR SHUT_RDWR
+};
+
+
+typedef int socklen_t;
+
+__socketcall int socket_portable(int, int, int);
+#define socket socket_portable
+__socketcall int bind(int, const struct sockaddr *, int);
+__socketcall int connect(int, const struct sockaddr *, socklen_t);
+__socketcall int listen(int, int);
+__socketcall int accept(int, struct sockaddr *, socklen_t *);
+__socketcall int getsockname(int, struct sockaddr *, socklen_t *);
+__socketcall int getpeername(int, struct sockaddr *, socklen_t *);
+__socketcall int socketpair(int, int, int, int *);
+__socketcall int shutdown(int, int);
+__socketcall int setsockopt(int, int, int, const void *, socklen_t);
+#define setsockopt setsockopt_portable
+__socketcall int getsockopt_portable(int, int, int, void *, socklen_t *);
+#define getsockopt getsockopt_portable
+__socketcall int sendmsg(int, const struct msghdr *, unsigned int);
+__socketcall int recvmsg(int, struct msghdr *, unsigned int);
+
+extern ssize_t send(int, const void *, size_t, unsigned int);
+extern ssize_t recv(int, void *, size_t, unsigned int);
+
+__socketcall ssize_t sendto(int, const void *, size_t, int, const struct sockaddr *, socklen_t);
+__socketcall ssize_t recvfrom(int, void *, size_t, unsigned int, const struct sockaddr *, socklen_t *);
+
+#undef __socketcall
+
+__END_DECLS
+
+#endif /* _SYS_SOCKET_H */
diff --git a/libportable/Android.mk b/libportable/Android.mk
index 0bd38ec..971e9a7 100644
--- a/libportable/Android.mk
+++ b/libportable/Android.mk
@@ -32,7 +32,8 @@ ifeq ($(TARGET_ARCH),mips)
libportable_arch_src_files += arch-mips/mmap.c \
arch-mips/stat.c \
arch-mips/open.c \
- arch-mips/socket.c
+ arch-mips/socket.c \
+ arch-mips/sockopt.c
endif
LOCAL_SRC_FILES := \
@@ -40,4 +41,3 @@ LOCAL_SRC_FILES := \
$(libportable_arch_src_files)
include $(BUILD_SHARED_LIBRARY)
-
diff --git a/libportable/arch-mips/sockopt.c b/libportable/arch-mips/sockopt.c
new file mode 100644
index 0000000..a09d457
--- /dev/null
+++ b/libportable/arch-mips/sockopt.c
@@ -0,0 +1,149 @@
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+/* Derived from android-3/arch-arm/include/asm/socket.h */
+
+#define SOL_SOCKET_PORTABLE 1
+
+#define SO_DEBUG_PORTABLE 1
+#define SO_REUSEADDR_PORTABLE 2
+#define SO_TYPE_PORTABLE 3
+#define SO_ERROR_PORTABLE 4
+#define SO_DONTROUTE_PORTABLE 5
+#define SO_BROADCAST_PORTABLE 6
+#define SO_SNDBUF_PORTABLE 7
+#define SO_RCVBUF_PORTABLE 8
+#define SO_SNDBUFFORCE_PORTABLE 32
+#define SO_RCVBUFFORCE_PORTABLE 33
+#define SO_KEEPALIVE_PORTABLE 9
+#define SO_OOBINLINE_PORTABLE 10
+#define SO_NO_CHECK_PORTABLE 11
+#define SO_PRIORITY_PORTABLE 12
+#define SO_LINGER_PORTABLE 13
+#define SO_BSDCOMPAT_PORTABLE 14
+
+#define SO_PASSCRED_PORTABLE 16
+#define SO_PEERCRED_PORTABLE 17
+#define SO_RCVLOWAT_PORTABLE 18
+#define SO_SNDLOWAT_PORTABLE 19
+#define SO_RCVTIMEO_PORTABLE 20
+#define SO_SNDTIMEO_PORTABLE 21
+
+#define SO_SECURITY_AUTHENTICATION_PORTABLE 22
+#define SO_SECURITY_ENCRYPTION_TRANSPORT_PORTABLE 23
+#define SO_SECURITY_ENCRYPTION_NETWORK_PORTABLE 24
+
+#define SO_BINDTODEVICE_PORTABLE 25
+
+#define SO_ATTACH_FILTER_PORTABLE 26
+#define SO_DETACH_FILTER_PORTABLE 27
+
+#define SO_PEERNAME_PORTABLE 28
+#define SO_TIMESTAMP_PORTABLE 29
+#define SCM_TIMESTAMP_PORTABLE SO_TIMESTAMP_PORTABLE
+
+#define SO_ACCEPTCONN_PORTABLE 30
+
+#define SO_PEERSEC_PORTABLE 31
+#define SO_PASSSEC_PORTABLE 34
+
+#if SOL_SOCKET_PORTABLE==SOL_SOCKET
+#error Build environment
+#endif
+
+static inline int mips_change_level(int level)
+{
+ switch (level) {
+ case SOL_SOCKET_PORTABLE:
+ level = SOL_SOCKET;
+ break;
+ }
+ return level;
+}
+
+
+static inline int mips_change_optname(int optname)
+{
+ switch (optname) {
+ case SO_DEBUG_PORTABLE:
+ return SO_DEBUG;
+ case SO_REUSEADDR_PORTABLE:
+ return SO_REUSEADDR;
+ case SO_TYPE_PORTABLE:
+ return SO_TYPE;
+ case SO_ERROR_PORTABLE:
+ return SO_ERROR;
+ case SO_DONTROUTE_PORTABLE:
+ return SO_DONTROUTE;
+ case SO_BROADCAST_PORTABLE:
+ return SO_BROADCAST;
+ case SO_SNDBUF_PORTABLE:
+ return SO_SNDBUF;
+ case SO_RCVBUF_PORTABLE:
+ return SO_RCVBUF;
+ case SO_SNDBUFFORCE_PORTABLE:
+ return SO_SNDBUFFORCE;
+ case SO_RCVBUFFORCE_PORTABLE:
+ return SO_RCVBUFFORCE;
+ case SO_KEEPALIVE_PORTABLE:
+ return SO_KEEPALIVE;
+ case SO_OOBINLINE_PORTABLE:
+ return SO_OOBINLINE;
+ case SO_NO_CHECK_PORTABLE:
+ return SO_NO_CHECK;
+ case SO_PRIORITY_PORTABLE:
+ return SO_PRIORITY;
+ case SO_LINGER_PORTABLE:
+ return SO_LINGER;
+ case SO_BSDCOMPAT_PORTABLE:
+ return SO_BSDCOMPAT;
+ case SO_PASSCRED_PORTABLE:
+ return SO_PASSCRED;
+ case SO_PEERCRED_PORTABLE:
+ return SO_PEERCRED;
+ case SO_RCVLOWAT_PORTABLE:
+ return SO_RCVLOWAT;
+ case SO_SNDLOWAT_PORTABLE:
+ return SO_SNDLOWAT;
+ case SO_RCVTIMEO_PORTABLE:
+ return SO_RCVTIMEO;
+ case SO_SNDTIMEO_PORTABLE:
+ return SO_SNDTIMEO;
+ case SO_SECURITY_AUTHENTICATION_PORTABLE:
+ return SO_SECURITY_AUTHENTICATION;
+ case SO_SECURITY_ENCRYPTION_TRANSPORT_PORTABLE:
+ return SO_SECURITY_ENCRYPTION_TRANSPORT;
+ case SO_SECURITY_ENCRYPTION_NETWORK_PORTABLE:
+ return SO_SECURITY_ENCRYPTION_NETWORK;
+ case SO_BINDTODEVICE_PORTABLE:
+ return SO_BINDTODEVICE;
+ case SO_ATTACH_FILTER_PORTABLE:
+ return SO_ATTACH_FILTER;
+ case SO_DETACH_FILTER_PORTABLE:
+ return SO_DETACH_FILTER;
+ case SO_PEERNAME_PORTABLE:
+ return SO_PEERNAME;
+ case SO_TIMESTAMP_PORTABLE:
+ return SO_TIMESTAMP;
+ case SO_ACCEPTCONN_PORTABLE:
+ return SO_ACCEPTCONN;
+ case SO_PEERSEC_PORTABLE:
+ return SO_PEERSEC;
+ case SO_PASSSEC_PORTABLE:
+ return SO_PASSSEC;
+ }
+ return optname;
+}
+
+extern int setsockopt(int, int, int, const void *, socklen_t);
+int setsockopt_portable(int s, int level, int optname, const void *optval, socklen_t optlen)
+{
+ return setsockopt(s, mips_change_level(level), mips_change_optname(optname), optval, optlen);
+}
+
+extern int getsockopt (int, int, int, void *, socklen_t *);
+int getsockopt_portable(int s, int level, int optname, void *optval, socklen_t *optlen)
+{
+ return getsockopt(s, mips_change_level(level), mips_change_optname(optname), optval, optlen);
+}