Magellan Linux

Diff of /tags/grubby-8_40_20200707/grubby.c

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

revision 3002 by niro, Tue Jun 27 14:11:58 2017 UTC revision 3018 by niro, Tue Jun 27 14:37:30 2017 UTC
# Line 75  struct lineElement { Line 75  struct lineElement {
75  };  };
76    
77  enum lineType_e {  enum lineType_e {
78     LT_UNIDENTIFIED = 0,
79   LT_WHITESPACE = 1 << 0,   LT_WHITESPACE = 1 << 0,
80   LT_TITLE = 1 << 1,   LT_TITLE = 1 << 1,
81   LT_KERNEL = 1 << 2,   LT_KERNEL = 1 << 2,
# Line 131  struct singleEntry { Line 132  struct singleEntry {
132  #define NEED_DEVTREE (1 << 6)  #define NEED_DEVTREE (1 << 6)
133    
134  #define MAIN_DEFAULT    (1 << 0)  #define MAIN_DEFAULT    (1 << 0)
135    #define FIRST_ENTRY_INDEX    0 /* boot entry index value begin and increment
136       from this initial value */
137    #define NO_DEFAULT_ENTRY    -1 /* indicates that no specific default boot
138       entry was set or currently exists */
139  #define DEFAULT_SAVED       -2  #define DEFAULT_SAVED       -2
140  #define DEFAULT_SAVED_GRUB2 -3  #define DEFAULT_SAVED_GRUB2 -3
141    
# Line 750  static char *sdupprintf(const char *form Line 755  static char *sdupprintf(const char *form
755   return buf;   return buf;
756  }  }
757    
758    static inline int
759    kwcmp(struct keywordTypes *kw, const char * label, int case_insensitive)
760    {
761        int kwl = strlen(kw->key);
762        int ll = strlen(label);
763        int rc;
764        int (*snc)(const char *s1, const char *s2, size_t n) =
765               case_insensitive ? strncasecmp : strncmp;
766        int (*sc)(const char *s1, const char *s2) =
767               case_insensitive ? strcasecmp : strcmp;
768    
769        rc = snc(kw->key, label, kwl);
770        if (rc)
771           return rc;
772    
773        for (int i = kwl; i < ll; i++) {
774           if (isspace(label[i]))
775               return 0;
776           if (kw->separatorChar && label[i] == kw->separatorChar)
777               return 0;
778           else if (kw->nextChar && label[i] == kw->nextChar)
779               return 0;
780           return sc(kw->key+kwl, label+kwl);
781        }
782        return 0;
783    }
784    
785  static enum lineType_e preferredLineType(enum lineType_e type,  static enum lineType_e preferredLineType(enum lineType_e type,
786   struct configFileInfo *cfi)   struct configFileInfo *cfi)
787  {  {
# Line 815  static enum lineType_e getTypeByKeyword( Line 847  static enum lineType_e getTypeByKeyword(
847   struct configFileInfo *cfi)   struct configFileInfo *cfi)
848  {  {
849   for (struct keywordTypes * kw = cfi->keywords; kw->key; kw++) {   for (struct keywordTypes * kw = cfi->keywords; kw->key; kw++) {
850   if (cfi->caseInsensitive) {   if (!kwcmp(kw, keyword, cfi->caseInsensitive))
851   if (!strcasecmp(keyword, kw->key))   return kw->type;
  return kw->type;  
  } else {  
  if (!strcmp(keyword, kw->key))  
  return kw->type;  
  }  
852   }   }
853   return LT_UNKNOWN;   return LT_UNKNOWN;
854  }  }
# Line 916  static int readFile(int fd, char **bufPt Line 943  static int readFile(int fd, char **bufPt
943    
944  static void lineInit(struct singleLine *line)  static void lineInit(struct singleLine *line)
945  {  {
946     line->type = LT_UNIDENTIFIED;
947   line->indent = NULL;   line->indent = NULL;
948   line->elements = NULL;   line->elements = NULL;
949   line->numElements = 0;   line->numElements = 0;
# Line 998  static int lineWrite(FILE * out, struct Line 1026  static int lineWrite(FILE * out, struct
1026    
1027   if (fprintf(out, "%s", line->elements[i].item) == -1)   if (fprintf(out, "%s", line->elements[i].item) == -1)
1028   return -1;   return -1;
1029   if (i < line->numElements - 1)   if (i < line->numElements - 1 || line->type == LT_SET_VARIABLE)
1030   if (fprintf(out, "%s", line->elements[i].indent) == -1)   if (fprintf(out, "%s", line->elements[i].indent) == -1)
1031   return -1;   return -1;
1032   }   }
# Line 1053  static int getNextLine(char **bufPtr, st Line 1081  static int getNextLine(char **bufPtr, st
1081   break;   break;
1082   chptr++;   chptr++;
1083   }   }
1084     if (line->type == LT_UNIDENTIFIED)
1085     line->type = getTypeByKeyword(start, cfi);
1086   element->item = strndup(start, chptr - start);   element->item = strndup(start, chptr - start);
1087   start = chptr;   start = chptr;
1088    
# Line 1118  static int getNextLine(char **bufPtr, st Line 1148  static int getNextLine(char **bufPtr, st
1148   line->type = LT_WHITESPACE;   line->type = LT_WHITESPACE;
1149   line->numElements = 0;   line->numElements = 0;
1150   }   }
1151   } else {   } else if (line->type == LT_INITRD) {
1152   struct keywordTypes *kw;   struct keywordTypes *kw;
1153    
1154   kw = getKeywordByType(line->type, cfi);   kw = getKeywordByType(line->type, cfi);
# Line 1180  static int getNextLine(char **bufPtr, st Line 1210  static int getNextLine(char **bufPtr, st
1210   }   }
1211   }   }
1212   }   }
1213     } else if (line->type == LT_SET_VARIABLE) {
1214     /* and if it's a "set blah=" we need to split it
1215     * yet a third way to avoid rhbz# XXX FIXME :/
1216     */
1217     char *eq;
1218     int l;
1219     int numElements = line->numElements;
1220     struct lineElement *newElements;
1221     eq = strchr(line->elements[1].item, '=');
1222     if (!eq)
1223     return 0;
1224     l = eq - line->elements[1].item;
1225     if (eq[1] != 0)
1226     numElements++;
1227     newElements = calloc(numElements,sizeof (*newElements));
1228     memcpy(&newElements[0], &line->elements[0],
1229           sizeof (newElements[0]));
1230     newElements[1].item =
1231     strndup(line->elements[1].item, l);
1232     newElements[1].indent = "=";
1233     *(eq++) = '\0';
1234     newElements[2].item = strdup(eq);
1235     free(line->elements[1].item);
1236     if (line->elements[1].indent)
1237     newElements[2].indent = line->elements[1].indent;
1238     for (int i = 2; i < line->numElements; i++) {
1239     newElements[i+1].item = line->elements[i].item;
1240     newElements[i+1].indent =
1241     line->elements[i].indent;
1242     }
1243     free(line->elements);
1244     line->elements = newElements;
1245     line->numElements = numElements;
1246   }   }
1247   }   }
1248    
# Line 1285  static struct grubConfig *readConfig(con Line 1348  static struct grubConfig *readConfig(con
1348      getKeywordByType(LT_DEFAULT, cfi);      getKeywordByType(LT_DEFAULT, cfi);
1349   if (kwType && line->numElements == 3   if (kwType && line->numElements == 3
1350      && !strcmp(line->elements[1].item, kwType->key)      && !strcmp(line->elements[1].item, kwType->key)
1351      && !is_special_grub2_variable(line->elements[2].      && !is_special_grub2_variable(
1352    item)) {   line->elements[2].item)) {
1353   dbgPrintf("Line sets default config\n");   dbgPrintf("Line sets default config\n");
1354   cfg->flags &= ~GRUB_CONFIG_NO_DEFAULT;   cfg->flags &= ~GRUB_CONFIG_NO_DEFAULT;
1355   defaultLine = line;   defaultLine = line;
1356   }   }
   
1357   } else if (iskernel(line->type)) {   } else if (iskernel(line->type)) {
1358   /* if by some freak chance this is multiboot and the   /* if by some freak chance this is multiboot and the
1359   * "module" lines came earlier in the template, make   * "module" lines came earlier in the template, make
# Line 1545  static struct grubConfig *readConfig(con Line 1607  static struct grubConfig *readConfig(con
1607   }   }
1608   }   }
1609   } else if (cfi->defaultIsVariable) {   } else if (cfi->defaultIsVariable) {
1610   char *value = defaultLine->elements[2].item;   if (defaultLine->numElements == 2) {
1611   while (*value && (*value == '"' || *value == '\'' ||   char *value = defaultLine->elements[1].item + 8;
1612    *value == ' ' || *value == '\t'))   while (*value && (*value == '"' ||
1613   value++;    *value == '\'' ||
1614   cfg->defaultImage = strtol(value, &end, 10);    *value == ' ' ||
1615   while (*end && (*end == '"' || *end == '\'' ||    *value == '\t'))
1616   *end == ' ' || *end == '\t'))   value++;
1617   end++;   cfg->defaultImage = strtol(value, &end, 10);
1618   if (*end)   while (*end && (*end == '"' || *end == '\'' ||
1619   cfg->defaultImage = -1;   *end == ' ' || *end == '\t'))
1620     end++;
1621     if (*end)
1622     cfg->defaultImage = NO_DEFAULT_ENTRY;
1623     } else if (defaultLine->numElements == 3) {
1624     char *value = defaultLine->elements[2].item;
1625     while (*value && (*value == '"' ||
1626      *value == '\'' ||
1627      *value == ' ' ||
1628      *value == '\t'))
1629     value++;
1630     cfg->defaultImage = strtol(value, &end, 10);
1631     while (*end && (*end == '"' || *end == '\'' ||
1632     *end == ' ' || *end == '\t'))
1633     end++;
1634     if (*end)
1635     cfg->defaultImage = NO_DEFAULT_ENTRY;
1636     }
1637   } else if (cfi->defaultSupportSaved &&   } else if (cfi->defaultSupportSaved &&
1638     !strncmp(defaultLine->elements[1].item, "saved",     !strncmp(defaultLine->elements[1].item, "saved",
1639      5)) {      5)) {
# Line 1563  static struct grubConfig *readConfig(con Line 1642  static struct grubConfig *readConfig(con
1642   cfg->defaultImage =   cfg->defaultImage =
1643      strtol(defaultLine->elements[1].item, &end, 10);      strtol(defaultLine->elements[1].item, &end, 10);
1644   if (*end)   if (*end)
1645   cfg->defaultImage = -1;   cfg->defaultImage = NO_DEFAULT_ENTRY;
1646   } else if (defaultLine->numElements >= 2) {   } else if (defaultLine->numElements >= 2) {
1647   int i = 0;   int i = 0;
1648   while ((entry = findEntryByIndex(cfg, i))) {   while ((entry = findEntryByIndex(cfg, i))) {
# Line 1591  static struct grubConfig *readConfig(con Line 1670  static struct grubConfig *readConfig(con
1670   if (entry) {   if (entry) {
1671   cfg->defaultImage = i;   cfg->defaultImage = i;
1672   } else {   } else {
1673   cfg->defaultImage = -1;   cfg->defaultImage = NO_DEFAULT_ENTRY;
1674   }   }
1675   }   }
1676   } else if (cfg->cfi->defaultIsSaved && cfg->cfi->getEnv) {   } else if (cfg->cfi->defaultIsSaved && cfg->cfi->getEnv) {
# Line 1608  static struct grubConfig *readConfig(con Line 1687  static struct grubConfig *readConfig(con
1687   cfg->defaultImage = index;   cfg->defaultImage = index;
1688   }   }
1689   } else {   } else {
1690   cfg->defaultImage = 0;   cfg->defaultImage = FIRST_ENTRY_INDEX;
1691   }   }
1692    
1693   return cfg;   return cfg;
# Line 1628  static void writeDefault(FILE * out, cha Line 1707  static void writeDefault(FILE * out, cha
1707   fprintf(out, "%sdefault%ssaved\n", indent, separator);   fprintf(out, "%sdefault%ssaved\n", indent, separator);
1708   else if (cfg->cfi->defaultIsSaved) {   else if (cfg->cfi->defaultIsSaved) {
1709   fprintf(out, "%sset default=\"${saved_entry}\"\n", indent);   fprintf(out, "%sset default=\"${saved_entry}\"\n", indent);
1710   if (cfg->defaultImage >= 0 && cfg->cfi->setEnv) {   if (cfg->defaultImage >= FIRST_ENTRY_INDEX && cfg->cfi->setEnv) {
1711   char *title;   char *title;
1712   entry = findEntryByIndex(cfg, cfg->defaultImage);   entry = findEntryByIndex(cfg, cfg->defaultImage);
1713   line = getLineByType(LT_MENUENTRY, entry->lines);   line = getLineByType(LT_MENUENTRY, entry->lines);
# Line 1641  static void writeDefault(FILE * out, cha Line 1720  static void writeDefault(FILE * out, cha
1720   "saved_entry", title);   "saved_entry", title);
1721   }   }
1722   }   }
1723   } else if (cfg->defaultImage > -1) {   } else if (cfg->defaultImage >= FIRST_ENTRY_INDEX) {
1724   if (cfg->cfi->defaultIsIndex) {   if (cfg->cfi->defaultIsIndex) {
1725   if (cfg->cfi->defaultIsVariable) {   if (cfg->cfi->defaultIsVariable) {
1726   fprintf(out, "%sset default=\"%d\"\n", indent,   fprintf(out, "%sset default=\"%d\"\n", indent,
# Line 2345  struct singleEntry *findTemplate(struct Line 2424  struct singleEntry *findTemplate(struct
2424   }   }
2425   }   }
2426   }   }
2427   } else if (cfg->defaultImage > -1) {   } else if (cfg->defaultImage >= FIRST_ENTRY_INDEX) {
2428   entry = findEntryByIndex(cfg, cfg->defaultImage);   entry = findEntryByIndex(cfg, cfg->defaultImage);
2429   if (entry && suitableImage(entry, prefix, skipRemoved, flags)) {   if (entry && suitableImage(entry, prefix, skipRemoved, flags)) {
2430   if (indexPtr)   if (indexPtr)
# Line 2419  void markRemovedImage(struct grubConfig Line 2498  void markRemovedImage(struct grubConfig
2498   entry->skip = 1;   entry->skip = 1;
2499  }  }
2500    
2501  void setDefaultImage(struct grubConfig *config, int hasNew,  void setDefaultImage(struct grubConfig *config, int isUserSpecifiedKernelPath,
2502       const char *defaultKernelPath, int newIsDefault,       const char *defaultKernelPath, int newBootEntryIsDefault,
2503       const char *prefix, int flags, int index)       const char *prefix, int flags, int newDefaultBootEntryIndex)
2504  {  {
2505   struct singleEntry *entry, *entry2, *newDefault;   struct singleEntry *entry, *entry2, *newDefault;
2506   int i, j;   int i, j;
2507    
2508   if (newIsDefault) {   if (newBootEntryIsDefault) {
2509   config->defaultImage = 0;   config->defaultImage = FIRST_ENTRY_INDEX;
2510   return;   return;
2511   } else if ((index >= 0) && config->cfi->defaultIsIndex) {   } else if ((newDefaultBootEntryIndex >= 0) && config->cfi->defaultIsIndex) {
2512   if (findEntryByIndex(config, index))   if (findEntryByIndex(config, newDefaultBootEntryIndex))
2513   config->defaultImage = index;   config->defaultImage = newDefaultBootEntryIndex;
2514   else   else
2515   config->defaultImage = -1;   config->defaultImage = NO_DEFAULT_ENTRY;
2516   return;   return;
2517   } else if (defaultKernelPath) {   } else if (defaultKernelPath) {
2518   i = 0;   i = 0;
2519   if (findEntryByPath(config, defaultKernelPath, prefix, &i)) {   if (findEntryByPath(config, defaultKernelPath, prefix, &i)) {
2520   config->defaultImage = i;   config->defaultImage = i;
2521   } else {   } else {
2522   config->defaultImage = -1;   config->defaultImage = NO_DEFAULT_ENTRY;
2523   return;   return;
2524   }   }
2525   }   }
# Line 2452  void setDefaultImage(struct grubConfig * Line 2531  void setDefaultImage(struct grubConfig *
2531   /* default is set to saved, we don't want to change it */   /* default is set to saved, we don't want to change it */
2532   return;   return;
2533    
2534   if (config->defaultImage > -1)   if (config->defaultImage >= FIRST_ENTRY_INDEX)
2535   entry = findEntryByIndex(config, config->defaultImage);   entry = findEntryByIndex(config, config->defaultImage);
2536   else   else
2537   entry = NULL;   entry = NULL;
2538    
2539   if (entry && !entry->skip) {   if (entry && !entry->skip) {
2540   /* we can preserve the default */   /* we can preserve the default */
2541   if (hasNew)   if (isUserSpecifiedKernelPath)
2542   config->defaultImage++;   config->defaultImage++;
2543    
2544   /* count the number of entries erased before this one */   /* count the number of entries erased before this one */
# Line 2468  void setDefaultImage(struct grubConfig * Line 2547  void setDefaultImage(struct grubConfig *
2547   if (entry2->skip)   if (entry2->skip)
2548   config->defaultImage--;   config->defaultImage--;
2549   }   }
2550   } else if (hasNew) {   } else if (isUserSpecifiedKernelPath) {
2551   config->defaultImage = 0;   config->defaultImage = FIRST_ENTRY_INDEX;
2552   } else {   } else {
2553   /* Either we just erased the default (or the default line was   /* Either we just erased the default (or the default line was
2554   * bad to begin with) and didn't put a new one in. We'll use   * bad to begin with) and didn't put a new one in. We'll use
# Line 2478  void setDefaultImage(struct grubConfig * Line 2557  void setDefaultImage(struct grubConfig *
2557      findTemplate(config, prefix, &config->defaultImage, 1,      findTemplate(config, prefix, &config->defaultImage, 1,
2558   flags);   flags);
2559   if (!newDefault)   if (!newDefault)
2560   config->defaultImage = -1;   config->defaultImage = NO_DEFAULT_ENTRY;
2561   }   }
2562  }  }
2563    
# Line 4135  int addNewKernel(struct grubConfig *conf Line 4214  int addNewKernel(struct grubConfig *conf
4214   const char *newKernelArgs, const char *newKernelInitrd,   const char *newKernelArgs, const char *newKernelInitrd,
4215   const char **extraInitrds, int extraInitrdCount,   const char **extraInitrds, int extraInitrdCount,
4216   const char *newMBKernel, const char *newMBKernelArgs,   const char *newMBKernel, const char *newMBKernelArgs,
4217   const char *newDevTreePath)   const char *newDevTreePath, int newIndex)
4218  {  {
4219   struct singleEntry *new;   struct singleEntry *new, *entry, *prev = NULL;
4220   struct singleLine *newLine = NULL, *tmplLine = NULL, *masterLine = NULL;   struct singleLine *newLine = NULL, *tmplLine = NULL, *masterLine = NULL;
4221   int needs;   int needs;
4222     char *indexs;
4223   char *chptr;   char *chptr;
4224     int rc;
4225    
4226   if (!newKernelPath)   if (!newKernelPath)
4227   return 0;   return 0;
4228    
4229     rc = asprintf(&indexs, "%d", newIndex);
4230     if (rc < 0)
4231     return 1;
4232    
4233   /* if the newKernelTitle is too long silently munge it into something   /* if the newKernelTitle is too long silently munge it into something
4234   * 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
4235   * it until it looks better */   * it until it looks better */
# Line 4167  int addNewKernel(struct grubConfig *conf Line 4252  int addNewKernel(struct grubConfig *conf
4252   new = malloc(sizeof(*new));   new = malloc(sizeof(*new));
4253   new->skip = 0;   new->skip = 0;
4254   new->multiboot = 0;   new->multiboot = 0;
  new->next = config->entries;  
4255   new->lines = NULL;   new->lines = NULL;
4256   config->entries = new;   entry = config->entries;
4257     for (unsigned int i = 0; i < newIndex; i++) {
4258     if (!entry)
4259     break;
4260     prev = entry;
4261     entry = entry->next;
4262     }
4263     new->next = entry;
4264    
4265     if (prev)
4266     prev->next = new;
4267     else
4268     config->entries = new;
4269    
4270   /* copy/update from the template */   /* copy/update from the template */
4271   needs = NEED_KERNEL | NEED_TITLE;   needs = NEED_KERNEL | NEED_TITLE;
# Line 4632  int addNewKernel(struct grubConfig *conf Line 4728  int addNewKernel(struct grubConfig *conf
4728   abort();   abort();
4729   }   }
4730    
4731   if (updateImage(config, "0", prefix, newKernelArgs, NULL,   if (updateImage(config, indexs, prefix, newKernelArgs, NULL,
4732   newMBKernelArgs, NULL))   newMBKernelArgs, NULL))
4733   return 1;   return 1;
4734    
# Line 4662  int main(int argc, const char **argv) Line 4758  int main(int argc, const char **argv)
4758   char *newDevTreePath = NULL;   char *newDevTreePath = NULL;
4759   char *newMBKernel = NULL;   char *newMBKernel = NULL;
4760   char *newMBKernelArgs = NULL;   char *newMBKernelArgs = NULL;
4761     int newIndex = 0;
4762   char *removeMBKernelArgs = NULL;   char *removeMBKernelArgs = NULL;
4763   char *removeMBKernel = NULL;   char *removeMBKernel = NULL;
4764   char *bootPrefix = NULL;   char *bootPrefix = NULL;
# Line 4696  int main(int argc, const char **argv) Line 4793  int main(int argc, const char **argv)
4793   NULL},   NULL},
4794   {"boot-filesystem", 0, POPT_ARG_STRING, &bootPrefix, 0,   {"boot-filesystem", 0, POPT_ARG_STRING, &bootPrefix, 0,
4795   _   _
4796   ("filestystem which contains /boot directory (for testing only)"),   ("filesystem which contains /boot directory (for testing only)"),
4797   _("bootfs")},   _("bootfs")},
4798  #if defined(__i386__) || defined(__x86_64__) || defined (__powerpc64__) || defined (__ia64__)  #if defined(__i386__) || defined(__x86_64__) || defined (__powerpc64__) || defined (__ia64__)
4799   {"bootloader-probe", 0, POPT_ARG_NONE, &bootloaderProbe, 0,   {"bootloader-probe", 0, POPT_ARG_NONE, &bootloaderProbe, 0,
# Line 4768  int main(int argc, const char **argv) Line 4865  int main(int argc, const char **argv)
4865   {"set-default-index", 0, POPT_ARG_INT, &defaultIndex, 0,   {"set-default-index", 0, POPT_ARG_INT, &defaultIndex, 0,
4866   _("make the given entry index the default entry"),   _("make the given entry index the default entry"),
4867   _("entry-index")},   _("entry-index")},
4868     {"set-index", 0, POPT_ARG_INT, &newIndex, 0,
4869     _("use the given index when creating a new entry"),
4870     _("entry-index")},
4871   {"silo", 0, POPT_ARG_NONE, &configureSilo, 0,   {"silo", 0, POPT_ARG_NONE, &configureSilo, 0,
4872   _("configure silo bootloader")},   _("configure silo bootloader")},
4873   {"title", 0, POPT_ARG_STRING, &newKernelTitle, 0,   {"title", 0, POPT_ARG_STRING, &newKernelTitle, 0,
# Line 5082  int main(int argc, const char **argv) Line 5182  int main(int argc, const char **argv)
5182   struct singleEntry *entry;   struct singleEntry *entry;
5183   char *rootspec;   char *rootspec;
5184    
5185   if (config->defaultImage == -1)   if (config->defaultImage == NO_DEFAULT_ENTRY)
5186   return 0;   return 0;
5187   if (config->defaultImage == DEFAULT_SAVED_GRUB2 &&   if (config->defaultImage == DEFAULT_SAVED_GRUB2 &&
5188      cfi->defaultIsSaved)      cfi->defaultIsSaved)
5189   config->defaultImage = 0;   config->defaultImage = FIRST_ENTRY_INDEX;
5190   entry = findEntryByIndex(config, config->defaultImage);   entry = findEntryByIndex(config, config->defaultImage);
5191   if (!entry)   if (!entry)
5192   return 0;   return 0;
# Line 5109  int main(int argc, const char **argv) Line 5209  int main(int argc, const char **argv)
5209   struct singleLine *line;   struct singleLine *line;
5210   struct singleEntry *entry;   struct singleEntry *entry;
5211    
5212   if (config->defaultImage == -1)   if (config->defaultImage == NO_DEFAULT_ENTRY)
5213   return 0;   return 0;
5214   if (config->defaultImage == DEFAULT_SAVED_GRUB2 &&   if (config->defaultImage == DEFAULT_SAVED_GRUB2 &&
5215      cfi->defaultIsSaved)      cfi->defaultIsSaved)
5216   config->defaultImage = 0;   config->defaultImage = FIRST_ENTRY_INDEX;
5217   entry = findEntryByIndex(config, config->defaultImage);   entry = findEntryByIndex(config, config->defaultImage);
5218   if (!entry)   if (!entry)
5219   return 0;   return 0;
# Line 5143  int main(int argc, const char **argv) Line 5243  int main(int argc, const char **argv)
5243   return 0;   return 0;
5244    
5245   } else if (displayDefaultIndex) {   } else if (displayDefaultIndex) {
5246   if (config->defaultImage == -1)   if (config->defaultImage == NO_DEFAULT_ENTRY)
5247   return 0;   return 0;
5248   if (config->defaultImage == DEFAULT_SAVED_GRUB2 &&   if (config->defaultImage == DEFAULT_SAVED_GRUB2 &&
5249      cfi->defaultIsSaved)      cfi->defaultIsSaved)
5250   config->defaultImage = 0;   config->defaultImage = FIRST_ENTRY_INDEX;
5251   printf("%i\n", config->defaultImage);   printf("%i\n", config->defaultImage);
5252   return 0;   return 0;
5253    
# Line 5183  int main(int argc, const char **argv) Line 5283  int main(int argc, const char **argv)
5283   if (addNewKernel(config, template, bootPrefix, newKernelPath,   if (addNewKernel(config, template, bootPrefix, newKernelPath,
5284   newKernelTitle, newKernelArgs, newKernelInitrd,   newKernelTitle, newKernelArgs, newKernelInitrd,
5285   (const char **)extraInitrds, extraInitrdCount,   (const char **)extraInitrds, extraInitrdCount,
5286   newMBKernel, newMBKernelArgs, newDevTreePath))   newMBKernel, newMBKernelArgs, newDevTreePath,
5287     newIndex))
5288   return 1;   return 1;
5289    
5290   if (numEntries(config) == 0) {   if (numEntries(config) == 0) {

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