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 */ |
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; |
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 |
|
|
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) { |
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 |
} |
} |
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 |
} |
} |
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, |