Magellan Linux

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

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

revision 1727 by niro, Sat Feb 18 00:57:49 2012 UTC revision 1736 by niro, Sat Feb 18 01:02:17 2012 UTC
# Line 46  Line 46 
46  #define dbgPrintf(format, args...)  #define dbgPrintf(format, args...)
47  #endif  #endif
48    
49    int debug = 0; /* Currently just for template debugging */
50    
51  #define _(A) (A)  #define _(A) (A)
52    
53  #define MAX_EXTRA_INITRDS  16 /* code segment checked by --bootloader-probe */  #define MAX_EXTRA_INITRDS  16 /* code segment checked by --bootloader-probe */
# Line 1338  static char *findDiskForRoot() Line 1340  static char *findDiskForRoot()
1340      return NULL;      return NULL;
1341  }  }
1342    
1343    void printEntry(struct singleEntry * entry) {
1344        int i;
1345        struct singleLine * line;
1346    
1347        for (line = entry->lines; line; line = line->next) {
1348     fprintf(stderr, "DBG: %s", line->indent);
1349     for (i = 0; i < line->numElements; i++) {
1350     fprintf(stderr, "%s%s",
1351        line->elements[i].item, line->elements[i].indent);
1352     }
1353     fprintf(stderr, "\n");
1354        }
1355    }
1356    
1357    void notSuitablePrintf(struct singleEntry * entry, const char *fmt, ...)
1358    {
1359        va_list argp;
1360    
1361        if (!debug)
1362     return;
1363    
1364        va_start(argp, fmt);
1365        fprintf(stderr, "DBG: Image entry failed: ");
1366        vfprintf(stderr, fmt, argp);
1367        printEntry(entry);
1368        va_end(argp);
1369    }
1370    
1371  int suitableImage(struct singleEntry * entry, const char * bootPrefix,  int suitableImage(struct singleEntry * entry, const char * bootPrefix,
1372    int skipRemoved, int flags) {    int skipRemoved, int flags) {
1373      struct singleLine * line;      struct singleLine * line;
# Line 1347  int suitableImage(struct singleEntry * e Line 1377  int suitableImage(struct singleEntry * e
1377      char * rootspec;      char * rootspec;
1378      char * rootdev;      char * rootdev;
1379    
1380      if (skipRemoved && entry->skip) return 0;      if (skipRemoved && entry->skip) {
1381     notSuitablePrintf(entry, "marked to skip\n");
1382     return 0;
1383        }
1384    
1385      line = getLineByType(LT_KERNEL|LT_HYPER, entry->lines);      line = getLineByType(LT_KERNEL|LT_HYPER, entry->lines);
1386      if (!line || line->numElements < 2) return 0;      if (!line) {
1387     notSuitablePrintf(entry, "no line found\n");
1388     return 0;
1389        }
1390        if (line->numElements < 2) {
1391     notSuitablePrintf(entry, "line has only %d elements\n",
1392        line->numElements);
1393     return 0;
1394        }
1395    
1396      if (flags & GRUBBY_BADIMAGE_OKAY) return 1;      if (flags & GRUBBY_BADIMAGE_OKAY) return 1;
1397    
# Line 1359  int suitableImage(struct singleEntry * e Line 1400  int suitableImage(struct singleEntry * e
1400      rootspec = getRootSpecifier(line->elements[1].item);      rootspec = getRootSpecifier(line->elements[1].item);
1401      sprintf(fullName, "%s%s", bootPrefix,      sprintf(fullName, "%s%s", bootPrefix,
1402              line->elements[1].item + (rootspec ? strlen(rootspec) : 0));              line->elements[1].item + (rootspec ? strlen(rootspec) : 0));
1403      if (access(fullName, R_OK)) return 0;      if (access(fullName, R_OK)) {
1404     notSuitablePrintf(entry, "access to %s failed\n", fullName);
1405     return 0;
1406        }
1407      for (i = 2; i < line->numElements; i++)      for (i = 2; i < line->numElements; i++)
1408   if (!strncasecmp(line->elements[i].item, "root=", 5)) break;   if (!strncasecmp(line->elements[i].item, "root=", 5)) break;
1409      if (i < line->numElements) {      if (i < line->numElements) {
# Line 1378  int suitableImage(struct singleEntry * e Line 1421  int suitableImage(struct singleEntry * e
1421      line = getLineByType(LT_KERNELARGS|LT_MBMODULE, entry->lines);      line = getLineByType(LT_KERNELARGS|LT_MBMODULE, entry->lines);
1422    
1423              /* failed to find one */              /* failed to find one */
1424              if (!line) return 0;              if (!line) {
1425     notSuitablePrintf(entry, "no line found\n");
1426     return 0;
1427                }
1428    
1429      for (i = 1; i < line->numElements; i++)      for (i = 1; i < line->numElements; i++)
1430          if (!strncasecmp(line->elements[i].item, "root=", 5)) break;          if (!strncasecmp(line->elements[i].item, "root=", 5)) break;
1431      if (i < line->numElements)      if (i < line->numElements)
1432          dev = line->elements[i].item + 5;          dev = line->elements[i].item + 5;
1433      else {      else {
1434     notSuitablePrintf(entry, "no root= entry found\n");
1435   /* it failed too...  can't find root= */   /* it failed too...  can't find root= */
1436          return 0;          return 0;
1437              }              }
# Line 1392  int suitableImage(struct singleEntry * e Line 1439  int suitableImage(struct singleEntry * e
1439      }      }
1440    
1441      dev = getpathbyspec(dev);      dev = getpathbyspec(dev);
1442      if (!dev)      if (!getpathbyspec(dev)) {
1443            notSuitablePrintf(entry, "can't find blkid entry for %s\n", dev);
1444          return 0;          return 0;
1445        } else
1446     dev = getpathbyspec(dev);
1447    
1448      rootdev = findDiskForRoot();      rootdev = findDiskForRoot();
1449      if (!rootdev)      if (!rootdev) {
1450            notSuitablePrintf(entry, "can't find root device\n");
1451   return 0;   return 0;
1452        }
1453    
1454      if (!getuuidbydev(rootdev) || !getuuidbydev(dev)) {      if (!getuuidbydev(rootdev) || !getuuidbydev(dev)) {
1455            notSuitablePrintf(entry, "uuid missing: rootdev %s, dev %s\n",
1456     getuuidbydev(rootdev), getuuidbydev(dev));
1457          free(rootdev);          free(rootdev);
1458          return 0;          return 0;
1459      }      }
1460    
1461      if (strcmp(getuuidbydev(rootdev), getuuidbydev(dev))) {      if (strcmp(getuuidbydev(rootdev), getuuidbydev(dev))) {
1462            notSuitablePrintf(entry, "uuid mismatch: rootdev %s, dev %s\n",
1463     getuuidbydev(rootdev), getuuidbydev(dev));
1464   free(rootdev);   free(rootdev);
1465          return 0;          return 0;
1466      }      }
# Line 3193  int main(int argc, const char ** argv) { Line 3249  int main(int argc, const char ** argv) {
3249        "the kernel referenced by the default image does not exist, "        "the kernel referenced by the default image does not exist, "
3250        "the first linux entry whose kernel does exist is used as the "        "the first linux entry whose kernel does exist is used as the "
3251        "template"), NULL },        "template"), NULL },
3252     { "debug", 0, 0, &debug, 0,
3253        _("print debugging information for failures") },
3254   { "default-kernel", 0, 0, &displayDefault, 0,   { "default-kernel", 0, 0, &displayDefault, 0,
3255      _("display the path of the default kernel") },      _("display the path of the default kernel") },
3256   { "default-index", 0, 0, &displayDefaultIndex, 0,   { "default-index", 0, 0, &displayDefaultIndex, 0,

Legend:
Removed from v.1727  
changed lines
  Added in v.1736