--- cdrtools-2.01.01/cdda2wav/interface.c 2004-08-05 11:57:27.000000000 +0200 +++ cdrtools-2.01.01/cdda2wav/interface.c 2006-01-12 18:57:07.000000000 +0100 @@ -484,6 +484,7 @@ { int retval = 0; struct stat fstatstruct; + long bufsize = 0; /* The device (given by pdevname) can be: a. an SCSI device specified with a /dev/xxx name, @@ -559,11 +560,23 @@ dontneedroot(); if (global.nsectors > (unsigned) scg_bufsize(scgp, 3*1024*1024)/CD_FRAMESIZE_RAW) global.nsectors = scg_bufsize(scgp, 3*1024*1024)/CD_FRAMESIZE_RAW; + + bufsize = global.nsectors * CD_FRAMESIZE_RAW; + + init_scsibuf(scgp, &bufsize); + global.nsectors = bufsize / CD_FRAMESIZE_RAW; + if (global.overlap >= global.nsectors) - global.overlap = global.nsectors-1; + global.overlap = global.nsectors-1; - init_scsibuf(scgp, global.nsectors*CD_FRAMESIZE_RAW); - if (global.scanbus) { + + init_scsibuf(scgp, &bufsize); + global.nsectors = bufsize / CD_FRAMESIZE_RAW; + + if (global.overlap >= global.nsectors) + global.overlap = global.nsectors-1; + + if (global.scanbus) { select_target(scgp, stdout); exit(0); } --- cdrtools-2.01.01/cdda2wav/scsi_cmds.c 2003-03-31 13:51:14.000000000 +0200 +++ cdrtools-2.01.01/cdda2wav/scsi_cmds.c 2006-01-12 19:01:47.000000000 +0100 @@ -1780,11 +1780,11 @@ static caddr_t scsibuffer; /* page aligned scsi transfer buffer */ -void init_scsibuf __PR((SCSI *, unsigned)); +void init_scsibuf __PR((SCSI *, long *)); void init_scsibuf(scgp, amt) SCSI *scgp; - unsigned amt; + long *amt; { if (scsibuffer != NULL) { fprintf(stderr, "the SCSI transfer buffer has already been allocated!\n"); --- cdrtools-2.01.01/cdda2wav/scsi_cmds.h 2003-04-01 23:18:27.000000000 +0200 +++ cdrtools-2.01.01/cdda2wav/scsi_cmds.h 2006-01-12 19:02:45.000000000 +0100 @@ -40,7 +40,7 @@ get_orig_sectorsize __PR((SCSI *scgp, unsigned char *m4, unsigned char *m10, unsigned char *m11)); int heiko_mmc __PR(( SCSI *scgp )); -void init_scsibuf __PR(( SCSI *scgp, unsigned amt )); +void init_scsibuf __PR(( SCSI *scgp, long *amt )); int myscsierr __PR(( SCSI *scgp )); extern int accepts_fua_bit; --- cdrtools-2.01.01/cdrecord/cdrecord.c 2006-01-12 01:31:23.000000000 +0100 +++ cdrtools-2.01.01/cdrecord/cdrecord.c 2006-01-12 19:48:16.000000000 +0100 @@ -272,6 +272,7 @@ SCSI *scgp = NULL; char errstr[80]; BOOL gracedone = FALSE; + size_t wanted_bufsize = 0; #ifdef __EMX__ /* This gives wildcard expansion with Non-Posix shells with EMX */ @@ -559,13 +560,19 @@ if (lverbose && driveropts) printf("Driveropts: '%s'\n", driveropts); -/* bufsize = scg_bufsize(scgp, CDR_BUF_SIZE);*/ bufsize = scg_bufsize(scgp, bufsize); if (lverbose || debug) error("SCSI buffer size: %ld\n", bufsize); - if ((buf = scg_getbuf(scgp, bufsize)) == NULL) - comerr("Cannot get SCSI I/O buffer.\n"); + wanted_bufsize = bufsize; + buf = scg_getbuf(scgp, &bufsize); + + if (NULL == buf) + comerr("Cannot get SCSI I/O buffer of size %d bytes.\n", bufsize); + + if ((lverbose || debug) && (bufsize != wanted_bufsize)); + errmsgno(EX_BAD, "Asked for SCSI I/O buffer size %d bytes, could only get %d.\n", wanted_bufsize, bufsize); + if ((flags & F_SCANBUS) != 0) { select_target(scgp, stdout); exit(0); --- cdrtools-2.01.01/libscg/scg/scsitransp.h 2003-05-03 19:09:17.000000000 +0200 +++ cdrtools-2.01.01/libscg/scg/scsitransp.h 2006-01-12 19:18:09.000000000 +0100 @@ -144,7 +144,7 @@ extern int scg_initiator_id __PR((SCSI *scgp)); extern int scg_isatapi __PR((SCSI *scgp)); extern int scg_reset __PR((SCSI *scgp, int what)); -extern void *scg_getbuf __PR((SCSI *scgp, long)); +extern void *scg_getbuf __PR((SCSI *scgp, long *amt)); extern void scg_freebuf __PR((SCSI *scgp)); extern long scg_bufsize __PR((SCSI *scgp, long)); extern void scg_setnonstderrs __PR((SCSI *scgp, const char **)); --- cdrtools-2.01.01/libscg/scsitransp.c 2004-06-17 22:20:27.000000000 +0200 +++ cdrtools-2.01.01/libscg/scsitransp.c 2006-01-12 19:26:50.000000000 +0100 @@ -63,7 +63,7 @@ EXPORT int scg_initiator_id __PR((SCSI *scgp)); EXPORT int scg_isatapi __PR((SCSI *scgp)); EXPORT int scg_reset __PR((SCSI *scgp, int what)); -EXPORT void *scg_getbuf __PR((SCSI *scgp, long)); +EXPORT void *scg_getbuf __PR((SCSI *scgp, long *amt)); EXPORT void scg_freebuf __PR((SCSI *scgp)); EXPORT long scg_bufsize __PR((SCSI *scgp, long)); EXPORT void scg_setnonstderrs __PR((SCSI *scgp, const char **)); @@ -233,15 +233,24 @@ EXPORT void * scg_getbuf(scgp, amt) SCSI *scgp; - long amt; + long *amt; { - void *buf; + void *buf = NULL; + size_t pagesize = getpagesize(); + long bufsize = *amt; - if (amt <= 0 || amt > scg_bufsize(scgp, amt)) + if (bufsize <= 0 || bufsize > scg_bufsize(scgp, bufsize)) return ((void *)0); - buf = SCGO_GETBUF(scgp, amt); - scgp->bufptr = buf; + while (bufsize >= pagesize) { + buf = SCGO_GETBUF(scgp, bufsize); + if (buf) + break; + bufsize -= pagesize; + } + + *amt = bufsize; + scgp->bufptr = buf; return (buf); } --- cdrtools-2.01.01/mkisofs/diag/scsi.c 2005-05-01 20:59:29.000000000 +0200 +++ cdrtools-2.01.01/mkisofs/diag/scsi.c 2006-01-12 19:28:21.000000000 +0100 @@ -156,7 +156,7 @@ } bufsize = scg_bufsize(scgp, BUF_SIZE); - if ((buf = scg_getbuf(scgp, bufsize)) == NULL) { + if ((buf = scg_getbuf(scgp, &bufsize)) == NULL) { errmsg("Cannot get SCSI I/O buffer.\n"); scg_close(scgp); return (-1); --- cdrtools-2.01.01/mkisofs/scsi.c 2005-05-01 20:59:29.000000000 +0200 +++ cdrtools-2.01.01/mkisofs/scsi.c 2006-01-12 19:28:21.000000000 +0100 @@ -156,7 +156,7 @@ } bufsize = scg_bufsize(scgp, BUF_SIZE); - if ((buf = scg_getbuf(scgp, bufsize)) == NULL) { + if ((buf = scg_getbuf(scgp, &bufsize)) == NULL) { errmsg("Cannot get SCSI I/O buffer.\n"); scg_close(scgp); return (-1); --- cdrtools-2.01.01/readcd/readcd.c 2005-06-11 15:22:10.000000000 +0200 +++ cdrtools-2.01.01/readcd/readcd.c 2006-01-12 19:29:50.000000000 +0100 @@ -392,7 +392,7 @@ if (Sbufsize == 0) Sbufsize = 256*1024L; Sbufsize = scg_bufsize(scgp, Sbufsize); - if ((Sbuf = scg_getbuf(scgp, Sbufsize)) == NULL) + if ((Sbuf = scg_getbuf(scgp, &Sbufsize)) == NULL) comerr("Cannot get SCSI I/O buffer.\n"); is_suid = geteuid() != getuid(); --- cdrtools-2.01.01/rscsi/rscsi.c 2005-05-16 14:59:33.000000000 +0200 +++ cdrtools-2.01.01/rscsi/rscsi.c 2006-01-12 20:06:43.000000000 +0100 @@ -86,7 +86,7 @@ LOCAL void readbuf __PR((char *buf, int n)); LOCAL void voidarg __PR((int n)); LOCAL void readarg __PR((char *buf, int n)); -LOCAL char * preparebuffer __PR((int size)); +LOCAL char * preparebuffer __PR((long *size)); LOCAL int checkscsi __PR((char *decive)); LOCAL void rscsirespond __PR((int ret, int err)); LOCAL void rscsireply __PR((int ret)); @@ -574,7 +574,7 @@ LOCAL void getbuf() { - int ret = 0; + long ret = 0; char amt[CMD_SIZE]; readarg(amt, sizeof(amt)); @@ -584,7 +584,7 @@ return; } ret = scg_bufsize(scsi_ptr, atol(amt)); - if (preparebuffer(ret) == NULL) + if (preparebuffer(&ret) == NULL) ret = -1; rscsirespond(ret, geterrno()); } @@ -919,26 +919,26 @@ LOCAL char * preparebuffer(size) - int size; + long *size; { - Sbufsize = size; - if ((Sbuf = scg_getbuf(scsi_ptr, Sbufsize)) == NULL) { + Sbufsize = *size; + if ((Sbuf = scg_getbuf(scsi_ptr, &Sbufsize)) == NULL) { Sbufsize = 0L; return (Sbuf); } - size = Sbufsize + 1024; /* Add protocol overhead */ + *size = Sbufsize + 1024; /* Add protocol overhead */ #ifdef SO_SNDBUF - while (size > 512 && - setsockopt(STDOUT_FILENO, SOL_SOCKET, SO_SNDBUF, (char *)&size, sizeof (size)) < 0) - size -= 512; - DEBUG1("rscsid: sndsize: %d\n", size); + while (*size > 512 && + setsockopt(STDOUT_FILENO, SOL_SOCKET, SO_SNDBUF, (char *)size, sizeof (*size)) < 0) + *size -= 512; + DEBUG1("rscsid: sndsize: %d\n", *size); #endif #ifdef SO_RCVBUF - while (size > 512 && - setsockopt(STDIN_FILENO, SOL_SOCKET, SO_RCVBUF, (char *)&size, sizeof (size)) < 0) - size -= 512; - DEBUG1("rscsid: rcvsize: %d\n", size); + while (*size > 512 && + setsockopt(STDIN_FILENO, SOL_SOCKET, SO_RCVBUF, (char *)size, sizeof (*size)) < 0) + *size -= 512; + DEBUG1("rscsid: rcvsize: %d\n", *size); #endif return (Sbuf); } --- cdrtools-2.01.01/scgcheck/scgcheck.c 2004-09-08 19:49:48.000000000 +0200 +++ cdrtools-2.01.01/scgcheck/scgcheck.c 2006-01-12 19:50:23.000000000 +0100 @@ -460,23 +460,31 @@ getbuf(scgp) SCSI *scgp; { + long wanted_size = 0; + bufsize = scg_bufsize(scgp, MAX_BUF_SIZE); printf("Max DMA buffer size: %ld\n", bufsize); fprintf(logfile, "Max DMA buffer size: %ld\n", bufsize); seterrno(0); - if ((buf = scg_getbuf(scgp, bufsize)) == NULL) { + wanted_size = bufsize; + if ((buf = scg_getbuf(scgp, &bufsize)) == NULL) { errmsg("Cannot get SCSI buffer (%ld bytes).\n", bufsize); fprintf(logfile, "%s. Cannot get SCSI buffer (%ld bytes).\n", errmsgstr(geterrno()), bufsize); } else { + if (wanted_size != bufsize) + fprint(logfile, "Max buffer available: %ld but wanted %ld\n", bufsize, wanted_size); scg_freebuf(scgp); } bufsize = scg_bufsize(scgp, BUF_SIZE); + wanted_size = bufsize; if (debug) error("SCSI buffer size: %ld\n", bufsize); - if ((buf = scg_getbuf(scgp, bufsize)) == NULL) + if ((buf = scg_getbuf(scgp, &bufsize)) == NULL) comerr("Cannot get SCSI I/O buffer.\n"); + if (wanted_size != bufsize) + fprint(logfile, "Max buffer available: %ld but wanted %ld\n", bufsize, wanted_size); } EXPORT void --- cdrtools-2.01.01/scgskeleton/skel.c 2004-07-11 00:57:27.000000000 +0200 +++ cdrtools-2.01.01/scgskeleton/skel.c 2006-01-12 19:45:39.000000000 +0100 @@ -247,7 +247,7 @@ if (Sbufsize == 0) Sbufsize = 256*1024L; Sbufsize = scg_bufsize(scgp, Sbufsize); - if ((Sbuf = scg_getbuf(scgp, Sbufsize)) == NULL) + if ((Sbuf = scg_getbuf(scgp, &Sbufsize)) == NULL) comerr("Cannot get SCSI I/O buffer.\n"); is_suid = geteuid() != getuid();