LINUX.ORG.RU

История изменений

Исправление 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