Magellan Linux

Diff of /trunk/grubby/grubby.c

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

revision 2687 by niro, Wed Jul 16 10:41:38 2014 UTC revision 2991 by niro, Thu Jun 30 10:34:31 2016 UTC
# Line 60  int debug = 0; /* Currently just for tem Line 60  int debug = 0; /* Currently just for tem
60    
61  int isEfi = 0;  int isEfi = 0;
62    
63    #if defined(__aarch64__)
64    #define isEfiOnly 1
65    #else
66    #define isEfiOnly 0
67    #endif
68    
69  char *saved_command_line = NULL;  char *saved_command_line = NULL;
70    
71  /* comments get lumped in with indention */  /* comments get lumped in with indention */
# Line 155  struct configFileInfo { Line 161  struct configFileInfo {
161      int defaultIsVariable;      int defaultIsVariable;
162      int defaultSupportSaved;      int defaultSupportSaved;
163      int defaultIsSaved;      int defaultIsSaved;
164        int defaultIsUnquoted;
165      enum lineType_e entryStart;      enum lineType_e entryStart;
166      enum lineType_e entryEnd;      enum lineType_e entryEnd;
167      int needsBootPrefix;      int needsBootPrefix;
# Line 215  struct configFileInfo grubConfigType = { Line 222  struct configFileInfo grubConfigType = {
222      .mbHyperFirst = 1,      .mbHyperFirst = 1,
223      .mbInitRdIsModule = 1,      .mbInitRdIsModule = 1,
224      .mbAllowExtraInitRds = 1,      .mbAllowExtraInitRds = 1,
225        .titlePosition = 1,
226  };  };
227    
228  struct keywordTypes grub2Keywords[] = {  struct keywordTypes grub2Keywords[] = {
# Line 444  char *grub2ExtractTitle(struct singleLin Line 452  char *grub2ExtractTitle(struct singleLin
452       * whose last character is also quote (assuming it's the closing one) */       * whose last character is also quote (assuming it's the closing one) */
453      int resultMaxSize;      int resultMaxSize;
454      char * result;      char * result;
455        /* need to ensure that ' does not match " as we search */
456        char quote_char = *current;
457            
458      resultMaxSize = sizeOfSingleLine(line);      resultMaxSize = sizeOfSingleLine(line);
459      result = malloc(resultMaxSize);      result = malloc(resultMaxSize);
# Line 457  char *grub2ExtractTitle(struct singleLin Line 467  char *grub2ExtractTitle(struct singleLin
467   current_indent_len = strlen(current_indent);   current_indent_len = strlen(current_indent);
468    
469   strncat(result, current_indent, current_indent_len);   strncat(result, current_indent, current_indent_len);
470   if (!isquote(current[current_len-1])) {   if (current[current_len-1] != quote_char) {
471      strncat(result, current, current_len);      strncat(result, current, current_len);
472   } else {   } else {
473      strncat(result, current, current_len - 1);      strncat(result, current, current_len - 1);
# Line 575  struct keywordTypes extlinuxKeywords[] = Line 585  struct keywordTypes extlinuxKeywords[] =
585      { "initrd",    LT_INITRD,      ' ', ',' },      { "initrd",    LT_INITRD,      ' ', ',' },
586      { "append",    LT_KERNELARGS,  ' ' },      { "append",    LT_KERNELARGS,  ' ' },
587      { "prompt",     LT_UNKNOWN,     ' ' },      { "prompt",     LT_UNKNOWN,     ' ' },
588        { "fdt",        LT_DEVTREE,     ' ' },
589        { "fdtdir",     LT_DEVTREE,     ' ' },
590      { NULL,    0, 0 },      { NULL,    0, 0 },
591  };  };
592  int useextlinuxmenu;  int useextlinuxmenu;
# Line 585  struct configFileInfo eliloConfigType = Line 597  struct configFileInfo eliloConfigType =
597      .needsBootPrefix = 1,      .needsBootPrefix = 1,
598      .argsInQuotes = 1,      .argsInQuotes = 1,
599      .mbConcatArgs = 1,      .mbConcatArgs = 1,
600        .titlePosition = 1,
601  };  };
602    
603  struct configFileInfo liloConfigType = {  struct configFileInfo liloConfigType = {
# Line 593  struct configFileInfo liloConfigType = { Line 606  struct configFileInfo liloConfigType = {
606      .entryStart = LT_KERNEL,      .entryStart = LT_KERNEL,
607      .argsInQuotes = 1,      .argsInQuotes = 1,
608      .maxTitleLength = 15,      .maxTitleLength = 15,
609        .titlePosition = 1,
610  };  };
611    
612  struct configFileInfo yabootConfigType = {  struct configFileInfo yabootConfigType = {
# Line 603  struct configFileInfo yabootConfigType = Line 617  struct configFileInfo yabootConfigType =
617      .argsInQuotes = 1,      .argsInQuotes = 1,
618      .maxTitleLength = 15,      .maxTitleLength = 15,
619      .mbAllowExtraInitRds = 1,      .mbAllowExtraInitRds = 1,
620        .titlePosition = 1,
621  };  };
622    
623  struct configFileInfo siloConfigType = {  struct configFileInfo siloConfigType = {
# Line 612  struct configFileInfo siloConfigType = { Line 627  struct configFileInfo siloConfigType = {
627      .needsBootPrefix = 1,      .needsBootPrefix = 1,
628      .argsInQuotes = 1,      .argsInQuotes = 1,
629      .maxTitleLength = 15,      .maxTitleLength = 15,
630        .titlePosition = 1,
631  };  };
632    
633  struct configFileInfo ziplConfigType = {  struct configFileInfo ziplConfigType = {
# Line 630  struct configFileInfo extlinuxConfigType Line 646  struct configFileInfo extlinuxConfigType
646      .needsBootPrefix = 1,      .needsBootPrefix = 1,
647      .maxTitleLength = 255,      .maxTitleLength = 255,
648      .mbAllowExtraInitRds = 1,      .mbAllowExtraInitRds = 1,
649        .defaultIsUnquoted = 1,
650        .titlePosition = 1,
651  };  };
652    
653  struct grubConfig {  struct grubConfig {
# Line 720  static enum lineType_e preferredLineType Line 738  static enum lineType_e preferredLineType
738   struct configFileInfo *cfi) {   struct configFileInfo *cfi) {
739      if (isEfi && cfi == &grub2ConfigType) {      if (isEfi && cfi == &grub2ConfigType) {
740   switch (type) {   switch (type) {
 #if defined(__aarch64__)  
741   case LT_KERNEL:   case LT_KERNEL:
742      return LT_KERNEL;      return isEfiOnly ? LT_KERNEL : LT_KERNEL_EFI;
743   case LT_INITRD:   case LT_INITRD:
744      return LT_INITRD;      return isEfiOnly ? LT_INITRD : LT_INITRD_EFI;
 #else  
  case LT_KERNEL:  
     return LT_KERNEL_EFI;  
  case LT_INITRD:  
     return LT_INITRD_EFI;  
 #endif  
745   default:   default:
746      return type;      return type;
747   }   }
# Line 825  static int isEntryStart(struct singleLin Line 836  static int isEntryStart(struct singleLin
836  }  }
837    
838  /* extract the title from within brackets (for zipl) */  /* extract the title from within brackets (for zipl) */
839  static char * extractTitle(struct singleLine * line) {  static char * extractTitle(struct grubConfig *cfg, struct singleLine * line) {
840      /* bracketed title... let's extract it (leaks a byte) */      /* bracketed title... let's extract it */
841      char * title = NULL;      char * title = NULL;
842      if (line->type == LT_TITLE) {      if (line->type == LT_TITLE) {
843   title = strdup(line->elements[0].item);   char *tmp = line->elements[cfg->cfi->titlePosition].item;
844   title++;   if (cfg->cfi->titleBracketed) {
845   *(title + strlen(title) - 1) = '\0';      tmp++;
846        title = strdup(tmp);
847        *(title + strlen(title) - 1) = '\0';
848     } else {
849        title = strdup(tmp);
850     }
851      } else if (line->type == LT_MENUENTRY)      } else if (line->type == LT_MENUENTRY)
852   title = strdup(line->elements[1].item);   title = strdup(line->elements[1].item);
853      else      else
# Line 915  static int lineWrite(FILE * out, struct Line 931  static int lineWrite(FILE * out, struct
931   /* Need to handle this, because we strip the quotes from   /* Need to handle this, because we strip the quotes from
932   * menuentry when read it. */   * menuentry when read it. */
933   if (line->type == LT_MENUENTRY && i == 1) {   if (line->type == LT_MENUENTRY && i == 1) {
934      if(!isquote(*line->elements[i].item))      if(!isquote(*line->elements[i].item)) {
935   fprintf(out, "\'%s\'", line->elements[i].item);   int substring = 0;
936      else   /* If the line contains nested quotes, we did not strip
937     * the "interna" quotes and we must use the right quotes
938     * again when writing the updated file. */
939     for (int j = i; j < line->numElements; j++) {
940        if (strchr(line->elements[i].item, '\'') != NULL) {
941           substring = 1;
942           fprintf(out, "\"%s\"", line->elements[i].item);
943           break;
944        }
945     }
946     if (!substring)
947        fprintf(out, "\'%s\'", line->elements[i].item);
948        } else {
949   fprintf(out, "%s", line->elements[i].item);   fprintf(out, "%s", line->elements[i].item);
950        }
951      fprintf(out, "%s", line->elements[i].indent);      fprintf(out, "%s", line->elements[i].indent);
952    
953      continue;      continue;
# Line 1192  static struct grubConfig * readConfig(co Line 1221  static struct grubConfig * readConfig(co
1221   cfg->flags &= ~GRUB_CONFIG_NO_DEFAULT;   cfg->flags &= ~GRUB_CONFIG_NO_DEFAULT;
1222   defaultLine = line;   defaultLine = line;
1223      }      }
  } else if (line->type == LT_DEFAULT && line->numElements == 2) {  
     cfg->flags &= ~GRUB_CONFIG_NO_DEFAULT;  
     defaultLine = line;  
1224    
1225          } else if (iskernel(line->type)) {          } else if (iskernel(line->type)) {
1226      /* if by some freak chance this is multiboot and the "module"      /* if by some freak chance this is multiboot and the "module"
1227       * lines came earlier in the template, make sure to use LT_HYPER       * lines came earlier in the template, make sure to use LT_HYPER
1228       * instead of LT_KERNEL now       * instead of LT_KERNEL now
1229       */       */
1230      if (entry->multiboot)      if (entry && entry->multiboot)
1231   line->type = LT_HYPER;   line->type = LT_HYPER;
1232    
1233          } else if (line->type == LT_MBMODULE) {          } else if (line->type == LT_MBMODULE) {
# Line 1227  static struct grubConfig * readConfig(co Line 1253  static struct grubConfig * readConfig(co
1253      cfg->fallbackImage = strtol(line->elements[1].item, &end, 10);      cfg->fallbackImage = strtol(line->elements[1].item, &end, 10);
1254      if (*end) cfg->fallbackImage = -1;      if (*end) cfg->fallbackImage = -1;
1255    
1256   } else if (line->type == LT_TITLE && line->numElements > 1) {   } else if ((line->type == LT_DEFAULT && cfi->defaultIsUnquoted) ||
1257      /* make the title a single argument (undoing our parsing) */                  (line->type == LT_TITLE && line->numElements > 1)) {
1258        /* make the title/default a single argument (undoing our parsing) */
1259      len = 0;      len = 0;
1260      for (int i = 1; i < line->numElements; i++) {      for (int i = 1; i < line->numElements; i++) {
1261   len += strlen(line->elements[i].item);   len += strlen(line->elements[i].item);
# Line 1256  static struct grubConfig * readConfig(co Line 1283  static struct grubConfig * readConfig(co
1283      len = 0;      len = 0;
1284      char *extras;      char *extras;
1285      char *title;      char *title;
1286        /* initially unseen value */
1287        char quote_char = '\0';
1288    
1289      for (int i = 1; i < line->numElements; i++) {      for (int i = 1; i < line->numElements; i++) {
1290   len += strlen(line->elements[i].item);   len += strlen(line->elements[i].item);
# Line 1272  static struct grubConfig * readConfig(co Line 1301  static struct grubConfig * readConfig(co
1301      for (int i = 0; i < line->numElements; i++) {      for (int i = 0; i < line->numElements; i++) {
1302   if (!strcmp(line->elements[i].item, "menuentry"))   if (!strcmp(line->elements[i].item, "menuentry"))
1303      continue;      continue;
1304   if (isquote(*line->elements[i].item))   if (isquote(*line->elements[i].item) && quote_char == '\0') {
1305        /* ensure we properly pair off quotes */
1306        quote_char = *line->elements[i].item;
1307      title = line->elements[i].item + 1;      title = line->elements[i].item + 1;
1308   else   } else {
1309      title = line->elements[i].item;      title = line->elements[i].item;
1310     }
1311    
1312   len = strlen(title);   len = strlen(title);
1313          if (isquote(title[len-1])) {          if (title[len-1] == quote_char) {
1314      strncat(buf, title,len-1);      strncat(buf, title,len-1);
1315      break;      break;
1316   } else {   } else {
# Line 1289  static struct grubConfig * readConfig(co Line 1321  static struct grubConfig * readConfig(co
1321    
1322      /* get extras */      /* get extras */
1323      int count = 0;      int count = 0;
1324        quote_char = '\0';
1325      for (int i = 0; i < line->numElements; i++) {      for (int i = 0; i < line->numElements; i++) {
1326   if (count >= 2) {   if (count >= 2) {
1327      strcat(extras, line->elements[i].item);      strcat(extras, line->elements[i].item);
# Line 1299  static struct grubConfig * readConfig(co Line 1332  static struct grubConfig * readConfig(co
1332      continue;      continue;
1333    
1334   /* count ' or ", there should be two in menuentry line. */   /* count ' or ", there should be two in menuentry line. */
1335   if (isquote(*line->elements[i].item))   if (isquote(*line->elements[i].item) && quote_char == '\0') {
1336        /* ensure we properly pair off quotes */
1337                quote_char = *line->elements[i].item;
1338      count++;      count++;
1339     }
1340    
1341   len = strlen(line->elements[i].item);   len = strlen(line->elements[i].item);
1342    
1343   if (isquote(line->elements[i].item[len -1]))   if (line->elements[i].item[len -1] == quote_char)
1344      count++;      count++;
1345    
1346   /* ok, we get the final ' or ", others are extras. */   /* ok, we get the final ' or ", others are extras. */
# Line 1335  static struct grubConfig * readConfig(co Line 1371  static struct grubConfig * readConfig(co
1371      }      }
1372   }   }
1373    
1374     if (line->type == LT_DEFAULT && line->numElements == 2) {
1375        cfg->flags &= ~GRUB_CONFIG_NO_DEFAULT;
1376        defaultLine = line;
1377     }
1378    
1379   /* If we find a generic config option which should live at the   /* If we find a generic config option which should live at the
1380     top of the file, move it there. Old versions of grubby were     top of the file, move it there. Old versions of grubby were
1381     probably responsible for putting new images in the wrong     probably responsible for putting new images in the wrong
# Line 1436  static struct grubConfig * readConfig(co Line 1477  static struct grubConfig * readConfig(co
1477                                  line->elements[1].item)) break;                                  line->elements[1].item)) break;
1478                  } else if (line) {                  } else if (line) {
1479                      if (!strcmp(defaultLine->elements[1].item,                      if (!strcmp(defaultLine->elements[1].item,
1480                                  extractTitle(line))) break;                                  extractTitle(cfg, line))) break;
1481                  }                  }
1482   i++;   i++;
1483   entry = NULL;   entry = NULL;
# Line 1487  static void writeDefault(FILE * out, cha Line 1528  static void writeDefault(FILE * out, cha
1528      if (!line)      if (!line)
1529   line = getLineByType(LT_TITLE, entry->lines);   line = getLineByType(LT_TITLE, entry->lines);
1530      if (line) {      if (line) {
1531   title = extractTitle(line);   title = extractTitle(cfg, line);
1532   if (title)   if (title)
1533      cfg->cfi->setEnv(cfg->cfi, "saved_entry", title);      cfg->cfi->setEnv(cfg->cfi, "saved_entry", title);
1534      }      }
# Line 1525  static void writeDefault(FILE * out, cha Line 1566  static void writeDefault(FILE * out, cha
1566              else if (line && (line->numElements == 1) &&              else if (line && (line->numElements == 1) &&
1567                       cfg->cfi->titleBracketed) {                       cfg->cfi->titleBracketed) {
1568   fprintf(out, "%sdefault%s%s\n", indent, separator,   fprintf(out, "%sdefault%s%s\n", indent, separator,
1569                          extractTitle(line));                          extractTitle(cfg, line));
1570              }              }
1571   }   }
1572      }      }
# Line 1956  struct singleEntry * findEntryByPath(str Line 1997  struct singleEntry * findEntryByPath(str
1997   }   }
1998    
1999   indexVars[i + 1] = -1;   indexVars[i + 1] = -1;
2000    
2001   i = 0;   i = 0;
2002   if (index) {   if (index) {
2003      while (i < *index) i++;      while (i < *index) {
2004      if (indexVars[i] == -1) return NULL;   i++;
2005     if (indexVars[i] == -1) return NULL;
2006        }
2007   }   }
2008    
2009   entry = findEntryByIndex(config, indexVars[i]);   entry = findEntryByIndex(config, indexVars[i]);
# Line 2114  struct singleEntry * findTemplate(struct Line 2157  struct singleEntry * findTemplate(struct
2157   } else {   } else {
2158      entry = findEntryByTitle(cfg, defTitle, &index);      entry = findEntryByTitle(cfg, defTitle, &index);
2159   }   }
2160   if (entry)   if (entry && suitableImage(entry, prefix, skipRemoved, flags)) {
2161      cfg->defaultImage = index;      cfg->defaultImage = index;
2162        if (indexPtr)
2163     *indexPtr = index;
2164        return entry;
2165     }
2166      }      }
2167   }   }
2168      } else if (cfg->defaultImage > -1) {      } else if (cfg->defaultImage > -1) {
# Line 2272  void displayEntry(struct singleEntry * e Line 2319  void displayEntry(struct singleEntry * e
2319      struct singleLine * line;      struct singleLine * line;
2320      char * root = NULL;      char * root = NULL;
2321      int i;      int i;
2322        int j;
2323    
2324      printf("index=%d\n", index);      printf("index=%d\n", index);
2325    
# Line 2359  void displayEntry(struct singleEntry * e Line 2407  void displayEntry(struct singleEntry * e
2407      } else {      } else {
2408   char * title;   char * title;
2409   line = getLineByType(LT_MENUENTRY, entry->lines);   line = getLineByType(LT_MENUENTRY, entry->lines);
2410   title = grub2ExtractTitle(line);   if (line) {
2411   if (title)      title = grub2ExtractTitle(line);
2412      printf("title=%s\n", title);      if (title)
2413     printf("title=%s\n", title);
2414     }
2415        }
2416    
2417        for (j = 0, line = entry->lines; line; line = line->next) {
2418     if ((line->type & LT_MBMODULE) && line->numElements >= 2) {
2419        if (!strncmp(prefix, line->elements[1].item, strlen(prefix)))
2420     printf("mbmodule%d=", j);
2421        else
2422     printf("mbmodule%d=%s", j, prefix);
2423    
2424        for (i = 1; i < line->numElements; i++)
2425     printf("%s%s", line->elements[i].item, line->elements[i].indent);
2426        printf("\n");
2427        j++;
2428     }
2429      }      }
2430  }  }
2431    
# Line 3284  int updateImage(struct grubConfig * cfg, Line 3348  int updateImage(struct grubConfig * cfg,
3348  }  }
3349    
3350  int addMBInitrd(struct grubConfig * cfg, const char *newMBKernel,  int addMBInitrd(struct grubConfig * cfg, const char *newMBKernel,
3351   const char * image, const char * prefix, const char * initrd) {   const char * image, const char * prefix, const char * initrd,
3352     const char * title) {
3353      struct singleEntry * entry;      struct singleEntry * entry;
3354      struct singleLine * line, * kernelLine, *endLine = NULL;      struct singleLine * line, * kernelLine, *endLine = NULL;
3355      int index = 0;      int index = 0;
3356    
3357      if (!image) return 0;      if (!image) return 0;
3358    
3359      for (; (entry = findEntryByPath(cfg, newMBKernel, prefix, &index)); index++) {      for (; (entry = findEntryByPath(cfg, image, prefix, &index)); index++) {
3360          kernelLine = getLineByType(LT_MBMODULE, entry->lines);          kernelLine = getLineByType(LT_MBMODULE, entry->lines);
3361          if (!kernelLine) continue;          if (!kernelLine) continue;
3362    
3363     /* if title is supplied, the entry's title must match it. */
3364     if (title) {
3365        char *linetitle;
3366    
3367        line = getLineByType(LT_TITLE|LT_MENUENTRY, entry->lines);
3368        if (!line)
3369     continue;
3370    
3371        linetitle = extractTitle(cfg, line);
3372        if (!linetitle)
3373     continue;
3374        if (strcmp(title, linetitle)) {
3375     free(linetitle);
3376     continue;
3377        }
3378        free(linetitle);
3379     }
3380    
3381          if (prefix) {          if (prefix) {
3382              int prefixLen = strlen(prefix);              int prefixLen = strlen(prefix);
3383              if (!strncmp(initrd, prefix, prefixLen))              if (!strncmp(initrd, prefix, prefixLen))
# Line 3320  int addMBInitrd(struct grubConfig * cfg, Line 3403  int addMBInitrd(struct grubConfig * cfg,
3403  }  }
3404    
3405  int updateInitrd(struct grubConfig * cfg, const char * image,  int updateInitrd(struct grubConfig * cfg, const char * image,
3406                   const char * prefix, const char * initrd) {                   const char * prefix, const char * initrd, const char * title) {
3407      struct singleEntry * entry;      struct singleEntry * entry;
3408      struct singleLine * line, * kernelLine, *endLine = NULL;      struct singleLine * line, * kernelLine, *endLine = NULL;
3409      int index = 0;      int index = 0;
# Line 3331  int updateInitrd(struct grubConfig * cfg Line 3414  int updateInitrd(struct grubConfig * cfg
3414          kernelLine = getLineByType(LT_KERNEL|LT_KERNEL_EFI|LT_KERNEL_16, entry->lines);          kernelLine = getLineByType(LT_KERNEL|LT_KERNEL_EFI|LT_KERNEL_16, entry->lines);
3415          if (!kernelLine) continue;          if (!kernelLine) continue;
3416    
3417     /* if title is supplied, the entry's title must match it. */
3418     if (title) {
3419        char *linetitle;
3420    
3421        line = getLineByType(LT_TITLE|LT_MENUENTRY, entry->lines);
3422        if (!line)
3423     continue;
3424    
3425        linetitle = extractTitle(cfg, line);
3426        if (!linetitle)
3427     continue;
3428        if (strcmp(title, linetitle)) {
3429     free(linetitle);
3430     continue;
3431        }
3432        free(linetitle);
3433     }
3434    
3435          line = getLineByType(LT_INITRD|LT_INITRD_EFI|LT_INITRD_16, entry->lines);          line = getLineByType(LT_INITRD|LT_INITRD_EFI|LT_INITRD_16, entry->lines);
3436          if (line)          if (line)
3437              removeLine(entry, line);              removeLine(entry, line);
# Line 4034  int addNewKernel(struct grubConfig * con Line 4135  int addNewKernel(struct grubConfig * con
4135   }   }
4136      }      }
4137    
4138        struct singleLine *endLine = NULL;
4139        endLine = getLineByType(LT_ENTRY_END, new->lines);
4140        if (endLine) {
4141        removeLine(new, endLine);
4142        needs |= NEED_END;
4143        }
4144    
4145      /* add the remainder of the lines, i.e. those that either      /* add the remainder of the lines, i.e. those that either
4146       * weren't present in the template, or in the case of no template,       * weren't present in the template, or in the case of no template,
4147       * all the lines following the entryStart.       * all the lines following the entryStart.
# Line 4092  int addNewKernel(struct grubConfig * con Line 4200  int addNewKernel(struct grubConfig * con
4200   config->secondaryIndent, NULL);   config->secondaryIndent, NULL);
4201   needs &= ~NEED_END;   needs &= ~NEED_END;
4202      }      }
4203    
4204      if (needs) {      if (needs) {
4205   printf(_("grubby: needs=%d, aborting\n"), needs);   printf(_("grubby: needs=%d, aborting\n"), needs);
4206   abort();   abort();
# Line 4103  int addNewKernel(struct grubConfig * con Line 4212  int addNewKernel(struct grubConfig * con
4212      return 0;      return 0;
4213  }  }
4214    
 static void traceback(int signum)  
 {  
     void *array[40];  
     size_t size;  
   
     signal(SIGSEGV, SIG_DFL);  
     memset(array, '\0', sizeof (array));  
     size = backtrace(array, 40);  
   
     fprintf(stderr, "grubby received SIGSEGV!  Backtrace (%ld):\n",  
             (unsigned long)size);  
     backtrace_symbols_fd(array, size, STDERR_FILENO);  
     exit(1);  
 }  
   
4215  int main(int argc, const char ** argv) {  int main(int argc, const char ** argv) {
4216      poptContext optCon;      poptContext optCon;
4217      const char * grubConfig = NULL;      const char * grubConfig = NULL;
# Line 4197  int main(int argc, const char ** argv) { Line 4291  int main(int argc, const char ** argv) {
4291      _("display the title of the default kernel") },      _("display the title of the default kernel") },
4292   { "devtree", 0, POPT_ARG_STRING, &newDevTreePath, 0,   { "devtree", 0, POPT_ARG_STRING, &newDevTreePath, 0,
4293      _("device tree file for new stanza"), _("dtb-path") },      _("device tree file for new stanza"), _("dtb-path") },
4294     { "devtreedir", 0, POPT_ARG_STRING, &newDevTreePath, 0,
4295        _("device tree directory for new stanza"), _("dtb-path") },
4296   { "elilo", 0, POPT_ARG_NONE, &configureELilo, 0,   { "elilo", 0, POPT_ARG_NONE, &configureELilo, 0,
4297      _("configure elilo bootloader") },      _("configure elilo bootloader") },
4298   { "efi", 0, POPT_ARG_NONE, &isEfi, 0,   { "efi", 0, POPT_ARG_NONE, &isEfi, 0,
# Line 4258  int main(int argc, const char ** argv) { Line 4354  int main(int argc, const char ** argv) {
4354    
4355      useextlinuxmenu=0;      useextlinuxmenu=0;
4356    
     signal(SIGSEGV, traceback);  
   
4357      int i = 0;      int i = 0;
4358      for (int j = 1; j < argc; j++)      for (int j = 1; j < argc; j++)
4359   i += strlen(argv[j]) + 1;   i += strlen(argv[j]) + 1;
# Line 4337  int main(int argc, const char ** argv) { Line 4431  int main(int argc, const char ** argv) {
4431      }      }
4432    
4433      if (!cfi) {      if (!cfi) {
4434          if (grub2FindConfig(&grub2ConfigType))          if (grub2FindConfig(&grub2ConfigType)) {
4435      cfi = &grub2ConfigType;      cfi = &grub2ConfigType;
4436   else      if (envPath)
4437     cfi->envFile = envPath;
4438            } else
4439        #ifdef __ia64__        #ifdef __ia64__
4440      cfi = &eliloConfigType;      cfi = &eliloConfigType;
4441        #elif __powerpc__        #elif __powerpc__
# Line 4381  int main(int argc, const char ** argv) { Line 4477  int main(int argc, const char ** argv) {
4477      if (newKernelPath && !newKernelTitle) {      if (newKernelPath && !newKernelTitle) {
4478   fprintf(stderr, _("grubby: kernel title must be specified\n"));   fprintf(stderr, _("grubby: kernel title must be specified\n"));
4479   return 1;   return 1;
4480      } else if (!newKernelPath && (newKernelTitle  || copyDefault ||      } else if (!newKernelPath && (copyDefault ||
4481    (newKernelInitrd && !updateKernelPath)||    (newKernelInitrd && !updateKernelPath)||
4482    makeDefault || extraInitrdCount > 0)) {    makeDefault || extraInitrdCount > 0)) {
4483   fprintf(stderr, _("grubby: kernel path expected\n"));   fprintf(stderr, _("grubby: kernel path expected\n"));
# Line 4603  int main(int argc, const char ** argv) { Line 4699  int main(int argc, const char ** argv) {
4699      if (updateKernelPath && newKernelInitrd) {      if (updateKernelPath && newKernelInitrd) {
4700      if (newMBKernel) {      if (newMBKernel) {
4701      if (addMBInitrd(config, newMBKernel, updateKernelPath,      if (addMBInitrd(config, newMBKernel, updateKernelPath,
4702   bootPrefix, newKernelInitrd))   bootPrefix, newKernelInitrd,
4703     newKernelTitle))
4704      return 1;      return 1;
4705      } else {      } else {
4706      if (updateInitrd(config, updateKernelPath, bootPrefix,      if (updateInitrd(config, updateKernelPath, bootPrefix,
4707   newKernelInitrd))   newKernelInitrd, newKernelTitle))
4708   return 1;   return 1;
4709      }      }
4710      }      }

Legend:
Removed from v.2687  
changed lines
  Added in v.2991