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
parent
66f1e84dd2
commit
6cd6b35c73
|
@ -1,2 +1,10 @@
|
||||||
.DS_Store
|
.DS_Store
|
||||||
._*
|
._*
|
||||||
|
Debug/
|
||||||
|
Release/
|
||||||
|
GeneratedFiles/
|
||||||
|
*.vcxproj.user
|
||||||
|
*.suo
|
||||||
|
*.sdf
|
||||||
|
heimdall-frontend/Qt4VSPropertySheet.props
|
||||||
|
*.opensdf
|
||||||
|
|
88
Linux/README
88
Linux/README
|
@ -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
2
README
|
@ -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:
|
||||||
|
|
|
@ -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>
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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; }
|
||||||
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:400; font-style:normal;">
|
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:400; font-style:normal;">
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Heimdall Frontend</span></p>
|
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Heimdall Frontend</span></p>
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version 1.3.2</p>
|
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version 1.4 RC1</p>
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright © 2010-2012 Benjamin Dobell, Glass Echidna</p>
|
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright © 2010-2012 Benjamin Dobell, Glass Echidna</p>
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
|
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Heimdall (command line)</span></p>
|
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Heimdall (command line)</span></p>
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright © 2010-2012 Benjamin Dobell, Glass Echidna</p>
|
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">%HEIMDALL-VERSION%Copyright © 2010-2012 Benjamin Dobell, Glass Echidna</p>
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html></string>
|
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
<property name="textFormat">
|
<property name="textFormat">
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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" />
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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 <--> PC screen displayed on a device.</string>
|
<string notr="true">Close the "device <--> PC" screen displayed on a device.</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="frameShape">
|
<property name="frameShape">
|
||||||
<enum>QFrame::Panel</enum>
|
<enum>QFrame::Panel</enum>
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -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$])
|
||||||
|
|
|
@ -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."
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
|
|
@ -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)
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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">
|
||||||
|
|
|
@ -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>
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
|
@ -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
|
|
@ -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
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
|
@ -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:
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
|
@ -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
|
|
@ -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
|
|
@ -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);
|
||||||
|
}
|
|
@ -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
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
|
@ -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
|
|
@ -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);
|
||||||
|
}
|
|
@ -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
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
|
@ -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
|
|
@ -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);
|
||||||
|
}
|
|
@ -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
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,7 @@ namespace Heimdall
|
||||||
delete [] data;
|
delete [] data;
|
||||||
}
|
}
|
||||||
|
|
||||||
int GetSize(void) const
|
unsigned int GetSize(void) const
|
||||||
{
|
{
|
||||||
return (size);
|
return (size);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
|
@ -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:
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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);
|
||||||
|
}
|
|
@ -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
|
|
@ -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);
|
||||||
|
}
|
|
@ -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
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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@
|
||||||
|
|
|
@ -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]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -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$])
|
||||||
|
|
|
@ -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$])
|
||||||
|
|
|
@ -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."
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue