preferable way to control kernel module

Dirk GOUDERS gouders at et.bocholt.fh-ge.de
Thu Aug 11 18:12:10 GMT 2005


 > >>Shouldn't that be no problem if he sets the offset parameter to
 > >>SYSCALL_MODULE to NO_SYSCALL (get the next free offset)?
 > > 
 > > 
 > > But then you have to communicate the syscall number out to your userland 
 > > applications somehow, and the applications have to know how to invoke a 
 > > syscall by hand (perhaps they could use the syscall() function, but still)
 > .
 > > 
 > It is not a big problem. Look at the following piece of code:
 > 
 > 
 > /* Kernel module portion of code. */
 > static int my_syscall = NO_SYSCALL;
 > static struct sysent my_sysent = {
 > 	2,				/* sy_arg */
 > 	(sy_call_t *)&my_func		/* sy_call */
 > };
 > SYSCALL_MODULE(my_syscall_name, &my_syscall, &my_sysent,
 > 	       NULL, NULL);
 > 
 > 
 > /* User-land portion of code. */
 > int get_syscall(const char *syscall_name)
 > {
 > 	struct module_stat	stat;
 > 	int			mod_id;
 > 	int			syscall_num;
 > 
 > 	if ((mod_id = modfind(syscall_name)) < 0)
 > 		return (-1);
 > 
 > 	stat.version = sizeof(stat);
 > 	if (modstat(mod_id, &stat) < 0)
 > 		return (-1);
 > 
 > 	return (stat.data.intval);
 > }
 > 
 > ...
 > 
 > syscall_num = get_syscall("my_syscall_name");
 > 
 > /* Issue a syscall with necessary parameters. */
 > syscall(syscall_num, ...);

That is roughly what I accidently played with, today.
Don't know about the probability that there may be no free offset,
though.

Dirk


More information about the freebsd-hackers mailing list