亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sr_ioctl.c

?? LINUX1.0源代碼,代碼條理清晰
?? C
字號:
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/fs.h>
#include <asm/segment.h>
#include <linux/errno.h>

#include "../block/blk.h"
#include "scsi.h"
#include "hosts.h"
#include "sr.h"
#include "scsi_ioctl.h"

#include <linux/cdrom.h>

#define IOCTL_RETRIES 3
/* The CDROM is fairly slow, so we need a little extra time */
#define IOCTL_TIMEOUT 200

extern int scsi_ioctl (Scsi_Device *dev, int cmd, void *arg);

static void sr_ioctl_done(Scsi_Cmnd * SCpnt)
{
  struct request * req;
  struct task_struct * p;
  
  req = &SCpnt->request;
  req->dev = 0xfffe; /* Busy, but indicate request done */
  
  if ((p = req->waiting) != NULL) {
    req->waiting = NULL;
    p->state = TASK_RUNNING;
    if (p->counter > current->counter)
      need_resched = 1;
  }
}

/* We do our own retries because we want to know what the specific
   error code is.  Normally the UNIT_ATTENTION code will automatically
   clear after one error */

static int do_ioctl(int target, unsigned char * sr_cmd, void * buffer, unsigned buflength)
{
	Scsi_Cmnd * SCpnt;
	int result;

	SCpnt = allocate_device(NULL, scsi_CDs[target].device->index, 1);
	scsi_do_cmd(SCpnt,
		    (void *) sr_cmd, buffer, buflength, sr_ioctl_done, 
		    IOCTL_TIMEOUT, IOCTL_RETRIES);


	if (SCpnt->request.dev != 0xfffe){
	  SCpnt->request.waiting = current;
	  current->state = TASK_UNINTERRUPTIBLE;
	  while (SCpnt->request.dev != 0xfffe) schedule();
	};

	result = SCpnt->result;

/* Minimal error checking.  Ignore cases we know about, and report the rest. */
	if(driver_byte(result) != 0)
	  switch(SCpnt->sense_buffer[2] & 0xf) {
	  case UNIT_ATTENTION:
	    scsi_CDs[target].device->changed = 1;
	    printk("Disc change detected.\n");
	    break;
	  case NOT_READY: /* This happens if there is no disc in drive */
	    printk("CDROM not ready.  Make sure there is a disc in the drive.\n");
	    break;
	  case ILLEGAL_REQUEST:
	    printk("CDROM (ioctl) reports ILLEGAL REQUEST.\n");
	    break;
	  default:
	    printk("SCSI CD error: host %d id %d lun %d return code = %03x\n", 
		   scsi_CDs[target].device->host->host_no, 
		   scsi_CDs[target].device->id,
		   scsi_CDs[target].device->lun,
		   result);
	    printk("\tSense class %x, sense error %x, extended sense %x\n",
		   sense_class(SCpnt->sense_buffer[0]), 
		   sense_error(SCpnt->sense_buffer[0]),
		   SCpnt->sense_buffer[2] & 0xf);
	    
	};

	result = SCpnt->result;
	SCpnt->request.dev = -1; /* Deallocate */
	wake_up(&scsi_devices[SCpnt->index].device_wait);
	/* Wake up a process waiting for device*/
      	return result;
}

int sr_ioctl(struct inode * inode, struct file * file, unsigned int cmd, unsigned long arg)
{
        u_char 	sr_cmd[10];

	int dev = inode->i_rdev;
	int result, target;

	target = MINOR(dev);
	if (target >= NR_SR) return -ENODEV;

	switch (cmd) 
		{
		/* Sun-compatible */
		case CDROMPAUSE:

			sr_cmd[0] = SCMD_PAUSE_RESUME;
			sr_cmd[1] = scsi_CDs[target].device->lun << 5;
			sr_cmd[2] = sr_cmd[3] = sr_cmd[4] = 0;
			sr_cmd[5] = sr_cmd[6] = sr_cmd[7] = 0;
			sr_cmd[8] = 0;
			sr_cmd[9] = 0;

			result = do_ioctl(target, sr_cmd, NULL, 255);
			return result;

		case CDROMRESUME:

			sr_cmd[0] = SCMD_PAUSE_RESUME;
			sr_cmd[1] = scsi_CDs[target].device->lun << 5;
			sr_cmd[2] = sr_cmd[3] = sr_cmd[4] = 0;
			sr_cmd[5] = sr_cmd[6] = sr_cmd[7] = 0;
			sr_cmd[8] = 1;
			sr_cmd[9] = 0;

			result = do_ioctl(target, sr_cmd, NULL, 255);

			return result;

		case CDROMPLAYMSF:
			{
			struct cdrom_msf msf;
			memcpy_fromfs(&msf, (void *) arg, sizeof(msf));

			sr_cmd[0] = SCMD_PLAYAUDIO_MSF;
			sr_cmd[1] = scsi_CDs[target].device->lun << 5;
			sr_cmd[2] = 0;
			sr_cmd[3] = msf.cdmsf_min0;
			sr_cmd[4] = msf.cdmsf_sec0;
			sr_cmd[5] = msf.cdmsf_frame0;
			sr_cmd[6] = msf.cdmsf_min1;
			sr_cmd[7] = msf.cdmsf_sec1;
			sr_cmd[8] = msf.cdmsf_frame1;
			sr_cmd[9] = 0;

			result = do_ioctl(target, sr_cmd, NULL, 255);
			return result;
			}

		case CDROMPLAYTRKIND:
			{
			struct cdrom_ti ti;
			memcpy_fromfs(&ti, (void *) arg, sizeof(ti));

			sr_cmd[0] = SCMD_PLAYAUDIO_TI;
			sr_cmd[1] = scsi_CDs[target].device->lun << 5;
			sr_cmd[2] = 0;
			sr_cmd[3] = 0;
			sr_cmd[4] = ti.cdti_trk0;
			sr_cmd[5] = ti.cdti_ind0;
			sr_cmd[6] = 0;
			sr_cmd[7] = ti.cdti_trk1;
			sr_cmd[8] = ti.cdti_ind1;
			sr_cmd[9] = 0;

			result = do_ioctl(target, sr_cmd, NULL, 255);

			return result;
			}

		case CDROMREADTOCHDR:
			{
			struct cdrom_tochdr tochdr;
			char * buffer;

			sr_cmd[0] = SCMD_READ_TOC;
			sr_cmd[1] = ((scsi_CDs[target].device->lun) << 5) | 0x02;    /* MSF format */
			sr_cmd[2] = sr_cmd[3] = sr_cmd[4] = sr_cmd[5] = 0;
			sr_cmd[6] = 0;
			sr_cmd[7] = 0;              /* MSB of length (12) */
			sr_cmd[8] = 12;             /* LSB of length */
			sr_cmd[9] = 0;

			buffer = (unsigned char *) scsi_malloc(512);
			if(!buffer) return -ENOMEM;

			result = do_ioctl(target, sr_cmd, buffer, 12);

			tochdr.cdth_trk0 = buffer[2];
			tochdr.cdth_trk1 = buffer[3];

			scsi_free(buffer, 512);

			verify_area (VERIFY_WRITE, (void *) arg, sizeof (struct cdrom_tochdr));
			memcpy_tofs ((void *) arg, &tochdr, sizeof (struct cdrom_tochdr));
			
			return result;
		        }

		case CDROMREADTOCENTRY:
			{
			struct cdrom_tocentry tocentry;
			char * buffer;

			verify_area (VERIFY_READ, (void *) arg, sizeof (struct cdrom_tocentry));
			memcpy_fromfs (&tocentry, (void *) arg, sizeof (struct cdrom_tocentry));

			sr_cmd[0] = SCMD_READ_TOC;
			sr_cmd[1] = ((scsi_CDs[target].device->lun) << 5) | 0x02;    /* MSF format */
			sr_cmd[2] = sr_cmd[3] = sr_cmd[4] = sr_cmd[5] = 0;
			sr_cmd[6] = tocentry.cdte_track;
			sr_cmd[7] = 0;             /* MSB of length (12)  */
			sr_cmd[8] = 12;            /* LSB of length */
			sr_cmd[9] = 0;

			buffer = (unsigned char *) scsi_malloc(512);
			if(!buffer) return -ENOMEM;

			result = do_ioctl (target, sr_cmd, buffer, 12);

			if (tocentry.cdte_format == CDROM_MSF) {
			  tocentry.cdte_addr.msf.minute = buffer[9];
			  tocentry.cdte_addr.msf.second = buffer[10];
			  tocentry.cdte_addr.msf.frame = buffer[11];
			  tocentry.cdte_ctrl = buffer[5] & 0xf;
			}
			else
			  tocentry.cdte_addr.lba = (int) buffer[0];

			scsi_free(buffer, 512);

			verify_area (VERIFY_WRITE, (void *) arg, sizeof (struct cdrom_tocentry));
			memcpy_tofs ((void *) arg, &tocentry, sizeof (struct cdrom_tocentry));

			return result;
		        }

		case CDROMSTOP:
		        sr_cmd[0] = START_STOP;
			sr_cmd[1] = ((scsi_CDs[target].device->lun) << 5) | 1;
			sr_cmd[2] = sr_cmd[3] = sr_cmd[5] = 0;
			sr_cmd[4] = 0;

			result = do_ioctl(target, sr_cmd, NULL, 255);
			return result;
			
		case CDROMSTART:
		        sr_cmd[0] = START_STOP;
			sr_cmd[1] = ((scsi_CDs[target].device->lun) << 5) | 1;
			sr_cmd[2] = sr_cmd[3] = sr_cmd[5] = 0;
			sr_cmd[4] = 1;

			result = do_ioctl(target, sr_cmd, NULL, 255);
			return result;

		case CDROMEJECT:
			if (scsi_CDs[target].device -> access_count == 1)
			  sr_ioctl (inode, NULL, SCSI_IOCTL_DOORUNLOCK, 0);

		        sr_cmd[0] = START_STOP;
			sr_cmd[1] = ((scsi_CDs[target].device -> lun) << 5) | 1;
			sr_cmd[2] = sr_cmd[3] = sr_cmd[5] = 0;
			sr_cmd[4] = 0x02;

			if (!(result = do_ioctl(target, sr_cmd, NULL, 255)))
			  scsi_CDs[target].device -> changed = 1;

			return result;

		case CDROMVOLCTRL:
			{
			  char * buffer, * mask;
			  struct cdrom_volctrl volctrl;

			  verify_area (VERIFY_READ, (void *) arg, sizeof (struct cdrom_volctrl));
			  memcpy_fromfs (&volctrl, (void *) arg, sizeof (struct cdrom_volctrl));

			  /* First we get the current params so we can just twiddle the volume */

			  sr_cmd[0] = MODE_SENSE;
			  sr_cmd[1] = (scsi_CDs[target].device -> lun) << 5;
			  sr_cmd[2] = 0xe;    /* Want mode page 0xe, CDROM audio params */
			  sr_cmd[3] = 0;
			  sr_cmd[4] = 28;
			  sr_cmd[5] = 0;

			  buffer = (unsigned char *) scsi_malloc(512);
			  if(!buffer) return -ENOMEM;

			  if ((result = do_ioctl (target, sr_cmd, buffer, 28))) {
			    printk ("Hosed while obtaining audio mode page\n");
			    scsi_free(buffer, 512);
			    return result;
			  }

			  sr_cmd[0] = MODE_SENSE;
			  sr_cmd[1] = (scsi_CDs[target].device -> lun) << 5;
			  sr_cmd[2] = 0x4e;   /* Want the mask for mode page 0xe */
			  sr_cmd[3] = 0;
			  sr_cmd[4] = 28;
			  sr_cmd[5] = 0;

			  mask = (unsigned char *) scsi_malloc(512);
			  if(!mask) {
			    scsi_free(buffer, 512);
			    return -ENOMEM;
			  };

			  if ((result = do_ioctl (target, sr_cmd, mask, 28))) {
			    printk ("Hosed while obtaining mask for audio mode page\n");
			    scsi_free(buffer, 512);
			    scsi_free(mask, 512);
			    return result;
			  }

			  /* Now mask and substitute our own volume and reuse the rest */
			  buffer[0] = 0;  /* Clear reserved field */

			  buffer[21] = volctrl.channel0 & mask[21];
			  buffer[23] = volctrl.channel1 & mask[23];
			  buffer[25] = volctrl.channel2 & mask[25];
			  buffer[27] = volctrl.channel3 & mask[27];

			  sr_cmd[0] = MODE_SELECT;
			  sr_cmd[1] = ((scsi_CDs[target].device -> lun) << 5) | 0x10;    /* Params are SCSI-2 */
			  sr_cmd[2] = sr_cmd[3] = 0;
			  sr_cmd[4] = 28;
			  sr_cmd[5] = 0;

			  result = do_ioctl (target, sr_cmd, buffer, 28);
			  scsi_free(buffer, 512);
			  scsi_free(mask, 512);
			  return result;
			}

		case CDROMSUBCHNL:
			{
			  struct cdrom_subchnl subchnl;
			  char * buffer;
			  
			  sr_cmd[0] = SCMD_READ_SUBCHANNEL;
			  sr_cmd[1] = ((scsi_CDs[target].device->lun) << 5) | 0x02;    /* MSF format */
			  sr_cmd[2] = 0x40;    /* I do want the subchannel info */
			  sr_cmd[3] = 0x01;    /* Give me current position info */
			  sr_cmd[4] = sr_cmd[5] = 0;
			  sr_cmd[6] = 0;
			  sr_cmd[7] = 0;
			  sr_cmd[8] = 16;
			  sr_cmd[9] = 0;

			  buffer = (unsigned char*) scsi_malloc(512);
			  if(!buffer) return -ENOMEM;

			  result = do_ioctl(target, sr_cmd, buffer, 16);

			  subchnl.cdsc_audiostatus = buffer[1];
			  subchnl.cdsc_format = CDROM_MSF;
			  subchnl.cdsc_ctrl = buffer[5] & 0xf;
			  subchnl.cdsc_trk = buffer[6];
			  subchnl.cdsc_ind = buffer[7];

			  subchnl.cdsc_reladdr.msf.minute = buffer[13];
			  subchnl.cdsc_reladdr.msf.second = buffer[14];
			  subchnl.cdsc_reladdr.msf.frame = buffer[15];
			  subchnl.cdsc_absaddr.msf.minute = buffer[9];
			  subchnl.cdsc_absaddr.msf.second = buffer[10];
			  subchnl.cdsc_absaddr.msf.frame = buffer[11];

			  scsi_free(buffer, 512);

			  verify_area (VERIFY_WRITE, (void *) arg, sizeof (struct cdrom_subchnl));
			  memcpy_tofs ((void *) arg, &subchnl, sizeof (struct cdrom_subchnl));
			  return result;
			}

		case CDROMREADMODE2:
			return -EINVAL;
		case CDROMREADMODE1:
			return -EINVAL;

		RO_IOCTLS(dev,arg);
		default:
			return scsi_ioctl(scsi_CDs[target].device,cmd,(void *) arg);
		}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品综合久久久久久| 国产原创一区二区| 欧美巨大另类极品videosbest| 一级做a爱片久久| 欧美午夜寂寞影院| 日韩电影在线免费| 久久久久综合网| 成人成人成人在线视频| 亚洲在线成人精品| 欧美一区午夜精品| 成人午夜精品一区二区三区| 中文字幕在线播放不卡一区| 日本高清不卡aⅴ免费网站| 婷婷综合久久一区二区三区| 欧美大片在线观看一区二区| 成人美女视频在线观看18| 专区另类欧美日韩| 欧美一区二区在线观看| 国产精品一区在线观看你懂的| 国产精品卡一卡二卡三| 欧美日韩另类一区| 国产一区三区三区| 一区二区三区国产精华| 日韩三级视频在线看| 成人网在线免费视频| 午夜电影网一区| 欧美激情一区二区三区四区 | 国产精品的网站| 欧美人伦禁忌dvd放荡欲情| 国内成人免费视频| 一区二区三区蜜桃网| 久久青草国产手机看片福利盒子 | 成人一级视频在线观看| 亚洲福中文字幕伊人影院| 国产亚洲精品免费| 欧美另类变人与禽xxxxx| 不卡的电影网站| 麻豆久久一区二区| 一区二区三区中文免费| 亚洲精品一区二区精华| 欧美日韩国产经典色站一区二区三区| 久久国产精品免费| 亚洲一区二区三区在线看| 久久久亚洲精品一区二区三区| 91成人国产精品| 粉嫩aⅴ一区二区三区四区五区| 亚洲午夜国产一区99re久久| 久久精品视频网| 日韩久久久精品| 欧美日韩的一区二区| 色综合天天性综合| 国产寡妇亲子伦一区二区| 免费欧美在线视频| 午夜天堂影视香蕉久久| 亚洲美女一区二区三区| 亚洲国产精品成人综合| 欧美草草影院在线视频| 在线播放日韩导航| 欧美日免费三级在线| 色综合久久久久久久久久久| 国产超碰在线一区| 国产盗摄精品一区二区三区在线 | 香蕉久久一区二区不卡无毒影院 | 成人av资源下载| 岛国精品一区二区| 国产精品99久久久久久似苏梦涵| 日日夜夜免费精品| 日韩中文字幕91| 日日摸夜夜添夜夜添国产精品| 亚洲欧美日韩中文播放 | 在线免费亚洲电影| 91黄色激情网站| 色婷婷激情综合| 在线观看日韩av先锋影音电影院| 99久精品国产| 色88888久久久久久影院野外| 97se亚洲国产综合在线| 色系网站成人免费| 欧美性生活影院| 欧美亚洲国产怡红院影院| 欧美在线视频日韩| 欧美巨大另类极品videosbest| 欧美日韩的一区二区| 欧美一个色资源| 精品欧美一区二区三区精品久久| 精品国产乱码久久久久久久 | 蜜桃av一区二区在线观看| 日本91福利区| 国模一区二区三区白浆| 成人免费毛片嘿嘿连载视频| 成人午夜免费av| 色综合久久中文综合久久牛| 欧美综合欧美视频| 欧美乱妇一区二区三区不卡视频| 日韩一级二级三级| 2022国产精品视频| 国产精品无圣光一区二区| 亚洲色图一区二区| 天天操天天干天天综合网| 麻豆精品精品国产自在97香蕉| 极品少妇一区二区| 波多野结衣视频一区| 欧美在线色视频| 日韩你懂的电影在线观看| 国产亚洲一区字幕| 曰韩精品一区二区| 美女国产一区二区三区| 成人一二三区视频| 欧美精品日韩精品| 久久久久99精品国产片| 一区二区免费看| 老司机精品视频导航| 成人午夜在线视频| 欧美精品v国产精品v日韩精品| 久久久99久久| 亚洲福利视频导航| 成人中文字幕电影| 51午夜精品国产| |精品福利一区二区三区| 日本少妇一区二区| 91免费精品国自产拍在线不卡| 这里只有精品99re| 亚洲免费色视频| 国产精品18久久久久久vr | 91麻豆精品国产91久久久使用方法| 日韩精品一区二区三区三区免费| 亚洲色图视频免费播放| 免费xxxx性欧美18vr| 成人手机电影网| 日韩精品在线一区二区| 亚洲制服欧美中文字幕中文字幕| 国产不卡视频在线播放| 欧美一区二区视频在线观看2020 | 成人黄色电影在线| 欧美videossexotv100| 亚洲国产一区二区a毛片| 国产成人精品亚洲777人妖 | 欧美一卡2卡3卡4卡| 亚洲欧美日韩人成在线播放| 国产一区二区三区在线看麻豆| 欧美色视频一区| 国产精品国产a| 国产不卡在线视频| 精品999在线播放| 日本伊人色综合网| 欧美综合视频在线观看| 中文字幕视频一区| 国产不卡免费视频| 国产亚洲欧洲997久久综合 | 日日夜夜免费精品| 欧美吞精做爰啪啪高潮| 亚洲欧美日韩一区二区三区在线观看| 国产一区在线精品| 2024国产精品| 激情五月播播久久久精品| 欧美一区二区啪啪| 午夜免费久久看| 欧美精品精品一区| 日韩精品亚洲一区| 69堂精品视频| 日本亚洲电影天堂| 日韩一区二区三区电影在线观看| 亚洲已满18点击进入久久| 91成人免费在线视频| 一区二区三区久久久| 成人福利视频在线看| 国产精品沙发午睡系列990531| 国产在线视频一区二区| 久久―日本道色综合久久| 国产精品乡下勾搭老头1| 国产亚洲一区二区在线观看| 国产一区二区精品久久99| 国产亚洲精久久久久久| 国产a精品视频| 日韩一区中文字幕| 91久久精品午夜一区二区| 亚洲自拍偷拍九九九| 国产三级一区二区| 国产一区在线精品| 国产精品大尺度| 欧美日韩在线精品一区二区三区激情| 一区二区三区四区乱视频| 欧美日韩和欧美的一区二区| 日本欧美一区二区三区乱码| 精品少妇一区二区三区免费观看 | 亚洲成人av一区二区| 91精品啪在线观看国产60岁| 极品少妇xxxx精品少妇偷拍| 中文字幕精品一区二区精品绿巨人| 99久久久久久| 日日摸夜夜添夜夜添亚洲女人| 精品美女一区二区三区| 不卡一区在线观看| 亚洲永久精品国产| 欧美mv和日韩mv的网站| 99久久免费国产| 另类的小说在线视频另类成人小视频在线 | 亚洲成va人在线观看| 欧美人xxxx| 国产精品亚洲成人|