fseeko.
+2013-10-14 Vladimir Serbinenko <phcoder@gmail.com>
+
+ Make grub_util_fd_seek match behaviour of other grub_util_fd_* and
+ fseeko.
+
2013-10-14 qwertial <qwertial>
* grub-core/gdb_grub.in: Fix overflow and wrong field.
#ifdef GRUB_UTIL
if (dev->cheat)
{
- err = grub_util_fd_seek (dev->cheat_fd, dev->cheat,
- sector << disk->log_sector_size);
- if (err)
- return err;
+ int r;
+ r = grub_util_fd_seek (dev->cheat_fd, sector << disk->log_sector_size);
+ if (r)
+ return grub_error (GRUB_ERR_BAD_DEVICE, N_("cannot seek `%s': %s"),
+ dev->cheat, grub_util_fd_strerror ());
if (grub_util_fd_read (dev->cheat_fd, buf, size << disk->log_sector_size)
!= (ssize_t) (size << disk->log_sector_size))
return grub_error (GRUB_ERR_READ_ERROR, N_("cannot read `%s': %s"),
#ifdef GRUB_UTIL
if (dev->cheat)
{
- err = grub_util_fd_seek (dev->cheat_fd, dev->cheat,
- sector << disk->log_sector_size);
- if (err)
- return err;
+ int r;
+ r = grub_util_fd_seek (dev->cheat_fd, sector << disk->log_sector_size);
+ if (r)
+ return grub_error (GRUB_ERR_BAD_DEVICE, N_("cannot seek `%s': %s"),
+ dev->cheat, grub_util_fd_strerror ());
if (grub_util_fd_write (dev->cheat_fd, buf, size << disk->log_sector_size)
!= (ssize_t) (size << disk->log_sector_size))
return grub_error (GRUB_ERR_READ_ERROR, N_("cannot read `%s': %s"),
s = grub_util_get_fd_size (fd, dev, &log_secsize);
s >>= log_secsize;
- grub_util_fd_seek (fd, dev, (s << log_secsize) - 512);
+ grub_util_fd_seek (fd, (s << log_secsize) - 512);
uuid = xmalloc (GRUB_MD_SHA256->mdlen * 2 + 1);
if (grub_util_fd_read (fd, (void *) &hdr, 512) < 0)
return GRUB_UTIL_FD_INVALID;
}
- if (grub_util_fd_seek (fd, map[disk->id].device,
- sector << disk->log_sector_size))
+ if (grub_util_fd_seek (fd, sector << disk->log_sector_size))
{
grub_util_fd_close (fd);
+ grub_error (GRUB_ERR_BAD_DEVICE, N_("cannot seek `%s': %s"),
+ map[disk->id].device, grub_util_fd_strerror ());
+
return GRUB_UTIL_FD_INVALID;
}
return ro;
}
-grub_err_t
-grub_util_fd_seek (grub_util_fd_t fd, const char *name, grub_uint64_t off)
+int
+grub_util_fd_seek (grub_util_fd_t fd, grub_uint64_t off)
{
switch (fd->type)
{
case GRUB_UTIL_FD_FILE:
if (lseek (fd->fd, 0, SEEK_SET) == (off_t) -1)
- return grub_error (GRUB_ERR_BAD_DEVICE, N_("cannot seek `%s': %s"),
- name, strerror (errno));
+ return -1;
fd->off = off;
return 0;
case GRUB_UTIL_FD_DISK:
return 0;
}
- return 0;
+ return -1;
}
grub_util_fd_t
}
}
- if (grub_util_fd_seek (fd, grub_util_biosdisk_get_osdev (disk),
- sector << disk->log_sector_size))
+ if (grub_util_fd_seek (fd, sector << disk->log_sector_size))
{
close (fd);
+ grub_error (GRUB_ERR_BAD_DEVICE, N_("cannot seek `%s': %s"),
+ grub_util_biosdisk_get_osdev (disk), strerror (errno));
return -1;
}
#if defined(__linux__) && (!defined(__GLIBC__) || \
((__GLIBC__ < 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ < 1))))
/* Maybe libc doesn't have large file support. */
-grub_err_t
-grub_util_fd_seek (grub_util_fd_t fd, const char *name, grub_uint64_t off)
+int
+grub_util_fd_seek (grub_util_fd_t fd, grub_uint64_t off)
{
loff_t offset, result;
static int _llseek (uint filedes, ulong hi, ulong lo,
offset = (loff_t) off;
if (_llseek (fd, offset >> 32, offset & 0xffffffff, &result, SEEK_SET))
- return grub_error (GRUB_ERR_BAD_DEVICE, N_("cannot seek `%s': %s"),
- name, strerror (errno));
+ return -1;
return GRUB_ERR_NONE;
}
#else
-grub_err_t
-grub_util_fd_seek (grub_util_fd_t fd, const char *name, grub_uint64_t off)
+int
+grub_util_fd_seek (grub_util_fd_t fd, grub_uint64_t off)
{
off_t offset = (off_t) off;
if (lseek (fd, offset, SEEK_SET) != offset)
- return grub_error (GRUB_ERR_BAD_DEVICE, N_("cannot seek `%s': %s"),
- name, strerror (errno));
+ return -1;
+
return 0;
}
#endif
{
}
-grub_err_t
-grub_util_fd_seek (grub_util_fd_t fd, const char *name, grub_uint64_t off)
+int
+grub_util_fd_seek (grub_util_fd_t fd, grub_uint64_t off)
{
LARGE_INTEGER offset;
offset.QuadPart = off;
if (!SetFilePointerEx (fd, offset, NULL, FILE_BEGIN))
- return grub_error (GRUB_ERR_BAD_DEVICE, N_("cannot seek `%s': %s"),
- name, strerror (errno));
+ return -1;
return 0;
}
const char *
grub_util_biosdisk_get_compatibility_hint (grub_disk_t disk);
grub_err_t grub_util_biosdisk_flush (struct grub_disk *disk);
-grub_err_t
-grub_util_fd_seek (grub_util_fd_t fd, const char *name, grub_uint64_t sector);
+int
+grub_util_fd_seek (grub_util_fd_t fd, grub_uint64_t offset);
ssize_t grub_util_fd_read (grub_util_fd_t fd, char *buf, size_t len);
ssize_t grub_util_fd_write (grub_util_fd_t fd, const char *buf, size_t len);
grub_err_t