summaryrefslogtreecommitdiff
path: root/src/dmesg.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/dmesg.c')
-rwxr-xr-xsrc/dmesg.c117
1 files changed, 117 insertions, 0 deletions
diff --git a/src/dmesg.c b/src/dmesg.c
new file mode 100755
index 0000000..af6fbbd
--- /dev/null
+++ b/src/dmesg.c
@@ -0,0 +1,117 @@
+/*
+// AUTHOR
+// N. Nielsen
+//
+// LICENSE
+// This software is in the public domain.
+//
+// The software is provided "as is", without warranty of any kind,
+// express or implied, including but not limited to the warranties
+// of merchantability, fitness for a particular purpose, and
+// noninfringement. In no event shall the author(s) be liable for any
+// claim, damages, or other liability, whether in an action of
+// contract, tort, or otherwise, arising from, out of, or in connection
+// with the software or the use or other dealings in the software.
+//
+// SUPPORT
+// Send bug reports to: <nielsen@memberwebs.com>
+//
+// CHANGES
+// 1.1
+// Initial implementation
+*/
+
+#define SYSLOG_NAMES
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <signal.h>
+#include <stdio.h>
+#include <syslog.h>
+#include <ctype.h>
+#include <err.h>
+#include <errno.h>
+#include <stdarg.h>
+
+
+#define CONSOLE_DEV "/dev/console"
+
+#ifdef HAVE_CONFIG_H
+#include "../config.h"
+#endif
+
+/* Error handlers */
+static void doWarn(const char* msg, ...);
+static void doQuit(const char* msg, ...);
+
+static int fcopy(FILE* dest, FILE* src);
+
+int main(int argc, char* argv[])
+{
+ FILE* console;
+ struct stat sb;
+
+ /*
+ * Check to see if /dev/console is a real console
+ */
+ if(stat(CONSOLE_DEV, &sb) == 0)
+ {
+ if(!(sb.st_mode & S_IFREG || sb.st_mode & S_IFLNK))
+ {
+ doWarn("%s is not a jail console.", CONSOLE_DEV);
+ return 1;
+ }
+ }
+
+ console = fopen(CONSOLE_DEV, "r");
+ if(!console)
+ {
+ doQuit("couldn't open jail console: %s", strerror(errno));
+ return 1;
+ }
+
+ fcopy(stdout, console);
+ return 0;
+}
+
+void doQuit(const char* msg, ...)
+{
+ va_list ap;
+ va_start(ap, msg);
+
+ vwarnx(msg, ap);
+
+ exit(2);
+
+ va_end(ap);
+}
+
+void doWarn(const char* msg, ...)
+{
+ va_list ap;
+ va_start(ap, msg);
+
+ /* Either to syslog or stderr */
+ vwarnx(msg, ap);
+
+ va_end(ap);
+}
+
+
+static int fcopy(FILE* dest, FILE* src)
+{
+ char buff[32];
+ size_t bytes = 0;
+
+ while(!feof(src) && !ferror(src) && !ferror(dest))
+ {
+ bytes = fread(buff, 1, 32, src);
+ fwrite(buff, 1, bytes, dest);
+ }
+
+ if(ferror(src) || ferror(dest))
+ return -1;
+
+ return 0;
+}
+