static int loadUrlImages(struct iurlinfo * ui) { char *buf, *path, *dest, *slash; int rc; /* Figure out the path where updates.img and product.img files are * kept. Since ui->prefix points to a stage2 image file, we just need * to trim off the file name and look in the same directory. */ if ((slash = strrchr(ui->prefix, '/')) == NULL) return 0; if ((path = strndup(ui->prefix, slash - ui->prefix)) == NULL) path = ui->prefix; /* grab the updates.img before install.img so that we minimize our * ramdisk usage */ if (asprintf(&buf, "%s/%s", path, "updates.img") == -1) { logMessage(CRITICAL, "%s: %d: %m", __func__, __LINE__); abort(); } if (!loadSingleUrlImage(ui, buf, "/tmp/updates-disk.img", "/tmp/update-disk", "/dev/loop7", 1)) { copyDirectory("/tmp/update-disk", "/tmp/updates", copyWarnFn, copyErrorFn); umountLoopback("/tmp/update-disk", "/dev/loop7"); unlink("/tmp/updates-disk.img"); unlink("/tmp/update-disk"); } else if (!access("/tmp/updates-disk.img", R_OK)) { unpackCpioBall("/tmp/updates-disk.img", "/tmp/updates"); unlink("/tmp/updates-disk.img"); } free(buf); /* grab the product.img before install.img so that we minimize our * ramdisk usage */ if (asprintf(&buf, "%s/%s", path, "product.img") == -1) { logMessage(CRITICAL, "%s: %d: %m", __func__, __LINE__); abort(); } if (!loadSingleUrlImage(ui, buf, "/tmp/product-disk.img", "/tmp/product-disk", "/dev/loop7", 1)) { copyDirectory("/tmp/product-disk", "/tmp/product", copyWarnFn, copyErrorFn); umountLoopback("/tmp/product-disk", "/dev/loop7"); unlink("/tmp/product-disk.img"); unlink("/tmp/product-disk"); } free(buf); if (asprintf(&dest, "/tmp/install.img") == -1) { logMessage(CRITICAL, "%s: %d: %m", __func__, __LINE__); abort(); } rc = loadSingleUrlImage(ui, ui->prefix, dest, "/mnt/runtime", "/dev/loop0", 0); free(dest); if (rc) { if (rc != 2) newtWinMessage(_("Error"), _("OK"), _("Unable to retrieve the install image.")); return 1; } return 0; }
static int loadUrlImages(struct iurlinfo * ui) { char *stage2img; char tmpstr1[1024], tmpstr2[1024]; int rc; /* setupRamdisk();*/ /* grab the updates.img before netstg1.img so that we minimize our * ramdisk usage */ if (!loadSingleUrlImage(ui, "images/updates.img", "/tmp/ramfs/updates-disk.img", "/tmp/update-disk", "loop7", 1)) { copyDirectory("/tmp/update-disk", "/tmp/updates"); umountLoopback("/tmp/update-disk", "loop7"); unlink("/tmp/ramfs/updates-disk.img"); unlink("/tmp/update-disk"); } /* grab the product.img before netstg1.img so that we minimize our * ramdisk usage */ if (!loadSingleUrlImage(ui, "images/product.img", "/tmp/ramfs/product-disk.img", "/tmp/product-disk", "loop7", 1)) { copyDirectory("/tmp/product-disk", "/tmp/product"); umountLoopback("/tmp/product-disk", "loop7"); unlink("/tmp/ramfs/product-disk.img"); unlink("/tmp/product-disk"); } /* require 128MB for use of graphical stage 2 due to size of image */ if (totalMemory() < GUI_STAGE2_RAM) { stage2img = "minstg2.img"; logMessage(WARNING, "URLINSTALL falling back to non-GUI stage2 " "due to insufficient RAM"); } else { stage2img = "stage2.img"; } snprintf(tmpstr1, sizeof(tmpstr1), "images/%s", stage2img); snprintf(tmpstr2, sizeof(tmpstr2), "/tmp/ramfs/%s", stage2img); #ifdef ROCKS rc = loadSingleUrlImage(ui, tmpstr1, tmpstr2, "/mnt/runtime", "loop2", 0); #else rc = loadSingleUrlImage(ui, tmpstr1, tmpstr2, "/mnt/runtime", "loop0", 0); #endif /* ROCKS */ if (rc) { if (rc != 2) newtWinMessage(_("Error"), _("OK"), _("Unable to retrieve the install image.")); return 1; } #ifndef ROCKS /* * ROCKS - we don't want to check the stamp since we routinely rebuild * the distribution. */ /* now verify the stamp... */ if (!verifyStamp("/mnt/runtime")) { char * buf; buf = sdupprintf(_("The %s installation tree in that directory does " "not seem to match your boot media."), getProductName()); newtWinMessage(_("Error"), _("OK"), buf); umountLoopback("/mnt/runtime", "loop0"); return 1; } #endif /* ROCKS */ return 0; }