⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 growisofs_mmc.cpp

📁 linux平台下的dvd刻录软件
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	exit (FATAL_START(EINVAL));    if (dvd_20[4]&0x80)    {	fprintf (stderr,":-? L0 Data Zone Capacity is set already\n");	return;    }    split = dvd_20[8]<<24|dvd_20[9]<<16|dvd_20[10]<<8|dvd_20[11];    blocks = size/2048;    blocks += 15, blocks &= ~15;    if (blocks <= split)	fprintf (stderr,":-( more than 50%% of space will be *wasted*!\n"			"    use single layer media for this recording\n"),	exit (FATAL_START(EMEDIUMTYPE));    blocks /= 16;    blocks += 1;    blocks /= 2;    blocks *= 16;    fprintf (stderr,"%s: splitting layers at %u blocks\n",		    ioctl_device,blocks);    memset (dvd_20,0,sizeof(dvd_20));    dvd_20[1]  = sizeof(dvd_20)-2;    dvd_20[8]  = blocks>>24;    dvd_20[9]  = blocks>>16;    dvd_20[10] = blocks>>8;    dvd_20[11] = blocks;    cmd[0] = 0xBF;	// SEND DVD STRUCTURE    cmd[7] = 0x20;	// "DVD+R Double Layer Recording Information"    cmd[9] = sizeof(dvd_20);    cmd[11] = 0;    if ((err=cmd.transport(WRITE,dvd_20,sizeof(dvd_20))))	sperror ("SEND DVD+R DOUBLE LAYER RECORDING INFORMATION",err),	exit (FATAL_START(errno));}static int flush_cache (Scsi_Command &cmd){ int err;    cmd[0] = 0x35;		// FLUSH CACHE    cmd[1] = 0x02;		// "IMMED"    cmd[9] = 0;    if (!(err=cmd.transport()))	wait_for_unit (cmd);    else	sperror ("FLUSH CACHE",err);#if 1	// Pioneer apparently needs this, non-IMMED FLUSH that is...    cmd[0] = 0x35;		// FLUSH CACHE    cmd[9] = 0;    if (is_dao) cmd.timeout (15*60);    if ((err=cmd.transport()))    {	sperror ("SYNCHRONOUS FLUSH CACHE",err);	return err;    }#endif  return 0;}//// atexit/signal handlers//extern "C"void no_r_finalize (){   while (media_written)    { Scsi_Command cmd(ioctl_handle);	fprintf (stderr,"%s: flushing cache\n",ioctl_device);	if (flush_cache (cmd))	break;	media_written = 0;	errno = 0;    }    _exit (errno);}extern "C"void plus_rw_finalize (){   sigs_mask(SIG_BLOCK);    while (media_written)    { Scsi_Command cmd(ioctl_handle);      int err;	fprintf (stderr,"%s: flushing cache\n",ioctl_device);	if (flush_cache (cmd))	break;	if (!dvd_compat)	{   fprintf (stderr,"%s: stopping de-icing\n",ioctl_device);	    cmd[0] = 0x5B;	// CLOSE TRACK/SESSION	    cmd[1] = 0x01;	// "IMMED"	    cmd[2] = 0;		// "Stop De-Icing"	    cmd[9] = 0;	    if ((err=cmd.transport()))		sperror ("STOP DE-ICING",err);	    if (wait_for_unit (cmd)) break;	}	fprintf (stderr,"%s: writing lead-out\n",ioctl_device);	cmd[0] = 0x5B;		// CLOSE TRACK/SESSION	cmd[1] = 0x01;		// "IMMED"	cmd[2] = 0x02;		// "Close session"	cmd[9] = 0;	if ((err=cmd.transport()))	    sperror ("CLOSE SESSION",err);	if (wait_for_unit (cmd)) break; 	media_written = 0;	next_wr_addr = 0;	errno = 0;	if (do_reload && media_reload())	    perror (":-( unable to reload tray");// not actually reached    }    _exit (errno);}extern "C"void plus_r_finalize (){   sigs_mask(SIG_BLOCK);    while (media_written)    { Scsi_Command cmd(ioctl_handle);      int          mode,err;	fprintf (stderr,"%s: flushing cache\n",ioctl_device);	if (flush_cache(cmd))	break;	fprintf (stderr,"%s: closing track\n",ioctl_device);	cmd[0] = 0x5B;		// CLOSE TRACK/SESSION	cmd[1] = 0x01;		// "IMMED"	cmd[2] = 0x01;		// "Close Track"	cmd[4] = next_track>>8;	cmd[5] = next_track;	cmd[9] = 0;	if ((err=cmd.transport()))	    sperror ("CLOSE TRACK",err);	if (wait_for_unit (cmd)) break;	if (dvd_compat)	    // HP dvd520n insists on "finalize with minimum radius"	    // with DVD+R DL ---------------vv	    mode = ((mmc_profile&0xFFFF)==0x2B)?0x05:0x06,	    fprintf (stderr,"%s: closing disc\n",ioctl_device);	else	    mode = 0x02,	    fprintf (stderr,"%s: closing session\n",ioctl_device);	cmd[0] = 0x5B;		// CLOSE TRACK/SESSION	cmd[1] = 0x01;		// "IMMED"	cmd[2] = mode;		// "Close session"	cmd[9] = 0;	if ((err=cmd.transport()))	    sperror ("CLOSE SESSION",err);	if (wait_for_unit (cmd)) break; 	media_written = 0;	errno = 0;	if (do_reload && media_reload())	    perror (":-( unable to reload tray");// not actually reached    }    _exit (errno);}extern "C"void minus_rw_finalize (){   sigs_mask(SIG_BLOCK);    while (media_written)    { Scsi_Command cmd(ioctl_handle);      int err;	fprintf (stderr,"%s: flushing cache\n",ioctl_device);	if (flush_cache(cmd))	break;	if (quickgrown)	{   fprintf (stderr,"%s: writing lead-out\n",ioctl_device);	    cmd[0] = 0x5B;		// CLOSE TRACK/SESSION	    cmd[1] = 0x01;		// "IMMED"	    cmd[2] = 0x02;		// "Close Session"	    cmd[9] = 0;	    if ((err=cmd.transport()))		sperror ("CLOSE SESSION",err);	    if (wait_for_unit (cmd)) break;	    quickgrown=0;	}	media_written = 0;	next_wr_addr = 0;	errno = 0;	if (do_reload)	{   if (media_reload())		perror (":-( unable to reload tray");// not actually reached	}	else return;	// Restricted Overwrite is just ugly!    }    _exit (errno);}extern "C"void minus_r_finalize (){   sigs_mask(SIG_BLOCK);    while (media_written)    { Scsi_Command cmd(ioctl_handle);      int err;	fprintf (stderr,"%s: flushing cache\n",ioctl_device);	if (flush_cache(cmd))	break;	if (!is_dao)	{   fprintf (stderr,"%s: updating RMA\n",ioctl_device);	    cmd[0] = 0x5B;	// CLOSE TRACK/SESSION	    cmd[1] = 0x01;	// "IMMED"	    cmd[2] = 0x01;	// "Close Track"	    cmd[4] = next_track>>8;	    cmd[5] = next_track;	    cmd[9] = 0;	    if ((err=cmd.transport()))		sperror ("CLOSE TRACK",err);	    if (wait_for_unit (cmd)) break;	    fprintf (stderr,"%s: closing %s\n",ioctl_device,			    dvd_compat?"disc":"session");	    cmd[0] = 0x5B;	// CLOSE TRACK/SESSION	    cmd[1] = 0x01;	// "IMMED"	    cmd[2] = 0x02;	// "Close Session"	    cmd[9] = 0;	    if ((err=cmd.transport()))		sperror (dvd_compat?"CLOSE DISC":"CLOSE SESSION",err);	    if (wait_for_unit (cmd)) break;	} 	media_written = 0;	errno = 0;	if (do_reload && media_reload())	    perror (":-( unable to reload tray");// not actually reached    }    _exit (errno);}extern "C"void ram_reload (){   sigs_mask(SIG_BLOCK);    if (media_written && do_reload) media_reload();    _exit (errno);}//// poor_mans_setup takes care of a lot of things.// It's invoked right before first write and if necessary/applicable// prepares Page 05, reserves track, sets up atexit and signal handlers.//#define sigit(SIG,f)	do {	\    sigaction (SIG,NULL,&sa);	\    sa.sa_mask = mask;		\    sa.sa_handler = f;		\    sa.sa_flags &= ~SA_NODEFER;	\    sa.sa_flags |= SA_RESETHAND;\    sigaction (SIG,&sa,NULL);	\} while (0)static void atsignals(void(*func)()){ void           (*f)(int)=(void(*)(int))func;  sigset_t         mask;  struct sigaction sa;    sigemptyset (&mask);    sigaddset (&mask,SIGHUP),	sigaddset (&mask,SIGINT),    sigaddset (&mask,SIGTERM),	sigaddset (&mask,SIGPIPE);    sigit (SIGHUP,f);	sigit (SIGINT,f);    sigit (SIGTERM,f);	sigit (SIGPIPE,f);}#undef sigittypedef ssize_t (*pwrite64_t)(int,const void *,size_t,off64_t);extern "C"pwrite64_t poor_mans_setup (void *fd,off64_t leadout){ Scsi_Command cmd(ioctl_handle=fd);  int err,profile=mmc_profile&0xFFFF;    // We might have loaded media ourselves, in which case we    // should lock the door...    cmd[0] = 0x1E;  // PREVENT/ALLOW MEDIA REMOVAL    cmd[4] = 1;     // "Prevent"    cmd[5] = 0;    if ((err=cmd.transport ()))	sperror ("PREVENT MEDIA REMOVAL",err),	exit (FATAL_START(errno));    handle_events(cmd);    switch (profile)    {	case 0x1A:	// DVD+RW	    switch (disc_info[7]&3)	// Background formatting	    {	case 0:	// blank			plus_rw_format (cmd);			break;		case 1:	// suspended			plus_rw_restart_format (cmd,leadout);			break;		case 2:	// in progress		case 3: // complete			break;	    }	    plusminus_pages_setup (cmd,profile);	    atexit (plus_rw_finalize);	    atsignals (plus_rw_finalize);	    break;	case 0x1B:	// DVD+R	case 0x2B:	// DVD+R Double Layer	    plusminus_pages_setup(cmd,profile);	    if (profile==0x2B && next_track==1 && dvd_compat && leadout)		plus_r_dl_split (cmd,leadout);	    atexit (plus_r_finalize);	    if (next_wr_addr)	    {	atsignals (no_r_finalize);		next_wr_addr=(unsigned int)-1;	    }	    else atsignals (plus_r_finalize);	    break;	case 0x13:	// DVD-RW Restricted Overwrite	    plusminus_pages_setup (cmd,profile);	    //	    // A side note. Quick Grow can't be performed earlier,	    // as then reading is not possible.	    //	    minus_rw_quickgrow (cmd,leadout);	    atexit (minus_rw_finalize);	    atsignals (minus_rw_finalize);	    break;	case 0x11:	// DVD-R Sequential	case 0x14:	// DVD-RW Sequential	    plusminus_pages_setup (cmd,profile);	    if (is_dao && leadout)		minus_r_reserve_track(cmd,leadout);	    atexit (minus_r_finalize);	    if (next_wr_addr)	    {	atsignals (no_r_finalize);		next_wr_addr=(unsigned int)-1;	    }	    else atsignals (minus_r_finalize);	    break;	case 0x12:	// DVD-RAM	    // exclusively for speed settings...	    plusminus_pages_setup (cmd,profile);	    atexit (ram_reload);	    atsignals (ram_reload);	    break;	default:	    fprintf (stderr,":-( mounted media[%X] is not supported\n",profile),	    exit(FATAL_START(EMEDIUMTYPE));	    break;    }    if (velocity)	fprintf (stderr,"%s: \"Current Write Speed\" is %.1fx1385KBps.\n",			ioctl_device,velocity/(double)ONEX);    if (next_wr_addr==(unsigned int)-1) do    { unsigned char track[32];	next_wr_addr = 0;	cmd[0] = 0x52;	// READ TRACK INFORMATION	cmd[1] = 1;	cmd[4] = next_track>>8;	cmd[5] = next_track&0xFF;	// last track, set up earlier	cmd[8] = sizeof(track);	cmd[9] = 0;	if (cmd.transport (READ,track,sizeof(track)))	    break;	if (track[7]&1)	// NWA_V	{   next_wr_addr  = track[12]<<24;	    next_wr_addr |= track[13]<<16;	    next_wr_addr |= track[14]<<8;	    next_wr_addr |= track[15];	}	if (next_wr_addr != // track start	    (unsigned int)(track[8]<<24|track[9]<<16|track[10]<<8|track[11]))	    fprintf (stderr,":-? resuming track#%d from LBA#%d\n",			    next_track,next_wr_addr);    } while (0);    else next_wr_addr = 0;  return poor_mans_pwrite64;}extern "C"int poor_man_rewritable (void *fd, void *buf){ Scsi_Command	cmd(fd);  int		err,profile=mmc_profile&0xFFFF;    if (profile!=0x13 &&	// not DVD-RW Restricted Overwrite	profile!=0x12 &&	// nor DVD-RAM	profile!=0x1A)		// nor DVD+RW	return 0;    if (profile==0x13)		// DVD-RW Restricted Overwrite    {	// Yet another restriction of Restricted Overwrite mode?	// Pioneer DVR-x05 can't read a bit otherwise...	do_reload=0;	minus_rw_finalize ();	// with do_reload==0!	do_reload=1;    }    else if (profile==0x1A)	// DVD+RW    {	fprintf (stderr,"%s: flushing cache\n",ioctl_device);	if (flush_cache(cmd))	exit (errno);    }    cmd[0] = 0x28;	// READ(10)    cmd[5] = 16;	// LBA#16, volume descriptor set    cmd[8] = 16;	// 32KB    cmd[9] = 0;    if ((err=cmd.transport (READ,buf,16*2048)))	sperror ("READ@LBA=10h",err),	exit(errno);  return 1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -