diff --git a/backends/appload-clients/rust-backend/src/lib.rs b/backends/appload-clients/rust-backend/src/lib.rs index 5b6966f..7166454 100644 --- a/backends/appload-clients/rust-backend/src/lib.rs +++ b/backends/appload-clients/rust-backend/src/lib.rs @@ -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; @@ -67,18 +67,7 @@ impl Clone for BackendReplier { impl AppLoad { pub fn new(backend: T) -> Result { let args: Vec = 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, @@ -94,6 +83,41 @@ impl AppLoad { 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 { BackendReplier { locked: false, diff --git a/src/management.cpp b/src/management.cpp index 4e2851b..5820896 100644 --- a/src/management.cpp +++ b/src/management.cpp @@ -134,7 +134,11 @@ 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; @@ -142,6 +146,9 @@ static void _listeningThread(char *sockPath, QString appID){ 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; diff --git a/src/qtfb/fbmanagement.cpp b/src/qtfb/fbmanagement.cpp index 1ab2ed8..629cd11 100644 --- a/src/qtfb/fbmanagement.cpp +++ b/src/qtfb/fbmanagement.cpp @@ -394,7 +394,11 @@ 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; @@ -402,6 +406,9 @@ static void managementMainThread(){ 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;