View | Details | Raw Unified | Return to bug 19789
Collapse All | Expand All

(-)burncd.c (-19 / +30 lines)
Lines 40-46 Link Here
40
#include <sys/cdio.h>
40
#include <sys/cdio.h>
41
#include <sys/cdrio.h>
41
#include <sys/cdrio.h>
42
42
43
#define BLOCKS	16
43
#define BLOCKS	500
44
44
45
static int fd, saved_block_size;
45
static int fd, saved_block_size;
46
void cleanup(int);
46
void cleanup(int);
Lines 52-58 Link Here
52
	char *devname = "/dev/acd0c";
52
	char *devname = "/dev/acd0c";
53
	char buf[2352*BLOCKS];
53
	char buf[2352*BLOCKS];
54
	int arg, file, addr, count, filesize;
54
	int arg, file, addr, count, filesize;
55
	int block_size = 0, cdopen = 0, size, tot_size = 0;
55
	int block_size = 0, cdopen = 0, trackopen=0, size, tot_size = 0;
56
	struct cdr_track track;
56
	struct cdr_track track;
57
	struct stat stat;
57
	struct stat stat;
58
58
Lines 110-123 Link Here
110
		}
110
		}
111
		if (!strcmp(argv[arg], "msinfo")) {
111
		if (!strcmp(argv[arg], "msinfo")) {
112
		        struct ioc_read_toc_single_entry entry;
112
		        struct ioc_read_toc_single_entry entry;
113
			struct ioc_toc_header h;
113
114
115
			if (ioctl(fd, CDIOREADTOCHEADER, &h) < 0)
116
				err(EX_IOERR, "ioctl(CDIOREADTOCHEADER)");
114
			bzero(&entry, sizeof(struct ioc_read_toc_single_entry));
117
			bzero(&entry, sizeof(struct ioc_read_toc_single_entry));
115
			entry.address_format = CD_LBA_FORMAT;
118
			entry.address_format = CD_LBA_FORMAT;
119
			entry.track = h.ending_track;
116
			if (ioctl(fd, CDIOREADTOCENTRY, &entry) < 0) 
120
			if (ioctl(fd, CDIOREADTOCENTRY, &entry) < 0) 
117
				err(EX_IOERR, "ioctl(CDIOREADTOCENTRY)");
121
				err(EX_IOERR, "ioctl(CDIOREADTOCENTRY)");
118
			if (ioctl(fd, CDRIOCNEXTWRITEABLEADDR, &addr) < 0) 
122
			if (ioctl(fd, CDRIOCNEXTWRITEABLEADDR, &addr) < 0) 
119
				err(EX_IOERR, "ioctl(CDRIOCNEXTWRITEABLEADDR)");
123
				err(EX_IOERR, "ioctl(CDRIOCNEXTWRITEABLEADDR)");
120
			fprintf(stderr, "%d, %d\n", entry.entry.addr.lba, addr);
124
			fprintf(stderr, "%d, %d\n", ntohl(entry.entry.addr.lba), addr);
121
			break;
125
			break;
122
		}
126
		}
123
		if (!strcmp(argv[arg], "blank")) {
127
		if (!strcmp(argv[arg], "blank")) {
Lines 161-192 Link Here
161
		if ((file = open(argv[arg], O_RDONLY, 0)) < 0)
165
		if ((file = open(argv[arg], O_RDONLY, 0)) < 0)
162
			err(EX_NOINPUT, "open(%s)", argv[arg]);
166
			err(EX_NOINPUT, "open(%s)", argv[arg]);
163
167
164
		if (!cdopen) {
168
		trackopen=0;
165
			if (ioctl(fd, CDRIOCOPENDISK) < 0)
166
        			err(EX_IOERR, "ioctl(CDRIOCOPENDISK)");
167
			cdopen = 1;
168
		}
169
		if (ioctl(fd, CDRIOCOPENTRACK, &track) < 0)
170
        		err(EX_IOERR, "ioctl(CDRIOCOPENTRACK)");
171
172
		if (ioctl(fd, CDRIOCNEXTWRITEABLEADDR, &addr) < 0) 
173
        		err(EX_IOERR, "ioctl(CDRIOCNEXTWRITEABLEADDR)");
174
169
175
		if (fstat(file, &stat) < 0)
170
		if (fstat(file, &stat) < 0)
176
			err(EX_IOERR, "fstat(%s)", argv[arg]);
171
			err(EX_IOERR, "fstat(%s)", argv[arg]);
177
		filesize = stat.st_size / 1024;
172
		filesize = stat.st_size / 1024;
178
		if (!quiet) {
173
179
			fprintf(stderr, "next writeable LBA %d\n", addr);
180
			fprintf(stderr, "writing from file %s size %d KB\n",
181
				argv[arg], filesize);
182
		}
183
		lseek(fd, addr * block_size, SEEK_SET);
184
		size = 0;
174
		size = 0;
185
		if (filesize == 0)
175
		if (filesize == 0)
186
			filesize++;	/* cheat, avoid divide by zero */
176
			filesize++;	/* cheat, avoid divide by zero */
187
177
188
		while ((count = read(file, buf, block_size * BLOCKS)) > 0) {	
178
		while ((count = read(file, buf, block_size * BLOCKS)) > 0) {	
189
			int res;
179
			int res;
180
181
			if (!cdopen) {
182
				if (ioctl(fd, CDRIOCOPENDISK) < 0)
183
        				err(EX_IOERR, "ioctl(CDRIOCOPENDISK)");
184
				cdopen = 1;
185
			}
186
187
			if (!trackopen) {
188
				if (ioctl(fd, CDRIOCOPENTRACK, &track) < 0)
189
        				err(EX_IOERR, "ioctl(CDRIOCOPENTRACK)");
190
191
				if (ioctl(fd, CDRIOCNEXTWRITEABLEADDR, &addr) < 0) 
192
        				err(EX_IOERR, "ioctl(CDRIOCNEXTWRITEABLEADDR)");
193
				if (!quiet) {
194
					fprintf(stderr, "next writeable LBA %d\n", addr);
195
					fprintf(stderr, "writing from file %s size %d KB\n",
196
						argv[arg], filesize);
197
				}
198
				lseek(fd, addr * block_size, SEEK_SET);
199
				trackopen=1;
200
			};
190
			if (count % block_size) {
201
			if (count % block_size) {
191
				/* pad file to % block_size */
202
				/* pad file to % block_size */
192
				bzero(&buf[count], block_size * BLOCKS - count);
203
				bzero(&buf[count], block_size * BLOCKS - count);

Return to bug 19789