diff options
-rw-r--r-- | run_and_record/c++/main.cpp | 46 |
1 files changed, 41 insertions, 5 deletions
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<void> run_program(const std::array<char*, 32u>& prog_and_params){ +saw::error_or<void> run_program(int argc, char** argv){ pid_t pid = fork(); if(pid < 0){ @@ -24,7 +34,7 @@ saw::error_or<void> run_program(const std::array<char*, 32u>& prog_and_params){ } if(pid == 0){ - execvp(prog_and_params[0], prog_and_params.data()); + execvp(argv[0], argv); return saw::make_error<saw::err::critical>("ExecVP failed."); } @@ -37,9 +47,12 @@ saw::error_or<void> run_program(const std::array<char*, 32u>& prog_and_params){ return saw::make_void(); } +/** + * I want to wrap this since I want to transport error messages down + */ saw::error_or<void> kel_main(int argc, char** argv){ - if(argc < 2){ - return saw::make_error<saw::err::critical>("Path to recorded program required."); + if(argc < 3){ + return saw::make_error<saw::err::critical>("At least 3 arguments required (RunAndRecord,--,Path to program to run)."); } /// Try to find separator @@ -57,8 +70,31 @@ saw::error_or<void> kel_main(int argc, char** argv){ if(not separator_found){ return saw::make_error<saw::err::not_found>("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<sch::RarArgs> args; + { + saw::data<sch::RarArgs, saw::encode::Args> enc_args{sep_pos,argv}; + saw::codec<sch::RarArgs, saw::encode::Args> 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(); } |