Skip to content

Commit 9c276b6

Browse files
author
Eric Reed
committed
---
yaml --- r: 142672 b: refs/heads/try2 c: 794923c h: refs/heads/master v: v3
1 parent 21d6ed5 commit 9c276b6

File tree

6 files changed

+367
-62
lines changed

6 files changed

+367
-62
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ refs/heads/snap-stage3: 78a7676898d9f80ab540c6df5d4c9ce35bb50463
55
refs/heads/try: 519addf6277dbafccbb4159db4b710c37eaa2ec5
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
8-
refs/heads/try2: 55dda46cf676e5efd713a0c1c8c4c5a297a6db02
8+
refs/heads/try2: 794923c99511398bc90400e380dd11770ec8e614
99
refs/heads/dist-snap: ba4081a5a8573875fed17545846f6f6902c8ba8d
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/try2/src/libstd/rt/io/net/udp.rs

Lines changed: 99 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ impl UdpSocket {
4444
Ok((nread, src)) => Some((nread, src)),
4545
Err(ioerr) => {
4646
// EOF is indicated by returning None
47-
// XXX do we ever find EOF reading UDP packets?
4847
if ioerr.kind != EndOfFile {
4948
read_error::cond.raise(ioerr);
5049
}
@@ -86,10 +85,12 @@ impl UdpStream {
8685

8786
impl Reader for UdpStream {
8887
fn read(&mut self, buf: &mut [u8]) -> Option<uint> {
89-
let conn = self.connectedTo;
9088
do self.as_socket |sock| {
91-
sock.recvfrom(buf)
92-
.map_consume(|(nread,src)| if src == conn {nread} else {0})
89+
match sock.recvfrom(buf) {
90+
Some((_nread, src)) if src != self.connectedTo => Some(0),
91+
Some((nread, _src)) => Some(nread),
92+
None => None,
93+
}
9394
}
9495
}
9596

@@ -105,3 +106,97 @@ impl Writer for UdpStream {
105106

106107
fn flush(&mut self) { fail!() }
107108
}
109+
110+
#[cfg(test)]
111+
mod test {
112+
use super::*;
113+
use rt::test::*;
114+
use rt::io::net::ip::Ipv4;
115+
use rt::io::*;
116+
use option::{Some, None};
117+
118+
#[test] #[ignore]
119+
fn bind_error() {
120+
do run_in_newsched_task {
121+
let mut called = false;
122+
do io_error::cond.trap(|e| {
123+
assert!(e.kind == PermissionDenied);
124+
called = true;
125+
}).in {
126+
let addr = Ipv4(0, 0, 0, 0, 1);
127+
let socket = UdpSocket::bind(addr);
128+
assert!(socket.is_none());
129+
}
130+
assert!(called);
131+
}
132+
}
133+
134+
#[test]
135+
fn socket_smoke_test() {
136+
do run_in_newsched_task {
137+
let server_ip = next_test_ip4();
138+
let client_ip = next_test_ip4();
139+
140+
do spawntask_immediately {
141+
match UdpSocket::bind(server_ip) {
142+
Some(server) => {
143+
let mut buf = [0];
144+
match server.recvfrom(buf) {
145+
Some((nread, src)) => {
146+
assert_eq!(nread, 1);
147+
assert_eq!(buf[0], 99);
148+
assert_eq!(src, client_ip);
149+
}
150+
None => fail!()
151+
}
152+
}
153+
None => fail!()
154+
}
155+
}
156+
157+
do spawntask_immediately {
158+
match UdpSocket::bind(client_ip) {
159+
Some(client) => client.sendto([99], server_ip),
160+
None => fail!()
161+
}
162+
}
163+
}
164+
}
165+
166+
#[test]
167+
fn stream_smoke_test() {
168+
do run_in_newsched_task {
169+
let server_ip = next_test_ip4();
170+
let client_ip = next_test_ip4();
171+
172+
do spawntask_immediately {
173+
match UdpSocket::bind(server_ip) {
174+
Some(server) => {
175+
let server = ~server;
176+
let mut stream = server.connect(client_ip);
177+
let mut buf = [0];
178+
match stream.read(buf) {
179+
Some(nread) => {
180+
assert_eq!(nread, 1);
181+
assert_eq!(buf[0], 99);
182+
}
183+
None => fail!()
184+
}
185+
}
186+
None => fail!()
187+
}
188+
}
189+
190+
do spawntask_immediately {
191+
match UdpSocket::bind(client_ip) {
192+
Some(client) => {
193+
let client = ~client;
194+
let mut stream = client.connect(server_ip);
195+
stream.write([99]);
196+
}
197+
None => fail!()
198+
}
199+
}
200+
}
201+
}
202+
}

branches/try2/src/libstd/rt/uv/mod.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ use libc::{c_void, c_int, size_t, malloc, free};
4646
use cast::transmute;
4747
use ptr::null;
4848
use unstable::finally::Finally;
49+
use rt::io::net::ip::IpAddr;
4950

5051
use rt::io::IoError;
5152

@@ -126,7 +127,7 @@ pub type ConnectionCallback = ~fn(StreamWatcher, Option<UvError>);
126127
pub type FsCallback = ~fn(FsRequest, Option<UvError>);
127128
pub type TimerCallback = ~fn(TimerWatcher, Option<UvError>);
128129
pub type AsyncCallback = ~fn(AsyncWatcher, Option<UvError>);
129-
pub type UdpReceiveCallback = ~fn(UdpWatcher, int, Buf, Ipv4, uint, Option<UvError>);
130+
pub type UdpReceiveCallback = ~fn(UdpWatcher, int, Buf, IpAddr, uint, Option<UvError>);
130131
pub type UdpSendCallback = ~fn(UdpWatcher, Option<UvError>);
131132

132133

@@ -298,9 +299,6 @@ pub fn status_to_maybe_uv_error<T>(handle: *T, status: c_int) -> Option<UvError>
298299
/// The uv buffer type
299300
pub type Buf = uvll::uv_buf_t;
300301
301-
/// The uv IPv4 type
302-
pub type Ipv4 = uvll::sockaddr_in;
303-
304302
/// Borrow a slice to a Buf
305303
pub fn slice_to_uv_buf(v: &[u8]) -> Buf {
306304
let data = vec::raw::to_ptr(v);

0 commit comments

Comments
 (0)