initial commit
This commit is contained in:
commit
6501c349ea
16
.gitignore
vendored
Normal file
16
.gitignore
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# build results
|
||||||
|
bin/
|
||||||
|
obj/
|
||||||
|
*.log
|
||||||
|
*.tmp
|
||||||
|
|
||||||
|
# IDE files
|
||||||
|
.vs/
|
||||||
|
.vshistory/
|
||||||
|
.editorconfig
|
||||||
|
*.user
|
||||||
|
*.vcxproj.filters
|
||||||
|
|
||||||
|
# other files
|
||||||
|
.old*/
|
||||||
|
current.config
|
||||||
6
.gitmodules
vendored
Normal file
6
.gitmodules
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
[submodule "kerep"]
|
||||||
|
path = kerep
|
||||||
|
url = https://github.com/Timerix22/kerep.git
|
||||||
|
[submodule "cbuild"]
|
||||||
|
path = cbuild
|
||||||
|
url = https://github.com/Timerix22/cbuild.git
|
||||||
1
.vscode/.gitignore
vendored
Normal file
1
.vscode/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
settings.json
|
||||||
75
Makefile
Normal file
75
Makefile
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
######################################
|
||||||
|
###### Build tasks #######
|
||||||
|
######################################
|
||||||
|
|
||||||
|
all: build_exec_dbg
|
||||||
|
|
||||||
|
# creates executable using profiling info generated by profile
|
||||||
|
build_exec: profile
|
||||||
|
@cbuild/call_task.sh build_exec 2>&1 | tee -a make_raw.log
|
||||||
|
|
||||||
|
# creates executable with debug info and no optimizations
|
||||||
|
build_exec_dbg:
|
||||||
|
@cbuild/call_task.sh build_exec_dbg 2>&1 | tee make_raw.log
|
||||||
|
|
||||||
|
# recompile libsome_dep.a in the next build task
|
||||||
|
#rebuild_some_dep:
|
||||||
|
# @cbuild/rebuild_dep.sh libsome_dep.a 2>&1 | tee make_raw.log
|
||||||
|
|
||||||
|
#rebuild_all: rebuild_some_dep
|
||||||
|
|
||||||
|
######################################
|
||||||
|
###### Launch tasks #######
|
||||||
|
######################################
|
||||||
|
|
||||||
|
# executes $EXEC_FILE
|
||||||
|
exec: build_exec
|
||||||
|
@cbuild/call_task.sh exec 2>&1 | tee -a make_raw.log
|
||||||
|
|
||||||
|
# executes $EXEC_FILE
|
||||||
|
exec_dbg: build_exec_dbg
|
||||||
|
@cbuild/call_task.sh exec 2>&1 | tee -a make_raw.log
|
||||||
|
|
||||||
|
# executes $EXEC_FILE with valgrind memory checker
|
||||||
|
valgrind: build_exec_dbg
|
||||||
|
@cbuild/call_task.sh valgrind 2>&1 | tee -a make_raw.log
|
||||||
|
|
||||||
|
# generates profiling info
|
||||||
|
profile:
|
||||||
|
@cbuild/call_task.sh profile 2>&1 | tee make_raw.log
|
||||||
|
|
||||||
|
# compiles program with -pg and runs it with gprof
|
||||||
|
# uses gprof2dot python script to generate function call tree (pip install gprof2dot)
|
||||||
|
# requires graphviz (https://www.graphviz.org/download/source/)
|
||||||
|
gprof:
|
||||||
|
@cbuild/call_task.sh gprof 2>&1 | tee make_raw.log
|
||||||
|
|
||||||
|
# compiles program and runs it with callgrind (part of valgrind)
|
||||||
|
# uses gprof2dot python script to generate function call tree (pip install gprof2dot)
|
||||||
|
# requires graphviz (https://www.graphviz.org/download/source/)
|
||||||
|
# P.S. detailed results can be viewed in KCacheGrind
|
||||||
|
callgrind:
|
||||||
|
@cbuild/call_task.sh callgrind 2>&1 | tee make_raw.log
|
||||||
|
|
||||||
|
# compiles executable with sanitizers and executes it to find errors and warnings
|
||||||
|
sanitize:
|
||||||
|
@cbuild/call_task.sh sanitize 2>&1 | tee make_raw.log
|
||||||
|
|
||||||
|
######################################
|
||||||
|
###### Other tasks #######
|
||||||
|
######################################
|
||||||
|
|
||||||
|
# deletes generated files
|
||||||
|
clean:
|
||||||
|
@cbuild/call_task.sh clean 2>&1 | tee make_raw.log
|
||||||
|
|
||||||
|
# removes all unreadable characters copied from stdio
|
||||||
|
fix_log:
|
||||||
|
sed 's/[^[:blank:][:print:]]//g' make_raw.log \
|
||||||
|
| sed 's/\[0;[0-9][0-9]m//g' \
|
||||||
|
| sed 's/\[0;[0-9]m//g' \
|
||||||
|
| sed 's/\[[0-9][0-9]m//g' \
|
||||||
|
| sed 's/\[[0-9]m//g' \
|
||||||
|
| sed 's/ H //g' \
|
||||||
|
| sed 's/\[3gH //g' \
|
||||||
|
> make_fixed.log
|
||||||
5
TODO.md
Normal file
5
TODO.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# TODO:
|
||||||
|
- listen to tcp/udp://:port
|
||||||
|
- connect to tcp/udp://ip:port
|
||||||
|
- generate temp password from key every 10 minutes: rng(seed: time()/(10\*60\*CLOCKS_PER_SECOND), salt: hash(key))
|
||||||
|
- encrypt/decrypt
|
||||||
1
cbuild
Submodule
1
cbuild
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit c20e1e8f1c3e92e7f980a74942352b0a3744edcd
|
||||||
153
default.config
Normal file
153
default.config
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
CBUILD_VERSION=7
|
||||||
|
CONFIG_VERSION=1
|
||||||
|
|
||||||
|
PROJECT="port-tunnel"
|
||||||
|
CMP_C="gcc"
|
||||||
|
CMP_CPP="gcc"
|
||||||
|
STD_C="c11"
|
||||||
|
STD_CPP="c++11"
|
||||||
|
WARN_C="-Wall -Wno-discarded-qualifiers -Wextra -Wno-unused-parameter"
|
||||||
|
WARN_CPP="-Wall -Wextra -Wno-unused-parameter"
|
||||||
|
SRC_C="$( find src -name '*.c')"
|
||||||
|
SRC_CPP="$( find src -name '*.cpp')"
|
||||||
|
#TESTS_C="$( find tests -name '*.c')"
|
||||||
|
#TESTS_CPP="$(find tests -name '*.cpp')"
|
||||||
|
|
||||||
|
# dir with dependeicy dirs
|
||||||
|
DEPS_BASEDIR="."
|
||||||
|
# EXAMPLE: "dependency_dir='build_task out_dir lib_file'
|
||||||
|
# other_depndency_dir=..."
|
||||||
|
# Dependencies must be declared on separate lines
|
||||||
|
# Values can be override by resetting one of dependencies:
|
||||||
|
# DEPS="$DEPS
|
||||||
|
# dependency_dir='...'"
|
||||||
|
DEPS="kerep='build_static_lib bin libkerep.a'"
|
||||||
|
|
||||||
|
# OBJDIR structure:
|
||||||
|
# ├── objects/ - dir where compiled *.o files are stored. cleans every call of build task
|
||||||
|
# ├── profile/ - dir where gcc *.gcda profiling info files stored
|
||||||
|
# └── libs/ - there you can put static libs and linker will find them
|
||||||
|
OBJDIR="obj"
|
||||||
|
OUTDIR="bin"
|
||||||
|
STATIC_LIB_FILE="lib$PROJECT.a"
|
||||||
|
|
||||||
|
# OS-specific options
|
||||||
|
case "$OS" in
|
||||||
|
WINDOWS)
|
||||||
|
EXEC_FILE="$PROJECT.exe"
|
||||||
|
SHARED_LIB_FILE="$PROJECT.dll"
|
||||||
|
LINKER_LIBS="-lpthread -lws2_32"
|
||||||
|
;;
|
||||||
|
LINUX)
|
||||||
|
EXEC_FILE="$PROJECT"
|
||||||
|
SHARED_LIB_FILE="$PROJECT.so"
|
||||||
|
LINKER_LIBS=""
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
error "operating system $OS has no configuration variants"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# TASKS
|
||||||
|
case "$TASK" in
|
||||||
|
# creates executable using profiling info if it exists
|
||||||
|
build_exec)
|
||||||
|
# -flto applies more optimizations across object files
|
||||||
|
# -flto=auto is needed to multithreaded copilation
|
||||||
|
# -fuse-linker-plugin is required to use static libs with lto
|
||||||
|
# -fprofile-use enables compiler to use profiling info files to optimize executable
|
||||||
|
# -fprofile-prefix-path sets path where profiling info about objects are be saved
|
||||||
|
# -fdata-sections -ffunction-sections -Wl,--gc-sections removes unused code
|
||||||
|
C_ARGS="-O2 -flto=auto -fuse-linker-plugin -fprofile-use -fprofile-prefix-path=$(realpath $OBJDIR)/objects -fdata-sections -ffunction-sections -Wl,--gc-sections"
|
||||||
|
CPP_ARGS="$C_ARGS"
|
||||||
|
LINKER_ARGS="$CPP_ARGS $LINKER_LIBS"
|
||||||
|
PRE_TASK_SCRIPT=
|
||||||
|
TASK_SCRIPT=cbuild/default_tasks/build_exec.sh
|
||||||
|
POST_TASK_SCRIPT=
|
||||||
|
;;
|
||||||
|
# creates executable with debug info and no optimizations
|
||||||
|
build_exec_dbg)
|
||||||
|
C_ARGS="-O0 -g3"
|
||||||
|
CPP_ARGS="$C_ARGS"
|
||||||
|
LINKER_ARGS="$CPP_ARGS $LINKER_LIBS"
|
||||||
|
PRE_TASK_SCRIPT=
|
||||||
|
TASK_SCRIPT=cbuild/default_tasks/build_exec.sh
|
||||||
|
POST_TASK_SCRIPT=
|
||||||
|
DEPS="$DEPS
|
||||||
|
kerep='build_static_lib_dbg bin libkerep.a'"
|
||||||
|
;;
|
||||||
|
# executes $EXEC_FILE
|
||||||
|
exec)
|
||||||
|
TASK_SCRIPT=cbuild/default_tasks/exec.sh
|
||||||
|
;;
|
||||||
|
# executes $EXEC_FILE with valgrind memory checker
|
||||||
|
valgrind)
|
||||||
|
VALGRIND_ARGS="-s --read-var-info=yes --track-origins=yes --fullpath-after=$PROJECT/ --leak-check=full --show-leak-kinds=all"
|
||||||
|
TASK_SCRIPT=cbuild/default_tasks/valgrind.sh
|
||||||
|
;;
|
||||||
|
# generates profiling info
|
||||||
|
profile)
|
||||||
|
OUTDIR="$OUTDIR/profile"
|
||||||
|
# -flto applies more optimizations across object files
|
||||||
|
# -flto=auto is needed to multithreaded copilation
|
||||||
|
# -fuse-linker-plugin is required to use static libs with lto
|
||||||
|
# -pg adds code to executable, that generates file containing function call info (gmon.out)
|
||||||
|
# -fprofile-generate generates executable with profiling code
|
||||||
|
# -fprofile-prefix-path sets path where profiling info about objects will be saved
|
||||||
|
C_ARGS="-O2 -flto=auto -fuse-linker-plugin -fprofile-generate -fprofile-prefix-path=$(realpath $OBJDIR)/objects"
|
||||||
|
CPP_ARGS="$C_ARGS"
|
||||||
|
LINKER_ARGS="$CPP_ARGS $LINKER_LIBS"
|
||||||
|
PRE_TASK_SCRIPT=cbuild/default_tasks/build_exec.sh
|
||||||
|
TASK_SCRIPT=cbuild/default_tasks/profile.sh
|
||||||
|
POST_TASK_SCRIPT=
|
||||||
|
;;
|
||||||
|
# compiles program with -pg and runs it with gprof
|
||||||
|
# uses gprof2dot python script to generate function call tree (pip install gprof2dot)
|
||||||
|
# requires graphviz (https://www.graphviz.org/download/source/)
|
||||||
|
gprof)
|
||||||
|
OUTDIR="$OUTDIR/gprof"
|
||||||
|
# -pg adds code to executable, that generates file containing function call info (gmon.out)
|
||||||
|
C_ARGS="-O2 -flto=auto -fuse-linker-plugin -pg"
|
||||||
|
CPP_ARGS="$C_ARGS"
|
||||||
|
LINKER_ARGS="$CPP_ARGS $LINKER_LIBS"
|
||||||
|
PRE_TASK_SCRIPT=cbuild/default_tasks/build_exec.sh
|
||||||
|
TASK_SCRIPT=cbuild/default_tasks/gprof.sh
|
||||||
|
POST_TASK_SCRIPT=
|
||||||
|
;;
|
||||||
|
# compiles program and runs it with callgrind (part of valgrind)
|
||||||
|
# uses gprof2dot python script to generate function call tree (pip install gprof2dot)
|
||||||
|
# requires graphviz (https://www.graphviz.org/download/source/)
|
||||||
|
# P.S. detailed results can be viewed in KCacheGrind
|
||||||
|
callgrind)
|
||||||
|
OUTDIR="$OUTDIR/callgrind"
|
||||||
|
# -pg adds code to executable, that generates file containing function call info (gmon.out)
|
||||||
|
C_ARGS="-O2 -flto=auto -fuse-linker-plugin"
|
||||||
|
CPP_ARGS="$C_ARGS"
|
||||||
|
LINKER_ARGS="$CPP_ARGS $LINKER_LIBS"
|
||||||
|
PRE_TASK_SCRIPT=tasks/pre_build.sh
|
||||||
|
TASK_SCRIPT=cbuild/default_tasks/build_exec.sh
|
||||||
|
POST_TASK_SCRIPT=cbuild/default_tasks/callgrind.sh
|
||||||
|
;;
|
||||||
|
# compiles executable with sanitizers and executes it to find errors and warnings
|
||||||
|
sanitize)
|
||||||
|
OUTDIR="$OUTDIR/sanitize"
|
||||||
|
C_ARGS="-O0 -g3 -fsanitize=undefined,address"
|
||||||
|
CPP_ARGS="$C_ARGS"
|
||||||
|
LINKER_ARGS="$CPP_ARGS $LINKER_LIBS"
|
||||||
|
PRE_TASK_SCRIPT=cbuild/default_tasks/build_exec.sh
|
||||||
|
TASK_SCRIPT=cbuild/default_tasks/exec.sh
|
||||||
|
POST_TASK_SCRIPT=
|
||||||
|
;;
|
||||||
|
# deletes generated files
|
||||||
|
clean)
|
||||||
|
TASK_SCRIPT=cbuild/default_tasks/clean.sh
|
||||||
|
;;
|
||||||
|
# nothing to do
|
||||||
|
no_task)
|
||||||
|
;;
|
||||||
|
# unknown task
|
||||||
|
*)
|
||||||
|
error "task <$TASK> not found"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
1
kerep
Submodule
1
kerep
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 7ba15b208f105b0a6c2a9dfdb522c149e2d36620
|
||||||
55
src/help_message.c
Normal file
55
src/help_message.c
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
#include "../kerep/src/kprint/kprintf.h"
|
||||||
|
|
||||||
|
// option help definition
|
||||||
|
#define HELP_OPT(ALIASES, PARAMS, DESCRIPTION...) \
|
||||||
|
FWHI " " ALIASES " " PARAMS FGRY "\n" DESCRIPTION
|
||||||
|
|
||||||
|
// option parameter help definition
|
||||||
|
#define HELP_PRM(PNAME) \
|
||||||
|
FWHI "[" FCYN PNAME FWHI "]"
|
||||||
|
|
||||||
|
// option nullable parameter help definition
|
||||||
|
#define HELP_PRMN(PNAME) \
|
||||||
|
FWHI "[" FCYN PNAME FWHI "?]"
|
||||||
|
|
||||||
|
// option parameter1/parameter2 help definition
|
||||||
|
#define HELP_PRM2(PNAME1, PNAME2) \
|
||||||
|
FWHI "[" FCYN PNAME1 FWHI "/" FCYN PNAME2 FWHI "]"
|
||||||
|
|
||||||
|
const char* help_message = (
|
||||||
|
FWHI"Usage: port-tunnel "
|
||||||
|
HELP_PRM("program_mode")
|
||||||
|
" " HELP_PRM("other_options...") "\n"
|
||||||
|
|
||||||
|
FWHI" Options syntax: --"FCYN" " HELP_PRM("options") "\n"
|
||||||
|
" " HELP_PRM("val") FGRY" - some value\n"
|
||||||
|
" " HELP_PRMN("val") FGRY" - value or nothing\n"
|
||||||
|
" " HELP_PRM2("variant1", "variant2") FGRY" - variant1 or variant2\n"
|
||||||
|
|
||||||
|
FWHI" Program mode options:\n"
|
||||||
|
|
||||||
|
HELP_OPT("-c, --connect",
|
||||||
|
HELP_PRM2("tcp","udp") "://" HELP_PRMN("ip") ":" HELP_PRM("port"),
|
||||||
|
" Connect to a listening instance of port-tunnel.\n")
|
||||||
|
|
||||||
|
HELP_OPT("-l, --listen",
|
||||||
|
HELP_PRM2("tcp","udp") "://" HELP_PRMN("ip") ":" HELP_PRM("port"),
|
||||||
|
" Listen for incomming packets at the address (if provided) and the port\n")
|
||||||
|
|
||||||
|
FWHI" Other options:\n"
|
||||||
|
|
||||||
|
HELP_OPT("-h, --help, /?", "",
|
||||||
|
" Show this message.\n")
|
||||||
|
|
||||||
|
HELP_OPT("-p, --out-port",
|
||||||
|
HELP_PRM("port"),
|
||||||
|
" Port incoming packets will be sent to.\n")
|
||||||
|
|
||||||
|
HELP_OPT("-d, --decrypt",
|
||||||
|
HELP_PRM("key"),
|
||||||
|
" Decrypt incoming packets with a key.\n")
|
||||||
|
|
||||||
|
HELP_OPT("-e, --encrypt",
|
||||||
|
HELP_PRM("key"),
|
||||||
|
" Encrypt outgoing packets with a key.\n")
|
||||||
|
);
|
||||||
70
src/main.c
Normal file
70
src/main.c
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
#include "../kerep/src/base/base.h"
|
||||||
|
|
||||||
|
extern const char* help_message;
|
||||||
|
|
||||||
|
int errs(char* err_msg){
|
||||||
|
throw(err_msg);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define argIs(STR) cptr_equals(arg, STR)
|
||||||
|
|
||||||
|
#define argNext() argv[++argi < argc ? argi : errs(cptr_concat("option '",arg,"' must have a parameter"))]
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
ProgramMode_None,
|
||||||
|
ProgramMode_Listen,
|
||||||
|
ProgramMode_Connect
|
||||||
|
} ProgramMode;
|
||||||
|
|
||||||
|
int main(int argc, const char* const* argv){
|
||||||
|
kt_beginInit(false);
|
||||||
|
kt_initKerepTypes();
|
||||||
|
// kt_register(...);
|
||||||
|
kt_endInit();
|
||||||
|
|
||||||
|
ProgramMode mode = ProgramMode_None;
|
||||||
|
const char* endpoint_str = "";
|
||||||
|
const char* out_port_str = "";
|
||||||
|
|
||||||
|
if(argc < 2)
|
||||||
|
throw("No arguments provided. Run the program with argument -h to see help message");
|
||||||
|
|
||||||
|
for(int argi = 1; argi < argc; argi++){
|
||||||
|
const char* arg = argv[argi];
|
||||||
|
if(argIs("-h") || argIs("--help") || argIs("/?")){
|
||||||
|
kprintf("%s"FGRY"\n", help_message);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else if(argIs("-c") || argIs("--connect")){
|
||||||
|
if(mode != ProgramMode_None)
|
||||||
|
throw(cptr_concat("invalid option '",arg,"': program mode has been selected already"));
|
||||||
|
|
||||||
|
mode = ProgramMode_Connect;
|
||||||
|
endpoint_str = argNext();
|
||||||
|
}
|
||||||
|
else if(argIs("-l") || argIs("--listen")){
|
||||||
|
if(mode != ProgramMode_None)
|
||||||
|
throw(cptr_concat("invalid option '",arg,"': program mode has been selected already"));
|
||||||
|
|
||||||
|
mode = ProgramMode_Listen;
|
||||||
|
endpoint_str = argNext();
|
||||||
|
}
|
||||||
|
else if(argIs("-p") || argIs("--out-port")){
|
||||||
|
if(out_port_str[0] != 0)
|
||||||
|
throw(cptr_concat("invalid option '",arg,"': out port has been selected already"));
|
||||||
|
if(mode != ProgramMode_Connect)
|
||||||
|
throw(cptr_concat("invalid option '",arg,"': out port setting is avaliable only for 'connect' program mode"));
|
||||||
|
|
||||||
|
out_port_str = argNext();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw(cptr_concat("invalid argument: ", arg));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
kprintf("endpoint_str: %s\n", endpoint_str);
|
||||||
|
kprintf("out_port_str: %s\n", out_port_str);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user