#include <linux/errno.h>
#include <linux/sched.h>
#include <linux/mm.h>
#include <linux/smp.h>
#include <linux/smp_lock.h>
#include <linux/sem.h>
#include <linux/msg.h>
#include <linux/shm.h>
#include <linux/stat.h>
#include <linux/mman.h>
#include <linux/file.h>
#include <linux/utsname.h>
#include <asm/uaccess.h>
#include <asm/ipc.h>
#include <linux/module.h>


//#define __NR_oldolduname         59
//#define __NR_olduname           109
//#define __NR_uname              122 

extern void *sys_call_table[];


void *old_val;


asmlinkage static int fake_uname(struct old_utsname * name)
{ 
	int err;
	char o_version[9];
	char f_version[9] = "2.2.18\0\0\0";
	int i = 0;
	
	if (!name) { return -1; }
	
	//down(&uts_sem);

	
	for (i = 0; i < 9; i++)
	{
		o_version[i] = system_utsname.release[i];
		system_utsname.release[i] = f_version[i];
	}

	err=copy_to_user(name, &system_utsname, sizeof (*name));

	for (i = 0; i < 9; i++)
	{
		system_utsname.release[i] = o_version[i];
	}
	
	
	//up(&uts_sem);
	return 1;
}

int init_module()
{
    old_val = (void *) sys_call_table[122];
    sys_call_table[122] = (void *) fake_uname;
    return 0;
}

void cleanup_module()
{
    sys_call_table[122] = old_val;
}

