/* // 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; }