1792 |
int needs = MAIN_DEFAULT; |
int needs = MAIN_DEFAULT; |
1793 |
struct stat sb; |
struct stat sb; |
1794 |
int i; |
int i; |
1795 |
|
int rc = 0; |
1796 |
|
|
1797 |
if (!strcmp(outName, "-")) { |
if (!strcmp(outName, "-")) { |
1798 |
out = stdout; |
out = stdout; |
1907 |
} |
} |
1908 |
|
|
1909 |
if (tmpOutName) { |
if (tmpOutName) { |
1910 |
if (rename(tmpOutName, outName)) { |
/* write userspace buffers */ |
1911 |
fprintf(stderr, |
if (fflush(out)) |
1912 |
_("grubby: error moving %s to %s: %s\n"), |
rc = 1; |
1913 |
tmpOutName, outName, strerror(errno)); |
|
1914 |
unlink(outName); |
/* purge the write-back cache with fsync() */ |
1915 |
return 1; |
if (fsync(fileno(out))) |
1916 |
|
rc = 1; |
1917 |
|
|
1918 |
|
if (fclose(out)) |
1919 |
|
rc = 1; |
1920 |
|
|
1921 |
|
if (rc == 0 && rename(tmpOutName, outName)) { |
1922 |
|
unlink(tmpOutName); |
1923 |
|
rc = 1; |
1924 |
|
} |
1925 |
|
|
1926 |
|
/* fsync() the destination directory after rename */ |
1927 |
|
if (rc == 0) { |
1928 |
|
int dirfd; |
1929 |
|
|
1930 |
|
dirfd = open(dirname(strdupa(outName)), O_RDONLY); |
1931 |
|
if (dirfd < 0) |
1932 |
|
rc = 1; |
1933 |
|
else if (fsync(dirfd)) |
1934 |
|
rc = 1; |
1935 |
|
|
1936 |
|
if (dirfd >= 0) |
1937 |
|
close(dirfd); |
1938 |
} |
} |
1939 |
|
|
1940 |
|
if (rc == 1) |
1941 |
|
fprintf(stderr, |
1942 |
|
_("grubby: error flushing data: %m\n")); |
1943 |
} |
} |
1944 |
|
|
1945 |
return 0; |
return rc; |
1946 |
} |
} |
1947 |
|
|
1948 |
static int numEntries(struct grubConfig *cfg) |
static int numEntries(struct grubConfig *cfg) |
2552 |
struct singleEntry *bootEntry, *newDefault; |
struct singleEntry *bootEntry, *newDefault; |
2553 |
int indexToVerify, firstKernelEntryIndex, currentLookupIndex; |
int indexToVerify, firstKernelEntryIndex, currentLookupIndex; |
2554 |
|
|
2555 |
|
/* initialize */ |
2556 |
|
currentLookupIndex = FIRST_ENTRY_INDEX; |
2557 |
|
|
2558 |
/* handle the two cases where the user explictly picks the default |
/* handle the two cases where the user explictly picks the default |
2559 |
* boot entry index as it would exist post-modification */ |
* boot entry index as it would exist post-modification */ |
2560 |
|
|
2565 |
} |
} |
2566 |
|
|
2567 |
/* Case 2: user picked an arbitrary index as the default boot entry */ |
/* Case 2: user picked an arbitrary index as the default boot entry */ |
2568 |
if (newDefaultBootEntryIndex >= FIRST_ENTRY_INDEX |
if (newDefaultBootEntryIndex >= FIRST_ENTRY_INDEX) { |
|
&& config->cfi->defaultIsIndex) { |
|
2569 |
indexToVerify = newDefaultBootEntryIndex; |
indexToVerify = newDefaultBootEntryIndex; |
2570 |
|
|
2571 |
/* user chose to make latest boot entry the default */ |
/* user chose to make latest boot entry the default */ |
2598 |
/* check validity of existing default or first-entry-found |
/* check validity of existing default or first-entry-found |
2599 |
selection */ |
selection */ |
2600 |
if (defaultKernelPath) { |
if (defaultKernelPath) { |
2601 |
|
/* we must initialize this */ |
2602 |
|
firstKernelEntryIndex = 0; |
2603 |
/* user requested first-entry-found */ |
/* user requested first-entry-found */ |
2604 |
if (!findEntryByPath(config, defaultKernelPath, |
if (!findEntryByPath(config, defaultKernelPath, |
2605 |
prefix, &firstKernelEntryIndex)) { |
prefix, &firstKernelEntryIndex)) { |
2619 |
config->defaultImage++; |
config->defaultImage++; |
2620 |
} |
} |
2621 |
} else { |
} else { |
2622 |
/* use pre-existing default entry */ |
/* check to see if the default is stored in the environment */ |
2623 |
currentLookupIndex = config->defaultImage; |
if (config->defaultImage < FIRST_ENTRY_INDEX) { |
2624 |
|
if (config->defaultImage == DEFAULT_SAVED || config->defaultImage == DEFAULT_SAVED_GRUB2) |
2625 |
|
{ |
2626 |
|
if (config->cfi->defaultIsSaved) { |
2627 |
|
if (config->cfi->getEnv) { |
2628 |
|
char *defaultTitle = config->cfi->getEnv(config->cfi, "saved_entry"); |
2629 |
|
|
2630 |
|
if (defaultTitle) { |
2631 |
|
if (isnumber(defaultTitle)) { |
2632 |
|
currentLookupIndex = atoi(defaultTitle); |
2633 |
|
} else { |
2634 |
|
findEntryByTitle(config, defaultTitle, ¤tLookupIndex); |
2635 |
|
} |
2636 |
|
/* set the default Image to an actual index */ |
2637 |
|
config->defaultImage = currentLookupIndex; |
2638 |
|
} |
2639 |
|
} |
2640 |
|
} |
2641 |
|
} |
2642 |
|
} else { |
2643 |
|
/* use pre-existing default entry from the file*/ |
2644 |
|
currentLookupIndex = config->defaultImage; |
2645 |
|
} |
2646 |
|
|
2647 |
if (isAddingBootEntry |
if (isAddingBootEntry |
2648 |
&& (newBootEntryIndex <= config->defaultImage)) { |
&& (newBootEntryIndex <= config->defaultImage)) { |
2713 |
} |
} |
2714 |
} |
} |
2715 |
|
|
2716 |
void displayEntry(struct singleEntry *entry, const char *prefix, int index) |
void displayEntry(struct grubConfig *config, struct singleEntry *entry, const char *prefix, int index) |
2717 |
{ |
{ |
2718 |
struct singleLine *line; |
struct singleLine *line; |
2719 |
char *root = NULL; |
char *root = NULL; |
2809 |
|
|
2810 |
line = getLineByType(LT_TITLE, entry->lines); |
line = getLineByType(LT_TITLE, entry->lines); |
2811 |
if (line) { |
if (line) { |
2812 |
printf("title=%s\n", line->elements[1].item); |
char *entryTitle; |
2813 |
|
/* if we can extractTitle, then it's a zipl config and |
2814 |
|
* if not then we go ahead with what's existed prior */ |
2815 |
|
entryTitle = extractTitle(config, line); |
2816 |
|
if (!entryTitle) { |
2817 |
|
entryTitle=line->elements[1].item; |
2818 |
|
} |
2819 |
|
printf("title=%s\n", entryTitle); |
2820 |
} else { |
} else { |
2821 |
char *title; |
char *title; |
2822 |
line = getLineByType(LT_MENUENTRY, entry->lines); |
line = getLineByType(LT_MENUENTRY, entry->lines); |
3232 |
printf("lba\n"); |
printf("lba\n"); |
3233 |
} |
} |
3234 |
|
|
3235 |
displayEntry(entry, prefix, i); |
displayEntry(config, entry, prefix, i); |
3236 |
|
|
3237 |
i++; |
i++; |
3238 |
while ((entry = findEntryByPath(config, kernel, prefix, &i))) { |
while ((entry = findEntryByPath(config, kernel, prefix, &i))) { |
3239 |
displayEntry(entry, prefix, i); |
displayEntry(config, entry, prefix, i); |
3240 |
i++; |
i++; |
3241 |
} |
} |
3242 |
|
|