read.c

来自「使用libscsi做的一系列cdrom操作工具程序。包含cdwrite,cdfl」· C语言 代码 · 共 98 行

C
98
字号
#include <scsi/da.h>#include <scsi/all.h>#include <scsi/taxm.h>#include <stdio.h>#include <stdlib.h>#include <errno.h>#include "cdda.h"struct {    struct sc_mode_header6 h;    struct sc_mode_block_descriptor b;    struct sc_mode_taxm_speed s;} mode_bdesc = {    { 0, 0, 0, 1 },    { 0x82, 0, 0, 0, 0, 0, 0x9, 0x30 },#if SC_BIGENDIAN    { 0, SC_MODE_TAXM_SPEED, 1, SC_TAXM_QUAD, SC_TAXM_QUAD }#else    { SC_MODE_TAXM_SPEED, 0, 1, SC_TAXM_QUAD, SC_TAXM_QUAD }#endif};intdo_read(enum mode mode, SCSI *fd, FILE *fout,	u_long start, u_long end, int nblocks){    char s[80];    u_char *buf;    u_long i, n;    u_long len = sizeof(struct sc_mode_header6)	+ sizeof(struct sc_mode_block_descriptor) + 3;	    if ((buf=(u_char *)sc_alloc(2352*nblocks)) == NULL) {	fprintf(stderr, "%s: malloc failure\n", prg);	return -1;    }    switch (mode) {    case m_hp:	mode_bdesc.b.dcode = 0;	len -= 3;	/* FALLTHROUGH */    case m_toshiba:	if (sc_mode_select6(fd, 1, 0,			    len, (u_char *)&mode_bdesc) < 0) {	    sc_fstatus(fd, stderr, prg, "mode-select6", 3);	    sc_free(buf);	    return -1;	}	break;    case m_yamaha:	break;	    default:	fprintf(stderr, "%s: unknown mode selected: %d\n",		prg, mode);	sc_free(buf);	return -1;    }    for (i=start; i<end; i+=n/2352) {	if (mode != m_yamaha) {	    if ((n=sc_da_read10(fd, i, (u_short)				((i+nblocks < end) ? nblocks : end-i),				2352*nblocks, buf)) < 0) {		sprintf(s, "read10(%0xlx)", i);		sc_fstatus(fd, stderr, prg, s, 3);		sc_free(buf);		return -1;	    }	}	else {	    if ((n=sc_cdr102_read_cdda(fd, 0, i, (u_long)				((i+nblocks < end) ? nblocks : end-i),				2352*nblocks, buf)) < 0) {		sprintf(s, "read-cdda(%0xlx)", i);		sc_fstatus(fd, stderr, prg, s, 3);		sc_free(buf);		return -1;	    }	}	if (fwrite(buf, 1, n, fout) != n) {	    fprintf(stderr, "%s: write error: %s\n",		    prg, strerror(errno));	    sc_free(buf);	    return -1;	}    }    sc_free(buf);    return 0;}

⌨️ 快捷键说明

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