diff options
Diffstat (limited to 'Mac/OSX/Dist/makedmg')
-rwxr-xr-x | Mac/OSX/Dist/makedmg | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/Mac/OSX/Dist/makedmg b/Mac/OSX/Dist/makedmg new file mode 100755 index 0000000..c89be80 --- /dev/null +++ b/Mac/OSX/Dist/makedmg @@ -0,0 +1,95 @@ +#!/usr/bin/perl -w +# +# make disk image from folder +# +# usage: makedmg src dst name +# +# (C)opyright 2002 Frank Vercruesse + + +$hdiUtilExec = "/usr/bin/hdiutil"; +$hdiDrvExec = "/usr/bin/hdid"; +$newfsExec = "/sbin/newfs_hfs"; +$duExec = "/usr/bin/du"; +$dittoExec = "/usr/bin/ditto"; + +if ( $#ARGV != 2 ) { + die "Wrong number of arguments.\nUsage: makedmg src dst name\n"; +} + +&make_dmg( $ARGV[0], $ARGV[1], $ARGV[2]); + + +sub make_dmg +{ + my $src = $_[0]; + my $dst = $_[1]; + my $name = $_[2]; + + # check dirs + if( not -d $dst && -d $src ) { + die "src and dst must be directories\n"; + } + + # calc disk image size + if( not open( MYPIPE, "$duExec -sk \"${src}\" |") ) { + die "couldn't open pipe\n"; + } + (my $dmgsize) = split( /\s+/, <MYPIPE>); + close( MYPIPE); + $dmgsize /= 1024; + $dmgsize = int($dmgsize + 4); + if( $dmgsize < 5 ) { + $dmgsize = 5 + } + + # create disk image + system "cd \"$dst\"; $hdiUtilExec create -megabytes $dmgsize -ov \"_${name}\""; + if( $? ) { die "couldn't create disk image\n"; } + + # format disk image + if( not open( MYPIPE, "cd \"$dst\"; $hdiDrvExec -nomount \"_${name}.dmg\" |") ) { + die "couldn't open pipe\n"; + } + (my $dev) = split( /\t/, <MYPIPE>); + $dev =~ s/^(.*\S)\s*$/$1/; + my( $part, $raw, $pname); + while( <MYPIPE> ) { + ($part,$pname) = split /\t/; + if( $pname =~ m/^Apple_HFS/ ) { + $part =~ s/^\s*(.*\S)\s*$/$1/; + $raw = $part; + $raw =~ s/^(\/dev\/)(.+)/$1r$2/; + last; + } + } + close( MYPIPE); + system "cd \"$dst\" ; $newfsExec -v \"$name\" $raw"; + if( $? ) { system "$hdiUtilExec eject $dev"; die "couldn't format disk image\n"; } + system "$hdiUtilExec eject $dev"; + if( $? ) { die "couldn't eject disk image\n"; } + + # copy files + if( not open( MYPIPE, "cd \"$dst\"; $hdiDrvExec \"_${name}.dmg\" |") ) { + die "couldn't open pipe\n"; + } + ($dev) = split( /\t/, <MYPIPE>); + $dev =~ s/^(.*\S)\s*$/$1/; + my $vname; + while( <MYPIPE> ) { + ($part,$pname,$vname) = split /\t/; + if( $pname =~ m/^Apple_HFS/ ) { + $vname =~ s/^(.*\S)\s*$/$1/; + last; + } + } + close( MYPIPE); + system "$dittoExec \"${src}\" \"${vname}\""; + if( $? ) { system "$hdiUtilExec eject $dev"; die "couldn't copy files\n"; } + system "$hdiUtilExec eject $dev"; + if( $? ) { die "couldn't eject disk image\n"; } + + # convert disk image + system "cd \"$dst\"; $hdiUtilExec convert \"_${name}.dmg\" -format UDCO -o \"${name}\""; + if( $? ) { die "couldn't convert disk image\n"; } +} |