aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/util/io.h8
-rw-r--r--src/eval.cc4
-rw-r--r--src/handler.cc43
-rw-r--r--src/util/io.cc28
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;
}