diff options
| -rw-r--r-- | include/util/io.h | 8 | ||||
| -rw-r--r-- | src/eval.cc | 4 | ||||
| -rw-r--r-- | src/handler.cc | 43 | ||||
| -rw-r--r-- | src/util/io.cc | 28 |
4 files changed, 52 insertions, 31 deletions
diff --git a/include/util/io.h b/include/util/io.h index 22199f3..e72082f 100644 --- a/include/util/io.h +++ b/include/util/io.h @@ -25,10 +25,10 @@ struct LogVoidify { void operator&(std::ostream&) const {} }; constexpr int DECIMAL = 10; constexpr int LENGTH = 32; -void atomic_print(char *s, bool ignore_wrap = false); -void atomic_print(int x); -void atomic_debug(char *s, bool ignore_wrap = false); -void atomic_debug(int x); +void safe_print(char *s, bool ignore_wrap = false); +void safe_print(int x); +void safe_debug(char *s, bool ignore_wrap = false); +void safe_debug(int x); bool isnum(char *s); void reverse(char str[], int length); char *itoa(int num, char* str, int base); diff --git a/src/eval.cc b/src/eval.cc index 0dbab40..7a72fff 100644 --- a/src/eval.cc +++ b/src/eval.cc @@ -68,8 +68,8 @@ void eval(char *cmdline) execve(cmd_c, argv, environ); - atomic_print(cmdline, true); - atomic_print(": Command not found\n"); + safe_print(cmdline, true); + safe_print(": Command not found\n"); exit(-1); // if no command is found } diff --git a/src/handler.cc b/src/handler.cc index 4fa3e2f..b98d839 100644 --- a/src/handler.cc +++ b/src/handler.cc @@ -1,5 +1,8 @@ #include "handler.h" +#include <termios.h> +#include <sys/ioctl.h> + namespace ov4 { @@ -64,45 +67,45 @@ void sigchld_handler(int sig) block_handler(&prev); int status, pid; - atomic_debug("SIGCHLD\n"); + safe_debug("SIGCHLD\n"); while ((pid = waitpid(-1, &status, WNOHANG | WUNTRACED)) > 0) { if (WIFSIGNALED(status) || WIFSTOPPED(status)) { int jid = pid2jid(pid); - atomic_print("Job ["); - atomic_print(jid); - atomic_print("] ("); - atomic_print(pid); - atomic_print(") "); + safe_print("Job ["); + safe_print(jid); + safe_print("] ("); + safe_print(pid); + safe_print(") "); if (!WIFSTOPPED(status) && WTERMSIG(status) == SIGINT) - atomic_print("terminated"); + safe_print("terminated"); else if (WIFSTOPPED(status)) - atomic_print("stopped"); + safe_print("stopped"); else - atomic_print("idk"); - atomic_print(" by signal "); + safe_print("idk"); + safe_print(" by signal "); if (WIFSTOPPED(status)) - atomic_print(WSTOPSIG(status)); + safe_print(WSTOPSIG(status)); else - atomic_print(WTERMSIG(status)); - atomic_print("\n"); + safe_print(WTERMSIG(status)); + safe_print("\n"); } if (WIFSTOPPED(status)) { - atomic_debug("suspended pid: "); - atomic_debug(pid); - atomic_debug("\n"); + safe_debug("suspended pid: "); + safe_debug(pid); + safe_debug("\n"); sigset_t prev_inner; block_all(&prev_inner); job_suspend(jobs, pid); sigprocmask(SIG_SETMASK, &prev_inner, nullptr); } else { - atomic_debug("terminated pid: "); - atomic_debug(pid); + safe_debug("terminated pid: "); + safe_debug(pid); sigset_t prev_inner; block_all(&prev_inner); deletejob(jobs, pid); @@ -132,6 +135,10 @@ void sigint_handler(int sig) if (pid != 0) { kill(-pid, SIGINT); + } else { + char *buf = "\n"; + tcflush(STDIN_FILENO, TCIFLUSH); + ioctl(STDIN_FILENO, TIOCSTI, buf); } sigprocmask(SIG_SETMASK, &prev, nullptr); diff --git a/src/util/io.cc b/src/util/io.cc index 4a094d0..152271c 100644 --- a/src/util/io.cc +++ b/src/util/io.cc @@ -5,8 +5,9 @@ using namespace std; namespace ov4 { -void atomic_print(char *s, bool ignore_wrap) +void safe_print(char *s, bool ignore_wrap) { + int errno_old = errno; if (ignore_wrap) for (int i = 0; s[i] != 0; i++) if (s[i] == '\n') @@ -15,17 +16,21 @@ void atomic_print(char *s, bool ignore_wrap) return; } write(STDOUT_FILENO, s, strlen(s)); + errno = errno_old; } -void atomic_print(int x) +void safe_print(int x) { + int errno_old = errno; char msg[LENGTH]; itoa(x, msg, DECIMAL); - atomic_print(msg); + safe_print(msg); + errno = errno_old; } void reverse(char str[], int length) { + int errno_old = errno; int start = 0; int end = length - 1; while (start < end) { @@ -35,29 +40,37 @@ void reverse(char str[], int length) end--; start++; } + errno = errno_old; } -void atomic_debug(char *s, bool ignore_wrap) +void safe_debug(char *s, bool ignore_wrap) { - if (verbose && GLOBAL_DEBUG) atomic_print(s, ignore_wrap); + int errno_old = errno; + if (verbose && GLOBAL_DEBUG) safe_print(s, ignore_wrap); + errno = errno_old; } -void atomic_debug(int x) +void safe_debug(int x) { - if (verbose && GLOBAL_DEBUG) atomic_print(x); + int errno_old = errno; + if (verbose && GLOBAL_DEBUG) safe_print(x); + errno = errno_old; } bool isnum(char *s) { + int errno_old = errno; for (int i = 0; s[i] != 0; i++) if (!isdigit(s[i])) return false; return true; + errno = errno_old; } char *itoa(int num, char* str, int base) { + int errno_old = errno; int i = 0; bool isNegative = false; @@ -93,6 +106,7 @@ char *itoa(int num, char* str, int base) // Reverse the string reverse(str, i); + errno = errno_old; return str; } |
