Magellan Linux

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

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

revision 1866 by niro, Mon Jul 2 13:21:25 2012 UTC revision 2058 by niro, Wed Feb 20 14:06:30 2013 UTC
# Line 56  int debug = 0; /* Currently just for tem Line 56  int debug = 0; /* Currently just for tem
56  #define NOOP_OPCODE 0x90  #define NOOP_OPCODE 0x90
57  #define JMP_SHORT_OPCODE 0xeb  #define JMP_SHORT_OPCODE 0xeb
58    
59    int isEfi = 0;
60    
61  /* comments get lumped in with indention */  /* comments get lumped in with indention */
62  struct lineElement {  struct lineElement {
63      char * item;      char * item;
# Line 82  enum lineType_e { Line 84  enum lineType_e {
84      LT_MENUENTRY    = 1 << 17,      LT_MENUENTRY    = 1 << 17,
85      LT_ENTRY_END    = 1 << 18,      LT_ENTRY_END    = 1 << 18,
86      LT_SET_VARIABLE = 1 << 19,      LT_SET_VARIABLE = 1 << 19,
87      LT_UNKNOWN      = 1 << 20,      LT_KERNEL_EFI   = 1 << 20,
88        LT_INITRD_EFI   = 1 << 21,
89        LT_UNKNOWN      = 1 << 22,
90  };  };
91    
92  struct singleLine {  struct singleLine {
# Line 134  struct configFileInfo { Line 138  struct configFileInfo {
138      findConfigFunc findConfig;      findConfigFunc findConfig;
139      writeLineFunc writeLine;      writeLineFunc writeLine;
140      struct keywordTypes * keywords;      struct keywordTypes * keywords;
141        int caseInsensitive;
142      int defaultIsIndex;      int defaultIsIndex;
143      int defaultIsVariable;      int defaultIsVariable;
144      int defaultSupportSaved;      int defaultSupportSaved;
# Line 205  struct keywordTypes grub2Keywords[] = { Line 210  struct keywordTypes grub2Keywords[] = {
210      { "default",    LT_DEFAULT,     ' ' },      { "default",    LT_DEFAULT,     ' ' },
211      { "fallback",   LT_FALLBACK,    ' ' },      { "fallback",   LT_FALLBACK,    ' ' },
212      { "linux",      LT_KERNEL,      ' ' },      { "linux",      LT_KERNEL,      ' ' },
213        { "linuxefi",   LT_KERNEL_EFI,  ' ' },
214      { "initrd",     LT_INITRD,      ' ', ' ' },      { "initrd",     LT_INITRD,      ' ', ' ' },
215        { "initrdefi",  LT_INITRD_EFI,  ' ', ' ' },
216      { "module",     LT_MBMODULE,    ' ' },      { "module",     LT_MBMODULE,    ' ' },
217      { "kernel",     LT_HYPER,       ' ' },      { "kernel",     LT_HYPER,       ' ' },
218      { NULL, 0, 0 },      { NULL, 0, 0 },
# Line 271  static int isquote(char q) Line 278  static int isquote(char q)
278      return 0;      return 0;
279  }  }
280    
281    static int iskernel(enum lineType_e type) {
282        return (type == LT_KERNEL || type == LT_KERNEL_EFI);
283    }
284    
285    static int isinitrd(enum lineType_e type) {
286        return (type == LT_INITRD || type == LT_INITRD_EFI);
287    }
288    
289  char *grub2ExtractTitle(struct singleLine * line) {  char *grub2ExtractTitle(struct singleLine * line) {
290      char * current;      char * current;
291      char * current_indent;      char * current_indent;
# Line 482  struct configFileInfo ziplConfigType = { Line 497  struct configFileInfo ziplConfigType = {
497  struct configFileInfo extlinuxConfigType = {  struct configFileInfo extlinuxConfigType = {
498      .defaultConfig = "/boot/extlinux/extlinux.conf",      .defaultConfig = "/boot/extlinux/extlinux.conf",
499      .keywords = extlinuxKeywords,      .keywords = extlinuxKeywords,
500        .caseInsensitive = 1,
501      .entryStart = LT_TITLE,      .entryStart = LT_TITLE,
502      .needsBootPrefix = 1,      .needsBootPrefix = 1,
503      .maxTitleLength = 255,      .maxTitleLength = 255,
# Line 570  static char * sdupprintf(const char *for Line 586  static char * sdupprintf(const char *for
586      return buf;      return buf;
587  }  }
588    
589    static enum lineType_e preferredLineType(enum lineType_e type,
590     struct configFileInfo *cfi) {
591        if (isEfi && cfi == &grub2ConfigType) {
592     switch (type) {
593     case LT_KERNEL:
594        return LT_KERNEL_EFI;
595     case LT_INITRD:
596        return LT_INITRD_EFI;
597     default:
598        return type;
599     }
600        }
601        return type;
602    }
603    
604  static struct keywordTypes * getKeywordByType(enum lineType_e type,  static struct keywordTypes * getKeywordByType(enum lineType_e type,
605        struct configFileInfo * cfi) {        struct configFileInfo * cfi) {
606      for (struct keywordTypes *kw = cfi->keywords; kw->key; kw++) {      for (struct keywordTypes *kw = cfi->keywords; kw->key; kw++) {
# Line 603  static char * getuuidbydev(char *device) Line 634  static char * getuuidbydev(char *device)
634  static enum lineType_e getTypeByKeyword(char * keyword,  static enum lineType_e getTypeByKeyword(char * keyword,
635   struct configFileInfo * cfi) {   struct configFileInfo * cfi) {
636      for (struct keywordTypes *kw = cfi->keywords; kw->key; kw++) {      for (struct keywordTypes *kw = cfi->keywords; kw->key; kw++) {
637   if (!strcmp(keyword, kw->key))   if (cfi->caseInsensitive) {
638      return kw->type;      if (!strcasecmp(keyword, kw->key))
639                    return kw->type;
640     } else {
641        if (!strcmp(keyword, kw->key))
642            return kw->type;
643     }
644      }      }
645      return LT_UNKNOWN;      return LT_UNKNOWN;
646  }  }
# Line 994  static struct grubConfig * readConfig(co Line 1030  static struct grubConfig * readConfig(co
1030      cfg->flags &= ~GRUB_CONFIG_NO_DEFAULT;      cfg->flags &= ~GRUB_CONFIG_NO_DEFAULT;
1031      defaultLine = line;      defaultLine = line;
1032    
1033          } else if (line->type == LT_KERNEL) {          } else if (iskernel(line->type)) {
1034      /* if by some freak chance this is multiboot and the "module"      /* if by some freak chance this is multiboot and the "module"
1035       * lines came earlier in the template, make sure to use LT_HYPER       * lines came earlier in the template, make sure to use LT_HYPER
1036       * instead of LT_KERNEL now       * instead of LT_KERNEL now
# Line 1011  static struct grubConfig * readConfig(co Line 1047  static struct grubConfig * readConfig(co
1047      for (struct singleLine *l = entry->lines; l; l = l->next) {      for (struct singleLine *l = entry->lines; l; l = l->next) {
1048   if (l->type == LT_HYPER)   if (l->type == LT_HYPER)
1049      break;      break;
1050   else if (l->type == LT_KERNEL) {   else if (iskernel(l->type)) {
1051      l->type = LT_HYPER;      l->type = LT_HYPER;
1052      break;      break;
1053   }   }
# Line 1310  static int writeConfig(struct grubConfig Line 1346  static int writeConfig(struct grubConfig
1346    
1347      /* most likely the symlink is relative, so change our      /* most likely the symlink is relative, so change our
1348         directory to the dir of the symlink */         directory to the dir of the symlink */
1349              rc = chdir(dirname(strdupa(outName)));      char *dir = strdupa(outName);
1350        rc = chdir(dirname(dir));
1351      do {      do {
1352   buf = alloca(len + 1);   buf = alloca(len + 1);
1353   rc = readlink(basename(outName), buf, len);   rc = readlink(basename(outName), buf, len);
# Line 1564  int suitableImage(struct singleEntry * e Line 1601  int suitableImage(struct singleEntry * e
1601   return 0;   return 0;
1602      }      }
1603    
1604      line = getLineByType(LT_KERNEL|LT_HYPER, entry->lines);      line = getLineByType(LT_KERNEL|LT_HYPER|LT_KERNEL_EFI, entry->lines);
1605      if (!line) {      if (!line) {
1606   notSuitablePrintf(entry, "no line found\n");   notSuitablePrintf(entry, "no line found\n");
1607   return 0;   return 0;
# Line 1694  struct singleEntry * findEntryByPath(str Line 1731  struct singleEntry * findEntryByPath(str
1731   entry = findEntryByIndex(config, indexVars[i]);   entry = findEntryByIndex(config, indexVars[i]);
1732   if (!entry) return NULL;   if (!entry) return NULL;
1733    
1734   line = getLineByType(LT_KERNEL|LT_HYPER, entry->lines);   line = getLineByType(LT_KERNEL|LT_HYPER|LT_KERNEL_EFI, entry->lines);
1735   if (!line) return NULL;   if (!line) return NULL;
1736    
1737   if (index) *index = indexVars[i];   if (index) *index = indexVars[i];
# Line 1743  struct singleEntry * findEntryByPath(str Line 1780  struct singleEntry * findEntryByPath(str
1780    
1781      /* check all the lines matching checkType */      /* check all the lines matching checkType */
1782      for (line = entry->lines; line; line = line->next) {      for (line = entry->lines; line; line = line->next) {
1783   line = getLineByType(entry->multiboot && checkType == LT_KERNEL ?   enum lineType_e ct = checkType;
1784       LT_KERNEL|LT_MBMODULE|LT_HYPER :   if (entry->multiboot && checkType == LT_KERNEL)
1785       checkType, line);      ct = LT_KERNEL|LT_KERNEL_EFI|LT_MBMODULE|LT_HYPER;
1786   if (!line) break;  /* not found in this entry */   else if (checkType & LT_KERNEL)
1787        ct = checkType | LT_KERNEL_EFI;
1788     line = getLineByType(ct, line);
1789     if (!line)
1790        break;  /* not found in this entry */
1791    
1792   if (line && line->type != LT_MENUENTRY &&   if (line && line->type != LT_MENUENTRY &&
1793   line->numElements >= 2) {   line->numElements >= 2) {
# Line 1765  struct singleEntry * findEntryByPath(str Line 1806  struct singleEntry * findEntryByPath(str
1806       * non-Linux boot entries (could find netbsd etc, though, which is       * non-Linux boot entries (could find netbsd etc, though, which is
1807       * unfortunate)       * unfortunate)
1808       */       */
1809      if (line && getLineByType(LT_KERNEL|LT_HYPER, entry->lines))      if (line && getLineByType(LT_KERNEL|LT_HYPER|LT_KERNEL_EFI, entry->lines))
1810   break; /* found 'im! */   break; /* found 'im! */
1811   }   }
1812    
# Line 1954  void displayEntry(struct singleEntry * e Line 1995  void displayEntry(struct singleEntry * e
1995    
1996      printf("index=%d\n", index);      printf("index=%d\n", index);
1997    
1998      line = getLineByType(LT_KERNEL|LT_HYPER, entry->lines);      line = getLineByType(LT_KERNEL|LT_HYPER|LT_KERNEL_EFI, entry->lines);
1999      if (!line) {      if (!line) {
2000          printf("non linux entry\n");          printf("non linux entry\n");
2001          return;          return;
# Line 2019  void displayEntry(struct singleEntry * e Line 2060  void displayEntry(struct singleEntry * e
2060   printf("root=%s\n", s);   printf("root=%s\n", s);
2061      }      }
2062    
2063      line = getLineByType(LT_INITRD, entry->lines);      line = getLineByType(LT_INITRD|LT_INITRD_EFI, entry->lines);
2064    
2065      if (line && line->numElements >= 2) {      if (line && line->numElements >= 2) {
2066   if (!strncmp(prefix, line->elements[1].item, strlen(prefix)))   if (!strncmp(prefix, line->elements[1].item, strlen(prefix)))
# Line 2420  struct singleLine * addLineTmpl(struct s Line 2461  struct singleLine * addLineTmpl(struct s
2461  {  {
2462      struct singleLine * newLine = lineDup(tmplLine);      struct singleLine * newLine = lineDup(tmplLine);
2463    
2464        if (isEfi && cfi == &grub2ConfigType) {
2465     enum lineType_e old = newLine->type;
2466     newLine->type = preferredLineType(newLine->type, cfi);
2467     if (old != newLine->type)
2468        newLine->elements[0].item = getKeyByType(newLine->type, cfi);
2469        }
2470    
2471      if (val) {      if (val) {
2472   /* override the inherited value with our own.   /* override the inherited value with our own.
2473   * This is a little weak because it only applies to elements[1]   * This is a little weak because it only applies to elements[1]
# Line 2429  struct singleLine * addLineTmpl(struct s Line 2477  struct singleLine * addLineTmpl(struct s
2477   insertElement(newLine, val, 1, cfi);   insertElement(newLine, val, 1, cfi);
2478    
2479   /* but try to keep the rootspec from the template... sigh */   /* but try to keep the rootspec from the template... sigh */
2480   if (tmplLine->type & (LT_HYPER|LT_KERNEL|LT_MBMODULE|LT_INITRD)) {   if (tmplLine->type & (LT_HYPER|LT_KERNEL|LT_MBMODULE|LT_INITRD|LT_KERNEL_EFI|LT_INITRD_EFI)) {
2481      char * rootspec = getRootSpecifier(tmplLine->elements[1].item);      char * rootspec = getRootSpecifier(tmplLine->elements[1].item);
2482      if (rootspec != NULL) {      if (rootspec != NULL) {
2483   free(newLine->elements[1].item);   free(newLine->elements[1].item);
# Line 2466  struct singleLine *  addLine(struct sing Line 2514  struct singleLine *  addLine(struct sing
2514      /* NB: This function shouldn't allocate items on the heap, rather on the      /* NB: This function shouldn't allocate items on the heap, rather on the
2515       * stack since it calls addLineTmpl which will make copies.       * stack since it calls addLineTmpl which will make copies.
2516       */       */
   
2517      if (type == LT_TITLE && cfi->titleBracketed) {      if (type == LT_TITLE && cfi->titleBracketed) {
2518   /* we're doing a bracketed title (zipl) */   /* we're doing a bracketed title (zipl) */
2519   tmpl.type = type;   tmpl.type = type;
# Line 2800  int updateActualImage(struct grubConfig Line 2847  int updateActualImage(struct grubConfig
2847      firstElement = 2;      firstElement = 2;
2848    
2849   } else {   } else {
2850      line = getLineByType(LT_KERNEL|LT_MBMODULE, entry->lines);      line = getLineByType(LT_KERNEL|LT_MBMODULE|LT_KERNEL_EFI, entry->lines);
2851      if (!line) {      if (!line) {
2852   /* no LT_KERNEL or LT_MBMODULE in this entry? */   /* no LT_KERNEL or LT_MBMODULE in this entry? */
2853   continue;   continue;
# Line 2965  int updateInitrd(struct grubConfig * cfg Line 3012  int updateInitrd(struct grubConfig * cfg
3012      if (!image) return 0;      if (!image) return 0;
3013    
3014      for (; (entry = findEntryByPath(cfg, image, prefix, &index)); index++) {      for (; (entry = findEntryByPath(cfg, image, prefix, &index)); index++) {
3015          kernelLine = getLineByType(LT_KERNEL, entry->lines);          kernelLine = getLineByType(LT_KERNEL|LT_KERNEL_EFI, entry->lines);
3016          if (!kernelLine) continue;          if (!kernelLine) continue;
3017    
3018          line = getLineByType(LT_INITRD, entry->lines);          line = getLineByType(LT_INITRD|LT_INITRD_EFI, entry->lines);
3019          if (line)          if (line)
3020              removeLine(entry, line);              removeLine(entry, line);
3021          if (prefix) {          if (prefix) {
# Line 2979  int updateInitrd(struct grubConfig * cfg Line 3026  int updateInitrd(struct grubConfig * cfg
3026   endLine = getLineByType(LT_ENTRY_END, entry->lines);   endLine = getLineByType(LT_ENTRY_END, entry->lines);
3027   if (endLine)   if (endLine)
3028      removeLine(entry, endLine);      removeLine(entry, endLine);
3029          line = addLine(entry, cfg->cfi, LT_INITRD, kernelLine->indent, initrd);          line = addLine(entry, cfg->cfi, preferredLineType(LT_INITRD, cfg->cfi),
3030     kernelLine->indent, initrd);
3031          if (!line)          if (!line)
3032      return 1;      return 1;
3033   if (endLine) {   if (endLine) {
# Line 3392  int addNewKernel(struct grubConfig * con Line 3440  int addNewKernel(struct grubConfig * con
3440      while (*chptr && isspace(*chptr)) chptr++;      while (*chptr && isspace(*chptr)) chptr++;
3441      if (*chptr == '#') continue;      if (*chptr == '#') continue;
3442    
3443      if (tmplLine->type == LT_KERNEL &&      if (iskernel(tmplLine->type) && tmplLine->numElements >= 2) {
     tmplLine->numElements >= 2) {  
3444   if (!template->multiboot && (needs & NEED_MB)) {   if (!template->multiboot && (needs & NEED_MB)) {
3445      /* it's not a multiboot template and this is the kernel      /* it's not a multiboot template and this is the kernel
3446       * line.  Try to be intelligent about inserting the       * line.  Try to be intelligent about inserting the
# Line 3470  int addNewKernel(struct grubConfig * con Line 3517  int addNewKernel(struct grubConfig * con
3517      /* template is multi but new is not,      /* template is multi but new is not,
3518       * insert the kernel in the first module slot       * insert the kernel in the first module slot
3519       */       */
3520      tmplLine->type = LT_KERNEL;      tmplLine->type = preferredLineType(LT_KERNEL, config->cfi);
3521      free(tmplLine->elements[0].item);      free(tmplLine->elements[0].item);
3522      tmplLine->elements[0].item =      tmplLine->elements[0].item =
3523   strdup(getKeywordByType(LT_KERNEL, config->cfi)->key);   strdup(getKeywordByType(tmplLine->type,
3524     config->cfi)->key);
3525      newLine = addLineTmpl(new, tmplLine, newLine,      newLine = addLineTmpl(new, tmplLine, newLine,
3526    newKernelPath + strlen(prefix), config->cfi);    newKernelPath + strlen(prefix),
3527      config->cfi);
3528      needs &= ~NEED_KERNEL;      needs &= ~NEED_KERNEL;
3529   } else if (needs & NEED_INITRD) {   } else if (needs & NEED_INITRD) {
3530      char *initrdVal;      char *initrdVal;
3531      /* template is multi but new is not,      /* template is multi but new is not,
3532       * insert the initrd in the second module slot       * insert the initrd in the second module slot
3533       */       */
3534      tmplLine->type = LT_INITRD;      tmplLine->type = preferredLineType(LT_INITRD, config->cfi);
3535      free(tmplLine->elements[0].item);      free(tmplLine->elements[0].item);
3536      tmplLine->elements[0].item =      tmplLine->elements[0].item =
3537   strdup(getKeywordByType(LT_INITRD, config->cfi)->key);   strdup(getKeywordByType(tmplLine->type,
3538     config->cfi)->key);
3539      initrdVal = getInitrdVal(config, prefix, tmplLine, newKernelInitrd, extraInitrds, extraInitrdCount);      initrdVal = getInitrdVal(config, prefix, tmplLine, newKernelInitrd, extraInitrds, extraInitrdCount);
3540      newLine = addLineTmpl(new, tmplLine, newLine, initrdVal, config->cfi);      newLine = addLineTmpl(new, tmplLine, newLine, initrdVal, config->cfi);
3541      free(initrdVal);      free(initrdVal);
3542      needs &= ~NEED_INITRD;      needs &= ~NEED_INITRD;
3543   }   }
3544    
3545      } else if (tmplLine->type == LT_INITRD &&      } else if (isinitrd(tmplLine->type) && tmplLine->numElements >= 2) {
        tmplLine->numElements >= 2) {  
3546   if (needs & NEED_INITRD &&   if (needs & NEED_INITRD &&
3547      new->multiboot && !template->multiboot &&      new->multiboot && !template->multiboot &&
3548      config->cfi->mbInitRdIsModule) {      config->cfi->mbInitRdIsModule) {
# Line 3547  int addNewKernel(struct grubConfig * con Line 3596  int addNewKernel(struct grubConfig * con
3596      static const char *prefix = "'Loading ";      static const char *prefix = "'Loading ";
3597      if (tmplLine->numElements > 1 &&      if (tmplLine->numElements > 1 &&
3598      strstr(tmplLine->elements[1].item, prefix) &&      strstr(tmplLine->elements[1].item, prefix) &&
3599      masterLine->next && masterLine->next->type == LT_KERNEL) {      masterLine->next &&
3600        iskernel(masterLine->next->type)) {
3601   char *newTitle = malloc(strlen(prefix) +   char *newTitle = malloc(strlen(prefix) +
3602   strlen(newKernelTitle) + 2);   strlen(newKernelTitle) + 2);
3603    
# Line 3574  int addNewKernel(struct grubConfig * con Line 3624  int addNewKernel(struct grubConfig * con
3624   */   */
3625   switch (config->cfi->entryStart) {   switch (config->cfi->entryStart) {
3626      case LT_KERNEL:      case LT_KERNEL:
3627        case LT_KERNEL_EFI:
3628   if (new->multiboot && config->cfi->mbHyperFirst) {   if (new->multiboot && config->cfi->mbHyperFirst) {
3629      /* fall through to LT_HYPER */      /* fall through to LT_HYPER */
3630   } else {   } else {
3631      newLine = addLine(new, config->cfi, LT_KERNEL,      newLine = addLine(new, config->cfi,
3632              preferredLineType(LT_KERNEL, config->cfi),
3633        config->primaryIndent,        config->primaryIndent,
3634        newKernelPath + strlen(prefix));        newKernelPath + strlen(prefix));
3635      needs &= ~NEED_KERNEL;      needs &= ~NEED_KERNEL;
# Line 3653  int addNewKernel(struct grubConfig * con Line 3705  int addNewKernel(struct grubConfig * con
3705      if (needs & NEED_KERNEL) {      if (needs & NEED_KERNEL) {
3706   newLine = addLine(new, config->cfi,   newLine = addLine(new, config->cfi,
3707    (new->multiboot && getKeywordByType(LT_MBMODULE,    (new->multiboot && getKeywordByType(LT_MBMODULE,
3708        config->cfi)) ?        config->cfi))
3709    LT_MBMODULE : LT_KERNEL,     ? LT_MBMODULE
3710     : preferredLineType(LT_KERNEL, config->cfi),
3711    config->secondaryIndent,    config->secondaryIndent,
3712    newKernelPath + strlen(prefix));    newKernelPath + strlen(prefix));
3713   needs &= ~NEED_KERNEL;   needs &= ~NEED_KERNEL;
# Line 3670  int addNewKernel(struct grubConfig * con Line 3723  int addNewKernel(struct grubConfig * con
3723   initrdVal = getInitrdVal(config, prefix, NULL, newKernelInitrd, extraInitrds, extraInitrdCount);   initrdVal = getInitrdVal(config, prefix, NULL, newKernelInitrd, extraInitrds, extraInitrdCount);
3724   newLine = addLine(new, config->cfi,   newLine = addLine(new, config->cfi,
3725    (new->multiboot && getKeywordByType(LT_MBMODULE,    (new->multiboot && getKeywordByType(LT_MBMODULE,
3726        config->cfi)) ?        config->cfi))
3727    LT_MBMODULE : LT_INITRD,     ? LT_MBMODULE
3728       : preferredLineType(LT_INITRD, config->cfi),
3729    config->secondaryIndent,    config->secondaryIndent,
3730    initrdVal);    initrdVal);
3731   free(initrdVal);   free(initrdVal);
# Line 3703  static void traceback(int signum) Line 3757  static void traceback(int signum)
3757      memset(array, '\0', sizeof (array));      memset(array, '\0', sizeof (array));
3758      size = backtrace(array, 40);      size = backtrace(array, 40);
3759    
3760      fprintf(stderr, "grubby recieved SIGSEGV!  Backtrace (%ld):\n",      fprintf(stderr, "grubby received SIGSEGV!  Backtrace (%ld):\n",
3761              (unsigned long)size);              (unsigned long)size);
3762      backtrace_symbols_fd(array, size, STDERR_FILENO);      backtrace_symbols_fd(array, size, STDERR_FILENO);
3763      exit(1);      exit(1);
# Line 3787  int main(int argc, const char ** argv) { Line 3841  int main(int argc, const char ** argv) {
3841      _("display the title of the default kernel") },      _("display the title of the default kernel") },
3842   { "elilo", 0, POPT_ARG_NONE, &configureELilo, 0,   { "elilo", 0, POPT_ARG_NONE, &configureELilo, 0,
3843      _("configure elilo bootloader") },      _("configure elilo bootloader") },
3844     { "efi", 0, POPT_ARG_NONE, &isEfi, 0,
3845        _("force grub2 stanzas to use efi") },
3846   { "extlinux", 0, POPT_ARG_NONE, &configureExtLinux, 0,   { "extlinux", 0, POPT_ARG_NONE, &configureExtLinux, 0,
3847      _("configure extlinux bootloader (from syslinux)") },      _("configure extlinux bootloader (from syslinux)") },
3848   { "grub", 0, POPT_ARG_NONE, &configureGrub, 0,   { "grub", 0, POPT_ARG_NONE, &configureGrub, 0,
# Line 3799  int main(int argc, const char ** argv) { Line 3855  int main(int argc, const char ** argv) {
3855   { "initrd", 0, POPT_ARG_STRING, &newKernelInitrd, 0,   { "initrd", 0, POPT_ARG_STRING, &newKernelInitrd, 0,
3856      _("initrd image for the new kernel"), _("initrd-path") },      _("initrd image for the new kernel"), _("initrd-path") },
3857   { "extra-initrd", 'i', POPT_ARG_STRING, NULL, 'i',   { "extra-initrd", 'i', POPT_ARG_STRING, NULL, 'i',
3858      _("auxilliary initrd image for things other than the new kernel"), _("initrd-path") },      _("auxiliary initrd image for things other than the new kernel"), _("initrd-path") },
3859   { "lilo", 0, POPT_ARG_NONE, &configureLilo, 0,   { "lilo", 0, POPT_ARG_NONE, &configureLilo, 0,
3860      _("configure lilo bootloader") },      _("configure lilo bootloader") },
3861   { "make-default", 0, 0, &makeDefault, 0,   { "make-default", 0, 0, &makeDefault, 0,
# Line 4099  int main(int argc, const char ** argv) { Line 4155  int main(int argc, const char ** argv) {
4155   if (!entry) return 0;   if (!entry) return 0;
4156   if (!suitableImage(entry, bootPrefix, 0, flags)) return 0;   if (!suitableImage(entry, bootPrefix, 0, flags)) return 0;
4157    
4158   line = getLineByType(LT_KERNEL|LT_HYPER, entry->lines);   line = getLineByType(LT_KERNEL|LT_HYPER|LT_KERNEL_EFI, entry->lines);
4159   if (!line) return 0;   if (!line) return 0;
4160    
4161          rootspec = getRootSpecifier(line->elements[1].item);          rootspec = getRootSpecifier(line->elements[1].item);

Legend:
Removed from v.1866  
changed lines
  Added in v.2058