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

Reply via email to