uv_write works, buffer passing still broke, can get sockaddr_in by val

.. but passing sockaddr_in by val back to C is broken, still passing by
ptr
.. the uv_write_cb is processed, but we have a status -1.. there is
also valgrind spew.. so buf passing is broken, still.
This commit is contained in:
Jeff Olson 2012-03-22 07:28:30 -07:00 committed by Brian Anderson
parent da779988d5
commit f179029296
2 changed files with 29 additions and 23 deletions

View File

@ -276,7 +276,7 @@ native mod rustrt {
-> *libc::c_void; -> *libc::c_void;
fn rust_uv_last_error(loop_handle: *libc::c_void) -> uv_err_t; fn rust_uv_last_error(loop_handle: *libc::c_void) -> uv_err_t;
fn rust_uv_ip4_addr(ip: *u8, port: libc::c_int) fn rust_uv_ip4_addr(ip: *u8, port: libc::c_int)
-> *libc::c_void; -> sockaddr_in;
fn rust_uv_tcp_connect(connect_ptr: *uv_connect_t, fn rust_uv_tcp_connect(connect_ptr: *uv_connect_t,
tcp_handle_ptr: *uv_tcp_t, tcp_handle_ptr: *uv_tcp_t,
addr: *libc::c_void, addr: *libc::c_void,
@ -373,14 +373,14 @@ mod direct {
data: *libc::c_void) { data: *libc::c_void) {
rustrt::rust_uv_set_data_for_req(req, data); rustrt::rust_uv_set_data_for_req(req, data);
} }
// FIXME: see github issue #1402 // TODO: see github issue #1402
unsafe fn buf_init(input: *u8, len: uint) -> *libc::c_void { unsafe fn buf_init(input: *u8, len: uint) -> *libc::c_void {
ret rustrt::rust_uv_buf_init(input, len); ret rustrt::rust_uv_buf_init(input, len);
} }
// FIXME: see github issue #1402 // TODO: see github issue #1402
unsafe fn ip4_addr(ip: str, port: libc::c_int) unsafe fn ip4_addr(ip: str, port: libc::c_int)
-> *libc::c_void { -> sockaddr_in {
let addr_vec = str::bytes(ip); let mut addr_vec = str::bytes(ip);
addr_vec += [0u8]; // add null terminator addr_vec += [0u8]; // add null terminator
let addr_vec_ptr = vec::unsafe::to_ptr(addr_vec); let addr_vec_ptr = vec::unsafe::to_ptr(addr_vec);
let ip_back = str::from_bytes(addr_vec); let ip_back = str::from_bytes(addr_vec);
@ -388,7 +388,7 @@ mod direct {
ret rustrt::rust_uv_ip4_addr(addr_vec_ptr, port); ret rustrt::rust_uv_ip4_addr(addr_vec_ptr, port);
} }
// this is lame. // this is lame.
// FIXME: see github issue #1402 // TODO: see github issue #1402
unsafe fn free_1402(ptr: *libc::c_void) { unsafe fn free_1402(ptr: *libc::c_void) {
rustrt::rust_uv_free(ptr); rustrt::rust_uv_free(ptr);
} }
@ -962,7 +962,8 @@ crust fn on_alloc(handle: *libc::c_void,
crust fn on_write_complete_cb(write_handle: *uv_write_t, crust fn on_write_complete_cb(write_handle: *uv_write_t,
status: libc::c_int) unsafe { status: libc::c_int) unsafe {
io::println("beginning on_write_complete_cb"); io::println(#fmt("beginning on_write_complete_cb status: %d",
status as int));
io::println("ending on_write_complete_cb"); io::println("ending on_write_complete_cb");
} }
@ -979,11 +980,12 @@ crust fn on_connect_cb(connect_handle_ptr: *uv_connect_t,
let write_handle = (*data).write_req as *libc::c_void; let write_handle = (*data).write_req as *libc::c_void;
io::println(#fmt("on_connect_cb: tcp stream: %d write_handle addr %d", io::println(#fmt("on_connect_cb: tcp stream: %d write_handle addr %d",
stream as int, write_handle as int)); stream as int, write_handle as int));
direct::write(write_handle, let write_result = direct::write(write_handle,
stream as *libc::c_void, stream as *libc::c_void,
(*data).req_buf, (*data).req_buf,
on_write_complete_cb); on_write_complete_cb);
io::println("on_connect_cb: after direct::write()"); io::println(#fmt("on_connect_cb: direct::write() status: %d",
write_result as int));
} }
else { else {
let loop_handle = direct::get_loop_for_uv_handle( let loop_handle = direct::get_loop_for_uv_handle(
@ -1015,31 +1017,38 @@ fn impl_uv_tcp_request() unsafe {
// this to C.. // this to C..
let write_handle = direct::write_t(); let write_handle = direct::write_t();
let write_handle_ptr = ptr::addr_of(write_handle); let write_handle_ptr = ptr::addr_of(write_handle);
io::println(#fmt("tcp req setup: tcp stream: %d write_handle addr %d", io::println(#fmt("tcp req: tcp stream: %d write_handle: %d",
tcp_handle_ptr as int, write_handle_ptr as int)); tcp_handle_ptr as int,
write_handle_ptr as int));
let req = { writer_handle: write_handle_ptr, let req = { writer_handle: write_handle_ptr,
req_buf: ptr::addr_of(req_msg) }; req_buf: ptr::addr_of(req_msg) };
io::println("building addr...");
let addr = direct::ip4_addr("173.194.33.40", 80i32);
let tcp_init_result = direct::tcp_init( let tcp_init_result = direct::tcp_init(
test_loop as *libc::c_void, tcp_handle_ptr); test_loop as *libc::c_void, tcp_handle_ptr);
if (tcp_init_result == 0i32) { if (tcp_init_result == 0i32) {
io::println("sucessful tcp_init_result"); io::println("sucessful tcp_init_result");
io::println("building addr...");
let addr_val = direct::ip4_addr("173.194.33.40", 80i32);
io::println(#fmt("after build addr in rust. port: %u",
addr_val.sin_port as uint));
let addr: *libc::c_void = ptr::addr_of(addr_val) as
*libc::c_void;
// this should set up the connection request.. // this should set up the connection request..
let tcp_connect_result = direct::tcp_connect( let tcp_connect_result = direct::tcp_connect(
connect_handle_ptr, tcp_handle_ptr, connect_handle_ptr, tcp_handle_ptr,
addr, on_connect_cb); addr, on_connect_cb);
if (tcp_connect_result == 0i32) { if (tcp_connect_result == 0i32) {
// not set the data on the connect_req until its initialized // not set the data on the connect_req
// until its initialized
direct::set_data_for_req( direct::set_data_for_req(
connect_handle_ptr as *libc::c_void, connect_handle_ptr as *libc::c_void,
ptr::addr_of(req) as *libc::c_void); ptr::addr_of(req) as *libc::c_void);
io::println("before run tcp req loop"); io::println("before run tcp req loop");
direct::run(test_loop); direct::run(test_loop);
io::println("after run tcp req loop"); io::println("after run tcp req loop");
// FIXME: see github issue #1402 // TODO: see github issue #1402
direct::free_1402(addr);
} }
else { else {
io::println("direct::tcp_connect() failure"); io::println("direct::tcp_connect() failure");

View File

@ -307,13 +307,10 @@ rust_uv_write(uv_write_t* req, uv_stream_t* handle,
return uv_write(req, handle, bufs, buf_cnt, cb); return uv_write(req, handle, bufs, buf_cnt, cb);
} }
extern "C" void* extern "C" sockaddr_in
rust_uv_ip4_addr(const char* ip, int port) { rust_uv_ip4_addr(const char* ip, int port) {
sockaddr_in* addr_ptr = (sockaddr_in*)current_kernel_malloc(
sizeof(sockaddr_in),
"sockaddr_in");
printf("before creating addr_ptr.. ip %s port %d\n", ip, port); printf("before creating addr_ptr.. ip %s port %d\n", ip, port);
*addr_ptr = uv_ip4_addr("173.194.33.40", 80); sockaddr_in addr = uv_ip4_addr("173.194.33.40", 80);
printf("after creating .. port: %d\n", addr_ptr->sin_port); printf("after creating .. port: %d\n", addr.sin_port);
return (void*)addr_ptr; return addr;
} }