bool simplex_phase_1(problem* prob){ /* Slack and virtual variable sets */ work_set* virtual_vars = work_set_create(prob->equality_count+prob->inequality_count); neg_equality(prob, virtual_vars); matrix* Fr = NULL; matrix* gr = NULL; convert_geq_to_leq(prob, virtual_vars, &Fr, &gr); matrix* Ft = split_ineq_variables(prob, Fr); free_matrix(Fr); matrix* Et = split_eq_variables(prob); /* Create tableau. +1 rows for objective function, +1 columns for RHS. */ matrix* tableau = get_zero_matrix(prob->inequality_count + prob->equality_count + 1, prob->variable_count*2 + prob->inequality_count + virtual_vars->count + 1); work_set* basis = create_basis(prob); insert_constraints(prob, tableau, Et, Ft, gr); free_matrix(Et); free_matrix(Ft); free_matrix(gr); insert_simplex_variables(prob, virtual_vars, tableau); work_set_free(virtual_vars); insert_objective_function(prob, tableau); remove_variables(prob, tableau); bool error = simplex_min(prob, tableau, basis); if (!error) { set_variables(prob, basis, tableau); } free_matrix(tableau); work_set_free(basis); return !error; }
static int bootctl_main(int argc, char*argv[]) { enum action { ACTION_STATUS, ACTION_INSTALL, ACTION_UPDATE, ACTION_REMOVE } arg_action = ACTION_STATUS; static const struct { const char* verb; enum action action; } verbs[] = { { "status", ACTION_STATUS }, { "install", ACTION_INSTALL }, { "update", ACTION_UPDATE }, { "remove", ACTION_REMOVE }, }; sd_id128_t uuid = {}; uint32_t part = 0; uint64_t pstart = 0, psize = 0; int r, q; if (argv[optind]) { unsigned i; for (i = 0; i < ELEMENTSOF(verbs); i++) { if (!streq(argv[optind], verbs[i].verb)) continue; arg_action = verbs[i].action; break; } if (i >= ELEMENTSOF(verbs)) { log_error("Unknown operation \"%s\"", argv[optind]); return -EINVAL; } } if (geteuid() != 0) return log_error_errno(EPERM, "Need to be root."); r = verify_esp(arg_path, &part, &pstart, &psize, &uuid); if (r == -ENODEV && !arg_path) log_notice("You might want to use --path= to indicate the path to your ESP, in case it is not mounted on /boot."); if (r < 0) return r; switch (arg_action) { case ACTION_STATUS: { _cleanup_free_ char *fw_type = NULL; _cleanup_free_ char *fw_info = NULL; _cleanup_free_ char *loader = NULL; _cleanup_free_ char *loader_path = NULL; sd_id128_t loader_part_uuid = {}; if (is_efi_boot()) { read_loader_efi_var("LoaderFirmwareType", &fw_type); read_loader_efi_var("LoaderFirmwareInfo", &fw_info); read_loader_efi_var("LoaderInfo", &loader); read_loader_efi_var("LoaderImageIdentifier", &loader_path); if (loader_path) efi_tilt_backslashes(loader_path); r = efi_loader_get_device_part_uuid(&loader_part_uuid); if (r < 0 && r == -ENOENT) log_warning_errno(r, "Failed to read EFI variable LoaderDevicePartUUID: %m"); printf("System:\n"); printf(" Firmware: %s (%s)\n", strna(fw_type), strna(fw_info)); r = is_efi_secure_boot(); if (r < 0) log_warning_errno(r, "Failed to query secure boot status: %m"); else printf(" Secure Boot: %s\n", r ? "enabled" : "disabled"); r = is_efi_secure_boot_setup_mode(); if (r < 0) log_warning_errno(r, "Failed to query secure boot mode: %m"); else printf(" Setup Mode: %s\n", r ? "setup" : "user"); printf("\n"); printf("Loader:\n"); printf(" Product: %s\n", strna(loader)); if (!sd_id128_equal(loader_part_uuid, SD_ID128_NULL)) printf(" Partition: /dev/disk/by-partuuid/%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\n", SD_ID128_FORMAT_VAL(loader_part_uuid)); else printf(" Partition: n/a\n"); printf(" File: %s%s\n", special_glyph(TREE_RIGHT), strna(loader_path)); printf("\n"); } else printf("System:\n Not booted with EFI\n"); r = status_binaries(arg_path, uuid); if (r < 0) return r; if (arg_touch_variables) r = status_variables(); break; } case ACTION_INSTALL: case ACTION_UPDATE: umask(0002); r = install_binaries(arg_path, arg_action == ACTION_INSTALL); if (r < 0) return r; if (arg_action == ACTION_INSTALL) { r = install_loader_config(arg_path); if (r < 0) return r; } if (arg_touch_variables) r = install_variables(arg_path, part, pstart, psize, uuid, "/EFI/systemd/systemd-boot" EFI_MACHINE_TYPE_NAME ".efi", arg_action == ACTION_INSTALL); break; case ACTION_REMOVE: r = remove_binaries(arg_path); if (arg_touch_variables) { q = remove_variables(uuid, "/EFI/systemd/systemd-boot" EFI_MACHINE_TYPE_NAME ".efi", true); if (q < 0 && r == 0) r = q; } break; } return r; }
static int bootctl_main(int argc, char*argv[]) { enum action { ACTION_STATUS, ACTION_INSTALL, ACTION_UPDATE, ACTION_REMOVE } arg_action = ACTION_STATUS; static const struct { const char* verb; enum action action; } verbs[] = { { "status", ACTION_STATUS }, { "install", ACTION_INSTALL }, { "update", ACTION_UPDATE }, { "remove", ACTION_REMOVE }, }; sd_id128_t uuid = {}; uint32_t part = 0; uint64_t pstart = 0; uint64_t psize = 0; unsigned int i; int q; int r; if (argv[optind]) { for (i = 0; i < ELEMENTSOF(verbs); i++) { if (!streq(argv[optind], verbs[i].verb)) continue; arg_action = verbs[i].action; break; } if (i >= ELEMENTSOF(verbs)) { fprintf(stderr, "Unknown operation %s\n", argv[optind]); r = -EINVAL; goto finish; } } if (!arg_path) arg_path = "/boot"; if (geteuid() != 0) { fprintf(stderr, "Need to be root.\n"); r = -EPERM; goto finish; } r = verify_esp(arg_path, &part, &pstart, &psize, &uuid); if (r == -ENODEV && !arg_path) fprintf(stderr, "You might want to use --path= to indicate the path to your ESP, in case it is not mounted to /boot.\n"); if (r < 0) goto finish; switch (arg_action) { case ACTION_STATUS: { _cleanup_free_ char *fw_type = NULL; _cleanup_free_ char *fw_info = NULL; _cleanup_free_ char *loader = NULL; _cleanup_free_ char *loader_path = NULL; sd_id128_t loader_part_uuid = {}; efi_get_variable_string(EFI_VENDOR_LOADER, "LoaderFirmwareType", &fw_type); efi_get_variable_string(EFI_VENDOR_LOADER, "LoaderFirmwareInfo", &fw_info); efi_get_variable_string(EFI_VENDOR_LOADER, "LoaderInfo", &loader); if (efi_get_variable_string(EFI_VENDOR_LOADER, "LoaderImageIdentifier", &loader_path) > 0) efi_tilt_backslashes(loader_path); efi_loader_get_device_part_uuid(&loader_part_uuid); printf("System:\n"); printf(" Firmware: %s (%s)\n", fw_type, strna(fw_info)); printf(" Secure Boot: %s\n", is_efi_secure_boot() ? "enabled" : "disabled"); printf(" Setup Mode: %s\n", is_efi_secure_boot_setup_mode() ? "setup" : "user"); printf("\n"); printf("Loader:\n"); printf(" Product: %s\n", strna(loader)); if (!sd_id128_equal(loader_part_uuid, SD_ID128_NULL)) printf(" Partition: /dev/disk/by-partuuid/%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\n", SD_ID128_FORMAT_VAL(loader_part_uuid)); else printf(" Partition: n/a\n"); printf(" File: %s%s\n", draw_special_char(DRAW_TREE_RIGHT), strna(loader_path)); printf("\n"); r = status_binaries(arg_path, uuid); if (r < 0) goto finish; if (arg_touch_variables) r = status_variables(); break; } case ACTION_INSTALL: case ACTION_UPDATE: umask(0002); r = install_binaries(arg_path, arg_action == ACTION_INSTALL); if (r < 0) goto finish; if (arg_action == ACTION_INSTALL) install_loader_config(arg_path); if (arg_touch_variables) r = install_variables(arg_path, part, pstart, psize, uuid, "/EFI/systemd/systemd-boot" EFI_MACHINE_TYPE_NAME ".efi", arg_action == ACTION_INSTALL); break; case ACTION_REMOVE: r = remove_binaries(arg_path); if (arg_touch_variables) { q = remove_variables(uuid, "/EFI/systemd/systemd-boot" EFI_MACHINE_TYPE_NAME ".efi", true); if (q < 0 && r == 0) r = q; } break; } finish: return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; }