История изменений
Исправление user_id_68054, (текущая версия) :
а вот пока-что ты можешь поглядеть — как реализовано это в исходниках:
http://cgit.freedesktop.org/systemd/systemd/tree/src/shared/efivars.c
int efi_set_reboot_to_firmware(bool value) {
int r;
uint64_t b, b_new;
r = get_os_indications(&b);
if (r < 0)
return r;
if (value)
b_new = b | EFI_OS_INDICATIONS_BOOT_TO_FW_UI;
else
b_new = b & ~EFI_OS_INDICATIONS_BOOT_TO_FW_UI;
/* Avoid writing to efi vars store if we can due to firmware bugs. */
if (b != b_new)
return efi_set_variable(EFI_VENDOR_GLOBAL, "OsIndications", &b_new, sizeof(uint64_t));
return 0;
}
...в свою очередь --
static int get_os_indications(uint64_t *os_indication) {
int r;
size_t s;
_cleanup_free_ void *v = NULL;
r = efi_reboot_to_firmware_supported();
if (r < 0)
return r;
r = efi_get_variable(EFI_VENDOR_GLOBAL, "OsIndications", NULL, &v, &s);
if (r < 0)
return r;
else if (s != sizeof(uint64_t))
return -EINVAL;
*os_indication = *(uint64_t *)v;
return 0;
}
эта функция [``efi_set_reboot_to_firmware()``] выполняется, когда logind получает dbus-сообщение [см функцию ``method_set_reboot_to_firmware_setup()``] — тут:
http://cgit.freedesktop.org/systemd/systemd/tree/src/login/logind-dbus.c
а systemctl как раз занимается отправкой этого dbus-сообщения [см функцию ``prepare_firmware_setup()``] — тут:
http://cgit.freedesktop.org/systemd/systemd/tree/src/systemctl/systemctl.c
Исправление user_id_68054, :
а вот пока-что ты можешь поглядеть — как реализовано это в исходниках:
http://cgit.freedesktop.org/systemd/systemd/tree/src/shared/efivars.c
int efi_set_reboot_to_firmware(bool value) {
int r;
uint64_t b, b_new;
r = get_os_indications(&b);
if (r < 0)
return r;
if (value)
b_new = b | EFI_OS_INDICATIONS_BOOT_TO_FW_UI;
else
b_new = b & ~EFI_OS_INDICATIONS_BOOT_TO_FW_UI;
/* Avoid writing to efi vars store if we can due to firmware bugs. */
if (b != b_new)
return efi_set_variable(EFI_VENDOR_GLOBAL, "OsIndications", &b_new, sizeof(uint64_t));
return 0;
}
...
static int get_os_indications(uint64_t *os_indication) {
int r;
size_t s;
_cleanup_free_ void *v = NULL;
r = efi_reboot_to_firmware_supported();
if (r < 0)
return r;
r = efi_get_variable(EFI_VENDOR_GLOBAL, "OsIndications", NULL, &v, &s);
if (r < 0)
return r;
else if (s != sizeof(uint64_t))
return -EINVAL;
*os_indication = *(uint64_t *)v;
return 0;
}
эта функция [``efi_set_reboot_to_firmware()``] выполняется, когда logind получает dbus-сообщение [см функцию ``method_set_reboot_to_firmware_setup()``] — тут:
http://cgit.freedesktop.org/systemd/systemd/tree/src/login/logind-dbus.c
а systemctl как раз занимается отправкой этого dbus-сообщения [см функцию ``prepare_firmware_setup()``] — тут:
http://cgit.freedesktop.org/systemd/systemd/tree/src/systemctl/systemctl.c
Исправление user_id_68054, :
а вот пока-что ты можешь поглядеть — как реализовано это в исходниках:
http://cgit.freedesktop.org/systemd/systemd/tree/src/shared/efivars.c
int efi_set_reboot_to_firmware(bool value) {
int r;
uint64_t b, b_new;
r = get_os_indications(&b);
if (r < 0)
return r;
if (value)
b_new = b | EFI_OS_INDICATIONS_BOOT_TO_FW_UI;
else
b_new = b & ~EFI_OS_INDICATIONS_BOOT_TO_FW_UI;
/* Avoid writing to efi vars store if we can due to firmware bugs. */
if (b != b_new)
return efi_set_variable(EFI_VENDOR_GLOBAL, "OsIndications", &b_new, sizeof(uint64_t));
return 0;
}
эта функция [``efi_set_reboot_to_firmware()``] выполняется, когда logind получает dbus-сообщение [см функцию ``method_set_reboot_to_firmware_setup()``] — тут:
http://cgit.freedesktop.org/systemd/systemd/tree/src/login/logind-dbus.c
а systemctl как раз занимается отправкой этого dbus-сообщения [см функцию ``prepare_firmware_setup()``] — тут:
http://cgit.freedesktop.org/systemd/systemd/tree/src/systemctl/systemctl.c
Исправление user_id_68054, :
а вот пока-что ты можешь поглядеть — как реализовано это в исходниках:
http://cgit.freedesktop.org/systemd/systemd/tree/src/shared/efivars.c
int efi_set_reboot_to_firmware(bool value) {
int r;
uint64_t b, b_new;
r = get_os_indications(&b);
if (r < 0)
return r;
if (value)
b_new = b | EFI_OS_INDICATIONS_BOOT_TO_FW_UI;
else
b_new = b & ~EFI_OS_INDICATIONS_BOOT_TO_FW_UI;
/* Avoid writing to efi vars store if we can due to firmware bugs. */
if (b != b_new)
return efi_set_variable(EFI_VENDOR_GLOBAL, "OsIndications", &b_new, sizeof(uint64_t));
return 0;
}
эта функция [``efi_set_reboot_to_firmware()``] выполняется, когда logind получает dbus-сообщение..
см http://cgit.freedesktop.org/systemd/systemd/tree/src/login/logind-dbus.c
а systemctl как раз занимается отправкой этого dbus-сообщения [см функцию ``prepare_firmware_setup()``] — тут:
http://cgit.freedesktop.org/systemd/systemd/tree/src/systemctl/systemctl.c
Исходная версия user_id_68054, :
а вот пока-что ты можей поглядеть — как реализовано это в исходниках:
http://cgit.freedesktop.org/systemd/systemd/tree/src/shared/efivars.c
int efi_set_reboot_to_firmware(bool value) {
int r;
uint64_t b, b_new;
r = get_os_indications(&b);
if (r < 0)
return r;
if (value)
b_new = b | EFI_OS_INDICATIONS_BOOT_TO_FW_UI;
else
b_new = b & ~EFI_OS_INDICATIONS_BOOT_TO_FW_UI;
/* Avoid writing to efi vars store if we can due to firmware bugs. */
if (b != b_new)
return efi_set_variable(EFI_VENDOR_GLOBAL, "OsIndications", &b_new, sizeof(uint64_t));
return 0;
}
эта функция [``efi_set_reboot_to_firmware()``] выполняется, когда logind получает dbus-сообщение..
см http://cgit.freedesktop.org/systemd/systemd/tree/src/login/logind-dbus.c
а systemctl как раз занимается отправкой этого dbus-сообщения [см функцию ``prepare_firmware_setup()``] — тут:
http://cgit.freedesktop.org/systemd/systemd/tree/src/systemctl/systemctl.c