From 8bd6fc0a98539e50d96fe4b499be40c06ca63f5e Mon Sep 17 00:00:00 2001 From: anonymous Date: Fri, 27 Jun 2003 22:56:31 +0000 Subject: Initial revision --- src/dmesg.c | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100755 src/dmesg.c (limited to 'src/dmesg.c') 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: +// +// CHANGES +// 1.1 +// Initial implementation +*/ + +#define SYSLOG_NAMES + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#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; +} + -- cgit v1.2.3