--- unetbootin.cpp.orig 2017-07-14 08:54:12 UTC +++ unetbootin.cpp @@ -301,8 +301,13 @@ bool unetbootin::ubninitialize(QListcurrentText(); devluid = getdevluid(targetDev); ginstallDir = ""; installDir = ginstallDir; targetDrive = QString("%1/").arg(locatemountpoint(targetDev)); +#endif +#ifdef Q_OS_FREEBSD + QStringList driveinfo = driveselect->currentText().split(":"); + targetDev = driveinfo.at(0); + installDir = ginstallDir = ""; + targetDrive = QString("%1/").arg(driveinfo.at(1)); +#endif } #ifdef Q_OS_LINUX if (targetDev.contains(QRegExp("p\\d$"))) @@ -3528,7 +3613,7 @@ void unetbootin::runinst() else rawtargetDev = QString(targetDev).remove(QRegExp("\\d$")); #endif -#ifdef Q_OS_MAC +#ifdef Q_OS_UNIX rawtargetDev = QString(targetDev).remove(QRegExp("s\\d$")); #endif #endif @@ -3724,7 +3809,7 @@ void unetbootin::writegrub2cfg() QString menulstxt = QString( "%9\n\n" #ifndef NODEFAULTBOOT - "\nmenuentry \""UNETBOOTINB"\" {\n" + "\nmenuentry \"" UNETBOOTINB "\" {\n" "\tset root=%8\n" "\t%1 %2 %3 %4\n" "\t%5 %6 %7\n" @@ -3845,7 +3930,7 @@ void unetbootin::runinsthdd() "timeout 10\n" #endif #ifndef NODEFAULTBOOT - "\ntitle "UNETBOOTINB"\n" + "\ntitle " UNETBOOTINB "\n" #ifdef Q_OS_WIN32 "find --set-root %3\n" #endif @@ -4281,21 +4366,47 @@ void unetbootin::runinstusb() instIndvfl("libutil.c32", QString("%1libutil.c32").arg(targetPath)); instIndvfl("libcom32.c32", QString("%1libcom32.c32").arg(targetPath)); } + setuppersspace(); +#ifdef Q_OS_FREEBSD + /* + * On FreeBSD, we only support installing on MSDOSFS (no + * extlinux in the ports). This also simplifies things + * a bit, and that's what most users usually want anyway. + * + * Because of syslinux' stupidity, we have to remove any + * existing ldlinux.c32 and ldlinux.sys files, otherwise + * it will fail to install loader (even with -f switch). + * Then we have to unmount the filesystem to avoid the + * "Operation not permitted" error, and must enforce it + * because syslinux expects a block device, and, well, + * there are no "block devices" in FreeBSD. + */ + rmFile(targetPath + "ldlinux.c32"); + rmFile(targetPath + "ldlinux.sys"); + callexternapp("umount", targetDev); + callexternapp(syslinuxcommand, "-i -f " + targetDev); + + if (rawtargetDev != targetDev) + { + /* + * We have partition table (not operating on raw + * disk), so we need to install MBR and mark our + * partition as active. Assume our targetDev is + * /dev/{da,mmcsd}XsY and use the last digit as + * partition index for gpart(8). + */ + QString idx = targetDev.right(1); + callexternapp("gpart", + "bootcode -b /boot/mbr " + rawtargetDev); + callexternapp("gpart", "set -a " + "active -i " + idx + " " + rawtargetDev); + } +#endif fininstall(); } -void unetbootin::killApplication() +void unetbootin::setuppersspace() { - exit(0); -} - -void unetbootin::fininstall() -{ - #ifdef Q_OS_UNIX - this->tprogress->setValue(this->tprogress->maximum()*2/3); - pdesc1->setText(tr("Syncing filesystems")); - callexternapp("sync", ""); - #endif if (this->persistenceSpaceMB > 0) { pdesc1->setText(tr("Setting up persistence")); @@ -4334,6 +4445,20 @@ void unetbootin::fininstall() rmFile(mke2fscommand); #endif } +} + +void unetbootin::killApplication() +{ + exit(0); +} + +void unetbootin::fininstall() +{ + #ifdef Q_OS_UNIX + this->tprogress->setValue(this->tprogress->maximum()*2/3); + pdesc1->setText(tr("Syncing filesystems")); + callexternapp("sync", ""); + #endif pdesc1->setText(""); progresslayer->setEnabled(false); progresslayer->hide(); @@ -4343,7 +4468,7 @@ void unetbootin::fininstall() sdesc4->setText(QString("%1 %2").arg(sdesc4->text()).arg(trcurrent)); if (installType == tr("Hard Disk")) { - rebootmsgtext->setText(tr("After rebooting, select the "UNETBOOTINB" menu entry to boot.%1").arg(postinstmsg)); + rebootmsgtext->setText(tr("After rebooting, select the " UNETBOOTINB " menu entry to boot.%1").arg(postinstmsg)); } if (installType == tr("USB Drive")) {