2494 |
entry->skip = 1; |
entry->skip = 1; |
2495 |
} |
} |
2496 |
|
|
2497 |
void setDefaultImage(struct grubConfig *config, int hasNew, |
void setDefaultImage(struct grubConfig *config, int isUserSpecifiedKernelPath, |
2498 |
const char *defaultKernelPath, int newIsDefault, |
const char *defaultKernelPath, int newBootEntryIsDefault, |
2499 |
const char *prefix, int flags, int index) |
const char *prefix, int flags, int newDefaultBootEntryIndex) |
2500 |
{ |
{ |
2501 |
struct singleEntry *entry, *entry2, *newDefault; |
struct singleEntry *entry, *entry2, *newDefault; |
2502 |
int i, j; |
int i, j; |
2503 |
|
|
2504 |
if (newIsDefault) { |
if (newBootEntryIsDefault) { |
2505 |
config->defaultImage = 0; |
config->defaultImage = 0; |
2506 |
return; |
return; |
2507 |
} else if ((index >= 0) && config->cfi->defaultIsIndex) { |
} else if ((newDefaultBootEntryIndex >= 0) && config->cfi->defaultIsIndex) { |
2508 |
if (findEntryByIndex(config, index)) |
if (findEntryByIndex(config, newDefaultBootEntryIndex)) |
2509 |
config->defaultImage = index; |
config->defaultImage = newDefaultBootEntryIndex; |
2510 |
else |
else |
2511 |
config->defaultImage = -1; |
config->defaultImage = -1; |
2512 |
return; |
return; |
2534 |
|
|
2535 |
if (entry && !entry->skip) { |
if (entry && !entry->skip) { |
2536 |
/* we can preserve the default */ |
/* we can preserve the default */ |
2537 |
if (hasNew) |
if (isUserSpecifiedKernelPath) |
2538 |
config->defaultImage++; |
config->defaultImage++; |
2539 |
|
|
2540 |
/* count the number of entries erased before this one */ |
/* count the number of entries erased before this one */ |
2543 |
if (entry2->skip) |
if (entry2->skip) |
2544 |
config->defaultImage--; |
config->defaultImage--; |
2545 |
} |
} |
2546 |
} else if (hasNew) { |
} else if (isUserSpecifiedKernelPath) { |
2547 |
config->defaultImage = 0; |
config->defaultImage = 0; |
2548 |
} else { |
} else { |
2549 |
/* Either we just erased the default (or the default line was |
/* Either we just erased the default (or the default line was |
4210 |
const char *newKernelArgs, const char *newKernelInitrd, |
const char *newKernelArgs, const char *newKernelInitrd, |
4211 |
const char **extraInitrds, int extraInitrdCount, |
const char **extraInitrds, int extraInitrdCount, |
4212 |
const char *newMBKernel, const char *newMBKernelArgs, |
const char *newMBKernel, const char *newMBKernelArgs, |
4213 |
const char *newDevTreePath) |
const char *newDevTreePath, int newIndex) |
4214 |
{ |
{ |
4215 |
struct singleEntry *new; |
struct singleEntry *new, *entry, *prev = NULL; |
4216 |
struct singleLine *newLine = NULL, *tmplLine = NULL, *masterLine = NULL; |
struct singleLine *newLine = NULL, *tmplLine = NULL, *masterLine = NULL; |
4217 |
int needs; |
int needs; |
4218 |
|
char *indexs; |
4219 |
char *chptr; |
char *chptr; |
4220 |
|
int rc; |
4221 |
|
|
4222 |
if (!newKernelPath) |
if (!newKernelPath) |
4223 |
return 0; |
return 0; |
4224 |
|
|
4225 |
|
rc = asprintf(&indexs, "%d", newIndex); |
4226 |
|
if (rc < 0) |
4227 |
|
return 1; |
4228 |
|
|
4229 |
/* if the newKernelTitle is too long silently munge it into something |
/* if the newKernelTitle is too long silently munge it into something |
4230 |
* we can live with. truncating is first check, then we'll just mess with |
* we can live with. truncating is first check, then we'll just mess with |
4231 |
* it until it looks better */ |
* it until it looks better */ |
4248 |
new = malloc(sizeof(*new)); |
new = malloc(sizeof(*new)); |
4249 |
new->skip = 0; |
new->skip = 0; |
4250 |
new->multiboot = 0; |
new->multiboot = 0; |
|
new->next = config->entries; |
|
4251 |
new->lines = NULL; |
new->lines = NULL; |
4252 |
config->entries = new; |
entry = config->entries; |
4253 |
|
for (unsigned int i = 0; i < newIndex; i++) { |
4254 |
|
if (!entry) |
4255 |
|
break; |
4256 |
|
prev = entry; |
4257 |
|
entry = entry->next; |
4258 |
|
} |
4259 |
|
new->next = entry; |
4260 |
|
|
4261 |
|
if (prev) |
4262 |
|
prev->next = new; |
4263 |
|
else |
4264 |
|
config->entries = new; |
4265 |
|
|
4266 |
/* copy/update from the template */ |
/* copy/update from the template */ |
4267 |
needs = NEED_KERNEL | NEED_TITLE; |
needs = NEED_KERNEL | NEED_TITLE; |
4724 |
abort(); |
abort(); |
4725 |
} |
} |
4726 |
|
|
4727 |
if (updateImage(config, "0", prefix, newKernelArgs, NULL, |
if (updateImage(config, indexs, prefix, newKernelArgs, NULL, |
4728 |
newMBKernelArgs, NULL)) |
newMBKernelArgs, NULL)) |
4729 |
return 1; |
return 1; |
4730 |
|
|
4754 |
char *newDevTreePath = NULL; |
char *newDevTreePath = NULL; |
4755 |
char *newMBKernel = NULL; |
char *newMBKernel = NULL; |
4756 |
char *newMBKernelArgs = NULL; |
char *newMBKernelArgs = NULL; |
4757 |
|
int newIndex = 0; |
4758 |
char *removeMBKernelArgs = NULL; |
char *removeMBKernelArgs = NULL; |
4759 |
char *removeMBKernel = NULL; |
char *removeMBKernel = NULL; |
4760 |
char *bootPrefix = NULL; |
char *bootPrefix = NULL; |
4789 |
NULL}, |
NULL}, |
4790 |
{"boot-filesystem", 0, POPT_ARG_STRING, &bootPrefix, 0, |
{"boot-filesystem", 0, POPT_ARG_STRING, &bootPrefix, 0, |
4791 |
_ |
_ |
4792 |
("filestystem which contains /boot directory (for testing only)"), |
("filesystem which contains /boot directory (for testing only)"), |
4793 |
_("bootfs")}, |
_("bootfs")}, |
4794 |
#if defined(__i386__) || defined(__x86_64__) || defined (__powerpc64__) || defined (__ia64__) |
#if defined(__i386__) || defined(__x86_64__) || defined (__powerpc64__) || defined (__ia64__) |
4795 |
{"bootloader-probe", 0, POPT_ARG_NONE, &bootloaderProbe, 0, |
{"bootloader-probe", 0, POPT_ARG_NONE, &bootloaderProbe, 0, |
4861 |
{"set-default-index", 0, POPT_ARG_INT, &defaultIndex, 0, |
{"set-default-index", 0, POPT_ARG_INT, &defaultIndex, 0, |
4862 |
_("make the given entry index the default entry"), |
_("make the given entry index the default entry"), |
4863 |
_("entry-index")}, |
_("entry-index")}, |
4864 |
|
{"set-index", 0, POPT_ARG_INT, &newIndex, 0, |
4865 |
|
_("use the given index when creating a new entry"), |
4866 |
|
_("entry-index")}, |
4867 |
{"silo", 0, POPT_ARG_NONE, &configureSilo, 0, |
{"silo", 0, POPT_ARG_NONE, &configureSilo, 0, |
4868 |
_("configure silo bootloader")}, |
_("configure silo bootloader")}, |
4869 |
{"title", 0, POPT_ARG_STRING, &newKernelTitle, 0, |
{"title", 0, POPT_ARG_STRING, &newKernelTitle, 0, |
5279 |
if (addNewKernel(config, template, bootPrefix, newKernelPath, |
if (addNewKernel(config, template, bootPrefix, newKernelPath, |
5280 |
newKernelTitle, newKernelArgs, newKernelInitrd, |
newKernelTitle, newKernelArgs, newKernelInitrd, |
5281 |
(const char **)extraInitrds, extraInitrdCount, |
(const char **)extraInitrds, extraInitrdCount, |
5282 |
newMBKernel, newMBKernelArgs, newDevTreePath)) |
newMBKernel, newMBKernelArgs, newDevTreePath, |
5283 |
|
newIndex)) |
5284 |
return 1; |
return 1; |
5285 |
|
|
5286 |
if (numEntries(config) == 0) { |
if (numEntries(config) == 0) { |