diff --git a/.vscode/launch.json b/.vscode/launch.json index 7a2403b..ccd4bcc 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,6 +4,25 @@ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ + { + "name": "(gdb) Attach", + "type": "cppdbg", + "request": "attach", + "program": "${workspaceFolder}/bin/cterm", + "MIMode": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + }, + { + "description": "Set Disassembly Flavor to Intel", + "text": "-gdb-set disassembly-flavor intel", + "ignoreFailures": true + } + ] + }, { "name": "colorwrap", "type": "cppdbg", diff --git a/Makefile b/Makefile index d8dbeb7..a6a13b0 100644 --- a/Makefile +++ b/Makefile @@ -6,13 +6,14 @@ TARGET := bin/cterm SRCEXT := c SOURCES := $(shell find $(SRCDIR) -type f -name *.$(SRCEXT)) OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:.$(SRCEXT)=.o)) -CFLAGS := -Wall -LIB := -L lib +CFLAGS := -Wall -lreadline +LIB := -L lib -lreadline INC := -I include $(TARGET): $(OBJECTS) @echo " Linking..." @echo " $(CC) $^ -o $(TARGET) $(LIB)"; $(CC) $^ -o $(TARGET) $(LIB) -O3 + @echo " Done!" $(BUILDDIR)/%.o: $(SRCDIR)/%.$(SRCEXT) @echo " Building..." @@ -28,5 +29,7 @@ test: trace: strace -o $(TESTDIR)/trace.lp $(TARGET) /bin/sh +tracef: + strace -fo $(TESTDIR)/trace.lp $(TARGET) /bin/sh .PHONY: clean diff --git a/README.md b/README.md index d50cb37..c027c6f 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,9 @@ Project image/gif Requirements +RHEL-like: +`sudo dnf install readline-devel` + ## Installation `make` @@ -16,6 +19,13 @@ Requirements `bin/run` +## Considerations and Caveats + +Since this program buffers input by line, It will not handle TUI-based commands + Examples include less and vim + +If you need to use these kinds of applications, do not use this program to wrap your shell. + ## Example `bin/run` diff --git a/src/main.c b/src/main.c index 1e27e83..4da8234 100644 --- a/src/main.c +++ b/src/main.c @@ -6,8 +6,10 @@ #include #include #include -#include #include +#include +#include +#include #define BUFCHUNKSIZE 4096 #define BUFSAFEPAD 8 @@ -25,6 +27,25 @@ void child_process(char *argv[]){ } +size_t getuserinput(char* input_buffer, size_t max_buffer_size, int fd) { + int in_char; + size_t total_read_length; + ssize_t read_result; + //read_result = read(fd, &in_char, 1); + while (1) { + printf("reading char\n"); + in_char = fgetc(stdin); + printf("read char\n"); + } + //if (inchar < 0){ + // //error condition + // exit(1); + //} + return 1; +} + + + int main(int argc, char *argv[]) { int master; pid_t child_pid; @@ -58,22 +79,24 @@ int main(int argc, char *argv[]) { // ideally I would want to read from the pipe and buffer the output, rewriting the line on change // whenever it sees a newline, it should send it to the processor and print to stdout, with that newline // + memset(childoutbuffer, 0, BUFCHUNKSIZE); while(1){ ssize_t count = read(master, childoutbuffer, BUFCHUNKSIZE); if (count == -1){ if(errno == EAGAIN){ break; - } else exit(1); + } else exit(0); } else if (count == 0 ){ exit(0); } write(STDOUT_FILENO, childoutbuffer, count); } memset(childoutbuffer, 0, BUFCHUNKSIZE); - fgets(childoutbuffer, BUFCHUNKSIZE, stdin); + strncpy(childoutbuffer, readline("~>"), BUFCHUNKSIZE-1); //printf("%s\n", childoutbuffer); write(master, childoutbuffer, strlen(childoutbuffer)); + write(master, "\n", 1); //memset(childoutbuffer, 0, BUFCHUNKSIZE); //ssize_t count = strlen(childoutbuffer);