Merge branch 'pschdir' into simexec
This commit is contained in:
		
						commit
						87845ba5bd
					
				
							
								
								
									
										7
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								Makefile
									
									
									
									
									
								
							@ -32,7 +32,7 @@ RUSTLIBS = --extern getopt=build/o/libgetopt.rlib \
 | 
				
			|||||||
CFLAGS += -I$(SYSEXITS)
 | 
					CFLAGS += -I$(SYSEXITS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PHONY: all
 | 
					.PHONY: all
 | 
				
			||||||
all: dj false fop hru intcmp mm npc rpn simexec scrut str strcmp swab true
 | 
					all: dj false fop hru intcmp mm npc rpn scrut str strcmp swab true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# keep build/include until bindgen(1) has stdin support
 | 
					# keep build/include until bindgen(1) has stdin support
 | 
				
			||||||
# https://github.com/rust-lang/rust-bindgen/issues/2703
 | 
					# https://github.com/rust-lang/rust-bindgen/issues/2703
 | 
				
			||||||
@ -122,6 +122,11 @@ npc: build/bin/npc
 | 
				
			|||||||
build/bin/npc: src/npc.c build
 | 
					build/bin/npc: src/npc.c build
 | 
				
			||||||
	$(CC) $(CFLAGAS) -o $@ src/npc.c
 | 
						$(CC) $(CFLAGAS) -o $@ src/npc.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.PHONY: pschdir
 | 
				
			||||||
 | 
					pschdir: build/bin/pschdir
 | 
				
			||||||
 | 
					build/bin/pschdir: src/pschdir.rs build
 | 
				
			||||||
 | 
						$(RUSTC) $(RUSTFLAGS) $(RUSTLIBS) -o $@ src/pschdir.rs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PHONY: rpn
 | 
					.PHONY: rpn
 | 
				
			||||||
rpn: build/bin/rpn
 | 
					rpn: build/bin/rpn
 | 
				
			||||||
build/bin/rpn: src/rpn.rs build rustlibs
 | 
					build/bin/rpn: src/rpn.rs build rustlibs
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										61
									
								
								src/pschdir.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								src/pschdir.rs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,61 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) 2023_2024 DTB <trinity@trinity.moe>
 | 
				
			||||||
 | 
					 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This program is free software: you can redistribute it and/or modify it under
 | 
				
			||||||
 | 
					 * the terms of the GNU Affero General Public License as published by the Free
 | 
				
			||||||
 | 
					 * Software Foundation, either version 3 of the License, or (at your option) any
 | 
				
			||||||
 | 
					 * later version.
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * This program is distributed in the hope that it will be useful, but WITHOUT
 | 
				
			||||||
 | 
					 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 | 
				
			||||||
 | 
					 * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
 | 
				
			||||||
 | 
					 * details.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * You should have received a copy of the GNU Affero General Public License
 | 
				
			||||||
 | 
					 * along with this program. If not, see https://www.gnu.org/licenses/.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use std::{ env::args, io::Error, process::{ Command, ExitCode } };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern crate strerror;
 | 
				
			||||||
 | 
					use strerror::StrError;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern crate sysexits;
 | 
				
			||||||
 | 
					use sysexits::{ EX_UNAVAILABLE, EX_USAGE };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn error(p: &str, n: &str, e: Error) -> ExitCode {
 | 
				
			||||||
 | 
						eprintln!("{}: {}: {}", p, n, e.strerror());
 | 
				
			||||||
 | 
						ExitCode::from(EX_UNAVAILABLE as u8)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn main() -> ExitCode {
 | 
				
			||||||
 | 
						let argv = args().collect::<Vec<String>>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if argv.len() < 3 {
 | 
				
			||||||
 | 
							eprintln!("Usage: {} directory command [argument]", argv[0]);
 | 
				
			||||||
 | 
							return ExitCode::from(EX_USAGE as u8);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						let cmdargs = argv.iter().clone().skip(3).collect::<Vec<&String>>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						match Command::new(argv[2].clone())
 | 
				
			||||||
 | 
								.current_dir(argv[1].clone())
 | 
				
			||||||
 | 
								.args(cmdargs)
 | 
				
			||||||
 | 
								.spawn() {
 | 
				
			||||||
 | 
							Ok(mut child) => match child.wait() {
 | 
				
			||||||
 | 
								Ok(status) => {
 | 
				
			||||||
 | 
									match status.code() {
 | 
				
			||||||
 | 
										Some(code) => ExitCode::from(code as u8),
 | 
				
			||||||
 | 
										None => {
 | 
				
			||||||
 | 
											eprintln!("{}: {}: process terminated by signal",
 | 
				
			||||||
 | 
												argv[0], argv[2]);
 | 
				
			||||||
 | 
											ExitCode::FAILURE
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								Err(e) => error(&argv[0], &argv[2], e)
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							Err(e) => error(&argv[0], &argv[2], e)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user