/* * logmsg.c * 2002-April-04, version 0.5 * Copyright (C) 2002 Randy Dunlap * * This is an example of adding a new system call to Linux: * Uses sys_log_message to write messages to the system message log * from a privileged userspace program. * * Requires the following Linux kernel changes (for Linux 2.4.18, x86): * 1. add the syscall number to linux/include/asm-i386/unistd.h * 2. add the syscall function to linux/arch/i386/kernel/entry.S * at the appropriate syscall number position. * 3. add the syscall function implementation to a current or new * kernel source file */ #include #include #include #include #ifndef __NR_log_message #define __NR_log_message 238 #endif _syscall2 (int, log_message, char *, msg, int, len); void usage (void) { fprintf (stderr, "usage: logmsg {1..9 parameters to log}\n\n"); exit (1); } int do_sys_log_message (char *fmt, char *s1, char *s2, char *s3, char *s4, char *s5, char *s6, char *s7, char *s8, char *s9) { int retval, len; char msg[256]; len = snprintf(msg, sizeof(msg), fmt, s1, s2, s3, s4, s5, s6, s7, s8, s9); retval = log_message (msg, len); printf ("logmsg: syscall retval = %d\n", retval); if (retval < 0) perror ("log_message"); return retval; } int main (int argc, char *argv[]) { if (argc <= 1 || argc > 9) usage(); do_sys_log_message ("logmsg: %s %s %s %s %s %s %s %s %s\n", argc > 1 ? argv[1] : "", argc > 2 ? argv[2] : "", argc > 3 ? argv[3] : "", argc > 4 ? argv[4] : "", argc > 5 ? argv[5] : "", argc > 6 ? argv[6] : "", argc > 7 ? argv[7] : "", argc > 8 ? argv[8] : "", argc > 9 ? argv[9] : ""); exit (0); } // end main // end logmsg.c