Magellan Linux

Diff of /trunk/grubby/grubby.c

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

revision 3021 by niro, Tue Jun 27 14:39:37 2017 UTC revision 3136 by niro, Tue Jul 7 11:09:37 2020 UTC
# Line 1712  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 1779  static int writeConfig(struct grubConfig Line 1792  static int writeConfig(struct grubConfig
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;
# Line 1893  static int writeConfig(struct grubConfig Line 1907  static int writeConfig(struct grubConfig
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)
# Line 2439  struct singleEntry *findTemplate(struct Line 2479  struct singleEntry *findTemplate(struct
2479   index = 0;   index = 0;
2480   while ((entry = findEntryByIndex(cfg, index))) {   while ((entry = findEntryByIndex(cfg, index))) {
2481   if (suitableImage(entry, prefix, skipRemoved, flags)) {   if (suitableImage(entry, prefix, skipRemoved, flags)) {
2482   int j;   int j, unmodifiedIndex;
2483   for (j = 0; j < index; j++) {  
2484     unmodifiedIndex = index;
2485    
2486     for (j = 0; j < unmodifiedIndex; j++) {
2487   entry2 = findEntryByIndex(cfg, j);   entry2 = findEntryByIndex(cfg, j);
2488   if (entry2->skip)   if (entry2->skip)
2489   index--;   index--;
# Line 2509  void setDefaultImage(struct grubConfig * Line 2552  void setDefaultImage(struct grubConfig *
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    
# Line 2519  void setDefaultImage(struct grubConfig * Line 2565  void setDefaultImage(struct grubConfig *
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 */
# Line 2553  void setDefaultImage(struct grubConfig * Line 2598  void setDefaultImage(struct grubConfig *
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)) {
# Line 2572  void setDefaultImage(struct grubConfig * Line 2619  void setDefaultImage(struct grubConfig *
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, &currentLookupIndex);
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)) {
# Line 2644  void setFallbackImage(struct grubConfig Line 2713  void setFallbackImage(struct grubConfig
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;
# Line 2740  void displayEntry(struct singleEntry *en Line 2809  void displayEntry(struct singleEntry *en
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);
# Line 3156  int displayInfo(struct grubConfig *confi Line 3232  int displayInfo(struct grubConfig *confi
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    
# Line 3490  static void removeElement(struct singleL Line 3566  static void removeElement(struct singleL
3566   line->numElements--;   line->numElements--;
3567  }  }
3568    
3569  int argMatch(const char *one, const char *two)  static int argNameMatch(const char *one, const char *two)
3570  {  {
3571   char *first, *second;   char *first, *second;
3572   char *chptr;   char *chptra, *chptrb;
3573     int rc;
3574    
3575   first = strcpy(alloca(strlen(one) + 1), one);   first = strcpy(alloca(strlen(one) + 1), one);
3576   second = strcpy(alloca(strlen(two) + 1), two);   second = strcpy(alloca(strlen(two) + 1), two);
3577    
3578   chptr = strchr(first, '=');   chptra = strchr(first, '=');
3579   if (chptr)   if (chptra)
3580   *chptr = '\0';   *chptra = '\0';
3581    
3582     chptrb = strchr(second, '=');
3583     if (chptrb)
3584     *chptrb = '\0';
3585    
3586     rc = strcmp(first, second);
3587    
3588     if (chptra)
3589     *chptra = '=';
3590     if (chptrb)
3591     *chptrb = '=';
3592    
3593     return rc;
3594    }
3595    
3596   chptr = strchr(second, '=');  static int argHasValue(const char *arg)
3597    {
3598     char *chptr;
3599    
3600     chptr = strchr(arg, '=');
3601   if (chptr)   if (chptr)
3602   *chptr = '\0';   return 1;
3603     return 0;
3604    }
3605    
3606    static int argValueMatch(const char *one, const char *two)
3607    {
3608     char *first, *second;
3609     char *chptra, *chptrb;
3610    
3611     first = strcpy(alloca(strlen(one) + 1), one);
3612     second = strcpy(alloca(strlen(two) + 1), two);
3613    
3614     chptra = strchr(first, '=');
3615     if (chptra)
3616     chptra += 1;
3617    
3618     chptrb = strchr(second, '=');
3619     if (chptrb)
3620     chptrb += 1;
3621    
3622   return strcmp(first, second);   if (!chptra && !chptrb)
3623     return 0;
3624     else if (!chptra)
3625     return *chptrb - 0;
3626     else if (!chptrb)
3627     return 0 - *chptra;
3628     else
3629     return strcmp(chptra, chptrb);
3630  }  }
3631    
3632  int updateActualImage(struct grubConfig *cfg, const char *image,  int updateActualImage(struct grubConfig *cfg, const char *image,
# Line 3650  int updateActualImage(struct grubConfig Line 3770  int updateActualImage(struct grubConfig
3770   }   }
3771   if (usedElements[i])   if (usedElements[i])
3772   continue;   continue;
3773   if (!argMatch(line->elements[i].item, *arg)) {   if (!argNameMatch(line->elements[i].item, *arg)) {
3774   usedElements[i] = 1;   usedElements[i] = 1;
3775   break;   break;
3776   }   }
# Line 3709  int updateActualImage(struct grubConfig Line 3829  int updateActualImage(struct grubConfig
3829      !strcmp(line->elements[i].item, "--"))      !strcmp(line->elements[i].item, "--"))
3830   /* reached the end of hyper args, stop here */   /* reached the end of hyper args, stop here */
3831   break;   break;
3832   if (!argMatch(line->elements[i].item, *arg)) {   if (!argNameMatch(line->elements[i].item, *arg)) {
3833   removeElement(line, i);   if (!argHasValue(*arg) ||
3834   break;      !argValueMatch(line->elements[i].item, *arg)) {
3835     removeElement(line, i);
3836     break;
3837     }
3838   }   }
3839   }   }
3840   /* handle removing LT_ROOT line too */   /* handle removing LT_ROOT line too */

Legend:
Removed from v.3021  
changed lines
  Added in v.3136