Magellan Linux

Diff of /trunk/grubby/grubby.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3018 by niro, Tue Jun 27 14:37:30 2017 UTC revision 3025 by niro, Tue Jun 27 14:42:27 2017 UTC
# Line 681  struct grubConfig { Line 681  struct grubConfig {
681   int fallbackImage; /* just like defaultImage */   int fallbackImage; /* just like defaultImage */
682   int flags;   int flags;
683   struct configFileInfo *cfi;   struct configFileInfo *cfi;
684     int isModified; /* assumes only one entry added
685       per invocation of grubby */
686  };  };
687    
688  blkid_cache blkid;  blkid_cache blkid;
# Line 1300  static struct grubConfig *readConfig(con Line 1302  static struct grubConfig *readConfig(con
1302   cfg->theLines = NULL;   cfg->theLines = NULL;
1303   cfg->entries = NULL;   cfg->entries = NULL;
1304   cfg->fallbackImage = 0;   cfg->fallbackImage = 0;
1305     cfg->isModified = 0;
1306    
1307   /* copy everything we have */   /* copy everything we have */
1308   while (*head) {   while (*head) {
# Line 1709  static void writeDefault(FILE * out, cha Line 1712  static void writeDefault(FILE * out, cha
1712   fprintf(out, "%sset default=\"${saved_entry}\"\n", indent);   fprintf(out, "%sset default=\"${saved_entry}\"\n", indent);
1713   if (cfg->defaultImage >= FIRST_ENTRY_INDEX && cfg->cfi->setEnv) {   if (cfg->defaultImage >= FIRST_ENTRY_INDEX && cfg->cfi->setEnv) {
1714   char *title;   char *title;
1715   entry = findEntryByIndex(cfg, cfg->defaultImage);   int trueIndex, currentIndex;
1716    
1717     trueIndex = 0;
1718     currentIndex = 0;
1719    
1720     while ((entry = findEntryByIndex(cfg, currentIndex))) {
1721     if (!entry->skip) {
1722     if (trueIndex == cfg->defaultImage) {
1723     break;
1724     }
1725     trueIndex++;
1726     }
1727     currentIndex++;
1728     }
1729   line = getLineByType(LT_MENUENTRY, entry->lines);   line = getLineByType(LT_MENUENTRY, entry->lines);
1730   if (!line)   if (!line)
1731   line = getLineByType(LT_TITLE, entry->lines);   line = getLineByType(LT_TITLE, entry->lines);
# Line 2436  struct singleEntry *findTemplate(struct Line 2452  struct singleEntry *findTemplate(struct
2452   index = 0;   index = 0;
2453   while ((entry = findEntryByIndex(cfg, index))) {   while ((entry = findEntryByIndex(cfg, index))) {
2454   if (suitableImage(entry, prefix, skipRemoved, flags)) {   if (suitableImage(entry, prefix, skipRemoved, flags)) {
2455   int j;   int j, unmodifiedIndex;
2456   for (j = 0; j < index; j++) {  
2457     unmodifiedIndex = index;
2458    
2459     for (j = 0; j < unmodifiedIndex; j++) {
2460   entry2 = findEntryByIndex(cfg, j);   entry2 = findEntryByIndex(cfg, j);
2461   if (entry2->skip)   if (entry2->skip)
2462   index--;   index--;
# Line 2498  void markRemovedImage(struct grubConfig Line 2517  void markRemovedImage(struct grubConfig
2517   entry->skip = 1;   entry->skip = 1;
2518  }  }
2519    
2520  void setDefaultImage(struct grubConfig *config, int isUserSpecifiedKernelPath,  void setDefaultImage(struct grubConfig *config, int isAddingBootEntry,
2521       const char *defaultKernelPath, int newBootEntryIsDefault,       const char *defaultKernelPath, int newBootEntryIsDefault,
2522       const char *prefix, int flags, int newDefaultBootEntryIndex)       const char *prefix, int flags,
2523         int newDefaultBootEntryIndex, int newBootEntryIndex)
2524  {  {
2525   struct singleEntry *entry, *entry2, *newDefault;   struct singleEntry *bootEntry, *newDefault;
2526   int i, j;   int indexToVerify, firstKernelEntryIndex, currentLookupIndex;
2527    
2528     /* handle the two cases where the user explictly picks the default
2529     * boot entry index as it would exist post-modification */
2530    
2531     /* Case 1: user chose to make the latest boot entry the default */
2532   if (newBootEntryIsDefault) {   if (newBootEntryIsDefault) {
2533   config->defaultImage = FIRST_ENTRY_INDEX;   config->defaultImage = newBootEntryIndex;
2534   return;   return;
2535   } else if ((newDefaultBootEntryIndex >= 0) && config->cfi->defaultIsIndex) {   }
2536   if (findEntryByIndex(config, newDefaultBootEntryIndex))  
2537     /* Case 2: user picked an arbitrary index as the default boot entry */
2538     if (newDefaultBootEntryIndex >= FIRST_ENTRY_INDEX
2539        && config->cfi->defaultIsIndex) {
2540     indexToVerify = newDefaultBootEntryIndex;
2541    
2542     /* user chose to make latest boot entry the default */
2543     if (newDefaultBootEntryIndex == newBootEntryIndex) {
2544     config->defaultImage = newBootEntryIndex;
2545     return;
2546     }
2547    
2548     /* the user picks the default index based on the
2549     * order of the bootloader configuration after
2550     * modification; ensure we are checking for the
2551     * existence of the correct entry */
2552     if (newBootEntryIndex < newDefaultBootEntryIndex) {
2553     if (!config->isModified)
2554     indexToVerify--;
2555     }
2556    
2557     /* verify the user selected index will exist */
2558     if (findEntryByIndex(config, indexToVerify)) {
2559   config->defaultImage = newDefaultBootEntryIndex;   config->defaultImage = newDefaultBootEntryIndex;
2560   else   } else {
2561   config->defaultImage = NO_DEFAULT_ENTRY;   config->defaultImage = NO_DEFAULT_ENTRY;
2562     }
2563    
2564   return;   return;
2565   } else if (defaultKernelPath) {   }
2566   i = 0;  
2567   if (findEntryByPath(config, defaultKernelPath, prefix, &i)) {   /* handle cases where the index value may shift */
2568   config->defaultImage = i;  
2569   } else {   /* check validity of existing default or first-entry-found
2570       selection */
2571     if (defaultKernelPath) {
2572     /* user requested first-entry-found */
2573     if (!findEntryByPath(config, defaultKernelPath,
2574         prefix, &firstKernelEntryIndex)) {
2575     /* don't change default if can't find match */
2576   config->defaultImage = NO_DEFAULT_ENTRY;   config->defaultImage = NO_DEFAULT_ENTRY;
2577   return;   return;
2578   }   }
  }  
2579    
2580   /* defaultImage now points to what we'd like to use, but before any   config->defaultImage = firstKernelEntryIndex;
  * order changes */  
  if ((config->defaultImage == DEFAULT_SAVED) ||  
     (config->defaultImage == DEFAULT_SAVED_GRUB2))  
  /* default is set to saved, we don't want to change it */  
  return;  
2581    
2582   if (config->defaultImage >= FIRST_ENTRY_INDEX)   /* this is where we start looking for decrement later */
2583   entry = findEntryByIndex(config, config->defaultImage);   currentLookupIndex = config->defaultImage;
  else  
  entry = NULL;  
2584    
2585   if (entry && !entry->skip) {   if (isAddingBootEntry && !config->isModified &&
2586   /* we can preserve the default */      (newBootEntryIndex < config->defaultImage)) {
2587   if (isUserSpecifiedKernelPath)   /* increment because new entry added before default */
2588   config->defaultImage++;   config->defaultImage++;
   
  /* count the number of entries erased before this one */  
  for (j = 0; j < config->defaultImage; j++) {  
  entry2 = findEntryByIndex(config, j);  
  if (entry2->skip)  
  config->defaultImage--;  
2589   }   }
  } else if (isUserSpecifiedKernelPath) {  
  config->defaultImage = FIRST_ENTRY_INDEX;  
2590   } else {   } else {
2591   /* Either we just erased the default (or the default line was   /* use pre-existing default entry */
2592   * bad to begin with) and didn't put a new one in. We'll use   currentLookupIndex = config->defaultImage;
2593   * the first valid image. */  
2594     if (isAddingBootEntry
2595        && (newBootEntryIndex <= config->defaultImage)) {
2596     config->defaultImage++;
2597    
2598     if (config->isModified) {
2599     currentLookupIndex++;
2600     }
2601     }
2602     }
2603    
2604     /* sanity check - is this entry index valid? */
2605     bootEntry = findEntryByIndex(config, currentLookupIndex);
2606    
2607     if ((bootEntry && bootEntry->skip) || !bootEntry) {
2608     /* entry is to be skipped or is invalid */
2609     if (isAddingBootEntry) {
2610     config->defaultImage = newBootEntryIndex;
2611     return;
2612     }
2613   newDefault =   newDefault =
2614      findTemplate(config, prefix, &config->defaultImage, 1,      findTemplate(config, prefix, &config->defaultImage, 1,
2615   flags);   flags);
2616   if (!newDefault)   if (!newDefault) {
2617   config->defaultImage = NO_DEFAULT_ENTRY;   config->defaultImage = NO_DEFAULT_ENTRY;
2618     }
2619    
2620     return;
2621     }
2622    
2623     currentLookupIndex--;
2624    
2625     /* decrement index by the total number of entries deleted */
2626    
2627     for (indexToVerify = currentLookupIndex;
2628         indexToVerify >= FIRST_ENTRY_INDEX; indexToVerify--) {
2629    
2630     bootEntry = findEntryByIndex(config, indexToVerify);
2631    
2632     if (bootEntry && bootEntry->skip) {
2633     config->defaultImage--;
2634     }
2635   }   }
2636  }  }
2637    
# Line 4729  int addNewKernel(struct grubConfig *conf Line 4803  int addNewKernel(struct grubConfig *conf
4803   }   }
4804    
4805   if (updateImage(config, indexs, prefix, newKernelArgs, NULL,   if (updateImage(config, indexs, prefix, newKernelArgs, NULL,
4806   newMBKernelArgs, NULL))   newMBKernelArgs, NULL)) {
4807     config->isModified = 1;
4808   return 1;   return 1;
4809     }
4810    
4811   return 0;   return 0;
4812  }  }
# Line 5263  int main(int argc, const char **argv) Line 5339  int main(int argc, const char **argv)
5339   markRemovedImage(config, removeKernelPath, bootPrefix);   markRemovedImage(config, removeKernelPath, bootPrefix);
5340   markRemovedImage(config, removeMBKernel, bootPrefix);   markRemovedImage(config, removeMBKernel, bootPrefix);
5341   setDefaultImage(config, newKernelPath != NULL, defaultKernel,   setDefaultImage(config, newKernelPath != NULL, defaultKernel,
5342   makeDefault, bootPrefix, flags, defaultIndex);   makeDefault, bootPrefix, flags, defaultIndex,
5343     newIndex);
5344   setFallbackImage(config, newKernelPath != NULL);   setFallbackImage(config, newKernelPath != NULL);
5345   if (updateImage(config, updateKernelPath, bootPrefix, newKernelArgs,   if (updateImage(config, updateKernelPath, bootPrefix, newKernelArgs,
5346   removeArgs, newMBKernelArgs, removeMBKernelArgs))   removeArgs, newMBKernelArgs, removeMBKernelArgs))

Legend:
Removed from v.3018  
changed lines
  Added in v.3025