From 237a2116fab0c5c5b35a8a66b6321dedb5dd0e4e Mon Sep 17 00:00:00 2001 From: "Claudius \"keldu\" Holeksa" Date: Wed, 1 Oct 2025 17:07:31 +0200 Subject: Minor changes --- run_and_record/c++/main.cpp | 46 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 5 deletions(-) (limited to 'run_and_record') diff --git a/run_and_record/c++/main.cpp b/run_and_record/c++/main.cpp index 28676b7..af92d0e 100644 --- a/run_and_record/c++/main.cpp +++ b/run_and_record/c++/main.cpp @@ -8,7 +8,17 @@ namespace kel { namespace sch { using namespace saw::schema; + +using RarArgsStruct = Struct< +>; +using RarArgsTuple = Tuple< +>; + +using RarArgs = Args< + RarArgsStruct, + RarArgsTuple +>; } @@ -16,7 +26,7 @@ using namespace saw::schema; * Run program by fork + exec * Arguments are the program path + following args */ -saw::error_or run_program(const std::array& prog_and_params){ +saw::error_or run_program(int argc, char** argv){ pid_t pid = fork(); if(pid < 0){ @@ -24,7 +34,7 @@ saw::error_or run_program(const std::array& prog_and_params){ } if(pid == 0){ - execvp(prog_and_params[0], prog_and_params.data()); + execvp(argv[0], argv); return saw::make_error("ExecVP failed."); } @@ -37,9 +47,12 @@ saw::error_or run_program(const std::array& prog_and_params){ return saw::make_void(); } +/** + * I want to wrap this since I want to transport error messages down + */ saw::error_or kel_main(int argc, char** argv){ - if(argc < 2){ - return saw::make_error("Path to recorded program required."); + if(argc < 3){ + return saw::make_error("At least 3 arguments required (RunAndRecord,--,Path to program to run)."); } /// Try to find separator @@ -57,8 +70,31 @@ saw::error_or kel_main(int argc, char** argv){ if(not separator_found){ return saw::make_error("Separator '--' and command following the separator required"); } - // 0 til i-1 + // ./kel_rar -- ./foo + // 0 1 2 + // => sep_pos = 1, argc = 3 + // args til 1 + // Run program with argc - (sep_pos+1) = 1 arg_count => argc_prog = 1 starting at sep_pos+1 + + // 0 til i/sep_pos-1 with count of sep_pos + saw::data args; + { + saw::data enc_args{sep_pos,argv}; + saw::codec args_codec; + auto eov = args_codec.decode(enc_args, args); + if(eov.is_error()){ + return eov; + } + } + // sep_pos+1 til end + int argc_prog = argc - (sep_pos+1); + { + auto eov = run_program(argc_prog,&argv[sep_pos+1]); + if(eov.is_error()){ + return eov; + } + } return saw::make_void(); } -- cgit v1.2.3