Skip to content

Commit c3527ed

Browse files
committed
Checkpoint: partial implementation. This version crashes the compiler in
Nightly.
1 parent 08e0a82 commit c3527ed

File tree

2 files changed

+117
-1
lines changed

2 files changed

+117
-1
lines changed

Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,7 @@ name = "tls_interop"
33
version = "0.1.0"
44
authors = ["EKR <[email protected]>"]
55

6+
[features]
7+
68
[dependencies]
9+
mio = "0.6"

src/main.rs

Lines changed: 114 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,116 @@
1+
extern crate mio;
2+
use mio::*;
3+
use mio::tcp::{TcpListener, TcpStream};
4+
use std::io::Read;
5+
use std::process::{Child, Command};
6+
7+
const SERVER: Token = mio::Token(0);
8+
const A1: Token = mio::Token(0);
9+
const A2: Token = mio::Token(1);
10+
11+
struct Agent {
12+
name : String,
13+
path : String,
14+
args : Vec<String>,
15+
socket : TcpStream,
16+
child: Child
17+
}
18+
19+
impl Agent {
20+
fn new(name: String, path: String, args: Vec<String>) -> Result<Agent, i32> {
21+
let addr = "127.0.0.1:13265".parse().unwrap();
22+
let listener = TcpListener::bind(&addr).unwrap();
23+
24+
// Start the subprocess.
25+
let mut command = Command::new(path.clone());
26+
for arg in args.iter() {
27+
command.arg(arg);
28+
}
29+
30+
command.arg("-port");
31+
command.arg(listener.local_addr().unwrap().port().to_string());
32+
33+
let mut child = command.spawn().unwrap();
34+
35+
// Listen for connect
36+
// Create an poll instance
37+
let poll = Poll::new().unwrap();
38+
poll.register(&listener, SERVER, Ready::readable(),
39+
PollOpt::edge()).unwrap();
40+
let mut events = Events::with_capacity(1024);
41+
42+
poll.poll(&mut events, None).unwrap();
43+
for event in events.iter() {
44+
match event.token() {
45+
SERVER => {
46+
let sock = listener.accept();
47+
48+
println!("Accepted");
49+
50+
return Ok(Agent {
51+
name: name,
52+
path: path,
53+
args: args,
54+
child: child,
55+
socket: sock.unwrap().0,
56+
})
57+
},
58+
_ => return Err(-1),
59+
}
60+
}
61+
62+
unreachable!()
63+
}
64+
}
65+
66+
fn copy_data(from: &Agent, to: &Agent) {
67+
let mut buf = [u8; 1024];
68+
let size = from.socket.read(buf);
69+
}
70+
71+
fn shuttle(agents: Vec<Agent>) {
72+
// Listen for connect
73+
// Create an poll instance
74+
let poll = Poll::new().unwrap();
75+
poll.register(&agents[0].socket, A1, Ready::readable(),
76+
PollOpt::level()).unwrap();
77+
poll.register(&agents[1].socket, A1, Ready::readable(),
78+
PollOpt::level()).unwrap();
79+
let mut events = Events::with_capacity(1024);
80+
81+
poll.poll(&mut events, None).unwrap();
82+
loop {
83+
for event in events.iter() {
84+
match event.token() {
85+
A1 => {
86+
println!("A0 ready");
87+
},
88+
A2 => {
89+
println!("A1 ready");
90+
},
91+
_ => unreachable!()
92+
}
93+
}
94+
}
95+
}
96+
197
fn main() {
2-
println!("Hello, world!");
98+
let mut agents: Vec<Agent> = Vec::new();
99+
100+
let a1 = Agent::new(String::from("a1"),
101+
String::from("/Users/ekr/dev/boringssl//build/ssl/test/bssl_shim"),
102+
Vec::new());
103+
agents.push(a1.unwrap());
104+
105+
let a2 = Agent::new(String::from("a2"),
106+
String::from("/Users/ekr/dev/boringssl//build/ssl/test/bssl_shim"),
107+
vec![String::from("-server"),
108+
String::from("-key-file"),
109+
String::from("/Users/ekr/dev/boringssl/ssl/test/runner/server.pem"),
110+
String::from("-cert-file"),
111+
String::from("/Users/ekr/dev/boringssl/ssl/test/runner/server.pem")]
112+
);
113+
agents.push(a2.unwrap());
114+
115+
shuttle(agents);
3116
}

0 commit comments

Comments
 (0)