}
/*
- * pread() and pwrite() augmented with retry on short access or EINTR.
+ * read/write wrapper functions
*/
ssize_t xpread(int fd, void *buf, size_t count, off_t offset)
{
+ char *bufp = (char *)buf;
ssize_t rv;
ssize_t done = 0;
while ( count ) {
- rv = pread(fd, buf, count, offset);
+ rv = pread(fd, bufp, count, offset);
if ( rv == 0 ) {
die("short read");
} else if ( rv == -1 ) {
if ( errno == EINTR ) {
continue;
} else {
- perror(program);
- exit(1);
+ die(strerror(errno));
}
} else {
+ bufp += rv;
offset += rv;
done += rv;
count -= rv;
return done;
}
-ssize_t xpwrite(int fd, void *buf, size_t count, off_t offset)
+ssize_t xpwrite(int fd, const void *buf, size_t count, off_t offset)
{
+ const char *bufp = (const char *)buf;
ssize_t rv;
ssize_t done = 0;
while ( count ) {
- rv = pwrite(fd, buf, count, offset);
+ rv = pwrite(fd, bufp, count, offset);
if ( rv == 0 ) {
die("short write");
} else if ( rv == -1 ) {
if ( errno == EINTR ) {
continue;
} else {
- perror(program);
- exit(1);
+ die(strerror(errno));
}
} else {
+ bufp += rv;
offset += rv;
done += rv;
count -= rv;
pid_t mypid;
off_t filesystem_offset = 0; /* Offset of filesystem */
-void usage(void)
+void __attribute__((noreturn)) usage(void)
{
fprintf(stderr, "Usage: %s [-sf] [-o offset] device\n", program);
exit(1);
}
+void __attribute__((noreturn)) die(const char *msg)
+{
+ fprintf(stderr, "%s: %s\n", program, msg);
+ exit(1);
+}
+
/*
* read/write wrapper functions
*/
while ( count ) {
rv = pread(fd, bufp, count, offset);
if ( rv == 0 ) {
- fprintf(stderr, "%s: short read\n", program);
- exit(1);
+ die("short read");
} else if ( rv == -1 ) {
if ( errno == EINTR ) {
continue;
} else {
- perror(program);
- exit(1);
+ die(strerror(errno));
}
} else {
bufp += rv;
return done;
}
-ssize_t xpwrite(int fd, void *buf, size_t count, off_t offset)
+ssize_t xpwrite(int fd, const void *buf, size_t count, off_t offset)
{
- char *bufp = (char *)buf;
+ const char *bufp = (const char *)buf;
ssize_t rv;
ssize_t done = 0;
while ( count ) {
rv = pwrite(fd, bufp, count, offset);
if ( rv == 0 ) {
- fprintf(stderr, "%s: short write\n", program);
- exit(1);
+ die("short write");
} else if ( rv == -1 ) {
if ( errno == EINTR ) {
continue;
} else {
- perror(program);
- exit(1);
+ die(strerror(errno));
}
} else {
bufp += rv;
* Check to see that what we got was indeed an MS-DOS boot sector/superblock
*/
if( (errmsg = syslinux_check_bootsect(sectbuf)) ) {
- fprintf(stderr, "%s: %s\n", program, errmsg);
- exit(1);
+ die(errmsg);
}
/*
(fwrite(syslinux_ldlinux, 1, syslinux_ldlinux_len, mtp)
!= syslinux_ldlinux_len) ||
(status = pclose(mtp), !WIFEXITED(status) || WEXITSTATUS(status)) ) {
- fprintf(stderr, "%s: failed to create ldlinux.sys\n", program);
- exit(1);
+ die("failed to create ldlinux.sys");
}
status = system("mattrib +r +h +s s:ldlinux.sys");
*/
ssize_t xpread(int fd, void *buf, size_t count, off_t offset)
{
- char *p = buf;
+ char *bufp = (char *)buf;
ssize_t rv;
ssize_t done = 0;
while ( count ) {
- rv = pread(fd, p, count, offset);
+ rv = pread(fd, bufp, count, offset);
if ( rv == 0 ) {
die("short read");
} else if ( rv == -1 ) {
if ( errno == EINTR ) {
continue;
} else {
- perror(program);
- exit(1);
+ die(strerror(errno));
}
} else {
+ bufp += rv;
offset += rv;
done += rv;
- p += rv;
count -= rv;
}
}
ssize_t xpwrite(int fd, const void *buf, size_t count, off_t offset)
{
- const char *p = buf;
+ const char *bufp = (const char *)buf;
ssize_t rv;
ssize_t done = 0;
while ( count ) {
- rv = pwrite(fd, p, count, offset);
+ rv = pwrite(fd, bufp, count, offset);
if ( rv == 0 ) {
die("short write");
} else if ( rv == -1 ) {
if ( errno == EINTR ) {
continue;
} else {
- perror(program);
- exit(1);
+ die(strerror(errno));
}
} else {
+ bufp += rv;
offset += rv;
done += rv;
- p += rv;
count -= rv;
}
}