mirror of
https://github.com/yuezk/GlobalProtect-openconnect.git
synced 2025-04-02 18:31:50 -04:00
refactor: improve the code
This commit is contained in:
parent
19b9b757f4
commit
6df9877895
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@ -20,6 +20,7 @@
|
||||
"stdio.h": "c",
|
||||
"openconnect.h": "c",
|
||||
"compare": "c",
|
||||
"stdlib.h": "c"
|
||||
"stdlib.h": "c",
|
||||
"vpn.h": "c"
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
use std::ffi::c_void;
|
||||
use tokio::sync::mpsc;
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Copy, Clone)]
|
||||
@ -12,11 +13,24 @@ pub(crate) struct Options {
|
||||
#[link(name = "vpn")]
|
||||
extern "C" {
|
||||
#[link_name = "start"]
|
||||
pub(crate) fn connect(
|
||||
options: *const Options,
|
||||
on_connected: extern "C" fn(i32, *mut c_void),
|
||||
) -> ::std::os::raw::c_int;
|
||||
pub(crate) fn connect(options: *const Options) -> ::std::os::raw::c_int;
|
||||
|
||||
#[link_name = "stop"]
|
||||
pub(crate) fn disconnect();
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn on_vpn_connected(value: i32, sender: *mut c_void) {
|
||||
let sender = unsafe { &*(sender as *const mpsc::Sender<i32>) };
|
||||
sender
|
||||
.blocking_send(value)
|
||||
.expect("Failed to send VPN connection code");
|
||||
}
|
||||
|
||||
// Logger used in the C code.
|
||||
#[no_mangle]
|
||||
extern "C" fn vpn_log(level: i32, message: *const ::std::os::raw::c_char) {
|
||||
println!("{}: {:?}", level, unsafe {
|
||||
std::ffi::CStr::from_ptr(message)
|
||||
});
|
||||
}
|
||||
|
@ -1,5 +1,3 @@
|
||||
mod ffi;
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::ffi::{c_void, CString};
|
||||
use std::sync::Arc;
|
||||
@ -7,13 +5,7 @@ use std::thread;
|
||||
use tokio::sync::watch;
|
||||
use tokio::sync::{mpsc, Mutex};
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn on_connected(value: i32, sender: *mut c_void) {
|
||||
let sender = unsafe { &*(sender as *const mpsc::Sender<i32>) };
|
||||
sender
|
||||
.blocking_send(value)
|
||||
.expect("Failed to send VPN connection code");
|
||||
}
|
||||
mod ffi;
|
||||
|
||||
#[derive(Debug, PartialEq, Clone, Copy, Serialize, Deserialize)]
|
||||
#[serde(rename_all = "lowercase")]
|
||||
@ -119,7 +111,7 @@ impl Vpn {
|
||||
|
||||
// Start the VPN connection, this will block until the connection is closed
|
||||
status_holder.blocking_lock().set(VpnStatus::Connecting);
|
||||
let ret = unsafe { ffi::connect(&oc_options, on_connected) };
|
||||
let ret = unsafe { ffi::connect(&oc_options) };
|
||||
|
||||
println!("VPN connection closed with code: {}", ret);
|
||||
status_holder.blocking_lock().set(VpnStatus::Disconnected);
|
||||
|
@ -9,7 +9,6 @@
|
||||
#include "vpn.h"
|
||||
|
||||
void *g_user_data;
|
||||
on_connected_cb g_on_connected_cb;
|
||||
|
||||
static int g_cmd_pipe_fd;
|
||||
const char *g_vpnc_script;
|
||||
@ -43,19 +42,18 @@ static void print_progress(__attribute__((unused)) void *_vpninfo, int level, co
|
||||
static void setup_tun_handler(void *_vpninfo)
|
||||
{
|
||||
openconnect_setup_tun_device(_vpninfo, g_vpnc_script, NULL);
|
||||
|
||||
if (g_on_connected_cb)
|
||||
{
|
||||
g_on_connected_cb(g_cmd_pipe_fd, g_user_data);
|
||||
}
|
||||
on_vpn_connected(g_cmd_pipe_fd, g_user_data);
|
||||
}
|
||||
|
||||
/* Initialize VPN connection */
|
||||
int start(const Options *options, on_connected_cb cb)
|
||||
int start(const Options *options)
|
||||
{
|
||||
struct openconnect_info *vpninfo;
|
||||
struct utsname utsbuf;
|
||||
|
||||
g_user_data = options->user_data;
|
||||
g_vpnc_script = options->script;
|
||||
|
||||
vpninfo = openconnect_vpninfo_new("PAN GlobalProtect", validate_peer_cert, NULL, NULL, print_progress, NULL);
|
||||
|
||||
if (!vpninfo)
|
||||
@ -95,10 +93,6 @@ int start(const Options *options, on_connected_cb cb)
|
||||
}
|
||||
|
||||
// Essential step
|
||||
// openconnect_setup_tun_device(vpninfo, options->script, NULL);
|
||||
g_user_data = options->user_data;
|
||||
g_on_connected_cb = cb;
|
||||
g_vpnc_script = options->script;
|
||||
openconnect_set_setup_tun_handler(vpninfo, setup_tun_handler);
|
||||
|
||||
while (1)
|
||||
|
@ -1,5 +1,3 @@
|
||||
typedef void (*on_connected_cb)(int32_t, void *);
|
||||
|
||||
typedef struct Options {
|
||||
const char *server;
|
||||
const char *cookie;
|
||||
@ -7,5 +5,8 @@ typedef struct Options {
|
||||
void *user_data;
|
||||
} Options;
|
||||
|
||||
int start(const Options *options, on_connected_cb cb);
|
||||
int start(const Options *options);
|
||||
void stop();
|
||||
|
||||
extern void on_vpn_connected(int cmd_pipe_fd, void *user_data);
|
||||
extern void vpn_log(int level, const char *msg);
|
Loading…
Reference in New Issue
Block a user