Skip to content

Commit a3dfda6

Browse files
committed
Make plugin_args array of strings, rename plugin_opt to plugin_opts
1 parent 113f0f6 commit a3dfda6

File tree

7 files changed

+47
-27
lines changed

7 files changed

+47
-27
lines changed

src/bin/local.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,8 +204,8 @@ fn main() {
204204
if let Some(p) = matches.value_of("PLUGIN") {
205205
let plugin = PluginConfig {
206206
plugin: p.to_owned(),
207-
plugin_opt: matches.value_of("PLUGIN_OPT").map(ToOwned::to_owned),
208-
plugin_arg: None,
207+
plugin_opts: matches.value_of("PLUGIN_OPT").map(ToOwned::to_owned),
208+
plugin_args: Vec::new(),
209209
};
210210

211211
sc.set_plugin(plugin);

src/bin/server.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,8 @@ fn main() {
110110
if let Some(p) = matches.value_of("PLUGIN") {
111111
let plugin = PluginConfig {
112112
plugin: p.to_owned(),
113-
plugin_opt: matches.value_of("PLUGIN_OPT").map(ToOwned::to_owned),
114-
plugin_arg: None,
113+
plugin_opts: matches.value_of("PLUGIN_OPT").map(ToOwned::to_owned),
114+
plugin_args: Vec::new(),
115115
};
116116

117117
sc.set_plugin(plugin);

src/config.rs

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ struct SSConfig {
9898
#[serde(skip_serializing_if = "Option::is_none")]
9999
plugin_opts: Option<String>,
100100
#[serde(skip_serializing_if = "Option::is_none")]
101-
plugin_arg: Option<String>,
101+
plugin_args: Option<Vec<String>>,
102102
#[serde(skip_serializing_if = "Option::is_none")]
103103
timeout: Option<u64>,
104104
#[serde(skip_serializing_if = "Option::is_none")]
@@ -130,6 +130,8 @@ struct SSServerExtConfig {
130130
#[serde(skip_serializing_if = "Option::is_none")]
131131
plugin_opts: Option<String>,
132132
#[serde(skip_serializing_if = "Option::is_none")]
133+
plugin_args: Option<Vec<String>>,
134+
#[serde(skip_serializing_if = "Option::is_none")]
133135
timeout: Option<u64>,
134136
}
135137

@@ -345,7 +347,7 @@ impl ServerConfig {
345347
let mut url = format!("ss://{}@{}", encoded_user_info, self.addr());
346348
if let Some(c) = self.plugin() {
347349
let mut plugin = c.plugin.clone();
348-
if let Some(ref opt) = c.plugin_opt {
350+
if let Some(ref opt) = c.plugin_opts {
349351
plugin += ";";
350352
plugin += opt;
351353
}
@@ -423,8 +425,8 @@ impl ServerConfig {
423425
Some(p) => {
424426
plugin = Some(PluginConfig {
425427
plugin: p.to_owned(),
426-
plugin_opt: vsp.next().map(ToOwned::to_owned),
427-
plugin_arg: None,
428+
plugin_opts: vsp.next().map(ToOwned::to_owned),
429+
plugin_args: Vec::new(), // SIP002 doesn't have arguments for plugins
428430
})
429431
}
430432
}
@@ -1212,8 +1214,8 @@ impl Config {
12121214
None => None,
12131215
Some(plugin) => Some(PluginConfig {
12141216
plugin,
1215-
plugin_opt: config.plugin_opts,
1216-
plugin_arg: config.plugin_arg,
1217+
plugin_opts: config.plugin_opts,
1218+
plugin_args: config.plugin_args.unwrap_or_default(),
12171219
}),
12181220
};
12191221

@@ -1260,8 +1262,8 @@ impl Config {
12601262
None => None,
12611263
Some(p) => Some(PluginConfig {
12621264
plugin: p,
1263-
plugin_opt: svr.plugin_opts,
1264-
plugin_arg: None,
1265+
plugin_opts: svr.plugin_opts,
1266+
plugin_args: svr.plugin_args.unwrap_or_default(),
12651267
}),
12661268
};
12671269

@@ -1495,8 +1497,14 @@ impl fmt::Display for Config {
14951497
jconf.method = Some(svr.method().to_string());
14961498
jconf.password = Some(svr.password().to_string());
14971499
jconf.plugin = svr.plugin().map(|p| p.plugin.to_string());
1498-
jconf.plugin_opts = svr.plugin().and_then(|p| p.plugin_opt.clone());
1499-
jconf.plugin_arg = svr.plugin().and_then(|p| p.plugin_arg.clone());
1500+
jconf.plugin_opts = svr.plugin().and_then(|p| p.plugin_opts.clone());
1501+
jconf.plugin_args = svr.plugin().and_then(|p| {
1502+
if p.plugin_args.is_empty() {
1503+
None
1504+
} else {
1505+
Some(p.plugin_args.clone())
1506+
}
1507+
});
15001508
jconf.timeout = svr.timeout().map(|t| t.as_secs());
15011509
}
15021510
_ => {
@@ -1515,7 +1523,14 @@ impl fmt::Display for Config {
15151523
password: svr.password().to_string(),
15161524
method: svr.method().to_string(),
15171525
plugin: svr.plugin().map(|p| p.plugin.to_string()),
1518-
plugin_opts: svr.plugin().and_then(|p| p.plugin_opt.clone()),
1526+
plugin_opts: svr.plugin().and_then(|p| p.plugin_opts.clone()),
1527+
plugin_args: svr.plugin().and_then(|p| {
1528+
if p.plugin_args.is_empty() {
1529+
None
1530+
} else {
1531+
Some(p.plugin_args.clone())
1532+
}
1533+
}),
15191534
timeout: svr.timeout().map(|t| t.as_secs()),
15201535
});
15211536
}

src/plugin/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ mod ss_plugin;
3434
#[derive(Debug, Clone)]
3535
pub struct PluginConfig {
3636
pub plugin: String,
37-
pub plugin_opt: Option<String>,
38-
pub plugin_arg: Option<String>,
37+
pub plugin_opts: Option<String>,
38+
pub plugin_args: Vec<String>,
3939
}
4040

4141
/// Mode of Plugin

src/plugin/obfs_proxy.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ pub fn plugin_cmd(plugin: &PluginConfig, remote: &ServerAddr, local: &SocketAddr
3434
.arg("--data-dir")
3535
.arg(format!("/tmp/{}_{}_{}", plugin.plugin, remote, local)); // FIXME: Not compatible in Windows
3636

37-
if let Some(ref opt) = plugin.plugin_opt {
37+
if let Some(ref opt) = plugin.plugin_opts {
3838
cmd.args(opt.split(' '));
3939
}
4040

@@ -51,5 +51,9 @@ pub fn plugin_cmd(plugin: &PluginConfig, remote: &ServerAddr, local: &SocketAddr
5151
.arg(remote.to_string()),
5252
};
5353

54+
if !plugin.plugin_args.is_empty() {
55+
cmd.args(&plugin.plugin_args);
56+
}
57+
5458
cmd
5559
}

src/plugin/ss_plugin.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ use tokio::process::Command;
66

77
pub fn plugin_cmd(plugin: &PluginConfig, remote: &ServerAddr, local: &SocketAddr, _mode: PluginMode) -> Command {
88
trace!(
9-
"Starting plugin \"{}\", opt: {:?} remote: {}, local: {}",
9+
"Starting plugin \"{}\", opt: {:?}, arg: {:?}, remote: {}, local: {}",
1010
plugin.plugin,
11-
plugin.plugin_opt,
11+
plugin.plugin_opts,
12+
plugin.plugin_args,
1213
remote,
1314
local
1415
);
@@ -21,12 +22,12 @@ pub fn plugin_cmd(plugin: &PluginConfig, remote: &ServerAddr, local: &SocketAddr
2122
.stdin(Stdio::null())
2223
.kill_on_drop(true);
2324

24-
if let Some(ref opt) = plugin.plugin_opt {
25+
if let Some(ref opt) = plugin.plugin_opts {
2526
cmd.env("SS_PLUGIN_OPTIONS", opt);
2627
}
2728

28-
if let Some(ref arg) = plugin.plugin_arg {
29-
cmd.arg(arg);
29+
if !plugin.plugin_args.is_empty() {
30+
cmd.args(&plugin.plugin_args);
3031
}
3132

3233
cmd

src/relay/manager.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ mod protocol {
4848
#[serde(skip_serializing_if = "Option::is_none")]
4949
pub plugin: Option<String>,
5050
#[serde(skip_serializing_if = "Option::is_none")]
51-
pub plugin_opt: Option<String>,
51+
pub plugin_opts: Option<String>,
5252
#[serde(skip_serializing_if = "Option::is_none")]
5353
pub mode: Option<String>,
5454
}
@@ -444,8 +444,8 @@ impl ManagerService {
444444
match p.plugin {
445445
Some(pp) => Some(PluginConfig {
446446
plugin: pp,
447-
plugin_opt: p.plugin_opt,
448-
plugin_arg: None,
447+
plugin_opts: p.plugin_opts,
448+
plugin_args: Vec::new(),
449449
}),
450450
None => None,
451451
},
@@ -519,7 +519,7 @@ impl ManagerService {
519519
password: svr_cfg.password().to_string(),
520520
no_delay: None,
521521
plugin: None,
522-
plugin_opt: None,
522+
plugin_opts: None,
523523
mode: None,
524524
};
525525

0 commit comments

Comments
 (0)