efi-loader: cache LoaderConfigTimeoutOneShot too
The data from this EFI variable is exposed as dbus property, and gdbus clients are happy to issue GetAllProperties() as if it was free. Hence make sure it's actually free and cache LoaderConfigTimeoutOneShot, since it's easy.
This commit is contained in:
@@ -734,3 +734,41 @@ char *efi_tilt_backslashes(char *s) {
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
int efi_loader_get_config_timeout_one_shot(usec_t *ret) {
|
||||
_cleanup_free_ char *v = NULL, *fn = NULL;
|
||||
static struct stat cache_stat = {};
|
||||
struct stat new_stat;
|
||||
static usec_t cache;
|
||||
uint64_t sec;
|
||||
int r;
|
||||
|
||||
assert(ret);
|
||||
|
||||
fn = efi_variable_path(EFI_VENDOR_LOADER, "LoaderConfigTimeoutOneShot");
|
||||
if (!fn)
|
||||
return -ENOMEM;
|
||||
|
||||
/* stat() the EFI variable, to see if the mtime changed. If it did we need to cache again. */
|
||||
if (stat(fn, &new_stat) < 0)
|
||||
return -errno;
|
||||
|
||||
if (stat_inode_unmodified(&new_stat, &cache_stat)) {
|
||||
*ret = cache;
|
||||
return 0;
|
||||
}
|
||||
|
||||
r = efi_get_variable_string(EFI_VENDOR_LOADER, "LoaderConfigTimeoutOneShot", &v);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = safe_atou64(v, &sec);
|
||||
if (r < 0)
|
||||
return r;
|
||||
if (sec > USEC_INFINITY / USEC_PER_SEC)
|
||||
return -ERANGE;
|
||||
|
||||
cache_stat = new_stat;
|
||||
*ret = cache = sec * USEC_PER_SEC; /* return in µs */
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user