[rfc] xioctl()

Tito farmatito at tiscali.it
Sun Jun 24 12:02:13 UTC 2007


On Sunday 24 June 2007 00:11:01 Denis Vlasenko wrote:
> static int bb_ioctl(int fd, int request, void *argp, ...)
> > {
> >       va_list p;
> >       char *string;
> >       va_start(p, request);
> >       string = va_arg(va_list p,  (char *));
> >       
> >       int e = ioctl(fd, request, argp);
> >       if (e && string)
> >               bb_perror_msg(" %s", string);
> 
> Use
>                 bb_vperror_msg((string ? string : "ioctl"), p);
>                 xfunc_die();

Hi,
after doing a little testing it seems to me that the va_list solution
is not doable as there is no way to determine:

string ? string : "ioctl"

this is due to the fact that with  va_arg:
   If  there  is  no  next argument, random errors will occur.

Another easier solution giving at least a hint of what ioctl failed could be:

void xioctl(int fd, int request, void *argp)
{
	if (ioctl(fd, request, argp) < 0)
		bb_perror_msg("ioctl %#x failed", request);
}



in this case with deallocvt.c,

int deallocvt_main(int argc, char **argv)
{
	/* num = 0 deallocate all unused consoles */
	int num = 0;

	switch (argc) {
	case 2:
		num = xatoul_range(argv[1], 1, 63);
		/* Fallthrough */
	case 1:
		break;
	default:
		bb_show_usage();
	}

	xioctl(get_console_fd(), VT_DISALLOCATE, (void *)num);
	return EXIT_SUCCESS;
}

the output is:

deallocvt: ioctl 0X5608 failed: Device or resource busy

Just an idea.

Ciao,
Tito



More information about the busybox mailing list