Author: abock
Date: 2006-06-10 16:26:38 -0400 (Sat, 10 Jun 2006)
New Revision: 61617
Added:
trunk/ipod-sharp/src/Firmware/DmgFirmwareExtract.cs
trunk/ipod-sharp/tools/ExtractFirmware.cs
Modified:
trunk/ipod-sharp/ChangeLog
trunk/ipod-sharp/ipod-sharp.mdp
trunk/ipod-sharp/src/Firmware/CpioArchive.cs
trunk/ipod-sharp/src/Firmware/DmgImage.cs
trunk/ipod-sharp/src/Firmware/Makefile.am
trunk/ipod-sharp/tests/Makefile.am
trunk/ipod-sharp/tools/Makefile.am
Log:
2006-06-10 Aaron Bockover <[EMAIL PROTECTED]>
* ipod-sharp.mdp: Updated MonoDevelop project
* src/Firmware/DmgImage.cs:
* src/Firmware/CpioArchive.cs: Added path-based API wrappers
* src/Firmware/DmgFirmwareExtract.cs: Extracts all firmware images
based on the iPodUpdater DMG image (currently uses mount -t hfsplus)
* src/Firmware/Makefile.am: Added DmgFirmwareExtract.cs
* tools/Makefile.am: Added build rules for ipod-firmware-extract
* tools/ExtractFirmware.cs: New command line tool to extract ipod images
Modified: trunk/ipod-sharp/ChangeLog
===================================================================
--- trunk/ipod-sharp/ChangeLog 2006-06-10 15:21:43 UTC (rev 61616)
+++ trunk/ipod-sharp/ChangeLog 2006-06-10 20:26:38 UTC (rev 61617)
@@ -1,5 +1,21 @@
2006-06-10 Aaron Bockover <[EMAIL PROTECTED]>
+ * ipod-sharp.mdp: Updated MonoDevelop project
+
+ * src/Firmware/DmgImage.cs:
+ * src/Firmware/CpioArchive.cs: Added path-based API wrappers
+
+ * src/Firmware/DmgFirmwareExtract.cs: Extracts all firmware images
+ based on the iPodUpdater DMG image (currently uses mount -t hfsplus)
+
+ * src/Firmware/Makefile.am: Added DmgFirmwareExtract.cs
+
+ * tools/Makefile.am: Added build rules for ipod-firmware-extract
+
+ * tools/ExtractFirmware.cs: New command line tool to extract ipod images
+
+2006-06-10 Aaron Bockover <[EMAIL PROTECTED]>
+
* src/Dmg*.cs: Moved to src/Firmware
* src/Firmware/Makefile.am: Added new ipod-sharp-firmware.dll assembly
Modified: trunk/ipod-sharp/ipod-sharp.mdp
===================================================================
--- trunk/ipod-sharp/ipod-sharp.mdp 2006-06-10 15:21:43 UTC (rev 61616)
+++ trunk/ipod-sharp/ipod-sharp.mdp 2006-06-10 20:26:38 UTC (rev 61617)
@@ -41,6 +41,8 @@
<File name="./src/Firmware/CpioArchive.cs" subtype="Code"
buildaction="Compile" />
<File name="./src/Firmware/DmgPartition.cs" subtype="Code"
buildaction="Compile" />
<File name="./src/Firmware/DmgImage.cs" subtype="Code"
buildaction="Compile" />
+ <File name="./src/Firmware/DmgFirmwareExtract.cs" subtype="Code"
buildaction="Compile" />
+ <File name="./tools/ExtractFirmware.cs" subtype="Code"
buildaction="Compile" />
</Contents>
<References>
<ProjectReference type="Gac" localcopy="True" refto="glib-sharp,
Version=2.8.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
Modified: trunk/ipod-sharp/src/Firmware/CpioArchive.cs
===================================================================
--- trunk/ipod-sharp/src/Firmware/CpioArchive.cs 2006-06-10 15:21:43 UTC
(rev 61616)
+++ trunk/ipod-sharp/src/Firmware/CpioArchive.cs 2006-06-10 20:26:38 UTC
(rev 61617)
@@ -34,21 +34,6 @@
namespace IPod.Firmware
{
- public static class CpioTest
- {
- /*public static void Main(string [] args)
- {
- // extract all iPod firmware from iPodUpdater Archive.pax
- CpioArchive archive = new CpioArchive(args[0]);
- foreach(CpioFileEntry entry in archive) {
- string filename = Path.GetFileName(entry.FileName);
- if(filename.StartsWith("Firmware-")) {
- archive.ExtractEntry(entry, filename);
- }
- }
- }*/
- }
-
public struct CpioFileEntry
{
internal short dev;
Added: trunk/ipod-sharp/src/Firmware/DmgFirmwareExtract.cs
===================================================================
--- trunk/ipod-sharp/src/Firmware/DmgFirmwareExtract.cs 2006-06-10 15:21:43 UTC
(rev 61616)
+++ trunk/ipod-sharp/src/Firmware/DmgFirmwareExtract.cs 2006-06-10 20:26:38 UTC
(rev 61617)
@@ -0,0 +1,159 @@
+//
+// DmgFirmwareExtract.cs: Extracts iPod firmware from
+// iPodUpdater DMG image
+//
+// Authors:
+// Aaron Bockover ([EMAIL PROTECTED])
+//
+// (C) 2006 Aaron Bockover
+//
+
+using System;
+using System.IO;
+using System.Collections;
+using System.Diagnostics;
+
+using Dmg;
+using ICSharpCode.SharpZipLib.GZip;
+
+namespace IPod.Firmware
+{
+ public class DmgFirmwareExtract : IDisposable, IEnumerable
+ {
+ private string work_base;
+ private string dmg_mount;
+ private string iso_path;
+ private string firmware_export_path;
+ private bool should_unmount = false;
+ private ArrayList images = new ArrayList();
+
+ public DmgFirmwareExtract(string dmgFile, string extractPath)
+ {
+ firmware_export_path = extractPath;
+
+ CreateWorkArea();
+
+ try {
+ ExtractDmgImage(dmgFile);
+ MountIsoImage();
+ ExtractFirmwareArchive();
+ } finally {
+ UnmountIsoImage();
+ File.Delete(iso_path);
+ Directory.Delete(dmg_mount);
+ }
+ }
+
+ private void CreateWorkArea()
+ {
+ work_base = Path.DirectorySeparatorChar + Path.Combine("tmp",
"ipod-update");
+ dmg_mount = Path.Combine(work_base, "dmg-mount");
+ iso_path = Path.Combine(work_base, "updater.iso");
+
+ Directory.CreateDirectory(work_base);
+ Directory.CreateDirectory(dmg_mount);
+ }
+
+ public void Dispose()
+ {
+ if(Directory.Exists(work_base)) {
+ Directory.Delete(work_base, true);
+ }
+ }
+
+ public IEnumerator GetEnumerator()
+ {
+ return images.GetEnumerator();
+ }
+
+ private void ExtractDmgImage(string dmgFile)
+ {
+ Image image = new Image(dmgFile);
+ image.Extract(iso_path);
+ }
+
+ private void MountIsoImage()
+ {
+ ExecProcess("mount", String.Format("-t hfsplus -o loop,ro {0} {1}",
+ iso_path, dmg_mount));
+ should_unmount = true;
+ }
+
+ private void UnmountIsoImage()
+ {
+ if(should_unmount) {
+ ExecProcess("umount", dmg_mount);
+ should_unmount = false;
+ }
+ }
+
+ private void ExtractFirmwareArchive()
+ {
+ string ipod_package = null;
+ string packages = Path.Combine(dmg_mount,
+ String.Format("iPod.mpkg{0}Contents{0}Resources",
Path.DirectorySeparatorChar));
+
+ foreach(DirectoryInfo directory in new
DirectoryInfo(packages).GetDirectories("iPod*.pkg")) {
+ ipod_package = directory.FullName;
+ break;
+ }
+
+ string cpio_out = Path.Combine(work_base, "firmware.cpio");
+ string gzcpio_in = Path.Combine(ipod_package,
+ "Contents" + Path.DirectorySeparatorChar + "Archive.pax.gz");
+
+ // this sucks, it seems necessary to create an extracted CPIO
archive
+ // because GZipInputStream can't do seeking... CPIO needs seeking
+
+ FileStream in_stream = new FileStream(gzcpio_in, FileMode.Open,
FileAccess.Read);
+ FileStream out_stream = new FileStream(cpio_out, FileMode.Create);
+ GZipInputStream gzstream = new GZipInputStream(in_stream);
+
+ byte [] block = new byte[4096];
+ int size = block.Length;
+
+ while(true) {
+ size = gzstream.Read(block, 0, size);
+ if(size > 0) {
+ out_stream.Write(block, 0, size);
+ } else {
+ break;
+ }
+ }
+
+ in_stream.Close();
+ out_stream.Close();
+
+ CpioArchive archive = new CpioArchive(cpio_out);
+ foreach(CpioFileEntry entry in archive) {
+ string filename = Path.GetFileName(entry.FileName);
+ if(filename.StartsWith("Firmware-")) {
+ string image_path = Path.Combine(firmware_export_path,
filename);
+ archive.ExtractEntry(entry, image_path);
+ images.Add(image_path);
+ }
+ }
+
+ File.Delete(cpio_out);
+ }
+
+ private static void ExecProcess(string proc, string args)
+ {
+ Process process = new Process();
+ process.StartInfo = new ProcessStartInfo();
+ process.StartInfo.FileName = proc;
+ process.StartInfo.Arguments = args;
+ process.StartInfo.UseShellExecute = false;
+ process.StartInfo.RedirectStandardError = true;
+ process.StartInfo.RedirectStandardOutput = true;
+
+ process.Start();
+ process.WaitForExit();
+
+ if(process.ExitCode != 0) {
+ string message = process.StandardError.ReadToEnd().Trim();
+ throw new ApplicationException(message);
+ }
+ }
+ }
+}
Modified: trunk/ipod-sharp/src/Firmware/DmgImage.cs
===================================================================
--- trunk/ipod-sharp/src/Firmware/DmgImage.cs 2006-06-10 15:21:43 UTC (rev
61616)
+++ trunk/ipod-sharp/src/Firmware/DmgImage.cs 2006-06-10 20:26:38 UTC (rev
61617)
@@ -28,6 +28,10 @@
private ArrayList partitions = new ArrayList();
+ public Image(string fileName) : this(new FileStream(fileName,
FileMode.Open))
+ {
+ }
+
public Image(Stream dmgStream)
{
dmg_stream = dmgStream;
@@ -40,6 +44,11 @@
{
plist_doc.Save(stream);
}
+
+ public void Extract(string fileName)
+ {
+ Extract(new FileStream(fileName, FileMode.Create));
+ }
public void Extract(Stream isoStream)
{
Modified: trunk/ipod-sharp/src/Firmware/Makefile.am
===================================================================
--- trunk/ipod-sharp/src/Firmware/Makefile.am 2006-06-10 15:21:43 UTC (rev
61616)
+++ trunk/ipod-sharp/src/Firmware/Makefile.am 2006-06-10 20:26:38 UTC (rev
61617)
@@ -7,7 +7,8 @@
ASSEMBLY_SOURCES = \
$(srcdir)/DmgImage.cs \
$(srcdir)/DmgPartition.cs \
- $(srcdir)/CpioArchive.cs
+ $(srcdir)/CpioArchive.cs \
+ $(srcdir)/DmgFirmwareExtract.cs
all: $(ASSEMBLY)
Modified: trunk/ipod-sharp/tests/Makefile.am
===================================================================
--- trunk/ipod-sharp/tests/Makefile.am 2006-06-10 15:21:43 UTC (rev 61616)
+++ trunk/ipod-sharp/tests/Makefile.am 2006-06-10 20:26:38 UTC (rev 61617)
@@ -22,7 +22,7 @@
check: $(TEST_ASSEMBLY) ipod-sharp.dll
for asm in $(TEST_TARBALLS); do NUNIT_DIR=$(srcdir)
$(srcdir)/runtests.sh $$asm; done;
-CLEANFILES = $(TEST_ASSEMBLY)
+CLEANFILES = $(TEST_ASSEMBLY) *.mdb
MAINTAINERCLEANFILES = Makefile.in
EXTRA_DIST = \
Added: trunk/ipod-sharp/tools/ExtractFirmware.cs
===================================================================
--- trunk/ipod-sharp/tools/ExtractFirmware.cs 2006-06-10 15:21:43 UTC (rev
61616)
+++ trunk/ipod-sharp/tools/ExtractFirmware.cs 2006-06-10 20:26:38 UTC (rev
61617)
@@ -0,0 +1,23 @@
+//
+// ExtractFirmware.cs: Extracts iPod firmware from
+// iPodUpdater DMG image
+//
+// Authors:
+// Aaron Bockover ([EMAIL PROTECTED])
+//
+// (C) 2006 Aaron Bockover
+//
+
+using System;
+using IPod.Firmware;
+
+public class FirmwareExtractTest
+{
+ public static void Main(string [] args)
+ {
+ DmgFirmwareExtract extract = new DmgFirmwareExtract(args[0], args[1]);
+ foreach(string image in extract) {
+ Console.WriteLine(image);
+ }
+ }
+}
Modified: trunk/ipod-sharp/tools/Makefile.am
===================================================================
--- trunk/ipod-sharp/tools/Makefile.am 2006-06-10 15:21:43 UTC (rev 61616)
+++ trunk/ipod-sharp/tools/Makefile.am 2006-06-10 20:26:38 UTC (rev 61617)
@@ -1,12 +1,17 @@
MCS_FLAGS = -debug
-TOOLS = ipod-tool.exe dmg-iso-extract.exe
+TOOLS = ipod-tool.exe dmg-iso-extract.exe ipod-firmware-extract.exe
IPOD_TOOL_SOURCES = $(srcdir)/PodTool.cs
DMG_ISO_EXTRACT_SRC = \
$(srcdir)/DmgIsoExtract.cs \
- $(top_builddir)/src/Firmware/Dmg*.cs
+ $(top_builddir)/src/Firmware/DmgImage.cs \
+ $(top_builddir)/src/Firmware/DmgPartition.cs
+DMG_FIRMWARE_EXTRACT_SRC = \
+ $(srcdir)/ExtractFirmware.cs \
+ $(top_builddir)/src/Firmware/*.cs
+
all: $(TOOLS)
ipod-tool.exe: $(IPOD_TOOL_SOURCES)
@@ -15,7 +20,10 @@
dmg-iso-extract.exe: $(DMG_ISO_EXTRACT_SRC)
$(MCS) $(MCS_FLAGS) -r:ICSharpCode.SharpZipLib -target:exe -out:$@
$(DMG_ISO_EXTRACT_SRC)
-EXTRA_DIST = $(IPOD_TOOL_SOURCES) $(DMG_ISO_EXTRACT_SRC)
-CLEANFILES = $(TOOLS)
+ipod-firmware-extract.exe: $(DMG_FIRMWARE_EXTRACT_SRC)
+ $(MCS) $(MCS_FLAGS) -r:ICSharpCode.SharpZipLib -target:exe -out:$@
$(DMG_FIRMWARE_EXTRACT_SRC)
+
+EXTRA_DIST = $(IPOD_TOOL_SOURCES) $(DMG_ISO_EXTRACT_SRC)
$(DMG_FIRMWARE_EXTRACT_SRC)
+CLEANFILES = $(TOOLS) *.mdb
MAINTAINERCLEANFILES = Makefile.in
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches