ioctl调用失败

qq_31319225 2016-10-11 03:01:56
我的代码;
用户层:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/fs.h>

int fsd_ioctl( char *cpFsd, int cmd, void *data )
{
int iReturn = -1;
int fd;
fd = open( cpFsd, 0 );
if( fd > 0 )
{
iReturn = ioctl( fd, cmd, data );
if( iReturn != 0 )
{
printf("Error: Could not make ioctl call. Error = %i\n",iReturn);
}
close( fd );
}
else
{
printf("Error: Could not open %s.\n",cpFsd);
}
return iReturn;
}

int fsd_bind( char *cpTarget, char * cpFsd )
{
int iReturn = -1;
struct stat stat_target;
struct stat stat_fsd;

if( ( stat( cpTarget, &stat_target ) == 0 ) &&
( stat( cpFsd, &stat_fsd ) == 0 ) )
{
int fd;
fsd_bind_t fsd_bind;

fsd_bind.major = major( stat_target.st_rdev );
fsd_bind.minor = minor( stat_target.st_rdev );

printf(" Binding to: %s [major=%i,minor=%i]\n",cpTarget,fsd_bind.major,fsd_bind.minor);
iReturn = fsd_ioctl( cpFsd, FSD_BIND, &fsd_bind );
}
else
{
printf("Error: Could not stat %s or %s.\n",cpTarget,cpFsd);
}

return iReturn;
}

int main( int argc, char * argv[] )
{
if( argc <= 1 )
{
print_usage();
exit(-1);
}

if( strcmp( argv[1], "--bind" ) == 0 )
{
char cpTarget[1024];
char cpFsd[1024];

if( argc == 4 )
{
strcpy( cpTarget, argv[2] );
strcpy( cpFsd, argv[3] );
return fsd_bind( cpTarget, cpFsd );
}
}
else
{
printf("Error: not enough args. ( argc = %i )\n",argc );
}


print_usage();

return 0;
}

驱动:
static int fsd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
int iReturn = 0;
int minor;
kdev_t dev;

dev = inode->i_rdev;
minor = MINOR(dev);

if( ( minor >= 0 ) && ( minor < fsd_num_disks ) )
{
switch( cmd ){

case FSD_BIND:{
fsd_bind_t bind;
iReturn = -1;
if( copy_from_user(&bind, (fsd_bind_t *) arg, sizeof(fsd_bind_t) ) == 0 )
{
iReturn = fsd_bind( minor, MKDEV(bind.major,bind.minor) );
}
}break;

case FSD_UNBIND:
iReturn = fsd_unbind( minor );
break;

case FSD_SET_FAULT:{
fsd_set_fault fault_ioctl;
iReturn = -1;
if( copy_from_user(&fault_ioctl, (fsd_set_fault *) arg, sizeof(fsd_set_fault) ) == 0 )
{
if( fault_ioctl.mode & FSD_FAULT_READ )
{
memcpy(&fsd_device[minor].read,&fault_ioctl, sizeof(fsd_set_fault));
}

if( fault_ioctl.mode & FSD_FAULT_WRITE )
{
memcpy(&fsd_device[minor].write,&fault_ioctl, sizeof(fsd_set_fault));
}
iReturn = 0;
}
}break;

//
// Block Device IOCTLS, forward them to blk_ioctl common funtion
//
// case BLKBSZGET:
case BLKGETSIZE:{
if(!arg) return -EINVAL;


iReturn = verify_area(VERIFY_WRITE,(long *) arg, sizeof(long) );
if( iReturn == 0 )
{
unsigned uTemp = fsd_device_sizes_kb[minor] << 1;
iReturn = put_user( uTemp, (long *) arg);
}
}break;

case BLKGETSIZE64:{
if(!arg) return -EINVAL;

iReturn = verify_area(VERIFY_WRITE,(u64 *) arg, sizeof(u64) );
if( iReturn == 0 )
{
u64 u64Temp = (u64)fsd_device_sizes_kb[minor] << 10;
iReturn = copy_to_user( (u64 *)arg, &u64Temp, sizeof(u64));
}
}break;


default:
iReturn = blk_ioctl (dev, cmd, arg);
break;

/* default:
printk("WARNING: Unknown Ioctl %i\n",cmd);
break;*/
}
}
else
{
iReturn = -EINVAL;
}

return iReturn;
}


...全文
1061 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-10-11
  • 打赏
  • 举报
回复
man ioctl

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧