向usb cdrom发送SCSI 命令

1.
#include <stdio.h>
#include <scsi/sg.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
/*****************/
struct  sg_io_hdr * init_io_hdr() 
{
  struct sg_io_hdr * p_scsi_hdr = (struct sg_io_hdr *)malloc(sizeof(struct sg_io_hdr));

  memset(p_scsi_hdr, 0, sizeof(struct sg_io_hdr));
  if (p_scsi_hdr) {
   p_scsi_hdr->interface_id = 'S'; /* this is the only choice we have! */
    /* this would put the LUN to 2nd byte of cdb*/
    p_scsi_hdr->flags = SG_FLAG_LUN_INHIBIT; 
  }
  return p_scsi_hdr;
}
/******************/
void destroy_io_hdr(struct sg_io_hdr * p_hdr) 
{
    if (p_hdr) {
        free(p_hdr);
    }
}
/********************/
void set_xfer_data(struct sg_io_hdr * p_hdr, void * data, unsigned int length) 
{
    if (p_hdr) {
        p_hdr->dxferp = data;
        p_hdr->dxfer_len = length;
    }
}
/********************/
void set_sense_data(struct sg_io_hdr * p_hdr, unsigned char * data,
        unsigned int length) {
    if (p_hdr) {
        p_hdr->sbp = data;
        p_hdr->mx_sb_len = length;
    }
}
/*********************/
int execute_switch(int fd, int mode, struct sg_io_hdr * p_hdr) 
{
    unsigned char cdb[6];
    /* set the cdb format */
    cdb[0] = 0xee; 
    cdb[1] = 0;
    cdb[2] = mode & 0xff;
    cdb[3] = 0;
    cdb[4] = 0;
    cdb[5] = 0;
    
    p_hdr->dxfer_direction = SG_DXFER_NONE;
    p_hdr->cmdp = cdb;
    p_hdr->cmd_len = 6;

    int ret = ioctl(fd, SG_IO, p_hdr);
    if (ret<0) {
        printf("Sending SCSI Command failed.\n");
    }
    return p_hdr->status;
}

/************************main***********************/
int main(int argc,char **argv)
{
	int fd = -1;
	int mode = 0;
	struct sg_io_hdr * p_hdr;
	int i;
	int state =0;

	for(i=0;i<argc;i++){
		printf("argv[%d]:%s\n",i,argv[i]);
	}
	if(argc != 3){
		printf("para error!\n");
		return -1;
	}
	fd = open(argv[1],O_RDWR);
	if(fd <= 0){
		perror("open file error!\n");
		return -1;
	}
	p_hdr = init_io_hdr();
	if(p_hdr == NULL){
		printf("init hdr error!\n");
                return -1;

	}
	mode = atoi(argv[2]);
	printf("mode=%d\n",mode);
	state = execute_switch(fd, mode, p_hdr);
	printf("state:%d\n",state);
	
	destroy_io_hdr(p_hdr);
	close(fd);
	return 0;	
}
2. 使用sg3_utils 工具包


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值