VirtualBox

Changeset 95436 in vbox


Ignore:
Timestamp:
Jun 29, 2022 6:18:57 PM (3 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
152040
Message:

Main/UnattendedInstall: Minimalistic support for FreeBSD >= 10.0 sitting in my tree for too long, bugref:9781

Location:
trunk/src/VBox/Main
Files:
2 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/UnattendedTemplates/Makefile.kmk

    r93124 r95436  
    4444        ol_postinstall.sh \
    4545        os2_cid_install.cmd \
    46         win_postinstall.cmd
     46        win_postinstall.cmd \
     47        freebsd_installer.cfg \
     48        freebsd_postinstall.sh
    4749
    4850 ifndef VBOX_WITH_OPEN_WATCOM
  • trunk/src/VBox/Main/include/UnattendedImpl.h

    r94533 r95436  
    257257    HRESULT i_innerDetectIsoOSLinux(RTVFS hVfsIso, DETECTBUFFER *puBuf);
    258258    HRESULT i_innerDetectIsoOSOs2(RTVFS hVfsIso, DETECTBUFFER *puBuf);
     259    HRESULT i_innerDetectIsoOSFreeBsd(RTVFS hVfsIso, DETECTBUFFER *puBuf);
    259260
    260261    /**
  • trunk/src/VBox/Main/include/UnattendedInstaller.h

    r94751 r95436  
    845845#endif
    846846
     847/**
     848 * Base class for the unattended FreeBSD installers.
     849 */
     850class UnattendedFreeBsdInstaller : public UnattendedInstaller
     851{
     852public:
     853    UnattendedFreeBsdInstaller(Unattended *pParent)
     854        : UnattendedInstaller(pParent,
     855                              "freebsd_installer.cfg", "freebsd_postinstall.sh",
     856                              "installerconfig", "vboxpostinstall.sh") {}
     857    ~UnattendedFreeBsdInstaller() {}
     858
     859    bool isAuxiliaryIsoNeeded() const       { return true;  }
     860    bool isOriginalIsoNeeded() const        { return false; }
     861
     862protected:
     863    HRESULT addFilesToAuxVisoVectors(RTCList<RTCString> &rVecArgs, RTCList<RTCString> &rVecFiles,
     864                                     RTVFS hVfsOrgIso, bool fOverwrite);
     865};
     866
    847867#endif /* !MAIN_INCLUDED_UnattendedInstaller_h */
  • trunk/src/VBox/Main/src-server/UnattendedImpl.cpp

    r95156 r95436  
    449449    if (hrc == S_FALSE && mEnmOsType == VBOXOSTYPE_Unknown)
    450450        hrc = i_innerDetectIsoOSOs2(hVfsIso, &uBuf);
     451    if (hrc == S_FALSE && mEnmOsType == VBOXOSTYPE_Unknown)
     452        hrc = i_innerDetectIsoOSFreeBsd(hVfsIso, &uBuf);
    451453    if (mEnmOsType != VBOXOSTYPE_Unknown)
    452454    {
     
    21562158
    21572159
     2160/**
     2161 * Detect FreeBSD distro ISOs.
     2162 *
     2163 * @returns COM status code.
     2164 * @retval  S_OK if detected
     2165 * @retval  S_FALSE if not fully detected.
     2166 *
     2167 * @param   hVfsIso     The ISO file system.
     2168 * @param   pBuf        Read buffer.
     2169 */
     2170HRESULT Unattended::i_innerDetectIsoOSFreeBsd(RTVFS hVfsIso, DETECTBUFFER *pBuf)
     2171{
     2172    RT_NOREF(pBuf);
     2173
     2174    /*
     2175     * FreeBSD since 10.0 has a .profile file in the root which can be used to determine that this is FreeBSD
     2176     * along with the version.
     2177     */
     2178
     2179    RTVFSFILE hVfsFile;
     2180    HRESULT hrc = S_FALSE;
     2181    int vrc = RTVfsFileOpen(hVfsIso, ".profile", RTFILE_O_READ | RTFILE_O_DENY_NONE | RTFILE_O_OPEN, &hVfsFile);
     2182    if (RT_SUCCESS(vrc))
     2183    {
     2184        static const uint8_t s_abFreeBsdHdr[] = "# $FreeBSD: releng/";
     2185        char abRead[32];
     2186
     2187        vrc = RTVfsFileRead(hVfsFile, &abRead[0], sizeof(abRead), NULL /*pcbRead*/);
     2188        if (   RT_SUCCESS(vrc)
     2189            && !memcmp(&abRead[0], &s_abFreeBsdHdr[0], sizeof(s_abFreeBsdHdr) - 1)) /* Skip terminator */
     2190        {
     2191            abRead[sizeof(abRead) - 1] = '\0';
     2192
     2193            /* Detect the architecture using the volume label. */
     2194            char szVolumeId[128];
     2195            size_t cchVolumeId;
     2196            vrc = RTVfsQueryLabel(hVfsIso, szVolumeId, 128, &cchVolumeId);
     2197            if (RT_SUCCESS(vrc))
     2198            {
     2199                /* Can re-use the Linux code here. */
     2200                if (!detectLinuxArchII(szVolumeId, &mEnmOsType, VBOXOSTYPE_FreeBSD))
     2201                    LogRel(("Unattended/FBSD: Unknown: arch='%s'\n", szVolumeId));
     2202
     2203                /* Detect the version from the string coming after the needle in .profile. */
     2204                AssertCompile(sizeof(s_abFreeBsdHdr) - 1 < sizeof(abRead));
     2205
     2206                char *pszVersionStart = &abRead[sizeof(s_abFreeBsdHdr) - 1];
     2207                char *pszVersionEnd = pszVersionStart;
     2208
     2209                while (RT_C_IS_DIGIT(*pszVersionEnd))
     2210                    pszVersionEnd++;
     2211                if (*pszVersionEnd == '.')
     2212                {
     2213                    pszVersionEnd++; /* Skip the . */
     2214
     2215                    while (RT_C_IS_DIGIT(*pszVersionEnd))
     2216                        pszVersionEnd++;
     2217
     2218                    /* Terminate the version string. */
     2219                    *pszVersionEnd = '\0';
     2220
     2221                    try { mStrDetectedOSVersion = pszVersionStart; }
     2222                    catch (std::bad_alloc &) { hrc = E_OUTOFMEMORY; }
     2223                }
     2224                else
     2225                    LogRel(("Unattended/FBSD: Unknown: version='%s'\n", &abRead[0]));
     2226            }
     2227            else
     2228            {
     2229                LogRel(("Unattended/FBSD: No Volume Label found\n"));
     2230                mEnmOsType = VBOXOSTYPE_FreeBSD;
     2231            }
     2232
     2233            hrc = S_OK;
     2234        }
     2235
     2236        RTVfsFileRelease(hVfsFile);
     2237    }
     2238
     2239    return hrc;
     2240}
     2241
     2242
    21582243HRESULT Unattended::prepare()
    21592244{
  • trunk/src/VBox/Main/src-server/UnattendedInstaller.cpp

    r94764 r95436  
    102102                pUinstaller = new UnattendedOracleLinux6Installer(pParent);
    103103        }
     104        else if (enmDetectedOSType >= VBOXOSTYPE_FreeBSD && enmDetectedOSType <= VBOXOSTYPE_FreeBSD_x64)
     105            pUinstaller = new UnattendedFreeBsdInstaller(pParent);
    104106#if 0 /* doesn't work, so convert later. */
    105107        else if (enmDetectedOSType == VBOXOSTYPE_OpenSUSE || enmDetectedOSType == VBOXOSTYPE_OpenSUSE_x64)
     
    15021504}
    15031505#endif
     1506
     1507
     1508//////////////////////////////////////////////////////////////////////////////////////////////////////
     1509/*
     1510*
     1511*
     1512*  Implementation UnattendedFreeBsdInstaller functions
     1513*
     1514*/
     1515//////////////////////////////////////////////////////////////////////////////////////////////////////
     1516HRESULT UnattendedFreeBsdInstaller::addFilesToAuxVisoVectors(RTCList<RTCString> &rVecArgs, RTCList<RTCString> &rVecFiles,
     1517                                                             RTVFS hVfsOrgIso, bool fOverwrite)
     1518{
     1519    try
     1520    {
     1521        RTCString strScriptName;
     1522        strScriptName = mpParent->i_getAuxiliaryBasePath();
     1523        strScriptName.append(mMainScript.getDefaultFilename());
     1524
     1525        /* Need to retain the original file permissions for executables. */
     1526        rVecArgs.append() = "--no-file-mode";
     1527        rVecArgs.append() = "--no-dir-mode";
     1528
     1529        rVecArgs.append() = "--import-iso";
     1530        rVecArgs.append(mpParent->i_getIsoPath());
     1531
     1532        rVecArgs.append() = "--file-mode=0444";
     1533        rVecArgs.append() = "--dir-mode=0555";
     1534
     1535        /* Remaster ISO, the installer config has to go into /etc. */
     1536        rVecArgs.append().append("/etc/installerconfig=").append(strScriptName);
     1537    }
     1538    catch (std::bad_alloc &)
     1539    {
     1540        return E_OUTOFMEMORY;
     1541    }
     1542
     1543    /*
     1544     * Call parent to add the remaining files
     1545     */
     1546    return UnattendedInstaller::addFilesToAuxVisoVectors(rVecArgs, rVecFiles, hVfsOrgIso, fOverwrite);
     1547}
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette