/*
 * logmsg.c
 * 2002-April-04, version 0.5
 * Copyright (C) 2002 Randy Dunlap <rddunlap@ieee.org>
 *
 * 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 <sys/types.h>
#include <stdio.h>
#include <errno.h>
#include <syscall.h>

#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
