The ioctl_*() and bb_xioctl*() functions declare the second argument as "int request" rather than "unsigned long int request" which break the ioctl() calls on 64-bit systems.
This bug presented itself in the form of login failing during the termios TCSETS call on my ppc64 board: getty: /dev/ttyS0: TCSETS: Invalid argument I verified that changing the "request" argument to "unsigned long int" fixes the problem. It should leave 32-bit systems unaffected. I also reported this issue on the bug tracker and included patches: http://busybox.net/bugs/view.php?id=2884 --- Note: This patch is against the unstable trunk. See bug report for patch against stable branch. Index: libbb/xfuncs_printf.c =================================================================== --- libbb/xfuncs_printf.c (revision 21697) +++ libbb/xfuncs_printf.c (working copy) @@ -451,7 +451,7 @@ #endif } -int ioctl_or_perror_and_die(int fd, int request, void *argp, const char *fmt,...) +int ioctl_or_perror_and_die(int fd, unsigned long int request, void *argp, const char *fmt,...) { int ret; va_list p; @@ -467,7 +467,7 @@ return ret; } -int ioctl_or_perror(int fd, int request, void *argp, const char *fmt,...) +int ioctl_or_perror(int fd, unsigned long int request, void *argp, const char *fmt,...) { va_list p; int ret = ioctl(fd, request, argp); @@ -481,7 +481,7 @@ } #if ENABLE_IOCTL_HEX2STR_ERROR -int bb_ioctl_or_warn(int fd, int request, void *argp, const char *ioctl_name) +int bb_ioctl_or_warn(int fd, unsigned long int request, void *argp, const char *ioctl_name) { int ret; @@ -490,7 +490,7 @@ bb_simple_perror_msg(ioctl_name); return ret; } -int bb_xioctl(int fd, int request, void *argp, const char *ioctl_name) +int bb_xioctl(int fd, unsigned long int request, void *argp, const char *ioctl_name) { int ret; @@ -500,7 +500,7 @@ return ret; } #else -int bb_ioctl_or_warn(int fd, int request, void *argp) +int bb_ioctl_or_warn(int fd, unsigned long int request, void *argp) { int ret; @@ -509,7 +509,7 @@ bb_perror_msg("ioctl %#x failed", request); return ret; } -int bb_xioctl(int fd, int request, void *argp) +int bb_xioctl(int fd, unsigned long int request, void *argp) { int ret; Index: include/libbb.h =================================================================== --- include/libbb.h (revision 21697) +++ include/libbb.h (working copy) @@ -1016,16 +1016,16 @@ /* NB: typically you want to pass fd 0, not 1. Think 'applet | grep something' */ int get_terminal_width_height(int fd, int *width, int *height); -int ioctl_or_perror(int fd, int request, void *argp, const char *fmt,...) __attribute__ ((format (printf, 4, 5))); -int ioctl_or_perror_and_die(int fd, int request, void *argp, const char *fmt,...) __attribute__ ((format (printf, 4, 5))); +int ioctl_or_perror(int fd, unsigned long int request, void *argp, const char *fmt,...) __attribute__ ((format (printf, 4, 5))); +int ioctl_or_perror_and_die(int fd, unsigned long int request, void *argp, const char *fmt,...) __attribute__ ((format (printf, 4, 5))); #if ENABLE_IOCTL_HEX2STR_ERROR -int bb_ioctl_or_warn(int fd, int request, void *argp, const char *ioctl_name); -int bb_xioctl(int fd, int request, void *argp, const char *ioctl_name); +int bb_ioctl_or_warn(int fd, unsigned long int request, void *argp, const char *ioctl_name); +int bb_xioctl(int fd, unsigned long int request, void *argp, const char *ioctl_name); #define ioctl_or_warn(fd,request,argp) bb_ioctl_or_warn(fd,request,argp,#request) #define xioctl(fd,request,argp) bb_xioctl(fd,request,argp,#request) #else -int bb_ioctl_or_warn(int fd, int request, void *argp); -int bb_xioctl(int fd, int request, void *argp); +int bb_ioctl_or_warn(int fd, unsigned long int request, void *argp); +int bb_xioctl(int fd, unsigned long int request, void *argp); #define ioctl_or_warn(fd,request,argp) bb_ioctl_or_warn(fd,request,argp) #define xioctl(fd,request,argp) bb_xioctl(fd,request,argp) #endif _______________________________________________ busybox mailing list busybox@busybox.net http://busybox.net/cgi-bin/mailman/listinfo/busybox