Skip to content

Commit 563c384

Browse files
authored
Merge pull request #234 from Rjected/add-address-to-cli
feat: add address to server and import options
2 parents f4f354f + f009860 commit 563c384

File tree

2 files changed

+28
-5
lines changed

2 files changed

+28
-5
lines changed

samply/src/main.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ mod shared;
1616
use std::ffi::OsStr;
1717
use std::fs::File;
1818
use std::io::{BufReader, BufWriter};
19+
use std::net::IpAddr;
1920
use std::path::{Path, PathBuf};
21+
use std::str::FromStr;
2022
use std::time::Duration;
2123

2224
use clap::{Args, Parser, Subcommand, ValueEnum};
@@ -230,6 +232,10 @@ struct ServerArgs {
230232
#[arg(short, long)]
231233
no_open: bool,
232234

235+
/// The address to use for the local web server
236+
#[arg(long, default_value = "127.0.0.1")]
237+
address: String,
238+
233239
/// The port to use for the local web server
234240
#[arg(short = 'P', long, default_value = "3000+")]
235241
port: String,
@@ -554,7 +560,21 @@ impl ServerArgs {
554560
std::process::exit(1)
555561
}
556562
};
563+
564+
// parse address from string
565+
let address = match IpAddr::from_str(&self.address) {
566+
Ok(addr) => addr,
567+
Err(e) => {
568+
eprintln!(
569+
"Could not parse address as IpAddr, got address {:?}, error: {}",
570+
self.address, e
571+
);
572+
std::process::exit(1)
573+
}
574+
};
575+
557576
ServerProps {
577+
address,
558578
port_selection,
559579
verbose: self.verbose,
560580
open_in_browser,

samply/src/server.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::collections::HashMap;
22
use std::ffi::OsStr;
3-
use std::net::SocketAddr;
3+
use std::net::{IpAddr, SocketAddr};
44
use std::ops::Range;
55
use std::path::{Path, PathBuf};
66
use std::str::FromStr;
@@ -26,6 +26,7 @@ use crate::shared::ctrl_c::CtrlC;
2626

2727
#[derive(Clone, Debug)]
2828
pub struct ServerProps {
29+
pub address: IpAddr,
2930
pub port_selection: PortSelection,
3031
pub verbose: bool,
3132
pub open_in_browser: bool,
@@ -40,6 +41,7 @@ pub async fn start_server_main(
4041
start_server(
4142
Some(file),
4243
libinfo_map,
44+
props.address,
4345
props.port_selection,
4446
props.verbose,
4547
props.open_in_browser,
@@ -70,11 +72,12 @@ impl PortSelection {
7072
async fn start_server(
7173
profile_filename: Option<&Path>,
7274
libinfo_map: HashMap<(String, DebugId), LibraryInfo>,
75+
address: IpAddr,
7376
port_selection: PortSelection,
7477
verbose: bool,
7578
open_in_browser: bool,
7679
) {
77-
let (listener, addr) = make_listener(port_selection).await;
80+
let (listener, addr) = make_listener(address, port_selection).await;
7881

7982
let token = generate_token();
8083
let path_prefix = format!("/{token}");
@@ -179,10 +182,10 @@ fn generate_token() -> String {
179182
nix_base32::to_nix_base32(&bytes)
180183
}
181184

182-
async fn make_listener(port_selection: PortSelection) -> (TcpListener, SocketAddr) {
185+
async fn make_listener(addr: IpAddr, port_selection: PortSelection) -> (TcpListener, SocketAddr) {
183186
match port_selection {
184187
PortSelection::OnePort(port) => {
185-
let addr = SocketAddr::from(([127, 0, 0, 1], port));
188+
let addr = SocketAddr::from((addr, port));
186189
match TcpListener::bind(&addr).await {
187190
Ok(listener) => (listener, addr),
188191
Err(e) => {
@@ -194,7 +197,7 @@ async fn make_listener(port_selection: PortSelection) -> (TcpListener, SocketAdd
194197
PortSelection::TryMultiple(range) => {
195198
let mut error = None;
196199
for port in range.clone() {
197-
let addr = SocketAddr::from(([127, 0, 0, 1], port));
200+
let addr = SocketAddr::from((addr, port));
198201
match TcpListener::bind(&addr).await {
199202
Ok(listener) => return (listener, addr),
200203
Err(e) => {

0 commit comments

Comments
 (0)