pub struct OptionsBuilder { /* private fields */ }Expand description
Builder for Options.
Implementations§
Source§impl OptionsBuilder
impl OptionsBuilder
Sourcepub fn max_memory(self, bytes: u64) -> Self
pub fn max_memory(self, bytes: u64) -> Self
Examples found in repository?
examples/basic.rs (line 12)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4 let args: Vec<String> = std::env::args().collect();
5 if args.len() < 2 {
6 eprintln!("Usage: {} [program file] [arguments ...]", args[0]);
7 std::process::exit(1);
8 }
9
10 let elf = std::fs::read(&args[1])?;
11 let options = Options::builder()
12 .max_memory(256 * 1024 * 1024)
13 .args(args[1..].iter())
14 .build()?;
15
16 let registry = SyscallRegistry::empty();
17 let mut machine = Machine::new(elf, options, ®istry)?;
18 machine.run(u64::MAX)?;
19 println!("Program exited with status: {}", machine.return_value());
20 Ok(())
21}More examples
examples/vmcall.rs (line 19)
10fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
11 let args: Vec<String> = std::env::args().collect();
12 if args.len() < 2 {
13 eprintln!("Usage: {} [program file] [arguments ...]", args[0]);
14 std::process::exit(1);
15 }
16
17 let elf = std::fs::read(&args[1])?;
18 let options = Options::builder()
19 .max_memory(64 * 1024 * 1024)
20 .args(args[1..].iter())
21 .build()?;
22
23 let registry = SyscallRegistry::empty();
24 let mut machine = Machine::new(elf, options, ®istry)?;
25 machine.run(32_000_000)?;
26
27 if let Some(addr) = machine.address_of("my_function")? {
28 machine.setup_vmcall(addr)?;
29 let msg = b"Hello Sandboxed World!\0";
30 let str_addr = {
31 let mut regs = machine.registers()?;
32 reserve_stack(&mut regs, msg.len())?
33 };
34 machine.copy_to_guest(str_addr, msg)?;
35 {
36 let mut regs = machine.registers()?;
37 regs.set_x(10, str_addr)?;
38 }
39 machine.run(u64::MAX)?;
40 } else {
41 eprintln!("Symbol my_function not found");
42 }
43
44 println!("Program exited with status: {}", machine.return_value());
45 Ok(())
46}pub fn stack_size(self, bytes: u32) -> Self
pub fn strict_sandbox(self, strict: bool) -> Self
Sourcepub fn args<I, S>(self, args: I) -> Self
pub fn args<I, S>(self, args: I) -> Self
Examples found in repository?
examples/basic.rs (line 13)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4 let args: Vec<String> = std::env::args().collect();
5 if args.len() < 2 {
6 eprintln!("Usage: {} [program file] [arguments ...]", args[0]);
7 std::process::exit(1);
8 }
9
10 let elf = std::fs::read(&args[1])?;
11 let options = Options::builder()
12 .max_memory(256 * 1024 * 1024)
13 .args(args[1..].iter())
14 .build()?;
15
16 let registry = SyscallRegistry::empty();
17 let mut machine = Machine::new(elf, options, ®istry)?;
18 machine.run(u64::MAX)?;
19 println!("Program exited with status: {}", machine.return_value());
20 Ok(())
21}More examples
examples/vmcall.rs (line 20)
10fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
11 let args: Vec<String> = std::env::args().collect();
12 if args.len() < 2 {
13 eprintln!("Usage: {} [program file] [arguments ...]", args[0]);
14 std::process::exit(1);
15 }
16
17 let elf = std::fs::read(&args[1])?;
18 let options = Options::builder()
19 .max_memory(64 * 1024 * 1024)
20 .args(args[1..].iter())
21 .build()?;
22
23 let registry = SyscallRegistry::empty();
24 let mut machine = Machine::new(elf, options, ®istry)?;
25 machine.run(32_000_000)?;
26
27 if let Some(addr) = machine.address_of("my_function")? {
28 machine.setup_vmcall(addr)?;
29 let msg = b"Hello Sandboxed World!\0";
30 let str_addr = {
31 let mut regs = machine.registers()?;
32 reserve_stack(&mut regs, msg.len())?
33 };
34 machine.copy_to_guest(str_addr, msg)?;
35 {
36 let mut regs = machine.registers()?;
37 regs.set_x(10, str_addr)?;
38 }
39 machine.run(u64::MAX)?;
40 } else {
41 eprintln!("Symbol my_function not found");
42 }
43
44 println!("Program exited with status: {}", machine.return_value());
45 Ok(())
46}examples/advanced_syscalls.rs (line 163)
149fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
150 let args: Vec<String> = std::env::args().collect();
151 if args.len() < 2 {
152 eprintln!("Usage: {} [program file]", args[0]);
153 std::process::exit(1);
154 }
155
156 let elf = std::fs::read(&args[1])?;
157
158 let registry = host_syscalls::registry()?;
159
160 let options = Options::builder()
161 .stdout_handler(stdout_callback_handler())
162 .error_handler(error_callback_handler())
163 .args(["program"])
164 .build()?;
165
166 let mut machine = Machine::new(elf, options, ®istry)?;
167 machine.run(u64::MAX)?;
168
169 let addr = HOST_FN_ADDR.load(Ordering::Relaxed);
170 if addr != 0 {
171 machine.setup_vmcall(addr)?;
172 let msg = b"Hello from a callback function!\0";
173 let str_addr = {
174 let mut regs = machine.registers()?;
175 reserve_stack(&mut regs, msg.len())?
176 };
177 machine.copy_to_guest(str_addr, msg)?;
178 {
179 let mut regs = machine.registers()?;
180 regs.set_x(10, str_addr)?;
181 }
182 machine.run(u64::MAX)?;
183 } else {
184 eprintln!("Host function 502 was not called");
185 }
186
187 println!("Done");
188 Ok(())
189}pub fn clear_args(self) -> Self
Sourcepub fn error_handler(self, handler: ErrorHandler) -> Self
pub fn error_handler(self, handler: ErrorHandler) -> Self
Examples found in repository?
examples/advanced_syscalls.rs (line 162)
149fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
150 let args: Vec<String> = std::env::args().collect();
151 if args.len() < 2 {
152 eprintln!("Usage: {} [program file]", args[0]);
153 std::process::exit(1);
154 }
155
156 let elf = std::fs::read(&args[1])?;
157
158 let registry = host_syscalls::registry()?;
159
160 let options = Options::builder()
161 .stdout_handler(stdout_callback_handler())
162 .error_handler(error_callback_handler())
163 .args(["program"])
164 .build()?;
165
166 let mut machine = Machine::new(elf, options, ®istry)?;
167 machine.run(u64::MAX)?;
168
169 let addr = HOST_FN_ADDR.load(Ordering::Relaxed);
170 if addr != 0 {
171 machine.setup_vmcall(addr)?;
172 let msg = b"Hello from a callback function!\0";
173 let str_addr = {
174 let mut regs = machine.registers()?;
175 reserve_stack(&mut regs, msg.len())?
176 };
177 machine.copy_to_guest(str_addr, msg)?;
178 {
179 let mut regs = machine.registers()?;
180 regs.set_x(10, str_addr)?;
181 }
182 machine.run(u64::MAX)?;
183 } else {
184 eprintln!("Host function 502 was not called");
185 }
186
187 println!("Done");
188 Ok(())
189}Sourcepub fn stdout_handler(self, handler: StdoutHandler) -> Self
pub fn stdout_handler(self, handler: StdoutHandler) -> Self
Examples found in repository?
examples/advanced_syscalls.rs (line 161)
149fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
150 let args: Vec<String> = std::env::args().collect();
151 if args.len() < 2 {
152 eprintln!("Usage: {} [program file]", args[0]);
153 std::process::exit(1);
154 }
155
156 let elf = std::fs::read(&args[1])?;
157
158 let registry = host_syscalls::registry()?;
159
160 let options = Options::builder()
161 .stdout_handler(stdout_callback_handler())
162 .error_handler(error_callback_handler())
163 .args(["program"])
164 .build()?;
165
166 let mut machine = Machine::new(elf, options, ®istry)?;
167 machine.run(u64::MAX)?;
168
169 let addr = HOST_FN_ADDR.load(Ordering::Relaxed);
170 if addr != 0 {
171 machine.setup_vmcall(addr)?;
172 let msg = b"Hello from a callback function!\0";
173 let str_addr = {
174 let mut regs = machine.registers()?;
175 reserve_stack(&mut regs, msg.len())?
176 };
177 machine.copy_to_guest(str_addr, msg)?;
178 {
179 let mut regs = machine.registers()?;
180 regs.set_x(10, str_addr)?;
181 }
182 machine.run(u64::MAX)?;
183 } else {
184 eprintln!("Host function 502 was not called");
185 }
186
187 println!("Done");
188 Ok(())
189}pub fn opaque(self, opaque: *mut c_void) -> Self
Sourcepub fn build(self) -> Result<Options>
pub fn build(self) -> Result<Options>
Examples found in repository?
examples/basic.rs (line 14)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4 let args: Vec<String> = std::env::args().collect();
5 if args.len() < 2 {
6 eprintln!("Usage: {} [program file] [arguments ...]", args[0]);
7 std::process::exit(1);
8 }
9
10 let elf = std::fs::read(&args[1])?;
11 let options = Options::builder()
12 .max_memory(256 * 1024 * 1024)
13 .args(args[1..].iter())
14 .build()?;
15
16 let registry = SyscallRegistry::empty();
17 let mut machine = Machine::new(elf, options, ®istry)?;
18 machine.run(u64::MAX)?;
19 println!("Program exited with status: {}", machine.return_value());
20 Ok(())
21}More examples
examples/vmcall.rs (line 21)
10fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
11 let args: Vec<String> = std::env::args().collect();
12 if args.len() < 2 {
13 eprintln!("Usage: {} [program file] [arguments ...]", args[0]);
14 std::process::exit(1);
15 }
16
17 let elf = std::fs::read(&args[1])?;
18 let options = Options::builder()
19 .max_memory(64 * 1024 * 1024)
20 .args(args[1..].iter())
21 .build()?;
22
23 let registry = SyscallRegistry::empty();
24 let mut machine = Machine::new(elf, options, ®istry)?;
25 machine.run(32_000_000)?;
26
27 if let Some(addr) = machine.address_of("my_function")? {
28 machine.setup_vmcall(addr)?;
29 let msg = b"Hello Sandboxed World!\0";
30 let str_addr = {
31 let mut regs = machine.registers()?;
32 reserve_stack(&mut regs, msg.len())?
33 };
34 machine.copy_to_guest(str_addr, msg)?;
35 {
36 let mut regs = machine.registers()?;
37 regs.set_x(10, str_addr)?;
38 }
39 machine.run(u64::MAX)?;
40 } else {
41 eprintln!("Symbol my_function not found");
42 }
43
44 println!("Program exited with status: {}", machine.return_value());
45 Ok(())
46}examples/advanced_syscalls.rs (line 164)
149fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
150 let args: Vec<String> = std::env::args().collect();
151 if args.len() < 2 {
152 eprintln!("Usage: {} [program file]", args[0]);
153 std::process::exit(1);
154 }
155
156 let elf = std::fs::read(&args[1])?;
157
158 let registry = host_syscalls::registry()?;
159
160 let options = Options::builder()
161 .stdout_handler(stdout_callback_handler())
162 .error_handler(error_callback_handler())
163 .args(["program"])
164 .build()?;
165
166 let mut machine = Machine::new(elf, options, ®istry)?;
167 machine.run(u64::MAX)?;
168
169 let addr = HOST_FN_ADDR.load(Ordering::Relaxed);
170 if addr != 0 {
171 machine.setup_vmcall(addr)?;
172 let msg = b"Hello from a callback function!\0";
173 let str_addr = {
174 let mut regs = machine.registers()?;
175 reserve_stack(&mut regs, msg.len())?
176 };
177 machine.copy_to_guest(str_addr, msg)?;
178 {
179 let mut regs = machine.registers()?;
180 regs.set_x(10, str_addr)?;
181 }
182 machine.run(u64::MAX)?;
183 } else {
184 eprintln!("Host function 502 was not called");
185 }
186
187 println!("Done");
188 Ok(())
189}Trait Implementations§
Auto Trait Implementations§
impl Freeze for OptionsBuilder
impl RefUnwindSafe for OptionsBuilder
impl !Send for OptionsBuilder
impl !Sync for OptionsBuilder
impl Unpin for OptionsBuilder
impl UnwindSafe for OptionsBuilder
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more