ioctl, copy string from user

Lukáš Czerner czerner.lukas at gmail.com
Thu Apr 29 17:52:52 UTC 2010


Hi,

I know that there are plenty of examples in the kernel code, but I
just can not get it working, so maybe I am doing some stupid mistake
I am not aware of. Please give me a hint if you can.

What I want to do is simply call the ioctl from the userspace with
(char *) argument. Then, in kernel ioctl handling function copy the
string argument into the kernel space. I have tried it various ways,
everything without any success.

*** Userspace ***
char name[MAXLEN];

strncpy(name, argv[1], MAXLEN);
fprintf(stdout,"Name: %s\n",name);

if (ioctl(fd, MYIOCTL, name)) {
	...


*** Kernel ***
case MYIOCTL: {
	char buffer[MAXLEN]; /* Yes I can allocate it dynamically,
				byt just for simplicity */
	
	retval = copyinstr(ap->a_data, buffer, MAXLEN - 1, NULL);
	uprintf("In kerne - name : %s\n", buffer)
	...

The output is still the same at userspace app it prints out the name
properly (obviously), but in kernel space it just prints out
nothing. So I want to ask what is the proper way to do this ??

And the second question. I have commented that I can allocate buffer
dynamically, but I suppose that there will be some locks involved so
I think I can not just use M_WAITOK, am I right ?

Thanks!
-Lukas.


More information about the freebsd-hackers mailing list