Magellan Linux

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

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

revision 2255 by niro, Mon Oct 21 14:00:38 2013 UTC revision 2258 by niro, Mon Oct 21 14:02:25 2013 UTC
# Line 297  out: Line 297  out:
297      return ret;      return ret;
298  }  }
299    
300    static int sPopCount(const char *s, const char *c)
301    {
302        int ret = 0;
303        if (!s)
304     return -1;
305        for (int i = 0; s[i] != '\0'; i++)
306     for (int j = 0; c[j] != '\0'; j++)
307        if (s[i] == c[j])
308     ret++;
309        return ret;
310    }
311    
312    static char *shellEscape(const char *s)
313    {
314        int l = strlen(s) + sPopCount(s, "'") * 2;
315    
316        char *ret = calloc(l+1, sizeof (*ret));
317        if (!ret)
318     return NULL;
319        for (int i = 0, j = 0; s[i] != '\0'; i++, j++) {
320     if (s[i] == '\'')
321        ret[j++] = '\\';
322     ret[j] = s[i];
323        }
324        return ret;
325    }
326    
327    static void unquote(char *s)
328    {
329        int l = strlen(s);
330    
331        if ((s[l-1] == '\'' && s[0] == '\'') || (s[l-1] == '"' && s[0] == '"')) {
332     memmove(s, s+1, l-2);
333     s[l-2] = '\0';
334        }
335    }
336    
337  static int grub2SetEnv(struct configFileInfo *info, char *name, char *value)  static int grub2SetEnv(struct configFileInfo *info, char *name, char *value)
338  {  {
339      char *s = NULL;      char *s = NULL;
340      int rc = 0;      int rc = 0;
341      char *envFile = info->envFile ? info->envFile : "/boot/grub2/grubenv";      char *envFile = info->envFile ? info->envFile : "/boot/grub2/grubenv";
342    
343        unquote(value);
344        value = shellEscape(value);
345        if (!value)
346        return -1;
347    
348      rc = asprintf(&s, "grub2-editenv %s set '%s=%s'", envFile, name, value);      rc = asprintf(&s, "grub2-editenv %s set '%s=%s'", envFile, name, value);
349        free(value);
350      if (rc <0)      if (rc <0)
351   return -1;   return -1;
352    
# Line 1023  static int getNextLine(char ** bufPtr, s Line 1066  static int getNextLine(char ** bufPtr, s
1066      return 0;      return 0;
1067  }  }
1068    
1069    static int isnumber(const char *s)
1070    {
1071        int i;
1072        for (i = 0; s[i] != '\0'; i++)
1073     if (s[i] < '0' || s[i] > '9')
1074        return 0;
1075        return i;
1076    }
1077    
1078  static struct grubConfig * readConfig(const char * inName,  static struct grubConfig * readConfig(const char * inName,
1079        struct configFileInfo * cfi) {        struct configFileInfo * cfi) {
1080      int in;      int in;
# Line 1319  static struct grubConfig * readConfig(co Line 1371  static struct grubConfig * readConfig(co
1371      char *defTitle = cfi->getEnv(cfg->cfi, "saved_entry");      char *defTitle = cfi->getEnv(cfg->cfi, "saved_entry");
1372      if (defTitle) {      if (defTitle) {
1373   int index = 0;   int index = 0;
1374   entry = findEntryByTitle(cfg, defTitle, &index);   if (isnumber(defTitle)) {
1375        index = atoi(defTitle);
1376        entry = findEntryByIndex(cfg, index);
1377     } else {
1378        entry = findEntryByTitle(cfg, defTitle, &index);
1379     }
1380   if (entry)   if (entry)
1381      cfg->defaultImage = index;      cfg->defaultImage = index;
1382      }      }
# Line 1368  static struct grubConfig * readConfig(co Line 1425  static struct grubConfig * readConfig(co
1425   char *defTitle = cfi->getEnv(cfg->cfi, "saved_entry");   char *defTitle = cfi->getEnv(cfg->cfi, "saved_entry");
1426   if (defTitle) {   if (defTitle) {
1427      int index = 0;      int index = 0;
1428      entry = findEntryByTitle(cfg, defTitle, &index);      if (isnumber(defTitle)) {
1429     index = atoi(defTitle);
1430     entry = findEntryByIndex(cfg, index);
1431        } else {
1432     entry = findEntryByTitle(cfg, defTitle, &index);
1433        }
1434      if (entry)      if (entry)
1435   cfg->defaultImage = index;   cfg->defaultImage = index;
1436   }   }
# Line 2019  struct singleEntry * findTemplate(struct Line 2081  struct singleEntry * findTemplate(struct
2081      char *defTitle = cfg->cfi->getEnv(cfg->cfi, "saved_entry");      char *defTitle = cfg->cfi->getEnv(cfg->cfi, "saved_entry");
2082      if (defTitle) {      if (defTitle) {
2083   int index = 0;   int index = 0;
2084   entry = findEntryByTitle(cfg, defTitle, &index);   if (isnumber(defTitle)) {
2085        index = atoi(defTitle);
2086        entry = findEntryByIndex(cfg, index);
2087     } else {
2088        entry = findEntryByTitle(cfg, defTitle, &index);
2089     }
2090     if (entry)
2091        cfg->defaultImage = index;
2092      }      }
2093   }   }
2094      } else if (cfg->defaultImage > -1) {      } else if (cfg->defaultImage > -1) {

Legend:
Removed from v.2255  
changed lines
  Added in v.2258