Heimdall 1.4 RC1:

- Massive refactoring.
    - Support for Qualcomm based devices.
    - Print PIT from file.
    - Use partition names as arguments e.g. --HIDDEN, --KERNEL, --MOVINAND etc.
    - Heimdall Frontend UI improvements.
    - And much more...
alt_setting-error
Benjamin Dobell 2012-10-01 12:43:05 +10:00
parent 66f1e84dd2
commit 6cd6b35c73
90 changed files with 21508 additions and 13379 deletions

8
.gitignore vendored
View File

@ -1,2 +1,10 @@
.DS_Store .DS_Store
._* ._*
Debug/
Release/
GeneratedFiles/
*.vcxproj.user
*.suo
*.sdf
heimdall-frontend/Qt4VSPropertySheet.props
*.opensdf

View File

@ -1,4 +1,4 @@
Heimdall (c) 2010-2011 Benjamin Dobell, Glass Echidna Heimdall (c) 2010-2012 Benjamin Dobell, Glass Echidna
http://www.glassechidna.com.au/products/heimdall/ http://www.glassechidna.com.au/products/heimdall/
DISCLAIMER: DISCLAIMER:
@ -84,11 +84,12 @@ Performing a Custom Flash with Heimdall Frontend:
This is the advanced means of flashing firmware to your device. This is the advanced means of flashing firmware to your device.
If you're not an advanced user or a developer, in the event that a Heimdall If you're not an advanced user or a developer, in the event that a Heimdall
Firmware Package doesn't exist for the particular firmware (or files) that Firmware Package doesn't exist for the particular firmware (or files) that
you wish to flash, then I strongly recommend you get in touch with developer you wish to flash, then I strongly recommend you get in touch with the
of the firmware (or files) and politely ask them to create a Heimdall developer of the firmware (or files) and politely ask them to create a
Firmware Package for you. In doing so then you don't have to worry about Heimdall Firmware Package for you. In doing so, you avoid the risk of
making mistakes due to inexperience. making mistakes due to inexperience.
If you're looking to customise an existing Heimdall Firmware Package then If you're looking to customise an existing Heimdall Firmware Package then
follow steps 1-8 of "Flashing Heimdall Firmware Package with Heimdall follow steps 1-8 of "Flashing Heimdall Firmware Package with Heimdall
@ -104,7 +105,8 @@ Performing a Custom Flash with Heimdall Frontend:
as multiple archives (nested or otherwise), extract them all to the same as multiple archives (nested or otherwise), extract them all to the same
location. location.
NOTE: If you want to use the CSC then extract it last. NOTE: If you want to use the CSC then extract it last. If you're asked
to overwrite files then do so.
3. Open the a terminal and run Heimdall Frontend by typing: 3. Open the a terminal and run Heimdall Frontend by typing:
@ -116,14 +118,14 @@ Performing a Custom Flash with Heimdall Frontend:
5. Before you can chose which partitions you want to flash with particular 5. Before you can chose which partitions you want to flash with particular
files you MUST first select a PIT file. To do this click the "Browse" files you MUST first select a PIT file. To do this click the "Browse"
button in the "PIT" section. This will open a dialogue allowing you to button in the "PIT" section. This will open a dialogue allowing you to
navigate to and select a valid PIT (.pit) file. navigate to and select a valid PIT (.pit) file.
If you do not already have a valid PIT file stored on your computer you If you do not already have a valid PIT file stored on your computer you
can download your device's PIT file from the "Utilities" tab. can download your device's PIT file from the "Utilities" tab.
6. If a valid PIT file has been selected then "Add" button below the 6. If a valid PIT file has been selected then the "Add" button below the
"Partitions (Files)" list-box will become enabled. Press this button to "Partitions (Files)" list-box will be enabled. Press this button to add
add a partition to your flash. a partition to your flash.
7. When you first add a partition you will see the "Partition Name" and 7. When you first add a partition you will see the "Partition Name" and
"Partition ID" be populated with information. Use the "Partition Name" "Partition ID" be populated with information. Use the "Partition Name"
@ -229,8 +231,7 @@ How to Create a Heimdall Firmware Package:
create a package from scratch, or you can load an existing package, apply create a package from scratch, or you can load an existing package, apply
modifications and then save the package. Creating a package from scratch modifications and then save the package. Creating a package from scratch
is the preferred approach, by taking this approach you're far less likely is the preferred approach, by taking this approach you're far less likely
to run into file name length limitations. These are not Heimdall's own to run into file name length limitations.
limitation but rather a limitation of the TAR archive format.
Before you can access Heimdall Frontend's firmware creation functionality Before you can access Heimdall Frontend's firmware creation functionality
(available from the "Create Package" tab) you must first specify which (available from the "Create Package" tab) you must first specify which
@ -254,14 +255,14 @@ How to Create a Heimdall Firmware Package:
Firmware Name - This is the name of your particular firmware. An Firmware Name - This is the name of your particular firmware. An
example would be "Cyanogenmod". example would be "Cyanogenmod".
Firmware Version - This is the version identifier for your package. Any Firmware Version - This is the version identifier for your package. Any
valid string will be accepted although a the inclusion of decimal valid string will be accepted, although the inclusion of decimal
point version number is preferred i.e. "7.1". If it makes sense point version number is preferred i.e. "7.1". If it makes sense
then feel free to append a text string like "RC1" or "Beta 1" to then feel free to append a text string like "RC1" or "Beta 1" to
the decimal point version. the decimal point version.
Platform Name - This is the name of the platform (or operating system) Platform Name - This is the name of platform (or operating system) that
that your firmware is based on. In most cases this will simply be your firmware is based on. In most cases this will simply be
"Android". "Android".
Platform Version - This is the operating system version that your Platform Version - This is the operating system version that your
@ -295,8 +296,8 @@ How to Create a Heimdall Firmware Package:
team name. Click "Add" and the developer will be added to the list team name. Click "Add" and the developer will be added to the list
on the right. If you make a mistake you can select a developer from on the right. If you make a mistake you can select a developer from
the list and click "Remove". You can list as many developers as you the list and click "Remove". You can list as many developers as you
like however visual constraints of the "Load Package" tab means like, however visual constraints of the "Load Package" tab means
only a few names will be visible. Where possible you may want to only a few names will be visible. Where possible you may want to
opt for team names over listing individual team members. opt for team names over listing individual team members.
@ -359,8 +360,9 @@ for the format in their own software.
All Heimdall Firmware Packages must contain a file called firmware.xml. This All Heimdall Firmware Packages must contain a file called firmware.xml. This
file stores flash information and meta-data for the package as well as file stores flash information and meta-data for the package as well as
information about other files contained within the package. information about other files contained within the package.
The format is fairly straight-forward so it won't be explained in great detail. The format is fairly straight-forward so it won't be explained in great detail.
Nonetheless the following is an example of a valid firmware.xml file. Nonetheless the following is an example of a valid firmware.xml file.
@ -458,20 +460,28 @@ be included.
Appendix B - Installing Heimdall from Source: Appendix B - Installing Heimdall from Source:
1. First make sure you have installed build-tools, pkgconfig, zlib-dev and 1. First make sure you have installed build-tools, pkgconfig, zlib-dev and
libusb-1.0-dev (v1.0.8 or newer). libusb-1.0-dev (v1.0.8 or newer).
NOTE: Package names may not be absolutely identical to those above. NOTE: Package names may not be absolutely identical to those above.
2. Open a terminal and navigate to the directory you downloaded, 2. Open a terminal and navigate to the directory you downloaded,
or extracted, Heimdall to. or extracted, Heimdall to.
3. Enter the following commands to compile libpit. 3. Enter the following commands to compile libpit:
cd libpit cd libpit
./configure
make
cd ..
If you have problems please consult http://www.libusb.org/
4. Enter the following commands to compile libpit.
cd libusb-1.0
./configure ./configure
make make
cd .. cd ..
@ -486,11 +496,11 @@ Appendix B - Installing Heimdall from Source:
sudo make install sudo make install
cd .. cd ..
NOTE: As an alternative to "sudo make install" you may chose to generate NOTE: As an alternative to "sudo make install" you may chose to generate
a package by typing the following: a package by typing the following:
sudo checkinstall --pkgversion <version> sudo checkinstall --pkgversion <version>
Where <version> is the current Heimdall release e.g. 1.3.0 Where <version> is the current Heimdall release e.g. 1.3.0
5. Done 5. Done
@ -510,9 +520,9 @@ Appendix C - Installing Heimdall Frontend from Source:
4. Enter the following commands to compile and install Heimdall Frontend: 4. Enter the following commands to compile and install Heimdall Frontend:
cd heimdall-frontend cd heimdall-frontend
qmake heimdall-frontend.pro qmake-qt4 heimdall-frontend.pro
make make
sudo make install sudo make install
NOTE: As an alternative to "sudo make install" you may chose to generate NOTE: As an alternative to "sudo make install" you may chose to generate
a package by typing the following: a package by typing the following:

2
README
View File

@ -1,5 +1,5 @@
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
Heimdall (c) 2010-2011 Benjamin Dobell, Glass Echidna Heimdall (c) 2010-2012 Benjamin Dobell, Glass Echidna
http://www.glassechidna.com.au/products/heimdall/ http://www.glassechidna.com.au/products/heimdall/
DISCLAIMER: DISCLAIMER:

View File

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros">
<QTDIR>D:\development\cpp\libraries\Qt\2010.05\qt</QTDIR>
</PropertyGroup>
<PropertyGroup />
<ItemDefinitionGroup />
<ItemGroup>
<BuildMacro Include="QTDIR">
<Value>$(QTDIR)</Value>
<EnvironmentVariable>true</EnvironmentVariable>
</BuildMacro>
</ItemGroup>
</Project>

View File

@ -772,7 +772,9 @@ void FirmwareInfo::WriteXml(QXmlStreamWriter& xml) const
xml.writeStartElement("files"); xml.writeStartElement("files");
for (int i = 0; i < fileInfos.length(); i++) for (int i = 0; i < fileInfos.length(); i++)
{
fileInfos[i].WriteXml(xml, Packaging::ClashlessFilename(fileInfos, i)); fileInfos[i].WriteXml(xml, Packaging::ClashlessFilename(fileInfos, i));
}
xml.writeEndElement(); xml.writeEndElement();

View File

@ -301,7 +301,7 @@ bool Packaging::WriteTarEntry(const QString& filePath, QTemporaryFile *tarFile,
// Note: We don't support base-256 encoding. Support could be added later. // Note: We don't support base-256 encoding. Support could be added later.
sprintf(tarHeader.fields.size, "%011llo", file.size()); sprintf(tarHeader.fields.size, "%011llo", file.size());
sprintf(tarHeader.fields.modifiedTime, "%011llo", qtFileInfo.lastModified().toMSecsSinceEpoch() / 1000); sprintf(tarHeader.fields.modifiedTime, "%011llo", qtFileInfo.lastModified().toTime_t());
// Regular File // Regular File
tarHeader.fields.typeFlag = '0'; tarHeader.fields.typeFlag = '0';
@ -381,6 +381,24 @@ bool Packaging::CreateTar(const FirmwareInfo& firmwareInfo, QTemporaryFile *tarF
for (int i = 0; i < fileInfos.length(); i++) for (int i = 0; i < fileInfos.length(); i++)
{ {
// If the file was already compressed we don't compress it again.
bool skip = false;
for (int j = 0; j < i; j++)
{
if (fileInfos[i].GetFilename() == fileInfos[j].GetFilename())
{
skip = true;
break;
}
}
if (skip)
{
progressDialog.setValue(i);
continue;
}
QString filename = ClashlessFilename(fileInfos, i); QString filename = ClashlessFilename(fileInfos, i);
if (filename == "firmware.xml") if (filename == "firmware.xml")
@ -389,7 +407,7 @@ bool Packaging::CreateTar(const FirmwareInfo& firmwareInfo, QTemporaryFile *tarF
return (false); return (false);
} }
if (!WriteTarEntry(fileInfos[i].GetFilename(), tarFile, ClashlessFilename(fileInfos, i))) if (!WriteTarEntry(fileInfos[i].GetFilename(), tarFile, filename))
{ {
tarFile->resize(0); tarFile->resize(0);
tarFile->close(); tarFile->close();
@ -666,7 +684,8 @@ QString Packaging::ClashlessFilename(const QList<FileInfo>& fileInfos, int fileI
QString otherFilename = fileInfos[i].GetFilename().mid(lastSlash + 1); QString otherFilename = fileInfos[i].GetFilename().mid(lastSlash + 1);
if (filename == otherFilename) // If the filenames are the same, but the files themselves aren't the same (i.e. not the same path), then rename.
if (filename == otherFilename && fileInfos[i].GetFilename() != fileInfos[fileInfoIndex].GetFilename())
renameIndex++; renameIndex++;
} }

View File

@ -18,12 +18,107 @@
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/ THE SOFTWARE.*/
// Qt
#include <QDir>
#include <QProcess>
// Heimdall Frontend // Heimdall Frontend
#include "aboutform.h" #include "aboutform.h"
#define UNUSED(x) (void)(x)
using namespace HeimdallFrontend; using namespace HeimdallFrontend;
AboutForm::AboutForm(QWidget *parent) : QWidget(parent) AboutForm::AboutForm(QWidget *parent) : QWidget(parent)
{ {
setupUi(this); setupUi(this);
// Heimdall Command Line
QObject::connect(&heimdallProcess, SIGNAL(readyRead()), this, SLOT(HandleHeimdallStdout()));
QObject::connect(&heimdallProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(HandleHeimdallReturned(int, QProcess::ExitStatus)));
QObject::connect(&heimdallProcess, SIGNAL(error(QProcess::ProcessError)), this, SLOT(HandleHeimdallError(QProcess::ProcessError)));
heimdallFailed = false;
RetrieveHeimdallVersion();
} }
void AboutForm::RetrieveHeimdallVersion(void)
{
heimdallProcess.setReadChannel(QProcess::StandardOutput);
heimdallProcess.start("heimdall", QStringList("version"));
heimdallProcess.waitForFinished(350);
// OS X was playing up and not finding heimdall, so we're manually checking the PATH.
if (heimdallFailed)
{
QStringList environment = QProcess::systemEnvironment();
QStringList paths;
// Ensure /usr/bin is in PATH
for (int i = 0; i < environment.length(); i++)
{
if (environment[i].left(5) == "PATH=")
{
paths = environment[i].mid(5).split(':');
paths.prepend("/usr/bin");
break;
}
}
int pathIndex = -1;
while (heimdallFailed && ++pathIndex < paths.length())
{
QString heimdallPath = paths[pathIndex];
if (heimdallPath.length() > 0)
{
heimdallFailed = false;
if (heimdallPath[heimdallPath.length() - 1] != QDir::separator())
heimdallPath += QDir::separator();
heimdallPath += "heimdall";
heimdallProcess.start(heimdallPath, QStringList("version"));
heimdallProcess.waitForFinished(350);
}
}
if (heimdallFailed)
versionCopyrightLabel->setText(versionCopyrightLabel->text().replace("%HEIMDALL-VERSION%", ""));
}
}
void AboutForm::HandleHeimdallStdout(void)
{
QString version = heimdallProcess.readAll();
if (version.length() > 0)
{
if (version.at(0) == QChar('v'))
version = version.mid(1);
versionCopyrightLabel->setText(versionCopyrightLabel->text().replace("%HEIMDALL-VERSION%", "Version " + version + "<br />"));
}
}
void AboutForm::HandleHeimdallReturned(int exitCode, QProcess::ExitStatus exitStatus)
{
UNUSED(exitCode);
UNUSED(exitStatus);
// If for some reason %HEIMDALL-VERSION% hasn't been replaced yet, we'll replace it with an empty string.
versionCopyrightLabel->setText(versionCopyrightLabel->text().replace("%HEIMDALL-VERSION%", ""));
}
void AboutForm::HandleHeimdallError(QProcess::ProcessError error)
{
UNUSED(error);
heimdallFailed = true;
}

View File

@ -19,6 +19,7 @@
THE SOFTWARE.*/ THE SOFTWARE.*/
// Qt // Qt
#include <QProcess>
#include <QWidget> #include <QWidget>
// Heimdall Frontend // Heimdall Frontend
@ -28,8 +29,24 @@ namespace HeimdallFrontend
{ {
class AboutForm : public QWidget, public Ui::AboutForm class AboutForm : public QWidget, public Ui::AboutForm
{ {
Q_OBJECT
private:
bool heimdallFailed;
QProcess heimdallProcess;
void RetrieveHeimdallVersion(void);
public: public:
explicit AboutForm(QWidget *parent = 0); explicit AboutForm(QWidget *parent = 0);
public slots:
// Heimdall Command Line
void HandleHeimdallStdout(void);
void HandleHeimdallReturned(int exitCode, QProcess::ExitStatus exitStatus);
void HandleHeimdallError(QProcess::ProcessError error);
}; };
} }

View File

@ -32,18 +32,18 @@
#include "mainwindow.h" #include "mainwindow.h"
#include "Packaging.h" #include "Packaging.h"
#define UNUSED(x) (void)(x)
using namespace HeimdallFrontend; using namespace HeimdallFrontend;
void MainWindow::StartHeimdall(const QStringList& arguments) void MainWindow::StartHeimdall(const QStringList& arguments)
{ {
flashProgressBar->setEnabled(true);
UpdateInterfaceAvailability(); UpdateInterfaceAvailability();
heimdallProcess.setReadChannel(QProcess::StandardOutput);
int pathIndex = -1; heimdallProcess.start("heimdall", arguments);
process.setReadChannel(QProcess::StandardOutput); heimdallProcess.waitForStarted(3000);
process.start("heimdall", arguments);
process.waitForStarted(3000);
// OS X was playing up and not finding heimdall, so we're manually checking the PATH. // OS X was playing up and not finding heimdall, so we're manually checking the PATH.
if (heimdallFailed) if (heimdallFailed)
@ -63,6 +63,8 @@ void MainWindow::StartHeimdall(const QStringList& arguments)
} }
} }
int pathIndex = -1;
while (heimdallFailed && ++pathIndex < paths.length()) while (heimdallFailed && ++pathIndex < paths.length())
{ {
QString heimdallPath = paths[pathIndex]; QString heimdallPath = paths[pathIndex];
@ -76,8 +78,8 @@ void MainWindow::StartHeimdall(const QStringList& arguments)
heimdallPath += "heimdall"; heimdallPath += "heimdall";
process.start(heimdallPath, arguments); heimdallProcess.start(heimdallPath, arguments);
process.waitForStarted(3000); heimdallProcess.waitForStarted(3000);
} }
} }
@ -86,7 +88,6 @@ void MainWindow::StartHeimdall(const QStringList& arguments)
flashLabel->setText("Failed to start Heimdall!"); flashLabel->setText("Failed to start Heimdall!");
heimdallState = MainWindow::kHeimdallStateStopped; heimdallState = MainWindow::kHeimdallStateStopped;
flashProgressBar->setEnabled(false);
UpdateInterfaceAvailability(); UpdateInterfaceAvailability();
} }
} }
@ -101,8 +102,8 @@ void MainWindow::UpdateUnusedPartitionIds(void)
{ {
const PitEntry *pitEntry = currentPitData.GetEntry(i); const PitEntry *pitEntry = currentPitData.GetEntry(i);
if (!pitEntry->GetUnused() && strcmp(pitEntry->GetPartitionName(), "PIT") != 0) if (pitEntry->GetBlockCount() > 0 && strcmp(pitEntry->GetPartitionName(), "PIT") != 0 && strcmp(pitEntry->GetPartitionName(), "PT") != 0)
unusedPartitionIds.append(pitEntry->GetPartitionIdentifier()); unusedPartitionIds.append(pitEntry->GetIdentifier());
} }
// Remove any used partition IDs from unusedPartitionIds // Remove any used partition IDs from unusedPartitionIds
@ -145,14 +146,9 @@ void MainWindow::UpdatePackageUserInterface(void)
developerNamesLineEdit->clear(); developerNamesLineEdit->clear();
platformLineEdit->clear(); platformLineEdit->clear();
developerHomepageButton->setEnabled(false);
developerDonateButton->setEnabled(false);
repartitionRadioButton->setChecked(false); repartitionRadioButton->setChecked(false);
noRebootRadioButton->setChecked(false); noRebootRadioButton->setChecked(false);
loadFirmwareButton->setEnabled(false);
} }
else else
{ {
@ -173,16 +169,6 @@ void MainWindow::UpdatePackageUserInterface(void)
platformLineEdit->setText(loadedPackageData.GetFirmwareInfo().GetPlatformInfo().GetName() + " (" platformLineEdit->setText(loadedPackageData.GetFirmwareInfo().GetPlatformInfo().GetName() + " ("
+ loadedPackageData.GetFirmwareInfo().GetPlatformInfo().GetVersion() + ")"); + loadedPackageData.GetFirmwareInfo().GetPlatformInfo().GetVersion() + ")");
if (!loadedPackageData.GetFirmwareInfo().GetUrl().isEmpty())
developerHomepageButton->setEnabled(true);
else
developerHomepageButton->setEnabled(false);
if (!loadedPackageData.GetFirmwareInfo().GetDonateUrl().isEmpty())
developerDonateButton->setEnabled(true);
else
developerDonateButton->setEnabled(false);
for (int i = 0; i < loadedPackageData.GetFirmwareInfo().GetDeviceInfos().length(); i++) for (int i = 0; i < loadedPackageData.GetFirmwareInfo().GetDeviceInfos().length(); i++)
{ {
const DeviceInfo& deviceInfo = loadedPackageData.GetFirmwareInfo().GetDeviceInfos()[i]; const DeviceInfo& deviceInfo = loadedPackageData.GetFirmwareInfo().GetDeviceInfos()[i];
@ -197,9 +183,9 @@ void MainWindow::UpdatePackageUserInterface(void)
repartitionRadioButton->setChecked(loadedPackageData.GetFirmwareInfo().GetRepartition()); repartitionRadioButton->setChecked(loadedPackageData.GetFirmwareInfo().GetRepartition());
noRebootRadioButton->setChecked(loadedPackageData.GetFirmwareInfo().GetNoReboot()); noRebootRadioButton->setChecked(loadedPackageData.GetFirmwareInfo().GetNoReboot());
loadFirmwareButton->setEnabled(true);
} }
UpdateLoadPackageInterfaceAvailability();
} }
bool MainWindow::IsArchive(QString path) bool MainWindow::IsArchive(QString path)
@ -209,9 +195,9 @@ bool MainWindow::IsArchive(QString path)
|| path.endsWith(".bz2", Qt::CaseInsensitive) || path.endsWith(".7z", Qt::CaseInsensitive) || path.endsWith(".rar", Qt::CaseInsensitive)); || path.endsWith(".bz2", Qt::CaseInsensitive) || path.endsWith(".7z", Qt::CaseInsensitive) || path.endsWith(".rar", Qt::CaseInsensitive));
} }
QString MainWindow::PromptFileSelection(void) QString MainWindow::PromptFileSelection(const QString& caption, const QString& filter)
{ {
QString path = QFileDialog::getOpenFileName(this, "Select File", lastDirectory); QString path = QFileDialog::getOpenFileName(this, caption, lastDirectory, filter);
if (path != "") if (path != "")
lastDirectory = path.left(path.lastIndexOf('/') + 1); lastDirectory = path.left(path.lastIndexOf('/') + 1);
@ -219,9 +205,9 @@ QString MainWindow::PromptFileSelection(void)
return (path); return (path);
} }
QString MainWindow::PromptFileCreation(void) QString MainWindow::PromptFileCreation(const QString& caption, const QString& filter)
{ {
QString path = QFileDialog::getSaveFileName(this, "Save File", lastDirectory); QString path = QFileDialog::getSaveFileName(this, caption, lastDirectory, filter);
if (path != "") if (path != "")
lastDirectory = path.left(path.lastIndexOf('/') + 1); lastDirectory = path.left(path.lastIndexOf('/') + 1);
@ -229,6 +215,167 @@ QString MainWindow::PromptFileCreation(void)
return (path); return (path);
} }
void MainWindow::UpdateLoadPackageInterfaceAvailability(void)
{
if (loadedPackageData.IsCleared())
{
developerHomepageButton->setEnabled(false);
developerDonateButton->setEnabled(false);
loadFirmwareButton->setEnabled(false);
}
else
{
if (!loadedPackageData.GetFirmwareInfo().GetUrl().isEmpty())
developerHomepageButton->setEnabled(true);
else
developerHomepageButton->setEnabled(false);
if (!loadedPackageData.GetFirmwareInfo().GetDonateUrl().isEmpty())
developerDonateButton->setEnabled(true);
else
developerDonateButton->setEnabled(false);
loadFirmwareButton->setEnabled(heimdallState == MainWindow::kHeimdallStateStopped);
}
}
void MainWindow::UpdateFlashInterfaceAvailability(void)
{
if (heimdallState == MainWindow::kHeimdallStateStopped)
{
partitionNameComboBox->setEnabled(partitionsListWidget->currentRow() >= 0);
bool allPartitionsValid = true;
QList<FileInfo>& fileList = workingPackageData.GetFirmwareInfo().GetFileInfos();
for (int i = 0; i < fileList.length(); i++)
{
if (fileList[i].GetFilename().isEmpty())
{
allPartitionsValid = false;
break;
}
}
bool validFlashSettings = allPartitionsValid && fileList.length() > 0;
flashProgressBar->setEnabled(false);
optionsGroup->setEnabled(true);
startFlashButton->setEnabled(validFlashSettings);
}
else
{
partitionNameComboBox->setEnabled(false);
flashProgressBar->setEnabled(true);
optionsGroup->setEnabled(false);
startFlashButton->setEnabled(false);
}
}
void MainWindow::UpdateCreatePackageInterfaceAvailability(void)
{
if (heimdallState == MainWindow::kHeimdallStateStopped)
{
const FirmwareInfo& firmwareInfo = workingPackageData.GetFirmwareInfo();
if (firmwareInfo.GetName().isEmpty() || firmwareInfo.GetVersion().isEmpty() || firmwareInfo.GetPlatformInfo().GetName().isEmpty()
|| firmwareInfo.GetPlatformInfo().GetVersion().isEmpty() || firmwareInfo.GetDevelopers().isEmpty() || firmwareInfo.GetDeviceInfos().isEmpty())
{
buildPackageButton->setEnabled(false);
}
else
{
buildPackageButton->setEnabled(true);
}
if (addDeveloperButton->text().isEmpty())
addDeveloperButton->setEnabled(false);
else
addDeveloperButton->setEnabled(true);
if (createDevelopersListWidget->currentRow() >= 0)
removeDeveloperButton->setEnabled(true);
else
removeDeveloperButton->setEnabled(false);
}
else
{
buildPackageButton->setEnabled(false);
}
}
void MainWindow::UpdateUtilitiesInterfaceAvailability(void)
{
if (heimdallState == MainWindow::kHeimdallStateStopped)
{
detectDeviceButton->setEnabled(true);
closePcScreenButton->setEnabled(true);
pitSaveAsButton->setEnabled(true);
if (!pitDestinationLineEdit->text().isEmpty())
downloadPitButton->setEnabled(true);
else
downloadPitButton->setEnabled(false);
if (printPitDeviceRadioBox->isChecked())
{
// Device
printLocalPitGroup->setEnabled(false);
printPitButton->setEnabled(true);
}
else
{
// Local File
printLocalPitGroup->setEnabled(true);
printLocalPitLineEdit->setEnabled(true);
printLocalPitBrowseButton->setEnabled(true);
printPitButton->setEnabled(!printLocalPitLineEdit->text().isEmpty());
}
}
else
{
detectDeviceButton->setEnabled(false);
closePcScreenButton->setEnabled(false);
pitSaveAsButton->setEnabled(false);
downloadPitButton->setEnabled(false);
printLocalPitGroup->setEnabled(false);
printPitButton->setEnabled(false);
}
}
void MainWindow::UpdateInterfaceAvailability(void)
{
UpdateLoadPackageInterfaceAvailability();
UpdateFlashInterfaceAvailability();
UpdateCreatePackageInterfaceAvailability();
UpdateUtilitiesInterfaceAvailability();
if (heimdallState == MainWindow::kHeimdallStateStopped)
{
// Enable/disable tabs
for (int i = 0; i < functionTabWidget->count(); i++)
functionTabWidget->setTabEnabled(i, true);
functionTabWidget->setTabEnabled(functionTabWidget->indexOf(createPackageTab), startFlashButton->isEnabled());
}
else
{
// Disable non-current tabs
for (int i = 0; i < functionTabWidget->count(); i++)
{
if (i == functionTabWidget->currentIndex())
functionTabWidget->setTabEnabled(i, true);
else
functionTabWidget->setTabEnabled(i, false);
}
}
}
void MainWindow::UpdatePartitionNamesInterface(void) void MainWindow::UpdatePartitionNamesInterface(void)
{ {
populatingPartitionNames = true; populatingPartitionNames = true;
@ -246,78 +393,11 @@ void MainWindow::UpdatePartitionNamesInterface(void)
partitionNameComboBox->addItem(currentPitData.FindEntry(partitionInfo.GetPartitionId())->GetPartitionName()); partitionNameComboBox->addItem(currentPitData.FindEntry(partitionInfo.GetPartitionId())->GetPartitionName());
partitionNameComboBox->setCurrentIndex(unusedPartitionIds.length()); partitionNameComboBox->setCurrentIndex(unusedPartitionIds.length());
partitionNameComboBox->setEnabled(true);
}
else
{
partitionNameComboBox->setEnabled(false);
} }
populatingPartitionNames = false; populatingPartitionNames = false;
}
void MainWindow::UpdateInterfaceAvailability(void) UpdateFlashInterfaceAvailability();
{
if (heimdallState != MainWindow::kHeimdallStateStopped)
{
startFlashButton->setEnabled(false);
detectDeviceButton->setEnabled(false);
closePcScreenButton->setEnabled(false);
pitSaveAsButton->setEnabled(false);
downloadPitButton->setEnabled(false);
printPitButton->setEnabled(false);
return;
}
else
{
detectDeviceButton->setEnabled(true);
closePcScreenButton->setEnabled(true);
pitSaveAsButton->setEnabled(true);
if (!pitDestinationLineEdit->text().isEmpty())
downloadPitButton->setEnabled(true);
else
downloadPitButton->setEnabled(false);
printPitButton->setEnabled(true);
}
bool allPartitionsValid = true;
QList<FileInfo>& fileList = workingPackageData.GetFirmwareInfo().GetFileInfos();
for (int i = 0; i < fileList.length(); i++)
{
if (fileList[i].GetFilename().isEmpty())
{
allPartitionsValid = false;
break;
}
}
bool validSettings = allPartitionsValid && fileList.length() > 0;
startFlashButton->setEnabled(validSettings);
functionTabWidget->setTabEnabled(functionTabWidget->indexOf(createPackageTab), validSettings);
}
void MainWindow::UpdateBuildPackageButton(void)
{
const FirmwareInfo& firmwareInfo = workingPackageData.GetFirmwareInfo();
if (firmwareInfo.GetName().isEmpty() || firmwareInfo.GetVersion().isEmpty() || firmwareInfo.GetPlatformInfo().GetName().isEmpty()
|| firmwareInfo.GetPlatformInfo().GetVersion().isEmpty() || firmwareInfo.GetDevelopers().isEmpty() || firmwareInfo.GetDeviceInfos().isEmpty())
{
buildPackageButton->setEnabled(false);
}
else
{
buildPackageButton->setEnabled(true);
}
} }
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
@ -388,15 +468,21 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
// Utilities Tab // Utilities Tab
QObject::connect(detectDeviceButton, SIGNAL(clicked()), this, SLOT(DetectDevice())); QObject::connect(detectDeviceButton, SIGNAL(clicked()), this, SLOT(DetectDevice()));
QObject::connect(closePcScreenButton, SIGNAL(clicked()), this, SLOT(ClosePcScreen())); QObject::connect(closePcScreenButton, SIGNAL(clicked()), this, SLOT(ClosePcScreen()));
QObject::connect(printPitDeviceRadioBox, SIGNAL(toggled(bool)), this, SLOT(DevicePrintPitToggled(bool)));
QObject::connect(printPitLocalFileRadioBox, SIGNAL(toggled(bool)), this, SLOT(LocalFilePrintPitToggled(bool)));
QObject::connect(printLocalPitBrowseButton, SIGNAL(clicked()), this, SLOT(SelectPrintPitFile()));
QObject::connect(printPitButton, SIGNAL(clicked()), this, SLOT(PrintPit())); QObject::connect(printPitButton, SIGNAL(clicked()), this, SLOT(PrintPit()));
QObject::connect(pitSaveAsButton, SIGNAL(clicked()), this, SLOT(SelectPitDestination())); QObject::connect(pitSaveAsButton, SIGNAL(clicked()), this, SLOT(SelectPitDestination()));
QObject::connect(downloadPitButton, SIGNAL(clicked()), this, SLOT(DownloadPit())); QObject::connect(downloadPitButton, SIGNAL(clicked()), this, SLOT(DownloadPit()));
// Heimdall Command Line // Heimdall Command Line
QObject::connect(&process, SIGNAL(readyRead()), this, SLOT(HandleHeimdallStdout())); QObject::connect(&heimdallProcess, SIGNAL(readyRead()), this, SLOT(HandleHeimdallStdout()));
QObject::connect(&process, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(HandleHeimdallReturned(int, QProcess::ExitStatus))); QObject::connect(&heimdallProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(HandleHeimdallReturned(int, QProcess::ExitStatus)));
QObject::connect(&process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(HandleHeimdallError(QProcess::ProcessError))); QObject::connect(&heimdallProcess, SIGNAL(error(QProcess::ProcessError)), this, SLOT(HandleHeimdallError(QProcess::ProcessError)));
} }
MainWindow::~MainWindow() MainWindow::~MainWindow()
@ -429,7 +515,7 @@ void MainWindow::SelectFirmwarePackage(void)
loadedPackageData.Clear(); loadedPackageData.Clear();
UpdatePackageUserInterface(); UpdatePackageUserInterface();
QString path = PromptFileSelection(); QString path = PromptFileSelection("Select Package", "*.tar.gz");
firmwarePackageLineEdit->setText(path); firmwarePackageLineEdit->setText(path);
if (firmwarePackageLineEdit->text() != "") if (firmwarePackageLineEdit->text() != "")
@ -458,7 +544,6 @@ void MainWindow::LoadFirmwarePackage(void)
workingPackageData.Clear(); workingPackageData.Clear();
currentPitData.Clear(); currentPitData.Clear();
// Make flashSettings responsible for the temporary files
workingPackageData.GetFiles().append(loadedPackageData.GetFiles()); workingPackageData.GetFiles().append(loadedPackageData.GetFiles());
loadedPackageData.RemoveAllFiles(); loadedPackageData.RemoveAllFiles();
@ -575,10 +660,18 @@ void MainWindow::SelectPartitionName(int index)
unusedPartitionIds.append(fileInfo.GetPartitionId()); unusedPartitionIds.append(fileInfo.GetPartitionId());
fileInfo.SetPartitionId(newPartitionIndex); fileInfo.SetPartitionId(newPartitionIndex);
PitEntry *pitEntry = currentPitData.FindEntry(newPartitionIndex);
QString title("File");
if (pitEntry && strlen(pitEntry->GetFlashFilename()) > 0)
title += " (" + QString(pitEntry->GetFlashFilename()) + ")";
partitionFileGroup->setTitle(title);
if (!fileInfo.GetFilename().isEmpty()) if (!fileInfo.GetFilename().isEmpty())
{ {
PitEntry *pitEntry = currentPitData.FindEntry(newPartitionIndex); QString partitionFilename = pitEntry->GetFlashFilename();
QString partitionFilename = pitEntry->GetFilename();
int lastPeriod = partitionFilename.lastIndexOf(QChar('.')); int lastPeriod = partitionFilename.lastIndexOf(QChar('.'));
if (lastPeriod >= 0) if (lastPeriod >= 0)
@ -610,7 +703,7 @@ void MainWindow::SelectPartitionFile(void)
FileInfo& fileInfo = workingPackageData.GetFirmwareInfo().GetFileInfos()[partitionsListWidget->currentRow()]; FileInfo& fileInfo = workingPackageData.GetFirmwareInfo().GetFileInfos()[partitionsListWidget->currentRow()];
PitEntry *pitEntry = currentPitData.FindEntry(fileInfo.GetPartitionId()); PitEntry *pitEntry = currentPitData.FindEntry(fileInfo.GetPartitionId());
QString partitionFilename = pitEntry->GetFilename(); QString partitionFilename = pitEntry->GetFlashFilename();
int lastPeriod = partitionFilename.lastIndexOf(QChar('.')); int lastPeriod = partitionFilename.lastIndexOf(QChar('.'));
if (lastPeriod >= 0) if (lastPeriod >= 0)
@ -648,6 +741,15 @@ void MainWindow::SelectPartition(int row)
partitionFileBrowseButton->setEnabled(true); partitionFileBrowseButton->setEnabled(true);
removePartitionButton->setEnabled(true); removePartitionButton->setEnabled(true);
QString title("File");
PitEntry *pitEntry = currentPitData.FindEntry(partitionInfo.GetPartitionId());
if (pitEntry && strlen(pitEntry->GetFlashFilename()) > 0)
title += " (" + QString(pitEntry->GetFlashFilename()) + ")";
partitionFileGroup->setTitle(title);
} }
else else
{ {
@ -658,6 +760,8 @@ void MainWindow::SelectPartition(int row)
partitionFileBrowseButton->setEnabled(false); partitionFileBrowseButton->setEnabled(false);
removePartitionButton->setEnabled(false); removePartitionButton->setEnabled(false);
partitionFileGroup->setTitle("File");
} }
} }
@ -673,6 +777,7 @@ void MainWindow::AddPartition(void)
partitionsListWidget->addItem(currentPitData.FindEntry(partitionInfo.GetPartitionId())->GetPartitionName()); partitionsListWidget->addItem(currentPitData.FindEntry(partitionInfo.GetPartitionId())->GetPartitionName());
partitionsListWidget->setCurrentRow(partitionsListWidget->count() - 1); partitionsListWidget->setCurrentRow(partitionsListWidget->count() - 1);
partitionsListWidget->setEnabled(false); partitionsListWidget->setEnabled(false);
UpdateInterfaceAvailability(); UpdateInterfaceAvailability();
} }
@ -693,7 +798,7 @@ void MainWindow::RemovePartition(void)
void MainWindow::SelectPit(void) void MainWindow::SelectPit(void)
{ {
QString path = PromptFileSelection(); QString path = PromptFileSelection("Select PIT", "*.pit");
bool validPit = path != ""; bool validPit = path != "";
if (validPit) if (validPit)
@ -723,7 +828,7 @@ void MainWindow::SelectPit(void)
if (pitEntry) if (pitEntry)
{ {
fileInfos[partitionInfoIndex++].SetPartitionId(pitEntry->GetPartitionIdentifier()); fileInfos[partitionInfoIndex++].SetPartitionId(pitEntry->GetIdentifier());
partitionsListWidget->addItem(pitEntry->GetPartitionName()); partitionsListWidget->addItem(pitEntry->GetPartitionName());
} }
else else
@ -828,25 +933,25 @@ void MainWindow::StartFlash(void)
void MainWindow::FirmwareNameChanged(const QString& text) void MainWindow::FirmwareNameChanged(const QString& text)
{ {
workingPackageData.GetFirmwareInfo().SetName(text); workingPackageData.GetFirmwareInfo().SetName(text);
UpdateBuildPackageButton(); UpdateInterfaceAvailability();
} }
void MainWindow::FirmwareVersionChanged(const QString& text) void MainWindow::FirmwareVersionChanged(const QString& text)
{ {
workingPackageData.GetFirmwareInfo().SetVersion(text); workingPackageData.GetFirmwareInfo().SetVersion(text);
UpdateBuildPackageButton(); UpdateInterfaceAvailability();
} }
void MainWindow::PlatformNameChanged(const QString& text) void MainWindow::PlatformNameChanged(const QString& text)
{ {
workingPackageData.GetFirmwareInfo().GetPlatformInfo().SetName(text); workingPackageData.GetFirmwareInfo().GetPlatformInfo().SetName(text);
UpdateBuildPackageButton(); UpdateInterfaceAvailability();
} }
void MainWindow::PlatformVersionChanged(const QString& text) void MainWindow::PlatformVersionChanged(const QString& text)
{ {
workingPackageData.GetFirmwareInfo().GetPlatformInfo().SetVersion(text); workingPackageData.GetFirmwareInfo().GetPlatformInfo().SetVersion(text);
UpdateBuildPackageButton(); UpdateInterfaceAvailability();
} }
void MainWindow::HomepageUrlChanged(const QString& text) void MainWindow::HomepageUrlChanged(const QString& text)
@ -861,18 +966,16 @@ void MainWindow::DonateUrlChanged(const QString& text)
void MainWindow::DeveloperNameChanged(const QString& text) void MainWindow::DeveloperNameChanged(const QString& text)
{ {
if (text.isEmpty()) UNUSED(text);
addDeveloperButton->setEnabled(false);
else UpdateCreatePackageInterfaceAvailability();
addDeveloperButton->setEnabled(true);
} }
void MainWindow::SelectDeveloper(int row) void MainWindow::SelectDeveloper(int row)
{ {
if (row >= 0) UNUSED(row);
removeDeveloperButton->setEnabled(true);
else UpdateCreatePackageInterfaceAvailability();
removeDeveloperButton->setEnabled(false);
} }
void MainWindow::AddDeveloper(void) void MainWindow::AddDeveloper(void)
@ -881,8 +984,8 @@ void MainWindow::AddDeveloper(void)
createDevelopersListWidget->addItem(createDeveloperNameLineEdit->text()); createDevelopersListWidget->addItem(createDeveloperNameLineEdit->text());
createDeveloperNameLineEdit->clear(); createDeveloperNameLineEdit->clear();
UpdateBuildPackageButton(); UpdateCreatePackageInterfaceAvailability();
} }
void MainWindow::RemoveDeveloper(void) void MainWindow::RemoveDeveloper(void)
@ -894,12 +997,14 @@ void MainWindow::RemoveDeveloper(void)
delete item; delete item;
removeDeveloperButton->setEnabled(false); removeDeveloperButton->setEnabled(false);
UpdateBuildPackageButton(); UpdateInterfaceAvailability();
} }
void MainWindow::DeviceInfoChanged(const QString& text) void MainWindow::DeviceInfoChanged(const QString& text)
{ {
UNUSED(text);
if (deviceManufacturerLineEdit->text().isEmpty() || deviceNameLineEdit->text().isEmpty() || deviceProductCodeLineEdit->text().isEmpty()) if (deviceManufacturerLineEdit->text().isEmpty() || deviceNameLineEdit->text().isEmpty() || deviceProductCodeLineEdit->text().isEmpty())
addDeviceButton->setEnabled(false); addDeviceButton->setEnabled(false);
else else
@ -923,8 +1028,8 @@ void MainWindow::AddDevice(void)
deviceManufacturerLineEdit->clear(); deviceManufacturerLineEdit->clear();
deviceNameLineEdit->clear(); deviceNameLineEdit->clear();
deviceProductCodeLineEdit->clear(); deviceProductCodeLineEdit->clear();
UpdateBuildPackageButton(); UpdateInterfaceAvailability();
} }
void MainWindow::RemoveDevice(void) void MainWindow::RemoveDevice(void)
@ -936,13 +1041,13 @@ void MainWindow::RemoveDevice(void)
delete item; delete item;
removeDeviceButton->setEnabled(false); removeDeviceButton->setEnabled(false);
UpdateBuildPackageButton(); UpdateInterfaceAvailability();
} }
void MainWindow::BuildPackage(void) void MainWindow::BuildPackage(void)
{ {
QString packagePath = PromptFileCreation(); QString packagePath = PromptFileCreation("Save Package", "*.tar.gz");
if (!packagePath.isEmpty()) if (!packagePath.isEmpty())
{ {
@ -995,7 +1100,7 @@ void MainWindow::ClosePcScreen(void)
void MainWindow::SelectPitDestination(void) void MainWindow::SelectPitDestination(void)
{ {
QString path = PromptFileCreation(); QString path = PromptFileCreation("Save PIT", "*.pit");
if (path != "") if (path != "")
{ {
@ -1029,6 +1134,41 @@ void MainWindow::DownloadPit(void)
StartHeimdall(arguments); StartHeimdall(arguments);
} }
void MainWindow::DevicePrintPitToggled(bool checked)
{
if (checked)
{
if (printPitLocalFileRadioBox->isChecked())
printPitLocalFileRadioBox->setChecked(false);
}
UpdateUtilitiesInterfaceAvailability();
}
void MainWindow::LocalFilePrintPitToggled(bool checked)
{
if (checked)
{
if (printPitDeviceRadioBox->isChecked())
printPitDeviceRadioBox->setChecked(false);
}
UpdateUtilitiesInterfaceAvailability();
}
void MainWindow::SelectPrintPitFile(void)
{
QString path = PromptFileSelection("Select PIT", "*.pit");
if (path != "")
printLocalPitLineEdit->setText(path);
if (printLocalPitLineEdit->text() != "")
printPitButton->setEnabled(true);
else
printPitButton->setEnabled(false);
}
void MainWindow::PrintPit(void) void MainWindow::PrintPit(void)
{ {
utilityOutputPlainTextEdit->clear(); utilityOutputPlainTextEdit->clear();
@ -1039,14 +1179,21 @@ void MainWindow::PrintPit(void)
QStringList arguments; QStringList arguments;
arguments.append("print-pit"); arguments.append("print-pit");
if (printPitLocalFileRadioBox->isChecked())
{
arguments.append("--file");
arguments.append(printLocalPitLineEdit->text());
}
arguments.append("--stdout-errors"); arguments.append("--stdout-errors");
arguments.append("--no-reboot");
StartHeimdall(arguments); StartHeimdall(arguments);
} }
void MainWindow::HandleHeimdallStdout(void) void MainWindow::HandleHeimdallStdout(void)
{ {
QString output = process.readAll(); QString output = heimdallProcess.readAll();
// We often receive multiple lots of output from Heimdall at one time. So we use regular expressions // We often receive multiple lots of output from Heimdall at one time. So we use regular expressions
// to ensure we don't miss out on any important information. // to ensure we don't miss out on any important information.
@ -1078,29 +1225,22 @@ void MainWindow::HandleHeimdallStdout(void)
void MainWindow::HandleHeimdallReturned(int exitCode, QProcess::ExitStatus exitStatus) void MainWindow::HandleHeimdallReturned(int exitCode, QProcess::ExitStatus exitStatus)
{ {
// This is a work-around for strange issues as a result of a exitCode being cast to if (exitStatus == QProcess::NormalExit && exitCode == 0)
// a unsigned char.
char byteExitCode = exitCode;
if (exitStatus == QProcess::NormalExit && byteExitCode >= 0)
{ {
if (heimdallState == MainWindow::kHeimdallStateFlashing) if (heimdallState == MainWindow::kHeimdallStateFlashing)
{ {
if (byteExitCode == 1) flashLabel->setText("Flash completed successfully!");
flashLabel->setText("Failed to detect compatible device!");
else
flashLabel->setText("Flash completed sucessfully!");
} }
else if (heimdallState == MainWindow::kHeimdallStateDetectingDevice) else if (heimdallState == MainWindow::kHeimdallStateDetectingDevice)
{ {
deviceDetectedRadioButton->setChecked(byteExitCode == 0); deviceDetectedRadioButton->setChecked(true);
} }
} }
else else
{ {
if (heimdallState == MainWindow::kHeimdallStateFlashing) if (heimdallState == MainWindow::kHeimdallStateFlashing)
{ {
QString error = process.readAllStandardError(); QString error = heimdallProcess.readAllStandardError();
int lastNewLineChar = error.lastIndexOf('\n'); int lastNewLineChar = error.lastIndexOf('\n');
@ -1111,6 +1251,10 @@ void MainWindow::HandleHeimdallReturned(int exitCode, QProcess::ExitStatus exitS
flashLabel->setText(error); flashLabel->setText(error);
} }
else if (heimdallState == MainWindow::kHeimdallStateDetectingDevice)
{
deviceDetectedRadioButton->setChecked(false);
}
} }
heimdallState = MainWindow::kHeimdallStateStopped; heimdallState = MainWindow::kHeimdallStateStopped;

View File

@ -56,6 +56,12 @@ namespace HeimdallFrontend
kHeimdallStateCount kHeimdallStateCount
}; };
enum
{
kPrintPitSourceDevice = 0,
kPrintPitSourceLocalFile
};
AboutForm aboutForm; AboutForm aboutForm;
QString lastDirectory; QString lastDirectory;
@ -64,7 +70,7 @@ namespace HeimdallFrontend
bool heimdallFailed; bool heimdallFailed;
int heimdallState; int heimdallState;
QProcess process; QProcess heimdallProcess;
PackageData loadedPackageData; PackageData loadedPackageData;
@ -76,6 +82,7 @@ namespace HeimdallFrontend
bool verboseOutput; bool verboseOutput;
void StartHeimdall(const QStringList& arguments); void StartHeimdall(const QStringList& arguments);
void UpdateUnusedPartitionIds(void); void UpdateUnusedPartitionIds(void);
@ -85,13 +92,16 @@ namespace HeimdallFrontend
bool IsArchive(QString path); bool IsArchive(QString path);
QString PromptFileSelection(void); QString PromptFileSelection(const QString& caption = QString("Select File"), const QString& filter = QString());
QString PromptFileCreation(void); QString PromptFileCreation(const QString& caption = QString("Save File"), const QString& filter = QString());
void UpdatePartitionNamesInterface(void); void UpdateLoadPackageInterfaceAvailability(void);
void UpdateFlashInterfaceAvailability(void);
void UpdateCreatePackageInterfaceAvailability(void);
void UpdateUtilitiesInterfaceAvailability(void);
void UpdateInterfaceAvailability(void); void UpdateInterfaceAvailability(void);
void UpdateBuildPackageButton(void); void UpdatePartitionNamesInterface(void);
public: public:
@ -155,6 +165,9 @@ namespace HeimdallFrontend
void SelectPitDestination(void); void SelectPitDestination(void);
void DownloadPit(void); void DownloadPit(void);
void DevicePrintPitToggled(bool checked);
void LocalFilePrintPitToggled(bool checked);
void SelectPrintPitFile(void);
void PrintPit(void); void PrintPit(void);
// Heimdall Command Line // Heimdall Command Line

View File

@ -96,7 +96,7 @@
<number>0</number> <number>0</number>
</property> </property>
<item> <item>
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="versionCopyrightLabel">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
@ -114,11 +114,11 @@
p, li { white-space: pre-wrap; } p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt; &lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Heimdall Frontend&lt;/span&gt;&lt;/p&gt; &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Heimdall Frontend&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Version 1.3.2&lt;/p&gt; &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Version 1.4 RC1&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Copyright © 2010-2012 Benjamin Dobell, Glass Echidna&lt;/p&gt; &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Copyright © 2010-2012 Benjamin Dobell, Glass Echidna&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;/p&gt; &lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Heimdall (command line)&lt;/span&gt;&lt;/p&gt; &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Heimdall (command line)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Copyright © 2010-2012 Benjamin Dobell, Glass Echidna&lt;/p&gt; &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;%HEIMDALL-VERSION%Copyright © 2010-2012 Benjamin Dobell, Glass Echidna&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> &lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property> </property>
<property name="textFormat"> <property name="textFormat">

View File

@ -1,4 +1,4 @@
Copyright (c) 2010-2011 Benjamin Dobell, Glass Echidna Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@ -1,4 +1,4 @@
Heimdall (c) 2010-2011 Benjamin Dobell, Glass Echidna Heimdall (c) 2010-2012 Benjamin Dobell, Glass Echidna
http://www.glassechidna.com.au/products/heimdall/ http://www.glassechidna.com.au/products/heimdall/
DISCLAIMER: DISCLAIMER:
@ -23,8 +23,7 @@ Flashing Heimdall Firmware Package with Heimdall Frontend:
1. Fully charge your device (use the wall charger as it's faster). 1. Fully charge your device (use the wall charger as it's faster).
2. Open Heimdall Frontend, which can be done by entering the following 2. Open the a terminal and run Heimdall Frontend by typing:
command in a terminal:
heimdall-frontend heimdall-frontend
@ -82,14 +81,15 @@ Flashing Heimdall Firmware Package with Heimdall Frontend:
Performing a Custom Flash with Heimdall Frontend: Performing a Custom Flash with Heimdall Frontend:
This is the advanced means of flashing firmware to your device. You should This is the advanced means of flashing firmware to your device.
only flash firmware to your device this way if you know what you're doing.
If you're not an advanced user or a developer, in the event that a Heimdall If you're not an advanced user or a developer, in the event that a Heimdall
Firmware Package doesn't exist for the particular firmware you wish to Firmware Package doesn't exist for the particular firmware (or files) that
flash. I strongly recommend you get in touch with developer of the you wish to flash, then I strongly recommend you get in touch with the
firmware, or an advanced user, and politely ask them to create a Heimdall developer of the firmware (or files) and politely ask them to create a
Firmware Package for you. Heimdall Firmware Package for you. In doing so, you avoid the risk of
making mistakes due to inexperience.
If you're looking to customise an existing Heimdall Firmware Package then If you're looking to customise an existing Heimdall Firmware Package then
follow steps 1-8 of "Flashing Heimdall Firmware Package with Heimdall follow steps 1-8 of "Flashing Heimdall Firmware Package with Heimdall
@ -108,8 +108,7 @@ Performing a Custom Flash with Heimdall Frontend:
NOTE: If you want to use the CSC then extract it last. If you're asked NOTE: If you want to use the CSC then extract it last. If you're asked
to overwrite files then do so. to overwrite files then do so.
3. Open Heimdall Frontend, which can be done by entering the following 3. Open the a terminal and run Heimdall Frontend by typing:
command in a terminal:
heimdall-frontend heimdall-frontend
@ -119,11 +118,14 @@ Performing a Custom Flash with Heimdall Frontend:
5. Before you can chose which partitions you want to flash with particular 5. Before you can chose which partitions you want to flash with particular
files you MUST first select a PIT file. To do this click the "Browse" files you MUST first select a PIT file. To do this click the "Browse"
button in the "PIT" section. This will open a dialogue allowing you to button in the "PIT" section. This will open a dialogue allowing you to
navigate to and select a valid PIT (.pit) file. navigate to and select a valid PIT (.pit) file.
6. If a valid PIT file has been selected then "Add" button below the list If you do not already have a valid PIT file stored on your computer you
box will become enabled. Press this button to add a partition to your can download your device's PIT file from the "Utilities" tab.
flash.
6. If a valid PIT file has been selected then the "Add" button below the
"Partitions (Files)" list-box will be enabled. Press this button to add
a partition to your flash.
7. When you first add a partition you will see the "Partition Name" and 7. When you first add a partition you will see the "Partition Name" and
"Partition ID" be populated with information. Use the "Partition Name" "Partition ID" be populated with information. Use the "Partition Name"
@ -221,7 +223,7 @@ How to Create a Heimdall Firmware Package:
compressed with gzip. The only two real requirements are that a valid compressed with gzip. The only two real requirements are that a valid
firmware.xml must be included (refer to Appendix A) and you can only firmware.xml must be included (refer to Appendix A) and you can only
include files (no directories, links etc.) As such if you'd like there is include files (no directories, links etc.) As such if you'd like there is
nothing preventing you creating Heimdall packages manually. Of course nothing preventing you from creating Heimdall packages manually. Of course
Heimdall Frontend provides a simple user interface that takes care of all Heimdall Frontend provides a simple user interface that takes care of all
the hard work for you. the hard work for you.
@ -229,12 +231,11 @@ How to Create a Heimdall Firmware Package:
create a package from scratch, or you can load an existing package, apply create a package from scratch, or you can load an existing package, apply
modifications and then save the package. Creating a package from scratch modifications and then save the package. Creating a package from scratch
is the preferred approach, by taking this approach you're far less likely is the preferred approach, by taking this approach you're far less likely
to run into file name length limitations, these are not Heimdall's own to run into file name length limitations.
limitation but rather a limitation of the TAR archive format.
Before you can access Heimdall Frontend's firmware creation functionality Before you can access Heimdall Frontend's firmware creation functionality
(available from the "Create Package" tab) you must first specify which (available from the "Create Package" tab) you must first specify which
files will be included in your package as well as a few flashing options files will be included in your package, as well as a few flashing options
i.e. Whether or not users should repartition when flashing. This i.e. Whether or not users should repartition when flashing. This
information must be filled out from the "Flash" tab in exactly the same information must be filled out from the "Flash" tab in exactly the same
fashion you would provide information to flash your device (see "Performing fashion you would provide information to flash your device (see "Performing
@ -246,7 +247,7 @@ How to Create a Heimdall Firmware Package:
firmware package the "Create Package" tab will become available. Clicking firmware package the "Create Package" tab will become available. Clicking
this tab will display additional information that you can include in your this tab will display additional information that you can include in your
package. In order to continue you must fill out all sections except for the package. In order to continue you must fill out all sections except for the
URLs section, which is optional. The following is break-down of what all URLs section, which is optional. The following is a break-down of what all
these options mean. these options mean.
- General Firmware Information: - - General Firmware Information: -
@ -254,11 +255,11 @@ How to Create a Heimdall Firmware Package:
Firmware Name - This is the name of your particular firmware. An Firmware Name - This is the name of your particular firmware. An
example would be "Cyanogenmod". example would be "Cyanogenmod".
Firmware Version - This is the particular version identifier for your Firmware Version - This is the version identifier for your package. Any
package. Any valid string will be accepted although a the inclusion valid string will be accepted, although the inclusion of decimal
of decimal point version number is preferred releases i.e. "7.1". point version number is preferred i.e. "7.1". If it makes sense
If it makes sense then feel free to append a text string like "RC1" then feel free to append a text string like "RC1" or "Beta 1" to
or "Beta 1" to the decimal point version. the decimal point version.
Platform Name - This is the name of platform (or operating system) that Platform Name - This is the name of platform (or operating system) that
your firmware is based on. In most cases this will simply be your firmware is based on. In most cases this will simply be
@ -295,9 +296,9 @@ How to Create a Heimdall Firmware Package:
team name. Click "Add" and the developer will be added to the list team name. Click "Add" and the developer will be added to the list
on the right. If you make a mistake you can select a developer from on the right. If you make a mistake you can select a developer from
the list and click "Remove". You can list as many developers as you the list and click "Remove". You can list as many developers as you
like however size constraints of the "Load Package" means only a like, however visual constraints of the "Load Package" tab means
few will be visible. Where possible you may want to opt for team only a few names will be visible. Where possible you may want to
names over listing individual team members. opt for team names over listing individual team members.
- Supported Devices - - Supported Devices -
@ -325,7 +326,7 @@ How to Create a Heimdall Firmware Package:
Product Codes (or product IDs) are designated by manufacturers and Product Codes (or product IDs) are designated by manufacturers and
are generally the definitive means of referring to a particular are generally the definitive means of referring to a particular
device. Examples are "GT-I9000", "GT-I9100" and "SCH-I897". If device. Examples are "GT-I9000", "GT-I9100" and "SCH-I897". If
you're unsure of a particular product code then Google and you're unsure of a particular product code then both Google and
GSMArena are your friends! GSMArena are your friends!
@ -339,7 +340,7 @@ How to Create a Heimdall Firmware Package:
Once you've chosen a file name Heimdall Frontend will begin the process of Once you've chosen a file name Heimdall Frontend will begin the process of
building the firmware package. In doing so a valid firmware.xml file will building the firmware package. In doing so a valid firmware.xml file will
be generated from the information entered, all files will be archived in a be generated from the information entered. All files will be archived in a
single TAR file then the TAR archive will be compressed via gzip single TAR file then the TAR archive will be compressed via gzip
compression. Compression will take a little while but you will see progress compression. Compression will take a little while but you will see progress
bars so you know the application hasn't hung. When the progress bars bars so you know the application hasn't hung. When the progress bars
@ -359,12 +360,12 @@ for the format in their own software.
All Heimdall Firmware Packages must contain a file called firmware.xml. This All Heimdall Firmware Packages must contain a file called firmware.xml. This
file stores information stores meta-data for the package as well as information file stores flash information and meta-data for the package as well as
about other files contained in the package that indicates how they should be information about other files contained within the package.
flashed.
The format is fairly straight-forward so it won't be explained in great detail,
nonetheless the following is an example of a valid firmware.xml file. The format is fairly straight-forward so it won't be explained in great detail.
Nonetheless the following is an example of a valid firmware.xml file.
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<firmware version="1"> <firmware version="1">
@ -461,17 +462,19 @@ be included.
Appendix B - Installing Heimdall from Source: Appendix B - Installing Heimdall from Source:
1. First make sure you have installed build-tools and pkgconfig. 1. First make sure you have installed build-tools, pkgconfig, zlib-dev and
libusb-1.0-dev (v1.0.8 or newer).
NOTE: Package names may not be absolutely identical to those above.
2. Open a terminal and navigate to the directory you downloaded, 2. Open a terminal and navigate to the directory you downloaded,
or extracted, Heimdall to. or extracted, Heimdall to.
3. Enter the following commands to compile and install libusb-1.0: 3. Enter the following commands to compile libpit:
cd libusb-1.0 cd libpit
./configure ./configure
make make
sudo make install
cd .. cd ..
If you have problems please consult http://www.libusb.org/ If you have problems please consult http://www.libusb.org/
@ -493,8 +496,12 @@ Appendix B - Installing Heimdall from Source:
sudo make install sudo make install
cd .. cd ..
NOTE: You can use "checkinstall" instead of "make install" in order NOTE: As an alternative to "sudo make install" you may chose to generate
to generate a redistributable package. a package by typing the following:
sudo checkinstall --pkgversion <version>
Where <version> is the current Heimdall release e.g. 1.3.0
5. Done 5. Done
@ -513,9 +520,9 @@ Appendix C - Installing Heimdall Frontend from Source:
4. Enter the following commands to compile and install Heimdall Frontend: 4. Enter the following commands to compile and install Heimdall Frontend:
cd heimdall-frontend cd heimdall-frontend
qmake heimdall-frontend.pro qmake-qt4 heimdall-frontend.pro
make make
sudo make install sudo make install
NOTE: As an alternative to "sudo make install" you may chose to generate NOTE: As an alternative to "sudo make install" you may chose to generate
a package by typing the following: a package by typing the following:

View File

@ -17,34 +17,34 @@ macx {
config += x86 x86_64 ppc config += x86 x86_64 ppc
isEqual(OUTPUTDIR, "") { isEmpty(OUTPUTDIR) {
DESTDIR = /Applications DESTDIR = /Applications
} else { } else {
DESTDIR = $$OUTPUTDIR DESTDIR = $$(OUTPUTDIR)
} }
} else { } else {
win32 { # It's recommended that Windows users compile via VS2010, but just in case... win32 { # It is recommended that Windows users compile via VS2010, but just in case...
DESTDIR = ../Win32 DESTDIR = ../Win32
!isEqual(OUTPUTDIR, "") { !isEmpty(OUTPUTDIR) {
target.path = $$OUTPUTDIR target.path = $$(OUTPUTDIR)
INSTALLS += target INSTALLS += target
} }
} else { } else {
DESTDIR = ../Linux DESTDIR = ../Linux
isEqual(OUTPUTDIR, "") { isEmpty(OUTPUTDIR) {
target.path = /usr/local/bin target.path = /usr/local/bin
} else { } else {
target.path = $$OUTPUTDIR target.path = $$(OUTPUTDIR)
} }
INSTALLS += target INSTALLS += target
} }
} }
unix:LIBS += -lz ../libpit/libpit-1.3.a unix:LIBS += -lz ../libpit/libpit-1.4.a
win32:LIBS += ../Win32/Release/lib/libpit.lib win32:LIBS += ../Win32/Release/lib/libpit.lib
QT += core gui xml QT += core gui xml

View File

@ -69,7 +69,7 @@
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>$(QTDIR)\lib;$(SolutionDir)$(Platform)\$(Configuration)\lib\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>$(QTDIR)\lib;$(SolutionDir)$(Platform)\$(Configuration)\lib\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>qtmaind.lib;QtCored4.lib;QtGuid4.lib;QtXml4.lib;libpit.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>qtmaind.lib;QtCored4.lib;QtGuid4.lib;QtXmld4.lib;libpit.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@ -94,6 +94,9 @@
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="GeneratedFiles\Debug\moc_aboutform.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_mainwindow.cpp"> <ClCompile Include="GeneratedFiles\Debug\moc_mainwindow.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile> </ClCompile>
@ -103,6 +106,9 @@
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
</PrecompiledHeader> </PrecompiledHeader>
</ClCompile> </ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_aboutform.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_mainwindow.cpp"> <ClCompile Include="GeneratedFiles\Release\moc_mainwindow.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
</ClCompile> </ClCompile>
@ -130,7 +136,16 @@
<ItemGroup> <ItemGroup>
<ClInclude Include="GeneratedFiles\ui_aboutform.h" /> <ClInclude Include="GeneratedFiles\ui_aboutform.h" />
<ClInclude Include="GeneratedFiles\ui_mainwindow.h" /> <ClInclude Include="GeneratedFiles\ui_mainwindow.h" />
<ClInclude Include="Source\aboutform.h" /> <CustomBuild Include="Source\aboutform.h">
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing %(Identity)...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtXml" "-I." "-I.\..\libpit\Source" "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." -D_UNICODE -DQT_CORE_LIB -DQT_GUI_LIB -DQT_LARGEFILE_SUPPORT -DUNICODE -DWIN32</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing %(Identity)...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtXml" "-I." "-I.\..\libpit\Source" "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_LARGEFILE_SUPPORT -DQT_NO_DEBUG -DUNICODE -DWIN32</Command>
</CustomBuild>
<ClInclude Include="Source\Alerts.h" /> <ClInclude Include="Source\Alerts.h" />
<ClInclude Include="Source\FirmwareInfo.h" /> <ClInclude Include="Source\FirmwareInfo.h" />
<ClInclude Include="Source\PackageData.h" /> <ClInclude Include="Source\PackageData.h" />
@ -170,6 +185,7 @@
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Uic%27ing %(Identity)...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Uic%27ing %(Identity)...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\ui_%(Filename).h;%(Outputs)</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\ui_%(Filename).h;%(Outputs)</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"</Command> <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"</Command>
<SubType>Designer</SubType>
</CustomBuild> </CustomBuild>
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

View File

@ -61,6 +61,12 @@
<ClCompile Include="Source\Alerts.cpp"> <ClCompile Include="Source\Alerts.cpp">
<Filter>Source</Filter> <Filter>Source</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_aboutform.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_aboutform.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<CustomBuild Include="mainwindow.ui"> <CustomBuild Include="mainwindow.ui">
@ -75,6 +81,9 @@
<CustomBuild Include="AboutForm.ui"> <CustomBuild Include="AboutForm.ui">
<Filter>Form Files</Filter> <Filter>Form Files</Filter>
</CustomBuild> </CustomBuild>
<CustomBuild Include="Source\aboutform.h">
<Filter>Source</Filter>
</CustomBuild>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="GeneratedFiles\ui_mainwindow.h"> <ClInclude Include="GeneratedFiles\ui_mainwindow.h">
@ -83,9 +92,6 @@
<ClInclude Include="GeneratedFiles\ui_AboutForm.h"> <ClInclude Include="GeneratedFiles\ui_AboutForm.h">
<Filter>Generated Files</Filter> <Filter>Generated Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Source\aboutform.h">
<Filter>Source</Filter>
</ClInclude>
<ClInclude Include="Source\Packaging.h"> <ClInclude Include="Source\Packaging.h">
<Filter>Source</Filter> <Filter>Source</Filter>
</ClInclude> </ClInclude>

View File

@ -414,9 +414,9 @@
</property> </property>
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>320</x> <x>350</x>
<y>130</y> <y>130</y>
<width>301</width> <width>271</width>
<height>31</height> <height>31</height>
</rect> </rect>
</property> </property>
@ -451,7 +451,7 @@
<rect> <rect>
<x>10</x> <x>10</x>
<y>130</y> <y>130</y>
<width>301</width> <width>331</width>
<height>21</height> <height>21</height>
</rect> </rect>
</property> </property>
@ -1348,7 +1348,7 @@
<rect> <rect>
<x>10</x> <x>10</x>
<y>80</y> <y>80</y>
<width>471</width> <width>461</width>
<height>141</height> <height>141</height>
</rect> </rect>
</property> </property>
@ -1360,7 +1360,7 @@
<rect> <rect>
<x>10</x> <x>10</x>
<y>30</y> <y>30</y>
<width>451</width> <width>441</width>
<height>71</height> <height>71</height>
</rect> </rect>
</property> </property>
@ -1375,7 +1375,7 @@
<rect> <rect>
<x>10</x> <x>10</x>
<y>30</y> <y>30</y>
<width>321</width> <width>311</width>
<height>21</height> <height>21</height>
</rect> </rect>
</property> </property>
@ -1389,7 +1389,7 @@
</property> </property>
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>350</x> <x>340</x>
<y>30</y> <y>30</y>
<width>91</width> <width>91</width>
<height>23</height> <height>23</height>
@ -1406,7 +1406,7 @@
</property> </property>
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>330</x> <x>320</x>
<y>110</y> <y>110</y>
<width>101</width> <width>101</width>
<height>23</height> <height>23</height>
@ -1419,7 +1419,7 @@
<widget class="QLabel" name="downloadPitTipLabel"> <widget class="QLabel" name="downloadPitTipLabel">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>440</x> <x>430</x>
<y>110</y> <y>110</y>
<width>21</width> <width>21</width>
<height>23</height> <height>23</height>
@ -1432,7 +1432,7 @@
</font> </font>
</property> </property>
<property name="toolTip"> <property name="toolTip">
<string notr="true">Download a devices PIT file.</string> <string notr="true">Download and save a device's PIT file.</string>
</property> </property>
<property name="frameShape"> <property name="frameShape">
<enum>QFrame::Panel</enum> <enum>QFrame::Panel</enum>
@ -1494,7 +1494,7 @@
<rect> <rect>
<x>10</x> <x>10</x>
<y>10</y> <y>10</y>
<width>301</width> <width>291</width>
<height>61</height> <height>61</height>
</rect> </rect>
</property> </property>
@ -1504,7 +1504,7 @@
<widget class="QPushButton" name="detectDeviceButton"> <widget class="QPushButton" name="detectDeviceButton">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>180</x> <x>170</x>
<y>30</y> <y>30</y>
<width>81</width> <width>81</width>
<height>23</height> <height>23</height>
@ -1525,7 +1525,7 @@
<rect> <rect>
<x>10</x> <x>10</x>
<y>30</y> <y>30</y>
<width>161</width> <width>151</width>
<height>21</height> <height>21</height>
</rect> </rect>
</property> </property>
@ -1542,7 +1542,7 @@
</property> </property>
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>270</x> <x>260</x>
<y>30</y> <y>30</y>
<width>21</width> <width>21</width>
<height>23</height> <height>23</height>
@ -1555,7 +1555,7 @@
</font> </font>
</property> </property>
<property name="toolTip"> <property name="toolTip">
<string notr="true">Detect for a device connected in download mode.</string> <string notr="true">Detect whether or not a device is connected in download mode.</string>
</property> </property>
<property name="statusTip"> <property name="statusTip">
<string notr="true"/> <string notr="true"/>
@ -1586,10 +1586,10 @@
<widget class="QGroupBox" name="printPitGroup"> <widget class="QGroupBox" name="printPitGroup">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>490</x> <x>480</x>
<y>10</y> <y>10</y>
<width>161</width> <width>291</width>
<height>61</height> <height>211</height>
</rect> </rect>
</property> </property>
<property name="title"> <property name="title">
@ -1598,8 +1598,8 @@
<widget class="QPushButton" name="printPitButton"> <widget class="QPushButton" name="printPitButton">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>40</x> <x>160</x>
<y>30</y> <y>180</y>
<width>81</width> <width>81</width>
<height>23</height> <height>23</height>
</rect> </rect>
@ -1611,8 +1611,8 @@
<widget class="QLabel" name="printPitTipLabel"> <widget class="QLabel" name="printPitTipLabel">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>130</x> <x>250</x>
<y>30</y> <y>180</y>
<width>21</width> <width>21</width>
<height>23</height> <height>23</height>
</rect> </rect>
@ -1624,7 +1624,7 @@
</font> </font>
</property> </property>
<property name="toolTip"> <property name="toolTip">
<string notr="true">Print the contents of a device's PIT file.</string> <string notr="true">Print the contents of a PIT file in a human readable fashion.</string>
</property> </property>
<property name="frameShape"> <property name="frameShape">
<enum>QFrame::Panel</enum> <enum>QFrame::Panel</enum>
@ -1645,11 +1645,100 @@
<set>Qt::AlignCenter</set> <set>Qt::AlignCenter</set>
</property> </property>
</widget> </widget>
<widget class="QRadioButton" name="printPitDeviceRadioBox">
<property name="enabled">
<bool>true</bool>
</property>
<property name="geometry">
<rect>
<x>20</x>
<y>30</y>
<width>261</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>Device</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
<widget class="QRadioButton" name="printPitLocalFileRadioBox">
<property name="enabled">
<bool>true</bool>
</property>
<property name="geometry">
<rect>
<x>20</x>
<y>60</y>
<width>261</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>Local File</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
<widget class="QGroupBox" name="printLocalPitGroup">
<property name="enabled">
<bool>false</bool>
</property>
<property name="geometry">
<rect>
<x>10</x>
<y>100</y>
<width>271</width>
<height>71</height>
</rect>
</property>
<property name="title">
<string>PIT File</string>
</property>
<widget class="QLineEdit" name="printLocalPitLineEdit">
<property name="enabled">
<bool>false</bool>
</property>
<property name="geometry">
<rect>
<x>10</x>
<y>30</y>
<width>171</width>
<height>21</height>
</rect>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
<widget class="QPushButton" name="printLocalPitBrowseButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="geometry">
<rect>
<x>190</x>
<y>30</y>
<width>71</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Browse</string>
</property>
</widget>
</widget>
</widget> </widget>
<widget class="QGroupBox" name="closePcScreenGroup"> <widget class="QGroupBox" name="closePcScreenGroup">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>320</x> <x>310</x>
<y>10</y> <y>10</y>
<width>161</width> <width>161</width>
<height>61</height> <height>61</height>
@ -1687,7 +1776,7 @@
</font> </font>
</property> </property>
<property name="toolTip"> <property name="toolTip">
<string notr="true">Close the device &lt;--&gt; PC screen displayed on a device.</string> <string notr="true">Close the &quot;device &lt;--&gt; PC&quot; screen displayed on a device.</string>
</property> </property>
<property name="frameShape"> <property name="frameShape">
<enum>QFrame::Panel</enum> <enum>QFrame::Panel</enum>

View File

@ -1,4 +1,4 @@
Copyright (c) 2010-2011 Benjamin Dobell, Glass Echidna Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@ -1,34 +1,42 @@
AUTOMAKE_OPTIONS = subdir-objects AUTOMAKE_OPTIONS = subdir-objects
ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS} ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS}
AM_CPPFLAGS = $(DEPS_CFLAGS) -I../libpit/Source AM_CPPFLAGS = $(DEPS_CFLAGS) -I../libpit/Source
STATIC_LIBS = ../libpit/libpit-1.3.a STATIC_LIBS = ../libpit/libpit-1.4.a
bin_PROGRAMS = heimdall bin_PROGRAMS = heimdall
heimdall_SOURCES = source/BeginDumpPacket.h source/BridgeManager.cpp \ heimdall_SOURCES = source/Arguments.cpp \
source/BridgeManager.h source/DumpPartPitFilePacket.h source/DumpResponse.h \ source/BridgeManager.cpp \
source/EndFileTransferPacket.h source/EndModemFileTransferPacket.h \ source/ClosePcScreenAction.cpp \
source/EndPitFileTransferPacket.h source/EndPhoneFileTransferPacket.h \ source/DetectAction.cpp \
source/EndSessionPacket.h source/FileTransferPacket.h source/FlashPartFileTransferPacket.h \ source/DownloadPitAction.cpp \
source/FlashPartPitFilePacket.h source/Heimdall.h source/InboundPacket.h \ source/DumpAction.cpp \
source/Interface.cpp source/Interface.h source/main.cpp source/OutboundPacket.h \ source/FlashAction.cpp \
source/Packet.h source/PitFilePacket.h source/PitFileResponse.h source/ReceiveFilePartPacket.h \ source/HelpAction.cpp \
source/ResponsePacket.h source/SendFilePartPacket.h source/SendFilePartResponse.h \ source/InfoAction.cpp \
source/ControlPacket.h source/SessionSetupPacket.h source/SessionSetupResponse.h \ source/Interface.cpp \
source/DumpPartFileTransferPacket.h source/main.cpp \
source/PrintPitAction.cpp \
heimdall_LDADD = $(DEPS_LIBS) $(STATIC_LIBS) source/Utility.cpp \
source/VersionAction.cpp
if LINUXTARGET
udevrulesdir = /lib/udev/rules.d heimdall_LDADD = $(DEPS_LIBS) $(STATIC_LIBS)
udevrules_DATA = 60-heimdall-galaxy-s.rules
if LINUXTARGET
install-data-hook:
if UDEVADM udevrulesdir = /lib/udev/rules.d
sudo udevadm control --reload_rules udevrules_DATA = 60-heimdall-galaxy-s.rules
else
sudo service udev restart install-data-hook:
endif @echo ""
@echo "IMPORTANT - You must reboot your machine or execute the following as root:"
endif
if UDEVADM
dist_noinst_SCRIPTS = autogen.sh @echo "udevadm control --reload_rules"
else
@echo "service udev restart"
endif
@echo ""
endif
dist_noinst_SCRIPTS = autogen.sh

View File

@ -56,8 +56,15 @@ CONFIG_CLEAN_VPATH_FILES =
am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(udevrulesdir)" am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(udevrulesdir)"
PROGRAMS = $(bin_PROGRAMS) PROGRAMS = $(bin_PROGRAMS)
am__dirstamp = $(am__leading_dot)dirstamp am__dirstamp = $(am__leading_dot)dirstamp
am_heimdall_OBJECTS = source/BridgeManager.$(OBJEXT) \ am_heimdall_OBJECTS = source/Arguments.$(OBJEXT) \
source/Interface.$(OBJEXT) source/main.$(OBJEXT) source/BridgeManager.$(OBJEXT) \
source/ClosePcScreenAction.$(OBJEXT) \
source/DetectAction.$(OBJEXT) \
source/DownloadPitAction.$(OBJEXT) source/DumpAction.$(OBJEXT) \
source/FlashAction.$(OBJEXT) source/HelpAction.$(OBJEXT) \
source/InfoAction.$(OBJEXT) source/Interface.$(OBJEXT) \
source/main.$(OBJEXT) source/PrintPitAction.$(OBJEXT) \
source/Utility.$(OBJEXT) source/VersionAction.$(OBJEXT)
heimdall_OBJECTS = $(am_heimdall_OBJECTS) heimdall_OBJECTS = $(am_heimdall_OBJECTS)
am__DEPENDENCIES_1 = am__DEPENDENCIES_1 =
heimdall_DEPENDENCIES = $(am__DEPENDENCIES_1) $(STATIC_LIBS) heimdall_DEPENDENCIES = $(am__DEPENDENCIES_1) $(STATIC_LIBS)
@ -75,15 +82,6 @@ CXXLD = $(CXX)
CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
$(LDFLAGS) -o $@ $(LDFLAGS) -o $@
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
$(LDFLAGS) -o $@
SOURCES = $(heimdall_SOURCES) SOURCES = $(heimdall_SOURCES)
DIST_SOURCES = $(heimdall_SOURCES) DIST_SOURCES = $(heimdall_SOURCES)
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
@ -178,12 +176,9 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@ PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG = @PKG_CONFIG@
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
RANLIB = @RANLIB@ RANLIB = @RANLIB@
SED = @SED@ SED = @SED@
SET_MAKE = @SET_MAKE@ SET_MAKE = @SET_MAKE@
@ -251,18 +246,21 @@ udevadminstalled = @udevadminstalled@
AUTOMAKE_OPTIONS = subdir-objects AUTOMAKE_OPTIONS = subdir-objects
ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS} ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS}
AM_CPPFLAGS = $(DEPS_CFLAGS) -I../libpit/Source AM_CPPFLAGS = $(DEPS_CFLAGS) -I../libpit/Source
STATIC_LIBS = ../libpit/libpit-1.3.a STATIC_LIBS = ../libpit/libpit-1.4.a
heimdall_SOURCES = source/BeginDumpPacket.h source/BridgeManager.cpp \ heimdall_SOURCES = source/Arguments.cpp \
source/BridgeManager.h source/DumpPartPitFilePacket.h source/DumpResponse.h \ source/BridgeManager.cpp \
source/EndFileTransferPacket.h source/EndModemFileTransferPacket.h \ source/ClosePcScreenAction.cpp \
source/EndPitFileTransferPacket.h source/EndPhoneFileTransferPacket.h \ source/DetectAction.cpp \
source/EndSessionPacket.h source/FileTransferPacket.h source/FlashPartFileTransferPacket.h \ source/DownloadPitAction.cpp \
source/FlashPartPitFilePacket.h source/Heimdall.h source/InboundPacket.h \ source/DumpAction.cpp \
source/Interface.cpp source/Interface.h source/main.cpp source/OutboundPacket.h \ source/FlashAction.cpp \
source/Packet.h source/PitFilePacket.h source/PitFileResponse.h source/ReceiveFilePartPacket.h \ source/HelpAction.cpp \
source/ResponsePacket.h source/SendFilePartPacket.h source/SendFilePartResponse.h \ source/InfoAction.cpp \
source/ControlPacket.h source/SessionSetupPacket.h source/SessionSetupResponse.h \ source/Interface.cpp \
source/DumpPartFileTransferPacket.h source/main.cpp \
source/PrintPitAction.cpp \
source/Utility.cpp \
source/VersionAction.cpp
heimdall_LDADD = $(DEPS_LIBS) $(STATIC_LIBS) heimdall_LDADD = $(DEPS_LIBS) $(STATIC_LIBS)
@LINUXTARGET_TRUE@udevrulesdir = /lib/udev/rules.d @LINUXTARGET_TRUE@udevrulesdir = /lib/udev/rules.d
@ -373,27 +371,71 @@ source/$(am__dirstamp):
source/$(DEPDIR)/$(am__dirstamp): source/$(DEPDIR)/$(am__dirstamp):
@$(MKDIR_P) source/$(DEPDIR) @$(MKDIR_P) source/$(DEPDIR)
@: > source/$(DEPDIR)/$(am__dirstamp) @: > source/$(DEPDIR)/$(am__dirstamp)
source/Arguments.$(OBJEXT): source/$(am__dirstamp) \
source/$(DEPDIR)/$(am__dirstamp)
source/BridgeManager.$(OBJEXT): source/$(am__dirstamp) \ source/BridgeManager.$(OBJEXT): source/$(am__dirstamp) \
source/$(DEPDIR)/$(am__dirstamp) source/$(DEPDIR)/$(am__dirstamp)
source/ClosePcScreenAction.$(OBJEXT): source/$(am__dirstamp) \
source/$(DEPDIR)/$(am__dirstamp)
source/DetectAction.$(OBJEXT): source/$(am__dirstamp) \
source/$(DEPDIR)/$(am__dirstamp)
source/DownloadPitAction.$(OBJEXT): source/$(am__dirstamp) \
source/$(DEPDIR)/$(am__dirstamp)
source/DumpAction.$(OBJEXT): source/$(am__dirstamp) \
source/$(DEPDIR)/$(am__dirstamp)
source/FlashAction.$(OBJEXT): source/$(am__dirstamp) \
source/$(DEPDIR)/$(am__dirstamp)
source/HelpAction.$(OBJEXT): source/$(am__dirstamp) \
source/$(DEPDIR)/$(am__dirstamp)
source/InfoAction.$(OBJEXT): source/$(am__dirstamp) \
source/$(DEPDIR)/$(am__dirstamp)
source/Interface.$(OBJEXT): source/$(am__dirstamp) \ source/Interface.$(OBJEXT): source/$(am__dirstamp) \
source/$(DEPDIR)/$(am__dirstamp) source/$(DEPDIR)/$(am__dirstamp)
source/main.$(OBJEXT): source/$(am__dirstamp) \ source/main.$(OBJEXT): source/$(am__dirstamp) \
source/$(DEPDIR)/$(am__dirstamp) source/$(DEPDIR)/$(am__dirstamp)
source/PrintPitAction.$(OBJEXT): source/$(am__dirstamp) \
source/$(DEPDIR)/$(am__dirstamp)
source/Utility.$(OBJEXT): source/$(am__dirstamp) \
source/$(DEPDIR)/$(am__dirstamp)
source/VersionAction.$(OBJEXT): source/$(am__dirstamp) \
source/$(DEPDIR)/$(am__dirstamp)
heimdall$(EXEEXT): $(heimdall_OBJECTS) $(heimdall_DEPENDENCIES) heimdall$(EXEEXT): $(heimdall_OBJECTS) $(heimdall_DEPENDENCIES)
@rm -f heimdall$(EXEEXT) @rm -f heimdall$(EXEEXT)
$(CXXLINK) $(heimdall_OBJECTS) $(heimdall_LDADD) $(LIBS) $(CXXLINK) $(heimdall_OBJECTS) $(heimdall_LDADD) $(LIBS)
mostlyclean-compile: mostlyclean-compile:
-rm -f *.$(OBJEXT) -rm -f *.$(OBJEXT)
-rm -f source/Arguments.$(OBJEXT)
-rm -f source/BridgeManager.$(OBJEXT) -rm -f source/BridgeManager.$(OBJEXT)
-rm -f source/ClosePcScreenAction.$(OBJEXT)
-rm -f source/DetectAction.$(OBJEXT)
-rm -f source/DownloadPitAction.$(OBJEXT)
-rm -f source/DumpAction.$(OBJEXT)
-rm -f source/FlashAction.$(OBJEXT)
-rm -f source/HelpAction.$(OBJEXT)
-rm -f source/InfoAction.$(OBJEXT)
-rm -f source/Interface.$(OBJEXT) -rm -f source/Interface.$(OBJEXT)
-rm -f source/PrintPitAction.$(OBJEXT)
-rm -f source/Utility.$(OBJEXT)
-rm -f source/VersionAction.$(OBJEXT)
-rm -f source/main.$(OBJEXT) -rm -f source/main.$(OBJEXT)
distclean-compile: distclean-compile:
-rm -f *.tab.c -rm -f *.tab.c
@AMDEP_TRUE@@am__include@ @am__quote@source/$(DEPDIR)/Arguments.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@source/$(DEPDIR)/BridgeManager.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@source/$(DEPDIR)/BridgeManager.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@source/$(DEPDIR)/ClosePcScreenAction.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@source/$(DEPDIR)/DetectAction.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@source/$(DEPDIR)/DownloadPitAction.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@source/$(DEPDIR)/DumpAction.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@source/$(DEPDIR)/FlashAction.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@source/$(DEPDIR)/HelpAction.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@source/$(DEPDIR)/InfoAction.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@source/$(DEPDIR)/Interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@source/$(DEPDIR)/Interface.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@source/$(DEPDIR)/PrintPitAction.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@source/$(DEPDIR)/Utility.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@source/$(DEPDIR)/VersionAction.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@source/$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@source/$(DEPDIR)/main.Po@am__quote@
.cpp.o: .cpp.o:
@ -779,8 +821,12 @@ uninstall-am: uninstall-binPROGRAMS uninstall-udevrulesDATA
@LINUXTARGET_TRUE@install-data-hook: @LINUXTARGET_TRUE@install-data-hook:
@LINUXTARGET_TRUE@@UDEVADM_TRUE@ sudo udevadm control --reload_rules @LINUXTARGET_TRUE@ @echo ""
@LINUXTARGET_TRUE@@UDEVADM_FALSE@ sudo service udev restart @LINUXTARGET_TRUE@ @echo "IMPORTANT - You must reboot your machine or execute the following as root:"
@LINUXTARGET_TRUE@@UDEVADM_TRUE@ @echo "udevadm control --reload_rules"
@LINUXTARGET_TRUE@@UDEVADM_FALSE@ @echo "service udev restart"
@LINUXTARGET_TRUE@ @echo ""
# Tell versions [3.59,3.63) of GNU make to not export all variables. # Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded. # Otherwise a system limit (for SysV at least) may be exceeded.

81
heimdall/aclocal.m4 vendored
View File

@ -2460,7 +2460,7 @@ linux*oldld* | linux*aout* | linux*coff*)
;; ;;
# This must be Linux ELF. # This must be Linux ELF.
linux* | k*bsd*-gnu | kopensolaris*-gnu) linux* | k*bsd*-gnu)
version_type=linux version_type=linux
need_lib_prefix=no need_lib_prefix=no
need_version=no need_version=no
@ -2485,10 +2485,13 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu)
# before this can be enabled. # before this can be enabled.
hardcode_into_libs=yes hardcode_into_libs=yes
# Add ABI-specific directories to the system library path.
sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
# Append ld.so.conf contents to the search path # Append ld.so.conf contents to the search path
if test -f /etc/ld.so.conf; then if test -f /etc/ld.so.conf; then
lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
fi fi
# We used to test for /lib/ld.so.1 and disable shared libraries on # We used to test for /lib/ld.so.1 and disable shared libraries on
@ -2500,18 +2503,6 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu)
dynamic_linker='GNU/Linux ld.so' dynamic_linker='GNU/Linux ld.so'
;; ;;
netbsdelf*-gnu)
version_type=linux
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
hardcode_into_libs=yes
dynamic_linker='NetBSD ld.elf_so'
;;
netbsd*) netbsd*)
version_type=sunos version_type=sunos
need_lib_prefix=no need_lib_prefix=no
@ -3099,11 +3090,11 @@ irix5* | irix6* | nonstopux*)
;; ;;
# This must be Linux ELF. # This must be Linux ELF.
linux* | k*bsd*-gnu | kopensolaris*-gnu) linux* | k*bsd*-gnu)
lt_cv_deplibs_check_method=pass_all lt_cv_deplibs_check_method=pass_all
;; ;;
netbsd* | netbsdelf*-gnu) netbsd*)
if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
else else
@ -3720,7 +3711,7 @@ m4_if([$1], [CXX], [
;; ;;
esac esac
;; ;;
linux* | k*bsd*-gnu | kopensolaris*-gnu) linux* | k*bsd*-gnu)
case $cc_basename in case $cc_basename in
KCC*) KCC*)
# KAI C++ Compiler # KAI C++ Compiler
@ -3784,7 +3775,7 @@ m4_if([$1], [CXX], [
;; ;;
esac esac
;; ;;
netbsd* | netbsdelf*-gnu) netbsd*)
;; ;;
*qnx* | *nto*) *qnx* | *nto*)
# QNX uses GNU C++, but need to define -shared option too, otherwise # QNX uses GNU C++, but need to define -shared option too, otherwise
@ -4004,7 +3995,7 @@ m4_if([$1], [CXX], [
_LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
;; ;;
linux* | k*bsd*-gnu | kopensolaris*-gnu) linux* | k*bsd*-gnu)
case $cc_basename in case $cc_basename in
# old Intel for x86_64 which still supported -KPIC. # old Intel for x86_64 which still supported -KPIC.
ecc*) ecc*)
@ -4209,9 +4200,6 @@ m4_if([$1], [CXX], [
cygwin* | mingw* | cegcc*) cygwin* | mingw* | cegcc*)
_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
;; ;;
linux* | k*bsd*-gnu)
_LT_TAGVAR(link_all_deplibs, $1)=no
;;
*) *)
_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
;; ;;
@ -4276,9 +4264,6 @@ dnl Note also adjust exclude_expsyms for C++ above.
openbsd*) openbsd*)
with_gnu_ld=no with_gnu_ld=no
;; ;;
linux* | k*bsd*-gnu)
_LT_TAGVAR(link_all_deplibs, $1)=no
;;
esac esac
_LT_TAGVAR(ld_shlibs, $1)=yes _LT_TAGVAR(ld_shlibs, $1)=yes
@ -4300,7 +4285,6 @@ dnl Note also adjust exclude_expsyms for C++ above.
fi fi
supports_anon_versioning=no supports_anon_versioning=no
case `$LD -v 2>&1` in case `$LD -v 2>&1` in
*GNU\ gold*) supports_anon_versioning=yes ;;
*\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
*\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
*\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
@ -4392,7 +4376,7 @@ _LT_EOF
_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
;; ;;
gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) gnu* | linux* | tpf* | k*bsd*-gnu)
tmp_diet=no tmp_diet=no
if test "$host_os" = linux-dietlibc; then if test "$host_os" = linux-dietlibc; then
case $cc_basename in case $cc_basename in
@ -4462,7 +4446,7 @@ _LT_EOF
fi fi
;; ;;
netbsd* | netbsdelf*-gnu) netbsd*)
if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
wlarc= wlarc=
@ -4637,7 +4621,6 @@ _LT_EOF
if test "$aix_use_runtimelinking" = yes; then if test "$aix_use_runtimelinking" = yes; then
shared_flag="$shared_flag "'${wl}-G' shared_flag="$shared_flag "'${wl}-G'
fi fi
_LT_TAGVAR(link_all_deplibs, $1)=no
else else
# not using gcc # not using gcc
if test "$host_cpu" = ia64; then if test "$host_cpu" = ia64; then
@ -4876,7 +4859,7 @@ _LT_EOF
_LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes
;; ;;
netbsd* | netbsdelf*-gnu) netbsd*)
if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
else else
@ -5872,7 +5855,7 @@ if test "$_lt_caught_CXX_error" != yes; then
_LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(inherit_rpath, $1)=yes
;; ;;
linux* | k*bsd*-gnu | kopensolaris*-gnu) linux* | k*bsd*-gnu)
case $cc_basename in case $cc_basename in
KCC*) KCC*)
# Kuck and Associates, Inc. (KAI) C++ Compiler # Kuck and Associates, Inc. (KAI) C++ Compiler
@ -7986,7 +7969,6 @@ m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])])
m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
# serial 1 (pkg-config-0.24)
# #
# Copyright © 2004 Scott James Remnant <scott@netsplit.com>. # Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
# #
@ -8014,10 +7996,7 @@ m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
AC_DEFUN([PKG_PROG_PKG_CONFIG], AC_DEFUN([PKG_PROG_PKG_CONFIG],
[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) [m4_pattern_forbid([^_?PKG_[A-Z_]+$])
m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) m4_pattern_allow([^PKG_CONFIG(_PATH)?$])
AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl
AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path])
AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path])
if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
fi fi
@ -8030,6 +8009,7 @@ if test -n "$PKG_CONFIG"; then
AC_MSG_RESULT([no]) AC_MSG_RESULT([no])
PKG_CONFIG="" PKG_CONFIG=""
fi fi
fi[]dnl fi[]dnl
])# PKG_PROG_PKG_CONFIG ])# PKG_PROG_PKG_CONFIG
@ -8038,20 +8018,21 @@ fi[]dnl
# Check to see whether a particular set of modules exists. Similar # Check to see whether a particular set of modules exists. Similar
# to PKG_CHECK_MODULES(), but does not set variables or print errors. # to PKG_CHECK_MODULES(), but does not set variables or print errors.
# #
# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) #
# only at the first occurence in configure.ac, so if the first place # Similar to PKG_CHECK_MODULES, make sure that the first instance of
# it's called might be skipped (such as if it is within an "if", you # this or PKG_CHECK_MODULES is called, or make sure to call
# have to call PKG_CHECK_EXISTS manually # PKG_CHECK_EXISTS manually
# -------------------------------------------------------------- # --------------------------------------------------------------
AC_DEFUN([PKG_CHECK_EXISTS], AC_DEFUN([PKG_CHECK_EXISTS],
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
if test -n "$PKG_CONFIG" && \ if test -n "$PKG_CONFIG" && \
AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
m4_default([$2], [:]) m4_ifval([$2], [$2], [:])
m4_ifvaln([$3], [else m4_ifvaln([$3], [else
$3])dnl $3])dnl
fi]) fi])
# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
# --------------------------------------------- # ---------------------------------------------
m4_define([_PKG_CONFIG], m4_define([_PKG_CONFIG],
@ -8104,7 +8085,6 @@ and $1[]_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.]) See the pkg-config man page for more details.])
if test $pkg_failed = yes; then if test $pkg_failed = yes; then
AC_MSG_RESULT([no])
_PKG_SHORT_ERRORS_SUPPORTED _PKG_SHORT_ERRORS_SUPPORTED
if test $_pkg_short_errors_supported = yes; then if test $_pkg_short_errors_supported = yes; then
$1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$2" 2>&1` $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$2" 2>&1`
@ -8114,7 +8094,7 @@ if test $pkg_failed = yes; then
# Put the nasty error message in config.log where it belongs # Put the nasty error message in config.log where it belongs
echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
m4_default([$4], [AC_MSG_ERROR( ifelse([$4], , [AC_MSG_ERROR(dnl
[Package requirements ($2) were not met: [Package requirements ($2) were not met:
$$1_PKG_ERRORS $$1_PKG_ERRORS
@ -8122,24 +8102,25 @@ $$1_PKG_ERRORS
Consider adjusting the PKG_CONFIG_PATH environment variable if you Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix. installed software in a non-standard prefix.
_PKG_TEXT])dnl _PKG_TEXT
]) ])],
[AC_MSG_RESULT([no])
$4])
elif test $pkg_failed = untried; then elif test $pkg_failed = untried; then
AC_MSG_RESULT([no]) ifelse([$4], , [AC_MSG_FAILURE(dnl
m4_default([$4], [AC_MSG_FAILURE(
[The pkg-config script could not be found or is too old. Make sure it [The pkg-config script could not be found or is too old. Make sure it
is in your PATH or set the PKG_CONFIG environment variable to the full is in your PATH or set the PKG_CONFIG environment variable to the full
path to pkg-config. path to pkg-config.
_PKG_TEXT _PKG_TEXT
To get pkg-config, see <http://pkg-config.freedesktop.org/>.])dnl To get pkg-config, see <http://pkg-config.freedesktop.org/>.])],
]) [$4])
else else
$1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
$1[]_LIBS=$pkg_cv_[]$1[]_LIBS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])
$3 ifelse([$3], , :, [$3])
fi[]dnl fi[]dnl
])# PKG_CHECK_MODULES ])# PKG_CHECK_MODULES

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
# This file was generated by Autom4te Thu Aug 5 21:29:16 UTC 2010. # This file was generated.
# It contains the lists of macros which have been traced. # It contains the lists of macros which have been traced.
# It can be safely removed. # It can be safely removed.

View File

@ -6,7 +6,7 @@ m4trace:configure.ac:1: -1- m4_pattern_allow([^AS_FLAGS$])
m4trace:configure.ac:1: -1- m4_pattern_forbid([^_?m4_]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^_?m4_])
m4trace:configure.ac:1: -1- m4_pattern_forbid([^dnl$]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^dnl$])
m4trace:configure.ac:1: -1- m4_pattern_forbid([^_?AS_]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^_?AS_])
m4trace:configure.ac:1: -1- AC_SUBST([SHELL]) m4trace:configure.ac:1: -1- AC_SUBST([SHELL], [${CONFIG_SHELL-/bin/sh}])
m4trace:configure.ac:1: -1- AC_SUBST_TRACE([SHELL]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([SHELL])
m4trace:configure.ac:1: -1- m4_pattern_allow([^SHELL$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^SHELL$])
m4trace:configure.ac:1: -1- AC_SUBST([PATH_SEPARATOR]) m4trace:configure.ac:1: -1- AC_SUBST([PATH_SEPARATOR])
@ -27,9 +27,6 @@ m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_STRING$])
m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])]) m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])])
m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT])
m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$])
m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_URL], [m4_ifdef([AC_PACKAGE_URL], ['AC_PACKAGE_URL'])])
m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_URL])
m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_URL$])
m4trace:configure.ac:1: -1- AC_SUBST([exec_prefix], [NONE]) m4trace:configure.ac:1: -1- AC_SUBST([exec_prefix], [NONE])
m4trace:configure.ac:1: -1- AC_SUBST_TRACE([exec_prefix]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([exec_prefix])
m4trace:configure.ac:1: -1- m4_pattern_allow([^exec_prefix$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^exec_prefix$])
@ -101,27 +98,23 @@ m4trace:configure.ac:1: -1- m4_pattern_allow([^mandir$])
m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME])
m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_NAME$])
m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */ m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */
@%:@undef PACKAGE_NAME]) #undef PACKAGE_NAME])
m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME])
m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_TARNAME$])
m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */ m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */
@%:@undef PACKAGE_TARNAME]) #undef PACKAGE_TARNAME])
m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION])
m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_VERSION$])
m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */ m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */
@%:@undef PACKAGE_VERSION]) #undef PACKAGE_VERSION])
m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING])
m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_STRING$])
m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */ m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */
@%:@undef PACKAGE_STRING]) #undef PACKAGE_STRING])
m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT])
m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$])
m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */ m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */
@%:@undef PACKAGE_BUGREPORT]) #undef PACKAGE_BUGREPORT])
m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_URL])
m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_URL$])
m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_URL], [/* Define to the home page for this package. */
@%:@undef PACKAGE_URL])
m4trace:configure.ac:1: -1- AC_SUBST([DEFS]) m4trace:configure.ac:1: -1- AC_SUBST([DEFS])
m4trace:configure.ac:1: -1- AC_SUBST_TRACE([DEFS]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([DEFS])
m4trace:configure.ac:1: -1- m4_pattern_allow([^DEFS$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^DEFS$])
@ -151,12 +144,6 @@ m4trace:configure.ac:3: -1- m4_pattern_allow([^PKG_CONFIG(_PATH)?$])
m4trace:configure.ac:3: -1- AC_SUBST([PKG_CONFIG]) m4trace:configure.ac:3: -1- AC_SUBST([PKG_CONFIG])
m4trace:configure.ac:3: -1- AC_SUBST_TRACE([PKG_CONFIG]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([PKG_CONFIG])
m4trace:configure.ac:3: -1- m4_pattern_allow([^PKG_CONFIG$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^PKG_CONFIG$])
m4trace:configure.ac:3: -1- AC_SUBST([PKG_CONFIG_PATH])
m4trace:configure.ac:3: -1- AC_SUBST_TRACE([PKG_CONFIG_PATH])
m4trace:configure.ac:3: -1- m4_pattern_allow([^PKG_CONFIG_PATH$])
m4trace:configure.ac:3: -1- AC_SUBST([PKG_CONFIG_LIBDIR])
m4trace:configure.ac:3: -1- AC_SUBST_TRACE([PKG_CONFIG_LIBDIR])
m4trace:configure.ac:3: -1- m4_pattern_allow([^PKG_CONFIG_LIBDIR$])
m4trace:configure.ac:3: -1- AC_SUBST([PKG_CONFIG]) m4trace:configure.ac:3: -1- AC_SUBST([PKG_CONFIG])
m4trace:configure.ac:3: -1- AC_SUBST_TRACE([PKG_CONFIG]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([PKG_CONFIG])
m4trace:configure.ac:3: -1- m4_pattern_allow([^PKG_CONFIG$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^PKG_CONFIG$])
@ -167,7 +154,7 @@ m4trace:configure.ac:3: -1- AC_SUBST([DEPS_LIBS])
m4trace:configure.ac:3: -1- AC_SUBST_TRACE([DEPS_LIBS]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([DEPS_LIBS])
m4trace:configure.ac:3: -1- m4_pattern_allow([^DEPS_LIBS$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^DEPS_LIBS$])
m4trace:configure.ac:4: -1- _m4_warn([obsolete], [The macro `AC_PROGRAM_CHECK' is obsolete. m4trace:configure.ac:4: -1- _m4_warn([obsolete], [The macro `AC_PROGRAM_CHECK' is obsolete.
You should run autoupdate.], [../../lib/autoconf/oldnames.m4:41: AC_PROGRAM_CHECK is expanded from... You should run autoupdate.], [../../lib/autoconf/oldnames.m4:62: AC_PROGRAM_CHECK is expanded from...
configure.ac:4: the top level]) configure.ac:4: the top level])
m4trace:configure.ac:4: -1- AC_SUBST([udevadminstalled]) m4trace:configure.ac:4: -1- AC_SUBST([udevadminstalled])
m4trace:configure.ac:4: -1- AC_SUBST_TRACE([udevadminstalled]) m4trace:configure.ac:4: -1- AC_SUBST_TRACE([udevadminstalled])
@ -461,7 +448,7 @@ m4trace:configure.ac:10: -1- AC_DEFINE_TRACE_LITERAL([LT_OBJDIR])
m4trace:configure.ac:10: -1- m4_pattern_allow([^LT_OBJDIR$]) m4trace:configure.ac:10: -1- m4_pattern_allow([^LT_OBJDIR$])
m4trace:configure.ac:10: -1- AH_OUTPUT([LT_OBJDIR], [/* Define to the sub-directory in which libtool stores uninstalled libraries. m4trace:configure.ac:10: -1- AH_OUTPUT([LT_OBJDIR], [/* Define to the sub-directory in which libtool stores uninstalled libraries.
*/ */
@%:@undef LT_OBJDIR]) #undef LT_OBJDIR])
m4trace:configure.ac:10: -1- AC_SUBST([lt_ECHO]) m4trace:configure.ac:10: -1- AC_SUBST([lt_ECHO])
m4trace:configure.ac:10: -1- AC_SUBST_TRACE([lt_ECHO]) m4trace:configure.ac:10: -1- AC_SUBST_TRACE([lt_ECHO])
m4trace:configure.ac:10: -1- m4_pattern_allow([^lt_ECHO$]) m4trace:configure.ac:10: -1- m4_pattern_allow([^lt_ECHO$])
@ -482,7 +469,7 @@ m4trace:configure.ac:10: -1- AC_SUBST([OTOOL64])
m4trace:configure.ac:10: -1- AC_SUBST_TRACE([OTOOL64]) m4trace:configure.ac:10: -1- AC_SUBST_TRACE([OTOOL64])
m4trace:configure.ac:10: -1- m4_pattern_allow([^OTOOL64$]) m4trace:configure.ac:10: -1- m4_pattern_allow([^OTOOL64$])
m4trace:configure.ac:10: -1- AH_OUTPUT([HAVE_DLFCN_H], [/* Define to 1 if you have the <dlfcn.h> header file. */ m4trace:configure.ac:10: -1- AH_OUTPUT([HAVE_DLFCN_H], [/* Define to 1 if you have the <dlfcn.h> header file. */
@%:@undef HAVE_DLFCN_H]) #undef HAVE_DLFCN_H])
m4trace:configure.ac:10: -1- AC_SUBST([CPP]) m4trace:configure.ac:10: -1- AC_SUBST([CPP])
m4trace:configure.ac:10: -1- AC_SUBST_TRACE([CPP]) m4trace:configure.ac:10: -1- AC_SUBST_TRACE([CPP])
m4trace:configure.ac:10: -1- m4_pattern_allow([^CPP$]) m4trace:configure.ac:10: -1- m4_pattern_allow([^CPP$])
@ -495,27 +482,25 @@ m4trace:configure.ac:10: -1- m4_pattern_allow([^CPP$])
m4trace:configure.ac:10: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS]) m4trace:configure.ac:10: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS])
m4trace:configure.ac:10: -1- m4_pattern_allow([^STDC_HEADERS$]) m4trace:configure.ac:10: -1- m4_pattern_allow([^STDC_HEADERS$])
m4trace:configure.ac:10: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if you have the ANSI C header files. */ m4trace:configure.ac:10: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if you have the ANSI C header files. */
@%:@undef STDC_HEADERS]) #undef STDC_HEADERS])
m4trace:configure.ac:10: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the <sys/types.h> header file. */ m4trace:configure.ac:10: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the <sys/types.h> header file. */
@%:@undef HAVE_SYS_TYPES_H]) #undef HAVE_SYS_TYPES_H])
m4trace:configure.ac:10: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the <sys/stat.h> header file. */ m4trace:configure.ac:10: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the <sys/stat.h> header file. */
@%:@undef HAVE_SYS_STAT_H]) #undef HAVE_SYS_STAT_H])
m4trace:configure.ac:10: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the <stdlib.h> header file. */ m4trace:configure.ac:10: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the <stdlib.h> header file. */
@%:@undef HAVE_STDLIB_H]) #undef HAVE_STDLIB_H])
m4trace:configure.ac:10: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the <string.h> header file. */ m4trace:configure.ac:10: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the <string.h> header file. */
@%:@undef HAVE_STRING_H]) #undef HAVE_STRING_H])
m4trace:configure.ac:10: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the <memory.h> header file. */ m4trace:configure.ac:10: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the <memory.h> header file. */
@%:@undef HAVE_MEMORY_H]) #undef HAVE_MEMORY_H])
m4trace:configure.ac:10: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the <strings.h> header file. */ m4trace:configure.ac:10: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the <strings.h> header file. */
@%:@undef HAVE_STRINGS_H]) #undef HAVE_STRINGS_H])
m4trace:configure.ac:10: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the <inttypes.h> header file. */ m4trace:configure.ac:10: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the <inttypes.h> header file. */
@%:@undef HAVE_INTTYPES_H]) #undef HAVE_INTTYPES_H])
m4trace:configure.ac:10: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the <stdint.h> header file. */ m4trace:configure.ac:10: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the <stdint.h> header file. */
@%:@undef HAVE_STDINT_H]) #undef HAVE_STDINT_H])
m4trace:configure.ac:10: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the <unistd.h> header file. */ m4trace:configure.ac:10: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the <unistd.h> header file. */
@%:@undef HAVE_UNISTD_H]) #undef HAVE_UNISTD_H])
m4trace:configure.ac:10: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DLFCN_H])
m4trace:configure.ac:10: -1- m4_pattern_allow([^HAVE_DLFCN_H$])
m4trace:configure.ac:10: -1- LT_SUPPORTED_TAG([CXX]) m4trace:configure.ac:10: -1- LT_SUPPORTED_TAG([CXX])
m4trace:configure.ac:10: -1- AC_SUBST([CXX]) m4trace:configure.ac:10: -1- AC_SUBST([CXX])
m4trace:configure.ac:10: -1- AC_SUBST_TRACE([CXX]) m4trace:configure.ac:10: -1- AC_SUBST_TRACE([CXX])
@ -581,19 +566,19 @@ m4trace:configure.ac:13: -1- m4_pattern_allow([^MAINT$])
m4trace:configure.ac:18: -1- AC_DEFINE_TRACE_LITERAL([OS_LINUX]) m4trace:configure.ac:18: -1- AC_DEFINE_TRACE_LITERAL([OS_LINUX])
m4trace:configure.ac:18: -1- m4_pattern_allow([^OS_LINUX$]) m4trace:configure.ac:18: -1- m4_pattern_allow([^OS_LINUX$])
m4trace:configure.ac:18: -1- AH_OUTPUT([OS_LINUX], [/* Linux backend */ m4trace:configure.ac:18: -1- AH_OUTPUT([OS_LINUX], [/* Linux backend */
@%:@undef OS_LINUX]) #undef OS_LINUX])
m4trace:configure.ac:23: -1- AC_DEFINE_TRACE_LITERAL([OS_DARWIN]) m4trace:configure.ac:23: -1- AC_DEFINE_TRACE_LITERAL([OS_DARWIN])
m4trace:configure.ac:23: -1- m4_pattern_allow([^OS_DARWIN$]) m4trace:configure.ac:23: -1- m4_pattern_allow([^OS_DARWIN$])
m4trace:configure.ac:23: -1- AH_OUTPUT([OS_DARWIN], [/* Darwin backend */ m4trace:configure.ac:23: -1- AH_OUTPUT([OS_DARWIN], [/* Darwin backend */
@%:@undef OS_DARWIN]) #undef OS_DARWIN])
m4trace:configure.ac:28: -1- AC_DEFINE_TRACE_LITERAL([OS_WINDOWS]) m4trace:configure.ac:28: -1- AC_DEFINE_TRACE_LITERAL([OS_WINDOWS])
m4trace:configure.ac:28: -1- m4_pattern_allow([^OS_WINDOWS$]) m4trace:configure.ac:28: -1- m4_pattern_allow([^OS_WINDOWS$])
m4trace:configure.ac:28: -1- AH_OUTPUT([OS_WINDOWS], [/* Windows backend */ m4trace:configure.ac:28: -1- AH_OUTPUT([OS_WINDOWS], [/* Windows backend */
@%:@undef OS_WINDOWS]) #undef OS_WINDOWS])
m4trace:configure.ac:33: -1- AC_DEFINE_TRACE_LITERAL([OS_WINDOWS]) m4trace:configure.ac:33: -1- AC_DEFINE_TRACE_LITERAL([OS_WINDOWS])
m4trace:configure.ac:33: -1- m4_pattern_allow([^OS_WINDOWS$]) m4trace:configure.ac:33: -1- m4_pattern_allow([^OS_WINDOWS$])
m4trace:configure.ac:33: -1- AH_OUTPUT([OS_WINDOWS], [/* Windows backend */ m4trace:configure.ac:33: -1- AH_OUTPUT([OS_WINDOWS], [/* Windows backend */
@%:@undef OS_WINDOWS]) #undef OS_WINDOWS])
m4trace:configure.ac:41: -1- AM_CONDITIONAL([LINUXTARGET], [test x$linuxtarget = xtrue]) m4trace:configure.ac:41: -1- AM_CONDITIONAL([LINUXTARGET], [test x$linuxtarget = xtrue])
m4trace:configure.ac:41: -1- AC_SUBST([LINUXTARGET_TRUE]) m4trace:configure.ac:41: -1- AC_SUBST([LINUXTARGET_TRUE])
m4trace:configure.ac:41: -1- AC_SUBST_TRACE([LINUXTARGET_TRUE]) m4trace:configure.ac:41: -1- AC_SUBST_TRACE([LINUXTARGET_TRUE])
@ -628,7 +613,7 @@ m4trace:configure.ac:44: -1- m4_pattern_allow([^WORDS_BIGENDIAN$])
m4trace:configure.ac:44: -1- AC_DEFINE_TRACE_LITERAL([AC_APPLE_UNIVERSAL_BUILD]) m4trace:configure.ac:44: -1- AC_DEFINE_TRACE_LITERAL([AC_APPLE_UNIVERSAL_BUILD])
m4trace:configure.ac:44: -1- m4_pattern_allow([^AC_APPLE_UNIVERSAL_BUILD$]) m4trace:configure.ac:44: -1- m4_pattern_allow([^AC_APPLE_UNIVERSAL_BUILD$])
m4trace:configure.ac:44: -1- AH_OUTPUT([AC_APPLE_UNIVERSAL_BUILD], [/* Define if building universal (internal helper macro) */ m4trace:configure.ac:44: -1- AH_OUTPUT([AC_APPLE_UNIVERSAL_BUILD], [/* Define if building universal (internal helper macro) */
@%:@undef AC_APPLE_UNIVERSAL_BUILD]) #undef AC_APPLE_UNIVERSAL_BUILD])
m4trace:configure.ac:46: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs]) m4trace:configure.ac:46: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs])
m4trace:configure.ac:46: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.ac:46: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
m4trace:configure.ac:46: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:46: -1- m4_pattern_allow([^LIB@&t@OBJS$])

View File

@ -1,10 +1,10 @@
#! /bin/sh #! /bin/sh
# Attempt to guess a canonical system name. # Attempt to guess a canonical system name.
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
# Free Software Foundation, Inc. # Free Software Foundation, Inc.
timestamp='2009-12-30' timestamp='2009-11-20'
# This file is free software; you can redistribute it and/or modify it # This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by # under the terms of the GNU General Public License as published by
@ -56,9 +56,8 @@ version="\
GNU config.guess ($timestamp) GNU config.guess ($timestamp)
Originally written by Per Bothner. Originally written by Per Bothner.
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."

View File

@ -58,9 +58,6 @@
/* Define to the one symbol short name of this package. */ /* Define to the one symbol short name of this package. */
#undef PACKAGE_TARNAME #undef PACKAGE_TARNAME
/* Define to the home page for this package. */
#undef PACKAGE_URL
/* Define to the version of this package. */ /* Define to the version of this package. */
#undef PACKAGE_VERSION #undef PACKAGE_VERSION

View File

@ -1,80 +0,0 @@
/* config.h.in. Generated from configure.ac by autoheader. */
/* Define if building universal (internal helper macro) */
#undef AC_APPLE_UNIVERSAL_BUILD
/* Define to 1 if you have the <dlfcn.h> header file. */
#undef HAVE_DLFCN_H
/* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H
/* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H
/* Define to 1 if you have the <stdint.h> header file. */
#undef HAVE_STDINT_H
/* Define to 1 if you have the <stdlib.h> header file. */
#undef HAVE_STDLIB_H
/* Define to 1 if you have the <strings.h> header file. */
#undef HAVE_STRINGS_H
/* Define to 1 if you have the <string.h> header file. */
#undef HAVE_STRING_H
/* Define to 1 if you have the <sys/stat.h> header file. */
#undef HAVE_SYS_STAT_H
/* Define to 1 if you have the <sys/types.h> header file. */
#undef HAVE_SYS_TYPES_H
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
/* Define to the sub-directory in which libtool stores uninstalled libraries.
*/
#undef LT_OBJDIR
/* Darwin backend */
#undef OS_DARWIN
/* Linux backend */
#undef OS_LINUX
/* Windows backend */
#undef OS_WINDOWS
/* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT
/* Define to the full name of this package. */
#undef PACKAGE_NAME
/* Define to the full name and version of this package. */
#undef PACKAGE_STRING
/* Define to the one symbol short name of this package. */
#undef PACKAGE_TARNAME
/* Define to the home page for this package. */
#undef PACKAGE_URL
/* Define to the version of this package. */
#undef PACKAGE_VERSION
/* Define to 1 if you have the ANSI C header files. */
#undef STDC_HEADERS
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
significant byte first (like Motorola and SPARC, unlike Intel). */
#if defined AC_APPLE_UNIVERSAL_BUILD
# if defined __BIG_ENDIAN__
# define WORDS_BIGENDIAN 1
# endif
#else
# ifndef WORDS_BIGENDIAN
# undef WORDS_BIGENDIAN
# endif
#endif

19
heimdall/config.sub vendored
View File

@ -1,10 +1,10 @@
#! /bin/sh #! /bin/sh
# Configuration validation subroutine script. # Configuration validation subroutine script.
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
# Free Software Foundation, Inc. # Free Software Foundation, Inc.
timestamp='2010-01-22' timestamp='2009-11-20'
# This file is (in principle) common to ALL GNU software. # This file is (in principle) common to ALL GNU software.
# The presence of a machine in this file suggests that SOME GNU software # The presence of a machine in this file suggests that SOME GNU software
@ -75,9 +75,8 @@ Report bugs and patches to <config-patches@gnu.org>."
version="\ version="\
GNU config.sub ($timestamp) GNU config.sub ($timestamp)
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@ -381,8 +380,7 @@ case $basic_machine in
| sparclite-* \ | sparclite-* \
| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
| tahoe-* | thumb-* \ | tahoe-* | thumb-* \
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \
| tile-* | tilegx-* \
| tron-* \ | tron-* \
| ubicom32-* \ | ubicom32-* \
| v850-* | v850e-* | vax-* \ | v850-* | v850e-* | vax-* \
@ -1087,11 +1085,6 @@ case $basic_machine in
basic_machine=tic6x-unknown basic_machine=tic6x-unknown
os=-coff os=-coff
;; ;;
# This must be matched before tile*.
tilegx*)
basic_machine=tilegx-unknown
os=-linux-gnu
;;
tile*) tile*)
basic_machine=tile-unknown basic_machine=tile-unknown
os=-linux-gnu os=-linux-gnu
@ -1442,8 +1435,6 @@ case $os in
-dicos*) -dicos*)
os=-dicos os=-dicos
;; ;;
-nacl*)
;;
-none) -none)
;; ;;
*) *)

5590
heimdall/configure vendored

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
Copyright (c) 2010-2011 Benjamin Dobell, Glass Echidna Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@ -1,4 +1,4 @@
Heimdall (c) 2010-2011 Benjamin Dobell, Glass Echidna Heimdall (c) 2010-2012 Benjamin Dobell, Glass Echidna
http://www.glassechidna.com.au/products/heimdall/ http://www.glassechidna.com.au/products/heimdall/
DISCLAIMER: DISCLAIMER:
@ -23,8 +23,7 @@ Flashing Heimdall Firmware Package with Heimdall Frontend:
1. Fully charge your device (use the wall charger as it's faster). 1. Fully charge your device (use the wall charger as it's faster).
2. Open Heimdall Frontend, which can be done by entering the following 2. Open the a terminal and run Heimdall Frontend by typing:
command in a terminal:
heimdall-frontend heimdall-frontend
@ -82,14 +81,15 @@ Flashing Heimdall Firmware Package with Heimdall Frontend:
Performing a Custom Flash with Heimdall Frontend: Performing a Custom Flash with Heimdall Frontend:
This is the advanced means of flashing firmware to your device. You should This is the advanced means of flashing firmware to your device.
only flash firmware to your device this way if you know what you're doing.
If you're not an advanced user or a developer, in the event that a Heimdall If you're not an advanced user or a developer, in the event that a Heimdall
Firmware Package doesn't exist for the particular firmware you wish to Firmware Package doesn't exist for the particular firmware (or files) that
flash. I strongly recommend you get in touch with developer of the you wish to flash, then I strongly recommend you get in touch with the
firmware, or an advanced user, and politely ask them to create a Heimdall developer of the firmware (or files) and politely ask them to create a
Firmware Package for you. Heimdall Firmware Package for you. In doing so, you avoid the risk of
making mistakes due to inexperience.
If you're looking to customise an existing Heimdall Firmware Package then If you're looking to customise an existing Heimdall Firmware Package then
follow steps 1-8 of "Flashing Heimdall Firmware Package with Heimdall follow steps 1-8 of "Flashing Heimdall Firmware Package with Heimdall
@ -108,8 +108,7 @@ Performing a Custom Flash with Heimdall Frontend:
NOTE: If you want to use the CSC then extract it last. If you're asked NOTE: If you want to use the CSC then extract it last. If you're asked
to overwrite files then do so. to overwrite files then do so.
3. Open Heimdall Frontend, which can be done by entering the following 3. Open the a terminal and run Heimdall Frontend by typing:
command in a terminal:
heimdall-frontend heimdall-frontend
@ -119,11 +118,14 @@ Performing a Custom Flash with Heimdall Frontend:
5. Before you can chose which partitions you want to flash with particular 5. Before you can chose which partitions you want to flash with particular
files you MUST first select a PIT file. To do this click the "Browse" files you MUST first select a PIT file. To do this click the "Browse"
button in the "PIT" section. This will open a dialogue allowing you to button in the "PIT" section. This will open a dialogue allowing you to
navigate to and select a valid PIT (.pit) file. navigate to and select a valid PIT (.pit) file.
6. If a valid PIT file has been selected then "Add" button below the list If you do not already have a valid PIT file stored on your computer you
box will become enabled. Press this button to add a partition to your can download your device's PIT file from the "Utilities" tab.
flash.
6. If a valid PIT file has been selected then the "Add" button below the
"Partitions (Files)" list-box will be enabled. Press this button to add
a partition to your flash.
7. When you first add a partition you will see the "Partition Name" and 7. When you first add a partition you will see the "Partition Name" and
"Partition ID" be populated with information. Use the "Partition Name" "Partition ID" be populated with information. Use the "Partition Name"
@ -221,7 +223,7 @@ How to Create a Heimdall Firmware Package:
compressed with gzip. The only two real requirements are that a valid compressed with gzip. The only two real requirements are that a valid
firmware.xml must be included (refer to Appendix A) and you can only firmware.xml must be included (refer to Appendix A) and you can only
include files (no directories, links etc.) As such if you'd like there is include files (no directories, links etc.) As such if you'd like there is
nothing preventing you creating Heimdall packages manually. Of course nothing preventing you from creating Heimdall packages manually. Of course
Heimdall Frontend provides a simple user interface that takes care of all Heimdall Frontend provides a simple user interface that takes care of all
the hard work for you. the hard work for you.
@ -229,12 +231,11 @@ How to Create a Heimdall Firmware Package:
create a package from scratch, or you can load an existing package, apply create a package from scratch, or you can load an existing package, apply
modifications and then save the package. Creating a package from scratch modifications and then save the package. Creating a package from scratch
is the preferred approach, by taking this approach you're far less likely is the preferred approach, by taking this approach you're far less likely
to run into file name length limitations, these are not Heimdall's own to run into file name length limitations.
limitation but rather a limitation of the TAR archive format.
Before you can access Heimdall Frontend's firmware creation functionality Before you can access Heimdall Frontend's firmware creation functionality
(available from the "Create Package" tab) you must first specify which (available from the "Create Package" tab) you must first specify which
files will be included in your package as well as a few flashing options files will be included in your package, as well as a few flashing options
i.e. Whether or not users should repartition when flashing. This i.e. Whether or not users should repartition when flashing. This
information must be filled out from the "Flash" tab in exactly the same information must be filled out from the "Flash" tab in exactly the same
fashion you would provide information to flash your device (see "Performing fashion you would provide information to flash your device (see "Performing
@ -246,7 +247,7 @@ How to Create a Heimdall Firmware Package:
firmware package the "Create Package" tab will become available. Clicking firmware package the "Create Package" tab will become available. Clicking
this tab will display additional information that you can include in your this tab will display additional information that you can include in your
package. In order to continue you must fill out all sections except for the package. In order to continue you must fill out all sections except for the
URLs section, which is optional. The following is break-down of what all URLs section, which is optional. The following is a break-down of what all
these options mean. these options mean.
- General Firmware Information: - - General Firmware Information: -
@ -254,11 +255,11 @@ How to Create a Heimdall Firmware Package:
Firmware Name - This is the name of your particular firmware. An Firmware Name - This is the name of your particular firmware. An
example would be "Cyanogenmod". example would be "Cyanogenmod".
Firmware Version - This is the particular version identifier for your Firmware Version - This is the version identifier for your package. Any
package. Any valid string will be accepted although a the inclusion valid string will be accepted, although the inclusion of decimal
of decimal point version number is preferred releases i.e. "7.1". point version number is preferred i.e. "7.1". If it makes sense
If it makes sense then feel free to append a text string like "RC1" then feel free to append a text string like "RC1" or "Beta 1" to
or "Beta 1" to the decimal point version. the decimal point version.
Platform Name - This is the name of platform (or operating system) that Platform Name - This is the name of platform (or operating system) that
your firmware is based on. In most cases this will simply be your firmware is based on. In most cases this will simply be
@ -295,9 +296,9 @@ How to Create a Heimdall Firmware Package:
team name. Click "Add" and the developer will be added to the list team name. Click "Add" and the developer will be added to the list
on the right. If you make a mistake you can select a developer from on the right. If you make a mistake you can select a developer from
the list and click "Remove". You can list as many developers as you the list and click "Remove". You can list as many developers as you
like however size constraints of the "Load Package" means only a like, however visual constraints of the "Load Package" tab means
few will be visible. Where possible you may want to opt for team only a few names will be visible. Where possible you may want to
names over listing individual team members. opt for team names over listing individual team members.
- Supported Devices - - Supported Devices -
@ -325,7 +326,7 @@ How to Create a Heimdall Firmware Package:
Product Codes (or product IDs) are designated by manufacturers and Product Codes (or product IDs) are designated by manufacturers and
are generally the definitive means of referring to a particular are generally the definitive means of referring to a particular
device. Examples are "GT-I9000", "GT-I9100" and "SCH-I897". If device. Examples are "GT-I9000", "GT-I9100" and "SCH-I897". If
you're unsure of a particular product code then Google and you're unsure of a particular product code then both Google and
GSMArena are your friends! GSMArena are your friends!
@ -339,7 +340,7 @@ How to Create a Heimdall Firmware Package:
Once you've chosen a file name Heimdall Frontend will begin the process of Once you've chosen a file name Heimdall Frontend will begin the process of
building the firmware package. In doing so a valid firmware.xml file will building the firmware package. In doing so a valid firmware.xml file will
be generated from the information entered, all files will be archived in a be generated from the information entered. All files will be archived in a
single TAR file then the TAR archive will be compressed via gzip single TAR file then the TAR archive will be compressed via gzip
compression. Compression will take a little while but you will see progress compression. Compression will take a little while but you will see progress
bars so you know the application hasn't hung. When the progress bars bars so you know the application hasn't hung. When the progress bars
@ -359,12 +360,12 @@ for the format in their own software.
All Heimdall Firmware Packages must contain a file called firmware.xml. This All Heimdall Firmware Packages must contain a file called firmware.xml. This
file stores information stores meta-data for the package as well as information file stores flash information and meta-data for the package as well as
about other files contained in the package that indicates how they should be information about other files contained within the package.
flashed.
The format is fairly straight-forward so it won't be explained in great detail,
nonetheless the following is an example of a valid firmware.xml file. The format is fairly straight-forward so it won't be explained in great detail.
Nonetheless the following is an example of a valid firmware.xml file.
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<firmware version="1"> <firmware version="1">
@ -461,17 +462,19 @@ be included.
Appendix B - Installing Heimdall from Source: Appendix B - Installing Heimdall from Source:
1. First make sure you have installed build-tools and pkgconfig. 1. First make sure you have installed build-tools, pkgconfig, zlib-dev and
libusb-1.0-dev (v1.0.8 or newer).
NOTE: Package names may not be absolutely identical to those above.
2. Open a terminal and navigate to the directory you downloaded, 2. Open a terminal and navigate to the directory you downloaded,
or extracted, Heimdall to. or extracted, Heimdall to.
3. Enter the following commands to compile and install libusb-1.0: 3. Enter the following commands to compile libpit:
cd libusb-1.0 cd libpit
./configure ./configure
make make
sudo make install
cd .. cd ..
If you have problems please consult http://www.libusb.org/ If you have problems please consult http://www.libusb.org/
@ -493,8 +496,12 @@ Appendix B - Installing Heimdall from Source:
sudo make install sudo make install
cd .. cd ..
NOTE: You can use "checkinstall" instead of "make install" in order NOTE: As an alternative to "sudo make install" you may chose to generate
to generate a redistributable package. a package by typing the following:
sudo checkinstall --pkgversion <version>
Where <version> is the current Heimdall release e.g. 1.3.0
5. Done 5. Done
@ -513,9 +520,9 @@ Appendix C - Installing Heimdall Frontend from Source:
4. Enter the following commands to compile and install Heimdall Frontend: 4. Enter the following commands to compile and install Heimdall Frontend:
cd heimdall-frontend cd heimdall-frontend
qmake heimdall-frontend.pro qmake-qt4 heimdall-frontend.pro
make make
sudo make install sudo make install
NOTE: As an alternative to "sudo make install" you may chose to generate NOTE: As an alternative to "sudo make install" you may chose to generate
a package by typing the following: a package by typing the following:

View File

@ -100,11 +100,23 @@
</PostBuildEvent> </PostBuildEvent>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="source\Arguments.h" />
<ClInclude Include="source\BeginDumpPacket.h" /> <ClInclude Include="source\BeginDumpPacket.h" />
<ClInclude Include="source\BeginSessionPacket.h" />
<ClInclude Include="source\BridgeManager.h" /> <ClInclude Include="source\BridgeManager.h" />
<ClInclude Include="source\ClosePcScreenAction.h" />
<ClInclude Include="source\DetectAction.h" />
<ClInclude Include="source\DownloadPitAction.h" />
<ClInclude Include="source\DumpAction.h" />
<ClInclude Include="source\FlashAction.h" />
<ClInclude Include="source\HelpAction.h" />
<ClInclude Include="source\InfoAction.h" />
<ClInclude Include="source\PrintPitAction.h" />
<ClInclude Include="source\ControlPacket.h" /> <ClInclude Include="source\ControlPacket.h" />
<ClInclude Include="source\SetupSessionPacket.h" /> <ClInclude Include="source\DeviceTypePacket.h" />
<ClInclude Include="source\SetupSessionResponse.h" /> <ClInclude Include="source\FilePartSizePacket.h" />
<ClInclude Include="source\SessionSetupPacket.h" />
<ClInclude Include="source\SessionSetupResponse.h" />
<ClInclude Include="source\DumpPartFileTransferPacket.h" /> <ClInclude Include="source\DumpPartFileTransferPacket.h" />
<ClInclude Include="source\DumpPartPitFilePacket.h" /> <ClInclude Include="source\DumpPartPitFilePacket.h" />
<ClInclude Include="source\DumpResponse.h" /> <ClInclude Include="source\DumpResponse.h" />
@ -127,11 +139,25 @@
<ClInclude Include="source\ResponsePacket.h" /> <ClInclude Include="source\ResponsePacket.h" />
<ClInclude Include="source\SendFilePartPacket.h" /> <ClInclude Include="source\SendFilePartPacket.h" />
<ClInclude Include="source\SendFilePartResponse.h" /> <ClInclude Include="source\SendFilePartResponse.h" />
<ClInclude Include="source\TotalBytesPacket.h" />
<ClInclude Include="source\Utility.h" />
<ClInclude Include="source\VersionAction.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="source\Arguments.cpp" />
<ClCompile Include="source\BridgeManager.cpp" /> <ClCompile Include="source\BridgeManager.cpp" />
<ClCompile Include="source\ClosePcScreenAction.cpp" />
<ClCompile Include="source\DetectAction.cpp" />
<ClCompile Include="source\DownloadPitAction.cpp" />
<ClCompile Include="source\DumpAction.cpp" />
<ClCompile Include="source\FlashAction.cpp" />
<ClCompile Include="source\HelpAction.cpp" />
<ClCompile Include="source\InfoAction.cpp" />
<ClCompile Include="source\PrintPitAction.cpp" />
<ClCompile Include="source\Interface.cpp" /> <ClCompile Include="source\Interface.cpp" />
<ClCompile Include="source\main.cpp" /> <ClCompile Include="source\main.cpp" />
<ClCompile Include="source\Utility.cpp" />
<ClCompile Include="source\VersionAction.cpp" />
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">

View File

@ -5,89 +5,146 @@
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter> </Filter>
<Filter Include="Source\Packets">
<UniqueIdentifier>{7022245a-f8d3-4dd6-b0f4-9cca8f9bdd69}</UniqueIdentifier>
</Filter>
<Filter Include="Source\Packets\Inbound">
<UniqueIdentifier>{0da20d7b-9a83-4c5b-89ea-5f312268048a}</UniqueIdentifier>
</Filter>
<Filter Include="Source\Packets\Outbound">
<UniqueIdentifier>{586c7149-045a-407e-82b5-56e437d71e9b}</UniqueIdentifier>
</Filter>
<Filter Include="Source\Interface">
<UniqueIdentifier>{e334486e-629c-47ed-b8e6-daa083a1d2df}</UniqueIdentifier>
</Filter>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="source\BeginDumpPacket.h">
<Filter>Source</Filter>
</ClInclude>
<ClInclude Include="source\BridgeManager.h"> <ClInclude Include="source\BridgeManager.h">
<Filter>Source</Filter> <Filter>Source</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="source\ControlPacket.h">
<Filter>Source</Filter>
</ClInclude>
<ClInclude Include="source\DumpPartFileTransferPacket.h">
<Filter>Source</Filter>
</ClInclude>
<ClInclude Include="source\DumpPartPitFilePacket.h">
<Filter>Source</Filter>
</ClInclude>
<ClInclude Include="source\DumpResponse.h">
<Filter>Source</Filter>
</ClInclude>
<ClInclude Include="source\EndFileTransferPacket.h">
<Filter>Source</Filter>
</ClInclude>
<ClInclude Include="source\EndModemFileTransferPacket.h">
<Filter>Source</Filter>
</ClInclude>
<ClInclude Include="source\EndPhoneFileTransferPacket.h">
<Filter>Source</Filter>
</ClInclude>
<ClInclude Include="source\FileTransferPacket.h">
<Filter>Source</Filter>
</ClInclude>
<ClInclude Include="source\FlashPartFileTransferPacket.h">
<Filter>Source</Filter>
</ClInclude>
<ClInclude Include="source\FlashPartPitFilePacket.h">
<Filter>Source</Filter>
</ClInclude>
<ClInclude Include="source\Heimdall.h"> <ClInclude Include="source\Heimdall.h">
<Filter>Source</Filter> <Filter>Source</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="source\InboundPacket.h">
<Filter>Source</Filter>
</ClInclude>
<ClInclude Include="source\OutboundPacket.h">
<Filter>Source</Filter>
</ClInclude>
<ClInclude Include="source\Packet.h"> <ClInclude Include="source\Packet.h">
<Filter>Source</Filter> <Filter>Source\Packets</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="source\PitFilePacket.h"> <ClInclude Include="source\BeginDumpPacket.h">
<Filter>Source</Filter> <Filter>Source\Packets\Outbound</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="source\PitFileResponse.h"> <ClInclude Include="source\BeginSessionPacket.h">
<Filter>Source</Filter> <Filter>Source\Packets\Outbound</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="source\ReceiveFilePartPacket.h"> <ClInclude Include="source\ControlPacket.h">
<Filter>Source</Filter> <Filter>Source\Packets\Outbound</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="source\ResponsePacket.h"> <ClInclude Include="source\DeviceTypePacket.h">
<Filter>Source</Filter> <Filter>Source\Packets\Outbound</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="source\SendFilePartPacket.h"> <ClInclude Include="source\DumpPartFileTransferPacket.h">
<Filter>Source</Filter> <Filter>Source\Packets\Outbound</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="source\SendFilePartResponse.h"> <ClInclude Include="source\DumpPartPitFilePacket.h">
<Filter>Source</Filter> <Filter>Source\Packets\Outbound</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="source\Interface.h"> <ClInclude Include="source\EndFileTransferPacket.h">
<Filter>Source</Filter> <Filter>Source\Packets\Outbound</Filter>
</ClInclude>
<ClInclude Include="source\EndModemFileTransferPacket.h">
<Filter>Source\Packets\Outbound</Filter>
</ClInclude>
<ClInclude Include="source\EndPhoneFileTransferPacket.h">
<Filter>Source\Packets\Outbound</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="source\EndPitFileTransferPacket.h"> <ClInclude Include="source\EndPitFileTransferPacket.h">
<Filter>Source</Filter> <Filter>Source\Packets\Outbound</Filter>
</ClInclude>
<ClInclude Include="source\SetupSessionPacket.h">
<Filter>Source</Filter>
</ClInclude>
<ClInclude Include="source\SetupSessionResponse.h">
<Filter>Source</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="source\EndSessionPacket.h"> <ClInclude Include="source\EndSessionPacket.h">
<Filter>Source\Packets\Outbound</Filter>
</ClInclude>
<ClInclude Include="source\FilePartSizePacket.h">
<Filter>Source\Packets\Outbound</Filter>
</ClInclude>
<ClInclude Include="source\FileTransferPacket.h">
<Filter>Source\Packets\Outbound</Filter>
</ClInclude>
<ClInclude Include="source\FlashPartFileTransferPacket.h">
<Filter>Source\Packets\Outbound</Filter>
</ClInclude>
<ClInclude Include="source\FlashPartPitFilePacket.h">
<Filter>Source\Packets\Outbound</Filter>
</ClInclude>
<ClInclude Include="source\PitFilePacket.h">
<Filter>Source\Packets\Outbound</Filter>
</ClInclude>
<ClInclude Include="source\SendFilePartPacket.h">
<Filter>Source\Packets\Outbound</Filter>
</ClInclude>
<ClInclude Include="source\SessionSetupPacket.h">
<Filter>Source\Packets\Outbound</Filter>
</ClInclude>
<ClInclude Include="source\TotalBytesPacket.h">
<Filter>Source\Packets\Outbound</Filter>
</ClInclude>
<ClInclude Include="source\DumpResponse.h">
<Filter>Source\Packets\Inbound</Filter>
</ClInclude>
<ClInclude Include="source\PitFileResponse.h">
<Filter>Source\Packets\Inbound</Filter>
</ClInclude>
<ClInclude Include="source\SendFilePartResponse.h">
<Filter>Source\Packets\Inbound</Filter>
</ClInclude>
<ClInclude Include="source\SessionSetupResponse.h">
<Filter>Source\Packets\Inbound</Filter>
</ClInclude>
<ClInclude Include="source\ReceiveFilePartPacket.h">
<Filter>Source\Packets\Inbound</Filter>
</ClInclude>
<ClInclude Include="source\ResponsePacket.h">
<Filter>Source\Packets\Inbound</Filter>
</ClInclude>
<ClInclude Include="source\InboundPacket.h">
<Filter>Source\Packets</Filter>
</ClInclude>
<ClInclude Include="source\OutboundPacket.h">
<Filter>Source\Packets</Filter>
</ClInclude>
<ClInclude Include="source\Interface.h">
<Filter>Source\Interface</Filter>
</ClInclude>
<ClInclude Include="source\Arguments.h">
<Filter>Source\Interface</Filter>
</ClInclude>
<ClInclude Include="source\PrintPitAction.h">
<Filter>Source\Interface</Filter>
</ClInclude>
<ClInclude Include="source\DownloadPitAction.h">
<Filter>Source\Interface</Filter>
</ClInclude>
<ClInclude Include="source\ClosePcScreenAction.h">
<Filter>Source\Interface</Filter>
</ClInclude>
<ClInclude Include="source\FlashAction.h">
<Filter>Source\Interface</Filter>
</ClInclude>
<ClInclude Include="source\Utility.h">
<Filter>Source</Filter> <Filter>Source</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="source\DumpAction.h">
<Filter>Source\Interface</Filter>
</ClInclude>
<ClInclude Include="source\DetectAction.h">
<Filter>Source\Interface</Filter>
</ClInclude>
<ClInclude Include="source\InfoAction.h">
<Filter>Source\Interface</Filter>
</ClInclude>
<ClInclude Include="source\HelpAction.h">
<Filter>Source\Interface</Filter>
</ClInclude>
<ClInclude Include="source\VersionAction.h">
<Filter>Source\Interface</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="source\BridgeManager.cpp"> <ClCompile Include="source\BridgeManager.cpp">
@ -97,7 +154,40 @@
<Filter>Source</Filter> <Filter>Source</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="source\Interface.cpp"> <ClCompile Include="source\Interface.cpp">
<Filter>Source\Interface</Filter>
</ClCompile>
<ClCompile Include="source\Arguments.cpp">
<Filter>Source\Interface</Filter>
</ClCompile>
<ClCompile Include="source\PrintPitAction.cpp">
<Filter>Source\Interface</Filter>
</ClCompile>
<ClCompile Include="source\DownloadPitAction.cpp">
<Filter>Source\Interface</Filter>
</ClCompile>
<ClCompile Include="source\ClosePcScreenAction.cpp">
<Filter>Source\Interface</Filter>
</ClCompile>
<ClCompile Include="source\FlashAction.cpp">
<Filter>Source\Interface</Filter>
</ClCompile>
<ClCompile Include="source\Utility.cpp">
<Filter>Source</Filter> <Filter>Source</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="source\DumpAction.cpp">
<Filter>Source\Interface</Filter>
</ClCompile>
<ClCompile Include="source\DetectAction.cpp">
<Filter>Source\Interface</Filter>
</ClCompile>
<ClCompile Include="source\InfoAction.cpp">
<Filter>Source\Interface</Filter>
</ClCompile>
<ClCompile Include="source\HelpAction.cpp">
<Filter>Source\Interface</Filter>
</ClCompile>
<ClCompile Include="source\VersionAction.cpp">
<Filter>Source\Interface</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -65,7 +65,7 @@
# compiler: $LTCC # compiler: $LTCC
# compiler flags: $LTCFLAGS # compiler flags: $LTCFLAGS
# linker: $LD (gnu? $with_gnu_ld) # linker: $LD (gnu? $with_gnu_ld)
# $progname: (GNU libtool) 2.2.6b Debian-2.2.6b-2ubuntu1 # $progname: (GNU libtool) 2.2.6b
# automake: $automake_version # automake: $automake_version
# autoconf: $autoconf_version # autoconf: $autoconf_version
# #
@ -73,7 +73,7 @@
PROGRAM=ltmain.sh PROGRAM=ltmain.sh
PACKAGE=libtool PACKAGE=libtool
VERSION="2.2.6b Debian-2.2.6b-2ubuntu1" VERSION=2.2.6b
TIMESTAMP="" TIMESTAMP=""
package_revision=1.3017 package_revision=1.3017
@ -5033,10 +5033,7 @@ func_mode_link ()
case $pass in case $pass in
dlopen) libs="$dlfiles" ;; dlopen) libs="$dlfiles" ;;
dlpreopen) libs="$dlprefiles" ;; dlpreopen) libs="$dlprefiles" ;;
link) link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
libs="$deplibs %DEPLIBS%"
test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
;;
esac esac
fi fi
if test "$linkmode,$pass" = "lib,dlpreopen"; then if test "$linkmode,$pass" = "lib,dlpreopen"; then
@ -5347,19 +5344,19 @@ func_mode_link ()
# It is a libtool convenience library, so add in its objects. # It is a libtool convenience library, so add in its objects.
convenience="$convenience $ladir/$objdir/$old_library" convenience="$convenience $ladir/$objdir/$old_library"
old_convenience="$old_convenience $ladir/$objdir/$old_library" old_convenience="$old_convenience $ladir/$objdir/$old_library"
tmp_libs=
for deplib in $dependency_libs; do
deplibs="$deplib $deplibs"
if $opt_duplicate_deps ; then
case "$tmp_libs " in
*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
esac
fi
tmp_libs="$tmp_libs $deplib"
done
elif test "$linkmode" != prog && test "$linkmode" != lib; then elif test "$linkmode" != prog && test "$linkmode" != lib; then
func_fatal_error "\`$lib' is not a convenience library" func_fatal_error "\`$lib' is not a convenience library"
fi fi
tmp_libs=
for deplib in $dependency_libs; do
deplibs="$deplib $deplibs"
if $opt_duplicate_deps ; then
case "$tmp_libs " in
*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
esac
fi
tmp_libs="$tmp_libs $deplib"
done
continue continue
fi # $pass = conv fi # $pass = conv
@ -5896,7 +5893,6 @@ func_mode_link ()
if test "$link_all_deplibs" != no; then if test "$link_all_deplibs" != no; then
# Add the search paths of all dependency libraries # Add the search paths of all dependency libraries
for deplib in $dependency_libs; do for deplib in $dependency_libs; do
path=
case $deplib in case $deplib in
-L*) path="$deplib" ;; -L*) path="$deplib" ;;
*.la) *.la)
@ -6210,9 +6206,6 @@ func_mode_link ()
revision="$number_minor" revision="$number_minor"
lt_irix_increment=no lt_irix_increment=no
;; ;;
*)
func_fatal_configuration "$modename: unknown library version type \`$version_type'"
;;
esac esac
;; ;;
no) no)

View File

@ -2445,7 +2445,7 @@ linux*oldld* | linux*aout* | linux*coff*)
;; ;;
# This must be Linux ELF. # This must be Linux ELF.
linux* | k*bsd*-gnu | kopensolaris*-gnu) linux* | k*bsd*-gnu)
version_type=linux version_type=linux
need_lib_prefix=no need_lib_prefix=no
need_version=no need_version=no
@ -2470,10 +2470,13 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu)
# before this can be enabled. # before this can be enabled.
hardcode_into_libs=yes hardcode_into_libs=yes
# Add ABI-specific directories to the system library path.
sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
# Append ld.so.conf contents to the search path # Append ld.so.conf contents to the search path
if test -f /etc/ld.so.conf; then if test -f /etc/ld.so.conf; then
lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
fi fi
# We used to test for /lib/ld.so.1 and disable shared libraries on # We used to test for /lib/ld.so.1 and disable shared libraries on
@ -2485,18 +2488,6 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu)
dynamic_linker='GNU/Linux ld.so' dynamic_linker='GNU/Linux ld.so'
;; ;;
netbsdelf*-gnu)
version_type=linux
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
hardcode_into_libs=yes
dynamic_linker='NetBSD ld.elf_so'
;;
netbsd*) netbsd*)
version_type=sunos version_type=sunos
need_lib_prefix=no need_lib_prefix=no
@ -3084,11 +3075,11 @@ irix5* | irix6* | nonstopux*)
;; ;;
# This must be Linux ELF. # This must be Linux ELF.
linux* | k*bsd*-gnu | kopensolaris*-gnu) linux* | k*bsd*-gnu)
lt_cv_deplibs_check_method=pass_all lt_cv_deplibs_check_method=pass_all
;; ;;
netbsd* | netbsdelf*-gnu) netbsd*)
if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
else else
@ -3705,7 +3696,7 @@ m4_if([$1], [CXX], [
;; ;;
esac esac
;; ;;
linux* | k*bsd*-gnu | kopensolaris*-gnu) linux* | k*bsd*-gnu)
case $cc_basename in case $cc_basename in
KCC*) KCC*)
# KAI C++ Compiler # KAI C++ Compiler
@ -3769,7 +3760,7 @@ m4_if([$1], [CXX], [
;; ;;
esac esac
;; ;;
netbsd* | netbsdelf*-gnu) netbsd*)
;; ;;
*qnx* | *nto*) *qnx* | *nto*)
# QNX uses GNU C++, but need to define -shared option too, otherwise # QNX uses GNU C++, but need to define -shared option too, otherwise
@ -3989,7 +3980,7 @@ m4_if([$1], [CXX], [
_LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
;; ;;
linux* | k*bsd*-gnu | kopensolaris*-gnu) linux* | k*bsd*-gnu)
case $cc_basename in case $cc_basename in
# old Intel for x86_64 which still supported -KPIC. # old Intel for x86_64 which still supported -KPIC.
ecc*) ecc*)
@ -4194,9 +4185,6 @@ m4_if([$1], [CXX], [
cygwin* | mingw* | cegcc*) cygwin* | mingw* | cegcc*)
_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
;; ;;
linux* | k*bsd*-gnu)
_LT_TAGVAR(link_all_deplibs, $1)=no
;;
*) *)
_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
;; ;;
@ -4261,9 +4249,6 @@ dnl Note also adjust exclude_expsyms for C++ above.
openbsd*) openbsd*)
with_gnu_ld=no with_gnu_ld=no
;; ;;
linux* | k*bsd*-gnu)
_LT_TAGVAR(link_all_deplibs, $1)=no
;;
esac esac
_LT_TAGVAR(ld_shlibs, $1)=yes _LT_TAGVAR(ld_shlibs, $1)=yes
@ -4285,7 +4270,6 @@ dnl Note also adjust exclude_expsyms for C++ above.
fi fi
supports_anon_versioning=no supports_anon_versioning=no
case `$LD -v 2>&1` in case `$LD -v 2>&1` in
*GNU\ gold*) supports_anon_versioning=yes ;;
*\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
*\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
*\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
@ -4377,7 +4361,7 @@ _LT_EOF
_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
;; ;;
gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) gnu* | linux* | tpf* | k*bsd*-gnu)
tmp_diet=no tmp_diet=no
if test "$host_os" = linux-dietlibc; then if test "$host_os" = linux-dietlibc; then
case $cc_basename in case $cc_basename in
@ -4447,7 +4431,7 @@ _LT_EOF
fi fi
;; ;;
netbsd* | netbsdelf*-gnu) netbsd*)
if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
wlarc= wlarc=
@ -4622,7 +4606,6 @@ _LT_EOF
if test "$aix_use_runtimelinking" = yes; then if test "$aix_use_runtimelinking" = yes; then
shared_flag="$shared_flag "'${wl}-G' shared_flag="$shared_flag "'${wl}-G'
fi fi
_LT_TAGVAR(link_all_deplibs, $1)=no
else else
# not using gcc # not using gcc
if test "$host_cpu" = ia64; then if test "$host_cpu" = ia64; then
@ -4861,7 +4844,7 @@ _LT_EOF
_LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes
;; ;;
netbsd* | netbsdelf*-gnu) netbsd*)
if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
else else
@ -5861,7 +5844,7 @@ if test "$_lt_caught_CXX_error" != yes; then
_LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(inherit_rpath, $1)=yes
;; ;;
linux* | k*bsd*-gnu | kopensolaris*-gnu) linux* | k*bsd*-gnu)
case $cc_basename in case $cc_basename in
KCC*) KCC*)
# Kuck and Associates, Inc. (KAI) C++ Compiler # Kuck and Associates, Inc. (KAI) C++ Compiler

View File

@ -0,0 +1,212 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
// Heimdall
#include "Arguments.h"
#include "Heimdall.h"
#include "Interface.h"
#include "Utility.h"
using namespace Heimdall;
FlagArgument *FlagArgument::ParseArgument(int argc, char **argv, int& argi)
{
return new FlagArgument();
}
StringArgument *StringArgument::ParseArgument(int argc, char **argv, int& argi)
{
if (++argi < argc)
{
return (new StringArgument(argv[argi]));
}
else
{
Interface::Print("Missing parameter for argument: %s\n\n", argv[argi - 1]);
return (nullptr);
}
}
UnsignedIntegerArgument *UnsignedIntegerArgument::ParseArgument(int argc, char **argv, int& argi)
{
UnsignedIntegerArgument *unsignedIntegerArgument = nullptr;
if (++argi < argc)
{
unsigned int value;
if (Utility::ParseUnsignedInt(value, argv[argi]) == kNumberParsingStatusSuccess)
unsignedIntegerArgument = new UnsignedIntegerArgument(value);
else
Interface::Print("%s must be a positive integer.", argv[argi - 1]);
}
else
{
Interface::Print("Missing parameter for argument: %s\n\n", argv[argi - 1]);
}
return (unsignedIntegerArgument);
}
Arguments::Arguments(const map<string, ArgumentType>& argumentTypes, const map<string, string>& shortArgumentAliases,
const map<string, string> argumentAliases) :
argumentTypes(argumentTypes),
shortArgumentAliases(shortArgumentAliases),
argumentAliases(argumentAliases)
{
}
Arguments::~Arguments()
{
for (map<string, Argument *>::const_iterator it = arguments.begin(); it != arguments.end(); it++)
delete it->second;
}
bool Arguments::ParseArguments(int argc, char **argv, int argi)
{
for (; argi < argc; ++argi)
{
string argumentName = argv[argi];
string nonwildcardArgumentName;
if (argumentName.find_first_of("--") == 0)
{
// Regular argument
argumentName = argumentName.substr(2);
nonwildcardArgumentName = argumentName;
}
else if (argumentName.find_first_of("-") == 0)
{
// Short argument alias
string shortArgumentAlias = argumentName.substr(1);
map<string, string>::const_iterator shortAliasIt = shortArgumentAliases.find(shortArgumentAlias);
if (shortAliasIt != shortArgumentAliases.end())
{
argumentName = shortAliasIt->second;
nonwildcardArgumentName = argumentName;
}
else
{
Interface::Print("Unknown argument: %s\n\n", argv[argi]);
return (false);
}
}
else
{
Interface::Print("Invalid argument: %s\n\n", argv[argi]);
return (false);
}
map<string, ArgumentType>::const_iterator argumentTypeIt = argumentTypes.find(argumentName);
if (argumentTypeIt == argumentTypes.end())
{
// No argument with that name, maybe it's an alias...
map<string, string>::const_iterator aliasIt = argumentAliases.find(argumentName);
if (aliasIt != argumentAliases.end())
{
argumentName = aliasIt->second;
nonwildcardArgumentName = argumentName;
argumentTypeIt = argumentTypes.find(argumentName);
}
}
// Handle wilcards
unsigned int unsignedIntName;
if (argumentTypeIt == argumentTypes.end())
{
// Look for the unsigned integer wildcard "%d".
if (Utility::ParseUnsignedInt(unsignedIntName, argumentName.c_str()) == kNumberParsingStatusSuccess)
{
argumentTypeIt = argumentTypes.find("%d");
argumentName = "%d";
}
// Look for the string wildcard "%s"
if (argumentTypeIt == argumentTypes.end())
{
argumentTypeIt = argumentTypes.find("%s");
argumentName = "%s";
}
}
Argument *argument = nullptr;
if (argumentTypeIt != argumentTypes.end())
{
switch (argumentTypeIt->second)
{
case kArgumentTypeFlag:
argument = FlagArgument::ParseArgument(argc, argv, argi);
break;
case kArgumentTypeString:
argument = StringArgument::ParseArgument(argc, argv, argi);
break;
case kArgumentTypeUnsignedInteger:
argument = UnsignedIntegerArgument::ParseArgument(argc, argv, argi);
break;
default:
Interface::Print("Unknown argument type: %s\n\n", argv[argi]);
break;
}
}
else
{
Interface::Print("Unknown argument: %s\n\n", argv[argi]);
}
// We don't want to insert wild-cards into our argument map.
if (argumentName == "%d" || argumentName == "%s")
argumentName = nonwildcardArgumentName;
if (argument)
{
pair<map<string, Argument *>::iterator, bool> insertResult = arguments.insert(pair<string, Argument *>(argumentName, argument));
if (!insertResult.second)
{
Interface::Print("Duplicate argument: %s (%s)\n\n", argv[argi], insertResult.first->first.c_str());
delete argument;
return (false);
}
}
else
{
return (false);
}
}
return (true);
}

160
heimdall/source/Arguments.h Normal file
View File

@ -0,0 +1,160 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
#ifndef ARGUMENTS_H
#define ARGUMENTS_H
// C/C++ Standard Library
#include <map>
#include <string>
// Heimdall
#include "Heimdall.h"
using namespace std;
namespace Heimdall
{
typedef enum
{
kArgumentTypeFlag = 0,
kArgumentTypeString,
kArgumentTypeUnsignedInteger
} ArgumentType;
class Argument
{
private:
ArgumentType argumentType;
protected:
Argument(ArgumentType argumentType)
{
this->argumentType = argumentType;
}
public:
virtual ~Argument()
{
}
ArgumentType GetArgumentType(void) const
{
return argumentType;
}
};
class FlagArgument : public Argument
{
private:
FlagArgument() : Argument(kArgumentTypeFlag)
{
}
public:
static FlagArgument *ParseArgument(int argc, char **argv, int& argi);
};
class StringArgument : public Argument
{
private:
string value;
StringArgument(const string& value) : Argument(kArgumentTypeString)
{
this->value = value;
}
public:
static StringArgument *ParseArgument(int argc, char **argv, int& argi);
const string& GetValue(void) const
{
return (value);
}
};
class UnsignedIntegerArgument : public Argument
{
private:
unsigned int value;
UnsignedIntegerArgument(unsigned int value) : Argument(kArgumentTypeUnsignedInteger)
{
this->value = value;
}
public:
static UnsignedIntegerArgument *ParseArgument(int argc, char **argv, int& argi);
unsigned int GetValue(void) const
{
return (value);
}
};
class Arguments
{
private:
const map<string, ArgumentType> argumentTypes;
const map<string, string> shortArgumentAliases;
const map<string, string> argumentAliases;
map<string, Argument *> arguments;
public:
Arguments(const map<string, ArgumentType>& argumentTypes, const map<string, string>& shortArgumentAliases = map<string, string>(),
const map<string, string> argumentAliases = map<string, string>());
~Arguments();
// argi is the index of the first argument to parse.
bool ParseArguments(int argc, char **argv, int argi);
const Argument *GetArgument(string argumentName) const
{
map<string, Argument *>::const_iterator it = arguments.find(argumentName);
return (it != arguments.end() ? it->second : nullptr);
}
const map<string, ArgumentType>& GetArgumentTypes(void) const
{
return (argumentTypes);
}
const map<string, Argument *>& GetArguments(void) const
{
return (arguments);
}
};
}
#endif

View File

@ -0,0 +1,39 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
#ifndef BEGINSESSIONPACKET_H
#define BEGINSESSIONPACKET_H
// Heimdall
#include "SessionSetupPacket.h"
namespace Heimdall
{
class BeginSessionPacket : public SessionSetupPacket
{
public:
BeginSessionPacket() : SessionSetupPacket(SessionSetupPacket::kBeginSession)
{
}
};
}
#endif

File diff suppressed because it is too large Load Diff

View File

@ -41,8 +41,8 @@ namespace Heimdall
const int productId; const int productId;
DeviceIdentifier(int vid, int pid) : DeviceIdentifier(int vid, int pid) :
vendorId(vid), vendorId(vid),
productId(pid) productId(pid)
{ {
} }
}; };
@ -53,10 +53,12 @@ namespace Heimdall
enum enum
{ {
kSupportedDeviceCount = 3, kSupportedDeviceCount = 3,
};
kCommunicationDelayDefault = 0, enum
kDumpBufferSize = 4096 {
kCommunicationDelayDefault = 0
}; };
enum enum
@ -83,15 +85,18 @@ namespace Heimdall
static const DeviceIdentifier supportedDevices[kSupportedDeviceCount]; static const DeviceIdentifier supportedDevices[kSupportedDeviceCount];
bool verbose; bool verbose;
int communicationDelay;
libusb_context *libusbContext; libusb_context *libusbContext;
libusb_device_handle *deviceHandle; libusb_device_handle *deviceHandle;
libusb_device *heimdallDevice; libusb_device *heimdallDevice;
int interfaceIndex; int interfaceIndex;
int altSettingIndex;
int inEndpoint; int inEndpoint;
int outEndpoint; int outEndpoint;
int communicationDelay; bool interfaceClaimed;
#ifdef OS_LINUX #ifdef OS_LINUX
@ -99,29 +104,39 @@ namespace Heimdall
#endif #endif
unsigned int fileTransferSequenceMaxLength;
unsigned int fileTransferPacketSize;
unsigned int fileTransferSequenceTimeout;
int FindDeviceInterface(void);
bool ClaimDeviceInterface(void);
bool SetupDeviceInterface(void);
void ReleaseDeviceInterface(void);
bool CheckProtocol(void) const; bool CheckProtocol(void) const;
bool InitialiseProtocol(void) const; bool InitialiseProtocol(void) const;
public: public:
BridgeManager(bool verbose, int communicationDelay); BridgeManager(bool verbose, int communicationDelay = BridgeManager::kCommunicationDelayDefault);
~BridgeManager(); ~BridgeManager();
bool DetectDevice(void); bool DetectDevice(void);
int Initialise(void); int Initialise(void);
bool BeginSession(void) const; bool BeginSession(void);
bool EndSession(bool reboot) const; bool EndSession(bool reboot) const;
bool SendPacket(OutboundPacket *packet, int timeout = 3000, bool retry = true) const; bool SendPacket(OutboundPacket *packet, int timeout = 3000, bool retry = true) const;
bool ReceivePacket(InboundPacket *packet, int timeout = 3000, bool retry = true) const; bool ReceivePacket(InboundPacket *packet, int timeout = 3000, bool retry = true, unsigned char *buffer = nullptr, unsigned int bufferSize = -1) const;
bool RequestDeviceInfo(unsigned int request, int *result) const; bool RequestDeviceType(unsigned int request, int *result) const;
bool SendPitFile(FILE *file) const; bool SendPitFile(FILE *file) const;
int ReceivePitFile(unsigned char **pitBuffer) const; int ReceivePitFile(unsigned char **pitBuffer) const;
int DownloadPitFile(unsigned char **pitBuffer) const; // Thin wrapper around ReceivePitFile() with additional logging.
bool SendFile(FILE *file, unsigned int destination, unsigned int chipIdentifier, unsigned int fileIdentifier = 0xFFFFFFFF) const; bool SendFile(FILE *file, unsigned int destination, unsigned int deviceType, unsigned int fileIdentifier = 0xFFFFFFFF) const;
bool ReceiveDump(unsigned int chipType, unsigned int chipId, FILE *file) const; bool ReceiveDump(unsigned int chipType, unsigned int chipId, FILE *file) const;
bool IsVerbose(void) const bool IsVerbose(void) const

View File

@ -0,0 +1,94 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
// Heimdall
#include "Arguments.h"
#include "BridgeManager.h"
#include "ClosePcScreenAction.h"
#include "Heimdall.h"
#include "Interface.h"
using namespace Heimdall;
const char *ClosePcScreenAction::usage = "Action: close-pc-screen\n\
Arguments: [--verbose] [--no-reboot] [--stdout-errors] [--delay <ms>]\n\
Description: Attempts to get rid off the \"connect phone to PC\" screen.\n";
int ClosePcScreenAction::Execute(int argc, char **argv)
{
// Handle arguments
map<string, ArgumentType> argumentTypes;
argumentTypes["no-reboot"] = kArgumentTypeFlag;
argumentTypes["delay"] = kArgumentTypeUnsignedInteger;
argumentTypes["verbose"] = kArgumentTypeFlag;
argumentTypes["stdout-errors"] = kArgumentTypeFlag;
Arguments arguments(argumentTypes);
if (!arguments.ParseArguments(argc, argv, 2))
{
Interface::Print(ClosePcScreenAction::usage);
return (0);
}
const UnsignedIntegerArgument *communicationDelayArgument = static_cast<const UnsignedIntegerArgument *>(arguments.GetArgument("delay"));
bool reboot = arguments.GetArgument("no-reboot") == nullptr;
bool verbose = arguments.GetArgument("verbose") != nullptr;
if (arguments.GetArgument("stdout-errors") != nullptr)
Interface::SetStdoutErrors(true);
// Info
Interface::PrintReleaseInfo();
Sleep(1000);
// Download PIT file from device.
int communicationDelay = BridgeManager::kCommunicationDelayDefault;
if (communicationDelayArgument)
communicationDelay = communicationDelayArgument->GetValue();
BridgeManager *bridgeManager = new BridgeManager(verbose, communicationDelay);
if (bridgeManager->Initialise() != BridgeManager::kInitialiseSucceeded || !bridgeManager->BeginSession())
{
delete bridgeManager;
return (1);
}
Interface::Print("Attempting to close connect to pc screen...\n");
bool success = bridgeManager->EndSession(reboot);
delete bridgeManager;
if (success)
{
Interface::Print("Attempt complete\n");
return (0);
}
else
{
return (1);
}
}

View File

@ -0,0 +1,34 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
#ifndef CLOSEPCSCREENACTION_H
#define CLOSEPCSCREENACTION_H
namespace Heimdall
{
namespace ClosePcScreenAction
{
extern const char *usage;
int Execute(int argc, char **argv);
};
}
#endif

View File

@ -32,10 +32,10 @@ namespace Heimdall
enum enum
{ {
kControlTypeSetupSession = 0x64, kControlTypeSession = 0x64,
kControlTypePitFile = 0x65, kControlTypePitFile = 0x65,
kControlTypeFileTransfer = 0x66, kControlTypeFileTransfer = 0x66,
kControlTypeEndSession = 0x67 kControlTypeEndSession = 0x67
}; };
protected: protected:

View File

@ -0,0 +1,64 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
// Heimdall
#include "Arguments.h"
#include "BridgeManager.h"
#include "DetectAction.h"
#include "Heimdall.h"
#include "Interface.h"
using namespace Heimdall;
const char *DetectAction::usage = "Action: detect\n\
Arguments: [--verbose] [--stdout-errors]\n\
Description: Indicates whether or not a download mode device can be detected.\n";
int DetectAction::Execute(int argc, char **argv)
{
// Handle arguments
map<string, ArgumentType> argumentTypes;
argumentTypes["verbose"] = kArgumentTypeFlag;
argumentTypes["stdout-errors"] = kArgumentTypeFlag;
Arguments arguments(argumentTypes);
if (!arguments.ParseArguments(argc, argv, 2))
{
Interface::Print(DetectAction::usage);
return (0);
}
bool verbose = arguments.GetArgument("verbose") != nullptr;
if (arguments.GetArgument("stdout-errors") != nullptr)
Interface::SetStdoutErrors(true);
// Download PIT file from device.
BridgeManager *bridgeManager = new BridgeManager(verbose);
bool detected = bridgeManager->DetectDevice();
delete bridgeManager;
return ((detected) ? 0 : 1);
}

View File

@ -0,0 +1,34 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
#ifndef DETECTACTION_H
#define DETECTACTION_H
namespace Heimdall
{
namespace DetectAction
{
extern const char *usage;
int Execute(int argc, char **argv);
};
}
#endif

View File

@ -0,0 +1,39 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
#ifndef DEVICETYPEPACKET_H
#define DEVICETYPEPACKET_H
// Heimdall
#include "SessionSetupPacket.h"
namespace Heimdall
{
class DeviceTypePacket : public SessionSetupPacket
{
public:
DeviceTypePacket() : SessionSetupPacket(SessionSetupPacket::kDeviceType)
{
}
};
}
#endif

View File

@ -0,0 +1,135 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
// C Standard Library
#include <stdio.h>
// Heimdall
#include "Arguments.h"
#include "BridgeManager.h"
#include "DownloadPitAction.h"
#include "Heimdall.h"
#include "Interface.h"
using namespace Heimdall;
const char *DownloadPitAction::usage = "Action: download-pit\n\
Arguments: --output <filename> [--verbose] [--no-reboot] [--stdout-errors]\n\
[--delay <ms>]\n\
Description: Downloads the connected device's PIT file to the specified\n\
output file.\n";
int DownloadPitAction::Execute(int argc, char **argv)
{
// Handle arguments
map<string, ArgumentType> argumentTypes;
argumentTypes["output"] = kArgumentTypeString;
argumentTypes["no-reboot"] = kArgumentTypeFlag;
argumentTypes["delay"] = kArgumentTypeUnsignedInteger;
argumentTypes["verbose"] = kArgumentTypeFlag;
argumentTypes["stdout-errors"] = kArgumentTypeFlag;
Arguments arguments(argumentTypes);
if (!arguments.ParseArguments(argc, argv, 2))
{
Interface::Print(DownloadPitAction::usage);
return (0);
}
const StringArgument *outputArgument = static_cast<const StringArgument *>(arguments.GetArgument("output"));
if (!outputArgument)
{
Interface::Print("Output file was not specified.\n\n");
Interface::Print(DownloadPitAction::usage);
return (0);
}
const UnsignedIntegerArgument *communicationDelayArgument = static_cast<const UnsignedIntegerArgument *>(arguments.GetArgument("delay"));
bool reboot = arguments.GetArgument("no-reboot") == nullptr;
bool verbose = arguments.GetArgument("verbose") != nullptr;
if (arguments.GetArgument("stdout-errors") != nullptr)
Interface::SetStdoutErrors(true);
// Info
Interface::PrintReleaseInfo();
Sleep(1000);
// Open output file
const char *outputFilename = outputArgument->GetValue().c_str();
FILE *outputPitFile = fopen(outputFilename, "wb");
if (!outputPitFile)
{
Interface::PrintError("Failed to open output file \"%s\"\n", outputFilename);
return (1);
}
// Download PIT file from device.
int communicationDelay = BridgeManager::kCommunicationDelayDefault;
if (communicationDelayArgument)
communicationDelay = communicationDelayArgument->GetValue();
BridgeManager *bridgeManager = new BridgeManager(verbose, communicationDelay);
if (bridgeManager->Initialise() != BridgeManager::kInitialiseSucceeded || !bridgeManager->BeginSession())
{
fclose(outputPitFile);
delete bridgeManager;
return (1);
}
unsigned char *pitBuffer;
int fileSize = bridgeManager->DownloadPitFile(&pitBuffer);
bool success = true;
if (fileSize > 0)
{
if (fwrite(pitBuffer, 1, fileSize, outputPitFile) != fileSize)
{
Interface::PrintError("Failed to write PIT data to output file.\n");
success = false;
}
}
else
{
success = false;
}
if (!bridgeManager->EndSession(reboot))
success = false;
delete bridgeManager;
fclose(outputPitFile);
delete [] pitBuffer;
return (success ? 0 : 1);
}

View File

@ -0,0 +1,34 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
#ifndef DOWNLOADPITACTION_H
#define DOWNLOADPITACTION_H
namespace Heimdall
{
namespace DownloadPitAction
{
extern const char *usage;
int Execute(int argc, char **argv);
};
}
#endif

View File

@ -0,0 +1,158 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
// C Standard Library
#include <stdio.h>
// Heimdall
#include "Arguments.h"
#include "BridgeManager.h"
#include "DumpAction.h"
#include "Heimdall.h"
#include "Interface.h"
using namespace Heimdall;
const char *DumpAction::usage = "Action: dump\n\
Arguments: --chip-type <NAND | RAM> --chip-id <integer> --output <filename>\n\
[--verbose] [--no-reboot] [--stdout-errors] [--delay <ms>]\n\
Description: Attempts to dump data from the phone corresponding to the\n\
specified chip type and chip ID.\n\
NOTE: Galaxy S phones don't appear to properly support this functionality.\n";
int DumpAction::Execute(int argc, char **argv)
{
// Handle arguments
map<string, ArgumentType> argumentTypes;
argumentTypes["chip-type"] = kArgumentTypeString;
argumentTypes["chip-id"] = kArgumentTypeUnsignedInteger;
argumentTypes["output"] = kArgumentTypeString;
argumentTypes["no-reboot"] = kArgumentTypeFlag;
argumentTypes["delay"] = kArgumentTypeUnsignedInteger;
argumentTypes["verbose"] = kArgumentTypeFlag;
argumentTypes["stdout-errors"] = kArgumentTypeFlag;
Arguments arguments(argumentTypes);
if (!arguments.ParseArguments(argc, argv, 2))
{
Interface::Print(DumpAction::usage);
return (0);
}
const StringArgument *chipTypeArgument = static_cast<const StringArgument *>(arguments.GetArgument("chip-type"));
const UnsignedIntegerArgument *chipIdArgument = static_cast<const UnsignedIntegerArgument *>(arguments.GetArgument("chip-id"));
const StringArgument *outputArgument = static_cast<const StringArgument *>(arguments.GetArgument("output"));
if (!outputArgument)
{
Interface::Print("Output file was not specified.\n\n");
Interface::Print(DumpAction::usage);
return (false);
}
if (!chipTypeArgument)
{
Interface::Print("You must specify a chip type.\n\n");
Interface::Print(DumpAction::usage);
return (false);
}
if (!(chipTypeArgument->GetValue() == "RAM" || chipTypeArgument->GetValue() == "ram" || chipTypeArgument->GetValue() == "NAND"
|| chipTypeArgument->GetValue() == "nand"))
{
Interface::Print("Unknown chip type: %s.\n\n", chipTypeArgument->GetValue().c_str());
Interface::Print(DumpAction::usage);
return (false);
}
if (!chipIdArgument)
{
Interface::Print("You must specify a chip ID.\n\n");
Interface::Print(DumpAction::usage);
return (false);
}
const UnsignedIntegerArgument *communicationDelayArgument = static_cast<const UnsignedIntegerArgument *>(arguments.GetArgument("delay"));
bool reboot = arguments.GetArgument("no-reboot") == nullptr;
bool verbose = arguments.GetArgument("verbose") != nullptr;
if (arguments.GetArgument("stdout-errors") != nullptr)
Interface::SetStdoutErrors(true);
// Open output file
const char *outputFilename = outputArgument->GetValue().c_str();
FILE *dumpFile = fopen(outputFilename, "wb");
if (!dumpFile)
{
Interface::PrintError("Failed to open file \"%s\"\n", outputFilename);
return (1);
}
// Info
Interface::PrintReleaseInfo();
Sleep(1000);
// Dump
int communicationDelay = BridgeManager::kCommunicationDelayDefault;
if (communicationDelayArgument)
communicationDelay = communicationDelayArgument->GetValue();
BridgeManager *bridgeManager = new BridgeManager(verbose, communicationDelay);
if (bridgeManager->Initialise() != BridgeManager::kInitialiseSucceeded || !bridgeManager->BeginSession())
{
fclose(dumpFile);
delete bridgeManager;
return (1);
}
int chipType = 0;
if (chipTypeArgument->GetValue() == "NAND" || chipTypeArgument->GetValue() == "nand")
chipType = 1;
bool success = bridgeManager->ReceiveDump(chipType, chipIdArgument->GetValue(), dumpFile);
fclose(dumpFile);
if (!bridgeManager->EndSession(reboot))
success = false;
delete bridgeManager;
if (success)
{
Interface::Print("Attempt complete\n");
return (0);
}
else
{
return (1);
}
}

View File

@ -0,0 +1,34 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
#ifndef DUMPACTION_H
#define DUMPACTION_H
namespace Heimdall
{
namespace DumpAction
{
extern const char *usage;
int Execute(int argc, char **argv);
};
}
#endif

View File

@ -0,0 +1,56 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
#ifndef FILEPARTSIZEPACKET_H
#define FILEPARTSIZEPACKET_H
// Heimdall
#include "SessionSetupPacket.h"
namespace Heimdall
{
class FilePartSizePacket : public SessionSetupPacket
{
private:
unsigned int filePartSize;
public:
FilePartSizePacket(unsigned int filePartSize) : SessionSetupPacket(SessionSetupPacket::kFilePartSize)
{
this->filePartSize = filePartSize;
}
unsigned int GetFilePartSize(void) const
{
return filePartSize;
}
void Pack(void)
{
SessionSetupPacket::Pack();
PackInteger(SessionSetupPacket::kDataSize, filePartSize);
}
};
}
#endif

View File

@ -0,0 +1,620 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
// C Standard Library
#include <stdio.h>
// Heimdall
#include "Arguments.h"
#include "BridgeManager.h"
#include "EndModemFileTransferPacket.h"
#include "EndPhoneFileTransferPacket.h"
#include "FlashAction.h"
#include "Heimdall.h"
#include "Interface.h"
#include "SessionSetupResponse.h"
#include "TotalBytesPacket.h"
#include "Utility.h"
using namespace Heimdall;
const char *FlashAction::usage = "Action: flash\n\
Arguments:\n\
--repartition --pit <filename> [--factoryfs <filename>]\n\
[--cache <filename>] [--dbdata <filename>] [--primary-boot <filename>]\n\
[--secondary-boot <filename>] [--param <filename>] [--kernel <filename>]\n\
[--modem <filename>] [--radio <filename>] [--normal-boot <filename>]\n\
[--system <filename>] [--user-data <filename>] [--fota <filename>]\n\
[--hidden <filename>] [--movinand <filename>] [--data <filename>]\n\
[--ums <filename>] [--emmc <filename>]\n\
[--<partition identifier> <filename>]\n\
[--<partition name> <filename>]\n\
[--verbose] [--no-reboot] [--stdout-errors] [--delay <ms>]\n\
or:\n\
[--factoryfs <filename>] [--cache <filename>] [--dbdata <filename>]\n\
[--primary-boot <filename>] [--secondary-boot <filename>]\n\
[--secondary-boot-backup <filename>] [--param <filename>]\n\
[--kernel <filename>] [--recovery <filename>] [--efs <filename>]\n\
[--modem <filename>] [--radio <filename>] [--normal-boot <filename>]\n\
[--system <filename>] [--user-data <filename>] [--fota <filename>]\n\
[--hidden <filename>] [--movinand <filename>] [--data <filename>]\n\
[--ums <filename>] [--emmc <filename>] [--pit <filename>]\n\
[--<partition identifier> <filename>]\n\
[--<partition name> <filename>]\n\
[--verbose] [--no-reboot] [--stdout-errors] [--delay <ms>]\n\
Description: Flashes firmware files to your phone. Partition identifiers are\n\
integer values, they can be obtained by executing the print-pit action.\n\
WARNING: If you're repartitioning it's strongly recommended you specify\n\
all files at your disposal, including bootloaders.\n";
struct PartitionFlashInfo
{
const PitEntry *pitEntry;
FILE *file;
PartitionFlashInfo(const PitEntry *pitEntry, FILE *file)
{
this->pitEntry = pitEntry;
this->file = file;
}
};
static void buildArgumentPartitionNamesMap(map< string, vector<string> >& argumentPartitionNamesMap, map<string, string>& shortArgumentAliases)
{
argumentPartitionNamesMap["pit"].push_back("PIT");
argumentPartitionNamesMap["factoryfs"].push_back("FACTORYFS");
argumentPartitionNamesMap["cache"].push_back("CACHE");
argumentPartitionNamesMap["dbdata"].push_back("DBDATAFS");
argumentPartitionNamesMap["primary-boot"].push_back("IBL+PBL");
argumentPartitionNamesMap["primary-boot"].push_back("BOOT");
argumentPartitionNamesMap["secondary-boot"].push_back("SBL");
argumentPartitionNamesMap["secondary-boot"].push_back("SBL1");
argumentPartitionNamesMap["secondary-boot-backup"].push_back("SBL2");
argumentPartitionNamesMap["param"].push_back("PARAM");
argumentPartitionNamesMap["kernel"].push_back("KERNEL");
argumentPartitionNamesMap["recovery"].push_back("RECOVERY");
argumentPartitionNamesMap["efs"].push_back("EFS");
argumentPartitionNamesMap["modem"].push_back("MODEM");
argumentPartitionNamesMap["radio"].push_back("RADIO");
argumentPartitionNamesMap["normal-boot"].push_back("NORMALBOOT");
argumentPartitionNamesMap["system"].push_back("SYSTEM");
argumentPartitionNamesMap["user-data"].push_back("USERDATA");
argumentPartitionNamesMap["fota"].push_back("FOTA");
argumentPartitionNamesMap["hidden"].push_back("HIDDEN");
argumentPartitionNamesMap["movinand"].push_back("MOVINAND");
argumentPartitionNamesMap["data"].push_back("DATAFS");
argumentPartitionNamesMap["ums"].push_back("UMS.EN");
argumentPartitionNamesMap["emmc"].push_back("GANG");
shortArgumentAliases["pit"] = "pit";
shortArgumentAliases["fs"] = "factoryfs";
shortArgumentAliases["cache"] = "cache";
shortArgumentAliases["db"] = "dbdata";
shortArgumentAliases["boot"] = "primary-boot";
shortArgumentAliases["sbl"] = "secondary-boot";
shortArgumentAliases["sbl2"] = "secondary-boot-backup";
shortArgumentAliases["param"] = "param";
shortArgumentAliases["z"] = "kernel";
shortArgumentAliases["rec"] = "recovery";
shortArgumentAliases["efs"] = "efs";
shortArgumentAliases["m"] = "modem";
shortArgumentAliases["rdio"] = "radio";
shortArgumentAliases["norm"] = "normal-boot";
shortArgumentAliases["sys"] = "system";
shortArgumentAliases["udata"] = "user-data";
shortArgumentAliases["fota"] = "fota";
shortArgumentAliases["hide"] = "hidden";
shortArgumentAliases["nand"] = "movinand";
shortArgumentAliases["data"] = "data";
shortArgumentAliases["ums"] = "ums";
shortArgumentAliases["emmc"] = "emmc";
}
static bool openFiles(Arguments& arguments, const map< string, vector<string> >& argumentPartitionNamesMap,
map<string, FILE *>& argumentFileMap)
{
for (map<string, Argument *>::const_iterator it = arguments.GetArguments().begin(); it != arguments.GetArguments().end(); it++)
{
bool isPartitionArgument = false;
const string& argumentName = it->first;
if (arguments.GetArgumentTypes().find(argumentName) == arguments.GetArgumentTypes().end())
{
// The only way an argument could exist without being in the argument types map is if it's a wild-card.
// The "%d" wild-card refers to a partition by identifier, where as the "%s" wild-card refers to a
// partition by name.
isPartitionArgument = true;
}
else
{
// The argument wasn't a wild-card, check if it's a known partition name.
if (argumentPartitionNamesMap.find(argumentName) != argumentPartitionNamesMap.end())
isPartitionArgument = true;
}
if (isPartitionArgument)
{
const StringArgument *stringArgument = static_cast<StringArgument *>(it->second);
FILE *file = fopen(stringArgument->GetValue().c_str(), "rb");
if (!file)
{
Interface::PrintError("Failed to open file \"%s\"\n", stringArgument->GetValue().c_str());
return (false);
}
argumentFileMap[it->first] = file;
}
}
return (true);
}
static void closeFiles(map<string, FILE *> argumentfileMap)
{
for (map<string, FILE *>::iterator it = argumentfileMap.begin(); it != argumentfileMap.end(); it++)
fclose(it->second);
argumentfileMap.clear();
}
static bool sendTotalTransferSize(BridgeManager *bridgeManager, const map<string, FILE *>& argumentFileMap, bool repartition)
{
int totalBytes = 0;
for (map<string, FILE *>::const_iterator it = argumentFileMap.begin(); it != argumentFileMap.end(); it++)
{
if (repartition || it->first != "pit")
{
fseek(it->second, 0, SEEK_END);
totalBytes += ftell(it->second);
rewind(it->second);
}
}
bool success;
TotalBytesPacket *totalBytesPacket = new TotalBytesPacket(totalBytes);
success = bridgeManager->SendPacket(totalBytesPacket);
delete totalBytesPacket;
if (!success)
{
Interface::PrintError("Failed to send total bytes device info packet!\n");
return (false);
}
SessionSetupResponse *totalBytesResponse = new SessionSetupResponse();
success = bridgeManager->ReceivePacket(totalBytesResponse);
int totalBytesResult = totalBytesResponse->GetResult();
delete totalBytesResponse;
if (!success)
{
Interface::PrintError("Failed to receive device info response!\n");
return (false);
}
if (totalBytesResult != 0)
{
Interface::PrintError("Unexpected device info response!\nExpected: 0\nReceived:%d\n", totalBytesResponse);
return (false);
}
return (true);
}
static bool setupPartitionFlashInfo(const map<string, FILE *>& argumentFileMap, const map< string, vector<string> >& argumentPartitionNamesMap,
const PitData *pitData, vector<PartitionFlashInfo>& partitionFlashInfos)
{
for (map<string, FILE *>::const_iterator it = argumentFileMap.begin(); it != argumentFileMap.end(); it++)
{
const string& argumentName = it->first;
FILE *partitionFile = it->second;
const PitEntry *pitEntry = nullptr;
// Was the argument a partition identifier?
unsigned int partitionIdentifier;
if (Utility::ParseUnsignedInt(partitionIdentifier, argumentName.c_str()) == kNumberParsingStatusSuccess)
{
pitEntry = pitData->FindEntry(partitionIdentifier);
if (!pitEntry)
{
Interface::PrintError("No partition with identifier \"%s\" exists in the specified PIT.\n", argumentName.c_str());
return (false);
}
}
else
{
// The argument wasn't a partition identifier. Was it a known human-readable partition name?
map< string, vector<string> >::const_iterator argumentPartitionNamesIt = argumentPartitionNamesMap.find(argumentName);
if (argumentPartitionNamesIt != argumentPartitionNamesMap.end())
{
const vector<string>& partitionNames = argumentPartitionNamesIt->second;
// Check for the partition in the PIT file using all known names.
for (vector<string>::const_iterator nameIt = partitionNames.begin(); nameIt != partitionNames.end(); nameIt++)
{
pitEntry = pitData->FindEntry(nameIt->c_str());
if (pitEntry)
break;
}
if (!pitEntry)
{
Interface::PrintError("Partition name for \"%s\" could not be located\n", argumentName.c_str());
return (false);
}
}
else
{
// The argument must be an actual partition name. e.g. "ZIMAGE", instead of human-readable "kernel".
pitEntry = pitData->FindEntry(argumentName.c_str());
if (!pitEntry)
{
Interface::PrintError("Partition \"%s\" does not exist in the specified PIT.\n", argumentName.c_str());
return (false);
}
}
}
partitionFlashInfos.push_back(PartitionFlashInfo(pitEntry, partitionFile));
}
return (true);
}
static bool isKnownPartition(const map<string, vector<string> >& argumentPartitionNamesMap, const string& argumentName, const string& partitionName)
{
const vector<string>& partitionNames = argumentPartitionNamesMap.find(argumentName)->second;
for (vector<string>::const_iterator it = partitionNames.begin(); it != partitionNames.end(); it++)
{
if (partitionName == *it)
return (true);
}
return (false);
}
static bool isKnownBootPartition(const map<string, vector<string> >& argumentPartitionNamesMap, const char *partitionName)
{
return (isKnownPartition(argumentPartitionNamesMap, "primary-boot", partitionName)
|| isKnownPartition(argumentPartitionNamesMap, "secondary-boot", partitionName)
|| isKnownPartition(argumentPartitionNamesMap, "secondary-boot-backup", partitionName)
|| isKnownPartition(argumentPartitionNamesMap, "param", partitionName)
|| isKnownPartition(argumentPartitionNamesMap, "normal-boot", partitionName)
|| strcmp(partitionName, "SBL3") == 0
|| strcmp(partitionName, "ABOOT") == 0
|| strcmp(partitionName, "RPM") == 0
|| strcmp(partitionName, "TZ") == 0);
}
static bool flashFile(BridgeManager *bridgeManager, const map< string, vector<string> >& argumentPartitionNamesMap,
const PartitionFlashInfo& partitionFlashInfo)
{
// PIT files need to be handled differently, try determine if the partition we're flashing to is a PIT partition.
if (isKnownPartition(argumentPartitionNamesMap, "pit", partitionFlashInfo.pitEntry->GetPartitionName()))
{
Interface::Print("Uploading %s\n", partitionFlashInfo.pitEntry->GetPartitionName());
if (bridgeManager->SendPitFile(partitionFlashInfo.file))
{
Interface::Print("%s upload successful\n\n", partitionFlashInfo.pitEntry->GetPartitionName());
return (true);
}
else
{
Interface::PrintError("%s upload failed!\n\n", partitionFlashInfo.pitEntry->GetPartitionName());
return (false);
}
}
else
{
if (partitionFlashInfo.pitEntry->GetBinaryType() == PitEntry::kBinaryTypeCommunicationProcessor) // Modem
{
Interface::Print("Uploading %s\n", partitionFlashInfo.pitEntry->GetPartitionName());
if (bridgeManager->SendFile(partitionFlashInfo.file, EndModemFileTransferPacket::kDestinationModem,
partitionFlashInfo.pitEntry->GetDeviceType())) // <-- Odin method
{
Interface::Print("%s upload successful\n\n", partitionFlashInfo.pitEntry->GetPartitionName());
return (true);
}
else
{
Interface::PrintError("%s upload failed!\n\n", partitionFlashInfo.pitEntry->GetPartitionName());
return (false);
}
}
else // partitionFlashInfo.pitEntry->GetBinaryType() == PitEntry::kBinaryTypeApplicationProcessor
{
Interface::Print("Uploading %s\n", partitionFlashInfo.pitEntry->GetPartitionName());
if (bridgeManager->SendFile(partitionFlashInfo.file, EndPhoneFileTransferPacket::kDestinationPhone,
partitionFlashInfo.pitEntry->GetDeviceType(), partitionFlashInfo.pitEntry->GetIdentifier()))
{
Interface::Print("%s upload successful\n\n", partitionFlashInfo.pitEntry->GetPartitionName());
return (true);
}
else
{
Interface::PrintError("%s upload failed!\n\n", partitionFlashInfo.pitEntry->GetPartitionName());
return (false);
}
}
}
return (true);
}
static bool flashPartitions(const map<string, FILE *>& argumentFileMap, const map< string, vector<string> >& argumentPartitionNamesMap,
const PitData *pitData, BridgeManager *bridgeManager, bool repartition)
{
vector<PartitionFlashInfo> partitionFlashInfos;
// Map the files being flashed to partitions stored in the PIT file.
if (!setupPartitionFlashInfo(argumentFileMap, argumentPartitionNamesMap, pitData, partitionFlashInfos))
return (false);
// If we're repartitioning then we need to flash the PIT file first.
if (repartition)
{
vector<PartitionFlashInfo>::const_iterator it;
for (it = partitionFlashInfos.begin(); it != partitionFlashInfos.end(); it++)
{
if (isKnownPartition(argumentPartitionNamesMap, "pit", it->pitEntry->GetPartitionName()))
{
if (!flashFile(bridgeManager, argumentPartitionNamesMap, *it))
return (false);
break;
}
}
if (it == partitionFlashInfos.end())
{
Interface::PrintError("Could not identify the PIT partition within the specified PIT file.\n\n");
return (false);
}
}
// Flash partitions not involved in the boot process second.
for (vector<PartitionFlashInfo>::const_iterator it = partitionFlashInfos.begin(); it != partitionFlashInfos.end(); it++)
{
if (!isKnownPartition(argumentPartitionNamesMap, "pit", it->pitEntry->GetPartitionName())
&& !isKnownBootPartition(argumentPartitionNamesMap, it->pitEntry->GetPartitionName()))
{
if (!flashFile(bridgeManager, argumentPartitionNamesMap, *it))
return (false);
}
}
// Flash boot partitions last.
for (vector<PartitionFlashInfo>::const_iterator it = partitionFlashInfos.begin(); it != partitionFlashInfos.end(); it++)
{
if (isKnownBootPartition(argumentPartitionNamesMap, it->pitEntry->GetPartitionName()))
{
if (!flashFile(bridgeManager, argumentPartitionNamesMap, *it))
return (false);
}
}
return (true);
}
static PitData *getPitData(const map<string, FILE *>& argumentFileMap, BridgeManager *bridgeManager, bool repartition)
{
PitData *pitData;
PitData *localPitData = nullptr;
// If a PIT file was passed as an argument then we must unpack it.
map<string, FILE *>::const_iterator localPitFileIt = argumentFileMap.find("pit");
if (localPitFileIt != argumentFileMap.end())
{
FILE *localPitFile = localPitFileIt->second;
// Load the local pit file into memory.
unsigned char *pitFileBuffer = new unsigned char[4096];
memset(pitFileBuffer, 0, 4096);
fseek(localPitFile, 0, SEEK_END);
long localPitFileSize = ftell(localPitFile);
rewind(localPitFile);
// dataRead is discarded, it's here to remove warnings.
int dataRead = fread(pitFileBuffer, 1, localPitFileSize, localPitFile);
rewind(localPitFile);
localPitData = new PitData();
localPitData->Unpack(pitFileBuffer);
delete [] pitFileBuffer;
}
if (repartition)
{
// Use the local PIT file data.
pitData = localPitData;
}
else
{
// If we're not repartitioning then we need to retrieve the device's PIT file and unpack it.
unsigned char *pitFileBuffer;
if (bridgeManager->DownloadPitFile(&pitFileBuffer) == 0)
return (nullptr);
pitData = new PitData();
pitData->Unpack(pitFileBuffer);
delete [] pitFileBuffer;
if (localPitData != nullptr)
{
// The user has specified a PIT without repartitioning, we should verify the local and device PIT data match!
bool pitsMatch = pitData->Matches(localPitData);
delete localPitData;
if (!pitsMatch)
{
Interface::Print("Local and device PIT files don't match and repartition wasn't specified!\n");
Interface::PrintError("Flash aborted!\n");
return (nullptr);
}
}
}
return (pitData);
}
int FlashAction::Execute(int argc, char **argv)
{
// Setup argument types
map<string, ArgumentType> argumentTypes;
argumentTypes["repartition"] = kArgumentTypeString;
argumentTypes["no-reboot"] = kArgumentTypeFlag;
argumentTypes["delay"] = kArgumentTypeUnsignedInteger;
argumentTypes["verbose"] = kArgumentTypeFlag;
argumentTypes["stdout-errors"] = kArgumentTypeFlag;
map< string, vector<string> > argumentPartitionNamesMap;
map<string, string> shortArgumentAliases;
buildArgumentPartitionNamesMap(argumentPartitionNamesMap, shortArgumentAliases);
for (map< string, vector<string> >::const_iterator it = argumentPartitionNamesMap.begin(); it != argumentPartitionNamesMap.end(); it++)
argumentTypes[it->first] = kArgumentTypeString;
// Add wild-cards "%d" and "%s", for partition identifiers and partition names respectively.
argumentTypes["%d"] = kArgumentTypeString;
shortArgumentAliases["%d"] = "%d";
argumentTypes["%s"] = kArgumentTypeString;
shortArgumentAliases["%s"] = "%s";
map<string, string> argumentAliases;
argumentAliases["PIT"] = "pit"; // Map upper-case PIT argument (i.e. partition name) to known lower-case pit argument.
// Handle arguments
Arguments arguments(argumentTypes, shortArgumentAliases, argumentAliases);
if (!arguments.ParseArguments(argc, argv, 2))
{
Interface::Print(FlashAction::usage);
return (0);
}
const UnsignedIntegerArgument *communicationDelayArgument = static_cast<const UnsignedIntegerArgument *>(arguments.GetArgument("delay"));
bool reboot = arguments.GetArgument("no-reboot") == nullptr;
bool verbose = arguments.GetArgument("verbose") != nullptr;
if (arguments.GetArgument("stdout-errors") != nullptr)
Interface::SetStdoutErrors(true);
const StringArgument *pitArgument = static_cast<const StringArgument *>(arguments.GetArgument("pit"));
bool repartition = arguments.GetArgument("repartition") != nullptr;
if (repartition && !pitArgument)
{
Interface::Print("If you wish to repartition then a PIT file must be specified.\n\n");
Interface::Print(FlashAction::usage);
return (0);
}
// Open files
map<string, FILE *> argumentFileMap;
if (!openFiles(arguments, argumentPartitionNamesMap, argumentFileMap))
{
closeFiles(argumentFileMap);
return (1);
}
if (argumentFileMap.size() == 0)
{
Interface::Print(FlashAction::usage);
return (0);
}
// Info
Interface::PrintReleaseInfo();
Sleep(1000);
// Perform flash
int communicationDelay = BridgeManager::kCommunicationDelayDefault;
if (communicationDelayArgument)
communicationDelay = communicationDelayArgument->GetValue();
BridgeManager *bridgeManager = new BridgeManager(verbose, communicationDelay);
if (bridgeManager->Initialise() != BridgeManager::kInitialiseSucceeded || !bridgeManager->BeginSession())
{
closeFiles(argumentFileMap);
delete bridgeManager;
return (1);
}
bool success = sendTotalTransferSize(bridgeManager, argumentFileMap, repartition);
if (success)
{
PitData *pitData = getPitData(argumentFileMap, bridgeManager, repartition);
if (pitData)
success = flashPartitions(argumentFileMap, argumentPartitionNamesMap, pitData, bridgeManager, repartition);
else
success = false;
delete pitData;
}
closeFiles(argumentFileMap);
if (!bridgeManager->EndSession(reboot))
success = false;
delete bridgeManager;
return (success ? 0 : 1);
}

View File

@ -0,0 +1,34 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
#ifndef FLASHACTION_H
#define FLASHACTION_H
namespace Heimdall
{
namespace FlashAction
{
extern const char *usage;
int Execute(int argc, char **argv);
};
}
#endif

View File

@ -30,34 +30,26 @@ namespace Heimdall
{ {
private: private:
unsigned short unknown; unsigned int sequenceByteCount;
unsigned int transferCount;
public: public:
FlashPartFileTransferPacket(unsigned short unknown, unsigned int transferCount) FlashPartFileTransferPacket(unsigned int sequenceByteCount)
: FileTransferPacket(FileTransferPacket::kRequestPart) : FileTransferPacket(FileTransferPacket::kRequestPart)
{ {
this->unknown = unknown; this->sequenceByteCount = sequenceByteCount;
this->transferCount = transferCount;
} }
unsigned short GetUnknown(void) const unsigned int GetSequenceByteCount(void) const
{ {
return (unknown); return (sequenceByteCount);
}
unsigned int GetTransferCount(void) const
{
return (transferCount);
} }
void Pack(void) void Pack(void)
{ {
FileTransferPacket::Pack(); FileTransferPacket::Pack();
PackShort(FileTransferPacket::kDataSize, unknown); PackInteger(FileTransferPacket::kDataSize, sequenceByteCount);
PackInteger(FileTransferPacket::kDataSize + 2, transferCount);
} }
}; };
} }

View File

@ -23,6 +23,7 @@
#ifdef OS_WINDOWS #ifdef OS_WINDOWS
#include <Windows.h> #include <Windows.h>
#undef GetBinaryType
#else #else
#include "../config.h" #include "../config.h"

View File

@ -0,0 +1,35 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
// Heimdall
#include "Heimdall.h"
#include "HelpAction.h"
#include "Interface.h"
using namespace Heimdall;
const char *HelpAction::usage = "Action: help\n\
Description: Displays this dialogue.\n";
int HelpAction::Execute(int argc, char **argv)
{
Interface::PrintUsage();
return (0);
}

View File

@ -0,0 +1,34 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
#ifndef HELPACTION_H
#define HELPACTION_H
namespace Heimdall
{
namespace HelpAction
{
extern const char *usage;
int Execute(int argc, char **argv);
};
}
#endif

View File

@ -0,0 +1,35 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
// Heimdall
#include "Heimdall.h"
#include "InfoAction.h"
#include "Interface.h"
using namespace Heimdall;
const char *InfoAction::usage = "Action: info\n\
Description: Displays information about Heimdall.\n";
int InfoAction::Execute(int argc, char **argv)
{
Interface::PrintFullInfo();
return (0);
}

View File

@ -0,0 +1,34 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
#ifndef INFOACTION_H
#define INFOACTION_H
namespace Heimdall
{
namespace InfoAction
{
extern const char *usage;
int Execute(int argc, char **argv);
};
}
#endif

View File

@ -24,330 +24,60 @@
#include <stdio.h> #include <stdio.h>
// Heimdall // Heimdall
#include "ClosePcScreenAction.h"
#include "DetectAction.h"
#include "DownloadPitAction.h"
#include "DumpAction.h"
#include "FlashAction.h"
#include "HelpAction.h"
#include "InfoAction.h"
#include "Heimdall.h" #include "Heimdall.h"
#include "Interface.h" #include "Interface.h"
#include "PrintPitAction.h"
#include "VersionAction.h"
using namespace std; using namespace std;
using namespace libpit; using namespace libpit;
using namespace Heimdall; using namespace Heimdall;
bool Interface::stdoutErrors = false; map<string, Interface::ActionInfo> actionMap;
bool stdoutErrors = false;
const char *version = "v1.4 RC1";
const char *actionUsage = "Usage: heimdall <action> <action arguments>\n";
const char *Interface::version = "v1.3.2"; const char *releaseInfo = "Heimdall %s\n\n\
Copyright (c) 2010-2012, Benjamin Dobell, Glass Echidna\n\
const char *Interface::usage = "Usage: heimdall <action> <action arguments> <common arguments>\n\ http://www.glassechidna.com.au/\n\n\
\n\
Common Arguments:\n\
[--verbose] [--no-reboot] [--stdout-errors] [--delay <ms>]\n\
\n\
\n\
Action: flash\n\
Arguments:\n\
--repartition --pit <filename> [--factoryfs <filename>]\n\
[--cache <filename>] [--dbdata <filename>] [--primary-boot <filename>]\n\
[--secondary-boot <filename>] [--param <filename>] [--kernel <filename>]\n\
[--modem <filename>] [--normal-boot <filename>] [--system <filename>]\n\
[--user-data <filename>] [--fota <filename>] [--hidden <filename>]\n\
[--movinand <filename>] [--data <filename>] [--ums <filename>]\n\
[--emmc <filename>] [--<partition identifier> <filename>]\n\
or:\n\
[--factoryfs <filename>] [--cache <filename>] [--dbdata <filename>]\n\
[--primary-boot <filename>] [--secondary-boot <filename>]\n\
[--secondary-boot-backup <filename>] [--param <filename>]\n\
[--kernel <filename>] [--recovery <filename>] [--efs <filename>]\n\
[--modem <filename>] [--normal-boot <filename>] [--system <filename>]\n\
[--user-data <filename>] [--fota <filename>] [--hidden <filename>]\n\
[--movinand <filename>] [--data <filename>] [--ums <filename>]\n\
[--emmc <filename>] [--<partition identifier> <filename>]\n\
Description: Flashes firmware files to your phone.\n\
WARNING: If you're repartitioning it's strongly recommended you specify\n\
all files at your disposal, including bootloaders.\n\
\n\
Action: close-pc-screen\n\
Description: Attempts to get rid off the \"connect phone to PC\" screen.\n\
\n\
Action: download-pit\n\
Arguments: --output <filename>\n\
Description: Downloads the connected device's PIT file to the specified\n\
output file.\n\
\n\
Action: detect\n\
Description: Indicates whether or not a download mode device can be detected.\n\
\n\
Action: dump\n\
Arguments: --chip-type <NAND | RAM> --chip-id <integer> --output <filename>\n\
Description: Attempts to dump data from the phone corresponding to the\n\
specified chip type and chip ID.\n\
NOTE: Galaxy S phones don't appear to properly support this functionality.\n\
\n\
Action: print-pit\n\
Description: Dumps the PIT file from the connected device and prints it in\n\
a human readable format.\n\
\n\
Action: version\n\
Description: Displays the version number of this binary.\n\
\n\
Action: help\n\
Description: Displays this dialogue.\n";
const char *Interface::releaseInfo = "Heimdall %s, Copyright (c) 2010-2012, Benjamin Dobell, Glass Echidna\n\
http://www.glassechidna.com.au\n\n\
This software is provided free of charge. Copying and redistribution is\nencouraged.\n\n\ This software is provided free of charge. Copying and redistribution is\nencouraged.\n\n\
If you appreciate this software and you would like to support future\ndevelopment please consider donating:\n\ If you appreciate this software and you would like to support future\ndevelopment please consider donating:\n\
http://www.glassechidna.com.au/donate/\n\n"; http://www.glassechidna.com.au/donate/\n\n";
const char *Interface::extraInfo = "Heimdall utilises libusb-1.0 for all USB communication:\n\ static const char *extraInfo = "Heimdall utilises libusb-1.0 for all USB communication:\n\
http://www.libusb.org/\n\ http://www.libusb.org/\n\
\n\ \n\
libusb-1.0 is licensed under the LGPL-2.1:\n\ libusb-1.0 is licensed under the LGPL-2.1:\n\
http://www.gnu.org/licenses/licenses.html#LGPL\n\n"; http://www.gnu.org/licenses/licenses.html#LGPL\n\n";
// Flash arguments void populateActionMap(void)
string Interface::flashValueArguments[kFlashValueArgCount] = {
"-pit", "-factoryfs", "-cache", "-dbdata", "-primary-boot", "-secondary-boot", "-secondary-boot-backup", "-param", "-kernel", "-recovery", "-efs", "-modem",
"-normal-boot", "-system", "-user-data", "-fota", "-hidden", "-movinand", "-data", "-ums", "-emmc", "-%d"
};
string Interface::flashValueShortArguments[kFlashValueArgCount] = {
"pit", "fs", "cache", "db", "boot", "sbl", "sbl2", "param", "z", "rec", "efs", "m",
"norm", "sys", "udata", "fota", "hide", "nand", "data", "ums", "emmc", "%d"
};
string Interface::flashValuelessArguments[kFlashValuelessArgCount] = {
"-repartition"
};
string Interface::flashValuelessShortArguments[kFlashValuelessArgCount] = {
"r"
};
// Download PIT arguments
string Interface::downloadPitValueArguments[kDownloadPitValueArgCount] = {
"-output"
};
string Interface::downloadPitValueShortArguments[kDownloadPitValueArgCount] = {
"o"
};
// Dump arguments
string Interface::dumpValueArguments[kDumpValueArgCount] = {
"-chip-type", "-chip-id", "-output"
};
string Interface::dumpValueShortArguments[kDumpValueArgCount] = {
"type", "id", "out"
};
// Common arguments
string Interface::commonValueArguments[kCommonValueArgCount] = {
"-delay"
};
string Interface::commonValueShortArguments[kCommonValueArgCount] = {
"d"
};
string Interface::commonValuelessArguments[kCommonValuelessArgCount] = {
"-verbose", "-no-reboot", "-stdout-errors"
};
string Interface::commonValuelessShortArguments[kCommonValuelessArgCount] = {
"v", "nobt", "err"
};
Action Interface::actions[Interface::kActionCount] = {
// kActionFlash
Action("flash", flashValueArguments, flashValueShortArguments, kFlashValueArgCount,
flashValuelessArguments, flashValuelessShortArguments, kFlashValuelessArgCount),
// kActionClosePcScreen
Action("close-pc-screen", nullptr, nullptr, kClosePcScreenValueArgCount,
nullptr, nullptr, kClosePcScreenValuelessArgCount),
// kActionDump
Action("dump", dumpValueArguments, dumpValueShortArguments, kDumpValueArgCount,
nullptr, nullptr, kDumpValuelessArgCount),
// kActionPrintPit
Action("print-pit", nullptr, nullptr, kPrintPitValueArgCount,
nullptr, nullptr, kPrintPitValuelessArgCount),
// kActionVersion
Action("version", nullptr, nullptr, kVersionValueArgCount,
nullptr, nullptr, kVersionValuelessArgCount),
// kActionHelp
Action("help", nullptr, nullptr, kHelpValueArgCount,
nullptr, nullptr, kHelpValuelessArgCount),
// kActionDetect
Action("detect", nullptr, nullptr, kDetectValueArgCount,
nullptr, nullptr, kDetectValuelessArgCount),
// kActionDownloadPit
Action("download-pit", downloadPitValueArguments, downloadPitValueShortArguments, kDownloadPitValueArgCount,
nullptr, nullptr, kDownloadPitValuelessArgCount),
// kActionInfo
Action("info", nullptr, nullptr, kInfoValueArgCount,
nullptr, nullptr, kInfoValuelessArgCount)
};
bool Interface::GetArguments(int argc, char **argv, map<string, string>& argumentMap, int *actionIndex)
{ {
if (argc < 2) actionMap["close-pc-screen"] = Interface::ActionInfo(&ClosePcScreenAction::Execute, ClosePcScreenAction::usage);
{ actionMap["detect"] = Interface::ActionInfo(&DetectAction::Execute, DetectAction::usage);
Print(usage, version); actionMap["download-pit"] = Interface::ActionInfo(&DownloadPitAction::Execute, DownloadPitAction::usage);
return (false); actionMap["dump"] = Interface::ActionInfo(&DumpAction::Execute, DumpAction::usage);
} actionMap["flash"] = Interface::ActionInfo(&FlashAction::Execute, FlashAction::usage);
actionMap["help"] = Interface::ActionInfo(&HelpAction::Execute, HelpAction::usage);
actionMap["info"] = Interface::ActionInfo(&InfoAction::Execute, InfoAction::usage);
actionMap["print-pit"] = Interface::ActionInfo(&PrintPitAction::Execute, PrintPitAction::usage);
actionMap["version"] = Interface::ActionInfo(&VersionAction::Execute, VersionAction::usage);
}
const char *actionName = argv[1]; const map<string, Interface::ActionInfo>& Interface::GetActionMap(void)
*actionIndex = -1; {
if (actionMap.size() == 0)
populateActionMap();
for (int i = 0; i < kActionCount; i++) return actionMap;
{
if (actions[i].name == actionName)
{
*actionIndex = i;
break;
}
}
if (*actionIndex < 0)
{
Print("Unknown action \"%s\"\n\n", actionName);
Print(usage, version);
return (false);
}
const Action& action = actions[*actionIndex];
for (int argIndex = 2; argIndex < argc; argIndex++)
{
if (*(argv[argIndex]) != '-')
{
Print(usage, version);
return (false);
}
string argumentName = (char *)(argv[argIndex] + 1);
// Check if the argument is a valid valueless argument
bool valid = false;
for (unsigned int i = 0; i < action.valuelessArgumentCount; i++)
{
if (argumentName == action.valuelessArguments[i] || argumentName == action.valuelessShortArguments[i])
{
argumentName = action.valuelessArguments[i];
valid = true;
break;
}
}
if (!valid)
{
// Check if it's a common valueless argument
for (unsigned int i = 0; i < kCommonValuelessArgCount; i++)
{
if (argumentName == commonValuelessArguments[i] || argumentName == commonValuelessShortArguments[i])
{
argumentName = commonValuelessArguments[i];
valid = true;
break;
}
}
}
if (valid)
{
// The argument is valueless
argumentMap.insert(pair<string, string>(argumentName, ""));
continue;
}
// Check if the argument is a valid value argument
for (unsigned int i = 0; i < action.valueArgumentCount; i++)
{
// Support for --<integer> and -<integer> parameters.
if (argumentName.length() > 1 && action.valueArguments[i] == "-%d")
{
if (atoi(argumentName.substr(1).c_str()) > 0 || argumentName == "-0")
{
valid = true;
break;
}
}
else if (action.valueArguments[i] == "%d")
{
if (atoi(argumentName.c_str()) > 0 || argumentName == "0")
{
argumentName = "-" + argumentName;
valid = true;
break;
}
}
if (argumentName == action.valueArguments[i] || argumentName == action.valueShortArguments[i])
{
argumentName = action.valueArguments[i];
valid = true;
break;
}
}
if (!valid)
{
// Check if it's a common value argument
for (unsigned int i = 0; i < kCommonValueArgCount; i++)
{
// Support for --<integer> and -<integer> parameters.
if (argumentName.length() > 1 && commonValueArguments[i] == "-%d")
{
if (atoi(argumentName.substr(1).c_str()) > 0 || argumentName == "-0")
{
valid = true;
break;
}
}
else if (commonValueArguments[i] == "%d")
{
if (atoi(argumentName.c_str()) > 0 || argumentName == "0")
{
argumentName = "-" + argumentName;
valid = true;
break;
}
}
if (argumentName == commonValueArguments[i] || argumentName == commonValueShortArguments[i])
{
argumentName = commonValueArguments[i];
valid = true;
break;
}
}
}
if (!valid)
{
PrintError("\"%s\" is not a valid argument\n", argumentName.c_str());
return (false);
}
argIndex++;
if (argIndex >= argc)
{
PrintError("\"%s\" is missing a value\n", argumentName.c_str());
return (false);
}
argumentMap.insert(pair<string, string>(argumentName, argv[argIndex]));
}
return (true);
} }
void Interface::Print(const char *format, ...) void Interface::Print(const char *format, ...)
@ -362,6 +92,42 @@ void Interface::Print(const char *format, ...)
} }
void Interface::PrintWarning(const char *format, ...)
{
va_list args;
va_start(args, format);
fprintf(stderr, "WARNING: ");
vfprintf(stderr, format, args);
fflush(stderr);
if (stdoutErrors)
{
fprintf(stdout, "WARNING: ");
vfprintf(stdout, format, args);
fflush(stdout);
}
va_end(args);
}
void Interface::PrintWarningSameLine(const char *format, ...)
{
va_list args;
va_start(args, format);
vfprintf(stderr, format, args);
fflush(stderr);
if (stdoutErrors)
{
vfprintf(stdout, format, args);
fflush(stdout);
}
va_end(args);
}
void Interface::PrintError(const char *format, ...) void Interface::PrintError(const char *format, ...)
{ {
va_list args; va_list args;
@ -400,28 +166,33 @@ void Interface::PrintErrorSameLine(const char *format, ...)
void Interface::PrintVersion(void) void Interface::PrintVersion(void)
{ {
Print("%s\n", version); Interface::Print("%s\n", version);
} }
void Interface::PrintUsage(void) void Interface::PrintUsage(void)
{ {
Print(usage); const map<string, ActionInfo>& actionMap = Interface::GetActionMap();
Interface::Print(actionUsage);
for (map<string, ActionInfo>::const_iterator it = actionMap.begin(); it != actionMap.end(); it++)
Interface::Print("\n%s", it->second.usage);
} }
void Interface::PrintReleaseInfo(void) void Interface::PrintReleaseInfo(void)
{ {
Print(releaseInfo, version); Interface::Print(releaseInfo, version);
} }
void Interface::PrintFullInfo(void) void Interface::PrintFullInfo(void)
{ {
Print(releaseInfo, version); Interface::Print(releaseInfo, version);
Print(extraInfo); Interface::Print(extraInfo);
} }
void Interface::PrintDeviceDetectionFailed(void) void Interface::PrintDeviceDetectionFailed(void)
{ {
Print("Failed to detect compatible download-mode device.\n"); Interface::PrintError("Failed to detect compatible download-mode device.\n");
} }
void Interface::PrintPit(const PitData *pitData) void Interface::PrintPit(const PitData *pitData)
@ -442,34 +213,107 @@ void Interface::PrintPit(const PitData *pitData)
const PitEntry *entry = pitData->GetEntry(i); const PitEntry *entry = pitData->GetEntry(i);
Interface::Print("\n\n--- Entry #%d ---\n", i); Interface::Print("\n\n--- Entry #%d ---\n", i);
Interface::Print("Unused: %s\n", (entry->GetUnused()) ? "Yes" : "No"); Interface::Print("Binary Type: %d (", entry->GetBinaryType());
const char *chipIdentifierText = "Unknown"; switch (entry->GetBinaryType())
{
case PitEntry::kBinaryTypeApplicationProcessor:
Interface::Print("AP");
break;
Interface::Print("Chip Identifier: %d (%s)\n", entry->GetChipIdentifier()); case PitEntry::kBinaryTypeCommunicationProcessor:
Interface::Print("CP");
break;
Interface::Print("Partition Identifier: %d\n", entry->GetPartitionIdentifier()); default:
Interface::Print("Unknown");
Interface::Print("Partition Flags: %d (", entry->GetPartitionFlags()); break;
}
if (entry->GetPartitionFlags() & PitEntry::kPartitionFlagWrite)
Interface::Print("R/W");
else
Interface::Print("R");
Interface::Print(")\n"); Interface::Print(")\n");
Interface::Print("Unknown 1: %d\n", entry->GetUnknown1()); Interface::Print("Device Type: %d (", entry->GetDeviceType());
Interface::Print("Partition Block Size: %d\n", entry->GetPartitionBlockSize()); switch (entry->GetDeviceType())
Interface::Print("Partition Block Count: %d\n", entry->GetPartitionBlockCount()); {
case PitEntry::kDeviceTypeOneNand:
Interface::Print("OneNAND");
break;
Interface::Print("Unknown 2: %d\n", entry->GetUnknown2()); case PitEntry::kDeviceTypeFile:
Interface::Print("Unknown 3: %d\n", entry->GetUnknown3()); Interface::Print("File/FAT");
break;
case PitEntry::kDeviceTypeMMC:
Interface::Print("MMC");
break;
case PitEntry::kDeviceTypeAll:
Interface::Print("All (?)");
break;
default:
Interface::Print("Unknown");
break;
}
Interface::Print(")\n");
Interface::Print("Identifier: %d\n", entry->GetIdentifier());
Interface::Print("Attributes: %d (", entry->GetAttributes());
if (entry->GetAttributes() & PitEntry::kAttributeSTL)
Interface::Print("STL ");
if (entry->GetAttributes() & PitEntry::kAttributeWrite)
Interface::Print("Read/Write");
else
Interface::Print("Read-Only");
Interface::Print(")\n");
Interface::Print("Update Attributes: %d", entry->GetUpdateAttributes());
if (entry->GetUpdateAttributes())
{
Interface::Print(" (");
if (entry->GetUpdateAttributes() & PitEntry::kUpdateAttributeFota)
{
if (entry->GetUpdateAttributes() & PitEntry::kUpdateAttributeSecure)
Interface::Print("FOTA, Secure");
else
Interface::Print("FOTA");
}
else
{
if (entry->GetUpdateAttributes() & PitEntry::kUpdateAttributeSecure)
Interface::Print("Secure");
}
Interface::Print(")\n");
}
else
{
Interface::Print("\n");
}
Interface::Print("Partition Block Size: %d\n", entry->GetBlockSize());
Interface::Print("Partition Block Count: %d\n", entry->GetBlockCount());
Interface::Print("File Offset (Obsolete): %d\n", entry->GetFileOffset());
Interface::Print("File Size (Obsolete): %d\n", entry->GetFileSize());
Interface::Print("Partition Name: %s\n", entry->GetPartitionName()); Interface::Print("Partition Name: %s\n", entry->GetPartitionName());
Interface::Print("Filename: %s\n", entry->GetFilename()); Interface::Print("Flash Filename: %s\n", entry->GetFlashFilename());
Interface::Print("FOTA Filename: %s\n", entry->GetFotaFilename());
} }
Interface::Print("\n"); Interface::Print("\n");
} }
void Interface::SetStdoutErrors(bool enabled)
{
stdoutErrors = enabled;
}

View File

@ -28,276 +28,55 @@
// libpit // libpit
#include "libpit.h" #include "libpit.h"
// Heimdall
#include "Heimdall.h"
using namespace std; using namespace std;
using namespace libpit; using namespace libpit;
namespace Heimdall namespace Heimdall
{ {
struct Action namespace Interface
{ {
public: typedef int (*ActionExecuteFunction)(int, char **);
string name; typedef struct ActionInfo
{
string *valueArguments; ActionExecuteFunction executeFunction;
string *valueShortArguments; const char *usage;
unsigned int valueArgumentCount;
string *valuelessArguments; ActionInfo()
string *valuelessShortArguments;
unsigned int valuelessArgumentCount;
Action(const char *name, string *valueArguments, string *valueShortArguments, unsigned int valueArgumentCount,
string *valuelessArguments, string *valuelessShortArguments, unsigned int valuelessArgumentCount)
{ {
this->name = name; executeFunction = nullptr;
usage = nullptr;
this->valueArguments = valueArguments;
this->valueShortArguments = valueShortArguments;
this->valueArgumentCount = valueArgumentCount;
this->valuelessArguments = valuelessArguments;
this->valuelessShortArguments = valuelessShortArguments;
this->valuelessArgumentCount = valuelessArgumentCount;
}
};
class Interface
{
public:
// Actions
enum
{
kActionFlash = 0,
kActionClosePcScreen,
kActionDump,
kActionPrintPit,
kActionVersion,
kActionHelp,
kActionDetect,
kActionDownloadPit,
kActionInfo,
kActionCount
};
// Flash value arguments
enum
{
kFlashValueArgPit,
kFlashValueArgFactoryFs,
kFlashValueArgCache,
kFlashValueArgDatabaseData,
kFlashValueArgPrimaryBootloader,
kFlashValueArgSecondaryBootloader,
kFlashValueArgSecondaryBootloaderBackup,
kFlashValueArgParam,
kFlashValueArgKernel,
kFlashValueArgRecovery,
kFlashValueArgEfs,
kFlashValueArgModem,
kFlashValueArgNormalBoot,
kFlashValueArgSystem,
kFlashValueArgUserData,
kFlashValueArgFota,
kFlashValueArgHidden,
kFlashValueArgMovinand,
kFlashValueArgData,
kFlashValueArgUms,
kFlashValueArgEmmc,
kFlashValueArgPartitionIndex,
kFlashValueArgCount
};
// Flash valueless arguments
enum
{
kFlashValuelessArgRepartition = 0,
kFlashValuelessArgCount
};
// Close PC Screen value arguments
enum
{
kClosePcScreenValueArgCount = 0
};
// Close PC Screen valueless arguments
enum
{
kClosePcScreenValuelessArgCount = 0
};
// Dump value arguments
enum
{
kDumpValueArgChipType = 0,
kDumpValueArgChipId,
kDumpValueArgOutput,
kDumpValueArgCount
};
// Dump valueless arguments
enum
{
kDumpValuelessArgCount = 0
};
// Print PIT value arguments
enum
{
kPrintPitValueArgCount = 0
};
// Print PIT valueless arguments
enum
{
kPrintPitValuelessArgCount = 0
};
// Version value arguments
enum
{
kVersionValueArgCount = 0
};
// Version valueless arguments
enum
{
kVersionValuelessArgCount = 0
};
// Help value arguments
enum
{
kHelpValueArgCount = 0
};
// Help valueless arguments
enum
{
kHelpValuelessArgCount = 0
};
// Info value arguments
enum
{
kInfoValueArgCount = 0
};
// Info valueless arguments
enum
{
kInfoValuelessArgCount = 0
};
// Detect value arguments
enum
{
kDetectValueArgCount = 0
};
// Detect valueless arguments
enum
{
kDetectValuelessArgCount = 0
};
// Download PIT value arguments
enum
{
kDownloadPitValueArgOutput = 0,
kDownloadPitValueArgCount
};
// Download PIT valueless arguments
enum
{
kDownloadPitValuelessArgCount = 0
};
// Common value arguments
enum
{
kCommonValueArgDelay = 0,
kCommonValueArgCount
};
// Comon valueless arguments
enum
{
kCommonValuelessArgVerbose = 0,
kCommonValuelessArgNoReboot,
kCommonValuelessArgStdoutErrors,
kCommonValuelessArgCount
};
private:
static bool stdoutErrors;
static const char *version;
static const char *usage;
static const char *releaseInfo;
static const char *extraInfo;
// Flash arguments
static string flashValueArguments[kFlashValueArgCount];
static string flashValueShortArguments[kFlashValueArgCount];
static string flashValuelessArguments[kFlashValuelessArgCount];
static string flashValuelessShortArguments[kFlashValuelessArgCount];
// Download PIT arguments
static string downloadPitValueArguments[kDownloadPitValueArgCount];
static string downloadPitValueShortArguments[kDownloadPitValueArgCount];
// Dump arguments
static string dumpValueArguments[kDumpValueArgCount];
static string dumpValueShortArguments[kDumpValueArgCount];
public:
// Common arguments
static string commonValueArguments[kCommonValueArgCount];
static string commonValueShortArguments[kCommonValueArgCount];
static string commonValuelessArguments[kCommonValuelessArgCount];
static string commonValuelessShortArguments[kCommonValuelessArgCount];
static Action actions[kActionCount];
static bool GetArguments(int argc, char **argv, map<string, string>& argumentMap, int *actionIndex);
static void Print(const char *format, ...);
static void PrintError(const char *format, ...);
static void PrintErrorSameLine(const char *format, ...);
static void PrintVersion(void);
static void PrintUsage(void);
static void PrintReleaseInfo(void);
static void PrintFullInfo(void);
static void PrintDeviceDetectionFailed(void);
static void PrintPit(const PitData *pitData);
static string& GetPitArgument(void)
{
return (flashValueArguments[kFlashValueArgPit]);
} }
static void SetStdoutErrors(bool enabled) ActionInfo(ActionExecuteFunction executeFunction, const char *usage)
{ {
stdoutErrors = enabled; this->executeFunction = executeFunction;
this->usage = usage;
} }
} ActionInfo;
const map<string, ActionInfo>& GetActionMap(void);
void Print(const char *format, ...);
void PrintWarning(const char *format, ...);
void PrintWarningSameLine(const char *format, ...);
void PrintError(const char *format, ...);
void PrintErrorSameLine(const char *format, ...);
void PrintVersion(void);
void PrintUsage(void);
void PrintReleaseInfo(void);
void PrintFullInfo(void);
void PrintDeviceDetectionFailed(void);
void PrintPit(const PitData *pitData);
void SetStdoutErrors(bool enabled);
}; };
} }

View File

@ -50,7 +50,7 @@ namespace Heimdall
delete [] data; delete [] data;
} }
int GetSize(void) const unsigned int GetSize(void) const
{ {
return (size); return (size);
} }

View File

@ -0,0 +1,159 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
// C Standard Library
#include <stdio.h>
// Heimdall
#include "Arguments.h"
#include "BridgeManager.h"
#include "Heimdall.h"
#include "Interface.h"
#include "PrintPitAction.h"
using namespace Heimdall;
const char *PrintPitAction::usage = "Action: print-pit\n\
Arguments: [--file <filename>] [--verbose] [--no-reboot] [--stdout-errors]\n\
[--delay <ms>]\n\
Description: Prints the contents of a PIT file in a human readable format. If\n\
a filename is not provided then Heimdall retrieves the PIT file from the \n\
connected device.\n";
int PrintPitAction::Execute(int argc, char **argv)
{
// Handle arguments
map<string, ArgumentType> argumentTypes;
argumentTypes["file"] = kArgumentTypeString;
argumentTypes["no-reboot"] = kArgumentTypeFlag;
argumentTypes["delay"] = kArgumentTypeUnsignedInteger;
argumentTypes["verbose"] = kArgumentTypeFlag;
argumentTypes["stdout-errors"] = kArgumentTypeFlag;
Arguments arguments(argumentTypes);
if (!arguments.ParseArguments(argc, argv, 2))
{
Interface::Print(PrintPitAction::usage);
return (0);
}
const StringArgument *fileArgument = static_cast<const StringArgument *>(arguments.GetArgument("file"));
const UnsignedIntegerArgument *communicationDelayArgument = static_cast<const UnsignedIntegerArgument *>(arguments.GetArgument("delay"));
bool reboot = arguments.GetArgument("no-reboot") == nullptr;
bool verbose = arguments.GetArgument("verbose") != nullptr;
if (arguments.GetArgument("stdout-errors") != nullptr)
Interface::SetStdoutErrors(true);
// Open file (if specified).
FILE *localPitFile = nullptr;
if (fileArgument)
{
const char *filename = fileArgument->GetValue().c_str();
localPitFile = fopen(filename, "rb");
if (!localPitFile)
{
Interface::PrintError("Failed to open file \"%s\"\n", filename);
return (1);
}
}
// Info
Interface::PrintReleaseInfo();
Sleep(1000);
if (localPitFile)
{
// Print PIT from file; there's no need for a BridgeManager.
fseek(localPitFile, 0, SEEK_END);
long localPitFileSize = ftell(localPitFile);
rewind(localPitFile);
// Load the local pit file into memory.
unsigned char *pitFileBuffer = new unsigned char[localPitFileSize];
size_t dataRead = fread(pitFileBuffer, 1, localPitFileSize, localPitFile); // dataRead is discarded, it's here to remove warnings.
fclose(localPitFile);
PitData *pitData = new PitData();
pitData->Unpack(pitFileBuffer);
delete [] pitFileBuffer;
Interface::PrintPit(pitData);
delete pitData;
return (0);
}
else
{
// Print PIT from a device.
int communicationDelay = BridgeManager::kCommunicationDelayDefault;
if (communicationDelayArgument)
communicationDelay = communicationDelayArgument->GetValue();
BridgeManager *bridgeManager = new BridgeManager(verbose, communicationDelay);
if (bridgeManager->Initialise() != BridgeManager::kInitialiseSucceeded || !bridgeManager->BeginSession())
{
delete bridgeManager;
return (1);
}
unsigned char *devicePit;
bool success = bridgeManager->DownloadPitFile(&devicePit) != 0;
if (success)
{
PitData *pitData = new PitData();
if (pitData->Unpack(devicePit))
{
Interface::PrintPit(pitData);
}
else
{
Interface::PrintError("Failed to unpack device's PIT file!\n");
success = false;
}
delete pitData;
}
delete [] devicePit;
if (!bridgeManager->EndSession(reboot))
success = false;
delete bridgeManager;
return (success ? 0 : 1);
}
}

View File

@ -0,0 +1,34 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
#ifndef PRINTPITACTION_H
#define PRINTPITACTION_H
namespace Heimdall
{
namespace PrintPitAction
{
extern const char *usage;
int Execute(int argc, char **argv);
};
}
#endif

View File

@ -32,11 +32,11 @@ namespace Heimdall
enum enum
{ {
kResponseTypeSendFilePart = 0x00, kResponseTypeSendFilePart = 0x00,
kResponseTypeBeginSession = 0x64, kResponseTypeSessionSetup = 0x64,
kResponseTypePitFile = 0x65, kResponseTypePitFile = 0x65,
kResponseTypeFileTransfer = 0x66, kResponseTypeFileTransfer = 0x66,
kResponseTypeEndSession = 0x67 kResponseTypeEndSession = 0x67
}; };
private: private:

View File

@ -34,12 +34,7 @@ namespace Heimdall
{ {
public: public:
enum SendFilePartPacket(FILE *file, int size) : OutboundPacket(size)
{
kDefaultPacketSize = 131072
};
SendFilePartPacket(FILE *file, int size = SendFilePartPacket::kDefaultPacketSize) : OutboundPacket(size)
{ {
memset(data, 0, size); memset(data, 0, size);

View File

@ -0,0 +1,74 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
#ifndef SESSIONSETUPPACKET_H
#define SESSIONSETUPPACKET_H
// Heimdall
#include "ControlPacket.h"
namespace Heimdall
{
class SessionSetupPacket : public ControlPacket
{
public:
enum
{
kBeginSession = 0,
kDeviceType = 1, // ?
kTotalBytes = 2,
//kEnableSomeSortOfFlag = 3,
kFilePartSize = 5
};
private:
unsigned int request;
protected:
enum
{
kDataSize = ControlPacket::kDataSize + 4
};
public:
SessionSetupPacket(unsigned int request) : ControlPacket(ControlPacket::kControlTypeSession)
{
this->request = request;
}
unsigned int GetRequest(void) const
{
return (request);
}
void Pack(void)
{
ControlPacket::Pack();
PackInteger(ControlPacket::kDataSize, request);
}
};
}
#endif

View File

@ -0,0 +1,58 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
#ifndef SESSIONSETUPRESPONSE_H
#define SESSIONSETUPRESPONSE_H
// Heimdall
#include "ResponsePacket.h"
namespace Heimdall
{
class SessionSetupResponse : public ResponsePacket
{
private:
unsigned int result;
public:
SessionSetupResponse() : ResponsePacket(ResponsePacket::kResponseTypeSessionSetup)
{
}
unsigned int GetResult(void) const
{
return (result);
}
bool Unpack(void)
{
if (!ResponsePacket::Unpack())
return (false);
result = UnpackInteger(ResponsePacket::kDataSize);
return (true);
}
};
}
#endif

View File

@ -0,0 +1,56 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
#ifndef TOTALBYTESSPACKET_H
#define TOTALBYTESPACKET_H
// Heimdall
#include "SessionSetupPacket.h"
namespace Heimdall
{
class TotalBytesPacket : public SessionSetupPacket
{
private:
unsigned int totalBytes;
public:
TotalBytesPacket(unsigned int totalBytes) : SessionSetupPacket(SessionSetupPacket::kTotalBytes)
{
this->totalBytes = totalBytes;
}
unsigned int GetTotalBytes(void) const
{
return (totalBytes);
}
void Pack(void)
{
SessionSetupPacket::Pack();
PackInteger(SessionSetupPacket::kDataSize, totalBytes);
}
};
}
#endif

View File

@ -0,0 +1,82 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
// C/C++ Standard Library
#include <cerrno>
#include <limits.h>
#include <stdlib.h>
// Heimdall
#include "Heimdall.h"
#include "Utility.h"
using namespace Heimdall;
NumberParsingStatus Utility::ParseInt(int &intValue, const char *string, int base)
{
errno = 0;
char *end;
long longValue = strtol(string, &end, base);
if (*string == '\0' || *end != '\0')
{
return (kNumberParsingStatusInconvertible);
}
else if (errno == ERANGE)
{
intValue = (longValue == LONG_MAX) ? INT_MAX : INT_MIN;
return (kNumberParsingStatusRangeError);
}
else if (longValue > INT_MAX)
{
intValue = INT_MAX;
return (kNumberParsingStatusRangeError);
}
else if (longValue < INT_MIN)
{
intValue = INT_MIN;
return (kNumberParsingStatusRangeError);
}
intValue = longValue;
return (kNumberParsingStatusSuccess);
}
NumberParsingStatus Utility::ParseUnsignedInt(unsigned int &uintValue, const char *string, int base)
{
errno = 0;
char *end;
unsigned long ulongValue = strtoul(string, &end, base);
if (*string == '\0' || *end != '\0')
{
return kNumberParsingStatusInconvertible;
}
else if (errno == ERANGE || ulongValue > INT_MAX)
{
uintValue = UINT_MAX;
return (kNumberParsingStatusRangeError);
}
uintValue = ulongValue;
return (kNumberParsingStatusSuccess);
}

40
heimdall/source/Utility.h Normal file
View File

@ -0,0 +1,40 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
#ifndef UTILITY_H
#define UTILITY_H
namespace Heimdall
{
typedef enum
{
kNumberParsingStatusSuccess = 0,
kNumberParsingStatusRangeError,
kNumberParsingStatusInconvertible
} NumberParsingStatus;
namespace Utility
{
NumberParsingStatus ParseInt(int &intValue, const char *string, int base = 0);
NumberParsingStatus ParseUnsignedInt(unsigned int &uintValue, const char *string, int base = 0);
}
}
#endif

View File

@ -0,0 +1,35 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
// Heimdall
#include "Heimdall.h"
#include "Interface.h"
#include "VersionAction.h"
using namespace Heimdall;
const char *VersionAction::usage = "Action: version\n\
Description: Displays the version number of this binary.\n";
int VersionAction::Execute(int argc, char **argv)
{
Interface::PrintVersion();
return (0);
}

View File

@ -0,0 +1,34 @@
/* Copyright (c) 2010-2012 Benjamin Dobell, Glass Echidna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
#ifndef VERSIONACTION_H
#define VERSIONACTION_H
namespace Heimdall
{
namespace VersionAction
{
extern const char *usage;
int Execute(int argc, char **argv);
};
}
#endif

View File

@ -28,782 +28,28 @@
#include "libpit.h" #include "libpit.h"
// Heimdall // Heimdall
#include "BridgeManager.h" #include "Heimdall.h"
#include "SetupSessionPacket.h" #include "HelpAction.h"
#include "SetupSessionResponse.h"
#include "EndModemFileTransferPacket.h"
#include "EndPhoneFileTransferPacket.h"
#include "Interface.h" #include "Interface.h"
using namespace std; using namespace std;
using namespace Heimdall; using namespace Heimdall;
// Known partitions
enum
{
kKnownPartitionPit = 0,
kKnownPartitionFactoryFs,
kKnownPartitionCache,
kKnownPartitionDatabaseData,
kKnownPartitionPrimaryBootloader,
kKnownPartitionSecondaryBootloader,
kKnownPartitionSecondaryBootloaderBackup,
kKnownPartitionParam,
kKnownPartitionKernel,
kKnownPartitionRecovery,
kKnownPartitionEfs,
kKnownPartitionModem,
kKnownPartitionNormalBoot,
kKnownPartitionSystem,
kKnownPartitionUserData,
kKnownPartitionFota,
kKnownPartitionHidden,
kKnownPartitionMovinand,
kKnownPartitionData,
kKnownPartitionUms,
kKnownPartitionEmmc,
kKnownPartitionCount
};
vector<const char *> knownPartitionNames[kKnownPartitionCount];
struct PartitionInfo
{
unsigned int chipIdentifier;
string partitionName;
FILE *file;
PartitionInfo(unsigned int chipIdentifier, const char *partitionName, FILE *file)
{
this->chipIdentifier = chipIdentifier;
this->partitionName = partitionName;
this->file = file;
}
};
void initialiseKnownPartitionNames(void)
{
knownPartitionNames[kKnownPartitionPit].push_back("PIT");
knownPartitionNames[kKnownPartitionFactoryFs].push_back("FACTORYFS");
knownPartitionNames[kKnownPartitionCache].push_back("CACHE");
knownPartitionNames[kKnownPartitionDatabaseData].push_back("DBDATAFS");
knownPartitionNames[kKnownPartitionPrimaryBootloader].push_back("IBL+PBL");
knownPartitionNames[kKnownPartitionPrimaryBootloader].push_back("BOOT");
knownPartitionNames[kKnownPartitionSecondaryBootloader].push_back("SBL");
knownPartitionNames[kKnownPartitionSecondaryBootloader].push_back("SBL1");
knownPartitionNames[kKnownPartitionSecondaryBootloaderBackup].push_back("SBL2");
knownPartitionNames[kKnownPartitionParam].push_back("PARAM");
knownPartitionNames[kKnownPartitionKernel].push_back("KERNEL");
knownPartitionNames[kKnownPartitionRecovery].push_back("RECOVERY");
knownPartitionNames[kKnownPartitionEfs].push_back("EFS");
knownPartitionNames[kKnownPartitionModem].push_back("MODEM");
knownPartitionNames[kKnownPartitionNormalBoot].push_back("NORMALBOOT");
knownPartitionNames[kKnownPartitionSystem].push_back("SYSTEM");
knownPartitionNames[kKnownPartitionUserData].push_back("USERDATA");
knownPartitionNames[kKnownPartitionFota].push_back("FOTA");
knownPartitionNames[kKnownPartitionHidden].push_back("HIDDEN");
knownPartitionNames[kKnownPartitionMovinand].push_back("MOVINAND");
knownPartitionNames[kKnownPartitionData].push_back("DATAFS");
knownPartitionNames[kKnownPartitionUms].push_back("UMS.EN");
knownPartitionNames[kKnownPartitionEmmc].push_back("GANG");
}
bool isKnownPartition(const char *partitionName, unsigned int knownPartitionIndex)
{
for (unsigned int i = 0; i < knownPartitionNames[knownPartitionIndex].size(); i++)
{
if (strcmp(partitionName, knownPartitionNames[knownPartitionIndex][i]) == 0)
return (true);
}
return (false);
}
bool isKnownBootPartition(const char *partitionName)
{
return (isKnownPartition(partitionName, kKnownPartitionPrimaryBootloader) ||
isKnownPartition(partitionName, kKnownPartitionSecondaryBootloader) ||
isKnownPartition(partitionName, kKnownPartitionSecondaryBootloaderBackup) ||
isKnownPartition(partitionName, kKnownPartitionParam) ||
isKnownPartition(partitionName, kKnownPartitionNormalBoot));
}
bool openFiles(const map<string, string>& argumentMap, map<string, FILE *>& argumentFileMap)
{
map<string, string>::const_iterator it = argumentMap.begin();
for (it = argumentMap.begin(); it != argumentMap.end(); it++)
{
bool isFileArgument = false;
int partitionIndex = atoi(it->first.substr(it->first.find_first_not_of('-')).c_str());
// Was the argument a partition index?
if (partitionIndex > 0 || it->first.compare("-0") == 0)
{
isFileArgument = true;
}
else
{
// The argument wasn't a partition index, check if it's a known partition name.
for (int knownPartition = 0; knownPartition < kKnownPartitionCount; knownPartition++)
{
if (it->first == Interface::actions[Interface::kActionFlash].valueArguments[knownPartition])
{
isFileArgument = true;
break;
}
}
}
if (!isFileArgument)
continue;
pair<string, FILE *> argumentFilePair;
argumentFilePair.first = it->first;
argumentFilePair.second = fopen(it->second.c_str(), "rb");
if (!argumentFilePair.second)
{
Interface::PrintError("Failed to open file \"%s\"\n", it->second.c_str());
return (false);
}
argumentFileMap.insert(argumentFilePair);
}
return (true);
}
bool mapFilesToPartitions(const map<string, FILE *>& argumentFileMap, const PitData *pitData, map<unsigned int, PartitionInfo>& partitionInfoMap)
{
map<string, FILE *>::const_iterator it = argumentFileMap.begin();
for (it = argumentFileMap.begin(); it != argumentFileMap.end(); it++)
{
int partitionIndex = atoi(it->first.substr(it->first.find_first_not_of('-')).c_str());
const PitEntry *pitEntry = nullptr;
// Was the argument a partition index?
if (partitionIndex > 0 || it->first.compare("-0") == 0)
{
pitEntry = pitData->FindEntry(partitionIndex);
}
else
{
// The argument wasn't a partition index, so it must be a known partition name.
int knownPartition;
for (knownPartition = 0; knownPartition < kKnownPartitionCount; knownPartition++)
{
if (it->first == Interface::actions[Interface::kActionFlash].valueArguments[knownPartition])
break;
}
// Check for the partition in the PIT file using all known names.
for (unsigned int i = 0; i < knownPartitionNames[knownPartition].size(); i++)
{
pitEntry = pitData->FindEntry(knownPartitionNames[knownPartition][i]);
if (pitEntry)
break;
}
if (!pitEntry && knownPartition == kKnownPartitionPit)
{
// NOTE: We're assuming a PIT file always has chipIdentifier zero.
PartitionInfo partitionInfo(0, knownPartitionNames[kKnownPartitionPit][0], it->second);
partitionInfoMap.insert(pair<unsigned int, PartitionInfo>(0xFFFFFFFF, partitionInfo));
return (true);
}
}
if (!pitEntry)
{
Interface::PrintError("Partition corresponding to %s argument could not be located\n", it->first.c_str());
return (false);
}
PartitionInfo partitionInfo(pitEntry->GetChipIdentifier(), pitEntry->GetPartitionName(), it->second);
partitionInfoMap.insert(pair<unsigned int, PartitionInfo>(pitEntry->GetPartitionIdentifier(), partitionInfo));
}
return (true);
}
void closeFiles(map<string, FILE *> argumentfileMap)
{
for (map<string, FILE *>::iterator it = argumentfileMap.begin(); it != argumentfileMap.end(); it++)
fclose(it->second);
argumentfileMap.clear();
}
int downloadPitFile(BridgeManager *bridgeManager, unsigned char **pitBuffer)
{
Interface::Print("Downloading device's PIT file...\n");
int devicePitFileSize = bridgeManager->ReceivePitFile(pitBuffer);
if (!*pitBuffer)
{
Interface::PrintError("Failed to download PIT file!\n");
return (-1);
}
Interface::Print("PIT file download sucessful\n\n");
return (devicePitFileSize);
}
bool flashFile(BridgeManager *bridgeManager, unsigned int chipIdentifier, unsigned int partitionIndex, const char *partitionName, FILE *file)
{
// PIT files need to be handled differently, try determine if the partition we're flashing to is a PIT partition.
bool isPit = false;
for (unsigned int i = 0; i < knownPartitionNames[kKnownPartitionPit].size(); i++)
{
if (strcmp(partitionName, knownPartitionNames[kKnownPartitionPit][i]) == 0)
{
isPit = true;
break;
}
}
if (isPit)
{
Interface::Print("Uploading %s\n", partitionName);
if (bridgeManager->SendPitFile(file))
{
Interface::Print("%s upload successful\n", partitionName);
return (true);
}
else
{
Interface::Print("%s upload failed!\n", partitionName);
return (false);
}
}
else
{
// Modems need to be handled differently, try determine if the partition we're flashing to is a modem partition.
bool isModem = false;
for (unsigned int i = 0; i < knownPartitionNames[kKnownPartitionModem].size(); i++)
{
if (strcmp(partitionName, knownPartitionNames[kKnownPartitionModem][i]) == 0)
{
isModem = true;
break;
}
}
if (isModem)
{
Interface::Print("Uploading %s\n", partitionName);
//if (bridgeManager->SendFile(file, EndPhoneFileTransferPacket::kDestinationPhone, // <-- Kies method. WARNING: Doesn't work on Galaxy Tab!
// EndPhoneFileTransferPacket::kFileModem))
if (bridgeManager->SendFile(file, EndModemFileTransferPacket::kDestinationModem, chipIdentifier)) // <-- Odin method
{
Interface::Print("%s upload successful\n", partitionName);
return (true);
}
else
{
Interface::Print("%s upload failed!\n", partitionName);
return (false);
}
}
else
{
// We're uploading to a phone partition
Interface::Print("Uploading %s\n", partitionName);
if (bridgeManager->SendFile(file, EndPhoneFileTransferPacket::kDestinationPhone, chipIdentifier, partitionIndex))
{
Interface::Print("%s upload successful\n", partitionName);
return (true);
}
else
{
Interface::Print("%s upload failed!\n", partitionName);
return (false);
}
}
}
return (true);
}
bool attemptFlash(BridgeManager *bridgeManager, map<string, FILE *> argumentFileMap, bool repartition)
{
bool success;
// ------------- SEND TOTAL BYTES TO BE TRANSFERRED -------------
int totalBytes = 0;
for (map<string, FILE *>::const_iterator it = argumentFileMap.begin(); it != argumentFileMap.end(); it++)
{
if (repartition || it->first != Interface::GetPitArgument())
{
fseek(it->second, 0, SEEK_END);
totalBytes += ftell(it->second);
rewind(it->second);
}
}
SetupSessionPacket *deviceInfoPacket = new SetupSessionPacket(SetupSessionPacket::kTotalBytes, totalBytes);
success = bridgeManager->SendPacket(deviceInfoPacket);
delete deviceInfoPacket;
if (!success)
{
Interface::PrintError("Failed to send total bytes device info packet!\n");
return (false);
}
SetupSessionResponse *deviceInfoResponse = new SetupSessionResponse();
success = bridgeManager->ReceivePacket(deviceInfoResponse);
int deviceInfoResult = deviceInfoResponse->GetUnknown();
delete deviceInfoResponse;
if (!success)
{
Interface::PrintError("Failed to receive device info response!\n");
return (false);
}
if (deviceInfoResult != 0)
{
Interface::PrintError("Unexpected device info response!\nExpected: 0\nReceived:%d\n", deviceInfoResult);
return (false);
}
// -----------------------------------------------------
PitData *pitData;
PitData *localPitData = nullptr;
FILE *localPitFile = nullptr;
// If a PIT file was passed as an argument then we must unpack it.
map<string, FILE *>::iterator it = argumentFileMap.find(Interface::actions[Interface::kActionFlash].valueArguments[Interface::kFlashValueArgPit]);
if (it != argumentFileMap.end())
{
localPitFile = it->second;
// Load the local pit file into memory.
unsigned char *pitFileBuffer = new unsigned char[4096];
memset(pitFileBuffer, 0, 4096);
fseek(localPitFile, 0, SEEK_END);
long localPitFileSize = ftell(localPitFile);
rewind(localPitFile);
// dataRead is discarded, it's here to remove warnings.
int dataRead = fread(pitFileBuffer, 1, localPitFileSize, localPitFile);
rewind(localPitFile);
localPitData = new PitData();
localPitData->Unpack(pitFileBuffer);
delete [] pitFileBuffer;
}
if (repartition)
{
// Use the local PIT file data.
pitData = localPitData;
}
else
{
// If we're not repartitioning then we need to retrieve the device's PIT file and unpack it.
unsigned char *pitFileBuffer;
downloadPitFile(bridgeManager, &pitFileBuffer);
pitData = new PitData();
pitData->Unpack(pitFileBuffer);
delete [] pitFileBuffer;
if (localPitData != nullptr)
{
// The user has specified a PIT without repartitioning, we should verify the local and device PIT data match!
bool pitsMatch = pitData->Matches(localPitData);
delete localPitData;
if (!pitsMatch)
{
Interface::Print("Local and device PIT files don't match and repartition wasn't specified!\n");
Interface::PrintError("Flash aborted!\n");
delete pitData;
return (false);
}
}
}
map<unsigned int, PartitionInfo> partitionInfoMap;
// Map the files being flashed to partitions stored in the PIT file.
if (!mapFilesToPartitions(argumentFileMap, pitData, partitionInfoMap))
{
delete pitData;
return (false);
}
delete pitData;
// If we're repartitioning then we need to flash the PIT file first.
if (repartition)
{
for (map<unsigned int, PartitionInfo>::iterator it = partitionInfoMap.begin(); it != partitionInfoMap.end(); it++)
{
if (it->second.file == localPitFile)
{
PartitionInfo *partitionInfo = &(it->second);
if (!flashFile(bridgeManager, partitionInfo->chipIdentifier, it->first, partitionInfo->partitionName.c_str(), partitionInfo->file))
return (false);
break;
}
}
}
// Flash partitions not involved in the boot process second.
for (map<unsigned int, PartitionInfo>::iterator it = partitionInfoMap.begin(); it != partitionInfoMap.end(); it++)
{
if (!isKnownPartition(it->second.partitionName.c_str(), kKnownPartitionPit) && !isKnownBootPartition(it->second.partitionName.c_str()))
{
PartitionInfo *partitionInfo = &(it->second);
if (!flashFile(bridgeManager, partitionInfo->chipIdentifier, it->first, partitionInfo->partitionName.c_str(), partitionInfo->file))
return (false);
}
}
// Flash boot partitions last.
for (map<unsigned int, PartitionInfo>::iterator it = partitionInfoMap.begin(); it != partitionInfoMap.end(); it++)
{
if (isKnownBootPartition(it->second.partitionName.c_str()))
{
PartitionInfo *partitionInfo = &(it->second);
if (!flashFile(bridgeManager, partitionInfo->chipIdentifier, it->first, partitionInfo->partitionName.c_str(), partitionInfo->file))
return (false);
}
}
return (true);
}
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
map<string, string> argumentMap; if (argc < 2)
int actionIndex;
if (!Interface::GetArguments(argc, argv, argumentMap, &actionIndex))
{ {
Sleep(250); Interface::PrintUsage();
return (0); return (0);
} }
initialiseKnownPartitionNames(); int result = 0;
map<string, Interface::ActionInfo>::const_iterator actionIt = Interface::GetActionMap().find(argv[1]);
switch (actionIndex)
{ if (actionIt != Interface::GetActionMap().end())
case Interface::kActionFlash: result = actionIt->second.executeFunction(argc, argv);
if (argumentMap.find(Interface::actions[Interface::kActionFlash].valuelessArguments[Interface::kFlashValuelessArgRepartition]) != argumentMap.end() else
&& argumentMap.find(Interface::actions[Interface::kActionFlash].valueArguments[Interface::kFlashValueArgPit]) == argumentMap.end()) result = HelpAction::Execute(argc, argv);
{
Interface::Print("If you wish to repartition then a PIT file must be specified.\n\n"); return (result);
Interface::PrintUsage();
return (0);
}
break;
case Interface::kActionDownloadPit:
if (argumentMap.find(Interface::actions[Interface::kActionDownloadPit].valueArguments[Interface::kDownloadPitValueArgOutput]) == argumentMap.end())
{
Interface::Print("Output file was not specified.\n\n");
Interface::PrintUsage();
return (0);
}
break;
case Interface::kActionDump:
{
if (argumentMap.find(Interface::actions[Interface::kActionDump].valueArguments[Interface::kDumpValueArgOutput]) == argumentMap.end())
{
Interface::Print("Output file was not specified.\n\n");
Interface::PrintUsage();
return (0);
}
if (argumentMap.find(Interface::actions[Interface::kActionDump].valueArguments[Interface::kDumpValueArgChipType]) == argumentMap.end())
{
Interface::Print("You must specify a chip type.\n\n");
Interface::PrintUsage();
return (0);
}
string chipType = argumentMap.find(Interface::actions[Interface::kActionDump].valueArguments[Interface::kDumpValueArgChipType])->second;
if (!(chipType == "RAM" || chipType == "ram" || chipType == "NAND" || chipType == "nand"))
{
Interface::Print("Unknown chip type: %s.\n\n", chipType.c_str());
Interface::PrintUsage();
return (0);
}
if (argumentMap.find(Interface::actions[Interface::kActionDump].valueArguments[Interface::kDumpValueArgChipId]) == argumentMap.end())
{
Interface::Print("You must specify a Chip ID.\n\n");
Interface::PrintUsage();
return (0);
}
int chipId = atoi(argumentMap.find(Interface::actions[Interface::kActionDump].valueArguments[Interface::kDumpValueArgChipId])->second.c_str());
if (chipId < 0)
{
Interface::Print("Chip ID must be a non-negative integer.\n");
Interface::PrintUsage();
return (0);
}
break;
}
case Interface::kActionVersion:
Interface::PrintVersion();
return (0);
case Interface::kActionHelp:
Interface::PrintUsage();
return (0);
case Interface::kActionInfo:
Interface::PrintFullInfo();
return (0);
}
bool verbose = argumentMap.find(Interface::commonValuelessArguments[Interface::kCommonValuelessArgVerbose]) != argumentMap.end();
bool reboot = argumentMap.find(Interface::commonValuelessArguments[Interface::kCommonValuelessArgNoReboot]) == argumentMap.end();
Interface::SetStdoutErrors(argumentMap.find(Interface::commonValuelessArguments[Interface::kCommonValuelessArgStdoutErrors]) != argumentMap.end());
int communicationDelay = BridgeManager::kCommunicationDelayDefault;
if (argumentMap.find(Interface::commonValueArguments[Interface::kCommonValueArgDelay]) != argumentMap.end())
communicationDelay = atoi(argumentMap.find(Interface::commonValueArguments[Interface::kCommonValueArgDelay])->second.c_str());
BridgeManager *bridgeManager = new BridgeManager(verbose, communicationDelay);
if (actionIndex == Interface::kActionDetect)
{
bool detected = bridgeManager->DetectDevice();
delete bridgeManager;
return ((detected) ? 0 : 1);
}
Interface::PrintReleaseInfo();
Sleep(1000);
int initialiseResult = bridgeManager->Initialise();
if (initialiseResult != 0)
{
delete bridgeManager;
return ((initialiseResult == BridgeManager::kInitialiseDeviceNotDetected) ? 1 : 0);
}
bool success;
switch (actionIndex)
{
case Interface::kActionFlash:
{
map<string, FILE *> argumentFileMap;
// We open the files before doing anything else to ensure they exist.
if (!openFiles(argumentMap, argumentFileMap))
{
closeFiles(argumentFileMap);
delete bridgeManager;
return (0);
}
if (!bridgeManager->BeginSession())
{
closeFiles(argumentFileMap);
delete bridgeManager;
return (-1);
}
bool repartition = argumentMap.find(Interface::actions[Interface::kActionFlash].valuelessArguments[Interface::kFlashValuelessArgRepartition]) != argumentMap.end();
success = attemptFlash(bridgeManager, argumentFileMap, repartition);
success = bridgeManager->EndSession(reboot) && success;
closeFiles(argumentFileMap);
break;
}
case Interface::kActionClosePcScreen:
{
if (!bridgeManager->BeginSession())
{
delete bridgeManager;
return (-1);
}
Interface::Print("Attempting to close connect to pc screen...\n");
success = bridgeManager->EndSession(reboot);
if (success)
Interface::Print("Attempt complete\n");
break;
}
case Interface::kActionDownloadPit:
{
map<string, string>::const_iterator it = argumentMap.find(Interface::actions[Interface::kActionDownloadPit].valueArguments[Interface::kDownloadPitValueArgOutput]);
FILE *outputPitFile = fopen(it->second.c_str(), "wb");
if (!outputPitFile)
{
delete bridgeManager;
return (0);
}
if (!bridgeManager->BeginSession())
{
delete bridgeManager;
fclose(outputPitFile);
return (-1);
}
unsigned char *pitBuffer;
int fileSize = downloadPitFile(bridgeManager, &pitBuffer);
if (fileSize > 0)
{
success = fwrite(pitBuffer, 1, fileSize, outputPitFile) == fileSize;
fclose(outputPitFile);
if (!success)
Interface::PrintError("Failed to write PIT data to output file.\n");
success = bridgeManager->EndSession(reboot) && success;
}
else
{
fclose(outputPitFile);
success = false;
bridgeManager->EndSession(reboot);
}
delete [] pitBuffer;
break;
}
case Interface::kActionDump:
{
const char *outputFilename = argumentMap.find(Interface::actions[Interface::kActionDump].valueArguments[Interface::kDumpValueArgOutput])->second.c_str();
FILE *dumpFile = fopen(outputFilename, "wb");
if (!dumpFile)
{
Interface::PrintError("Failed to open file \"%s\"\n", outputFilename);
delete bridgeManager;
return (-1);
}
int chipType = 0;
string chipTypeName = argumentMap.find(Interface::actions[Interface::kActionDump].valueArguments[Interface::kDumpValueArgChipType])->second;
if (chipTypeName == "NAND" || chipTypeName == "nand")
chipType = 1;
int chipId = atoi(argumentMap.find(Interface::actions[Interface::kActionDump].valueArguments[Interface::kDumpValueArgChipId])->second.c_str());
if (!bridgeManager->BeginSession())
{
fclose(dumpFile);
delete bridgeManager;
return (-1);
}
success = bridgeManager->ReceiveDump(chipType, chipId, dumpFile);
fclose(dumpFile);
success = bridgeManager->EndSession(reboot) && success;
break;
}
case Interface::kActionPrintPit:
{
if (!bridgeManager->BeginSession())
{
delete bridgeManager;
return (-1);
}
unsigned char *devicePit;
if (downloadPitFile(bridgeManager, &devicePit) < -1)
{
bridgeManager->EndSession(reboot);
delete bridgeManager;
return (-1);
}
PitData *pitData = new PitData();
if (pitData->Unpack(devicePit))
{
Interface::PrintPit(pitData);
success = true;
}
else
{
Interface::PrintError("Failed to unpack device's PIT file!\n");
success = false;
}
delete [] devicePit;
delete pitData;
success = bridgeManager->EndSession(reboot) && success;
break;
}
}
delete bridgeManager;
return ((success) ? 0 : -1);
} }

View File

@ -175,7 +175,6 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@ PATH_SEPARATOR = @PATH_SEPARATOR@
RANLIB = @RANLIB@ RANLIB = @RANLIB@

View File

@ -25,18 +25,19 @@ using namespace libpit;
PitEntry::PitEntry() PitEntry::PitEntry()
{ {
unused = false; binaryType = false;
chipIdentifier = 0; deviceType = 0;
partitionIdentifier = 0; identifier = 0;
partitionFlags = 0; attributes = 0;
unknown1 = 0; updateAttributes = 0;
partitionBlockSize = 0; blockSize = 0;
partitionBlockCount = 0; blockCount = 0;
unknown2 = 0; fileOffset = 0;
unknown3 = 0; fileSize = 0;
memset(partitionName, 0, 32); memset(partitionName, 0, PitEntry::kPartitionNameMaxLength);
memset(filename, 0, 64); memset(flashFilename, 0, PitEntry::kFlashFilenameMaxLength);
memset(fotaFilename, 0, PitEntry::kFotaFilenameMaxLength);
} }
PitEntry::~PitEntry() PitEntry::~PitEntry()
@ -45,10 +46,11 @@ PitEntry::~PitEntry()
bool PitEntry::Matches(const PitEntry *otherPitEntry) const bool PitEntry::Matches(const PitEntry *otherPitEntry) const
{ {
if (unused == otherPitEntry->unused && chipIdentifier == otherPitEntry->chipIdentifier && partitionIdentifier == otherPitEntry->partitionIdentifier if (binaryType == otherPitEntry->binaryType && deviceType == otherPitEntry->deviceType && identifier == otherPitEntry->identifier
&& partitionFlags == otherPitEntry->partitionFlags && unknown1 == otherPitEntry->unknown1 && partitionBlockSize == otherPitEntry->partitionBlockSize && attributes == otherPitEntry->attributes && updateAttributes == otherPitEntry->updateAttributes && blockSize == otherPitEntry->blockSize
&& partitionBlockCount == otherPitEntry->partitionBlockCount && unknown2 == otherPitEntry->unknown2 && unknown3 == otherPitEntry->unknown3 && blockCount == otherPitEntry->blockCount && fileOffset == otherPitEntry->fileOffset && fileSize == otherPitEntry->fileSize
&& strcmp(partitionName, otherPitEntry->partitionName) == 0 && strcmp(filename, otherPitEntry->filename) == 0) && strcmp(partitionName, otherPitEntry->partitionName) == 0 && strcmp(flashFilename, otherPitEntry->flashFilename) == 0
&& strcmp(fotaFilename, otherPitEntry->fotaFilename) == 0)
{ {
return (true); return (true);
} }
@ -118,34 +120,35 @@ bool PitData::Unpack(const unsigned char *data)
entries[i] = new PitEntry(); entries[i] = new PitEntry();
integerValue = PitData::UnpackInteger(data, entryOffset); integerValue = PitData::UnpackInteger(data, entryOffset);
entries[i]->SetUnused((integerValue != 0) ? true : false); entries[i]->SetBinaryType(integerValue);
integerValue = PitData::UnpackInteger(data, entryOffset + 4); integerValue = PitData::UnpackInteger(data, entryOffset + 4);
entries[i]->SetChipIdentifier(integerValue); entries[i]->SetDeviceType(integerValue);
integerValue = PitData::UnpackInteger(data, entryOffset + 8); integerValue = PitData::UnpackInteger(data, entryOffset + 8);
entries[i]->SetPartitionIdentifier(integerValue); entries[i]->SetIdentifier(integerValue);
integerValue = PitData::UnpackInteger(data, entryOffset + 12); integerValue = PitData::UnpackInteger(data, entryOffset + 12);
entries[i]->SetPartitionFlags(integerValue); entries[i]->SetAttributes(integerValue);
integerValue = PitData::UnpackInteger(data, entryOffset + 16); integerValue = PitData::UnpackInteger(data, entryOffset + 16);
entries[i]->SetUnknown1(integerValue); entries[i]->SetUpdateAttributes(integerValue);
integerValue = PitData::UnpackInteger(data, entryOffset + 20); integerValue = PitData::UnpackInteger(data, entryOffset + 20);
entries[i]->SetPartitionBlockSize(integerValue); entries[i]->SetBlockSize(integerValue);
integerValue = PitData::UnpackInteger(data, entryOffset + 24); integerValue = PitData::UnpackInteger(data, entryOffset + 24);
entries[i]->SetPartitionBlockCount(integerValue); entries[i]->SetBlockCount(integerValue);
integerValue = PitData::UnpackInteger(data, entryOffset + 28); integerValue = PitData::UnpackInteger(data, entryOffset + 28);
entries[i]->SetUnknown2(integerValue); entries[i]->SetFileOffset(integerValue);
integerValue = PitData::UnpackInteger(data, entryOffset + 32); integerValue = PitData::UnpackInteger(data, entryOffset + 32);
entries[i]->SetUnknown3(integerValue); entries[i]->SetFileSize(integerValue);
entries[i]->SetPartitionName((const char *)data + entryOffset + 36); entries[i]->SetPartitionName((const char *)data + entryOffset + 36);
entries[i]->SetFilename((const char *)data + entryOffset + 36 + PitEntry::kPartitionNameMaxLength); entries[i]->SetFlashFilename((const char *)data + entryOffset + 36 + PitEntry::kPartitionNameMaxLength);
entries[i]->SetFotaFilename((const char *)data + entryOffset + 36 + PitEntry::kPartitionNameMaxLength + PitEntry::kFlashFilenameMaxLength);
} }
return (true); return (true);
@ -175,22 +178,24 @@ void PitData::Pack(unsigned char *data) const
{ {
entryOffset = PitData::kHeaderDataSize + i * PitEntry::kDataSize; entryOffset = PitData::kHeaderDataSize + i * PitEntry::kDataSize;
PitData::PackInteger(data, entryOffset, (entries[i]->GetUnused()) ? 1 : 0); PitData::PackInteger(data, entryOffset, entries[i]->GetBinaryType());
PitData::PackInteger(data, entryOffset + 4, entries[i]->GetChipIdentifier()); PitData::PackInteger(data, entryOffset + 4, entries[i]->GetDeviceType());
PitData::PackInteger(data, entryOffset + 8, entries[i]->GetPartitionIdentifier()); PitData::PackInteger(data, entryOffset + 8, entries[i]->GetIdentifier());
PitData::PackInteger(data, entryOffset + 12, entries[i]->GetPartitionFlags()); PitData::PackInteger(data, entryOffset + 12, entries[i]->GetAttributes());
PitData::PackInteger(data, entryOffset + 16, entries[i]->GetUnknown1()); PitData::PackInteger(data, entryOffset + 16, entries[i]->GetUpdateAttributes());
PitData::PackInteger(data, entryOffset + 20, entries[i]->GetPartitionBlockSize()); PitData::PackInteger(data, entryOffset + 20, entries[i]->GetBlockSize());
PitData::PackInteger(data, entryOffset + 24, entries[i]->GetPartitionBlockCount()); PitData::PackInteger(data, entryOffset + 24, entries[i]->GetBlockCount());
PitData::PackInteger(data, entryOffset + 28, entries[i]->GetUnknown2()); PitData::PackInteger(data, entryOffset + 28, entries[i]->GetFileOffset());
PitData::PackInteger(data, entryOffset + 32, entries[i]->GetUnknown3()); PitData::PackInteger(data, entryOffset + 32, entries[i]->GetFileSize());
memcpy(data + entryOffset + 36, entries[i]->GetPartitionName(), PitEntry::kPartitionNameMaxLength); memcpy(data + entryOffset + 36, entries[i]->GetPartitionName(), PitEntry::kPartitionNameMaxLength);
memcpy(data + entryOffset + 36 + PitEntry::kPartitionNameMaxLength, entries[i]->GetPartitionName(), PitEntry::kFilenameMaxLength); memcpy(data + entryOffset + 36 + PitEntry::kPartitionNameMaxLength, entries[i]->GetPartitionName(), PitEntry::kFlashFilenameMaxLength);
memcpy(data + entryOffset + 36 + PitEntry::kPartitionNameMaxLength + PitEntry::kFlashFilenameMaxLength,
entries[i]->GetFotaFilename(), PitEntry::kFotaFilenameMaxLength);
} }
} }
@ -250,7 +255,7 @@ PitEntry *PitData::FindEntry(const char *partitionName)
{ {
for (unsigned int i = 0; i < entries.size(); i++) for (unsigned int i = 0; i < entries.size(); i++)
{ {
if (!entries[i]->GetUnused() && strcmp(entries[i]->GetPartitionName(), partitionName) == 0) if (entries[i]->GetBlockCount() > 0 && strcmp(entries[i]->GetPartitionName(), partitionName) == 0)
return (entries[i]); return (entries[i]);
} }
@ -261,7 +266,7 @@ const PitEntry *PitData::FindEntry(const char *partitionName) const
{ {
for (unsigned int i = 0; i < entries.size(); i++) for (unsigned int i = 0; i < entries.size(); i++)
{ {
if (!entries[i]->GetUnused() && strcmp(entries[i]->GetPartitionName(), partitionName) == 0) if (entries[i]->GetBlockCount() > 0 && strcmp(entries[i]->GetPartitionName(), partitionName) == 0)
return (entries[i]); return (entries[i]);
} }
@ -272,7 +277,7 @@ PitEntry *PitData::FindEntry(unsigned int partitionIdentifier)
{ {
for (unsigned int i = 0; i < entries.size(); i++) for (unsigned int i = 0; i < entries.size(); i++)
{ {
if (!entries[i]->GetUnused() && entries[i]->GetPartitionIdentifier() == partitionIdentifier) if (entries[i]->GetBlockCount() > 0 && entries[i]->GetIdentifier() == partitionIdentifier)
return (entries[i]); return (entries[i]);
} }
@ -283,7 +288,7 @@ const PitEntry *PitData::FindEntry(unsigned int partitionIdentifier) const
{ {
for (unsigned int i = 0; i < entries.size(); i++) for (unsigned int i = 0; i < entries.size(); i++)
{ {
if (!entries[i]->GetUnused() && entries[i]->GetPartitionIdentifier() == partitionIdentifier) if (entries[i]->GetBlockCount() > 0 && entries[i]->GetIdentifier() == partitionIdentifier)
return (entries[i]); return (entries[i]);
} }

View File

@ -43,32 +43,53 @@ namespace libpit
{ {
kDataSize = 132, kDataSize = 132,
kPartitionNameMaxLength = 32, kPartitionNameMaxLength = 32,
kFilenameMaxLength = 64 kFlashFilenameMaxLength = 32,
kFotaFilenameMaxLength = 32
}; };
enum enum
{ {
kPartitionFlagWrite = 1 << 1 kBinaryTypeApplicationProcessor = 0,
kBinaryTypeCommunicationProcessor = 1
};
enum
{
kDeviceTypeOneNand = 0,
kDeviceTypeFile, // FAT
kDeviceTypeMMC,
kDeviceTypeAll // ?
};
enum
{
kAttributeWrite = 1,
kAttributeSTL = 1 << 1
};
enum
{
kUpdateAttributeFota = 1,
kUpdateAttributeSecure = 1 << 1
}; };
private: private:
bool unused; unsigned int binaryType;
unsigned int deviceType;
unsigned int identifier;
unsigned int attributes;
unsigned int updateAttributes;
unsigned int chipIdentifier; unsigned int blockSize;
unsigned int partitionIdentifier; unsigned int blockCount;
unsigned int partitionFlags;
unsigned int unknown1; unsigned int fileOffset; // Obsolete
unsigned int fileSize; // Obsolete
unsigned int partitionBlockSize;
unsigned int partitionBlockCount;
unsigned int unknown2;
unsigned int unknown3;
char partitionName[kPartitionNameMaxLength]; char partitionName[kPartitionNameMaxLength];
char filename[kFilenameMaxLength]; char flashFilename[kFlashFilenameMaxLength]; // USB flash filename
char fotaFilename[kFotaFilenameMaxLength]; // Firmware over the air
public: public:
@ -77,94 +98,94 @@ namespace libpit
bool Matches(const PitEntry *otherPitEntry) const; bool Matches(const PitEntry *otherPitEntry) const;
bool GetUnused(void) const unsigned int GetBinaryType(void) const
{ {
return unused; return binaryType;
} }
void SetUnused(bool unused) void SetBinaryType(unsigned int binaryType)
{ {
this->unused = unused; this->binaryType = binaryType;
} }
unsigned int GetChipIdentifier(void) const unsigned int GetDeviceType(void) const
{ {
return chipIdentifier; return deviceType;
} }
void SetChipIdentifier(unsigned int chipIdentifier) void SetDeviceType(unsigned int deviceType)
{ {
this->chipIdentifier = chipIdentifier; this->deviceType = deviceType;
} }
unsigned int GetPartitionIdentifier(void) const unsigned int GetIdentifier(void) const
{ {
return partitionIdentifier; return identifier;
} }
void SetPartitionIdentifier(unsigned int partitionIdentifier) void SetIdentifier(unsigned int identifier)
{ {
this->partitionIdentifier = partitionIdentifier; this->identifier = identifier;
} }
unsigned int GetPartitionFlags(void) const unsigned int GetAttributes(void) const
{ {
return partitionFlags; return attributes;
} }
void SetPartitionFlags(unsigned int partitionFlags) void SetAttributes(unsigned int attributes)
{ {
this->partitionFlags = partitionFlags; this->attributes = attributes;
} }
unsigned int GetUnknown1(void) const unsigned int GetUpdateAttributes(void) const
{ {
return unknown1; return updateAttributes;
} }
void SetUnknown1(unsigned int unknown1) void SetUpdateAttributes(unsigned int updateAttributes)
{ {
this->unknown1 = unknown1; this->updateAttributes = updateAttributes;
} }
unsigned int GetPartitionBlockSize(void) const unsigned int GetBlockSize(void) const
{ {
return partitionBlockSize; return blockSize;
} }
void SetPartitionBlockSize(unsigned int partitionBlockSize) void SetBlockSize(unsigned int blockSize)
{ {
this->partitionBlockSize = partitionBlockSize; this->blockSize = blockSize;
} }
unsigned int GetPartitionBlockCount(void) const unsigned int GetBlockCount(void) const
{ {
return partitionBlockCount; return blockCount;
} }
void SetPartitionBlockCount(unsigned int partitionBlockCount) void SetBlockCount(unsigned int blockCount)
{ {
this->partitionBlockCount = partitionBlockCount; this->blockCount = blockCount;
} }
unsigned int GetUnknown2(void) const unsigned int GetFileOffset(void) const
{ {
return unknown2; return fileOffset;
} }
void SetUnknown2(unsigned int unknown2) void SetFileOffset(unsigned int fileOffset)
{ {
this->unknown2 = unknown2; this->fileOffset = fileOffset;
} }
unsigned int GetUnknown3(void) const unsigned int GetFileSize(void) const
{ {
return unknown3; return fileSize;
} }
void SetUnknown3(unsigned int unknown3) void SetFileSize(unsigned int fileSize)
{ {
this->unknown3 = unknown3; this->fileSize = fileSize;
} }
const char *GetPartitionName(void) const const char *GetPartitionName(void) const
@ -183,20 +204,36 @@ namespace libpit
memcpy(this->partitionName, partitionName, 63); memcpy(this->partitionName, partitionName, 63);
} }
const char *GetFilename(void) const const char *GetFlashFilename(void) const
{ {
return filename; return flashFilename;
} }
void SetFilename(const char *filename) void SetFlashFilename(const char *flashFilename)
{ {
// This isn't strictly necessary but ensures no junk is left in our PIT file. // This isn't strictly necessary but ensures no junk is left in our PIT file.
memset(this->filename, 0, 32); memset(this->flashFilename, 0, kFlashFilenameMaxLength);
if (strlen(partitionName) < 32) if (strlen(partitionName) < 32)
strcpy(this->filename, filename); strcpy(this->flashFilename, flashFilename);
else else
memcpy(this->filename, filename, 31); memcpy(this->flashFilename, flashFilename, 31);
}
const char *GetFotaFilename(void) const
{
return fotaFilename;
}
void SetFotaFilename(const char *fotaFilename)
{
// This isn't strictly necessary but ensures no junk is left in our PIT file.
memset(this->fotaFilename, 0, kFotaFilenameMaxLength);
if (strlen(partitionName) < 32)
strcpy(this->fotaFilename, fotaFilename);
else
memcpy(this->fotaFilename, fotaFilename, 31);
} }
}; };
@ -217,7 +254,7 @@ namespace libpit
unsigned int unknown2; // 0x0C unsigned int unknown2; // 0x0C
unsigned short unknown3; // 0x10 (7508 = I9000, 7703 = I9100 & P1000)? unsigned short unknown3; // 0x10 (7508 = I9000, 7703 = I9100 & P1000)?
unsigned short unknown4; // 0x12 (Always 65, probably flags of some sort) unsigned short unknown4; // 0x12 (Always 65, probably attributes of some sort)
unsigned short unknown5; // 0x14 unsigned short unknown5; // 0x14
unsigned short unknown6; // 0x16 unsigned short unknown6; // 0x16

49
libpit/aclocal.m4 vendored
View File

@ -13,8 +13,8 @@
m4_ifndef([AC_AUTOCONF_VERSION], m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.67],, m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.63],,
[m4_warning([this file was generated for autoconf 2.67. [m4_warning([this file was generated for autoconf 2.63.
You have another version of autoconf. It may work, but is not guaranteed to. You have another version of autoconf. It may work, but is not guaranteed to.
If you have problems, you may need to regenerate the build system entirely. If you have problems, you may need to regenerate the build system entirely.
To do so, use the procedure documented by the package, typically `autoreconf'.])]) To do so, use the procedure documented by the package, typically `autoreconf'.])])
@ -2460,7 +2460,7 @@ linux*oldld* | linux*aout* | linux*coff*)
;; ;;
# This must be Linux ELF. # This must be Linux ELF.
linux* | k*bsd*-gnu | kopensolaris*-gnu) linux* | k*bsd*-gnu)
version_type=linux version_type=linux
need_lib_prefix=no need_lib_prefix=no
need_version=no need_version=no
@ -2485,10 +2485,13 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu)
# before this can be enabled. # before this can be enabled.
hardcode_into_libs=yes hardcode_into_libs=yes
# Add ABI-specific directories to the system library path.
sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
# Append ld.so.conf contents to the search path # Append ld.so.conf contents to the search path
if test -f /etc/ld.so.conf; then if test -f /etc/ld.so.conf; then
lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
fi fi
# We used to test for /lib/ld.so.1 and disable shared libraries on # We used to test for /lib/ld.so.1 and disable shared libraries on
@ -2500,18 +2503,6 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu)
dynamic_linker='GNU/Linux ld.so' dynamic_linker='GNU/Linux ld.so'
;; ;;
netbsdelf*-gnu)
version_type=linux
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
hardcode_into_libs=yes
dynamic_linker='NetBSD ld.elf_so'
;;
netbsd*) netbsd*)
version_type=sunos version_type=sunos
need_lib_prefix=no need_lib_prefix=no
@ -3099,11 +3090,11 @@ irix5* | irix6* | nonstopux*)
;; ;;
# This must be Linux ELF. # This must be Linux ELF.
linux* | k*bsd*-gnu | kopensolaris*-gnu) linux* | k*bsd*-gnu)
lt_cv_deplibs_check_method=pass_all lt_cv_deplibs_check_method=pass_all
;; ;;
netbsd* | netbsdelf*-gnu) netbsd*)
if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
else else
@ -3720,7 +3711,7 @@ m4_if([$1], [CXX], [
;; ;;
esac esac
;; ;;
linux* | k*bsd*-gnu | kopensolaris*-gnu) linux* | k*bsd*-gnu)
case $cc_basename in case $cc_basename in
KCC*) KCC*)
# KAI C++ Compiler # KAI C++ Compiler
@ -3784,7 +3775,7 @@ m4_if([$1], [CXX], [
;; ;;
esac esac
;; ;;
netbsd* | netbsdelf*-gnu) netbsd*)
;; ;;
*qnx* | *nto*) *qnx* | *nto*)
# QNX uses GNU C++, but need to define -shared option too, otherwise # QNX uses GNU C++, but need to define -shared option too, otherwise
@ -4004,7 +3995,7 @@ m4_if([$1], [CXX], [
_LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
;; ;;
linux* | k*bsd*-gnu | kopensolaris*-gnu) linux* | k*bsd*-gnu)
case $cc_basename in case $cc_basename in
# old Intel for x86_64 which still supported -KPIC. # old Intel for x86_64 which still supported -KPIC.
ecc*) ecc*)
@ -4209,9 +4200,6 @@ m4_if([$1], [CXX], [
cygwin* | mingw* | cegcc*) cygwin* | mingw* | cegcc*)
_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
;; ;;
linux* | k*bsd*-gnu)
_LT_TAGVAR(link_all_deplibs, $1)=no
;;
*) *)
_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
;; ;;
@ -4276,9 +4264,6 @@ dnl Note also adjust exclude_expsyms for C++ above.
openbsd*) openbsd*)
with_gnu_ld=no with_gnu_ld=no
;; ;;
linux* | k*bsd*-gnu)
_LT_TAGVAR(link_all_deplibs, $1)=no
;;
esac esac
_LT_TAGVAR(ld_shlibs, $1)=yes _LT_TAGVAR(ld_shlibs, $1)=yes
@ -4300,7 +4285,6 @@ dnl Note also adjust exclude_expsyms for C++ above.
fi fi
supports_anon_versioning=no supports_anon_versioning=no
case `$LD -v 2>&1` in case `$LD -v 2>&1` in
*GNU\ gold*) supports_anon_versioning=yes ;;
*\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
*\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
*\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
@ -4392,7 +4376,7 @@ _LT_EOF
_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
;; ;;
gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) gnu* | linux* | tpf* | k*bsd*-gnu)
tmp_diet=no tmp_diet=no
if test "$host_os" = linux-dietlibc; then if test "$host_os" = linux-dietlibc; then
case $cc_basename in case $cc_basename in
@ -4462,7 +4446,7 @@ _LT_EOF
fi fi
;; ;;
netbsd* | netbsdelf*-gnu) netbsd*)
if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
wlarc= wlarc=
@ -4637,7 +4621,6 @@ _LT_EOF
if test "$aix_use_runtimelinking" = yes; then if test "$aix_use_runtimelinking" = yes; then
shared_flag="$shared_flag "'${wl}-G' shared_flag="$shared_flag "'${wl}-G'
fi fi
_LT_TAGVAR(link_all_deplibs, $1)=no
else else
# not using gcc # not using gcc
if test "$host_cpu" = ia64; then if test "$host_cpu" = ia64; then
@ -4876,7 +4859,7 @@ _LT_EOF
_LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes
;; ;;
netbsd* | netbsdelf*-gnu) netbsd*)
if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
else else
@ -5872,7 +5855,7 @@ if test "$_lt_caught_CXX_error" != yes; then
_LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(inherit_rpath, $1)=yes
;; ;;
linux* | k*bsd*-gnu | kopensolaris*-gnu) linux* | k*bsd*-gnu)
case $cc_basename in case $cc_basename in
KCC*) KCC*)
# Kuck and Associates, Inc. (KAI) C++ Compiler # Kuck and Associates, Inc. (KAI) C++ Compiler

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
# This file was generated by Autom4te Thu Aug 5 21:29:16 UTC 2010. # This file was generated.
# It contains the lists of macros which have been traced. # It contains the lists of macros which have been traced.
# It can be safely removed. # It can be safely removed.

View File

@ -554,7 +554,7 @@ m4trace:/usr/share/aclocal/libtool.m4:1841: -1- AU_DEFUN([AC_LIBTOOL_DLOPEN_SELF
m4trace:/usr/share/aclocal/libtool.m4:1841: -1- AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_DLOPEN_SELF' is obsolete. m4trace:/usr/share/aclocal/libtool.m4:1841: -1- AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_DLOPEN_SELF' is obsolete.
You should run autoupdate.])dnl You should run autoupdate.])dnl
m4_if($#, 0, [LT_SYS_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF($@)])]) m4_if($#, 0, [LT_SYS_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF($@)])])
m4trace:/usr/share/aclocal/libtool.m4:2741: -1- AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl m4trace:/usr/share/aclocal/libtool.m4:2732: -1- AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl
AC_MSG_CHECKING([for $1]) AC_MSG_CHECKING([for $1])
AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
[case $MAGIC_CMD in [case $MAGIC_CMD in
@ -613,11 +613,11 @@ fi
_LT_DECL([], [MAGIC_CMD], [0], _LT_DECL([], [MAGIC_CMD], [0],
[Used to examine libraries when file_magic_cmd begins with "file"])dnl [Used to examine libraries when file_magic_cmd begins with "file"])dnl
]) ])
m4trace:/usr/share/aclocal/libtool.m4:2803: -1- AU_DEFUN([AC_PATH_TOOL_PREFIX], [m4_if($#, 0, [_LT_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX($@)])]) m4trace:/usr/share/aclocal/libtool.m4:2794: -1- AU_DEFUN([AC_PATH_TOOL_PREFIX], [m4_if($#, 0, [_LT_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX($@)])])
m4trace:/usr/share/aclocal/libtool.m4:2803: -1- AC_DEFUN([AC_PATH_TOOL_PREFIX], [AC_DIAGNOSE([obsolete], [The macro `AC_PATH_TOOL_PREFIX' is obsolete. m4trace:/usr/share/aclocal/libtool.m4:2794: -1- AC_DEFUN([AC_PATH_TOOL_PREFIX], [AC_DIAGNOSE([obsolete], [The macro `AC_PATH_TOOL_PREFIX' is obsolete.
You should run autoupdate.])dnl You should run autoupdate.])dnl
m4_if($#, 0, [_LT_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX($@)])]) m4_if($#, 0, [_LT_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX($@)])])
m4trace:/usr/share/aclocal/libtool.m4:2826: -1- AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl m4trace:/usr/share/aclocal/libtool.m4:2817: -1- AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl
AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl
AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl
m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_SED])dnl
@ -702,15 +702,15 @@ AC_SUBST([LD])
_LT_TAGDECL([], [LD], [1], [The linker used to build libraries]) _LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
]) ])
m4trace:/usr/share/aclocal/libtool.m4:2914: -1- AU_DEFUN([AM_PROG_LD], [m4_if($#, 0, [LT_PATH_LD], [LT_PATH_LD($@)])]) m4trace:/usr/share/aclocal/libtool.m4:2905: -1- AU_DEFUN([AM_PROG_LD], [m4_if($#, 0, [LT_PATH_LD], [LT_PATH_LD($@)])])
m4trace:/usr/share/aclocal/libtool.m4:2914: -1- AC_DEFUN([AM_PROG_LD], [AC_DIAGNOSE([obsolete], [The macro `AM_PROG_LD' is obsolete. m4trace:/usr/share/aclocal/libtool.m4:2905: -1- AC_DEFUN([AM_PROG_LD], [AC_DIAGNOSE([obsolete], [The macro `AM_PROG_LD' is obsolete.
You should run autoupdate.])dnl You should run autoupdate.])dnl
m4_if($#, 0, [LT_PATH_LD], [LT_PATH_LD($@)])]) m4_if($#, 0, [LT_PATH_LD], [LT_PATH_LD($@)])])
m4trace:/usr/share/aclocal/libtool.m4:2915: -1- AU_DEFUN([AC_PROG_LD], [m4_if($#, 0, [LT_PATH_LD], [LT_PATH_LD($@)])]) m4trace:/usr/share/aclocal/libtool.m4:2906: -1- AU_DEFUN([AC_PROG_LD], [m4_if($#, 0, [LT_PATH_LD], [LT_PATH_LD($@)])])
m4trace:/usr/share/aclocal/libtool.m4:2915: -1- AC_DEFUN([AC_PROG_LD], [AC_DIAGNOSE([obsolete], [The macro `AC_PROG_LD' is obsolete. m4trace:/usr/share/aclocal/libtool.m4:2906: -1- AC_DEFUN([AC_PROG_LD], [AC_DIAGNOSE([obsolete], [The macro `AC_PROG_LD' is obsolete.
You should run autoupdate.])dnl You should run autoupdate.])dnl
m4_if($#, 0, [LT_PATH_LD], [LT_PATH_LD($@)])]) m4_if($#, 0, [LT_PATH_LD], [LT_PATH_LD($@)])])
m4trace:/usr/share/aclocal/libtool.m4:3179: -1- AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl m4trace:/usr/share/aclocal/libtool.m4:3170: -1- AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl
AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
[if test -n "$NM"; then [if test -n "$NM"; then
# Let the user override the test. # Let the user override the test.
@ -785,15 +785,15 @@ AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
fi fi
rm -f conftest*]) rm -f conftest*])
]) ])
m4trace:/usr/share/aclocal/libtool.m4:3257: -1- AU_DEFUN([AM_PROG_NM], [m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) m4trace:/usr/share/aclocal/libtool.m4:3248: -1- AU_DEFUN([AM_PROG_NM], [m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])])
m4trace:/usr/share/aclocal/libtool.m4:3257: -1- AC_DEFUN([AM_PROG_NM], [AC_DIAGNOSE([obsolete], [The macro `AM_PROG_NM' is obsolete. m4trace:/usr/share/aclocal/libtool.m4:3248: -1- AC_DEFUN([AM_PROG_NM], [AC_DIAGNOSE([obsolete], [The macro `AM_PROG_NM' is obsolete.
You should run autoupdate.])dnl You should run autoupdate.])dnl
m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])])
m4trace:/usr/share/aclocal/libtool.m4:3258: -1- AU_DEFUN([AC_PROG_NM], [m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) m4trace:/usr/share/aclocal/libtool.m4:3249: -1- AU_DEFUN([AC_PROG_NM], [m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])])
m4trace:/usr/share/aclocal/libtool.m4:3258: -1- AC_DEFUN([AC_PROG_NM], [AC_DIAGNOSE([obsolete], [The macro `AC_PROG_NM' is obsolete. m4trace:/usr/share/aclocal/libtool.m4:3249: -1- AC_DEFUN([AC_PROG_NM], [AC_DIAGNOSE([obsolete], [The macro `AC_PROG_NM' is obsolete.
You should run autoupdate.])dnl You should run autoupdate.])dnl
m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])])
m4trace:/usr/share/aclocal/libtool.m4:3267: -1- AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4trace:/usr/share/aclocal/libtool.m4:3258: -1- AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl
LIBM= LIBM=
case $host in case $host in
*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) *-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*)
@ -809,28 +809,28 @@ case $host in
esac esac
AC_SUBST([LIBM]) AC_SUBST([LIBM])
]) ])
m4trace:/usr/share/aclocal/libtool.m4:3286: -1- AU_DEFUN([AC_CHECK_LIBM], [m4_if($#, 0, [LT_LIB_M], [LT_LIB_M($@)])]) m4trace:/usr/share/aclocal/libtool.m4:3277: -1- AU_DEFUN([AC_CHECK_LIBM], [m4_if($#, 0, [LT_LIB_M], [LT_LIB_M($@)])])
m4trace:/usr/share/aclocal/libtool.m4:3286: -1- AC_DEFUN([AC_CHECK_LIBM], [AC_DIAGNOSE([obsolete], [The macro `AC_CHECK_LIBM' is obsolete. m4trace:/usr/share/aclocal/libtool.m4:3277: -1- AC_DEFUN([AC_CHECK_LIBM], [AC_DIAGNOSE([obsolete], [The macro `AC_CHECK_LIBM' is obsolete.
You should run autoupdate.])dnl You should run autoupdate.])dnl
m4_if($#, 0, [LT_LIB_M], [LT_LIB_M($@)])]) m4_if($#, 0, [LT_LIB_M], [LT_LIB_M($@)])])
m4trace:/usr/share/aclocal/libtool.m4:6987: -1- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], m4trace:/usr/share/aclocal/libtool.m4:6970: -1- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
[m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
[AC_CHECK_TOOL(GCJ, gcj,) [AC_CHECK_TOOL(GCJ, gcj,)
test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
AC_SUBST(GCJFLAGS)])])[]dnl AC_SUBST(GCJFLAGS)])])[]dnl
]) ])
m4trace:/usr/share/aclocal/libtool.m4:6996: -1- AU_DEFUN([LT_AC_PROG_GCJ], [m4_if($#, 0, [LT_PROG_GCJ], [LT_PROG_GCJ($@)])]) m4trace:/usr/share/aclocal/libtool.m4:6979: -1- AU_DEFUN([LT_AC_PROG_GCJ], [m4_if($#, 0, [LT_PROG_GCJ], [LT_PROG_GCJ($@)])])
m4trace:/usr/share/aclocal/libtool.m4:6996: -1- AC_DEFUN([LT_AC_PROG_GCJ], [AC_DIAGNOSE([obsolete], [The macro `LT_AC_PROG_GCJ' is obsolete. m4trace:/usr/share/aclocal/libtool.m4:6979: -1- AC_DEFUN([LT_AC_PROG_GCJ], [AC_DIAGNOSE([obsolete], [The macro `LT_AC_PROG_GCJ' is obsolete.
You should run autoupdate.])dnl You should run autoupdate.])dnl
m4_if($#, 0, [LT_PROG_GCJ], [LT_PROG_GCJ($@)])]) m4_if($#, 0, [LT_PROG_GCJ], [LT_PROG_GCJ($@)])])
m4trace:/usr/share/aclocal/libtool.m4:7003: -1- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) m4trace:/usr/share/aclocal/libtool.m4:6986: -1- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,)
]) ])
m4trace:/usr/share/aclocal/libtool.m4:7008: -1- AU_DEFUN([LT_AC_PROG_RC], [m4_if($#, 0, [LT_PROG_RC], [LT_PROG_RC($@)])]) m4trace:/usr/share/aclocal/libtool.m4:6991: -1- AU_DEFUN([LT_AC_PROG_RC], [m4_if($#, 0, [LT_PROG_RC], [LT_PROG_RC($@)])])
m4trace:/usr/share/aclocal/libtool.m4:7008: -1- AC_DEFUN([LT_AC_PROG_RC], [AC_DIAGNOSE([obsolete], [The macro `LT_AC_PROG_RC' is obsolete. m4trace:/usr/share/aclocal/libtool.m4:6991: -1- AC_DEFUN([LT_AC_PROG_RC], [AC_DIAGNOSE([obsolete], [The macro `LT_AC_PROG_RC' is obsolete.
You should run autoupdate.])dnl You should run autoupdate.])dnl
m4_if($#, 0, [LT_PROG_RC], [LT_PROG_RC($@)])]) m4_if($#, 0, [LT_PROG_RC], [LT_PROG_RC($@)])])
m4trace:/usr/share/aclocal/libtool.m4:7119: -1- AU_DEFUN([LT_AC_PROG_SED], [m4_if($#, 0, [AC_PROG_SED], [AC_PROG_SED($@)])]) m4trace:/usr/share/aclocal/libtool.m4:7102: -1- AU_DEFUN([LT_AC_PROG_SED], [m4_if($#, 0, [AC_PROG_SED], [AC_PROG_SED($@)])])
m4trace:/usr/share/aclocal/libtool.m4:7119: -1- AC_DEFUN([LT_AC_PROG_SED], [AC_DIAGNOSE([obsolete], [The macro `LT_AC_PROG_SED' is obsolete. m4trace:/usr/share/aclocal/libtool.m4:7102: -1- AC_DEFUN([LT_AC_PROG_SED], [AC_DIAGNOSE([obsolete], [The macro `LT_AC_PROG_SED' is obsolete.
You should run autoupdate.])dnl You should run autoupdate.])dnl
m4_if($#, 0, [AC_PROG_SED], [AC_PROG_SED($@)])]) m4_if($#, 0, [AC_PROG_SED], [AC_PROG_SED($@)])])
m4trace:/usr/share/aclocal/ltdl.m4:16: -1- AC_DEFUN([LT_CONFIG_LTDL_DIR], [AC_BEFORE([$0], [LTDL_INIT]) m4trace:/usr/share/aclocal/ltdl.m4:16: -1- AC_DEFUN([LT_CONFIG_LTDL_DIR], [AC_BEFORE([$0], [LTDL_INIT])
@ -1085,7 +1085,7 @@ AC_CACHE_CHECK([whether deplibs are loaded by dlopen],
freebsd* | dragonfly*) freebsd* | dragonfly*)
lt_cv_sys_dlopen_deplibs=yes lt_cv_sys_dlopen_deplibs=yes
;; ;;
gnu* | linux* | k*bsd*-gnu | kopensolaris*-gnu) gnu* | linux* | k*bsd*-gnu)
# GNU and its variants, using gnu ld.so (Glibc) # GNU and its variants, using gnu ld.so (Glibc)
lt_cv_sys_dlopen_deplibs=yes lt_cv_sys_dlopen_deplibs=yes
;; ;;
@ -1105,7 +1105,7 @@ AC_CACHE_CHECK([whether deplibs are loaded by dlopen],
# at 6.2 and later dlopen does load deplibs. # at 6.2 and later dlopen does load deplibs.
lt_cv_sys_dlopen_deplibs=yes lt_cv_sys_dlopen_deplibs=yes
;; ;;
netbsd* | netbsdelf*-gnu) netbsd*)
lt_cv_sys_dlopen_deplibs=yes lt_cv_sys_dlopen_deplibs=yes
;; ;;
openbsd*) openbsd*)
@ -2116,7 +2116,6 @@ m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_TARNAME$])
m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_VERSION$])
m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_STRING$])
m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$])
m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_URL$])
m4trace:configure.ac:1: -1- m4_pattern_allow([^exec_prefix$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^exec_prefix$])
m4trace:configure.ac:1: -1- m4_pattern_allow([^prefix$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^prefix$])
m4trace:configure.ac:1: -1- m4_pattern_allow([^program_transform_name$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^program_transform_name$])
@ -2144,7 +2143,6 @@ m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_TARNAME$])
m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_VERSION$])
m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_STRING$])
m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$])
m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_URL$])
m4trace:configure.ac:1: -1- m4_pattern_allow([^DEFS$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^DEFS$])
m4trace:configure.ac:1: -1- m4_pattern_allow([^ECHO_C$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^ECHO_C$])
m4trace:configure.ac:1: -1- m4_pattern_allow([^ECHO_N$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^ECHO_N$])
@ -2169,7 +2167,7 @@ m4trace:configure.ac:5: -1- AM_INIT_AUTOMAKE([1.10 -Wall no-define foreign])
m4trace:configure.ac:5: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$])
m4trace:configure.ac:5: -1- AM_SET_CURRENT_AUTOMAKE_VERSION m4trace:configure.ac:5: -1- AM_SET_CURRENT_AUTOMAKE_VERSION
m4trace:configure.ac:5: -1- AM_AUTOMAKE_VERSION([1.11.1]) m4trace:configure.ac:5: -1- AM_AUTOMAKE_VERSION([1.11.1])
m4trace:configure.ac:5: -1- _AM_AUTOCONF_VERSION([2.67]) m4trace:configure.ac:5: -1- _AM_AUTOCONF_VERSION([2.63])
m4trace:configure.ac:5: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^INSTALL_PROGRAM$])
m4trace:configure.ac:5: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^INSTALL_SCRIPT$])
m4trace:configure.ac:5: -1- m4_pattern_allow([^INSTALL_DATA$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^INSTALL_DATA$])
@ -2347,7 +2345,6 @@ m4trace:configure.ac:9: -1- m4_pattern_allow([^CPP$])
m4trace:configure.ac:9: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:9: -1- m4_pattern_allow([^CPPFLAGS$])
m4trace:configure.ac:9: -1- m4_pattern_allow([^CPP$]) m4trace:configure.ac:9: -1- m4_pattern_allow([^CPP$])
m4trace:configure.ac:9: -1- m4_pattern_allow([^STDC_HEADERS$]) m4trace:configure.ac:9: -1- m4_pattern_allow([^STDC_HEADERS$])
m4trace:configure.ac:9: -1- m4_pattern_allow([^HAVE_DLFCN_H$])
m4trace:configure.ac:9: -1- LT_LANG([CXX]) m4trace:configure.ac:9: -1- LT_LANG([CXX])
m4trace:configure.ac:9: -1- LT_SUPPORTED_TAG([CXX]) m4trace:configure.ac:9: -1- LT_SUPPORTED_TAG([CXX])
m4trace:configure.ac:9: -1- m4_pattern_allow([^CXX$]) m4trace:configure.ac:9: -1- m4_pattern_allow([^CXX$])

View File

@ -1,4 +1,4 @@
m4trace:configure.ac:1: -1- AC_INIT([libpit], [1.3], [bug-report@glassechidna.com.au], [libpit], [http://www.glassechidna.com.au/]) m4trace:configure.ac:1: -1- AC_INIT([libpit], [1.4], [bug-report@glassechidna.com.au], [libpit], [http://www.glassechidna.com.au/])
m4trace:configure.ac:1: -1- m4_pattern_forbid([^_?A[CHUM]_]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^_?A[CHUM]_])
m4trace:configure.ac:1: -1- m4_pattern_forbid([_AC_]) m4trace:configure.ac:1: -1- m4_pattern_forbid([_AC_])
m4trace:configure.ac:1: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) m4trace:configure.ac:1: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS'])
@ -6,7 +6,7 @@ m4trace:configure.ac:1: -1- m4_pattern_allow([^AS_FLAGS$])
m4trace:configure.ac:1: -1- m4_pattern_forbid([^_?m4_]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^_?m4_])
m4trace:configure.ac:1: -1- m4_pattern_forbid([^dnl$]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^dnl$])
m4trace:configure.ac:1: -1- m4_pattern_forbid([^_?AS_]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^_?AS_])
m4trace:configure.ac:1: -1- AC_SUBST([SHELL]) m4trace:configure.ac:1: -1- AC_SUBST([SHELL], [${CONFIG_SHELL-/bin/sh}])
m4trace:configure.ac:1: -1- AC_SUBST_TRACE([SHELL]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([SHELL])
m4trace:configure.ac:1: -1- m4_pattern_allow([^SHELL$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^SHELL$])
m4trace:configure.ac:1: -1- AC_SUBST([PATH_SEPARATOR]) m4trace:configure.ac:1: -1- AC_SUBST([PATH_SEPARATOR])
@ -27,9 +27,6 @@ m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_STRING$])
m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])]) m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])])
m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT])
m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$])
m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_URL], [m4_ifdef([AC_PACKAGE_URL], ['AC_PACKAGE_URL'])])
m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_URL])
m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_URL$])
m4trace:configure.ac:1: -1- AC_SUBST([exec_prefix], [NONE]) m4trace:configure.ac:1: -1- AC_SUBST([exec_prefix], [NONE])
m4trace:configure.ac:1: -1- AC_SUBST_TRACE([exec_prefix]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([exec_prefix])
m4trace:configure.ac:1: -1- m4_pattern_allow([^exec_prefix$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^exec_prefix$])
@ -101,27 +98,23 @@ m4trace:configure.ac:1: -1- m4_pattern_allow([^mandir$])
m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME])
m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_NAME$])
m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */ m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */
@%:@undef PACKAGE_NAME]) #undef PACKAGE_NAME])
m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME])
m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_TARNAME$])
m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */ m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */
@%:@undef PACKAGE_TARNAME]) #undef PACKAGE_TARNAME])
m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION])
m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_VERSION$])
m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */ m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */
@%:@undef PACKAGE_VERSION]) #undef PACKAGE_VERSION])
m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING])
m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_STRING$])
m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */ m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */
@%:@undef PACKAGE_STRING]) #undef PACKAGE_STRING])
m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT])
m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$])
m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */ m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */
@%:@undef PACKAGE_BUGREPORT]) #undef PACKAGE_BUGREPORT])
m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_URL])
m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_URL$])
m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_URL], [/* Define to the home page for this package. */
@%:@undef PACKAGE_URL])
m4trace:configure.ac:1: -1- AC_SUBST([DEFS]) m4trace:configure.ac:1: -1- AC_SUBST([DEFS])
m4trace:configure.ac:1: -1- AC_SUBST_TRACE([DEFS]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([DEFS])
m4trace:configure.ac:1: -1- m4_pattern_allow([^DEFS$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^DEFS$])
@ -431,7 +424,7 @@ m4trace:configure.ac:9: -1- AC_DEFINE_TRACE_LITERAL([LT_OBJDIR])
m4trace:configure.ac:9: -1- m4_pattern_allow([^LT_OBJDIR$]) m4trace:configure.ac:9: -1- m4_pattern_allow([^LT_OBJDIR$])
m4trace:configure.ac:9: -1- AH_OUTPUT([LT_OBJDIR], [/* Define to the sub-directory in which libtool stores uninstalled libraries. m4trace:configure.ac:9: -1- AH_OUTPUT([LT_OBJDIR], [/* Define to the sub-directory in which libtool stores uninstalled libraries.
*/ */
@%:@undef LT_OBJDIR]) #undef LT_OBJDIR])
m4trace:configure.ac:9: -1- AC_SUBST([lt_ECHO]) m4trace:configure.ac:9: -1- AC_SUBST([lt_ECHO])
m4trace:configure.ac:9: -1- AC_SUBST_TRACE([lt_ECHO]) m4trace:configure.ac:9: -1- AC_SUBST_TRACE([lt_ECHO])
m4trace:configure.ac:9: -1- m4_pattern_allow([^lt_ECHO$]) m4trace:configure.ac:9: -1- m4_pattern_allow([^lt_ECHO$])
@ -452,7 +445,7 @@ m4trace:configure.ac:9: -1- AC_SUBST([OTOOL64])
m4trace:configure.ac:9: -1- AC_SUBST_TRACE([OTOOL64]) m4trace:configure.ac:9: -1- AC_SUBST_TRACE([OTOOL64])
m4trace:configure.ac:9: -1- m4_pattern_allow([^OTOOL64$]) m4trace:configure.ac:9: -1- m4_pattern_allow([^OTOOL64$])
m4trace:configure.ac:9: -1- AH_OUTPUT([HAVE_DLFCN_H], [/* Define to 1 if you have the <dlfcn.h> header file. */ m4trace:configure.ac:9: -1- AH_OUTPUT([HAVE_DLFCN_H], [/* Define to 1 if you have the <dlfcn.h> header file. */
@%:@undef HAVE_DLFCN_H]) #undef HAVE_DLFCN_H])
m4trace:configure.ac:9: -1- AC_SUBST([CPP]) m4trace:configure.ac:9: -1- AC_SUBST([CPP])
m4trace:configure.ac:9: -1- AC_SUBST_TRACE([CPP]) m4trace:configure.ac:9: -1- AC_SUBST_TRACE([CPP])
m4trace:configure.ac:9: -1- m4_pattern_allow([^CPP$]) m4trace:configure.ac:9: -1- m4_pattern_allow([^CPP$])
@ -465,27 +458,25 @@ m4trace:configure.ac:9: -1- m4_pattern_allow([^CPP$])
m4trace:configure.ac:9: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS]) m4trace:configure.ac:9: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS])
m4trace:configure.ac:9: -1- m4_pattern_allow([^STDC_HEADERS$]) m4trace:configure.ac:9: -1- m4_pattern_allow([^STDC_HEADERS$])
m4trace:configure.ac:9: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if you have the ANSI C header files. */ m4trace:configure.ac:9: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if you have the ANSI C header files. */
@%:@undef STDC_HEADERS]) #undef STDC_HEADERS])
m4trace:configure.ac:9: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the <sys/types.h> header file. */ m4trace:configure.ac:9: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the <sys/types.h> header file. */
@%:@undef HAVE_SYS_TYPES_H]) #undef HAVE_SYS_TYPES_H])
m4trace:configure.ac:9: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the <sys/stat.h> header file. */ m4trace:configure.ac:9: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the <sys/stat.h> header file. */
@%:@undef HAVE_SYS_STAT_H]) #undef HAVE_SYS_STAT_H])
m4trace:configure.ac:9: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the <stdlib.h> header file. */ m4trace:configure.ac:9: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the <stdlib.h> header file. */
@%:@undef HAVE_STDLIB_H]) #undef HAVE_STDLIB_H])
m4trace:configure.ac:9: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the <string.h> header file. */ m4trace:configure.ac:9: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the <string.h> header file. */
@%:@undef HAVE_STRING_H]) #undef HAVE_STRING_H])
m4trace:configure.ac:9: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the <memory.h> header file. */ m4trace:configure.ac:9: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the <memory.h> header file. */
@%:@undef HAVE_MEMORY_H]) #undef HAVE_MEMORY_H])
m4trace:configure.ac:9: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the <strings.h> header file. */ m4trace:configure.ac:9: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the <strings.h> header file. */
@%:@undef HAVE_STRINGS_H]) #undef HAVE_STRINGS_H])
m4trace:configure.ac:9: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the <inttypes.h> header file. */ m4trace:configure.ac:9: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the <inttypes.h> header file. */
@%:@undef HAVE_INTTYPES_H]) #undef HAVE_INTTYPES_H])
m4trace:configure.ac:9: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the <stdint.h> header file. */ m4trace:configure.ac:9: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the <stdint.h> header file. */
@%:@undef HAVE_STDINT_H]) #undef HAVE_STDINT_H])
m4trace:configure.ac:9: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the <unistd.h> header file. */ m4trace:configure.ac:9: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the <unistd.h> header file. */
@%:@undef HAVE_UNISTD_H]) #undef HAVE_UNISTD_H])
m4trace:configure.ac:9: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DLFCN_H])
m4trace:configure.ac:9: -1- m4_pattern_allow([^HAVE_DLFCN_H$])
m4trace:configure.ac:9: -1- LT_SUPPORTED_TAG([CXX]) m4trace:configure.ac:9: -1- LT_SUPPORTED_TAG([CXX])
m4trace:configure.ac:9: -1- AC_SUBST([CXX]) m4trace:configure.ac:9: -1- AC_SUBST([CXX])
m4trace:configure.ac:9: -1- AC_SUBST_TRACE([CXX]) m4trace:configure.ac:9: -1- AC_SUBST_TRACE([CXX])
@ -534,7 +525,7 @@ m4trace:configure.ac:9: -1- m4_pattern_allow([^CXXCPP$])
m4trace:configure.ac:9: -1- AC_SUBST([LD]) m4trace:configure.ac:9: -1- AC_SUBST([LD])
m4trace:configure.ac:9: -1- AC_SUBST_TRACE([LD]) m4trace:configure.ac:9: -1- AC_SUBST_TRACE([LD])
m4trace:configure.ac:9: -1- m4_pattern_allow([^LD$]) m4trace:configure.ac:9: -1- m4_pattern_allow([^LD$])
m4trace:configure.ac:11: -1- AC_SUBST([LIBPIT_API_VERSION], [1.3]) m4trace:configure.ac:11: -1- AC_SUBST([LIBPIT_API_VERSION], [1.4])
m4trace:configure.ac:11: -1- AC_SUBST_TRACE([LIBPIT_API_VERSION]) m4trace:configure.ac:11: -1- AC_SUBST_TRACE([LIBPIT_API_VERSION])
m4trace:configure.ac:11: -1- m4_pattern_allow([^LIBPIT_API_VERSION$]) m4trace:configure.ac:11: -1- m4_pattern_allow([^LIBPIT_API_VERSION$])
m4trace:configure.ac:12: -1- AC_CONFIG_FILES([Makefile]) m4trace:configure.ac:12: -1- AC_CONFIG_FILES([Makefile])
@ -554,19 +545,19 @@ m4trace:configure.ac:14: -1- m4_pattern_allow([^MAINT$])
m4trace:configure.ac:19: -1- AC_DEFINE_TRACE_LITERAL([OS_LINUX]) m4trace:configure.ac:19: -1- AC_DEFINE_TRACE_LITERAL([OS_LINUX])
m4trace:configure.ac:19: -1- m4_pattern_allow([^OS_LINUX$]) m4trace:configure.ac:19: -1- m4_pattern_allow([^OS_LINUX$])
m4trace:configure.ac:19: -1- AH_OUTPUT([OS_LINUX], [/* Linux backend */ m4trace:configure.ac:19: -1- AH_OUTPUT([OS_LINUX], [/* Linux backend */
@%:@undef OS_LINUX]) #undef OS_LINUX])
m4trace:configure.ac:23: -1- AC_DEFINE_TRACE_LITERAL([OS_DARWIN]) m4trace:configure.ac:23: -1- AC_DEFINE_TRACE_LITERAL([OS_DARWIN])
m4trace:configure.ac:23: -1- m4_pattern_allow([^OS_DARWIN$]) m4trace:configure.ac:23: -1- m4_pattern_allow([^OS_DARWIN$])
m4trace:configure.ac:23: -1- AH_OUTPUT([OS_DARWIN], [/* Darwin backend */ m4trace:configure.ac:23: -1- AH_OUTPUT([OS_DARWIN], [/* Darwin backend */
@%:@undef OS_DARWIN]) #undef OS_DARWIN])
m4trace:configure.ac:27: -1- AC_DEFINE_TRACE_LITERAL([OS_WINDOWS]) m4trace:configure.ac:27: -1- AC_DEFINE_TRACE_LITERAL([OS_WINDOWS])
m4trace:configure.ac:27: -1- m4_pattern_allow([^OS_WINDOWS$]) m4trace:configure.ac:27: -1- m4_pattern_allow([^OS_WINDOWS$])
m4trace:configure.ac:27: -1- AH_OUTPUT([OS_WINDOWS], [/* Windows backend */ m4trace:configure.ac:27: -1- AH_OUTPUT([OS_WINDOWS], [/* Windows backend */
@%:@undef OS_WINDOWS]) #undef OS_WINDOWS])
m4trace:configure.ac:31: -1- AC_DEFINE_TRACE_LITERAL([OS_WINDOWS]) m4trace:configure.ac:31: -1- AC_DEFINE_TRACE_LITERAL([OS_WINDOWS])
m4trace:configure.ac:31: -1- m4_pattern_allow([^OS_WINDOWS$]) m4trace:configure.ac:31: -1- m4_pattern_allow([^OS_WINDOWS$])
m4trace:configure.ac:31: -1- AH_OUTPUT([OS_WINDOWS], [/* Windows backend */ m4trace:configure.ac:31: -1- AH_OUTPUT([OS_WINDOWS], [/* Windows backend */
@%:@undef OS_WINDOWS]) #undef OS_WINDOWS])
m4trace:configure.ac:38: -1- AH_OUTPUT([WORDS_BIGENDIAN], [/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most m4trace:configure.ac:38: -1- AH_OUTPUT([WORDS_BIGENDIAN], [/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
significant byte first (like Motorola and SPARC, unlike Intel). */ significant byte first (like Motorola and SPARC, unlike Intel). */
#if defined AC_APPLE_UNIVERSAL_BUILD #if defined AC_APPLE_UNIVERSAL_BUILD
@ -583,7 +574,7 @@ m4trace:configure.ac:38: -1- m4_pattern_allow([^WORDS_BIGENDIAN$])
m4trace:configure.ac:38: -1- AC_DEFINE_TRACE_LITERAL([AC_APPLE_UNIVERSAL_BUILD]) m4trace:configure.ac:38: -1- AC_DEFINE_TRACE_LITERAL([AC_APPLE_UNIVERSAL_BUILD])
m4trace:configure.ac:38: -1- m4_pattern_allow([^AC_APPLE_UNIVERSAL_BUILD$]) m4trace:configure.ac:38: -1- m4_pattern_allow([^AC_APPLE_UNIVERSAL_BUILD$])
m4trace:configure.ac:38: -1- AH_OUTPUT([AC_APPLE_UNIVERSAL_BUILD], [/* Define if building universal (internal helper macro) */ m4trace:configure.ac:38: -1- AH_OUTPUT([AC_APPLE_UNIVERSAL_BUILD], [/* Define if building universal (internal helper macro) */
@%:@undef AC_APPLE_UNIVERSAL_BUILD]) #undef AC_APPLE_UNIVERSAL_BUILD])
m4trace:configure.ac:40: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs]) m4trace:configure.ac:40: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs])
m4trace:configure.ac:40: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.ac:40: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
m4trace:configure.ac:40: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:40: -1- m4_pattern_allow([^LIB@&t@OBJS$])

9
libpit/config.guess vendored
View File

@ -1,10 +1,10 @@
#! /bin/sh #! /bin/sh
# Attempt to guess a canonical system name. # Attempt to guess a canonical system name.
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
# Free Software Foundation, Inc. # Free Software Foundation, Inc.
timestamp='2009-12-30' timestamp='2009-11-20'
# This file is free software; you can redistribute it and/or modify it # This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by # under the terms of the GNU General Public License as published by
@ -56,9 +56,8 @@ version="\
GNU config.guess ($timestamp) GNU config.guess ($timestamp)
Originally written by Per Bothner. Originally written by Per Bothner.
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."

View File

@ -58,9 +58,6 @@
/* Define to the one symbol short name of this package. */ /* Define to the one symbol short name of this package. */
#undef PACKAGE_TARNAME #undef PACKAGE_TARNAME
/* Define to the home page for this package. */
#undef PACKAGE_URL
/* Define to the version of this package. */ /* Define to the version of this package. */
#undef PACKAGE_VERSION #undef PACKAGE_VERSION

19
libpit/config.sub vendored
View File

@ -1,10 +1,10 @@
#! /bin/sh #! /bin/sh
# Configuration validation subroutine script. # Configuration validation subroutine script.
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
# Free Software Foundation, Inc. # Free Software Foundation, Inc.
timestamp='2010-01-22' timestamp='2009-11-20'
# This file is (in principle) common to ALL GNU software. # This file is (in principle) common to ALL GNU software.
# The presence of a machine in this file suggests that SOME GNU software # The presence of a machine in this file suggests that SOME GNU software
@ -75,9 +75,8 @@ Report bugs and patches to <config-patches@gnu.org>."
version="\ version="\
GNU config.sub ($timestamp) GNU config.sub ($timestamp)
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@ -381,8 +380,7 @@ case $basic_machine in
| sparclite-* \ | sparclite-* \
| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
| tahoe-* | thumb-* \ | tahoe-* | thumb-* \
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \
| tile-* | tilegx-* \
| tron-* \ | tron-* \
| ubicom32-* \ | ubicom32-* \
| v850-* | v850e-* | vax-* \ | v850-* | v850e-* | vax-* \
@ -1087,11 +1085,6 @@ case $basic_machine in
basic_machine=tic6x-unknown basic_machine=tic6x-unknown
os=-coff os=-coff
;; ;;
# This must be matched before tile*.
tilegx*)
basic_machine=tilegx-unknown
os=-linux-gnu
;;
tile*) tile*)
basic_machine=tile-unknown basic_machine=tile-unknown
os=-linux-gnu os=-linux-gnu
@ -1442,8 +1435,6 @@ case $os in
-dicos*) -dicos*)
os=-dicos os=-dicos
;; ;;
-nacl*)
;;
-none) -none)
;; ;;
*) *)

5477
libpit/configure vendored

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
AC_INIT([libpit], [1.3], [bug-report@glassechidna.com.au], [libpit], [http://www.glassechidna.com.au/]) AC_INIT([libpit], [1.4], [bug-report@glassechidna.com.au], [libpit], [http://www.glassechidna.com.au/])
AC_PREREQ([2.59]) AC_PREREQ([2.59])
AC_CANONICAL_TARGET AC_CANONICAL_TARGET
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([m4])
@ -8,7 +8,7 @@ AC_PROG_CXX
LT_INIT() LT_INIT()
AC_SUBST([LIBPIT_API_VERSION], [1.3]) AC_SUBST([LIBPIT_API_VERSION], [1.4])
AC_CONFIG_FILES([Makefile]) AC_CONFIG_FILES([Makefile])
AM_MAINTAINER_MODE AM_MAINTAINER_MODE

View File

@ -65,7 +65,7 @@
# compiler: $LTCC # compiler: $LTCC
# compiler flags: $LTCFLAGS # compiler flags: $LTCFLAGS
# linker: $LD (gnu? $with_gnu_ld) # linker: $LD (gnu? $with_gnu_ld)
# $progname: (GNU libtool) 2.2.6b Debian-2.2.6b-2ubuntu1 # $progname: (GNU libtool) 2.2.6b
# automake: $automake_version # automake: $automake_version
# autoconf: $autoconf_version # autoconf: $autoconf_version
# #
@ -73,7 +73,7 @@
PROGRAM=ltmain.sh PROGRAM=ltmain.sh
PACKAGE=libtool PACKAGE=libtool
VERSION="2.2.6b Debian-2.2.6b-2ubuntu1" VERSION=2.2.6b
TIMESTAMP="" TIMESTAMP=""
package_revision=1.3017 package_revision=1.3017
@ -5033,10 +5033,7 @@ func_mode_link ()
case $pass in case $pass in
dlopen) libs="$dlfiles" ;; dlopen) libs="$dlfiles" ;;
dlpreopen) libs="$dlprefiles" ;; dlpreopen) libs="$dlprefiles" ;;
link) link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
libs="$deplibs %DEPLIBS%"
test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
;;
esac esac
fi fi
if test "$linkmode,$pass" = "lib,dlpreopen"; then if test "$linkmode,$pass" = "lib,dlpreopen"; then
@ -5347,19 +5344,19 @@ func_mode_link ()
# It is a libtool convenience library, so add in its objects. # It is a libtool convenience library, so add in its objects.
convenience="$convenience $ladir/$objdir/$old_library" convenience="$convenience $ladir/$objdir/$old_library"
old_convenience="$old_convenience $ladir/$objdir/$old_library" old_convenience="$old_convenience $ladir/$objdir/$old_library"
tmp_libs=
for deplib in $dependency_libs; do
deplibs="$deplib $deplibs"
if $opt_duplicate_deps ; then
case "$tmp_libs " in
*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
esac
fi
tmp_libs="$tmp_libs $deplib"
done
elif test "$linkmode" != prog && test "$linkmode" != lib; then elif test "$linkmode" != prog && test "$linkmode" != lib; then
func_fatal_error "\`$lib' is not a convenience library" func_fatal_error "\`$lib' is not a convenience library"
fi fi
tmp_libs=
for deplib in $dependency_libs; do
deplibs="$deplib $deplibs"
if $opt_duplicate_deps ; then
case "$tmp_libs " in
*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
esac
fi
tmp_libs="$tmp_libs $deplib"
done
continue continue
fi # $pass = conv fi # $pass = conv
@ -5896,7 +5893,6 @@ func_mode_link ()
if test "$link_all_deplibs" != no; then if test "$link_all_deplibs" != no; then
# Add the search paths of all dependency libraries # Add the search paths of all dependency libraries
for deplib in $dependency_libs; do for deplib in $dependency_libs; do
path=
case $deplib in case $deplib in
-L*) path="$deplib" ;; -L*) path="$deplib" ;;
*.la) *.la)
@ -6210,9 +6206,6 @@ func_mode_link ()
revision="$number_minor" revision="$number_minor"
lt_irix_increment=no lt_irix_increment=no
;; ;;
*)
func_fatal_configuration "$modename: unknown library version type \`$version_type'"
;;
esac esac
;; ;;
no) no)

45
libpit/m4/libtool.m4 vendored
View File

@ -2445,7 +2445,7 @@ linux*oldld* | linux*aout* | linux*coff*)
;; ;;
# This must be Linux ELF. # This must be Linux ELF.
linux* | k*bsd*-gnu | kopensolaris*-gnu) linux* | k*bsd*-gnu)
version_type=linux version_type=linux
need_lib_prefix=no need_lib_prefix=no
need_version=no need_version=no
@ -2470,10 +2470,13 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu)
# before this can be enabled. # before this can be enabled.
hardcode_into_libs=yes hardcode_into_libs=yes
# Add ABI-specific directories to the system library path.
sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
# Append ld.so.conf contents to the search path # Append ld.so.conf contents to the search path
if test -f /etc/ld.so.conf; then if test -f /etc/ld.so.conf; then
lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
fi fi
# We used to test for /lib/ld.so.1 and disable shared libraries on # We used to test for /lib/ld.so.1 and disable shared libraries on
@ -2485,18 +2488,6 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu)
dynamic_linker='GNU/Linux ld.so' dynamic_linker='GNU/Linux ld.so'
;; ;;
netbsdelf*-gnu)
version_type=linux
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
hardcode_into_libs=yes
dynamic_linker='NetBSD ld.elf_so'
;;
netbsd*) netbsd*)
version_type=sunos version_type=sunos
need_lib_prefix=no need_lib_prefix=no
@ -3084,11 +3075,11 @@ irix5* | irix6* | nonstopux*)
;; ;;
# This must be Linux ELF. # This must be Linux ELF.
linux* | k*bsd*-gnu | kopensolaris*-gnu) linux* | k*bsd*-gnu)
lt_cv_deplibs_check_method=pass_all lt_cv_deplibs_check_method=pass_all
;; ;;
netbsd* | netbsdelf*-gnu) netbsd*)
if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
else else
@ -3705,7 +3696,7 @@ m4_if([$1], [CXX], [
;; ;;
esac esac
;; ;;
linux* | k*bsd*-gnu | kopensolaris*-gnu) linux* | k*bsd*-gnu)
case $cc_basename in case $cc_basename in
KCC*) KCC*)
# KAI C++ Compiler # KAI C++ Compiler
@ -3769,7 +3760,7 @@ m4_if([$1], [CXX], [
;; ;;
esac esac
;; ;;
netbsd* | netbsdelf*-gnu) netbsd*)
;; ;;
*qnx* | *nto*) *qnx* | *nto*)
# QNX uses GNU C++, but need to define -shared option too, otherwise # QNX uses GNU C++, but need to define -shared option too, otherwise
@ -3989,7 +3980,7 @@ m4_if([$1], [CXX], [
_LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
;; ;;
linux* | k*bsd*-gnu | kopensolaris*-gnu) linux* | k*bsd*-gnu)
case $cc_basename in case $cc_basename in
# old Intel for x86_64 which still supported -KPIC. # old Intel for x86_64 which still supported -KPIC.
ecc*) ecc*)
@ -4194,9 +4185,6 @@ m4_if([$1], [CXX], [
cygwin* | mingw* | cegcc*) cygwin* | mingw* | cegcc*)
_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
;; ;;
linux* | k*bsd*-gnu)
_LT_TAGVAR(link_all_deplibs, $1)=no
;;
*) *)
_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
;; ;;
@ -4261,9 +4249,6 @@ dnl Note also adjust exclude_expsyms for C++ above.
openbsd*) openbsd*)
with_gnu_ld=no with_gnu_ld=no
;; ;;
linux* | k*bsd*-gnu)
_LT_TAGVAR(link_all_deplibs, $1)=no
;;
esac esac
_LT_TAGVAR(ld_shlibs, $1)=yes _LT_TAGVAR(ld_shlibs, $1)=yes
@ -4285,7 +4270,6 @@ dnl Note also adjust exclude_expsyms for C++ above.
fi fi
supports_anon_versioning=no supports_anon_versioning=no
case `$LD -v 2>&1` in case `$LD -v 2>&1` in
*GNU\ gold*) supports_anon_versioning=yes ;;
*\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
*\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
*\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
@ -4377,7 +4361,7 @@ _LT_EOF
_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
;; ;;
gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) gnu* | linux* | tpf* | k*bsd*-gnu)
tmp_diet=no tmp_diet=no
if test "$host_os" = linux-dietlibc; then if test "$host_os" = linux-dietlibc; then
case $cc_basename in case $cc_basename in
@ -4447,7 +4431,7 @@ _LT_EOF
fi fi
;; ;;
netbsd* | netbsdelf*-gnu) netbsd*)
if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
wlarc= wlarc=
@ -4622,7 +4606,6 @@ _LT_EOF
if test "$aix_use_runtimelinking" = yes; then if test "$aix_use_runtimelinking" = yes; then
shared_flag="$shared_flag "'${wl}-G' shared_flag="$shared_flag "'${wl}-G'
fi fi
_LT_TAGVAR(link_all_deplibs, $1)=no
else else
# not using gcc # not using gcc
if test "$host_cpu" = ia64; then if test "$host_cpu" = ia64; then
@ -4861,7 +4844,7 @@ _LT_EOF
_LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes
;; ;;
netbsd* | netbsdelf*-gnu) netbsd*)
if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
else else
@ -5861,7 +5844,7 @@ if test "$_lt_caught_CXX_error" != yes; then
_LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(inherit_rpath, $1)=yes
;; ;;
linux* | k*bsd*-gnu | kopensolaris*-gnu) linux* | k*bsd*-gnu)
case $cc_basename in case $cc_basename in
KCC*) KCC*)
# Kuck and Associates, Inc. (KAI) C++ Compiler # Kuck and Associates, Inc. (KAI) C++ Compiler