OSDN Git Service

Provide work-around for missing setns on K
authorGreg Hartman <ghartman@google.com>
Fri, 8 Dec 2017 02:17:51 +0000 (18:17 -0800)
committerGreg Hartman <ghartman@google.com>
Fri, 8 Dec 2017 02:17:51 +0000 (18:17 -0800)
Test: Local build
Change-Id: Ibc1170d639f4f9ce6daaf2488496d84e75df7f81

sshd.c

diff --git a/sshd.c b/sshd.c
index 34ec217..20fbb33 100644 (file)
--- a/sshd.c
+++ b/sshd.c
 #if defined(ANDROID_GCE)
 #define GNU_SOURCE
 #include <sched.h>
+#include <sys/syscall.h>
+
+int gce_setns(int fd, int clone_flags) {
+#ifdef __i386__
+  return syscall(346, fd, clone_flags);
+#elif __x86_64__
+  return syscall(308, fd, clone_flags);
+#else
+#error "Unsupported Architecture"
+#endif
+}
 #endif
 
 /* Re-exec fds */
@@ -1049,7 +1060,7 @@ server_listen(void)
                int outerfd = open("/var/run/netns/outer.net", O_RDONLY);
                int androidfd = open("/var/run/netns/android.net", O_RDONLY);
                if (outerfd > 0 && androidfd > 0) {
-                       if (setns(outerfd, 0) != 0) {
+                       if (gce_setns(outerfd, 0) != 0) {
                                fprintf(stderr, "Could not set netns: %s\n",
                                        strerror(errno));
                                exit(1);
@@ -1063,7 +1074,7 @@ server_listen(void)
 
 #if defined(ANDROID_GCE)
                if (androidfd > 0) {
-                       if (setns(androidfd, 0) != 0) {
+                       if (gce_setns(androidfd, 0) != 0) {
                                fprintf(stderr, "Could not set netns: %s\n",
                                        strerror(errno));
                                exit(1);