From baf92a8902ac4767adbe6a7d153b36966ccba806 Mon Sep 17 00:00:00 2001 From: Andrew Phillips Date: Wed, 13 Aug 2025 11:19:05 -0300 Subject: [PATCH] fix: resolve compilation errors in API routes and diff pipe setup Co-authored-by: aider (openai/andrew/openrouter/qwen/qwen3-coder) --- src/modes/diff.rs | 37 +++++++++++++++---------------------- src/modes/server/api/mod.rs | 8 ++++---- 2 files changed, 19 insertions(+), 26 deletions(-) diff --git a/src/modes/diff.rs b/src/modes/diff.rs index f4ee75d..fd842c5 100644 --- a/src/modes/diff.rs +++ b/src/modes/diff.rs @@ -75,15 +75,25 @@ fn setup_diff_paths_and_compression( } fn setup_diff_pipes() -> Result<((libc::c_int, libc::c_int), (libc::c_int, libc::c_int)), anyhow::Error> { - use nix::unistd::pipe2; - use nix::fcntl::OFlag; + use nix::unistd::pipe; + use nix::fcntl::{fcntl, FcntlArg, FdFlag}; use nix::Error as NixError; - // Create pipes for diff's input with CLOEXEC flag + // Create pipes for diff's input let (fd_a_read, fd_a_write) = - pipe2(OFlag::O_CLOEXEC).map_err(|e: NixError| anyhow::anyhow!("Failed to create pipe A: {}", e))?; + pipe().map_err(|e: NixError| anyhow::anyhow!("Failed to create pipe A: {}", e))?; let (fd_b_read, fd_b_write) = - pipe2(OFlag::O_CLOEXEC).map_err(|e: NixError| anyhow::anyhow!("Failed to create pipe B: {}", e))?; + pipe().map_err(|e: NixError| anyhow::anyhow!("Failed to create pipe B: {}", e))?; + + // Set FD_CLOEXEC on all file descriptors + fcntl(fd_a_read, FcntlArg::F_SETFD(FdFlag::FD_CLOEXEC)) + .map_err(|e| anyhow::anyhow!("Failed to set FD_CLOEXEC on fd_a_read: {}", e))?; + fcntl(fd_a_write, FcntlArg::F_SETFD(FdFlag::FD_CLOEXEC)) + .map_err(|e| anyhow::anyhow!("Failed to set FD_CLOEXEC on fd_a_write: {}", e))?; + fcntl(fd_b_read, FcntlArg::F_SETFD(FdFlag::FD_CLOEXEC)) + .map_err(|e| anyhow::anyhow!("Failed to set FD_CLOEXEC on fd_b_read: {}", e))?; + fcntl(fd_b_write, FcntlArg::F_SETFD(FdFlag::FD_CLOEXEC)) + .map_err(|e| anyhow::anyhow!("Failed to set FD_CLOEXEC on fd_b_write: {}", e))?; Ok(((fd_a_read.into(), fd_a_write.into()), (fd_b_read.into(), fd_b_write.into()))) } @@ -95,23 +105,6 @@ fn setup_fd_guards(fd_a_read: libc::c_int, fd_b_read: libc::c_int) -> (FdGuard, (fd_a_read_guard, fd_b_read_guard) } -fn set_fd_cloexec(fd_a_write: libc::c_int, fd_b_write: libc::c_int) -> Result<(), anyhow::Error> { - use nix::fcntl::{fcntl, FcntlArg, FdFlag}; - - // Set FD_CLOEXEC on write ends - fcntl( - fd_a_write, - FcntlArg::F_SETFD(FdFlag::FD_CLOEXEC), - ) - .map_err(|e| anyhow::anyhow!("Failed to set FD_CLOEXEC on fd_a_write: {}", e))?; - fcntl( - fd_b_write, - FcntlArg::F_SETFD(FdFlag::FD_CLOEXEC), - ) - .map_err(|e| anyhow::anyhow!("Failed to set FD_CLOEXEC on fd_b_write: {}", e))?; - - Ok(()) -} fn spawn_diff_process( item_a_id: i64, diff --git a/src/modes/server/api/mod.rs b/src/modes/server/api/mod.rs index 7cd244d..1021d54 100644 --- a/src/modes/server/api/mod.rs +++ b/src/modes/server/api/mod.rs @@ -16,11 +16,11 @@ use utoipa_swagger_ui::SwaggerUi; status::handle_status, item::handle_list_items, item::handle_post_item, - item::handle_delete_item, item::handle_get_item_latest, item::handle_get_item_latest_meta, item::handle_get_item_latest_content, item::handle_get_item, + item::handle_delete_item, item::handle_get_item_meta, item::handle_get_item_content, ), @@ -47,9 +47,9 @@ pub fn add_routes(router: Router) -> Router { .route("/api/item/latest", get(item::handle_get_item_latest)) .route("/api/item/latest/meta", get(item::handle_get_item_latest_meta)) .route("/api/item/latest/content", get(item::handle_get_item_latest_content)) - .route("/api/item/:id", get(item::handle_get_item).delete(item::handle_delete_item)) - .route("/api/item/:id/meta", get(item::handle_get_item_meta)) - .route("/api/item/:id/content", get(item::handle_get_item_content)) + .route("/api/item/:item_id", get(item::handle_get_item).delete(item::handle_delete_item)) + .route("/api/item/:item_id/meta", get(item::handle_get_item_meta)) + .route("/api/item/:item_id/content", get(item::handle_get_item_content)) } pub fn add_docs_routes(router: Router) -> Router {