static int insert_into_order(uint16_t slot, bool first) { uint16_t *order = NULL; uint16_t *new_order; int n_order; int i; int err = 0; n_order = efi_get_boot_order(&order); if (n_order <= 0) { /* no entry, add us */ err = efi_set_boot_order(&slot, 1); goto finish; } /* are we the first and only one? */ if (n_order == 1 && order[0] == slot) goto finish; /* are we already in the boot order? */ for (i = 0; i < n_order; i++) { if (order[i] != slot) continue; /* we do not require to be the first one, all is fine */ if (!first) goto finish; /* move us to the first slot */ memmove(&order[1], order, i * sizeof(uint16_t)); order[0] = slot; efi_set_boot_order(order, n_order); goto finish; } /* extend array */ new_order = realloc(order, (n_order+1) * sizeof(uint16_t)); if (!new_order) { err = -ENOMEM; goto finish; } order = new_order; /* add us to the top or end of the list */ if (first) { memmove(&order[1], order, n_order * sizeof(uint16_t)); order[0] = slot; } else order[n_order] = slot; efi_set_boot_order(order, n_order+1); finish: free(order); return err; }
static int insert_into_order(uint16_t slot, bool first) { _cleanup_free_ uint16_t *order = NULL; uint16_t *t; int n, i; n = efi_get_boot_order(&order); if (n <= 0) /* no entry, add us */ return efi_set_boot_order(&slot, 1); /* are we the first and only one? */ if (n == 1 && order[0] == slot) return 0; /* are we already in the boot order? */ for (i = 0; i < n; i++) { if (order[i] != slot) continue; /* we do not require to be the first one, all is fine */ if (!first) return 0; /* move us to the first slot */ memmove(order + 1, order, i * sizeof(uint16_t)); order[0] = slot; return efi_set_boot_order(order, n); } /* extend array */ t = realloc(order, (n + 1) * sizeof(uint16_t)); if (!t) return -ENOMEM; order = t; /* add us to the top or end of the list */ if (first) { memmove(order + 1, order, n * sizeof(uint16_t)); order[0] = slot; } else order[n] = slot; return efi_set_boot_order(order, n + 1); }
static int remove_from_order(uint16_t slot) { _cleanup_free_ uint16_t *order = NULL; int n, i; n = efi_get_boot_order(&order); if (n <= 0) return n; for (i = 0; i < n; i++) { if (order[i] != slot) continue; if (i + 1 < n) memmove(order + i, order + i+1, (n - i) * sizeof(uint16_t)); return efi_set_boot_order(order, n - 1); } return 0; }
static int remove_from_order(uint16_t slot) { _cleanup_free_ uint16_t *order = NULL; int n_order; int i; int err = 0; n_order = efi_get_boot_order(&order); if (n_order < 0) return n_order; if (n_order == 0) return 0; for (i = 0; i < n_order; i++) { if (order[i] != slot) continue; if (i+1 < n_order) memmove(&order[i], &order[i+1], (n_order - i) * sizeof(uint16_t)); efi_set_boot_order(order, n_order-1); break; } return err; }