summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--run_and_record/c++/main.cpp46
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();
}