From 2f4558aa3df29d5cd1dfa72ff4278e1fe6fc1576 Mon Sep 17 00:00:00 2001 From: Jonas Maier Date: Mon, 9 Mar 2026 20:06:43 +0100 Subject: export functions :)) --- src/export_fun.rs | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) (limited to 'src/export_fun.rs') diff --git a/src/export_fun.rs b/src/export_fun.rs index 64ac08b..9c2ab4a 100644 --- a/src/export_fun.rs +++ b/src/export_fun.rs @@ -1,14 +1,19 @@ //! allow sub-programs to invoke arbitrary user-defined functions via a unix socket use crate::Session; +use crate::run::Input; +use crate::run::Output; use crate::run::get_command_kind; use std::env::current_exe; use std::ffi::OsStr; use std::fs; +use std::fs::File; use std::io; use std::io::IoSliceMut; use std::io::Read; use std::io::Write; +use std::os::fd::FromRawFd; +use std::os::fd::OwnedFd; use std::os::unix::ffi::OsStrExt; use std::os::unix::fs::symlink; use std::os::unix::net::AncillaryData; @@ -21,8 +26,9 @@ use std::process::exit; use std::sync::Arc; use std::sync::Mutex; use std::thread; +use std::time::Duration; -fn handle_server(session: Arc>, stream: UnixStream) -> io::Result<()> { +fn handle_server(session: Arc>, mut stream: UnixStream) -> io::Result<()> { // TODO: figure out how to get a reasonable limit on CLI arg len let mut buf = [0u8; 8192]; let mut iov = [IoSliceMut::new(&mut buf)]; @@ -64,18 +70,38 @@ fn handle_server(session: Arc>, stream: UnixStream) -> io::Result let se = session.lock().unwrap(); match get_command_kind(&se, cli_args[0].as_slice()) { - crate::run::CommandKind::Fun(ast) => todo!(), + crate::run::CommandKind::Fun(_) => (), crate::run::CommandKind::Path(_) | crate::run::CommandKind::Builtin(_) => { return Ok(()); } } + drop(se); - todo!() + let stdin = File::from(unsafe { OwnedFd::from_raw_fd(fds[0]) }); + let stdout = File::from(unsafe { OwnedFd::from_raw_fd(fds[1]) }); + + let res = crate::run::Executor::execute_fun( + session, + cli_args, + Input::File(stdin), + Output::File(stdout), + ); + + let exit_code = match res { + Ok(_) => 0, + Err(e) => match e { + crate::run::ExecError::UnknownVariable(_) => -3, + crate::run::ExecError::ExecError(x) => x, + }, + }; + + let _ = stream.set_write_timeout(Some(Duration::from_secs(1))); + stream.write_all(&exit_code.to_le_bytes())?; + + Ok(()) } fn handle_client(mut stream: UnixStream) -> io::Result<()> { - println!("uhh hi"); - // give up all my file descriptors descriptors let mut ancillary_buffer = [0; 128]; let mut ancillary = SocketAncillary::new(&mut ancillary_buffer[..]); -- cgit v1.2.3