Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 37 additions & 13 deletions backends/appload-clients/rust-backend/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use anyhow::{Error, Result};
use async_trait::async_trait;
use libc::{c_void, sockaddr_un, socket, AF_UNIX, SOCK_SEQPACKET};
use libc::{c_int, c_void, sockaddr_un, socket, AF_UNIX};
use std::env::args;
use std::io;
use std::mem;
Expand Down Expand Up @@ -67,18 +67,7 @@ impl <T: AppLoadBackend> Clone for BackendReplier<T> {
impl <T: AppLoadBackend> AppLoad<T> {
pub fn new(backend: T) -> Result<Self> {
let args: Vec<String> = args().collect();
let fd = unsafe { socket(AF_UNIX, SOCK_SEQPACKET, 0) };
if fd == -1 {
return Err(Error::new(io::Error::last_os_error()));
}

let mut addr = sockaddr_un {
sun_family: AF_UNIX as u16,
sun_path: [0; 108],
};
let bytes = args[1].as_bytes();
addr.sun_path[..bytes.len()].copy_from_slice(unsafe { transmute(bytes) });

let (fd, addr) = Self::create_socket(&args[1])?;
let connect_res = unsafe {
libc::connect(
fd,
Expand All @@ -94,6 +83,41 @@ impl <T: AppLoadBackend> AppLoad<T> {
Ok(Self { backend: Arc::new(Mutex::new(backend)), fd })
}

#[cfg(target_os = "macos")]
fn create_socket(path: &str) -> Result<(c_int, sockaddr_un)> {
let fd = unsafe { socket(AF_UNIX, libc::SOCK_STREAM, 0) };
if fd == -1 {
return Err(Error::new(io::Error::last_os_error()));
}

let bytes = path.as_bytes();
let mut addr = sockaddr_un {
sun_family: AF_UNIX as u8,
sun_len: (mem::offset_of!(sockaddr_un, sun_path) + bytes.len()) as u8,
sun_path: [0; 104],
};
addr.sun_path[..bytes.len()].copy_from_slice(unsafe { transmute(bytes) });

Ok((fd, addr))
}

#[cfg(target_os = "linux")]
fn create_socket(path: &str) -> Result<(c_int, sockaddr_un)> {
let fd = unsafe { socket(AF_UNIX, libc::SOCK_SEQPACKET , 0) };
if fd == -1 {
return Err(Error::new(io::Error::last_os_error()));
}

let mut addr = sockaddr_un {
sun_family: AF_UNIX as u16,
sun_path: [0; 108],
};
let bytes = path.as_bytes();
addr.sun_path[..bytes.len()].copy_from_slice(unsafe { transmute(bytes) });

Ok((fd, addr))
}

pub fn create_replier(&self) -> BackendReplier<T> {
BackendReplier {
locked: false,
Expand Down
7 changes: 7 additions & 0 deletions src/management.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -134,14 +134,21 @@ void appload::management::_registerSocket(const QString &applicationID, int sock

static void _listeningThread(char *sockPath, QString appID){
unlink(sockPath);
#ifdef Q_OS_DARWIN
int sockFD = socket(AF_UNIX, SOCK_STREAM, 0);
#else
int sockFD = socket(AF_UNIX, SOCK_SEQPACKET, 0);
#endif
if(sockFD == -1){
CERR << "Cannot create generic socket!" << std::endl;
return;
}
struct sockaddr_un unixSock;
unixSock.sun_family = AF_UNIX;
strncpy(unixSock.sun_path, sockPath, sizeof(unixSock.sun_path) - 1);
#ifdef Q_OS_DARWIN
unixSock.sun_len = SUN_LEN(&unixSock);
#endif
if(bind(sockFD, (struct sockaddr *) &unixSock, sizeof(unixSock)) == -1) {
CERR << "Cannot bind to socket " << sockPath << std::endl;
return;
Expand Down
7 changes: 7 additions & 0 deletions src/qtfb/fbmanagement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -394,14 +394,21 @@ qtfb::management::ClientBackend::~ClientBackend() {
static void managementMainThread(){
CERR << "In main management thread." << std::endl;
CERR << "Creating socket..." << std::endl;
#ifdef Q_OS_DARWIN
int serverSocket = socket(AF_UNIX, SOCK_STREAM, 0);
#else
int serverSocket = socket(AF_UNIX, SOCK_SEQPACKET, 0);
#endif
if(serverSocket == -1) {
CERR << "Failed to initialize the socket!" << std::endl;
return;
}
struct sockaddr_un addr;
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, SOCKET_PATH, sizeof(addr.sun_path) - 1);
#ifdef Q_OS_DARWIN
addr.sun_len = SUN_LEN(&addr);
#endif
unlink(SOCKET_PATH);
if (bind(serverSocket, (struct sockaddr *) &addr, sizeof(addr)) == -1) {
CERR << "Failed to bind the socket!" << std::endl;
Expand Down