fix for postinst syntax error
[debian/sudo] / pp
diff --git a/pp b/pp
index a997c0f4b7b5afecaac1ee111f802e12b43e3e14..a7267c9193623cf4d572de8b619de7080957a114 100755 (executable)
--- a/pp
+++ b/pp
@@ -1,6 +1,6 @@
 #!/bin/sh
-# (c) 2010 Quest Software, Inc. All rights reserved
-pp_revision="283"
+# (c) 2011 Quest Software, Inc. All rights reserved
+pp_revision="305"
  # Copyright 2010 Quest Software, Inc.  All rights reserved.
  #
  # Redistribution and use in source and binary forms, with or without
@@ -438,7 +438,7 @@ pp_unique () {
 
 pp_mode_strip_altaccess () {
     case "$1" in
-       ??????????+)
+       ??????????[+.])
            echo `echo "$1" | cut -b -10`;;
        *)
            echo "$1";;
@@ -1554,6 +1554,8 @@ pp_backend_aix_init () {
         pp_aix_start_services_after_install=false
         pp_aix_init_services_after_install=true
 
+        pp_aix_sudo=sudo       # AIX package tools must run as root
+
         case "$pp_aix_os" in
             *) pp_readlink_fn=pp_ls_readlink;;  # XXX
         esac
@@ -1688,8 +1690,6 @@ pp_aix_inventory () {
       esac
       echo " type = $type"
       echo " class = inventory,apply,$fileset"
-      set -- `/bin/ls -ld "$pp_destdir$p" 2>/dev/null`
-      owner=$3 group=$4 size=$5
       if test x"$m" = x"-"; then m="$defm"; fi
       if test x"$o" = x"-"; then o="root"; fi
       if test x"$g" = x"-"; then g="system"; fi
@@ -2043,7 +2043,7 @@ pp_backend_aix () {
        (cd $pp_destdir && pp_verbose  /usr/sbin/backup -i -q -p -f -) \
           < $pp_wrkdir/bff.list \
          > $pp_wrkdir/$outbff || pp_error "backup failed"
-        ${SUDO:-sudo} /usr/sbin/installp -l -d $pp_wrkdir/$outbff
+        $pp_aix_sudo /usr/sbin/installp -l -d $pp_wrkdir/$outbff
 }
 
 pp_backend_aix_cleanup () {
@@ -2224,6 +2224,7 @@ pp_backend_sd_init () {
     pp_sd_default_start=1           # config_file default start value
 
     pp_readlink_fn=pp_ls_readlink   # HPUX has no readlink
+    pp_shlib_suffix='.sl'           # .so on most other platforms
 
     pp_sd_detect_os
 }
@@ -2249,11 +2250,21 @@ pp_sd_write_files () {
     while read t m o g f p st; do
         line="                file"
         case "$f" in *v*) line="$line -v";; esac    # FIXME for uninstall
-        case $t in
-            f) dm=644;;
-            d) line="$line -t d"; p=${p%/}; dm=755;;
-            s) line="$line -t s";;
-        esac
+       case ${pp_sd_os} in
+           10.*)
+               case $t in
+                   f) dm=644;;
+                   d) p=${p%/}; dm=755;;
+               esac
+               ;;
+           *)
+               case $t in
+                   f) dm=644;;
+                   d) line="$line -t d"; p=${p%/}; dm=755;;
+                   s) line="$line -t s";;
+               esac
+               ;;
+       esac
 
         test x"$o" = x"-" && o=root
         test x"$g" = x"-" && g=sys
@@ -2439,11 +2450,16 @@ pp_sd_service_script () {
 
 pp_sd_make_service () {
         typeset level startpriority stoppriority startlevels stoplevels
-        typeset svc svcvar
+        typeset svc svcvar symtype
 
         svc="$1"
        svcvar=`pp_makevar $svc`
 
+       case ${pp_sd_os} in
+           10.*) symtype="file";;
+           *) symtype="file -t s";;
+       esac
+
         # TODO: Figure out why this check is here
         #-- don't do anything if the script exists
         #if test -s "$pp_destdir/sbin/init.d/$svc"; then
@@ -2487,12 +2503,12 @@ pp_sd_make_service () {
 
         # create the symlinks
         test -z "$startlevels" || for level in $startlevels; do
-            echo "                file -t s" \
+            echo "                ${symtype}" \
                     "/sbin/init.d/$svc" \
                     "/sbin/rc$level.d/S$startpriority$svc"
         done
         test -z "$stoplevels" || for level in $stoplevels; do
-            echo "                file -t s" \
+            echo "                ${symtype}" \
                     "/sbin/init.d/$svc" \
                     "/sbin/rc$level.d/K$stoppriority$svc"
         done
@@ -2514,9 +2530,10 @@ pp_sd_control () {
 }
 
 pp_backend_sd () {
-    typeset psf cpt svc outfile
+    typeset psf cpt svc outfile release swp_flags
 
     psf=$pp_wrkdir/psf
+    release="?.${pp_sd_os%.[0-9][0-9]}.*"
 
     echo "depot" > $psf
     echo "layout_version 1.0" >>$psf
@@ -2537,7 +2554,7 @@ pp_backend_sd () {
             copyright       "$copyright"
             machine_type    *
             os_name         HP-UX
-            os_release      ?.11.*
+            os_release      $release
             os_version      ?
             directory       /
             is_locatable    false
@@ -2618,10 +2635,15 @@ pp_backend_sd () {
     test -s $pp_wrkdir/%fixup && . $pp_wrkdir/%fixup
 
     outfile=`pp_backend_sd_names`
-    if pp_verbose ${pp_sd_sudo} /usr/sbin/swpackage \
-        -s $psf \
-        -x run_as_superuser=false \
-        -x media_type=tape \
+    case ${pp_sd_os} in
+       10.*)
+           swp_flags="-x target_type=tape"
+           ;;
+       *)
+           swp_flags="-x media_type=tape"
+           ;;
+    esac
+    if pp_verbose ${pp_sd_sudo} /usr/sbin/swpackage -s $psf $swp_flags \
         @ $pp_wrkdir/$outfile
     then
         pp_verbose ${pp_sd_sudo} /usr/sbin/swlist -l file -s $pp_wrkdir/$outfile
@@ -2753,7 +2775,9 @@ pp_backend_solaris_init () {
        pp_solaris_category=
        pp_solaris_istates="s S 1 2 3"  # run-states when install is ok
        pp_solaris_rstates="s S 1 2 3"  # run-states when remove is ok
+       pp_solaris_maxinst=
        pp_solaris_vendor=
+       pp_solaris_pstamp=
        pp_solaris_copyright=
        pp_solaris_name=
        pp_solaris_desc=
@@ -2982,8 +3006,12 @@ pp_backend_solaris () {
          echo "RSTATES=$pp_solaris_rstates" >> $pkginfo
        test -n "$pp_solaris_istates" &&
          echo "ISTATES=$pp_solaris_istates" >> $pkginfo
+       test -n "$pp_solaris_maxinst" &&
+         echo "MAXINST=$pp_solaris_maxinst" >> $pkginfo
        test -n "${pp_solaris_vendor:-$vendor}" &&
          echo "VENDOR=${pp_solaris_vendor:-$vendor}" >> $pkginfo
+       test -n "$pp_solaris_pstamp" &&
+         echo "PSTAMP=$pp_solaris_pstamp" >> $pkginfo
 
        if test -n "${pp_solaris_copyright:-$copyright}"; then
            echo "${pp_solaris_copyright:-$copyright}" > $pp_wrkdir/copyright
@@ -3028,11 +3056,11 @@ pp_backend_solaris () {
         test -n "$pp_services" &&
             for _svc in $pp_services; do
                 pp_load_service_vars $_svc
+                pp_solaris_smf $_svc
                 pp_solaris_make_service $_svc
                 pp_solaris_install_service $_svc | pp_prepend $pp_wrkdir/postinstall
-                pp_prepend $pp_wrkdir/preremove <<-.
-                    /etc/init.d/$_svc stop >/dev/null 2>/dev/null
-.
+                pp_solaris_remove_service $_svc | pp_prepend $pp_wrkdir/preremove
+                unset pp_svc_xml_file
             done
 
         test -n "$pp_service_groups" &&
@@ -3110,9 +3138,9 @@ if $pp_opt_debug; then
   echo "$prototype::"; cat $prototype
 fi >&2
 
-       pkgmk -a $pp_solaris_arch -d $pp_wrkdir/pkg \
-             -f $prototype || { error "pkgmk failed"; return; }
-        pkgtrans -s $pp_wrkdir/pkg \
+       pkgmk -d $pp_wrkdir/pkg -f $prototype \
+               || { error "pkgmk failed"; return; }
+       pkgtrans -s $pp_wrkdir/pkg \
                $pp_wrkdir/`pp_backend_solaris_names` \
                 ${pp_solaris_name:-$name} \
                || { error "pkgtrans failed"; return; }
@@ -3284,12 +3312,12 @@ pp_backend_solaris_function() {
 }
 
 pp_backend_solaris_init_svc_vars () {
-    pp_solaris_smf_category=
+    _smf_category=${pp_solaris_smf_category:-application}
+    _smf_method_envvar_name=${smf_method_envvar_name:-"PP_SMF_SERVICE"}
     pp_solaris_service_shell=/sbin/sh
 }
 
 pp_solaris_init_svc () {
-    smf_category=${pp_solaris_smf_category:-application}
     smf_version=1
     smf_type=service
     solaris_user=
@@ -3307,40 +3335,116 @@ pp_solaris_init_svc () {
 }
 
 pp_solaris_smf () {
-    typeset f
-    f=/var/svc/manifest/$smf_category/$1
+    typeset f _pp_solaris_service_script svc _pp_solaris_manpage
+
+    pp_solaris_name=${pp_solaris_name:-$name}
+    pp_solaris_manpath=${pp_solaris_manpath:-"/usr/share/man"}
+    smf_start_timeout=${smf_start_timeout:-60}
+    smf_stop_timeout=${smf_stop_timeout:-60}
+    smf_restart_timeout=${smf_restart_timeout:-60}
+
+    svc=${pp_solaris_smf_service_name:-$1}
+    _pp_solaris_service_script=${pp_solaris_service_script:-"/etc/init.d/${pp_solaris_service_script_name:-$svc}"}
+    _pp_solaris_manpage=${pp_solaris_manpage:-$pp_solaris_smf_service_name}
+
+    if [ -z $pp_svc_xml_file ]; then
+        pp_svc_xml_file="/var/svc/manifest/$_smf_category/$svc.xml"
+        echo "## Generating the smf service manifest file for $pp_svc_xml_file"
+    else
+        echo "## SMF service manifest file already defined at $pp_svc_xml_file"
+        if [ -z $pp_solaris_smf_service_name ] || [ -z $pp_solaris_smf_category ] || [ -z $pp_solaris_service_script ] || [ -z $smf_method_envvar_name ]; then
+          pp_error "All required variables are not set.\n"\
+                   "When using a custom manifest file all of the following variables must be set:\n"\
+                   "pp_solaris_smf_service_name, pp_solaris_smf_category, pp_solaris_service_script and smf_method_envvar_name.\n\n"\
+                   "Example:\n"\
+                   " \$pp_solaris_smf_category=application\n"\
+                   " \$pp_solaris_smf_service_name=pp\n\n"\
+                   "  <service name='application/pp' type='service' version='1'>\n\n"\
+                   "Example:\n"\
+                   " \$pp_solaris_service_script=/etc/init.d/pp\n\n"\
+                   "  <exec_method type='method' name='start' exec='/etc/init.d/pp' />\n\n"\
+                   "Example:\n"\
+                   " \$smf_method_envvar_name=PP_SMF_SERVICE\n\n"\
+                   "  <method_environment>\n"\
+                   "    <envvar name='PP_SMF_SERVICE' value='1'/>\n"\
+                   "  </method_environment>\n"
+
+          return 1
+        fi
+        return 0
+    fi
+
+    f=$pp_svc_xml_file
     pp_add_file_if_missing $f ||
         return 0
 
-    cat <<-. >$pp_destdir$f
-       <?xml version="1.0"?>
-        <!--
-            $copyright
-            Generated by PolyPackage $pp_version
-       -->
-
-        <service name='$smf_category/$1'
-                 type='$smf_type'
-                 version='$smf_version'>
-
-            <single_instance />
-
-            <exec_method type='method' name='start'
-                exec=''
-                timeout_seconds='60'>
-                <method_context>
-                  <method_credential user='${solaris_user:-$user}' />
-                </method_context>
-            </exec>
-
-            <exec_method type='method' name='stop'
-                exec=':kill -${solaris_stop_signal:-$stop_signal}'>
-                <method_context>
-                  <method_credential user='${solaris_user:-$user}' />
-                </method_context>
-            </exec>
+    _pp_solaris_smf_dependencies="
+          <dependency name='pp_local_filesystems'
+                grouping='require_all'
+                restart_on='none'
+                type='service'>
+                <service_fmri value='svc:/system/filesystem/local'/>
+          </dependency>
+
+          <dependency name='pp_single-user'
+                grouping='require_all'
+                restart_on='none'
+                type='service'>
+                <service_fmri value='svc:/milestone/single-user' />
+          </dependency>
+"
+    _pp_solaris_smf_dependencies=${pp_solaris_smf_dependencies:-$_pp_solaris_smf_dependencies}
 
+    cat <<-. >$pp_destdir$f
+<?xml version="1.0"?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+       $copyright
+        Generated by PolyPackage $pp_version
+-->
+
+    <service_bundle type='manifest' name='${pp_solaris_name}:${svc}' >
+          <service name='$_smf_category/$svc'
+                type='$smf_type'
+                version='$smf_version'>
+
+          <create_default_instance enabled='false'/>
+
+          <single_instance />
+
+          $_pp_solaris_smf_dependencies
+
+          $pp_solaris_smf_additional_dependencies
+
+          <method_context>
+                <method_credential user='${solaris_user:-$user}' />
+                <method_environment>
+                    <envvar name='$_smf_method_envvar_name' value='1'/>
+                </method_environment>
+          </method_context>
+
+          <exec_method type='method' name='start'
+                exec='$_pp_solaris_service_script start'
+                timeout_seconds='$smf_start_timeout' />
+
+          <exec_method type='method' name='stop'
+                exec='$_pp_solaris_service_script stop'
+                timeout_seconds='$smf_stop_timeout' />
+
+          <exec_method type='method' name='restart'
+                exec='$_pp_solaris_service_script restart'
+                timeout_seconds='$smf_restart_timeout' />
+
+          <template>
+              <common_name>
+                  <loctext xml:lang='C'>$description</loctext>
+              </common_name>
+              <documentation>
+                  <manpage title='$pp_solaris_manpage' section='1' manpath='$pp_solaris_manpath'/>
+              </documentation>
+          </template>
         </service>
+    </service_bundle>
 .
 }
 
@@ -3411,15 +3515,13 @@ pp_solaris_make_service_group () {
 .
 }
 
-
 pp_solaris_make_service () {
     typeset file out _cmd svc
 
-    svc="$1"
-    file="/etc/init.d/$svc"
+    svc="${pp_solaris_smf_service_name:-$1}"
+    file=${pp_solaris_service_script:-"/etc/init.d/${pp_solaris_service_script_name:-$svc}"}
     out="$pp_destdir$file"
 
-
     #-- return if we don't need to create the init script
     pp_add_file_if_missing "$file" run 755 ||
         return 0
@@ -3427,6 +3529,43 @@ pp_solaris_make_service () {
     echo "#! /sbin/sh" >$out
     echo "#-- This service init file generated by polypkg" >>$out
 
+    #-- Start SMF integration.
+    if [ -n "$pp_svc_xml_file" ] ; then
+        cat <<_EOF >>$out
+if [ -x /usr/sbin/svcadm ] && [ "x\$1" != "xstatus" ] && [ "t\$$_smf_method_envvar_name" = "t" ] ; then
+    case "\$1" in
+        start)
+            echo "starting $svc"
+            /usr/sbin/svcadm clear svc:/$_smf_category/$svc:default >/dev/null 2>&1
+            /usr/sbin/svcadm enable -s $_smf_category/$svc
+            RESULT=\$?
+            if [ "\$RESULT" -ne 0 ] ; then
+                echo "Error \$RESULT starting $svc"
+                fi
+            ;;
+        stop)
+            echo "stopping $svc"
+            /usr/sbin/svcadm disable -ts $_smf_category/$svc
+            ;;
+        restart)
+            echo "restarting $svc"
+            /usr/sbin/svcadm disable -ts $_smf_category/$svc
+            /usr/sbin/svcadm clear svc:/$_smf_category/$svc:default >/dev/null 2>&1
+            /usr/sbin/svcadm enable -s $_smf_category/$svc
+            RESULT=\$?
+            if [ "\$RESULT" -ne 0 ] ; then
+                echo "Error \$RESULT starting $svc"
+                    fi
+                    ;;
+        *)
+            echo "Usage: $file {start|stop|restart|status}"
+            exit 1
+    esac
+    exit 0
+fi
+_EOF
+    fi
+
     #-- construct a start command that builds a pid file as needed
     #   and forks the daemon
     _cmd="$cmd";
@@ -3528,13 +3667,33 @@ pp_solaris_make_service () {
 .
 }
 
+pp_solaris_remove_service () {
+    typeset file svc
+
+    svc="${pp_solaris_smf_service_name:-$1}"
+    file=${pp_solaris_service_script:-"/etc/init.d/${pp_solaris_service_script_name:-$svc}"}
+
+    echo '
+'$file' stop >/dev/null 2>/dev/null
+if [ "x${PKG_INSTALL_ROOT}" = 'x' ]; then
+    if [ -x /usr/sbin/svcadm ] ; then
+        # Likely un-needed, but just in case.
+        /usr/sbin/svcadm disable -s '$svc' 2>/dev/null
+        /usr/sbin/svccfg delete '$svc' 2>/dev/null
+    fi
+fi
+    '
+}
 
 pp_solaris_install_service () {
-    typeset s k l
-    s="${solaris_sysv_init_start}$1"
-    k="${solaris_sysv_init_kill}$1"
+    typeset s k l file svc
+
+    svc="${pp_solaris_smf_service_name:-$1}"
+    file=${pp_solaris_service_script:-"/etc/init.d/${pp_solaris_service_script_name:-$svc}"}
+
+    s="${solaris_sysv_init_start}$svc"
+    k="${solaris_sysv_init_kill}$svc"
 
-    echo 'case " $SERVICES " in *" '$1' "*)'
     echo '
 if [ "x${PKG_INSTALL_ROOT}" != "x" ]; then
   if [ -x ${PKG_INSTALL_ROOT}/usr/sbin/svcadm ]; then
@@ -3544,41 +3703,42 @@ if [ "x${PKG_INSTALL_ROOT}" != "x" ]; then
         for state in ${solaris_sysv_init_start_states}; do
             l="/etc/rc$state.d/$s"
             echo "echo '$l'"
-            echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=../init.d/$1 s"
+            echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=$file s"
             pp_solaris_space /etc/rc$state.d 0 1
         done
     test -n "${solaris_sysv_init_kill_states}" &&
         for state in ${solaris_sysv_init_kill_states}; do
             l="/etc/rc$state.d/$k"
             echo "echo '$l'"
-            echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=../init.d/$1 s"
+            echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=$file s"
             pp_solaris_space /etc/rc$state.d 0 1
         done
     echo '
   fi
 else
     if [ -x /usr/sbin/svcadm ]; then
-        echo "Registering '$1' with SMF"
-        /usr/sbin/svcadm disable -s '$1' 2>/dev/null
-        /usr/sbin/svccfg delete '$1' 2>/dev/null
-        /usr/sbin/svccfg import '$pp_svc_xml_file' 2>/dev/null
+        echo "Registering '$svc' with SMF"
+        /usr/sbin/svcadm disable -s '$svc' 2>/dev/null
+        /usr/sbin/svccfg delete '$svc' 2>/dev/null
+        /usr/sbin/svccfg import '$pp_svc_xml_file'
     else'
     test -n "${solaris_sysv_init_start_states}" &&
         for state in ${solaris_sysv_init_start_states}; do
             l="/etc/rc$state.d/$s"
             echo "echo '$l'"
-            echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=../init.d/$1 s"
+            echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=$file s"
             pp_solaris_space /etc/rc$state.d 0 1
         done
     test -n "${solaris_sysv_init_kill_states}" &&
         for state in ${solaris_sysv_init_kill_states}; do
             l="/etc/rc$state.d/$k"
             echo "echo '$l'"
-            echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=../init.d/$1 s"
+            echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=$file s"
             pp_solaris_space /etc/rc$state.d 0 1
         done
-    echo " :;; esac"
-
+    echo '
+    fi
+fi'
 }
 
 pp_platforms="$pp_platforms deb"
@@ -3666,11 +3826,24 @@ pp_deb_detect_arch () {
    pp_deb_arch_std=`uname -m`
 }
 
+pp_deb_sanitize_version() {
+    echo "$@" | tr -d -c '[:alnum:].+-:~'
+}
+
+pp_deb_version_final() {
+    if test -n "$pp_deb_version"; then
+        # Don't sanitize; assume the user is sane (hah!)
+        echo "$pp_deb_version"
+    else
+        pp_deb_sanitize_version "$version"
+    fi
+}
+
 pp_deb_make_control() {
     package_name=`pp_deb_cmp_full_name "$1"`
     cat <<-.
        Package: ${package_name}
-       Version: ${pp_deb_version:-$version}-${pp_deb_release:-1}
+       Version: `pp_deb_version_final`-${pp_deb_release:-1}
        Section: ${pp_deb_section:-contrib}
        Priority: optional
        Architecture: ${pp_deb_arch}
@@ -3897,7 +4070,7 @@ pp_backend_deb_cleanup () {
 
 pp_deb_name () {
     local cmp="${1:-run}"
-    echo `pp_deb_cmp_full_name $cmp`"_${pp_deb_version:-$version}-${pp_deb_release:-1}_${pp_deb_arch}.deb"
+    echo `pp_deb_cmp_full_name $cmp`"_"`pp_deb_version_final`"-${pp_deb_release:-1}_${pp_deb_arch}.deb"
 }
 pp_backend_deb_names () {
     for cmp in $pp_components
@@ -5096,28 +5269,29 @@ pp_rpm_detect_arch () {
     rm $pp_wrkdir/dummy.spec
 
     #-- Ask the kernel what machine architecture is in use
-    local arch=`uname -p`
-    if [ "$arch" = "unknown" ]; then
-       arch=`uname -m`
-    fi
-
-    case "$arch" in
-       i?86)   pp_rpm_arch_std=i386;;
-       x86_64) pp_rpm_arch_std=x86_64;;
-       ppc)    pp_rpm_arch_std=ppc;;
-       ppc64)  pp_rpm_arch_std=ppc64;;
-       ia64)   pp_rpm_arch_std=ia64;;
-       s390)   pp_rpm_arch_std=s390;;
-       s390x)  pp_rpm_arch_std=s390x;;
-       powerpc)
+    local arch
+    for arch in "`uname -m`" "`uname -p`"; do
+       case "$arch" in
+           i?86)
+               pp_rpm_arch_std=i386
+               break
+               ;;
+           x86_64|ppc|ppc64|ia64|s390|s390x)
+               pp_rpm_arch_std="$arch"
+               break
+               ;;
+           powerpc)
                # Probably AIX
                case "`/usr/sbin/lsattr -El proc0 -a type -F value`" in
                    PowerPC_POWER*)     pp_rpm_arch_std=ppc64;;
                    *)                  pp_rpm_arch_std=ppc;;
                esac
+               break
                ;;
-       *)      pp_rpm_arch_std=unknown;;
-    esac
+           *)  pp_rpm_arch_std=unknown
+               ;;
+       esac
+    done
 
     #-- Later on, when files are processed, we use 'file' to determine
     #   what platform ABIs are used. This is used when pp_rpm_arch == auto
@@ -5130,6 +5304,15 @@ pp_rpm_detect_distro () {
        pp_rpm_distro=`awk '
           /^White Box Enterprise Linux release/ { print "wbel" $6; exit; }
        ' /etc/whitebox-release`
+    elif test -f /etc/mandrakelinux-release; then
+       pp_rpm_distro=`awk '
+          /^Mandrakelinux release/ { print "mand" $3; exit; }
+       ' /etc/mandrake-release`
+    elif test -f /etc/mandrake-release; then
+       pp_rpm_distro=`awk '
+          /^Linux Mandrake release/ { print "mand" $4; exit; }
+          /^Mandrake Linux release/ { print "mand" $4; exit; }
+       ' /etc/mandrake-release`
     elif test -f /etc/fedora-release; then
        pp_rpm_distro=`awk '
           /^Fedora Core release/ { print "fc" $4; exit; }
@@ -5150,6 +5333,10 @@ pp_rpm_detect_distro () {
           /^S[uU]SE LINUX Enterprise Server [0-9]/ { print "sles" $5; exit; }
           /^SuSE SLES-[0-9]/  { print "sles" substr($2,6); exit; }
        ' /etc/SuSE-release`
+    elif test -f /etc/pld-release; then
+       pp_rpm_distro=`awk '
+          /^[^ ]* PLD Linux/ { print "pld" $1; exit; }
+       ' /etc/pld-release`
     elif test X"`uname -s 2>/dev/null`" = X"AIX"; then
        local r v
        r=`uname -r`
@@ -5221,10 +5408,34 @@ pp_rpm_writefiles () {
                *"executable (RISC System/6000)"*)
                    farch=ppc;;
                *"64-bit XCOFF executable"*)
-                   fatch=ppc64;;
+                   farch=ppc64;;
+               *" ELF "*)
+                   farch=ELF;;
                *)
                    farch=noarch;;
            esac
+           # If file(1) doesn't provide enough info, try readelf(1)
+           if test "$farch" = "ELF"; then
+               fo=`readelf -h "${pp_destdir}$p" | awk '{if ($1 == "Class:") {class=$2} else if ($1 == "Machine:") {machine=$0; sub(/^ *Machine: */, "", machine)}} END {print class " " machine}' 2>/dev/null`
+               case "$fo" in
+                   "ELF32 Intel 80386")
+                       farch=i386;;
+                   "ELF64 "*[xX]"86-64")
+                       farch=x86_64;;
+                   "ELF32 PowerPC")
+                       farch=ppc;;
+                   "ELF64 PowerPC")
+                       farch=ppc64;;
+                   "ELF64 IA-64")
+                       farch=ia64;;
+                   "ELF32 IBM S/390")
+                       farch=s390;;
+                   "ELF64 IBM S/390")
+                       farch=s390x;;
+                   *)
+                       farch=noarch;;
+               esac
+           fi
            pp_debug "file: $fo -> $farch"
            test x"$farch" = x"noarch" || pp_add_to_list pp_rpm_arch_seen $farch
        fi
@@ -6244,6 +6455,9 @@ pp_backend_macos_init () {
     pp_macos_prog_packagemaker=/Developer/usr/bin/packagemaker
     pp_macos_pkg_domain=anywhere
     pp_macos_pkg_extra_flags=
+    pp_macos_sudo=
+    # OS X puts the library version *before* the .dylib extension
+    pp_shlib_suffix='*.dylib'
 }
 
 pp_macos_plist () {
@@ -6436,20 +6650,20 @@ pp_macos_mkbom () {
     bomstage=$pp_wrkdir/bom_stage
     while IFS='        ' read path mode ugid size cksumi linkpath; do
        if test -h "$pp_destdir/$path"; then
-           /bin/ln -s "$linkpath" "$bomstage/$path"
+           $pp_macos_sudo /bin/ln -s "$linkpath" "$bomstage/$path"
        else
            if test -d "$pp_destdir/$path"; then
-               /bin/mkdir -p "$bomstage/$path"
+               $pp_macos_sudo /bin/mkdir -p "$bomstage/$path"
            else
-               /bin/cp "$pp_destdir/$path" "$bomstage/$path"
+               $pp_macos_sudo /bin/cp "$pp_destdir/$path" "$bomstage/$path"
            fi
-           /bin/chmod $mode "$bomstage/$path"
-           /usr/sbin/chown `echo $ugid| tr / :` "$bomstage/$path"
+           $pp_macos_sudo /bin/chmod $mode "$bomstage/$path"
+           $pp_macos_sudo /usr/sbin/chown `echo $ugid| tr / :` "$bomstage/$path"
        fi
     done <"$1"
-    (cd $bomstage && mkbom . $pp_wrkdir/bom_stage.bom) ||
+    (cd $bomstage && $pp_macos_sudo mkbom . $pp_wrkdir/bom_stage.bom) ||
        pp_error "mkbom failed"
-    mv $pp_wrkdir/bom_stage.bom "$2"
+    $pp_macos_sudo mv $pp_wrkdir/bom_stage.bom "$2"
 }
 
 pp_backend_macos () {
@@ -6620,7 +6834,9 @@ CompressedSize 0
     cat $pp_wrkdir/%files.* | awk '{ print "." $6 }' | sed '/\/$/d' | sort | /bin/pax -w -f - | gzip -9 -c > $Contents/Archive.pax.gz
     )
 
-       rm -rf $pp_wrkdir/bom_stage
+       $pp_macos_sudo rm -rf $pp_wrkdir/bom_stage
+
+    hdiutil create -fs HFS+ -srcfolder $pkgdir -volname $name ${name}-${version}.dmg
 }
 
 pp_backend_macos_cleanup () {