Skip to content

Commit ebfb013

Browse files
committed
Implement coproc roughly
1 parent 8c3d0b4 commit ebfb013

File tree

2 files changed

+13
-3
lines changed

2 files changed

+13
-3
lines changed

src/core/file_descs.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,8 @@ impl FileDescriptors {
3131
data
3232
}
3333

34-
pub(super) fn dupfd_cloexec(&mut self, from: RawFd,
34+
pub fn dupfd_cloexec(&mut self, from: RawFd,
3535
hereafter: RawFd) -> Result<RawFd, ExecError> {
36-
//let fd = fcntl::fcntl(from, fcntl::F_DUPFD_CLOEXEC(hereafter))?;
3736
let fd = unsafe{fcntl(from, F_DUPFD_CLOEXEC, hereafter)};
3837
self.fds[fd as usize] = Some(unsafe { OwnedFd::from_raw_fd(fd) });
3938

src/elements/command/coproc.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,23 @@ impl Command for Coprocess {
3636

3737
let mut prevp = Pipe::new("|".to_string());
3838
prevp.set(-1, pgid, core);
39+
prevp.send = core.fds.dupfd_cloexec(prevp.send, 60).unwrap();
40+
prevp.recv = core.fds.dupfd_cloexec(prevp.recv, 60).unwrap();
41+
3942
let mut lastp = Pipe::new("|".to_string());
4043
lastp.set(prevp.recv, pgid, core);
44+
lastp.send = core.fds.dupfd_cloexec(lastp.send, 60).unwrap();
45+
lastp.recv = core.fds.dupfd_cloexec(lastp.recv, 60).unwrap();
46+
4147
let pid = com.exec(core, &mut lastp)?.unwrap();
48+
let fds = Some(vec![lastp.recv.to_string(), prevp.send.to_string()]);
4249

43-
let _ = core.db.init_array(&self.name, Some(vec![lastp.recv.to_string(), prevp.send.to_string()]), Some(0), true);
50+
let _ = core.db.init_array(&self.name, fds, Some(0), true);
51+
let pid_name = format!("{}_PID", &self.name);
52+
let _ = core.db.set_param(&pid_name, &pid.to_string(), Some(0));
4453

54+
core.fds.close(lastp.send);
55+
core.fds.close(prevp.recv);
4556

4657
let _ = core.db.set_param("!", &pid.to_string(), None);
4758
let new_job_id = core.generate_new_job_id();

0 commit comments

Comments
 (0)