about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libgreen/context.rs2
-rw-r--r--src/liblibc/lib.rs46
-rw-r--r--src/libnative/io/c_unix.rs49
-rw-r--r--src/libnative/io/net.rs19
-rw-r--r--src/librustuv/net.rs19
5 files changed, 113 insertions, 22 deletions
diff --git a/src/libgreen/context.rs b/src/libgreen/context.rs
index 0a13ffa0b5e..5b1a4a8b80e 100644
--- a/src/libgreen/context.rs
+++ b/src/libgreen/context.rs
@@ -270,7 +270,7 @@ fn initialize_call_frame(regs: &mut Registers, fptr: InitFn, arg: uint,
 type Registers = [uint, ..32];
 
 #[cfg(target_arch = "mips")]
-fn new_regs() -> Box<Registers> { box [0, .. 32] }
+fn new_regs() -> Box<Registers> { box {[0, .. 32]} }
 
 #[cfg(target_arch = "mips")]
 fn initialize_call_frame(regs: &mut Registers, fptr: InitFn, arg: uint,
diff --git a/src/liblibc/lib.rs b/src/liblibc/lib.rs
index 1edd99c1d7d..cac2303167a 100644
--- a/src/liblibc/lib.rs
+++ b/src/liblibc/lib.rs
@@ -2476,6 +2476,9 @@ pub mod consts {
         }
         pub mod posix08 {
         }
+        #[cfg(target_arch = "arm")]
+        #[cfg(target_arch = "x86")]
+        #[cfg(target_arch = "x86_64")]
         pub mod bsd44 {
             use types::os::arch::c95::c_int;
 
@@ -2518,6 +2521,49 @@ pub mod consts {
             pub static SHUT_WR: c_int = 1;
             pub static SHUT_RDWR: c_int = 2;
         }
+        #[cfg(target_arch = "mips")]
+        pub mod bsd44 {
+            use types::os::arch::c95::c_int;
+
+            pub static MADV_NORMAL : c_int = 0;
+            pub static MADV_RANDOM : c_int = 1;
+            pub static MADV_SEQUENTIAL : c_int = 2;
+            pub static MADV_WILLNEED : c_int = 3;
+            pub static MADV_DONTNEED : c_int = 4;
+            pub static MADV_REMOVE : c_int = 9;
+            pub static MADV_DONTFORK : c_int = 10;
+            pub static MADV_DOFORK : c_int = 11;
+            pub static MADV_MERGEABLE : c_int = 12;
+            pub static MADV_UNMERGEABLE : c_int = 13;
+            pub static MADV_HWPOISON : c_int = 100;
+
+            pub static AF_UNIX: c_int = 1;
+            pub static AF_INET: c_int = 2;
+            pub static AF_INET6: c_int = 10;
+            pub static SOCK_STREAM: c_int = 2;
+            pub static SOCK_DGRAM: c_int = 1;
+            pub static IPPROTO_TCP: c_int = 6;
+            pub static IPPROTO_IP: c_int = 0;
+            pub static IPPROTO_IPV6: c_int = 41;
+            pub static IP_MULTICAST_TTL: c_int = 33;
+            pub static IP_MULTICAST_LOOP: c_int = 34;
+            pub static IP_TTL: c_int = 2;
+            pub static IP_ADD_MEMBERSHIP: c_int = 35;
+            pub static IP_DROP_MEMBERSHIP: c_int = 36;
+            pub static IPV6_ADD_MEMBERSHIP: c_int = 20;
+            pub static IPV6_DROP_MEMBERSHIP: c_int = 21;
+
+            pub static TCP_NODELAY: c_int = 1;
+            pub static SOL_SOCKET: c_int = 65535;
+            pub static SO_KEEPALIVE: c_int = 8;
+            pub static SO_BROADCAST: c_int = 32;
+            pub static SO_REUSEADDR: c_int = 4;
+            pub static SO_ERROR: c_int = 4103;
+
+            pub static SHUT_RD: c_int = 0;
+            pub static SHUT_WR: c_int = 1;
+            pub static SHUT_RDWR: c_int = 2;
+        }
         #[cfg(target_arch = "x86")]
         #[cfg(target_arch = "x86_64")]
         #[cfg(target_arch = "arm")]
diff --git a/src/libnative/io/c_unix.rs b/src/libnative/io/c_unix.rs
index 767090a10cd..e6cb5cb76f1 100644
--- a/src/libnative/io/c_unix.rs
+++ b/src/libnative/io/c_unix.rs
@@ -22,15 +22,20 @@ use libc;
 #[cfg(target_os = "macos")]
 #[cfg(target_os = "freebsd")]
 pub static FIONBIO: libc::c_ulong = 0x8004667e;
-#[cfg(target_os = "linux")]
+#[cfg(target_os = "linux", not(target_arch = "mips"))]
 #[cfg(target_os = "android")]
 pub static FIONBIO: libc::c_ulong = 0x5421;
+#[cfg(target_os = "linux", target_arch = "mips")]
+pub static FIONBIO: libc::c_ulong = 0x667e;
+
 #[cfg(target_os = "macos")]
 #[cfg(target_os = "freebsd")]
 pub static FIOCLEX: libc::c_ulong = 0x20006601;
-#[cfg(target_os = "linux")]
+#[cfg(target_os = "linux", not(target_arch = "mips"))]
 #[cfg(target_os = "android")]
 pub static FIOCLEX: libc::c_ulong = 0x5451;
+#[cfg(target_os = "linux", target_arch = "mips")]
+pub static FIOCLEX: libc::c_ulong = 0x6601;
 
 #[cfg(target_os = "macos")]
 #[cfg(target_os = "freebsd")]
@@ -100,7 +105,7 @@ mod select {
     }
 }
 
-#[cfg(target_os = "linux")]
+#[cfg(target_os = "linux", not(target_arch = "mips"))]
 #[cfg(target_os = "android")]
 mod signal {
     use libc;
@@ -143,6 +148,44 @@ mod signal {
     }
 }
 
+#[cfg(target_os = "linux", target_arch = "mips")]
+mod signal {
+    use libc;
+
+    pub static SA_NOCLDSTOP: libc::c_ulong = 0x00000001;
+    pub static SA_NOCLDWAIT: libc::c_ulong = 0x00010000;
+    pub static SA_NODEFER: libc::c_ulong = 0x40000000;
+    pub static SA_ONSTACK: libc::c_ulong = 0x08000000;
+    pub static SA_RESETHAND: libc::c_ulong = 0x80000000;
+    pub static SA_RESTART: libc::c_ulong = 0x10000000;
+    pub static SA_SIGINFO: libc::c_ulong = 0x00000008;
+    pub static SIGCHLD: libc::c_int = 18;
+
+    // This definition is not as accurate as it could be, {pid, uid, status} is
+    // actually a giant union. Currently we're only interested in these fields,
+    // however.
+    pub struct siginfo {
+        si_signo: libc::c_int,
+        si_code: libc::c_int,
+        si_errno: libc::c_int,
+        pub pid: libc::pid_t,
+        pub uid: libc::uid_t,
+        pub status: libc::c_int,
+    }
+
+    pub struct sigaction {
+        pub sa_flags: libc::c_uint,
+        pub sa_handler: extern fn(libc::c_int),
+        pub sa_mask: sigset_t,
+        sa_restorer: *mut libc::c_void,
+        sa_resv: [libc::c_int, ..1],
+    }
+
+    pub struct sigset_t {
+        __val: [libc::c_ulong, ..32],
+    }
+}
+
 #[cfg(target_os = "macos")]
 #[cfg(target_os = "freebsd")]
 mod signal {
diff --git a/src/libnative/io/net.rs b/src/libnative/io/net.rs
index cacd38c2efd..26307feae91 100644
--- a/src/libnative/io/net.rs
+++ b/src/libnative/io/net.rs
@@ -42,11 +42,12 @@ enum InAddr {
 fn ip_to_inaddr(ip: ip::IpAddr) -> InAddr {
     match ip {
         ip::Ipv4Addr(a, b, c, d) => {
+            let ip = (a as u32 << 24) |
+                     (b as u32 << 16) |
+                     (c as u32 <<  8) |
+                     (d as u32 <<  0);
             InAddr(libc::in_addr {
-                s_addr: (d as u32 << 24) |
-                        (c as u32 << 16) |
-                        (b as u32 <<  8) |
-                        (a as u32 <<  0)
+                s_addr: mem::from_be32(ip)
             })
         }
         ip::Ipv6Addr(a, b, c, d, e, f, g, h) => {
@@ -174,11 +175,11 @@ pub fn sockaddr_to_addr(storage: &libc::sockaddr_storage,
             let storage: &libc::sockaddr_in = unsafe {
                 mem::transmute(storage)
             };
-            let addr = storage.sin_addr.s_addr as u32;
-            let a = (addr >>  0) as u8;
-            let b = (addr >>  8) as u8;
-            let c = (addr >> 16) as u8;
-            let d = (addr >> 24) as u8;
+            let ip = mem::to_be32(storage.sin_addr.s_addr as u32);
+            let a = (ip >> 24) as u8;
+            let b = (ip >> 16) as u8;
+            let c = (ip >>  8) as u8;
+            let d = (ip >>  0) as u8;
             Ok(ip::SocketAddr {
                 ip: ip::Ipv4Addr(a, b, c, d),
                 port: ntohs(storage.sin_port),
diff --git a/src/librustuv/net.rs b/src/librustuv/net.rs
index e533120b3dd..2f35e48b847 100644
--- a/src/librustuv/net.rs
+++ b/src/librustuv/net.rs
@@ -43,11 +43,11 @@ pub fn sockaddr_to_addr(storage: &libc::sockaddr_storage,
             let storage: &libc::sockaddr_in = unsafe {
                 mem::transmute(storage)
             };
-            let addr = storage.sin_addr.s_addr as u32;
-            let a = (addr >>  0) as u8;
-            let b = (addr >>  8) as u8;
-            let c = (addr >> 16) as u8;
-            let d = (addr >> 24) as u8;
+            let ip = mem::to_be32(storage.sin_addr.s_addr as u32);
+            let a = (ip >> 24) as u8;
+            let b = (ip >> 16) as u8;
+            let c = (ip >>  8) as u8;
+            let d = (ip >>  0) as u8;
             ip::SocketAddr {
                 ip: ip::Ipv4Addr(a, b, c, d),
                 port: ntohs(storage.sin_port),
@@ -82,15 +82,16 @@ fn addr_to_sockaddr(addr: ip::SocketAddr) -> (libc::sockaddr_storage, uint) {
         let mut storage: libc::sockaddr_storage = mem::zeroed();
         let len = match addr.ip {
             ip::Ipv4Addr(a, b, c, d) => {
+                let ip = (a as u32 << 24) |
+                         (b as u32 << 16) |
+                         (c as u32 <<  8) |
+                         (d as u32 <<  0);
                 let storage: &mut libc::sockaddr_in =
                     mem::transmute(&mut storage);
                 (*storage).sin_family = libc::AF_INET as libc::sa_family_t;
                 (*storage).sin_port = htons(addr.port);
                 (*storage).sin_addr = libc::in_addr {
-                    s_addr: (d as u32 << 24) |
-                            (c as u32 << 16) |
-                            (b as u32 <<  8) |
-                            (a as u32 <<  0)
+                    s_addr: mem::from_be32(ip)
                 };
                 mem::size_of::<libc::sockaddr_in>()
             }