Add filesystem mtime to AFFS.
* grub-core/fs/affs.c (grub_affs_file): Make type unsigned. (aftime2ctime): New function. (grub_affs_dir): Use aftime2ctime. (grub_affs_label): Fix return value. (grub_affs_mtime): New function. (grub_affs_fs): Add mtime.
This commit is contained in:
parent
e87b10f5d6
commit
d20fab8471
2 changed files with 59 additions and 6 deletions
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
||||||
|
2012-05-08 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
Add filesystem mtime to AFFS.
|
||||||
|
|
||||||
|
* grub-core/fs/affs.c (grub_affs_file): Make type unsigned.
|
||||||
|
(aftime2ctime): New function.
|
||||||
|
(grub_affs_dir): Use aftime2ctime.
|
||||||
|
(grub_affs_label): Fix return value.
|
||||||
|
(grub_affs_mtime): New function.
|
||||||
|
(grub_affs_fs): Add mtime.
|
||||||
|
|
||||||
2012-05-07 Vladimir Serbinenko <phcoder@gmail.com>
|
2012-05-07 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
* grub-core/fs/affs.c (grub_affs_read_symlink): Convert latin1 into
|
* grub-core/fs/affs.c (grub_affs_read_symlink): Convert latin1 into
|
||||||
|
|
|
@ -73,7 +73,7 @@ struct grub_affs_file
|
||||||
grub_uint32_t next;
|
grub_uint32_t next;
|
||||||
grub_uint32_t parent;
|
grub_uint32_t parent;
|
||||||
grub_uint32_t extension;
|
grub_uint32_t extension;
|
||||||
grub_int32_t type;
|
grub_uint32_t type;
|
||||||
} __attribute__ ((packed));
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
/* The location of `struct grub_affs_file' relative to the end of a
|
/* The location of `struct grub_affs_file' relative to the end of a
|
||||||
|
@ -478,6 +478,15 @@ grub_affs_read (grub_file_t file, char *buf, grub_size_t len)
|
||||||
grub_be_to_cpu32 (data->diropen.di.size), 0);
|
grub_be_to_cpu32 (data->diropen.di.size), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static grub_int32_t
|
||||||
|
aftime2ctime (const struct grub_affs_time *t)
|
||||||
|
{
|
||||||
|
return grub_be_to_cpu32 (t->day) * 86400
|
||||||
|
+ grub_be_to_cpu32 (t->min) * 60
|
||||||
|
+ grub_be_to_cpu32 (t->hz) / 50
|
||||||
|
+ 8 * 365 * 86400 + 86400 * 2;
|
||||||
|
}
|
||||||
|
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
grub_affs_dir (grub_device_t device, const char *path,
|
grub_affs_dir (grub_device_t device, const char *path,
|
||||||
int (*hook) (const char *filename,
|
int (*hook) (const char *filename,
|
||||||
|
@ -498,10 +507,7 @@ grub_affs_dir (grub_device_t device, const char *path,
|
||||||
grub_memset (&info, 0, sizeof (info));
|
grub_memset (&info, 0, sizeof (info));
|
||||||
info.dir = ((filetype & GRUB_FSHELP_TYPE_MASK) == GRUB_FSHELP_DIR);
|
info.dir = ((filetype & GRUB_FSHELP_TYPE_MASK) == GRUB_FSHELP_DIR);
|
||||||
info.mtimeset = 1;
|
info.mtimeset = 1;
|
||||||
info.mtime = grub_be_to_cpu32 (node->di.mtime.day) * 86400
|
info.mtime = aftime2ctime (&node->di.mtime);
|
||||||
+ grub_be_to_cpu32 (node->di.mtime.min) * 60
|
|
||||||
+ grub_be_to_cpu32 (node->di.mtime.hz) / 50
|
|
||||||
+ 8 * 365 * 86400 + 86400 * 2;
|
|
||||||
grub_free (node);
|
grub_free (node);
|
||||||
return hook (filename, &info);
|
return hook (filename, &info);
|
||||||
}
|
}
|
||||||
|
@ -550,7 +556,7 @@ grub_affs_label (grub_device_t device, char **label)
|
||||||
- GRUB_AFFS_FILE_LOCATION),
|
- GRUB_AFFS_FILE_LOCATION),
|
||||||
sizeof (file), &file);
|
sizeof (file), &file);
|
||||||
if (grub_errno)
|
if (grub_errno)
|
||||||
return 0;
|
return grub_errno;
|
||||||
|
|
||||||
len = file.namelen;
|
len = file.namelen;
|
||||||
if (len > sizeof (file.name))
|
if (len > sizeof (file.name))
|
||||||
|
@ -569,6 +575,40 @@ grub_affs_label (grub_device_t device, char **label)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_affs_mtime (grub_device_t device, grub_int32_t *t)
|
||||||
|
{
|
||||||
|
struct grub_affs_data *data;
|
||||||
|
grub_disk_t disk = device->disk;
|
||||||
|
struct grub_affs_time af_time;
|
||||||
|
|
||||||
|
*t = 0;
|
||||||
|
|
||||||
|
data = grub_affs_mount (disk);
|
||||||
|
if (!data)
|
||||||
|
{
|
||||||
|
grub_dl_unref (my_mod);
|
||||||
|
return grub_errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_disk_read (data->disk, grub_be_to_cpu32 (data->bblock.rootblock),
|
||||||
|
data->blocksize * GRUB_DISK_SECTOR_SIZE - 40,
|
||||||
|
sizeof (af_time), &af_time);
|
||||||
|
if (grub_errno)
|
||||||
|
{
|
||||||
|
grub_dl_unref (my_mod);
|
||||||
|
grub_free (data);
|
||||||
|
return grub_errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
*t = aftime2ctime (&af_time);
|
||||||
|
grub_dl_unref (my_mod);
|
||||||
|
|
||||||
|
grub_free (data);
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static struct grub_fs grub_affs_fs =
|
static struct grub_fs grub_affs_fs =
|
||||||
{
|
{
|
||||||
|
@ -578,6 +618,8 @@ static struct grub_fs grub_affs_fs =
|
||||||
.read = grub_affs_read,
|
.read = grub_affs_read,
|
||||||
.close = grub_affs_close,
|
.close = grub_affs_close,
|
||||||
.label = grub_affs_label,
|
.label = grub_affs_label,
|
||||||
|
.mtime = grub_affs_mtime,
|
||||||
|
|
||||||
#ifdef GRUB_UTIL
|
#ifdef GRUB_UTIL
|
||||||
.reserved_first_sector = 0,
|
.reserved_first_sector = 0,
|
||||||
.blocklist_install = 1,
|
.blocklist_install = 1,
|
||||||
|
|
Loading…
Reference in a new issue