|
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); |