diff -urNad cdrtools-2.01.01/cdda2wav/interface.c patched-cdrtools-2.01.01/cdda2wav/interface.c
--- cdrtools-2.01.01/cdda2wav/interface.c 2004-08-05 11:57:27.000000000 +0200
+++ patched-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);
}
diff -urNad cdrtools-2.01.01/cdda2wav/scsi_cmds.c patched-cdrtools-2.01.01/cdda2wav/scsi_cmds.c
--- cdrtools-2.01.01/cdda2wav/scsi_cmds.c 2003-03-31 13:51:14.000000000 +0200
+++ patched-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");
diff -urNad cdrtools-2.01.01/cdda2wav/scsi_cmds.h patched-cdrtools-2.01.01/cdda2wav/scsi_cmds.h
--- cdrtools-2.01.01/cdda2wav/scsi_cmds.h 2003-04-01 23:18:27.000000000 +0200
+++ patched-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;
diff -urNad cdrtools-2.01.01/cdrecord/cdrecord.c patched-cdrtools-2.01.01/cdrecord/cdrecord.c
--- cdrtools-2.01.01/cdrecord/cdrecord.c 2006-01-12 01:31:23.000000000 +0100
+++ patched-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);
diff -urNad cdrtools-2.01.01/libscg/scg/scsitransp.h patched-cdrtools-2.01.01/libscg/scg/scsitransp.h
--- cdrtools-2.01.01/libscg/scg/scsitransp.h 2003-05-03 19:09:17.000000000 +0200
+++ patched-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 **));
diff -urNad cdrtools-2.01.01/libscg/scsitransp.c patched-cdrtools-2.01.01/libscg/scsitransp.c
--- cdrtools-2.01.01/libscg/scsitransp.c 2004-06-17 22:20:27.000000000 +0200
+++ patched-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);
}
diff -urNad cdrtools-2.01.01/mkisofs/diag/scsi.c patched-cdrtools-2.01.01/mkisofs/diag/scsi.c
--- cdrtools-2.01.01/mkisofs/diag/scsi.c 2005-05-01 20:59:29.000000000 +0200
+++ patched-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);
diff -urNad cdrtools-2.01.01/mkisofs/scsi.c patched-cdrtools-2.01.01/mkisofs/scsi.c
--- cdrtools-2.01.01/mkisofs/scsi.c 2005-05-01 20:59:29.000000000 +0200
+++ patched-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);
diff -urNad cdrtools-2.01.01/readcd/readcd.c patched-cdrtools-2.01.01/readcd/readcd.c
--- cdrtools-2.01.01/readcd/readcd.c 2005-06-11 15:22:10.000000000 +0200
+++ patched-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();
diff -urNad cdrtools-2.01.01/rscsi/rscsi.c patched-cdrtools-2.01.01/rscsi/rscsi.c
--- cdrtools-2.01.01/rscsi/rscsi.c 2005-05-16 14:59:33.000000000 +0200
+++ patched-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);
}
diff -urNad cdrtools-2.01.01/scgcheck/scgcheck.c patched-cdrtools-2.01.01/scgcheck/scgcheck.c
--- cdrtools-2.01.01/scgcheck/scgcheck.c 2004-09-08 19:49:48.000000000 +0200
+++ patched-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
diff -urNad cdrtools-2.01.01/scgskeleton/skel.c patched-cdrtools-2.01.01/scgskeleton/skel.c
--- cdrtools-2.01.01/scgskeleton/skel.c 2004-07-11 00:57:27.000000000 +0200
+++ patched-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();
               (
geocities.com/de/linux_piewie)                   (
geocities.com/de)