summaryrefslogtreecommitdiff
path: root/testing
diff options
context:
space:
mode:
authorPatrick J Volkerding <volkerdi@slackware.com>2018-06-19 22:35:25 +0000
committerEric Hameleers <alien@slackware.com>2018-06-20 09:00:31 +0200
commit7e5ee73de954e6c084195b0a1fa6ef01a78d092f (patch)
tree7219c86cd7bc94b145e6e31779a1654ba5998e4c /testing
parenta27618d0d02506153de111da1055a5af43245d13 (diff)
downloadcurrent-7e5ee73de954e6c084195b0a1fa6ef01a78d092f.tar.gz
Tue Jun 19 22:35:25 UTC 201820180619223525
a/acl-2.2.53-x86_64-1.txz: Upgraded. a/attr-2.4.48-x86_64-1.txz: Upgraded. n/gnupg-1.4.23-x86_64-1.txz: Upgraded. Sanitize the diagnostic output of the original file name in verbose mode. By using a made up file name in the message it was possible to fake status messages. Using this technique it was for example possible to fake the verification status of a signed mail. For more information, see: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-12020 (* Security fix *) x/libXaw3d-1.6.3-x86_64-1.txz: Upgraded. x/libinput-1.11.1-x86_64-1.txz: Upgraded. x/xf86-input-mouse-1.9.3-x86_64-1.txz: Upgraded. testing/packages/pkgtools-15.0-noarch-20.txz: Rebuilt. This update is a bit scarier than usual, so we're going to test it here first and then move it into the main tree in a couple of days if there are no serious bug reports. It's well-tested here, and works with the slackpkg that's in -current now, but I don't know about slackpkg+ so that's another reason to let it cool down here first. The purpose of this update is to migrate the package database and directories from /var/log to /var/lib/pkgtools. /var/log was never a good place for this data, as it is considered by many to be a directory that could be wiped to free up some space. Originally the package database was in /var/adm, but the FSSTND (later FHS) group decided that directory should be a symlink to /var/log, and I went along with that since it was years ago and I was a n00b and didn't know any better. /var/lib/pkgtools will be a better and safer location. The removed_packages and removed_scripts directories are really just logs that aren't actually used for anything - those will remain under /var/log, but moved into /var/log/pkgtools. Everything under /var/log will be considered potentially non-permanent by the pkgtools - if any directories or symlinks disappear from there, the pkgtools will automatically recreate them as needed. In fact, the migration process will create symlinks from all the old directory locations to the new ones, so anything that expects the old locations (including slackpkg, for now) should continue to work. Once this moves into the main tree, the plan is to fix other packages to use the new installer script directory (/var/lib/pkgtools/setup) and change the installer and slackpkg to use the new native locations for everything. When slackpkg is changed over to use the new native locations, I'll also make sure to float that in testing/ for a few days before moving it to the main tree to avoid more unintentional disruption to slackpkg+ users. Be aware that the package database migration is a one-way operation, but even so if you later downgrade to an older version of the pkgtools it will still work through the compatibility symlinks.
Diffstat (limited to 'testing')
-rw-r--r--testing/source/pkgtools/doinst.sh69
-rw-r--r--testing/source/pkgtools/manpages/explodepkg.841
-rw-r--r--testing/source/pkgtools/manpages/installpkg.8126
-rw-r--r--testing/source/pkgtools/manpages/makepkg.8164
-rw-r--r--testing/source/pkgtools/manpages/pkgdiff.857
-rw-r--r--testing/source/pkgtools/manpages/pkgtool.895
-rw-r--r--testing/source/pkgtools/manpages/removepkg.8114
-rw-r--r--testing/source/pkgtools/manpages/upgradepkg.8116
-rwxr-xr-xtesting/source/pkgtools/pkgtools.SlackBuild109
-rw-r--r--testing/source/pkgtools/scripts/explodepkg109
-rw-r--r--testing/source/pkgtools/scripts/installpkg713
-rw-r--r--testing/source/pkgtools/scripts/makebootdisk443
-rw-r--r--testing/source/pkgtools/scripts/makepkg452
-rw-r--r--testing/source/pkgtools/scripts/pkgdiff164
-rw-r--r--testing/source/pkgtools/scripts/pkgtool723
-rw-r--r--testing/source/pkgtools/scripts/removepkg438
-rw-r--r--testing/source/pkgtools/scripts/setup.70.install-kernel5
-rw-r--r--testing/source/pkgtools/scripts/setup.80.make-bootdisk267
-rw-r--r--testing/source/pkgtools/scripts/setup.htmlview33
-rw-r--r--testing/source/pkgtools/scripts/setup.services342
-rw-r--r--testing/source/pkgtools/scripts/upgradepkg417
-rw-r--r--testing/source/pkgtools/slack-desc19
22 files changed, 5016 insertions, 0 deletions
diff --git a/testing/source/pkgtools/doinst.sh b/testing/source/pkgtools/doinst.sh
new file mode 100644
index 00000000..d14a6787
--- /dev/null
+++ b/testing/source/pkgtools/doinst.sh
@@ -0,0 +1,69 @@
+#!/bin/bash
+# Migrate the package database and related directories from the long-time
+# (stupid) directory /var/log to /var/lib/pkgtools.
+#
+# The removed_* directories will remain under /var/log (but moved to
+# /var/log/pkgtools) as they contain log files of previous operations,
+# not anything that's actively used for package management. Also, the
+# removed_* directories can become quite large compared with the database.
+#
+# First, if it's just a case of missing symlinks, make them. Don't make them
+# if the directories exist in /var/log - we'll do a proper migration in that
+# case.
+for directory in packages scripts setup ; do
+ if [ ! -L var/log/$directory -a ! -d var/log/$directory ]; then
+ if [ -d var/lib/pkgtools/$directory ]; then
+ # Make the symlink:
+ ( cd var/log ; ln -sf ../lib/pkgtools/$directory . )
+ fi
+ fi
+done
+for directory in removed_packages removed_scripts ; do
+ if [ ! -L var/log/$directory -a ! -d var/log/$directory ]; then
+ mkdir -p var/log/pkgtools/$directory
+ ( cd var/log ; ln -sf pkgtools/$directory . )
+ fi
+ if [ ! -L var/lib/pkgtools/$directory -a ! -d var/lib/pkgtools/$directory ]; then
+ mkdir -p var/lib/pkgtools
+ ( cd var/lib/pkgtools ; ln -sf ../../log/pkgtools/$directory . )
+ fi
+done
+# If at this point /var/log/packages is not a symlink, we need to do the
+# migration. We should already have a lock on being the only install script
+# that's currently running, but also get a lock on ldconfig to freeze any
+# other package operations that are happening now until after the migration
+# is complete.
+if [ ! -L var/log/packages ]; then
+ if [ ! -d run/lock/pkgtools ]; then
+ mkdir -p run/lock/pkgtools
+ fi
+ ( flock 9 || exit 11
+ # Don't migrate if tar is running, as there may still be package operations
+ # going on in another process:
+ while pidof tar 1> /dev/null 2> /dev/null ; do
+ sleep 15
+ done
+ # Just to be a bit safer from race conditions:
+ sleep 5
+ # First, move the removed_* directories into a pkgtools subdirectory:
+ mkdir -p var/log/pkgtools
+ for directory in removed_packages removed_scripts ; do
+ if [ ! -d var/log/pkgtools/$directory ]; then
+ mkdir -p var/log/pkgtools/$directory
+ # Move anything found in the old location, then remove it:
+ mv var/log/$directory/* var/log/pkgtools/$directory 2> /dev/null
+ rm -rf var/log/$directory
+ # Make a symlink:
+ ( cd var/log ; ln -sf pkgtools/$directory . )
+ fi
+ done
+ for directory in packages scripts setup ; do
+ mkdir -p var/lib/pkgtools/$directory
+ mv var/log/$directory/* var/lib/pkgtools/$directory 2> /dev/null
+ rm -rf var/log/$directory
+ ( cd var/log
+ ln -sf ../lib/pkgtools/$directory .
+ )
+ done
+ ) 9> run/lock/pkgtools/ldconfig.lock
+fi
diff --git a/testing/source/pkgtools/manpages/explodepkg.8 b/testing/source/pkgtools/manpages/explodepkg.8
new file mode 100644
index 00000000..ddc3d47c
--- /dev/null
+++ b/testing/source/pkgtools/manpages/explodepkg.8
@@ -0,0 +1,41 @@
+.\" -*- nroff -*-
+.ds g \" empty
+.ds G \" empty
+.\" Like TP, but if specified indent is more than half
+.\" the current line-length - indent, use the default indent.
+.de Tp
+.ie \\n(.$=0:((0\\$1)*2u>(\\n(.lu-\\n(.iu)) .TP
+.el .TP "\\$1"
+..
+.TH EXPLODEPKG 8 "21 May 1994" "Slackware Version 2.0.0"
+.SH NAME
+explodepkg \- Extract the contents of a tar+compression package (such as a Slackware
+software package) in the current directory.
+.SH SYNOPSIS
+.B explodepkg
+.BI package
+.BI [
+.BI package2,
+.BI package3,
+.BI ...
+.BI ]
+.SH DESCRIPTION
+.B explodepkg
+uncompresses and untars Slackware *.tgz (or .tbz, .tlz, .txz) packages (or any archive
+that was created by
+compressing a tarfile with one of the supported compression utilities) in the current directory. It is not usually
+used to install packages, since it doesn't execute the installation scripts
+in ./install or ./var/lib/pkgtools/setup. The primary use for
+.B explodepkg
+is in package maintenance - exploding a package in a subdirectory, making fixes
+to it or upgrading the software, and then building the updated package with
+.B makepkg.
+.SH AUTHOR
+Patrick J. Volkerding <volkerdi@slackware.com>
+.SH "SEE ALSO"
+.BR tar(1),
+.BR gzip(1),
+.BR installpkg(8),
+.BR makepkg(8),
+.BR pkgtool(8),
+.BR upgradepkg(8)
diff --git a/testing/source/pkgtools/manpages/installpkg.8 b/testing/source/pkgtools/manpages/installpkg.8
new file mode 100644
index 00000000..204cc841
--- /dev/null
+++ b/testing/source/pkgtools/manpages/installpkg.8
@@ -0,0 +1,126 @@
+.\" -*- nroff -*-
+.ds g \" empty
+.ds G \" empty
+.\" Like TP, but if specified indent is more than half
+.\" the current line-length - indent, use the default indent.
+.de Tp
+.ie \\n(.$=0:((0\\$1)*2u>(\\n(.lu-\\n(.iu)) .TP
+.el .TP "\\$1"
+..
+.TH INSTALLPKG 8 "22 Nov 2001" "Slackware Version 8.1.0"
+.SH NAME
+installpkg \- install Slackware packages.
+.SH SYNOPSIS
+.B installpkg
+[
+.B \--warn
+]
+[
+.B \--md5sum
+]
+[
+.B \--root /otherroot
+]
+[
+.B \--infobox
+]
+[
+.B \--menu
+]
+[
+.B \--terse
+]
+[
+.B \--terselength <length>
+]
+[
+.B \--ask
+]
+[
+.B \--priority ADD|REC|OPT|SKP
+]
+[
+.B \--tagfile /somedir/tagfile
+]
+[
+.B \--threads <number>
+]
+.BI packagename
+[
+.B packagename2 ...
+]
+.SH DESCRIPTION
+.B installpkg
+installs single or multiple *.txz (or .tbz, .tgz, .tlz) binary packages designed
+for use with the Slackware Linux distribution onto your system.
+.SH OPTIONS
+.TP
+.B \--warn packagename
+Generate a list of files that would be overwritten to the standard output, but do
+not actually install the package. The list is formatted in a suitable fashion to
+use as a list of files to backup.
+.TP
+.B \--md5sum packagename
+Record the package md5sum in the metadata written in /var/lib/pkgtools/packages.
+.TP
+.B \--root /otherroot
+Install using a location other than / (the default) as the root of the
+filesystem to install on. In the example given, use /otherroot instead. Setting
+the ROOT environment variable does the same thing.
+.TP
+.B \--infobox
+Use /bin/dialog to display an informational dialog as the package is installed.
+Primarily used when installpkg is called from other scripts.
+.TP
+.B \--menu
+Use /bin/dialog to display a menu asking the user if they would like to install the
+package(s) or not. Generally used when installpkg is called from other scripts.
+.TP
+.B \--terse
+Install the package displaying only a single description line to stdout.
+.TP
+.B \--terselength <length>
+Maximum line length of --terse mode output. Default is the number of terminal columns.
+.TP
+.B \--ask
+Used with -menu mode. When selected, always ask if a package should be
+installed regardless of what the package's priority is.
+.TP
+.B \--priority ADD|REC|OPT|SKP
+When installing with the \-menu option, package priority levels (found in the file
+"tagfile" in the package directory) are used to automatically install (ADD) or
+skip (SKP) a package, or to suggest recommended (REC) or optional (OPT) to the user
+if a menu is displayed. If a priority is set on the command line, it will override
+the values set in the tagfile for the entire package list.
+.TP
+.B \--tagfile /somedir/tagfile
+Specify a different file to use for package priorities (in this example, /somedir/tagfile
+will be used). The default is "tagfile" in the package's directory.
+.TP
+.B \--threads <number>
+For xz/plzip compressed packages, set the maximum number of threads to be used for
+decompression. Only has an effect if a multithreaded compressor was used, and then
+only on large packages. The default for plzip is the number of CPU threads available.
+The default for xz is 2.
+.SH EXAMPLES
+.TP
+.B Install a font package for X:
+.P
+installpkg font-bh-ttf-1.0.3-noarch-1.txz
+.P
+Note that if a package is already installed, upgradepkg(8) should be used instead.
+.TP
+.B Create a backup of the files that would be overwritten if the package is installed:
+.P
+.nf
+tar czvf /tmp/backup.tar.gz \\
+ $(installpkg --warn font-bh-ttf-1.0.3-noarch-1.txz)
+.fi
+.SH AUTHOR
+Patrick J. Volkerding <volkerdi@slackware.com>
+.SH "SEE ALSO"
+.BR makepkg(8),
+.BR removepkg(8),
+.BR explodepkg(8),
+.BR pkgtool(8),
+.BR upgradepkg(8)
diff --git a/testing/source/pkgtools/manpages/makepkg.8 b/testing/source/pkgtools/manpages/makepkg.8
new file mode 100644
index 00000000..16a98f3f
--- /dev/null
+++ b/testing/source/pkgtools/manpages/makepkg.8
@@ -0,0 +1,164 @@
+.\" -*- nroff -*-
+.ds g \" empty
+.ds G \" empty
+.\" Like TP, but if specified indent is more than half
+.\" the current line-length - indent, use the default indent.
+.de Tp
+.ie \\n(.$=0:((0\\$1)*2u>(\\n(.lu-\\n(.iu)) .TP
+.el .TP "\\$1"
+..
+.TH MAKEPKG 8 "21 May 1994" "Slackware Version 2.0.0"
+.SH NAME
+makepkg \- make Slackware packages.
+.SH SYNOPSIS
+.B makepkg
+[
+.B -l, --linkadd y|n
+]
+[
+.B -c, --chown y|n
+]
+[
+.B --threads <number>
+]
+[
+.B --compress <option>
+]
+[
+.B --acls
+]
+[
+.B --xattrs
+]
+.BI packagename
+.SH DESCRIPTION
+.B makepkg
+creates a new Slackware compatible package.
+The package is constructed using the contents of the current directory and
+all subdirectories. If symbolic links exist, they will be converted to script
+code to recreate them when the package is installed. This code will be
+appended to the primary installation script
+.B ( install/doinst.sh )
+, or, if that script does not exist it will be created with those contents.
+The package will be written out to the file
+.BI packagename
+which should be the full name, including the extension. This is usually .txz,
+but .tgz, .tbz, and .tlz are also accepted. The proper compression utility
+(xz, gzip, bzip2, or lzip) needs to be installed on the machine.
+.SH OPTIONS
+.TP
+.B \-l, --linkadd y|n
+If y, add any symbolic links found to the install script (doinst.sh) and
+delete them. This is the recommended action. If this option is not used,
+makepkg will prompt if symbolic links are found.
+.TP
+.B \-p, --prepend
+If this option is given, then any symbolic links added to doinst.sh will be
+prepended to the existing script. This is useful for packages that contain
+shared libraries that need to be linked first because programs will use them
+later in the doinst.sh script.
+.TP
+.B \-c, --chown y|n
+If y, makepkg will reset all directory permissions to 755 and ownership to root:root.
+In general, you should have the permissions and ownerships worked out yourself, so
+relying on setting this option to y is somewhat sloppy. It is not the default. If an
+option is not provided, makepkg will prompt.
+.TP
+.B --threads <number>
+For xz/plzip compressed packages, set the maximum number of threads to be used for
+compression. Only has an effect on large packages. For plzip, the default is the number
+of CPU threads available. For xz, the default is 2 (due to commonly occuring memory
+related failures on 32-bit with too many threads and multithreaded xz compression).
+.TP
+.B --compress <option>
+Supply a custom option to the compressor. This will be used in place of the default, which is: -9
+.TP
+.B --acls
+Support storing POSIX ACLs in the package. The resulting package will not be compatible
+with pkgtools version < 15.0.
+.TP
+.B --xattrs
+Support storing extended attributes in the package. The resulting package will not be
+compatible with pkgtools version < 15.0.
+.SH INSTALLATION SCRIPTS
+There are 3 types of installation scripts supported in the Slackware package
+system.
+.TP
+The first is the
+.B primary
+installation script. This is found in the subdirectory
+.B ./install
+and must have the name
+.B doinst.sh
+in order to be recognized. This ( and other install scripts ) should be written
+using the basic Bourne shell syntax recognized by the
+.B ash
+shell, since this is the shell that will be used to execute the script when
+installing from a Slackware install floppy. This is a common trap - beware of
+using
+.B bash
+syntax extensions, because the script will work fine when installed from the
+hard drive, but will bomb out when installed from floppy. If the package is
+for personal use, this isn't a problem. Be careful, though, if you plan to
+share your package with other users. The
+.B primary installation script
+is executed immediately after the package is installed with
+.B installpkg, pkgtool,
+or
+.B setup.
+.TP
+The second type of script is the
+.B configuration
+script. This is found in the subdirectory
+.B ./var/lib/pkgtools/setup
+and must have a name that starts with
+.B setup.
+in order to be recongnized. An example is the timezone script:
+.B /var/lib/pkgtools/setup/setup.timeconfig.
+These scripts are executed during the
+.B CONFIGURE
+phase of
+.B setup,
+and are re-executed each time the user runs the
+.B CONFIGURE
+option from
+.B setup
+from then on.
+Typically, the user will go through this phase of setup following the
+installation of all the packages. Anything that needs to be interactive
+should go in one of these scripts to avoid halting the package installation
+process during
+.B setup.
+.TP
+The third type of script is the
+.B onlyonce
+script. Like the name suggests, these are executed only once after the package
+is installed, in contrast to the standard
+.B configuration
+script. These scripts are also found in the
+.B ./var/lib/pkgtools/setup
+directory and must have a name that starts with
+.B setup.,
+but in addition the name must contain the string
+.B onlyonce.
+An example might be a script with the name
+.B /var/lib/pkgtools/setup/setup.onlyonce.testscript
+.SH PACKAGE FORMAT
+.B makepkg
+uses GNU tar plus GNU gzip to create its packages. A simple way to
+extract the contents of a package (without executing the installation
+scripts, of course) is to use a command like this:
+.TP
+explodepkg package.tgz
+.TP
+Or, something like this:
+.TP
+gzip -dc package.tgz | tar xvvf -
+.SH AUTHOR
+Patrick J. Volkerding <volkerdi@slackware.com>
+.SH "SEE ALSO"
+.BR installpkg(8),
+.BR explodepkg(8),
+.BR removepkg(8),
+.BR pkgtool(8),
+.BR upgradepkg(8)
diff --git a/testing/source/pkgtools/manpages/pkgdiff.8 b/testing/source/pkgtools/manpages/pkgdiff.8
new file mode 100644
index 00000000..5d91ac21
--- /dev/null
+++ b/testing/source/pkgtools/manpages/pkgdiff.8
@@ -0,0 +1,57 @@
+.\" -*- nroff -*-
+.ds g \" empty
+.ds G \" empty
+.\" Like TP, but if specified indent is more than half
+.\" the current line-length - indent, use the default indent.
+.de Tp
+.ie \\n(.$=0:((0\\$1)*2u>(\\n(.lu-\\n(.iu)) .TP
+.el .TP "\\$1"
+..
+.TH PKGDIFF 8 "11 Apr 2018" "Slackware Version 15.0
+.SH NAME
+pkgdiff \- compare the file contents of two packages.
+.SH SYNOPSIS
+.B pkgdiff
+[
+.B \--help
+]
+[
+.B \-c
+]
+[
+.B \-a
+]
+.BI packagename
+.BI packagename2
+.SH DESCRIPTION
+.B pkgdiff
+Displays the differences in the files contained in two packages. This works with
+plain .tar, Slackware packages (.tgz, .tbz, .tlz, .txz), .rpm, and .deb. By default,
+the results will be displayed in a tree-style unified diff format.
+.SH OPTIONS
+.TP
+.B \--help
+Display help for using the pkgdiff utility.
+.TP
+.B \-c
+Colorize the tree-style output a-la DIR_COLORS. If piping to a pager such as
+less, you'll need to enable displaying raw data. For example:
+.P
+pkgdiff -c package-1.0-i586-1.txz package-2.0-i586-1.txz | less -r
+.TP
+.B \-a
+Instead of a tree-style output format, generate a simple unified diff of the
+package file lists.
+.SH EXAMPLES
+.TP
+.B Compare two packages and pipe the result to less:
+.P
+pkgdiff package-1.0-i586-1.txz package-2.0-i586-1.txz | less
+.SH AUTHOR
+Patrick J. Volkerding <volkerdi@slackware.com>
+.SH "SEE ALSO"
+.BR makepkg(8),
+.BR removepkg(8),
+.BR explodepkg(8),
+.BR pkgtool(8),
+.BR upgradepkg(8)
diff --git a/testing/source/pkgtools/manpages/pkgtool.8 b/testing/source/pkgtools/manpages/pkgtool.8
new file mode 100644
index 00000000..56e39217
--- /dev/null
+++ b/testing/source/pkgtools/manpages/pkgtool.8
@@ -0,0 +1,95 @@
+.\" -*- nroff -*-
+.ds g \" empty
+.ds G \" empty
+.\" Like TP, but if specified indent is more than half
+.\" the current line-length - indent, use the default indent.
+.de Tp
+.ie \\n(.$=0:((0\\$1)*2u>(\\n(.lu-\\n(.iu)) .TP
+.el .TP "\\$1"
+..
+.TH PKGTOOL 8 "24 Nov 1995" "Slackware Version 3.1.0"
+.SH NAME
+pkgtool \- software package maintenance tool.
+.SH SYNOPSIS
+.B pkgtool
+.LP
+.B pkgtool
+[
+.B --sets #a#b#c#
+]
+[
+.B --source_mounted
+]
+[
+.B --ignore_tagfiles
+]
+[
+.B --tagfile tagfile
+]
+[
+.B --source_dir directory
+]
+[
+.B --target_dir directory
+]
+[
+.B --source_device device
+]
+.SH DESCRIPTION
+.B pkgtool
+is a menu-driven package maintenance tool provided with the Slackware Linux
+distribution. It allows the user to install, remove, or view
+software packages through an interactive
+system. Pkgtool can also be used to re-run the menu-driven scripts normally
+executed at the end of a Slackware installation. This is useful for doing
+basic reconfiguration (like changing the mouse type).
+.SH OPTIONS
+Most users will not want to use any options when running
+.B pkgtool.
+These are generally used only when
+.B pkgtool
+is run during the initial system installation.
+Feel free to try them, but be careful.
+.TP
+.B \--sets #A#B#C#
+Install the disk sets A, B, C. Seperate the disk set names by '#' symbols.
+.TP
+.B \--source_mounted
+When this flag is present,
+.B pkgtool
+will not attempt to unmount and remount the source device with each disk.
+.TP
+.B \--ignore_tagfiles
+When this flag is present,
+.B pkgtool
+will install every package encountered no matter what the tagfiles say.
+.TP
+.B \--tagfile tagfile
+This flag is used to specify from the command line which tagfile should be
+used for the installation.
+.TP
+.B \--source_dir directory
+Used when installing multiple packages from disk sets. This is the directory
+in which the subdirectories for each disk are found. This isn't used when
+installing from floppy.
+.TP
+.B \--target_dir directory
+The directory where the target root directory is located. This is '/' when
+installing on the hard drive, or typically '/mnt' when installing from an
+install disk.
+.TP
+.B \--source_device device
+The source device to install from. This is not used if you've provided the
+.B \--source_mounted
+flag. It's usually used when installing from floppy, as in:
+ \--source_device /dev/fd0u1440
+or
+ \--source_device /dev/fd1h1200.
+.SH AUTHOR
+Patrick J. Volkerding <volkerdi@slackware.com>
+.SH "SEE ALSO"
+.BR makepkg(8),
+.BR explodepkg(8),
+.BR installpkg(8),
+.BR removepkg(8),
+.BR upgradepkg(8)
diff --git a/testing/source/pkgtools/manpages/removepkg.8 b/testing/source/pkgtools/manpages/removepkg.8
new file mode 100644
index 00000000..f92ed8c2
--- /dev/null
+++ b/testing/source/pkgtools/manpages/removepkg.8
@@ -0,0 +1,114 @@
+.\" -*- nroff -*-
+.ds g \" empty
+.ds G \" empty
+.\" Like TP, but if specified indent is more than half
+.\" the current line-length - indent, use the default indent.
+.de Tp
+.ie \\n(.$=0:((0\\$1)*2u>(\\n(.lu-\\n(.iu)) .TP
+.el .TP "\\$1"
+..
+.TH REMOVEPKG 8 "23 Nov 2001" "Slackware Version 8.1.0"
+.SH NAME
+removepkg \- remove Slackware packages.
+.SH SYNOPSIS
+.B removepkg
+.BI packagename
+.LP
+[
+.B ROOT=/mnt
+]
+.B removepkg
+[
+.B \--copy
+]
+[
+.B \--keep
+]
+[
+.B \--preserve
+]
+[
+.B \--terse
+]
+[
+.B \--warn
+]
+.BI packagename
+.SH DESCRIPTION
+.B removepkg
+removes a previously installed Slackware package, while writing a progress
+report to the standard output. A package may be specified either by the
+full package name (as you'd see listed in /var/lib/pkgtools/packages/), or by the
+base package name. For example, the package foo-1.0-i586-1.txz may be removed
+with any of the following commands:
+
+removepkg foo-1.0-i586-1.txz (also recognized: .tgz, .tbz, .tlz)
+
+removepkg foo-1.0-i586-1
+
+removepkg foo.txz
+
+removepkg foo
+
+When deleting files,
+.B removepkg
+will analyze the contents of the other packages installed on your system, and
+will only delete the files that are unique to the package being removed.
+Similarly, the installation scripts for all the other packages will be
+considered when deciding whether or not to delete symbolic links from the
+package.
+.LP
+Removing a package (as well as installing one) can be a dangerous undertaking.
+For this reason, there is the
+.B \-warn
+option available. When you use this,
+.B removepkg
+will not actually remove any files or links, but will output a detailed report
+of what it would do if you actually did remove the package. It's suggested that
+you do this (and maybe pipe the output to
+.B less
+) before removing packages to make sure you've backed up anything that might
+be important.
+.LP
+When removing a package, it's original file index will be moved from
+/var/lib/pkgtools/packages to /var/log/pkgtools/removed_packages. Likewise, its installation
+script will be moved from /var/lib/pkgtools/scripts to /var/log/pkgtools/removed_scripts.
+.SH OPTIONS
+.TP
+.B \--copy packagename
+Construct a copy of the package under /var/lib/pkgtools/setup/tmp/preserved_packages/packagename,
+but don't remove it. (same effect as \-warn \-preserve)
+.TP
+.B \--keep
+Save the intermediate files created by removepkg (delete_list,
+required_files, uniq_list, del_link_list, required_links,
+required_list). Mostly useful for debugging purposes.
+.TP
+.B \--preserve packagename
+If specified, the complete package subtree is reconstructed in
+/var/lib/pkgtools/setup/tmp/preserved_packages/packagename.
+.TP
+.B \--terse
+Remove the package displaying only a single description line to stdout.
+.TP
+.B \--warn packagename
+Generate a report to the standard output about which files and directories
+would be removed, but does not actually remove the package.
+.SH " "
+It's possible to remove a package from a filesystem
+other than / by supplying
+.B removepkg
+with a
+.B ROOT
+environment variable:
+.TP
+.B ROOT=/mnt removepkg package
+
+.SH AUTHORS
+Patrick J. Volkerding <volkerdi@slackware.com>,
+with enhancements by Christian Franke <c.franke@acm.org>
+.SH "SEE ALSO"
+.BR installpkg(8),
+.BR makepkg(8),
+.BR pkgtool(8),
+.BR upgradepkg(8)
diff --git a/testing/source/pkgtools/manpages/upgradepkg.8 b/testing/source/pkgtools/manpages/upgradepkg.8
new file mode 100644
index 00000000..757d6003
--- /dev/null
+++ b/testing/source/pkgtools/manpages/upgradepkg.8
@@ -0,0 +1,116 @@
+.\" -*- nroff -*-
+.ds g \" empty
+.ds G \" empty
+.\" Like TP, but if specified indent is more than half
+.\" the current line-length - indent, use the default indent.
+.de Tp
+.ie \\n(.$=0:((0\\$1)*2u>(\\n(.lu-\\n(.iu)) .TP
+.el .TP "\\$1"
+..
+.TH UPGRADEPKG 8 "31 May 2002" "Slackware Version 8.1.0"
+.SH NAME
+upgradepkg \- upgrade Slackware packages.
+.SH SYNOPSIS
+.B upgradepkg
+[
+.B --dry-run
+]
+[
+.B --install-new
+]
+[
+.B --reinstall
+]
+[
+.B \--terse
+]
+[
+.B \--terselength <length>
+]
+[
+.B --verbose
+]
+.BI newpackagename
+.BI [ newpackagename2 ]
+.LP
+.B upgradepkg
+[
+.B --dry-run
+]
+[
+.B --install-new
+]
+[
+.B --reinstall
+]
+[
+.B \--terse
+]
+[
+.B \--terselength <length>
+]
+[
+.B --verbose
+]
+.BI oldpackagename%newpackagename
+.BI [ old2%new2 ]
+.SH DESCRIPTION
+.B upgradepkg
+upgrades a Slackware package from an older version to a
+newer one. It does this by
+.B INSTALLING
+the new package onto the system, and then
+.B REMOVING
+any files from the old package that aren't in the new package.
+If the old and new packages have the same name, a single argument is all that
+is required. If the packages have different names, supply the name of the
+old package followed by a percent symbol (%), then the name of the new package.
+Do not add any extra whitespace between pairs of old/new package names.
+.P
+Before upgrading a package, save any configuration files (such as in /etc)
+that you wish to keep. Sometimes these will be preserved, but it depends on
+the package structure. If you want to force new versions of the config files
+to be installed, remove the old ones manually prior to running upgradepkg.
+.P
+If upgradepkg finds more than one installed package matching the old package's
+name, it will remove them all.
+.TP
+To upgrade in a directory other than / (such as /mnt):
+.TP
+ROOT=/mnt upgradepkg package.txz (or .tbz, .tgz, .tlz)
+.SH OPTIONS
+.TP
+.B \--dry-run
+Output a report about which packages would be installed or upgraded
+but don't actually perform the upgrades.
+.TP
+.B \--install-new
+Normally upgradepkg only upgrades packages that are already installed on the system, and
+will skip any packages that do not already have a version installed.
+If
+.B --install-new
+is specified, the behavior is modified to install new packages in addition to upgrading
+existing ones.
+.TP
+.B \--reinstall
+Upgradepkg usually skips packages if the exact same package
+(matching name, version, arch, and build number) is already installed on the system.
+Use the --reinstall option if you want to upgrade all packages even if the same
+version is already installed.
+.TP
+.B \--terse
+Upgrade the package displaying only a single description line to stdout.
+.TP
+.B \--terselength <length>
+Maximum line length of --terse mode output. Default is the number of terminal columns.
+.TP
+.B \--verbose
+Show all the gory details of the upgrade.
+.SH AUTHOR
+Patrick J. Volkerding <volkerdi@slackware.com>
+.SH "SEE ALSO"
+.BR makepkg(8),
+.BR installpkg(8),
+.BR removepkg(8),
+.BR explodepkg(8),
+.BR pkgtool(8)
diff --git a/testing/source/pkgtools/pkgtools.SlackBuild b/testing/source/pkgtools/pkgtools.SlackBuild
new file mode 100755
index 00000000..bdcb11ac
--- /dev/null
+++ b/testing/source/pkgtools/pkgtools.SlackBuild
@@ -0,0 +1,109 @@
+#!/bin/bash
+# Copyright 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2018 Patrick J. Volkerding, Sebeka, MN, USA
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Set initial variables:
+cd $(dirname $0) ; CWD=$(pwd)
+if [ "$TMP" = "" ]; then
+ TMP=/tmp
+fi
+PKG=$TMP/package-pkgtools
+
+PKGNAM=pkgtools
+# *** UPDATE THESE WITH EACH BUILD:
+VERSION=15.0
+ARCH=${ARCH:-noarch}
+BUILD=${BUILD:-20}
+
+# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
+# the name of the created package would be, and then exit. This information
+# could be useful to other scripts.
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PKGNAM-$VERSION-$ARCH-$BUILD.txz"
+ exit 0
+fi
+
+if [ ! -d $TMP ]; then
+ mkdir -p $TMP # location to build the source
+fi
+rm -rf $PKG
+mkdir -p $PKG
+
+# Install Slackware script manpages:
+( cd $CWD/manpages
+ mkdir -p $PKG/usr/man/man8
+ for page in explodepkg.8 installpkg.8 makepkg.8 upgradepkg.8 pkgdiff.8 \
+ pkgtool.8 removepkg.8 ; do
+ cat $page | gzip -9c > $PKG/usr/man/man8/$page.gz
+ done
+)
+
+# Install internationalized manpages from
+# http://slint.fr/forSlackware/man_l10n/pkgtools/
+( cd $PKG/usr/man
+ tar xf $CWD/manpages-l10n.tar.xz
+ for page in manpages-l10n/* ; do
+ manpage=$(basename $page)
+ mkdir -p ${manpage%%.*}/man8
+ mv $page ${manpage%%.*}/man8/${page#*.}.8
+ done
+ gzip -9 */man8/*.8
+ rmdir manpages-l10n
+)
+
+# Install Slackware scripts:
+( cd $CWD/scripts
+ # Install the core Slackware package tools:
+ mkdir -p $PKG/sbin
+ # Don't include makebootdisk... it's useless since a kernel won't fit on a
+ # floppy disk, and nobody uses floppies any more anyway.
+ for file in explodepkg installpkg makepkg pkgdiff pkgtool removepkg upgradepkg ; do
+ cp -a $CWD/scripts/$file $PKG/sbin
+ done
+ chown root:root $PKG/sbin/*
+ chmod 755 $PKG/sbin/*
+ # These scripts are used during the installation:
+ mkdir -p $PKG/var/lib/pkgtools/setup/tmp
+ chmod 700 $PKG/var/lib/pkgtools/setup/tmp
+ for file in setup.* ; do
+ cp -a $file $PKG/var/lib/pkgtools/setup
+ done
+ chown root:root $PKG/var/lib/pkgtools/setup/setup.*
+ chmod 755 $PKG/var/lib/pkgtools/setup/setup.*
+ # Add a link for makebootstick:
+ ( cd $PKG/sbin ; ln -sf ../var/lib/pkgtools/setup/setup.80.make-bootdisk makebootstick )
+)
+
+# Create the base directories (not really necessary, but doesn't hurt):
+mkdir -p $PKG/var/lib/pkgtools/{packages,scripts}
+mkdir -p $PKG/var/log/pkgtools/{removed_packages,removed_scripts}
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+zcat $CWD/doinst.sh.gz > $PKG/install/doinst.sh
+
+# Build the package:
+cd $PKG
+makepkg -l y -c n $TMP/pkgtools-$VERSION-$ARCH-$BUILD.txz
+
+echo
+echo "HEY -- did you remember to update the version numbers in the setup scripts?"
+echo
+
diff --git a/testing/source/pkgtools/scripts/explodepkg b/testing/source/pkgtools/scripts/explodepkg
new file mode 100644
index 00000000..72c013d4
--- /dev/null
+++ b/testing/source/pkgtools/scripts/explodepkg
@@ -0,0 +1,109 @@
+#!/bin/sh
+# Copyright 1994, 1998, 2000 Patrick Volkerding, Concord, CA, USA
+# Copyright 2001, 2003 Slackware Linux, Inc., Concord, CA, USA
+# Copyright 2007, 2009, 2017, 2018 Patrick Volkerding, Sebeka, MN, USA
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+if [ $# = 0 ]; then
+ cat << EOF
+Usage: explodepkg package_name [package_name2, ...]
+
+Explodes a Slackware compatible software package
+(or any tar+{gzip,bzip2,lz,xz archive) in the current directory.
+Equivalent to (for each package listed):
+
+ ( umask 000 ; cat package_name | COMPRESSOR -dc | tar xpvf package_name )
+
+Note: This should only be used for debugging or examining packages, not for
+installing them. It doesn't execute installation scripts or update the package
+indexes in /var/lib/pkgtools/packages and /var/lib/pkgtools/scripts.
+
+EOF
+fi
+
+# Set maximum number of threads to use. By default, this will be the number
+# of CPU threads:
+THREADS="$(nproc)"
+
+# Main loop:
+for PKG in $* ; do
+ echo "Exploding package $PKG in current directory:"
+ # Determine extension:
+ packageext="$( echo $PKG | rev | cut -f 1 -d . | rev)"
+ # Determine compression utility:
+ case $packageext in
+ 'tgz' )
+ packagecompression=gzip
+ ;;
+ 'gz' )
+ packagecompression=gzip
+ ;;
+ 'tbz' )
+ if which lbzip2 1> /dev/null 2> /dev/null ; then
+ packagecompression=lbzip2
+ else
+ packagecompression=bzip2
+ fi
+ ;;
+ 'bz2' )
+ if which lbzip2 1> /dev/null 2> /dev/null ; then
+ packagecompression=lbzip2
+ else
+ packagecompression=bzip2
+ fi
+ ;;
+ 'tlz' )
+ if which plzip 1> /dev/null 2> /dev/null ; then
+ packagecompression="plzip --threads=${THREADS}"
+ elif which lzip 1> /dev/null 2> /dev/null ; then
+ packagecompression=lzip
+ else
+ echo "ERROR: lzip compression utility not found in \$PATH."
+ exit 3
+ fi
+ ;;
+ 'lz' )
+ if which plzip 1> /dev/null 2> /dev/null ; then
+ packagecompression="plzip --threads=${THREADS}"
+ elif which lzip 1> /dev/null 2> /dev/null ; then
+ packagecompression=lzip
+ else
+ echo "ERROR: lzip compression utility not found in \$PATH."
+ exit 3
+ fi
+ ;;
+ 'lzma' )
+ packagecompression=lzma
+ ;;
+ 'txz' )
+ packagecompression="xz --threads=${THREADS}"
+ ;;
+ 'xz' )
+ packagecompression="xz --threads=${THREADS}"
+ ;;
+ esac
+ ( umask 000 ; cat $PKG | $packagecompression -dc | tar --xattrs --xattrs-include='*' --keep-directory-symlink -xpvf - 2> /dev/null )
+ if [ -r install/doinst.sh ]; then
+ echo
+ echo "An installation script was detected in ./install/doinst.sh, but"
+ echo "was not executed."
+ fi
+done
+
diff --git a/testing/source/pkgtools/scripts/installpkg b/testing/source/pkgtools/scripts/installpkg
new file mode 100644
index 00000000..0d82f89c
--- /dev/null
+++ b/testing/source/pkgtools/scripts/installpkg
@@ -0,0 +1,713 @@
+#!/bin/sh
+# Copyright 1994, 1998, 2000 Patrick Volkerding, Concord, CA, USA
+# Copyright 2001, 2003 Slackware Linux, Inc., Concord, CA, USA
+# Copyright 2007, 2009, 2011, 2017, 2018 Patrick Volkerding, Sebeka, MN, USA
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# Mon Jun 4 21:17:58 UTC 2018
+# Migrate the package database and directories from /var/log to
+# /var/lib/pkgtools. /var/log was never a good place for this data, as it is
+# considered by many to be a directory that could be wiped to free up some
+# space. Originally the package database was in /var/adm, but the FSSTND
+# (later FHS) group decided that directory should be a symlink to /var/log,
+# and I went along with that since it was years ago and I was a n00b and didn't
+# know any better. /var/lib/pkgtools will be a better and safer location.
+#
+# Thu May 24 20:23:55 UTC 2018
+# Added --terselength option to set the line length in --terse mode.
+# Allow adding NOLOCK in an install script to allow it to run without locking.
+#
+# Sat May 19 22:42:03 UTC 2018
+# Implement locking to prevent screen output or install script collisions if
+# multiple copies of installpkg are running simultaneously.
+# Use ${MCOOKIE} instead of $$ (might as well, since we already generated it).
+#
+# Tue Apr 17 17:26:44 UTC 2018
+# Quit with the funny business in /install. Note however that /install still
+# isn't a safe directory to use in a package for anything other than package
+# metadata. Other files placed there are going to be left on the system in
+# /installpkg-$(mcookie). That could be worked around, but we'll wait until
+# someone reports there is a need. The main reason to do this is that /install
+# was a collision point if more than one copy of installpkg was running at
+# once. With this change, the pkgtools are (more or less) thread-safe.
+#
+# Tue Feb 13 01:19:46 UTC 2018
+# Use recent tar, and support restoring POSIX ACLs and extended attributes.
+#
+# Tue Dec 12 21:49:48 UTC 2017
+# If possible, use multiple decompression threads.
+#
+# Thu Dec 7 04:09:17 UTC 2017
+# Change meaning of .tlz to tar.lz (lzip)
+#
+# Sun Sep 6 21:58:36 BST 2009
+# Replaced usage of "cat" with STDIN redirection or file name parameters
+# to speed up execution on ARM.
+# Replaced pkgbase & package_name code with 'sed' script by Jim Hawkins.
+#
+# Sat Apr 25 21:18:53 UTC 2009
+# Converted to use new pkgbase() function to remove pathname and
+# valid package extensions.
+#
+# Sat Apr 4 22:58:06 CDT 2009
+# Support additional compression formats if the supporting utilities exist:
+# .tbz - bzip2
+# .tlz - lzma
+# .txz - xz (also LZMA)
+# And of course, .tgz (gzip) is not going anywhere. :-) <volkerdi>
+# Add command switches to determine the uncompressed package size even if
+# that will slow things down, and to add the package's md5sum to the
+# metadata stored in /var/log/packages/.
+#
+# Fri Dec 21 17:21:35 CST 2007
+# Added a patch from Johnny Morano to work around package removal issues
+# caused by packages that do not comply with FHS combined with a grep
+# regex error in installpkg. Any package with a single-letter top-
+# level directory could not be removed.
+#
+# Shortened some of the top-line dialog output to avoid overflowing the
+# textbox (needed as some of the packages, especially in X, have very
+# long base package names now). <pjv>
+#
+# Sun Nov 26 12:38:25 CST 1995
+# Added patch from Glenn Moloney <glenn@physics.unimelb.edu.au> to allow
+# packages to be installed to directories other than /.
+#
+# Wed Mar 18 15:15:51 CST 1998
+# Changed $TMP directory to /var/log/setup/tmp, and chmod'ed it 700 to close
+# some security holes.
+
+# Return a package name that has been stripped of the dirname portion
+# and any of the valid extensions (only):
+pkgbase() {
+ # basename + strip extensions .tbz, .tgz, .tlz and .txz
+ echo "$1" | sed 's?.*/??;s/\.t[bglx]z$//'
+}
+
+# If installpkg encounters a problem, it will return a non-zero error code.
+# If it finds more than one problem (i.e. with a list of packages) you'll only
+# hear about the most recent one. :)
+# 1 = tar returned error code
+# 2 = corrupt compression envelope
+# 3 = does not end in .tgz
+# 4 = no such file
+# 5 = external compression utility missing
+# 99 = user abort from menu mode
+EXITSTATUS=0
+
+# Do not store md5sums by default:
+MD5SUM=0
+
+# So that we know what to expect...
+umask 022
+
+# If we have mcookie and a tar that is recent enough to support --transform,
+# then we can stop needlessly erasing files in the /install directory while
+# also making installpkg thread-safe. Don't check for recent tar - we'll
+# already break from --attrs and --xattrs anyway if the wrong tar is used.
+if which mcookie 1> /dev/null 2> /dev/null ; then
+ MCOOKIE=$(mcookie)
+ INSTDIR=installpkg-${MCOOKIE}
+else
+ # Well, we will make due with this:
+ MCOOKIE=$$
+ INSTDIR=installpkg-${MCOOKIE}
+fi
+
+# Create a lockfile directory if it doesn't exist. We can use it to prevent
+# screen corruption (from multiple dialogs) and install script collisions
+# (from multiple scripts trying to work on the same files) in the case of
+# parallel instances of installpkg.
+INSTLOCKDIR=${INSTLOCKDIR:-/run/lock/pkgtools}
+if [ ! -d $INSTLOCKDIR ]; then
+ mkdir -p $INSTLOCKDIR
+fi
+
+usage() {
+ cat << EOF
+Usage: installpkg [options] <package_filename>
+
+Installpkg is used to install a .t{gz,bz,lz,xz} package like this:
+ installpkg slackware-package-1.0.0-i486-1.tgz (or .tbz, .tlz, .txz)
+
+options: --warn (warn if files will be overwritten, but do not install)
+ --root /mnt (install someplace else, like /mnt)
+ --infobox (use dialog to draw an info box)
+ --terse (display a one-line short description for install)
+ --terselength <length> (line length in terse mode - default is
+ the number of columns available)
+ --menu (confirm package installation with a menu, unless
+ the priority is [required] or ADD)
+ --ask (used with menu mode: always ask if a package should be
+ installed regardless of what the package's priority is)
+ --priority ADD|REC|OPT|SKP (provide a priority for the entire
+ package list to use instead of the priority in the
+ tagfile)
+ --tagfile /somedir/tagfile (specify a different file to use
+ for package priorities. The default is "tagfile" in
+ the package's directory)
+ --threads <number> For xz/plzip compressed packages, set the max
+ number of threads to be used for decompression. Only has
+ an effect if a multithreaded compressor was used, and then
+ only on large packages. For plzip, the default is equal to
+ the number of CPU threads available on the machine. For xz,
+ the default is equal to 2.
+ --md5sum (record the package's md5sum in the metadata file)
+
+EOF
+}
+
+# Eliminate whitespace function:
+crunch() {
+ while read FOO ; do
+ echo $FOO
+ done
+}
+
+# Strip version, architecture and build from the end of the name
+package_name() {
+ pkgbase $1 | sed 's?-[^-]*-[^-]*-[^-]*$??'
+}
+
+# Set maximum number of threads to use. By default, this will be the number
+# of CPU threads:
+THREADS="$(nproc)"
+
+# Set default line length for terse mode:
+if tty -s && which tput 1> /dev/null 2> /dev/null ; then
+ TERSELENGTH=$(tput cols)
+else
+ TERSELENGTH=80
+fi
+
+# Default install mode is standard text mode:
+MODE=install
+# If $TERSE is set to 0 in the environment, then use terse mode:
+if [ "$TERSE" = "0" ]; then
+ MODE=terse
+fi
+
+# Parse options:
+while [ 0 ]; do
+ if [ "$1" = "-warn" -o "$1" = "--warn" ]; then
+ MODE=warn
+ shift 1
+ elif [ "$1" = "-md5sum" -o "$1" = "--md5sum" ]; then
+ MD5SUM=1
+ shift 1
+ elif [ "$1" = "-infobox" -o "$1" = "--infobox" ]; then
+ MODE=infobox
+ shift 1
+ elif [ "$1" = "-terse" -o "$1" = "--terse" ]; then
+ MODE=terse
+ shift 1
+ elif [ "$1" = "-terselength" -o "$1" = "--terselength" ]; then
+ TERSELENGTH=$2
+ shift 2
+ elif [ "$1" = "-menu" -o "$1" = "--menu" ]; then
+ MODE=menu
+ shift 1
+ elif [ "$1" = "-ask" -o "$1" = "--ask" ]; then
+ ALWAYSASK="yes"
+ shift 1
+ elif [ "$1" = "-tagfile" -o "$1" = "--tagfile" ]; then
+ if [ -r "$2" ]; then
+ USERTAGFILE="$2"
+ elif [ -r "$(pwd)/$2" ]; then
+ USERTAGFILE="$(pwd)/$2"
+ else
+ usage
+ exit
+ fi
+ shift 2
+ elif [ "$1" = "-threads" -o "$1" = "--threads" ]; then
+ THREADS="$2"
+ shift 2
+ # xz has not yet implemented multi-threaded decompression.
+ # Who knows if or how well it will work...
+ XZ_THREADS_FORCED=yes
+ elif [ "$1" = "-priority" -o "$1" = "--priority" ]; then
+ if [ "$2" = "" ]; then
+ usage
+ exit
+ fi
+ USERPRIORITY="$2"
+ shift 2
+ elif [ "$1" = "-root" -o "$1" = "--root" ]; then
+ if [ "$2" = "" ]; then
+ usage
+ exit
+ fi
+ ROOT="$2"
+ shift 2
+ else
+ break
+ fi
+done
+
+# Set the prefix for the package database directories (packages, scripts).
+ADM_DIR="$ROOT/var/lib/pkgtools"
+
+# Set the prefix for the removed packages/scripts log files:
+LOG_DIR="$ROOT/var/log/pkgtools"
+
+# If the directories don't exist, "initialize" the package database:
+for PKGDBDIR in packages scripts setup ; do
+ if [ ! -d $ADM_DIR/$PKGDBDIR ]; then
+ mkdir -p $ADM_DIR/$PKGDBDIR
+ chmod 755 $ADM_DIR/$PKGDBDIR
+ fi
+done
+for PKGLOGDIR in removed_packages removed_scripts ; do
+ if [ ! -d $LOG_DIR/$PKGLOGDIR ]; then
+ rm -rf $LOG_DIR/$PKGLOGDIR # make sure it's not a symlink or something stupid
+ mkdir -p $LOG_DIR/$PKGLOGDIR
+ chmod 755 $LOG_DIR/$PKGLOGDIR
+ fi
+done
+# Likewise, make sure that the symlinks in /var/log exist. We no longer
+# trust anything to remain in /var/log. Let the admin wipe it if that's
+# what they like.
+for symlink in packages scripts setup ; do
+ if [ ! -L $LOG_DIR/../$symlink -a ! -d $LOG_DIR/../$symlink ]; then
+ ( cd $LOG_DIR/.. ; ln -sf ../lib/pkgtools/$symlink . )
+ fi
+done
+
+# Make sure there's a proper temp directory:
+TMP=$ADM_DIR/setup/tmp
+# If the $TMP directory doesn't exist, create it:
+if [ ! -d $TMP ]; then
+ mkdir -p $TMP
+ chmod 700 $TMP # no need to leave it open
+fi
+
+# usage(), exit if called with no arguments:
+if [ $# = 0 ]; then
+ usage;
+ exit
+fi
+
+# If -warn mode was requested, produce the output and then exit:
+if [ "$MODE" = "warn" ]; then
+ while [ -f "$1" ]; do
+ mkdir -p $TMP/scan${MCOOKIE}
+ # Determine extension:
+ packageext="$( echo $1 | rev | cut -f 1 -d . | rev)"
+ # Determine decompressor utility:
+ case $packageext in
+ 'tgz' )
+ packagecompression=gzip
+ ;;
+ 'tbz' )
+ if which lbzip2 1> /dev/null 2> /dev/null ; then
+ packagecompression=lbzip2
+ else
+ packagecompression=bzip2
+ fi
+ ;;
+ 'tlz' )
+ if which plzip 1> /dev/null 2> /dev/null ; then
+ packagecompression="plzip --threads=${THREADS}"
+ elif which lzip 1> /dev/null 2> /dev/null ; then
+ packagecompression=lzip
+ else
+ echo "ERROR: lzip compression utility not found in \$PATH."
+ exit 3
+ fi
+ ;;
+ 'txz' )
+ if [ ! "$XZ_THREADS_FORCED" = "yes" ]; then
+ packagecompression="xz --threads=${THREADS}"
+ else
+ packagecompression="xz --threads=2"
+ fi
+ ;;
+ esac
+ ( cd $TMP/scan${MCOOKIE} ; $packagecompression -dc | tar xf - install ) < $1 2> /dev/null
+ if [ -r $TMP/scan${MCOOKIE}/install/doinst.sh ]; then
+ if grep ' rm -rf ' $TMP/scan${MCOOKIE}/install/doinst.sh 1>/dev/null 2>/dev/null ; then
+ grep ' rm -rf ' $TMP/scan${MCOOKIE}/install/doinst.sh > $TMP/scan${MCOOKIE}/install/delete
+ for f in `cat $TMP/scan${MCOOKIE}/install/delete | cut -f 3,7 -d ' ' | tr ' ' '/'`; do
+ f="/$f"
+ if [ -f "$f" -o -L "$f" ]; then
+ echo "$f"
+ fi
+ done
+ fi
+ if [ -d $TMP/scan${MCOOKIE} ]; then
+ ( cd $TMP/scan${MCOOKIE} ; rm -rf install ) 2> /dev/null
+ ( cd $TMP ; rmdir scan${MCOOKIE} ) 2> /dev/null
+ fi
+ fi
+ for f in `( $packagecompression -dc | tar tf - ) < $1 | grep -v 'drwx'`; do
+ f="/$f"
+ if [ -f "$f" -o -L "$f" ]; then
+ echo "$f"
+ fi
+ done
+ shift 1
+ done
+ exit
+fi
+
+# Main loop:
+for package in $* ; do
+
+ # Simple package integrity check:
+ if [ ! -f $package ]; then
+ EXITSTATUS=4
+ if [ "$MODE" = "install" ]; then
+ echo "Cannot install $package: file not found"
+ fi
+ continue;
+ fi
+
+ # "shortname" isn't really THAT short...
+ # it's just the full name without ".t{gz,bz,lz,xz}"
+ shortname="$(pkgbase $package)"
+ packagedir="$(dirname $package)"
+ # This is the base package name, used for grepping tagfiles and descriptions:
+ packagebase="$(package_name $shortname)"
+
+ # Reject package if it does not end in '.t{gz,bz,lz,xz}':
+ if [ "$shortname" = "$(basename $package)" ]; then
+ EXITSTATUS=3
+ if [ "$MODE" = "install" ]; then
+ echo "Cannot install $package: file does not end in .tgz, .tbz, .tlz, or .txz"
+ fi
+ continue;
+ fi
+
+ # Determine extension:
+ packageext="$(echo $package | rev | cut -f 1 -d . | rev)"
+
+ # Determine compressor utility:
+ case $packageext in
+ 'tgz' )
+ packagecompression=gzip
+ ;;
+ 'tbz' )
+ if which lbzip2 1> /dev/null 2> /dev/null ; then
+ packagecompression=lbzip2
+ else
+ packagecompression=bzip2
+ fi
+ ;;
+ 'tlz' )
+ if which plzip 1> /dev/null 2> /dev/null ; then
+ packagecompression="plzip --threads=${THREADS}"
+ elif which lzip 1> /dev/null 2> /dev/null ; then
+ packagecompression=lzip
+ else
+ echo "ERROR: lzip compression utility not found in \$PATH."
+ exit 3
+ fi
+ ;;
+ 'txz' )
+ if [ ! "$XZ_THREADS_FORCED" = "yes" ]; then
+ packagecompression="xz --threads=${THREADS}"
+ else
+ packagecompression="xz --threads=2"
+ fi
+ ;;
+ esac
+
+ # Test presence of external compression utility:
+ if ! $(echo $packagecompression | cut -f 1 -d ' ') --help 1> /dev/null 2> /dev/null ; then
+ EXITSTATUS=5
+ if [ "$MODE" = "install" ]; then
+ echo "Cannot install $package: external compression utility $packagecompression missing"
+ fi
+ continue;
+ fi
+
+ # Determine package's priority:
+ unset PRIORITY
+ if [ "$USERTAGFILE" = "" ]; then
+ TAGFILE="$packagedir/tagfile"
+ else
+ TAGFILE="$USERTAGFILE"
+ fi
+ if [ ! -r "$TAGFILE" ]; then
+ TAGFILE=/dev/null
+ fi
+ if grep "^$packagebase:" "$TAGFILE" | grep ADD > /dev/null 2> /dev/null ; then
+ PRIORITY="ADD"
+ elif grep "^$packagebase:" "$TAGFILE" | grep REC > /dev/null 2> /dev/null ; then
+ PRIORITY="REC"
+ elif grep "^$packagebase:" "$TAGFILE" | grep OPT > /dev/null 2> /dev/null ; then
+ PRIORITY="OPT"
+ elif grep "^$packagebase:" "$TAGFILE" | grep SKP > /dev/null 2> /dev/null ; then
+ PRIORITY="SKP"
+ fi
+ if [ "$PRIORITY" = "ADD" ]; then
+ PMSG="[ADD]"
+ elif [ "$PRIORITY" = "REC" ]; then
+ PMSG="[REC]"
+ elif [ "$PRIORITY" = "OPT" ]; then
+ PMSG="[OPT]"
+ elif [ "$PRIORITY" = "SKP" ]; then
+ PMSG="[SKP]"
+ else
+ PMSG=""
+ fi
+
+ # If a tagfile wants this package to be skipped, do that now before
+ # wasting any more CPU on it:
+ if [ "$PRIORITY" = "SKP" -a ! "$ALWAYSASK" = "yes" ]; then
+ continue # next package
+ fi
+
+ # Figure out some package information, like the compressed and uncompressed
+ # sizes, and where to find the package description:
+ COMPRESSED="$(/bin/du -sh "$(readlink -f $package)" | cut -f 1)"
+ DESCRIPTION=""
+ # First check for .txt file next to the package, since this is faster:
+ if grep "^$packagebase:" "$packagedir/$shortname.txt" 1> /dev/null 2> /dev/null ; then
+ DESCRIPTION="$packagedir/$shortname.txt"
+ elif grep "^$shortname:" "$packagedir/$shortname.txt" 1> /dev/null 2> /dev/null ; then
+ DESCRIPTION="$packagedir/$shortname.txt"
+ fi
+
+ # Test tarball integrity and get uncompressed package size:
+ if [ "$MODE" = "install" ]; then
+ echo "Verifying package $(basename $package)."
+ fi
+ # The stray cat reduces the frequency of the lack of reported size.
+ # If it still fails, we hit it with a bigger hammer down below.
+ cat $package | $packagecompression -dc | LC_ALL=C dd 2> $TMP/tmpsize${MCOOKIE} | cat | tar tf - 2> /dev/null 1> $TMP/tmplist${MCOOKIE}
+ TARERROR=$?
+ if [ ! "$TARERROR" = "0" ]; then
+ EXITSTATUS=1 # tar file corrupt
+ if [ "$MODE" = "install" ]; then
+ echo "Unable to install $package: tar archive is corrupt (tar returned error code $TARERROR)"
+ fi
+ rm -f $TMP/tmplist${MCOOKIE} $TMP/tmpsize${MCOOKIE}
+ continue
+ fi
+ UNCOMPRESSED="$(cat $TMP/tmpsize${MCOOKIE} | tail -n 1 | cut -f 1 -d ' ' | numfmt --to=iec)"
+ # Weird bug "fix". Sometimes we get no uncompressed size (this started when we
+ # moved away from tar-1.13, but I don't see what that could have to do with
+ # it). So, if we have no uncompressed size here, demand it in this loop.
+ # Hopefully the bug is not weird enough to make this an infinite loop. :/
+ while [ "$UNCOMPRESSED" = "" ]; do
+ cat $package | $packagecompression -dc | LC_ALL=C dd 1> /dev/null 2> $TMP/tmpsize${MCOOKIE}
+ UNCOMPRESSED="$(cat $TMP/tmpsize${MCOOKIE} | tail -n 1 | cut -f 1 -d ' ' | numfmt --to=iec)"
+ done
+ rm -f $TMP/tmpsize${MCOOKIE}
+
+ # If we still don't have a package description, look inside the package.
+ # This requires a costly untar.
+ if [ "$DESCRIPTION" = "" ]; then
+ mkdir -p $TMP/scan${MCOOKIE}
+ ( cd $TMP/scan${MCOOKIE} ; $packagecompression -dc | tar xf - install ) < $package 2> /dev/null
+ if grep "^$packagebase:" "$TMP/scan${MCOOKIE}/install/slack-desc" 1> /dev/null 2> /dev/null ; then
+ DESCRIPTION="$TMP/scan${MCOOKIE}/install/slack-desc"
+ elif grep "^$shortname:" "$TMP/scan${MCOOKIE}/install/slack-desc" 1> /dev/null 2> /dev/null ; then
+ DESCRIPTION="$TMP/scan${MCOOKIE}/install/slack-desc"
+ fi
+ fi
+
+ if [ "$DESCRIPTION" = "" ]; then
+ #echo "WARNING NO SLACK-DESC"
+ DESCRIPTION="/dev/null"
+ fi
+
+ # Gather package infomation into a temporary file:
+ grep "^$packagebase:" $DESCRIPTION | cut -f 2- -d : | cut -b2- 1> $TMP/tmpmsg${MCOOKIE} 2> /dev/null
+ if [ "$shortname" != "$packagebase" ]; then
+ grep "^$shortname:" $DESCRIPTION | cut -f 2- -d : | cut -b2- 1>> $TMP/tmpmsg${MCOOKIE} 2> /dev/null
+ fi
+ # Adjust the length here. This allows a slack-desc to be any size up to 13 lines instead of fixed at 11.
+ LENGTH=$(wc -l < $TMP/tmpmsg${MCOOKIE} )
+ while [ $LENGTH -lt 12 ]; do
+ echo >> $TMP/tmpmsg${MCOOKIE}
+ LENGTH=$(expr $LENGTH + 1)
+ done
+ echo "Size: Compressed: ${COMPRESSED}, uncompressed: ${UNCOMPRESSED}." >> $TMP/tmpmsg${MCOOKIE}
+ # For recent versions of dialog it is necessary to add \n to the end of each line
+ # or it will remove repeating spaces and mess up our careful formatting:
+ cat << EOF > $TMP/controlns${MCOOKIE}
+\n
+\n
+\n
+\n
+\n
+\n
+\n
+\n
+\n
+\n
+\n
+\n
+\n
+EOF
+ paste -d "" $TMP/tmpmsg${MCOOKIE} $TMP/controlns${MCOOKIE} > $TMP/pasted${MCOOKIE}
+ rm -f $TMP/controlns${MCOOKIE}
+ mv $TMP/pasted${MCOOKIE} $TMP/tmpmsg${MCOOKIE}
+ # Emit information to the console:
+ if [ "$MODE" = "install" ]; then
+ if [ "$PMSG" = "" ]; then
+ echo "Installing package $(basename $package):"
+ else
+ echo "Installing package $(basename $package) $PMSG:"
+ fi
+ echo "PACKAGE DESCRIPTION:"
+ grep "^$packagebase:" $DESCRIPTION | uniq | sed "s/^$packagebase:/#/g"
+ if [ "$shortname" != "$packagebase" ]; then
+ grep "^$shortname:" $DESCRIPTION | uniq | sed "s/^$shortname:/#/g"
+ fi
+ elif [ "$MODE" = "terse" ]; then # emit a single description line
+ ( flock 9 || exit 11
+ printf "%-$(expr $TERSELENGTH - 7)s %-6s\n" "$(echo $shortname: $(echo $(cat $DESCRIPTION | grep "^$packagebase:" | sed "s/^$packagebase: //g" | head -n 1 | tr -d '()' | sed "s/^$packagebase //g" ) $(echo " $(printf '.%.0s' {1..256})")) | cut -b1-$(expr $TERSELENGTH - 7))" "$(printf "[%4s]" $UNCOMPRESSED)" | cut -b 1-${TERSELENGTH}
+ ) 9> $INSTLOCKDIR/dialog.lock
+ elif [ "$MODE" = "infobox" ]; then # install infobox package
+ ( flock 9 || exit 11
+ dialog --title "Installing package $shortname $PMSG" --infobox "$(cat $TMP/tmpmsg${MCOOKIE})" 0 0
+ ) 9> $INSTLOCKDIR/dialog.lock
+ elif [ "$MODE" = "menu" -a "$PRIORITY" = "ADD" -a ! "$ALWAYSASK" = "yes" ]; then # ADD overrides menu mode unless -ask was used
+ ( flock 9 || exit 11
+ dialog --title "Installing package $shortname $PMSG" --infobox "$(cat $TMP/tmpmsg${MCOOKIE})" 0 0
+ ) 9> $INSTLOCKDIR/dialog.lock
+ elif [ "$MODE" = "menu" -a "$USERPRIORITY" = "ADD" ]; then # install no matter what $PRIORITY
+ ( flock 9 || exit 11
+ dialog --title "Installing package $shortname $PMSG" --infobox "$(cat $TMP/tmpmsg${MCOOKIE})" 0 0
+ ) 9> $INSTLOCKDIR/dialog.lock
+ else # we must need a full menu:
+ ( flock 9 || exit 11
+ dialog --title "Package Name: $shortname $PMSG" --menu "$(cat $TMP/tmpmsg${MCOOKIE})" 0 0 3 \
+ "Yes" "Install package $shortname" \
+ "No" "Do not install package $shortname" \
+ "Quit" "Abort software installation completely" 2> $TMP/reply${MCOOKIE}
+ if [ ! $? = 0 ]; then
+ echo "No" > $TMP/reply${MCOOKIE}
+ fi
+ ) 9> $INSTLOCKDIR/dialog.lock
+ REPLY="$(cat $TMP/reply${MCOOKIE})"
+ rm -f $TMP/reply${MCOOKIE} $TMP/tmpmsg${MCOOKIE}
+ if [ "$REPLY" = "Quit" ]; then
+ exit 99 # EXIT STATUS 99 = ABORT!
+ elif [ "$REPLY" = "No" ]; then
+ continue # skip the package
+ fi
+ fi
+
+ # Make sure there are no symbolic links sitting in the way of
+ # incoming package files:
+ grep -v "/$" $TMP/tmplist${MCOOKIE} | while read file ; do
+ if [ -L "$ROOT/$file" ]; then
+ rm -f "$ROOT/$file"
+ fi
+ done
+ rm -f $TMP/tmplist${MCOOKIE}
+
+ # Write the package file database entry and install the package:
+ echo "PACKAGE NAME: $shortname" > $ADM_DIR/packages/$shortname
+ echo "COMPRESSED PACKAGE SIZE: $COMPRESSED" >> $ADM_DIR/packages/$shortname
+ echo "UNCOMPRESSED PACKAGE SIZE: $UNCOMPRESSED" >> $ADM_DIR/packages/$shortname
+ echo "PACKAGE LOCATION: $package" >> $ADM_DIR/packages/$shortname
+ # Record the md5sum if that's a selected option:
+ if [ $MD5SUM = 1 ]; then
+ echo "PACKAGE MD5SUM: $(md5sum $package | cut -f 1 -d ' ')" >> $ADM_DIR/packages/$shortname
+ fi
+ echo "PACKAGE DESCRIPTION:" >> $ADM_DIR/packages/$shortname
+ grep "^$packagebase:" $DESCRIPTION >> $ADM_DIR/packages/$shortname 2> /dev/null
+ if [ "$shortname" != "$packagebase" ]; then
+ grep "^$shortname:" $DESCRIPTION >> $ADM_DIR/packages/$shortname 2> /dev/null
+ fi
+ echo "FILE LIST:" >> $ADM_DIR/packages/$shortname
+ if [ "$INSTDIR" = "install" ]; then
+ ( cd $ROOT/ ; $packagecompression -dc | tar --acls --xattrs --xattrs-include='*' --keep-directory-symlink -xpvf - | LC_ALL=C sort ) < $package >> $TMP/$shortname 2> /dev/null
+ else
+ ( cd $ROOT/ ; $packagecompression -dc | tar --transform "s,^install$,$INSTDIR," --transform "s,^install/,$INSTDIR/," --acls --xattrs --xattrs-include='*' --keep-directory-symlink -xpvf - | LC_ALL=C sort ) < $package >> $TMP/$shortname 2> /dev/null
+ fi
+ if [ "$( grep '^\./' $TMP/$shortname | wc -l | tr -d ' ')" = "1" ]; then
+ # Good. We have a package that meets the Slackware spec.
+ cat $TMP/$shortname >> $ADM_DIR/packages/$shortname
+ else
+ # Some dumb bunny built a package with something other than makepkg. Bad!
+ # Oh well. Bound to happen. Par for the course. Fix it and move on...
+ # We'll assume it's just a recent tar with an unfiltered filelist with all
+ # files prefixed with "./". No guarantees, but this will usually work.
+ cat $TMP/$shortname | sed '2,$s,^\./,,' >> $ADM_DIR/packages/$shortname
+ fi
+ rm -f $TMP/$shortname
+
+ # It's a good idea to make sure those newly installed libraries are properly
+ # activated for use, unless ROOT is pointing somewhere else in which case
+ # running ldconfig on the host system won't make any difference:
+ if [ "$ROOT" = "" ] && [ -x /sbin/ldconfig ]; then
+ ( flock 9 || exit 11
+ /sbin/ldconfig 2> /dev/null
+ ) 9> $INSTLOCKDIR/ldconfig.lock
+ fi
+
+ if [ -f $ROOT/$INSTDIR/doinst.sh ]; then
+ if [ "$MODE" = "install" ]; then
+ echo "Executing install script for $(basename $package)."
+ fi
+ # Don't use locking if the script contains "NOLOCK":
+ if grep -q NOLOCK $ROOT/$INSTDIR/doinst.sh ; then
+ # If bash is available, use sed to convert the install script to use pushd/popd
+ # rather than spawning subshells which is slow on ARM. This will also speed up
+ # install script processing on any platform.
+ if [ -x /bin/bash ]; then
+ cd $ROOT/ ; sed -e's?^( cd \([^;]*\);\(.*\) )$?pushd \1 \&\> /dev/null ; \2 ; popd \&\> /dev/null?g ' $INSTDIR/doinst.sh | /bin/bash
+ else
+ cd $ROOT/ ; sh $INSTDIR/doinst.sh
+ fi
+ else # use locking
+ # If bash is available, use sed to convert the install script to use pushd/popd
+ # rather than spawning subshells which is slow on ARM. This will also speed up
+ # install script processing on any platform.
+ if [ -x /bin/bash ]; then
+ ( flock 9 || exit 11
+ cd $ROOT/ ; sed -e's?^( cd \([^;]*\);\(.*\) )$?pushd \1 \&\> /dev/null ; \2 ; popd \&\> /dev/null?g ' $INSTDIR/doinst.sh | /bin/bash
+ ) 9> $INSTLOCKDIR/doinst.sh.lock
+ else
+ ( flock 9 || exit 11
+ cd $ROOT/ ; sh $INSTDIR/doinst.sh
+ ) 9> $INSTLOCKDIR/doinst.sh.lock
+ fi
+ fi
+ fi
+ # Clean up the mess...
+ if [ -d $ROOT/$INSTDIR ]; then
+ if [ -r $ROOT/$INSTDIR/doinst.sh ]; then
+ cp $ROOT/$INSTDIR/doinst.sh $ADM_DIR/scripts/$shortname
+ chmod 755 $ADM_DIR/scripts/$shortname
+ fi
+ # /install/doinst.sh and /install/slack-* are reserved locations for the package system.
+ # Heh, not any more with a recent tar :-)
+ ( cd $ROOT/$INSTDIR ; rm -f doinst.sh slack-* 1> /dev/null 2>&1 )
+ rmdir $ROOT/$INSTDIR 1> /dev/null 2>&1
+ fi
+ # If we used a scan directory, get rid of it:
+ if [ -d "$TMP/scan${MCOOKIE}" ]; then
+ rm -rf "$TMP/scan${MCOOKIE}"
+ fi
+ rm -f $TMP/tmpmsg${MCOOKIE} $TMP/reply${MCOOKIE}
+ if [ "$MODE" = "install" ]; then
+ echo "Package $(basename $package) installed."
+ fi
+done
+
+exit $EXITSTATUS
diff --git a/testing/source/pkgtools/scripts/makebootdisk b/testing/source/pkgtools/scripts/makebootdisk
new file mode 100644
index 00000000..79379618
--- /dev/null
+++ b/testing/source/pkgtools/scripts/makebootdisk
@@ -0,0 +1,443 @@
+#!/bin/sh
+# Copyright 1995, 1998, 2002, 2005 Patrick Volkerding, Moorhead, Minnesota USA
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+if [ ! "$UID" = "0" ]; then
+ echo "You need to be root to run this script."
+ exit 1
+fi
+
+# Was a kernel specified on the command line?
+if [ -r "$1" ]; then
+ KERNEL=$1
+ KMSG="Using kernel $KERNEL"
+else
+ KMSG="No kernel selected yet"
+fi
+
+# Make sure there's a proper temp directory:
+TMP=/var/lib/pkgtools/setup/tmp
+# If the $TMP directory doesn't exist, create it:
+if [ ! -d $TMP ]; then
+ mkdir -p $TMP
+ chmod 700 $TMP # no need to leave it open
+fi
+
+ROOT_DEVICE="`mount | grep ' on / ' | cut -f 1 -d ' '`"
+
+if mount | grep ' on / ' | grep umsdos 1> /dev/null 2> /dev/null ; then
+ MOUNT="read-write"
+else
+ MOUNT="read-only"
+fi
+
+make_root_device() {
+# Make a device:
+makedev() {
+ if [ ! -b $1 ]; then
+ mknod $1 b $2 $3
+ chown root.disk $1
+ chmod 640 $1
+ fi
+}
+
+# Make ide device
+# make ide major minor hd1 hd2 (2 base devs for major)
+make_ide() {
+ # Handle base devices:
+ if [ "$2" = "0" ]; then
+ makedev $TMP/lilo/dev/$3 $1 $2
+ return 0
+ elif [ "$2" = "64" ]; then
+ makedev $TMP/lilo/dev/$4 $1 $2
+ return 0
+ fi
+ # Must be a partition:
+ if [ "`expr $2 / 64`" = "0" ]; then
+ DEV=$3
+ NUM=$2
+ else
+ DEV=$4
+ NUM=`expr $2 - 64`
+ fi
+ makedev $TMP/lilo/dev/$DEV$NUM $1 $2
+}
+
+# Make SCSI device
+make_scsi() {
+ # find drive # 0 - 15
+ DRV=`expr $1 / 16`
+ NUM=`expr $1 % 16`
+ if [ "$NUM" = "0" ]; then
+ NUM=""
+ fi
+ if [ "$DRV" = "0" ]; then
+ makedev $TMP/lilo/dev/sda$NUM 8 $1
+ elif [ "$DRV" = "1" ]; then
+ makedev $TMP/lilo/dev/sdb$NUM 8 $1
+ elif [ "$DRV" = "2" ]; then
+ makedev $TMP/lilo/dev/sdc$NUM 8 $1
+ elif [ "$DRV" = "3" ]; then
+ makedev $TMP/lilo/dev/sdd$NUM 8 $1
+ elif [ "$DRV" = "4" ]; then
+ makedev $TMP/lilo/dev/sde$NUM 8 $1
+ elif [ "$DRV" = "5" ]; then
+ makedev $TMP/lilo/dev/sdf$NUM 8 $1
+ elif [ "$DRV" = "6" ]; then
+ makedev $TMP/lilo/dev/sdg$NUM 8 $1
+ elif [ "$DRV" = "7" ]; then
+ makedev $TMP/lilo/dev/sdh$NUM 8 $1
+ elif [ "$DRV" = "8" ]; then
+ makedev $TMP/lilo/dev/sdi$NUM 8 $1
+ elif [ "$DRV" = "9" ]; then
+ makedev $TMP/lilo/dev/sdj$NUM 8 $1
+ elif [ "$DRV" = "10" ]; then
+ makedev $TMP/lilo/dev/sdk$NUM 8 $1
+ elif [ "$DRV" = "11" ]; then
+ makedev $TMP/lilo/dev/sdl$NUM 8 $1
+ elif [ "$DRV" = "12" ]; then
+ makedev $TMP/lilo/dev/sdm$NUM 8 $1
+ elif [ "$DRV" = "13" ]; then
+ makedev $TMP/lilo/dev/sdn$NUM 8 $1
+ elif [ "$DRV" = "14" ]; then
+ makedev $TMP/lilo/dev/sdo$NUM 8 $1
+ elif [ "$DRV" = "15" ]; then
+ makedev $TMP/lilo/dev/sdp$NUM 8 $1
+ fi
+}
+
+if cat /proc/partitions | grep / 1> /dev/null 2> /dev/null ; then # new
+ cat /proc/partitions | grep / | while read line ; do
+ SMASHED_LINE=$line
+ MAJOR=`echo $SMASHED_LINE | cut -f 1 -d ' '`
+ MINOR=`echo $SMASHED_LINE | cut -f 2 -d ' '`
+ if [ "$MAJOR" = "3" ]; then
+ make_ide $MAJOR $MINOR hda hdb
+ elif [ "$MAJOR" = "8" ]; then
+ make_scsi $MINOR
+ elif [ "$MAJOR" = "22" ]; then
+ make_ide $MAJOR $MINOR hdc hdd
+ elif [ "$MAJOR" = "33" ]; then
+ make_ide $MAJOR $MINOR hde hdf
+ elif [ "$MAJOR" = "34" ]; then
+ make_ide $MAJOR $MINOR hdg hdh
+ elif [ "$MAJOR" = "56" ]; then
+ make_ide $MAJOR $MINOR hdi hdj
+ fi
+ done
+else # old format
+ cat /proc/partitions | grep d | while read line ; do
+ SMASHED_LINE=$line
+ MAJOR=`echo $SMASHED_LINE | cut -f 1 -d ' '`
+ MINOR=`echo $SMASHED_LINE | cut -f 2 -d ' '`
+ DEVNAME=`echo $SMASHED_LINE | cut -f 4 -d ' '`
+ makedev $TMP/lilo/dev/$DEVNAME $MAJOR $MINOR
+ done
+fi
+}
+
+choose_kernel() {
+while [ 0 ]; do # input loop
+cat << EOF > $TMP/tmpmsg
+
+Some possible paths to kernels are these:
+
+/boot/vmlinuz
+/usr/src/linux/arch/i386/boot/bzImage
+/usr/src/linux/arch/i386/boot/zImage
+/vmlinuz
+
+Put the path to the kernel you want to use in the box below.
+
+EOF
+
+ dialog --title "CHOOSE KERNEL" --inputbox "`cat $TMP/tmpmsg`" \
+ 16 72 "/boot/vmlinuz" 2> $TMP/return
+ if [ ! $? = 0 ]; then
+ exit
+ fi
+
+ KERNEL="`cat $TMP/return`"
+
+ if [ ! -r "$KERNEL" ]; then
+ dialog --title "NOT FOUND!" --msgbox "$KERNEL" 5 60
+ continue
+ fi
+ KMSG="Using kernel $KERNEL"
+break
+done
+}
+
+format_disk() {
+ # If anyone still uses 1.2 MB, you'll have to uncomment this.
+ # It's no longer a default option.
+ #FDEV=/dev/fd0h1200
+ #FDEV=/dev/fd0u1400
+ FDEV=/dev/fd0u1680
+ if [ "$FDEV" = "/dev/fd0u1680" ]; then
+ dialog --title "Formatting /dev/fd0u1680" --infobox \
+ "Formatting /dev/fd0, 1.68 megabytes." 3 42
+ elif [ "$FDEV" = "/dev/fd0u1400" ]; then
+ dialog --title "Formatting /dev/fd0u1440" --infobox \
+ "Formatting /dev/fd0, 1.44 megabytes." 3 42
+ elif [ "$FDEV" = "/dev/fd0h1200" ]; then
+ dialog --title "Formatting /dev/fd0h1200" --infobox \
+ "Formatting /dev/fd0, 1.2 megabytes." 3 42
+ fi
+ fdformat $FDEV 1> /dev/null 2> /dev/null
+ if [ ! $? = 0 ]; then
+ dialog --title "ERROR: FLOPPY FORMAT FAILED" --msgbox "The attempt to format the floppy \
+disk in /dev/fd0 has failed, probably due to bad media. Please try again with a \
+different disk. If that doesn't work, perhaps the drive needs cleaning." 0 0
+ return 1
+ fi
+}
+
+DEFAULT_ITEM="syslinux"
+
+while [ 0 ]; do # menu loop
+ dialog --title "MAKE BOOT FLOPPY FROM KERNEL" \
+--default-item $DEFAULT_ITEM \
+--backtitle "$KMSG" --menu "This menu allows you to make a SYSLINUX bootdisk \
+from a compiled kernel. The SYSLINUX bootloader has the advantage of \
+using a FAT filesystem making it easy to replace the kernel later. \
+Which option would you like?" 12 67 2 \
+"syslinux" "Make a SYSLINUX bootdisk" \
+"exit" "Exit this program" 2> $TMP/return
+ if [ ! $? = 0 ]; then
+ break;
+ fi
+ REPLY=`cat $TMP/return`
+ rm -f $TMP/return
+ if [ "$REPLY" = "simple" ]; then # make simple bootdisk
+ if [ "$KERNEL" = "" ]; then
+ choose_kernel
+ fi
+ kernel_size=`du -Lk $KERNEL | cut -f1`
+ if [ "$kernel_size" -gt "1023" ]; then
+cat << EOF > $TMP/tmpmsg
+
+The kernel $KERNEL is $kernel_size K (which is
+more than 1023 Kb in size), so it probably won't
+boot standalone on the floppy. Use the 'syslinux'
+method instead.
+
+EOF
+ dialog --title "KERNEL TOO BIG!" --msgbox "`cat $TMP/tmpmsg`" 10 60
+ continue
+ fi
+ dialog --title "BOOT DISK CREATION" --backtitle "$KMSG" --yesno \
+"\n\
+Now put a formatted floppy in your boot drive. \n\
+This will be made into your Linux boot disk. Use this to\n\
+boot Linux until LILO has been configured to boot from\n\
+the hard drive.\n\n\
+Any data on the target disk will be destroyed.\n\n\
+YES creates the disk, NO aborts.\n" 14 62
+ if [ $? = 0 ]; then
+ format_disk
+ dialog --title "CREATING DISK" --infobox "Creating boot disk from $KERNEL..." 5 72
+ dd if=$KERNEL of=/dev/fd0 2> /dev/null
+ rdev /dev/fd0 $ROOT_DEVICE
+ rdev -v /dev/fd0 -1
+ if [ "$MOUNT" = "read-only" ]; then
+ rdev -R /dev/fd0 1
+ else
+ rdev -R /dev/fd0 0
+ fi
+ fi
+ elif [ "$REPLY" = "syslinux" ]; then # make syslinux bootdisk
+ DEFAULT_ITEM="exit"
+ if [ "$KERNEL" = "" ]; then
+ choose_kernel
+ fi
+ dialog --title "CREATING SYSLINUX BOOTDISK IN /dev/fd0" --backtitle "$KMSG" --yesno "Now put a \
+floppy in your boot drive. This will be made into a SYSLINUX \
+bootdisk that you can use to start your Linux system. Any data on the \
+target disk will be destroyed. YES creates the disk, NO aborts." 8 62
+ if [ $? = 0 ]; then # make the disk
+ format_disk
+ if [ ! $? = 0 ]; then
+ continue
+ fi
+ dialog --title "CREATING BOOT FLOPPY" --infobox "Creating SYSLINUX bootdisk for \
+$ROOT_DEVICE in /dev/fd0." 3 64
+ mkdosfs -F 12 /dev/fd0u1680 1680 1> /dev/null 2> /dev/null
+ if [ ! -d $TMP/bootdisk ]; then
+ mkdir $TMP/bootdisk
+ fi
+ mount -t vfat /dev/fd0 $TMP/bootdisk 1> /dev/null 2> /dev/null
+ cp $KERNEL $TMP/bootdisk/vmlinuz
+ ## This avoids a syslinux-1.72 bug, and doesn't seem to hurt anything:
+ #dd if=/dev/zero bs=1k count=1 >> $TMP/bootdisk/vmlinuz 2> /dev/null
+ if [ ! "$?" = "0" ]; then
+ dialog --title "ERROR COPYING KERNEL TO FLOPPY" \
+ --msgbox "Sorry, but there was an error copying the kernel to the \
+floppy disk. Possibly the kernel is too large to fit the disk. \
+This program will now exit." 0 0
+ umount /dev/fd0
+ rm -rf $TMP/bootdisk
+ exit 1
+ fi
+ cat << EOF > $TMP/bootdisk/message.txt
+
+Welcome to the 09Slackware07 Linux custom bootdisk!
+
+By default, this disk boots a root Linux partition on $ROOT_DEVICE when you
+hit ENTER. If you'd like to boot some other partition, use a command like
+this on the prompt below:
+
+ mount root=/dev/sda1 ro
+
+Where "/dev/sda1" is the partition you want to boot, and "ro" specifies that
+the partition should be initially mounted as read-only. If you wish to mount
+the partition read-write, use "rw" instead. To set the video console mode,
+use the vga= parameter (press F1 to see a table). You may also add any other
+kernel parameters you might need depending on your hardware, and which
+drivers are included in your kernel.
+
+EOF
+ cat << EOF > $TMP/bootdisk/syslinux.cfg
+default vmlinuz ramdisk_size=7000 root=$ROOT_DEVICE vga=normal ro
+prompt 1
+timeout 6000
+display message.txt
+F1 f1.txt
+F2 message.txt
+#F3 f3.txt
+#F4 f4.txt
+#F5 f5.txt
+#F6 f6.txt
+#F7 f7.txt
+label mount
+ kernel vmlinuz
+ append ramdisk_size=7000 root=$ROOT_DEVICE vga=normal ro
+label ramdisk
+ kernel vmlinuz
+ append vmlinuz ramdisk_size=7000 root=/dev/fd0u1440 vga=normal rw
+EOF
+ cat << EOF > $TMP/bootdisk/f1.txt
+ STANDARD MODES:
+ To make the kernel prompt for standard video modes use: vga=ask
+
+ FRAMEBUFFER MODES:
+ To get the kernel to start in VESA framebuffer mode, you need to pass it
+ a vga= init string on the "boot:" prompt. Here's a table:
+
+ Colors 640x480 800x600 1024x768 1280x1024 1600x1200
+ --------+---------------------------------------------
+ 256 | 769 771 773 775 796
+ 32,768 | 784 787 790 793 797
+ 65,536 | 785 788 791 794 798
+ 16.8M | 786 789 792 795 799
+
+ ...such as this for 1024x768x64k:
+ vga=791
+
+ F2 returns to the previous page.
+
+EOF
+ umount /dev/fd0
+ syslinux-nomtools -s /dev/fd0
+ rm -r $TMP/bootdisk
+ fi
+ elif [ "$REPLY" = "lilo" ]; then # make lilo bootdisk
+ DEFAULT_ITEM="exit"
+ if [ ! -x "`type -path lilo`" ]; then
+cat << EOF > $TMP/tmpmsg
+
+You don't have 'lilo' installed on the system.
+I guess you didn't install the lilo package.
+
+EOF
+ dialog --title "LILO NOT FOUND" --msgbox "`cat $TMP/tmpmsg`" 8 60
+ continue
+ fi
+ if [ "$KERNEL" = "" ]; then
+ choose_kernel
+ fi
+ dialog --title "CREATING LILO BOOTDISK IN /dev/fd0" --backtitle "$KMSG" --yesno "Now put a \
+floppy in your boot drive. This will be made into a LILO \
+bootdisk that you can use to start your Linux system. Any data on the \
+target disk will be destroyed. YES creates the disk, NO aborts." 8 62
+ if [ $? = 0 ]; then # make the disk
+ format_disk
+ DEV=/dev/fd0u1680
+ mknod_fd="-m 0640 $TMP/lilo$DEV b 2 44"
+ dialog --infobox "Creating LILO bootdisk from $KERNEL for $ROOT_DEVICE..." 4 60
+ mke2fs -q -m 0 -i 4096 $DEV 1> /dev/null 2> /dev/null || exit 1
+ if [ ! -d $TMP/lilo ]; then
+ mkdir -p $TMP/lilo
+ fi
+ mount -t ext2 $DEV $TMP/lilo 1> /dev/null || exit 1
+ rmdir $TMP/lilo/lost+found
+ cp $KERNEL $TMP/lilo/vmlinuz || exit 1
+ mkdir $TMP/lilo/dev
+ make_root_device
+ mknod -m 0640 $TMP/lilo/dev/fd0 b 2 0
+ mknod -m 0640 $TMP/lilo/dev/fd1 b 2 1
+ mknod $mknod_fd
+ mknod -m 0666 $TMP/lilo/dev/null c 1 3
+ mkdir $TMP/lilo/etc
+ cat << EOF > $TMP/lilo/etc/lilo.conf
+boot = $DEV
+message=/boot/message
+backup=/dev/null
+prompt
+image = /vmlinuz
+ label = mount
+ ramdisk = 0
+ root = $ROOT_DEVICE
+ vga = normal
+ $MOUNT
+EOF
+ mkdir $TMP/lilo/boot
+ cp -a /boot/chain.b $TMP/lilo/boot
+ if [ -f /boot/boot-text.b ]; then
+ cp -a /boot/boot-text.b $TMP/lilo/boot/boot.b
+ else
+ cp -a /boot/boot.b $TMP/lilo/boot
+ fi
+ cat << EOF > $TMP/lilo/boot/message
+
+Welcome to the Slackware Linux custom LILO bootdisk!
+
+By default, this disk boots a root Linux partition on $ROOT_DEVICE when
+you hit ENTER. If you'd like to boot some other partition, use a command
+like this on the LILO prompt below:
+
+ mount root=/dev/sda1 ro
+
+Where "/dev/sda1" is the partition you want to boot, and "ro" specifies that
+the partition should be initially mounted as read-only. If you which to mount
+the partition read-write, use "rw" instead. You may also add any other kernel
+parameters you might need depending on your hardware, and which drivers are
+included in your kernel.
+
+EOF
+ lilo -r $TMP/lilo > /dev/null
+ umount $TMP/lilo
+ rm -rf $TMP/lilo
+ fi
+ elif [ "$REPLY" = "exit" ]; then
+ break;
+ fi
+done
diff --git a/testing/source/pkgtools/scripts/makepkg b/testing/source/pkgtools/scripts/makepkg
new file mode 100644
index 00000000..f9241cb9
--- /dev/null
+++ b/testing/source/pkgtools/scripts/makepkg
@@ -0,0 +1,452 @@
+#!/bin/sh
+# Copyright 1994, 1998, 2008 Patrick Volkerding, Moorhead, Minnesota USA
+# Copyright 2003 Slackware Linux, Inc. Concord, CA USA
+# Copyright 2009, 2015, 2017, 2018 Patrick J. Volkerding, Sebeka, MN, USA
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# Mon May 21 18:31:20 UTC 2018
+# Add --compress option, usually used to change the preset compression level
+# or block size.
+#
+# Tue Feb 13 00:46:12 UTC 2018
+# Use recent tar, and support storing POSIX ACLs and extended attributes.
+#
+# Tue Dec 12 21:55:59 UTC 2017
+# If possible, use multiple compression threads.
+#
+# Wed Sep 23 18:36:43 UTC 2015
+# Support spaces in file/directory names. <alphageek>
+#
+# Sun Apr 5 21:23:26 CDT 2009
+# Support .tgz, .tbz, .tlz, and .txz packages. <volkerdi>
+#
+# Fri Nov 26 13:53:36 GMT 2004
+# Patched to chmod 755 the package's root directory if needed, then restore
+# previous permissions after the package has been created. <sw>
+#
+# Wed Mar 18 15:32:33 CST 1998
+# Patched to avoid possible symlink attacks in /tmp.
+
+CWD=$(pwd)
+
+umask 022
+
+make_install_script() {
+ TAB="$(echo -e "\t")"
+ COUNT=1
+ while :; do
+ LINE="$(sed -n "$COUNT p" $1)"
+ if [ "$LINE" = "" ]; then
+ break
+ fi
+ LINKGOESIN="$(echo "$LINE" | cut -f 1 -d "$TAB")"
+ LINKGOESIN="$(dirname "$LINKGOESIN")"
+ LINKNAMEIS="$(echo "$LINE" | cut -f 1 -d "$TAB")"
+ LINKNAMEIS="$(basename "$LINKNAMEIS")"
+ LINKPOINTSTO="$(echo "$LINE" | cut -f 2 -d "$TAB")"
+ echo "( cd $LINKGOESIN ; rm -rf $LINKNAMEIS )"
+ echo "( cd $LINKGOESIN ; ln -sf $LINKPOINTSTO $LINKNAMEIS )"
+ COUNT=$(expr $COUNT + 1)
+ done
+}
+
+usage() {
+ cat << EOF
+
+Usage: makepkg package_name.tgz
+ (or: package_name.tbz, package_name.tlz, package_name.txz)
+
+Makes a Slackware compatible package containing the contents of the current
+and all subdirectories. If symbolic links exist, they will be removed and
+an installation script will be made to recreate them later. This script will
+be called "install/doinst.sh". You may add any of your own ash-compatible
+shell scripts to this file and rebuild the package if you wish.
+
+options: -l, --linkadd y|n (moves symlinks into doinst.sh: recommended)
+ -p, --prepend (prepend rather than append symlinks to an existing
+ doinst.sh. Useful to link libraries needed by programs in
+ the doinst.sh script)
+ -c, --chown y|n (resets all permissions to root:root 755 - not
+ generally recommended)
+ --threads <number> For xz/plzip compressed packages, set the max
+ number of threads to be used for compression. Only has an
+ effect on large packages. For plzip, the default is equal to
+ the number of CPU threads available on the machine. For xz,
+ the default is equal to 2 (due to commonly occuring memory
+ related failures when using many threads with multi-threaded
+ xz compression).
+ --compress <option> Supply a custom option to the compressor.
+ This will be used in place of the default, which is: -9
+ --acls Support storing POSIX ACLs in the package. The resulting
+ package will not be compatible with pkgtools version < 15.0.
+ --xattrs Support storing extended attributes in the package. The
+ resulting package will not be compatible with pkgtools
+ version < 15.0.
+
+If these options are not set, makepkg will prompt if appropriate.
+EOF
+}
+
+TMP=/tmp # This can be a hole, but I'm going to be careful about file
+ # creation in there, so don't panic. :^)
+
+# Set maximum number of threads to use. By default, this will be the number
+# of CPU threads:
+THREADS="$(nproc)"
+
+# Set default compression option.
+COMPRESS_OPTION="-9"
+
+# Parse options
+unset ACLS XATTRS
+while [ 0 ]; do
+ if [ "$1" = "--linkadd" -o "$1" = "-l" ]; then
+ if [ "$2" = "y" ]; then
+ LINKADD=y
+ elif [ "$2" = "n" ]; then
+ LINKADD=n
+ else
+ usage
+ exit 2
+ fi
+ shift 2
+ elif [ "$1" = "--chown" -o "$1" = "-c" ]; then
+ if [ "$2" = "y" ]; then
+ CHOWN=y
+ elif [ "$2" = "n" ]; then
+ CHOWN=n
+ else
+ usage
+ exit 2
+ fi
+ shift 2
+ elif [ "$1" = "-p" -o "$1" = "--prepend" ]; then
+ PREPEND=y
+ shift 1
+ elif [ "$1" = "-threads" -o "$1" = "--threads" ]; then
+ THREADS="$2"
+ shift 2
+ # xz has memory issues with threads it seems, so we'll use two threads by
+ # default unless we see that something else was user-selected:
+ XZ_THREADS_FORCED=yes
+ elif [ "$1" = "-compress" -o "$1" = "--compress" ]; then
+ COMPRESS_OPTION="$2"
+ shift 2
+ elif [ "$1" = "--acls" ]; then
+ ACLS="--acls"
+ shift 1
+ elif [ "$1" = "--xattrs" ]; then
+ XATTRS="--xattrs"
+ shift 1
+ elif [ "$1" = "-h" -o "$1" = "-H" -o "$1" = "--help" -o $# = 0 ]; then
+ usage
+ exit 0
+ else
+ break
+ fi
+done
+
+PACKAGE_NAME="$1"
+TARGET_NAME="$(dirname $PACKAGE_NAME)"
+PACKAGE_NAME="$(basename $PACKAGE_NAME)"
+
+# Identify package extension and compression type to use:
+if [ ! "$(basename $PACKAGE_NAME .tgz)" = "$PACKAGE_NAME" ]; then
+ EXTENSION="tgz"
+ COMPEXT="gz"
+ COMPRESSOR="gzip ${COMPRESS_OPTION} -c"
+ if ! which gzip 1> /dev/null 2> /dev/null ; then
+ echo "ERROR: gzip compression utility not found in \$PATH."
+ exit 3
+ fi
+elif [ ! "$(basename $PACKAGE_NAME .tar.gz)" = "$PACKAGE_NAME" ]; then
+ EXTENSION="tar.gz"
+ COMPRESSOR="gzip ${COMPRESS_OPTION} -c"
+ if ! which gzip 1> /dev/null 2> /dev/null ; then
+ echo "ERROR: gzip compression utility not found in \$PATH."
+ exit 3
+ fi
+elif [ ! "$(basename $PACKAGE_NAME .tbz)" = "$PACKAGE_NAME" ]; then
+ EXTENSION="tbz"
+ if which lbzip2 1> /dev/null 2> /dev/null ; then
+ COMPRESSOR="lbzip2 ${COMPRESS_OPTION} -c"
+ else
+ if which bzip2 1> /dev/null 2> /dev/null ; then
+ COMPRESSOR="bzip2 ${COMPRESS_OPTION} -c"
+ else
+ echo "ERROR: bzip2 compression utility not found in \$PATH."
+ exit 3
+ fi
+ fi
+elif [ ! "$(basename $PACKAGE_NAME .tar.bz2)" = "$PACKAGE_NAME" ]; then
+ EXTENSION="tar.bz2"
+ if which lbzip2 1> /dev/null 2> /dev/null ; then
+ COMPRESSOR="lbzip2 ${COMPRESS_OPTION} -c"
+ else
+ if which bzip2 1> /dev/null 2> /dev/null ; then
+ COMPRESSOR="bzip2 ${COMPRESS_OPTION} -c"
+ else
+ echo "ERROR: bzip2 compression utility not found in \$PATH."
+ exit 3
+ fi
+ fi
+elif [ ! "$(basename $PACKAGE_NAME .tlz)" = "$PACKAGE_NAME" ]; then
+ EXTENSION="tlz"
+ if which plzip 1> /dev/null 2> /dev/null ; then
+ COMPRESSOR="plzip ${COMPRESS_OPTION} --threads=${THREADS} -c"
+ else
+ echo "WARNING: plzip compression utility not found in \$PATH."
+ echo "WARNING: package will not support multithreaded decompression."
+ if which lzip 1> /dev/null 2> /dev/null ; then
+ COMPRESSOR="lzip ${COMPRESS_OPTION} -c"
+ else
+ echo "ERROR: lzip compression utility not found in \$PATH."
+ exit 3
+ fi
+ fi
+elif [ ! "$(basename $PACKAGE_NAME .tar.lz)" = "$PACKAGE_NAME" ]; then
+ EXTENSION="tar.lz"
+ if which plzip 1> /dev/null 2> /dev/null ; then
+ COMPRESSOR="plzip ${COMPRESS_OPTION} --threads=${THREADS} -c"
+ else
+ echo "WARNING: plzip compression utility not found in \$PATH."
+ echo "WARNING: package will not support multithreaded decompression."
+ if which lzip 1> /dev/null 2> /dev/null ; then
+ COMPRESSOR="lzip ${COMPRESS_OPTION} -c"
+ else
+ echo "ERROR: lzip compression utility not found in \$PATH."
+ exit 3
+ fi
+ fi
+elif [ ! "$(basename $PACKAGE_NAME .tar.lzma)" = "$PACKAGE_NAME" ]; then
+ EXTENSION="tar.lzma"
+ COMPRESSOR="lzma ${COMPRESS_OPTION} -c"
+ if ! which lzma 1> /dev/null 2> /dev/null ; then
+ echo "ERROR: lzma compression utility not found in \$PATH."
+ exit 3
+ fi
+elif [ ! "$(basename $PACKAGE_NAME .txz)" = "$PACKAGE_NAME" ]; then
+ EXTENSION="txz"
+ if [ ! "$XZ_THREADS_FORCED" = "yes" ]; then
+ # Two threads by default with xz due to memory failures on 32-bit. Not that
+ # it matters much... if upstream ever gets around to implementing multi-
+ # threaded decompression we'll revisit this default. :-D
+ COMPRESSOR="xz ${COMPRESS_OPTION} --threads=2 -c"
+ else
+ COMPRESSOR="xz ${COMPRESS_OPTION} --threads=${THREADS} -c"
+ fi
+ if ! which xz 1> /dev/null 2> /dev/null ; then
+ echo "ERROR: xz compression utility not found in \$PATH."
+ exit 3
+ fi
+elif [ ! "$(basename $PACKAGE_NAME .tar.xz)" = "$PACKAGE_NAME" ]; then
+ EXTENSION="tar.xz"
+ if [ ! "$XZ_THREADS_FORCED" = "yes" ]; then
+ # Two threads by default with xz due to memory failures on 32-bit. Not that
+ # it matters much... if upstream ever gets around to implementing multi-
+ # threaded decompression we'll revisit this default. :-D
+ COMPRESSOR="xz ${COMPRESS_OPTION} --threads=2 -c"
+ else
+ COMPRESSOR="xz ${COMPRESS_OPTION} --threads=${THREADS} -c"
+ fi
+ if ! which xz 1> /dev/null 2> /dev/null ; then
+ echo "ERROR: xz compression utility not found in \$PATH."
+ exit 3
+ fi
+else
+ EXTENSION="$(echo $PACKAGE_NAME | rev | cut -f 1 -d . | rev)"
+ echo "ERROR: Package extension .$EXTENSION is not supported."
+ exit 1
+fi
+
+TAR_NAME="$(basename $PACKAGE_NAME .$EXTENSION)"
+
+# Sanity check -- we can't make the package in the current directory:
+if [ "$CWD" = "$TARGET_NAME" -o "." = "$TARGET_NAME" ]; then
+ echo "ERROR: Can't make output package in current directory."
+ exit 2
+fi
+
+echo
+echo "Slackware package maker, version 3.14159265."
+echo
+echo "Searching for symbolic links:"
+# Get rid of possible pre-existing trouble:
+INST=$(mktemp $TMP/makepkg.XXXXXX)
+find . -type l -printf "%p\t%l\n" | sed 's,^\./,, ; s, ,\\ ,g' | tee $INST
+if [ ! "$(cat $INST)" = "" ]; then
+ echo
+ echo "Making symbolic link creation script:"
+ make_install_script $INST | tee doinst.sh
+fi
+echo
+if [ ! "$(cat $INST)" = "" ]; then
+ if [ -r install/doinst.sh ]; then
+ echo "Unless your existing installation script already contains the code"
+ echo "to create these links, you should append these lines to your existing"
+ echo "install script. Now's your chance. :^)"
+ echo
+ echo "Would you like to add this stuff to the existing install script and"
+ echo -n "remove the symbolic links ([y]es, [n]o)? "
+ else
+ echo "It is recommended that you make these lines your new installation script."
+ echo
+ echo "Would you like to make this stuff the install script for this package"
+ echo -n "and remove the symbolic links ([y]es, [n]o)? "
+ fi
+ if [ ! "$LINKADD" ]; then
+ read LINKADD;
+ echo
+ else
+ echo $LINKADD
+ echo
+ fi
+ if [ "$LINKADD" = "y" ]; then
+ if [ -r install/doinst.sh ]; then
+ UPDATE="t"
+ if [ "$PREPEND" = "y" ]; then
+ touch install/doinst.sh
+ mv install/doinst.sh install/doinst.sh.shipped
+ cat doinst.sh > install/doinst.sh
+ echo "" >> install/doinst.sh
+ cat install/doinst.sh.shipped >> install/doinst.sh
+ rm -f install/doinst.sh.shipped
+ else
+ cat doinst.sh >> install/doinst.sh
+ fi
+ else
+ mkdir -p install
+ cat doinst.sh > install/doinst.sh
+ fi
+ echo
+ echo "Removing symbolic links:"
+ find . -type l -exec rm -v {} \;
+ echo
+ if [ "$UPDATE" = "t" ]; then
+ if [ "$PREPEND" = "y" ]; then
+ echo "Updating your ./install/doinst.sh (prepending symlinks)..."
+ else
+ echo "Updating your ./install/doinst.sh..."
+ fi
+ else
+ echo "Creating your new ./install/doinst.sh..."
+ fi
+ fi
+else
+ echo "No symbolic links were found, so we won't make an installation script."
+ echo "You can make your own later in ./install/doinst.sh and rebuild the"
+ echo "package if you like."
+fi
+rm -f doinst.sh $INST
+echo
+echo "This next step is optional - you can set the directories in your package"
+echo "to some sane permissions. If any of the directories in your package have"
+echo "special permissions, then DO NOT reset them here!"
+echo
+echo "Would you like to reset all directory permissions to 755 (drwxr-xr-x) and"
+echo -n "directory ownerships to root.root ([y]es, [n]o)? "
+if [ ! "$CHOWN" ]; then
+ read CHOWN;
+ echo
+else
+ echo $CHOWN
+ echo
+fi
+if [ "$CHOWN" = "y" ]; then
+ find . -type d -exec chmod -v 755 {} \;
+ find . -type d -exec chown -v root.root {} \;
+fi
+
+# Ensure that the 'root' of the package is chmod 755 because
+# the / of your filesystem will inherit these permissions.
+# If it's anything tighter than 755 then bad things happen such as users
+# not being able to login, users already logged in can no longer run commands
+# and so on.
+OLDROOTPERMS="$(find -name . -printf "%m\n")"
+if [ $OLDROOTPERMS -ne 755 ]; then
+ echo "WARNING: $PWD is chmod $OLDROOTPERMS"
+ echo " temporarily changing to chmod 755"
+ chmod 755 .
+fi
+
+echo "Creating Slackware package: ${TARGET_NAME}/${TAR_NAME}.${EXTENSION}"
+echo
+rm -f ${TARGET_NAME}/${TAR_NAME}.${EXTENSION}
+
+# HISTORICAL NOTE 2/2018:
+# In the interest of maximizing portability of this script, we'll use find
+# and sed to create a filelist compatible with tar-1.13, and then use a
+# more modern tar version to create the archive.
+#
+# Other (but possibly less portable) ways to achieve the same result:
+#
+# Use the tar --transform and --show-transformed-names options:
+# tar --transform "s,^\./\(.\),\1," --show-transformed-names $ACLS $XATTRS -cvf - . | $COMPRESSOR > ${TARGET_NAME}/${TAR_NAME}.${EXTENSION}
+#
+# Use cpio:
+# find ./ | sed '2,$s,^\./,,' | cpio --quiet -ovHustar > ${TARGET_NAME}/${TAR_NAME}.tar
+
+# Create the package:
+find ./ | sed '2,$s,^\./,,' | tar --no-recursion $ACLS $XATTRS -T - -cvf - | $COMPRESSOR > ${TARGET_NAME}/${TAR_NAME}.${EXTENSION}
+ERRCODE=$?
+if [ ! $ERRCODE = 0 ]; then
+ echo "ERROR: $COMPRESSOR returned error code $ERRCODE -- makepkg failed."
+ exit 1
+fi
+
+# Warn of zero-length files:
+find . -type f -size 0c | while read file ; do
+ echo "WARNING: zero length file $(echo $file | cut -b3-)"
+done
+
+# Warn of corrupt or empty gzip files:
+find . -type f -name '*.gz' | while read file ; do
+ if ! gzip -t $file 1> /dev/null 2> /dev/null ; then
+ echo "WARNING: gzip test failed on $(echo $file | cut -b3-)"
+ else
+ if [ "$(gzip -l $file | tail -n 1 | tr -s ' ' | cut -f 3 -d ' ')" -eq 0 ]; then
+ echo "WARNING: $(echo $file | cut -b3-) is an empty gzipped file"
+ fi
+ fi
+done
+
+# Some more handy warnings:
+if [ -d usr/share/man ]; then
+ echo "WARNING: /usr/share/man (with possibly not gzipped man pages) detected"
+fi
+
+if [ -d usr/share/info ]; then
+ echo "WARNING: /usr/share/info (with possibly not gzipped info pages) detected"
+fi
+
+if find . | grep site_perl 1> /dev/null ; then
+ echo "WARNING: site_perl directory detected (this is fine for a local package build)"
+fi
+
+# Restore the old permissions if they previously weren't chmod 755
+if [ $OLDROOTPERMS -ne 755 ]; then
+ echo
+ echo "Restoring permissions of $PWD to chmod $OLDROOTPERMS"
+ chmod $OLDROOTPERMS .
+fi
+
+echo
+echo "Slackware package ${TARGET_NAME}/${TAR_NAME}.${EXTENSION} created."
+echo
diff --git a/testing/source/pkgtools/scripts/pkgdiff b/testing/source/pkgtools/scripts/pkgdiff
new file mode 100644
index 00000000..ca21ad8f
--- /dev/null
+++ b/testing/source/pkgtools/scripts/pkgdiff
@@ -0,0 +1,164 @@
+#!/bin/sh
+# Copyright 2002 Patrick J. Volkerding, Concord, CA, USA
+# Copyright 2018 Patrick J. Volkerding, Sebeka, Minnesota, USA
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+CWD=$(pwd)
+
+# Display usage for basic usage errors:
+usage() {
+ cat << EOF
+pkgdiff: missing file arguments
+Try 'pkgdiff --help' for more information.
+EOF
+}
+
+# Display full --help if requested:
+helpme() {
+ cat << EOF
+Usage: pkgdiff [OPTION] FILE1 FILE2
+Show which files are new and which are removed between two tar archives.
+The tar archives may be uncompressed, or compressed with gzip, bzip2,
+xz, or lzip. Also works with .rpm and .deb.
+
+ --help display this help and exit
+ -c use ANSI color with default tree mode
+ -a show simple text (ASCII) diff of package file lists
+
+By default, the trees are drawn with in crude ASCII with no color. For
+the full-color effect, try something like this:
+
+ pkgdiff -c package1 package2 | less -r
+
+EOF
+ # --help doesn't return
+ exit 22
+}
+
+# How the heck do I open this?
+explode() {
+ tar xf $1 1> /dev/null 2> /dev/null
+ # Check for common extensions and do additional magic:
+ if [ ! "$(basename $1)" = "$(basename $1 .zip)" ]; then
+ unzip $1 1> /dev/null 2> /dev/null
+ fi
+ if [ ! "$(basename $1)" = "$(basename $1 .rpm)" ]; then
+ cp $1 .
+ rpm2tgz $(basename $1) 1> /dev/null 2> /dev/null
+ rm -f $(basename $1)
+ tar xzf $(basename $1 .rpm).tgz 1> /dev/null 2> /dev/null
+ rm -f $(basename $1 .rpm).tgz
+ fi
+ if [ ! "$(basename $1)" = "$(basename $1 .deb)" ]; then
+ cp $1 .
+ ar x $(basename $1) 1> /dev/null 2> /dev/null
+ tar xf data.tar.xz 1> /dev/null 2> /dev/null
+ rm -f * 2> /dev/null
+ fi
+ # Diffs for other archive formats are welcome.
+}
+
+# Parse options.
+# -c turns on colorization ala dircolors:
+unset COLOR
+if [ "$1" = "-c" ]; then
+ COLOR="-C"
+ shift 1
+fi
+if [ "$1" = "-a" ]; then
+ ASCII=true
+ shift 1
+fi
+if [ "$1" = "--help" ]; then
+ helpme
+fi
+
+TMPDIR=$(mktemp -d)
+cd $TMPDIR
+
+if [ ! -r "$1" ]; then
+ if [ -d "$CWD/$1" ]; then
+ usage
+ exit 99
+ else
+ PKG1="$CWD/$1"
+ fi
+else
+ PKG1="$1"
+fi
+
+if [ ! -r "$2" ]; then
+ if [ -d "$CWD/$2" ]; then
+ usage
+ #echo "pkgdiff -- find the difference between two tar archives"
+ #echo "usage: pkgdiff [ -C ] pkg1 pkg2"
+ exit 99
+ else
+ PKG2="$CWD/$2"
+ fi
+else
+ PKG2="$2"
+fi
+
+# We have to account for the possibility that the packages have the
+# same name, but different contents...
+if [ "$(basename $PKG1)" = "$(basename $PKG2)" ]; then
+ PKG1=${PKG1}.orig
+fi
+
+# This will be mighty safe even if we ended up in /tmp.
+PKG=.pkgdiff.$(mcookie)
+
+( mkdir -p $TMPDIR/$PKG/1
+ cd $TMPDIR/$PKG/1
+ if [ -r $PKG1 ]; then
+ explode $PKG1
+ elif [ -r $(dirname $PKG1)/$(basename $PKG1 .orig) ]; then
+ explode $(dirname $PKG1)/$(basename $PKG1 .orig)
+ fi
+ if [ ! "$ASCII" = "true" ]; then
+ tree $COLOR -a --noreport > ../$(basename $PKG1)
+ else
+ find ./ | sed '2,$s,^\./,,' | tar --no-recursion -T - -cf - | tar tf - | sort > ../$(basename $PKG1)
+ fi
+)
+( mkdir -p $TMPDIR/$PKG/2
+ cd $TMPDIR/$PKG/2
+ explode $PKG2
+ if [ ! "$ASCII" = "true" ]; then
+ tree $COLOR -a --noreport > ../$(basename $PKG2)
+ else
+ find ./ | sed '2,$s,^\./,,' | tar --no-recursion -T - -cf - | tar tf - | sort > ../$(basename $PKG2)
+ fi
+)
+
+# Always going that extra mile... ;)
+if [ -r $PKG1 ]; then
+ touch -r $PKG1 $TMPDIR/$PKG/$(basename $PKG1)
+elif [ -r $(dirname $PKG1)/$(basename $PKG1 .orig) ]; then
+ touch -r $(dirname $PKG1)/$(basename $PKG1 .orig) $TMPDIR/$PKG/$(basename $PKG1)
+fi
+touch -r $PKG2 $TMPDIR/$PKG/$(basename $PKG2)
+
+rm -rf $TMPDIR/$PKG/{1,2}
+( cd $TMPDIR/$PKG ; diff -d -u $(basename $PKG1) $(basename $PKG2) )
+
+# cleanup:
+rm -rf $PKG $TMPDIR
diff --git a/testing/source/pkgtools/scripts/pkgtool b/testing/source/pkgtools/scripts/pkgtool
new file mode 100644
index 00000000..076402b8
--- /dev/null
+++ b/testing/source/pkgtools/scripts/pkgtool
@@ -0,0 +1,723 @@
+#!/bin/sh
+#
+# Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999 Patrick Volkerding, Moorhead, MN USA
+# Copyright 2001, 2004 Slackware Linux, Inc., Concord, CA USA
+# All rights reserved.
+# Copyright 2007, 2009, 2010, 2011, 2013, 2015, 2016, 2018 Patrick Volkerding, Sebeka, MN, USA
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+# Mon Jun 4 21:17:58 UTC 2018
+# Use /var/lib/pkgtools, not /var/log.
+#
+# Sat Apr 25 21:18:53 UTC 2009
+# Converted to use new pkgbase() function to remove pathname and
+# valid package extensions.
+#
+# Wed Oct 31 16:28:46 CDT 2007
+# * Thanks to Gabriele Inghirami for a patch allowing this script to work
+# with much larger numbers of installed packages.
+# Wed, 27 Apr 1994 00:06:50 -0700 (PDT)
+# * Optimization by David Hinds.
+# Sun Oct 24 23:11:40 BST 2004
+# * Further optimisations by Jim Hawkins <jawkins@armedslack.org>
+# - dramatically improved the speed of the "View" option
+# Thu Nov 04 12:19:56 BST 2004
+# * More optimisations by Jim Hawkins
+# - improved "Remove" speed in a similar manner to "View"
+# Wed Jan 12 16:53:48 GMT 2005
+# * Fixed quoting bug thanks to Lasse Collin
+# Wed Jan 26 23:06:22 GMT 2005
+# * Fix for non-standard package descriptions by Jim Hawkins
+
+# Return a package name that has been stripped of the dirname portion
+# and any of the valid extensions (only):
+pkgbase() {
+ PKGEXT=$(echo $1 | rev | cut -f 1 -d . | rev)
+ case $PKGEXT in
+ 'tgz' )
+ PKGRETURN=$(basename $1 .tgz)
+ ;;
+ 'tbz' )
+ PKGRETURN=$(basename $1 .tbz)
+ ;;
+ 'tlz' )
+ PKGRETURN=$(basename $1 .tlz)
+ ;;
+ 'txz' )
+ PKGRETURN=$(basename $1 .txz)
+ ;;
+ *)
+ PKGRETURN=$(basename $1)
+ ;;
+ esac
+ echo $PKGRETURN
+}
+
+SOURCE_DIR=/var/lib/pkgtools/mount
+ASK="tagfiles"
+if [ -L /bin/chmod -a -L /bin/chown ]; then # probably on the bootdisk using busybox
+ TARGET_DIR=/mnt
+ rootdevice="$(mount | grep ' on /mnt ' | tail -n 1 | cut -f 1 -d ' ' 2> /dev/null)"
+ TMP=/mnt/var/lib/pkgtools/setup/tmp
+ if ! mount | grep ' on /mnt ' 1> /dev/null 2> /dev/null ; then
+ echo
+ echo
+ echo "You can't run pkgtool from the rootdisk until you've mounted your Linux"
+ echo "partitions beneath /mnt. Here are some examples:"
+ echo
+ echo "If your root partition is /dev/sda1 you would type:"
+ echo "mount /dev/sda1 /mnt"
+ echo
+ echo "Now you can find a list of all your partitions in /mnt/etc/fstab."
+ echo
+ echo "Then, supposing your /usr partition is /dev/sda2, you must do this:"
+ echo "mount /dev/sda2 /mnt/usr"
+ echo
+ echo "Please mount your Linux partitions and then run pkgtool again."
+ echo
+ exit
+ fi
+else
+ TARGET_DIR=/
+ rootdevice="$(mount | grep ' on / ' | tail -n 1 | cut -f 1 -d ' ')"
+ TMP=/var/lib/pkgtools/setup/tmp
+fi
+if [ ! -d $TMP ]; then
+ mkdir -p $TMP
+ chmod 700 $TMP
+ fi
+ADM_DIR=$TARGET_DIR/var/lib/pkgtools
+LOG=$TMP/PKGTOOL.REMOVED
+
+# remove whitespace
+crunch() {
+ while read FOO ; do
+ echo $FOO
+ done
+}
+
+package_name() {
+ STRING=$(pkgbase $1)
+ # Check for old style package name with one segment:
+ if [ "$(echo $STRING | cut -f 1 -d -)" = "$(echo $STRING | cut -f 2 -d -)" ]; then
+ echo $STRING
+ else # has more than one dash delimited segment
+ # Count number of segments:
+ INDEX=1
+ while [ ! "$(echo $STRING | cut -f $INDEX -d -)" = "" ]; do
+ INDEX=$(expr $INDEX + 1)
+ done
+ INDEX=$(expr $INDEX - 1) # don't include the null value
+ # If we don't have four segments, return the old-style (or out of spec) package name:
+ if [ "$INDEX" = "2" -o "$INDEX" = "3" ]; then
+ echo $STRING
+ else # we have four or more segments, so we'll consider this a new-style name:
+ NAME=$(expr $INDEX - 3)
+ NAME="$(echo $STRING | cut -f 1-$NAME -d -)"
+ echo $NAME
+ # cruft for later ;)
+ #VER=$(expr $INDEX - 2)
+ #VER="$(echo $STRING | cut -f $VER -d -)"
+ #ARCH=$(expr $INDEX - 1)
+ #ARCH="$(echo $STRING | cut -f $ARCH -d -)"
+ #BUILD="$(echo $STRING | cut -f $INDEX -d -)"
+ fi
+ fi
+}
+
+remove_packages() {
+ for pkg_name in $(cat $TMP/return | tr -d "\042")
+ do
+ if [ -r $ADM_DIR/packages/$pkg_name ]; then
+ dialog --title "PACKAGE REMOVAL IN PROGRESS" --cr-wrap --infobox \
+"\nRemoving package $pkg_name.\n\
+\n\
+Since each file must be checked \
+against the contents of every other installed package to avoid wiping out \
+areas of overlap, this process can take quite some time. If you'd like to \
+watch the progress, flip over to another virtual console and type:\n\
+\n\
+tail -f $TMP/PKGTOOL.REMOVED\n" 13 60
+ export ROOT=$TARGET_DIR
+ removepkg $pkg_name >> $LOG 2> /dev/null
+ else
+ echo "No such package: $pkg_name. Can't remove." >> $LOG
+ fi
+ done
+}
+
+create_list_of_installed_packages()
+{
+ FILES=$(ls $ADM_DIR/packages)
+ if [ -n "$FILES" ]; then
+ cd $ADM_DIR/packages
+ { grep '^PACKAGE DESCRIPTION:$' -Z -H -m1 -A1 $FILES; echo; } \
+ | sed -n 'h;n;/\x00/{h;n;};x;s/ */ /g;s/ $//;s/[\"`$]/\\&/g
+ s/\(.*\)\x00\([^:]*:\)\? *\(.*\)/ "\1" "\3" "View information about package \1" \\/;p' > $TMP/list_of_installed_packages \
+
+ fi
+}
+
+ create_list_of_files_to_remove ()
+{
+FILES=$(ls $ADM_DIR/packages)
+ if [ -n "$FILES" ]; then
+ cd $ADM_DIR/packages
+ { grep '^PACKAGE DESCRIPTION:$' -Z -H -m1 -A1 $FILES; echo; } \
+ | sed -n 'h;n;/\x00/{h;n;};x;s/ */ /g;s/ $//;s/[\"`$]/\\&/g
+ s/\(.*\)\x00\([^:]*:\)\? *\(.*\)/ "\1" "\3" off "Select\/Unselect removing package \1" \\/;p' > $TMP/temporary_list \
+
+ fi
+}
+
+# Here, we read the list of arguments passed to the pkgtool script.
+if [ $# -gt 0 ]; then # there are arguments to the command
+ while [ $# -gt 0 ]; do
+ case "$1" in
+ -sets | --sets)
+ DISK_SETS=$(echo $2 | tr "[A-Z]" "[a-z]") ; shift 2 ;;
+ -source_mounted | --source-mounted)
+ SOURCE_MOUNTED="always" ; shift 1 ;;
+ -ignore_tagfiles | --ignore-tagfiles)
+ ASK="never" ; shift 1 ;;
+ -tagfile | --tagfile)
+ USETAG=$2 ; shift 2 ;;
+ -source_dir | --source_dir)
+ SOURCE_DIR=$2 ; shift 2 ;;
+ -target_dir | --target_dir)
+ TARGET_DIR=$2
+ ADM_DIR=$TARGET_DIR/var/lib/pkgtools
+ shift 2 ;;
+ -source_device | --source_device)
+ SOURCE_DEVICE=$2 ; shift 2 ;;
+ esac
+ done
+else # there were no arguments, so we'll get the needed information from the
+ # user and then go on.
+ CMD_START="true"
+ rm -f $TMP/SeT*
+ while [ 0 ]; do
+ dialog --title "Slackware Package Tool (pkgtool version 15.0)" \
+--menu "\nWelcome to the Slackware package tool.\n\
+\nWhich option would you like?\n" 16 75 6 \
+"Current" "Install packages from the current directory" \
+"Other" "Install packages from some other directory" \
+"Remove" "Remove packages that are currently installed" \
+"View" "View the list of files contained in a package" \
+"Setup" "Choose Slackware installation scripts to run again" \
+"Exit" "Exit Pkgtool" 2> $TMP/reply
+ if [ ! $? = 0 ]; then
+ rm -f $TMP/reply
+ dialog --clear
+ exit
+ fi
+ REPLY="$(cat $TMP/reply)"
+ rm -f $TMP/reply
+ if [ "$REPLY" = "Exit" ]; then
+ dialog --clear
+ exit
+ fi
+ if [ "$REPLY" = "Setup" ]; then
+ echo 'dialog --title "SELECT SYSTEM SETUP SCRIPTS" --item-help --checklist \
+ "Please use the spacebar to select the setup scripts to run. Hit enter when you \
+are done selecting to run the scripts." 17 70 9 \' > $TMP/setupscr
+ for script in $ADM_DIR/setup/setup.* ; do
+ BLURB=$(grep '#BLURB' $script | cut -b8-)
+ if [ "$BLURB" = "" ]; then
+ BLURB="\"\""
+ fi
+ echo " \"$(basename $script | cut -f2- -d .)\" $BLURB \"no\" $BLURB \\" >> $TMP/setupscr
+ done
+ echo "2> $TMP/return" >> $TMP/setupscr
+ . $TMP/setupscr
+ if [ ! "$(cat $TMP/return)" = "" ]; then
+ # Run each script:
+ for script in $(cat $TMP/return) ; do
+ scrpath=$ADM_DIR/setup/setup.$(echo $script | tr -d \")
+ ( COLOR=on ; cd $TARGET_DIR ; . $scrpath $TARGET_DIR $rootdevice )
+ done
+ fi
+ rm -f $TMP/return $TMP/setupscr
+ continue
+ fi # end Setup
+
+ if [ "$REPLY" = "View" ]; then
+create_list_of_installed_packages
+ DEFITEM=""
+ export DEFITEM
+ #dialog --title "SCANNING" --infobox "Please wait while \
+#Pkgtool scans your system to determine which packages you have \
+#installed and prepares a list for you." 0 0
+ (
+ echo 'dialog $DEFITEM --item-help --menu "Please select the package you wish to view." 17 68 10 \'
+ ) > $TMP/viewscr
+ cat $TMP/list_of_installed_packages >> $TMP/viewscr
+ echo "2> $TMP/return" >> $TMP/viewscr
+ while [ 0 ]; do
+ . $TMP/viewscr
+ if [ ! "$(cat $TMP/return)" = "" ]; then
+ DEFITEM="--default-item $(cat $TMP/return)"
+ dialog --title "CONTENTS OF PACKAGE: $(cat $TMP/return)" --no-shadow --textbox "$ADM_DIR/packages/$(cat $TMP/return)" \
+ 0 0 2> /dev/null
+ else
+ break
+ fi
+ done
+ rm -f $TMP/return $TMP/viewscr $TMP/tmpmsg $TMP/list_of_installed_packages
+ # This will clean up after most defective packages:
+ chmod 755 /
+ chmod 1777 /tmp
+ continue
+ fi
+
+ if [ "$REPLY" = "Remove" ]; then
+ #dialog --title "SCANNING" --infobox "Please wait while Pkgtool scans \
+#your system to determine which packages you have installed and prepares \
+#a list for you." 0 0
+ # end section
+ (
+create_list_of_files_to_remove #call the function to create a list of installed packages
+ cat << EOF
+dialog --title "SELECT PACKAGES TO REMOVE" --item-help --checklist \
+"Please select the \
+packages you wish to Remove. Use the \
+spacebar to select packages to delete, and the UP/DOWN arrow keys to \
+scroll up and down through the entire list." 20 75 11 \\
+EOF
+ ) > $TMP/rmscript
+ cat $TMP/temporary_list >> $TMP/rmscript
+ echo "2> $TMP/return" >> $TMP/rmscript
+ if [ -L $LOG -o -r $LOG ]; then
+ rm -f $LOG
+ fi
+ cat /dev/null > $LOG
+ chmod 600 $LOG
+ chmod 700 $TMP/rmscript
+ export ADM_DIR;
+ $TMP/rmscript
+ remove_packages
+ if [ "$(cat $TMP/PKGTOOL.REMOVED)" = "" ]; then
+ rm -f $TMP/PKGTOOL.REMOVED
+ dialog --title "NO PACKAGES REMOVED" --msgbox "Hit OK to return \
+to the main menu." 5 40
+ else
+ dialog --title "PACKAGE REMOVAL COMPLETE" --msgbox "The packages have \
+been removed. A complete log of the files that were removed has been created \
+in $TMP: PKGTOOL.REMOVED." 0 0
+ fi
+ rm -f $TMP/rmscript $TMP/return $TMP/tmpmsg $TMP/SeT* $TMP/temporary_list
+ chmod 755 /
+ chmod 1777 /tmp
+# No, return to the main menu:
+# exit
+ elif [ "$REPLY" = "Other" ]; then
+ dialog --title "SELECT SOURCE DIRECTORY" --inputbox "Please enter the name of the directory that you wish to \
+install packages from:" 10 50 2> $TMP/pkgdir
+ if [ $? = 1 ]; then
+ rm -f $TMP/pkgdir $TMP/SeT*
+ dialog --clear
+ exit
+ fi
+ SOURCE_DIR="$(cat $TMP/pkgdir)"
+ SOURCE_MOUNTED="always"
+ DISK_SETS="disk"
+ chmod 755 $TARGET_DIR
+ chmod 1777 $TARGET_DIR/tmp
+ rm -f $TMP/pkgdir
+ if [ ! -d $SOURCE_DIR ]; then
+ dialog --title "DIRECTORY NOT FOUND" --msgbox "The directory you want to \
+install from ($SOURCE_DIR) \
+does not seem to exist. Please check the directory and then try again." \
+10 50
+ dialog --clear
+ exit
+ fi
+ break;
+ else # installing from current directory
+ SOURCE_MOUNTED="always"
+ SOURCE_DIR="$PWD"
+ DISK_SETS="disk"
+ chmod 755 $TARGET_DIR
+ chmod 1777 $TARGET_DIR/tmp
+ break;
+ fi
+ done
+fi
+if [ "$DISK_SETS" = "disk" ]; then
+ ASK="always"
+fi
+
+mount_the_source() {
+ # is the source supposed to be mounted already?
+ if [ "$SOURCE_MOUNTED" = "always" ]; then
+ # The source should already be mounted, so we test it
+ if [ ! -d $SOURCE_DIR ]; then # the directory is missing
+ cat << EOF > $TMP/tmpmsg
+
+Your source device cannot be accessed properly.
+
+Please be sure that it is mounted on $SOURCE_DIR,
+and that the Slackware disks are found in subdirectories
+of $SOURCE_DIR like specified.
+
+EOF
+ dialog --title "MOUNT ERROR" --msgbox "$(cat $TMP/tmpmsg)" 11 67
+ rm -f $TMP/tmpmsg
+ exit 1;
+ fi
+ return 0;
+ fi
+ dialog --title "INSERT DISK" --menu "Please insert disk $1 and \
+press ENTER to continue." \
+11 50 3 \
+"Continue" "Continue with the installation" \
+"Skip" "Skip the current disk series" \
+"Quit" "Abort the installation process" 2> $TMP/reply
+ if [ ! $? = 0 ]; then
+ REPLY="Quit"
+ else
+ REPLY="$(cat $TMP/reply)"
+ fi
+ rm -f $TMP/reply
+ if [ "$REPLY" = "Skip" ]; then
+ return 1;
+ fi
+ if [ "$REPLY" = "Quit" ]; then
+ dialog --title "ABORTING" --msgbox "Aborting software installation." 5 50
+ chmod 755 $TARGET_DIR
+ chmod 1777 $TARGET_DIR/tmp
+ exit 1;
+ fi;
+ # Old line:
+ # mount -r -t msdos $SOURCE_DEVICE $SOURCE_DIR
+ # New ones: (thanks to Andy Schwierskott!)
+ go_on=y
+ not_successfull_mounted=1
+ while [ "$go_on" = y -a "$not_successfull_mounted" = 1 ]; do
+ mount -r -t msdos $SOURCE_DEVICE $SOURCE_DIR
+ not_successfull_mounted=$?
+ if [ "$not_successfull_mounted" = 1 ]; then
+ mount_answer=x
+ while [ "$mount_answer" != "y" -a "$mount_answer" != "q" ] ; do
+ dialog --title "MOUNT PROBLEM" --menu "Media was not successfully \
+mounted! Do you want to \
+retry, or quit?" 10 60 2 \
+"Yes" "Try to mount the disk again" \
+"No" "No, abort." 2> $TMP/mntans
+ mount_answer="$(cat $TMP/mntans)"
+ rm -f $TMP/mntans
+ if [ "$mount_answer" = "Yes" ]; then
+ mount_answer="y"
+ else
+ mount_answer="q"
+ fi
+ done
+ go_on=$mount_answer
+ fi
+ done
+ test $not_successfull_mounted = 0
+}
+
+umount_the_source() {
+ if [ ! "$SOURCE_MOUNTED" = "always" ]; then
+ umount $SOURCE_DEVICE 1> /dev/null 2> /dev/null
+ fi;
+}
+
+install_disk() {
+ mount_the_source $1
+ if [ $? = 1 ]; then
+ umount_the_source;
+ return 1;
+ fi
+ CURRENT_DISK_NAME="$1"
+ PACKAGE_DIR=$SOURCE_DIR
+ if [ "$SOURCE_MOUNTED" = "always" -a ! "$DISK_SETS" = "disk" ]; then
+ PACKAGE_DIR=$PACKAGE_DIR/$1
+ fi
+
+ # If this directory is missing or contains no *.t?z files, bail.
+ if [ ! -d $PACKAGE_DIR ]; then
+ return 1
+ fi
+ if ! ls $PACKAGE_DIR/*.t?z 1> /dev/null 2> /dev/null ; then
+ return 1
+ fi
+
+ #
+ # look for tagfile for this series and copy into $TMP/tagfile
+ #
+ touch $TMP/tagfile
+ if [ ! "$DISK_SETS" = "disk" ]; then
+ if [ -r $TMP/SeTtagext ]; then
+ if [ -r $PACKAGE_DIR/tagfile$(cat $TMP/SeTtagext) ]; then
+ cat $PACKAGE_DIR/tagfile$(cat $TMP/SeTtagext) >> $TMP/tagfile
+ else
+ if [ -r $PACKAGE_DIR/tagfile ]; then
+ cat $PACKAGE_DIR/tagfile >> $TMP/tagfile
+ fi
+ fi
+
+ #
+ # Do we need to follow a custom path to the tagfiles?
+ #
+ elif [ -r $TMP/SeTtagpath ]; then
+ custom_path=$(cat $TMP/SeTtagpath)
+ short_path=$(basename $PACKAGE_DIR)
+
+ # If tagfile exists at the specified custom path, copy it over.
+ if [ -r $custom_path/$short_path/tagfile ]; then
+ cat $custom_path/$short_path/tagfile >> $TMP/tagfile
+
+ else # well, I guess we'll use the default one then.
+ if [ -r $PACKAGE_DIR/tagfile ]; then
+ cat $PACKAGE_DIR/tagfile >> $TMP/tagfile
+ fi
+ fi
+ #
+ # We seem to be testing for this too often... maybe this code should
+ # be optimized a little...
+ #
+ elif [ -r $PACKAGE_DIR/tagfile ]; then
+ cat $PACKAGE_DIR/tagfile >> $TMP/tagfile
+ fi
+
+ #
+ # Execute menus if in QUICK mode:
+ #
+ if [ -r $TMP/SeTQUICK -a -r $PACKAGE_DIR/maketag ]; then
+ if [ ! "$MAKETAG" = "" -a -r $PACKAGE_DIR/$MAKETAG ]; then # use alternate maketag
+ sh $PACKAGE_DIR/$MAKETAG
+ else
+ sh $PACKAGE_DIR/maketag
+ fi
+ if [ -r $TMP/SeTnewtag ]; then
+ mv $TMP/SeTnewtag $TMP/tagfile
+ fi
+ fi
+
+ #
+ # Protect tagfile from hacker attack:
+ #
+ if [ -r $TMP/tagfile ]; then
+ chmod 600 $TMP/tagfile
+ fi
+
+ fi # ! "$DISK_SETS" = "disk"
+
+ # It's possible that the tagfile was specified on the command line. If that's
+ # the case, then we'll just override whatever we figured out up above.
+ if [ ! "$USETAG" = "" ]; then
+ cat $USETAG > $TMP/tagfile
+ fi
+
+ # If there's a catalog file present, use it to check for missing files.
+ # If not, forget about that and install whatever's there.
+ if [ "$1" = "single_disk" -o -r $PACKAGE_DIR/disk$1 -o -r $PACKAGE_DIR/package-list.txt ]; then
+ if [ -r $PACKAGE_DIR/package-list.txt ]; then
+ CATALOG_FILE=$PACKAGE_DIR/package-list.txt
+ else
+ CATALOG_FILE=$(basename $PACKAGE_DIR/disk*);
+ fi
+ if [ -r $PACKAGE_DIR/$CATALOG_FILE -a ! -d $PACKAGE_DIR/$CATALOG_FILE ]; then
+ if grep CONTENTS: $PACKAGE_DIR/$CATALOG_FILE 1> /dev/null 2> /dev/null ; then
+ # First we check for missing packages...
+ for PKGTEST in $(grep "^CONTENTS:" $PACKAGE_DIR/$CATALOG_FILE | cut -f2- -d : 2> /dev/null) ; do
+ # This is not a perfect test. (say emacs is missing but emacs-nox is not)
+ if ls $PACKAGE_DIR/$PKGTEST*.t?z 1> /dev/null 2> /dev/null ; then # found something like it
+ true
+ else
+ cat << EOF > $TMP/tmpmsg
+
+WARNING!!!
+
+While looking through your index file ($CATALOG_FILE),
+I noticed that you might be missing a package:
+
+$PKGTEST-\*-\*-\*.t?z
+
+that is supposed to be on this disk (disk $1). You may go
+on with the installation if you wish, but if this is a
+crucial file I'm making no promises that your machine will
+boot.
+
+EOF
+ dialog --title "FILE MISSING FROM YOUR DISK" --msgbox \
+"$(cat $TMP/tmpmsg)" 17 67
+ fi
+ done # checking for missing packages
+ # Now we test for extra packages:
+ ALLOWED="$(grep CONTENTS: $PACKAGE_DIR/$CATALOG_FILE | cut -b10- 2> /dev/null)"
+ for PACKAGE_FILENAME in $PACKAGE_DIR/*.t?z; do
+ BASE=$(pkgbase $PACKAGE_FILENAME)
+ BASE="$(package_name $BASE)"
+ if echo $ALLOWED | grep $BASE 1> /dev/null 2> /dev/null ; then
+ true
+ else
+ cat << EOF > $TMP/tmpmsg
+
+WARNING!!!
+
+While looking through your index file ($CATALOG_FILE),
+I noticed that you have this extra package:
+
+($BASE.t?z)
+
+that I don't recognize. Please be sure this package is
+really supposed to be here, and is not left over from an
+old version of Slackware. Sometimes this can happen at the
+archive sites.
+
+EOF
+ dialog --title "EXTRA FILE FOUND ON YOUR DISK" \
+--msgbox "$(cat $TMP/tmpmsg)" 17 67
+ rm -f $TMP/tmpmsg
+ fi
+ done
+ fi
+ fi
+ fi # check for missing/extra packages
+
+ # Install the packages:
+ for PACKAGE_FILENAME in $PACKAGE_DIR/*.t?z; do
+ if [ "$PACKAGE_FILENAME" = "$PACKAGE_DIR/*.t?z" ]; then
+ continue;
+ fi
+ if [ "$ASK" = "never" ]; then # install the package
+ installpkg -root $TARGET_DIR -infobox -tagfile $TMP/tagfile $PACKAGE_FILENAME
+ ERROR=$?
+ elif [ "$ASK" = "tagfiles" ]; then
+ installpkg -root $TARGET_DIR -menu -tagfile $TMP/tagfile $PACKAGE_FILENAME
+ ERROR=$?
+ else # ASK should be = always here, and that's how we'll treat it
+ installpkg -root $TARGET_DIR -menu -ask -tagfile $TMP/tagfile $PACKAGE_FILENAME
+ ERROR=$?
+ fi
+ # Check for abort:
+ if [ "$ERROR" = "99" ]; then
+ umount_the_source;
+ chmod 755 $TARGET_DIR
+ chmod 1777 $TARGET_DIR/tmp
+ exit 1;
+ fi
+ done
+ OUTTAHERE="false"
+ if [ -r $PACKAGE_DIR/install.end ]; then
+ OUTTAHERE="true"
+ fi
+ umount_the_source;
+ if [ "$OUTTAHERE" = "true" ]; then
+ return 1;
+ fi
+}
+
+install_disk_set() { # accepts one argument: the series name in lowercase.
+ SERIES_NAME=$1
+ CURRENT_DISK_NUMBER="1";
+ while [ 0 ]; do
+ # Don't start numbering the directories until 2:
+ if [ $CURRENT_DISK_NUMBER = 1 ]; then
+ DISKTOINSTALL=$SERIES_NAME
+ else
+ DISKTOINSTALL=$SERIES_NAME$CURRENT_DISK_NUMBER
+ fi
+ install_disk $DISKTOINSTALL
+ if [ ! $? = 0 ]; then # install.end was found, or the user chose
+ # to quit installing packages.
+ return 0;
+ fi
+ CURRENT_DISK_NUMBER=$(expr $CURRENT_DISK_NUMBER + 1)
+ done;
+}
+
+# /* main() */ ;)
+if [ "$DISK_SETS" = "disk" ]; then
+ install_disk single_disk;
+ ASK="always"
+else
+ touch $TMP/tagfile
+ chmod 600 $TMP/tagfile
+ if echo $DISK_SETS | grep "#a#" 1> /dev/null 2> /dev/null ; then
+ A_IS_NEEDED="true"
+ else
+ A_IS_NEEDED="false"
+ fi
+ while [ 0 ];
+ do
+ while [ 0 ]; # strip leading '#'s
+ do
+ if [ "$(echo $DISK_SETS | cut -b1)" = "#" ]; then
+ DISK_SETS="$(echo $DISK_SETS | cut -b2-)"
+ else
+ break;
+ fi
+ done
+ if [ "$A_IS_NEEDED" = "true" ]; then
+ cat << EOF > $TMP/tmpmsg
+
+--- Installing package series ==>a<==
+
+EOF
+ dialog --infobox "$(cat $TMP/tmpmsg)" 5 45
+ sleep 1
+ rm -f $TMP/tmpmsg
+ install_disk_set a;
+ A_IS_NEEDED="false"
+ fi
+ count="1"
+ if [ "$(echo $DISK_SETS | cut -b$count)" = "" ]; then
+ break; # we be done here :^)
+ else
+ count="2"
+ while [ 0 ]; do
+ if [ "$(echo $DISK_SETS | cut -b$count)" = "" -o "$(echo $DISK_SETS | cut -b$count)" = "#" ]; then
+ count="$(expr $count - 1)"
+ break;
+ else
+ count="$(expr $count + 1)"
+ fi
+ done
+ fi
+ diskset="$(echo $DISK_SETS | cut -b1-$count)"
+ count="$(expr $count + 1)"
+ DISK_SETS="$(echo $DISK_SETS | cut -b$count-)"
+ if [ "$diskset" = "a" ]; then
+ continue; # we expect this to be done elsewhere
+ fi
+ cat << EOF > $TMP/tmpmsg
+
+Installing package series ==>$diskset<==
+
+EOF
+ dialog --infobox "$(cat $TMP/tmpmsg)" 5 45
+ sleep 1
+ rm -f $TMP/tmpmsg
+ install_disk_set $diskset;
+ done
+fi
+
+if [ "$DISK_SETS" = "disk" -o "$CMD_START" = "true" ]; then
+ if [ -r $TMP/tagfile ]; then
+ rm $TMP/tagfile
+ fi
+ dialog --clear
+fi
+chmod 755 $TARGET_DIR $TARGET_DIR/var $TARGET_DIR/usr
+chmod 1777 $TARGET_DIR/tmp
diff --git a/testing/source/pkgtools/scripts/removepkg b/testing/source/pkgtools/scripts/removepkg
new file mode 100644
index 00000000..b033eebf
--- /dev/null
+++ b/testing/source/pkgtools/scripts/removepkg
@@ -0,0 +1,438 @@
+#!/bin/sh
+# Slackware remove package script
+#
+# Copyright 1994, 1995, 1998 Patrick Volkerding, Moorhead, Minnesota USA
+# Copyright 2001, Slackware Linux, Inc., Concord, CA USA
+# Copyright 2009, 2015, 2016, 2018 Patrick J. Volkerding, Sebeka, MN, USA
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+# Tue Jun 5 20:04:45 UTC 2018
+# Use /var/lib/pkgtools for the package database, not /var/log.
+# Logs of the removed packages and scripts will remain in /var/log, but moved
+# into /var/log/pkgtools.
+#
+# Sun May 27 18:02:23 UTC 2018
+# Added --terse mode to print one line per removed package.
+#
+# Wed May 23 17:31:23 UTC 2018
+# Use file locking to prevent more than one copy of ldconfig from running at
+# a time.
+#
+# Thu Sep 15 17:46:28 UTC 2016 <volkerdi>
+# If removepkg is called with a short package name (no -$VERSION-$ARCH-$BUILD),
+# remove the most recently installed matching package, not the oldest one.
+#
+# Thu Sep 15 08:09:01 BST 2016 <mozes>
+# - Handle finding >1 match for a package. Thanks to SeB on LQ for the feedback.
+#
+# Wed Sep 14 20:44:00 BST 2016 <mozes>
+# - Modify package_name function to cater for package file names that contain
+# >=4 hyphens.
+# Thanks to coralfang on LQ for the report and to Jim Hawkins for the patch.
+# - Modified to handle packages that contain file names with backslashes
+# Thanks to aaazen on LQ for the report and the patch.
+#
+# Thu Sep 24 03:31:58 UTC 2015 <alphageek>
+# extract_links() sed adjusted to handle symlinks with spaces.
+#
+# Sun Sep 6 21:58:36 BST 2009
+# Replaced pkgbase & package_name code with 'sed' script by Jim Hawkins.
+#
+# Sat Apr 25 21:18:53 UTC 2009 (12.34567890b)
+# Converted to use new pkgbase() function to remove pathname and
+# valid package extensions.
+#
+# Revision 12.34567890 Sun Apr 5 20:59:32 CDT 2009 <volkerdi>
+# - Support packages with the extensions: .tgz, .tbz, .tlz, .txz
+#
+# Revision 1.9 Wed Oct 31 14:04:28 CDT 2007 volkerding
+# - Fix problem removing packages with a large number of fields.
+# Thanks to Niki Kovacs for noticing this, and to Piter Punk
+# for the patch.
+# - Use LC_ALL=C locale, which is much faster with "sort".
+# Thanks to Tsomi.
+# - Don't try to remove any package that starts with '-'. This
+# is not a proper package name (usually a typo), and results
+# in the package database being broken. Thanks to Jef Oliver.
+# - Patched cat_except() to allow the last Slackware package on
+# a partition to be removed (using ROOT=, of course)
+# Thanks to Selkfoster for the patch, and to everyone else who
+# proposed solutions before. This issue really wasn't given
+# the highest priority before, but I figured while I'm in here...
+#
+# Revision 1.8 Thu Nov 22 14:00:13 PST 2001 volkerding Rel $
+# - Move $TMP underneath $ROOT
+# - Understand the idea of a base package name, so that packages
+# can be removed with any of these notations:
+# removepkg foo-1.0-i386-1.tgz
+# removepkg foo-1.0-i386-1
+# removepkg foo.tgz
+# removepkg foo
+#
+# Revision 1.7 2001/03/30 12:36:28 volkerding
+# - Strip extra ".tgz" from input names.
+#
+# Revision 1.6 1999/03/25 18:26:41 volkerding
+# - Use external $ROOT variable, like installpkg.
+#
+# Revision 1.5.1 1998/03/18 15:37:28 volkerding
+# - Since removepkg is always run by root, the temp directory has been
+# moved from /tmp to a private directory to avoid symlink attacks from
+# malicious users.
+#
+# Revision 1.5 1997/06/26 12:09:53 franke
+# - Fixed old bug in TRIGGER regex setting
+# - -preserve/-copy options now preserve non-unique files
+# and empty directories also
+#
+# Revision 1.4 1997/06/09 13:21:36 franke
+# - Package file preserve (-preserve, -copy) added.
+# - Don't execute "rm -rf" lines from doinst.sh, removing links explicit.
+# - Warning on no longer existing files added.
+# - Warning on files changed after package installation added.
+# - Intermediate file preserve (-keep) added.
+# - Check for required files/links now done on a combined list.
+# - Write access to /var/log/{packages,scripts} no longer necessary for -warn.
+#
+# Revision 1.3 1997/06/08 13:03:05 franke
+# Merged with revision 1.1.1.1
+#
+# Revision 1.2 1996/06/01 20:04:26 franke
+# Delete empty directories & formated manual pages added
+#
+# Revision 1.1.1.1 1995/12/18 21:20:42 volkerding
+# Original Version from Slackware 3.1
+#
+# Revision 1.1 1995/06/05 22:49:11 volkerding
+# Original Version from Slackware 3.0
+#
+
+# Needed to find package names within the 'remove_packages' function:
+shopt -s extglob
+
+# Return a package name that has been stripped of the dirname portion
+# and any of the valid extensions (only):
+pkgbase() {
+ # basename + strip extensions .tbz, .tgz, .tlz and .txz
+ echo "$1" | sed 's?.*/??;s/\.t[bglx]z$//'
+}
+
+# This makes "sort" run much faster:
+export LC_ALL=C
+
+# Set the prefix for the package database directories (packages, scripts).
+ADM_DIR="$ROOT/var/lib/pkgtools"
+
+# Set the prefix for the removed packages/scripts log files:
+LOG_DIR="$ROOT/var/log/pkgtools"
+
+# Make sure there's a proper temp directory:
+TMP=$ADM_DIR/setup/tmp
+# If the $TMP directory doesn't exist, create it:
+if [ ! -d $TMP ]; then
+ mkdir -p $TMP
+ chmod 700 $TMP # no need to leave it open
+fi
+PRES_DIR=$TMP/preserved_packages
+
+# Lock directory for ldconfig... share it with installpkg so that upgradepkg
+# becomes properly ldconfig-locked, too.
+INSTLOCKDIR=${INSTLOCKDIR:-/run/lock/pkgtools}
+if [ ! -d $INSTLOCKDIR ]; then
+ mkdir -p $INSTLOCKDIR
+fi
+
+# This simple cat_except() should be used on the installer,
+# since the busybox "find" can't handle the complex find
+# syntax:
+#cat_except() {
+# ( cd "$1" && cat $(ls * | sed "/^$2\$/d"))
+#}
+
+# This version of cat_except() allows the last package to be
+# removed when ROOT= is used:
+cat_except() {
+ ( cd "$1" && \
+ if [ $(find . -type f -maxdepth 1 2> /dev/null | wc -l) -ne 1 ]; then
+ cat $(find . -type f -maxdepth 1 2> /dev/null | grep -v "$2") 2> /dev/null
+ fi
+ )
+}
+
+extract_links() {
+ sed -n 's,^[ ]*( [ ]*cd[ ]* \(.*\) [ ]*; [ ]*rm [ ]*-rf[ ]* \(.*\) [ ]*)[ ]*$,\1/\2,p'
+}
+
+preserve_file() {
+ if [ "$PRESERVE" = "true" ]; then
+ F="$(basename "$1")"
+ D="$(dirname "$1")"
+ if [ ! -d "$PRES_DIR/$PKGNAME/$D" ]; then
+ mkdir -p "$PRES_DIR/$PKGNAME/$D" || return 1
+ fi
+ cp -p "$ROOT/$D/$F" "$PRES_DIR/$PKGNAME/$D" || return 1
+ fi
+ return 0
+}
+
+preserve_dir() {
+ if [ "$PRESERVE" = "true" ]; then
+ if [ ! -d "$PRES_DIR/$PKGNAME/$1" ]; then
+ mkdir -p "$PRES_DIR/$PKGNAME/$1" || return 1
+ fi
+ fi
+ return 0
+}
+
+keep_files() {
+ while read FILE ; do
+ if [ ! -d "$ROOT/$FILE" ]; then
+ if [ -r "$ROOT/$FILE" ]; then
+ ! [ $TERSE ] && echo " --> $ROOT/$FILE was found in another package. Skipping."
+ preserve_file "$FILE"
+ else
+ if [ "$(echo $FILE | cut -b1-8)" != "install/" ]; then
+ ! [ $TERSE ] && echo "WARNING: Nonexistent $ROOT/$FILE was found in another package. Skipping."
+ fi
+ fi
+ else
+ preserve_dir "$FILE"
+ fi
+ done
+}
+
+keep_links() {
+ while read LINK ; do
+ if [ -L "$ROOT/$LINK" ]; then
+ ! [ $TERSE ] && echo " --> $ROOT/$LINK (symlink) was found in another package. Skipping."
+ else
+ ! [ $TERSE ] && echo "WARNING: Nonexistent $ROOT/$LINK (symlink) was found in another package. Skipping."
+ fi
+ done
+}
+
+delete_files() {
+ local unset LC_ALL # Locally (within this delete_files function) allow handling of backslashes
+ while read -r AFILE ; do # do not expand backslashes on read
+ FILE=$(printf "%b" "$AFILE") # unescape octal characters
+ if [ ! -d "$ROOT/$FILE" ]; then
+ if [ -r "$ROOT/$FILE" ]; then
+ if [ "$ROOT/$FILE" -nt "$ADM_DIR/packages/$PKGNAME" ]; then
+ ! [ $TERSE ] && echo "WARNING: $ROOT/$FILE changed after package installation."
+ fi
+ if [ ! "$WARN" = "true" ]; then
+ ! [ $TERSE ] && echo " --> Deleting $ROOT/$FILE"
+ preserve_file "$FILE" && rm -f "$ROOT/$FILE"
+ else
+ ! [ $TERSE ] && echo " --> $ROOT/$FILE would be deleted"
+ preserve_file "$FILE"
+ fi
+ else
+ ! [ $TERSE ] && echo " --> $ROOT/$FILE no longer exists. Skipping."
+ fi
+ else
+ preserve_dir "$FILE"
+ fi
+ done
+}
+
+delete_links() {
+ while read LINK ; do
+ if [ -L "$ROOT/$LINK" ]; then
+ if [ ! "$WARN" = "true" ]; then
+ ! [ $TERSE ] && echo " --> Deleting symlink $ROOT/$LINK"
+ rm -f "$ROOT/$LINK"
+ else
+ ! [ $TERSE ] && echo " --> $ROOT/$LINK (symlink) would be deleted"
+ fi
+ else
+ ! [ $TERSE ] && echo " --> $ROOT/$LINK (symlink) no longer exists. Skipping."
+ fi
+ done
+}
+
+delete_dirs() {
+ sort -r | \
+ while read DIR ; do
+ if [ -d "$ROOT/$DIR" ]; then
+ if [ ! "$WARN" = "true" ]; then
+ if [ $(ls -a "$ROOT/$DIR" | wc -l) -eq 2 ]; then
+ ! [ $TERSE ] && echo " --> Deleting empty directory $ROOT/$DIR"
+ rmdir "$ROOT/$DIR"
+ else
+ ! [ $TERSE ] && echo "WARNING: Unique directory $ROOT/$DIR contains new files"
+ fi
+ else
+ ! [ $TERSE ] && echo " --> $ROOT/$DIR (dir) would be deleted if empty"
+ fi
+ fi
+ done
+}
+
+delete_cats() {
+ sed -n 's,/man\(./[^/]*$\),/cat\1,p' | \
+ while read FILE ; do
+ if [ -f "$ROOT/$FILE" ]; then
+ if [ ! "$WARN" = "true" ]; then
+ ! [ $TERSE ] && echo " --> Deleting $ROOT/$FILE (fmt man page)"
+ rm -f $ROOT/$FILE
+ else
+ ! [ $TERSE ] && echo " --> $ROOT/$FILE (fmt man page) would be deleted"
+ fi
+ fi
+ done
+}
+
+# Conversion to 'comm' utility by Mark Wisdom.
+# is pretty nifty! :^)
+remove_packages() {
+ for PKGLIST in $*
+ do
+ PKGNAME=$(pkgbase $PKGLIST)
+ # If we don't have a package match here, then we will attempt to find
+ # a package using the long name format (name-version-arch-build) for
+ # which the base package name was given. On a properly-managed machine,
+ # there should only be one package installed with a given basename, but
+ # we don't enforce this policy. If there's more than one, only one will
+ # be removed. If you want to remove them all, you'll need to run
+ # removepkg again until it removes all the same-named packages.
+ if [ ! -e $ADM_DIR/packages/$PKGNAME ]; then
+ # Short name not found - finally try looking for full name - e.g. foo-1.0-arm-1
+ pushd $ADM_DIR/packages > /dev/null
+ # Don't set PKGNAME if there are no matches:
+ if [ ! "$( ls -1 $PKGNAME-+([^-])-+([^-])-+([^-]) 2>/dev/null | wc -l )" = "0" ]; then
+ # If there is more than one package with the same name, set PKGNAME to the
+ # most recently installed version. This does not affect the behavior of
+ # upgradepkg, which always removes all other existing versions of the
+ # same package.
+ PKGNAME=$( ls -1t $PKGNAME-+([^-])-+([^-])-+([^-]) 2> /dev/null | head -n1 )
+ fi
+ popd > /dev/null
+ fi
+
+ if [ -r $ADM_DIR/packages/$PKGNAME ]; then
+ if [ ! "$WARN" = true ]; then
+ echo "Removing package: $(basename $ADM_DIR/packages/$PKGNAME)"
+ fi
+ if fgrep "./" $ADM_DIR/packages/$PKGNAME 1> /dev/null 2>&1; then
+ TRIGGER="^\.\/"
+ else
+ TRIGGER="FILE LIST:"
+ fi
+ if [ ! "$WARN" = true ]; then
+ ! [ $TERSE ] && echo "Removing files:"
+ fi
+ sed -n "/$TRIGGER/,/^$/p" < $ADM_DIR/packages/$PKGNAME | \
+ fgrep -v "FILE LIST:" | sort -u > $TMP/delete_list$$
+ # Pat's new-new && improved pre-removal routine.
+ cat_except $ADM_DIR/packages $PKGNAME | sort -u > $TMP/required_list$$
+ if [ -r $ADM_DIR/scripts/$PKGNAME ]; then
+ extract_links < $ADM_DIR/scripts/$PKGNAME | sort -u > $TMP/del_link_list$$
+ cat_except $ADM_DIR/scripts $PKGNAME | extract_links | \
+ sort -u > $TMP/required_links$$
+ mv $TMP/required_list$$ $TMP/required_files$$
+ sort -u $TMP/required_links$$ $TMP/required_files$$ > $TMP/required_list$$
+ comm -12 $TMP/del_link_list$$ $TMP/required_list$$ | keep_links
+ comm -23 $TMP/del_link_list$$ $TMP/required_list$$ | delete_links
+ else
+ cat $ADM_DIR/scripts/* 2> /dev/null | extract_links | \
+ sort -u > $TMP/required_links$$
+ mv $TMP/required_list$$ $TMP/required_files$$
+ sort -u $TMP/required_links$$ $TMP/required_files$$ >$TMP/required_list$$
+ fi
+ comm -12 $TMP/delete_list$$ $TMP/required_list$$ | keep_files
+ comm -23 $TMP/delete_list$$ $TMP/required_list$$ > $TMP/uniq_list$$
+ delete_files < $TMP/uniq_list$$
+ delete_dirs < $TMP/uniq_list$$
+ delete_cats < $TMP/uniq_list$$
+ if [ ! "$KEEP" = "true" ]; then
+ rm -f $TMP/delete_list$$ $TMP/required_files$$ $TMP/uniq_list$$
+ rm -f $TMP/del_link_list$$ $TMP/required_links$$ $TMP/required_list$$
+ fi
+ if [ "$PRESERVE" = "true" ]; then
+ if [ -r $ADM_DIR/scripts/$PKGNAME ]; then
+ if [ ! -d "$PRES_DIR/$PKGNAME/install" ]; then
+ mkdir -p "$PRES_DIR/$PKGNAME/install"
+ fi
+ cp -p $ADM_DIR/scripts/$PKGNAME $PRES_DIR/$PKGNAME/install/doinst.sh
+ fi
+ fi
+ if [ ! "$WARN" = "true" ]; then
+ # We won't assume that anything in /var/log can be trusted to remain there,
+ # so we'll remake the directories and symlinks first:
+ mkdir -p $LOG_DIR/removed_packages $LOG_DIR/removed_scripts
+ for symlink in removed_packages removed_scripts ; do
+ if [ ! -L $LOG_DIR/../$symlink ]; then
+ rm -rf $LOG_DIR/../$symlink
+ ( cd $LOG_DIR/.. ; ln -sf pkgtools/$symlink . )
+ fi
+ done
+ # Now that we know we have log directories, move the files:
+ mv $ADM_DIR/packages/$PKGNAME $LOG_DIR/removed_packages
+ if [ -r $ADM_DIR/scripts/$PKGNAME ]; then
+ mv $ADM_DIR/scripts/$PKGNAME $LOG_DIR/removed_scripts
+ fi
+ fi
+ else
+ echo "No such package: $(basename $ADM_DIR/packages/$PKGNAME). Can't remove."
+ fi
+ # In the case where a library and symlink are removed but an earlier version
+ # remains on the machine, this will link it up and save potential problems:
+ if [ "$ROOT" = "" ] && [ -x /sbin/ldconfig ]; then
+ ( flock 9 || exit 11
+ /sbin/ldconfig 2> /dev/null
+ ) 9> $INSTLOCKDIR/ldconfig.lock
+ fi
+ done
+}
+
+if [ "$#" = "0" ]; then
+ echo "Usage: $(basename $0) [--copy] [--keep] [--preserve] [--terse] [--warn] packagename ..."; exit 1
+fi
+
+while : ; do
+ case "$1" in
+ -copy | --copy) WARN=true; PRESERVE=true; shift;;
+ -keep | --keep) KEEP=true; shift;;
+ -preserve | --preserve) PRESERVE=true; shift;;
+ -terse | --terse) TERSE=0; shift;;
+ -warn | --warn) WARN=true; shift;;
+ -* | --*) echo "Usage: $(basename $0) [-copy] [-keep] [-preserve] [-warn] packagename ..."; exit 1;;
+ *) break
+ esac
+done
+
+if [ "$WARN" = "true" ]; then
+ unset TERSE
+ echo "Only warning... not actually removing any files."
+ if [ "$PRESERVE" = "true" ]; then
+ echo "Package contents is copied to $PRES_DIR."
+ fi
+ echo "Here's what would be removed (and left behind) if you"
+ echo "removed the package(s):"
+ echo
+else
+ if [ "$PRESERVE" = "true" ]; then
+ echo "Package contents is copied to $PRES_DIR."
+ fi
+fi
+
+remove_packages $*
diff --git a/testing/source/pkgtools/scripts/setup.70.install-kernel b/testing/source/pkgtools/scripts/setup.70.install-kernel
new file mode 100644
index 00000000..8edf6477
--- /dev/null
+++ b/testing/source/pkgtools/scripts/setup.70.install-kernel
@@ -0,0 +1,5 @@
+# Install the bootdisk or CD-ROM's Linux kernel:
+#BLURB="Install a Linux kernel from a bootdisk"
+if [ -x /usr/lib/setup/SeTkernel ]; then
+ . /usr/lib/setup/SeTkernel
+fi
diff --git a/testing/source/pkgtools/scripts/setup.80.make-bootdisk b/testing/source/pkgtools/scripts/setup.80.make-bootdisk
new file mode 100644
index 00000000..0ed8b9a1
--- /dev/null
+++ b/testing/source/pkgtools/scripts/setup.80.make-bootdisk
@@ -0,0 +1,267 @@
+#!/bin/sh
+#BLURB="Create a USB Linux boot stick"
+if [ -r /usr/lib/setup/setup ]; then
+ RDIR=/dev/tty4
+else
+ RDIR=/dev/null
+fi
+TMP=/var/lib/pkgtools/setup/tmp
+
+if [ ! -d $TMP ]; then
+ mkdir -p $TMP
+fi
+if [ -z "$1" ]; then
+ T_PX=/
+else
+ T_PX="$1"
+fi
+if [ -z "$2" ]; then
+ ROOT_DEVICE=$(mount | head -n 1 | cut -f 1 -d ' ')
+else
+ ROOT_DEVICE="$2"
+fi
+
+if [ -r $T_PX/usr/share/syslinux/mbr.bin ]; then
+ MBR_BIN=$T_PX/usr/share/syslinux/mbr.bin
+elif [ -r /usr/share/syslinux/mbr.bin ]; then
+ MBR_BIN=/usr/share/syslinux/mbr.bin
+else
+ dialog --title "ERROR: USB BOOT STICK NOT CREATED" --msgbox \
+ "Master Boot Record file mbr.bin not found. This script requires that the syslinux package is installed." 6 60
+ exit
+fi
+
+while [ 0 ]; do # the bootdisk menu loop
+ # Run "rescan-scsi-bus -l" to get an up to date overview of devices:
+ /sbin/rescan-scsi-bus -l 1>$RDIR 2>$RDIR
+ # Get a list of removable block devices before the USB stick is inserted:
+ echo "" > $TMP/remov_prior
+ for BDEV in $(ls --indicator-style none /sys/block | egrep -v "loop|ram"); do
+ [ -r /sys/block/$BDEV/removable -a "$(cat /sys/block/$BDEV/removable)" == "1" ] \
+ && echo $BDEV >> $TMP/remov_prior
+ done
+ if [ "$T_PX" = "/" ]; then
+ DEFAULTITEM="Create"
+ else
+ DEFAULTITEM="Skip"
+ fi
+ dialog --title "MAKE USB FLASH BOOT" --default-item "$DEFAULTITEM" --menu \
+"If your computer supports booting from a USB device, it is recommended that you make \
+a USB boot stick for your system at this time. It will boot your computer straight \
+into the root filesystem on $ROOT_DEVICE. \n\
+\n\
+Please insert a USB flash memory stick and then press ENTER to create a boot stick. \n\
+\n\
+WARNING! The existing contents of the USB stick will be erased. \n\
+ " 18 70 2 \
+ "Create" "Make a USB Linux boot stick" \
+ "Skip" "Skip making a USB boot stick" \
+ 2> $TMP/return
+ REPLY=`cat $TMP/return`
+ rm -f $TMP/return
+ if [ "$REPLY" = "Create" ]; then
+ # Run "rescan-scsi-bus -l" to discover our USB stick if needed:
+ /sbin/rescan-scsi-bus -l 1>$RDIR 2>$RDIR
+ # Get a list of removable block devices after the USB stick is inserted:
+ echo "" > $TMP/remov_after
+ for BDEV in $(ls --indicator-style none /sys/block | egrep -v "loop|ram"); do
+ [ -r /sys/block/$BDEV/removable -a "$(cat /sys/block/$BDEV/removable)" == "1" ] \
+ && echo $BDEV >> $TMP/remov_after
+ done
+ ADDED=$(diff -u $TMP/remov_prior $TMP/remov_after | sed -n 's/^\+//p' | grep -v '^+')
+ REMVD=$(diff -u $TMP/remov_prior $TMP/remov_after | sed -n 's/^\+//p' | grep -v '^+')
+ if [ -n "$ADDED" ] ; then STICK=$ADDED ; else STICK="" ; fi
+ rm $TMP/remov_prior $TMP/remov_after
+ if [ ! -n "$STICK" ]; then
+ dialog --title "NO NEW DEVICE DETECTED" --ok-label Restart --msgbox \
+"No new USB device was detected.
+If you had already inserted your USB stick, please remove it now. \
+Then select 'Restart'." 7 70
+ continue
+ else
+ VENDOR="Vendor : $(cat /sys/block/$STICK/device/vendor)"
+ MODEL="Model : $(cat /sys/block/$STICK/device/model)"
+ SIZE="Size : $(( $(cat /sys/block/$STICK/size) / 2048)) MB"
+ dialog --title "NEW DEVICE DETECTED" --yesno \
+"A new USB device '/dev/$STICK' was detected with specifications:
+
+-- $VENDOR
+-- $MODEL
+-- $SIZE
+
+If this is the USB stick to use, select 'Yes',
+otherwise select 'No'." 12 70
+ if [ $? -eq 1 ]; then
+ continue
+ fi
+ fi
+
+ dialog --title "CREATING USB BOOT STICK" --infobox "Creating SYSLINUX bootdisk for \
+$ROOT_DEVICE on /dev/$STICK." 3 64
+ # Create a 16M partition with FAT16. This should be large enough for any kernel (for now).
+ PARTSIZE="+16384K"
+ # Zero out master boot record and then initialize it with one bootable dos partition
+ dd if=/dev/zero of=/dev/$STICK bs=512 count=1 1> $RDIR 2> $RDIR
+ echo "PARTSIZE=$PARTSIZE" 1> $RDIR
+ fdisk /dev/$STICK << EOF 1> $RDIR 2> $RDIR
+n
+p
+1
+2048
+$PARTSIZE
+t 1
+6
+a
+w
+EOF
+ if [ -x /sbin/mkdosfs ]; then
+ /sbin/mkdosfs -I -n USBSLACK -F 16 /dev/${STICK}1 1> $RDIR 2> $RDIR
+ else
+ chroot $T_PX /sbin/mkdosfs -I -n USBSLACK -F 16 /dev/${STICK}1 1> $RDIR 2> $RDIR
+ fi
+ sync
+ # install syslinux
+ if which syslinux-nomtools 1> $RDIR 2> $RDIR ; then
+ syslinux-nomtools -i -s /dev/${STICK}1 1> $RDIR 2> $RDIR
+ elif which strace 1> $RDIR 2> $RDIR ; then
+ # There is a race condition between udev >= 214 and mtools which causes
+ # the regular version of syslinux to fail when installing to USB, but
+ # strace changes the timing just enough that it usually works:
+ strace syslinux -i -s /dev/${STICK}1 1> $RDIR 2> $RDIR
+ else
+ # This might work when the issues with mtools and udev are addressed,
+ # or if syslinux is eventually able to work around them.
+ syslinux -i -s /dev/${STICK}1 1> $RDIR 2> $RDIR
+ fi
+ # make the device bootable:
+ echo "dd if=$MBR_BIN of=/dev/$STICK" 1> $RDIR 2> $RDIR
+ dd if=$MBR_BIN of=/dev/$STICK 1> $RDIR 2> $RDIR
+ sync
+ # mount the device and write some configuration files
+ if [ ! -d $TMP/bootdisk ]; then
+ mkdir $TMP/bootdisk 2> $RDIR
+ fi
+ mount -t vfat /dev/${STICK}1 $TMP/bootdisk 1> $RDIR 2> $RDIR
+ if [ -r $T_PX/boot/vmlinuz ]; then
+ cp $T_PX/boot/vmlinuz $TMP/bootdisk/vmlinuz 1> $RDIR 2> $RDIR
+ elif [ -r $T_PX/vmlinuz ]; then
+ cp $T_PX/vmlinuz $TMP/bootdisk/vmlinuz 1> $RDIR 2> $RDIR
+ fi
+ cat << EOF > $TMP/bootdisk/message.txt 2> $RDIR
+
+Welcome to the 09Slackware07 Linux custom USB boot stick!
+
+By default, this stick boots a root Linux partition on $ROOT_DEVICE when you
+hit ENTER. If you'd like to boot some other partition, use a command like
+this on the prompt below:
+
+ mount root=/dev/sda1 ro
+
+Where "/dev/sda1" is the partition you want to boot, and "ro" specifies that
+the partition should be initially mounted as read-only. If you wish to mount
+the partition read-write, use "rw" instead. To set the video console mode,
+use the vga= parameter (press F1 to see a table). You may also add any other
+kernel parameters you might need depending on your hardware, and which
+drivers are included in your kernel.
+
+EOF
+ cat << EOF > $TMP/bootdisk/syslinux.cfg 2> $RDIR
+default vmlinuz root=$ROOT_DEVICE vga=normal ro
+prompt 1
+timeout 6000
+display message.txt
+F1 f1.txt
+F2 message.txt
+#F3 f3.txt
+#F4 f4.txt
+#F5 f5.txt
+#F6 f6.txt
+#F7 f7.txt
+label mount
+ kernel vmlinuz
+ append root=$ROOT_DEVICE vga=normal ro
+EOF
+ cat << EOF > $TMP/bootdisk/f1.txt 2> $RDIR
+ STANDARD MODES:
+ To make the kernel prompt for standard video modes use: vga=ask
+
+ FRAMEBUFFER MODES:
+ To get the kernel to start in VESA framebuffer mode, you need to pass it
+ a vga= init string on the "boot:" prompt. Here's a table:
+
+ Colors 640x480 800x600 1024x768 1280x1024 1600x1200
+ --------+---------------------------------------------
+ 256 | 769 771 773 775 796
+ 32,768 | 784 787 790 793 797
+ 65,536 | 785 788 791 794 798
+ 16.8M | 786 789 792 795 799
+
+ ...such as this for 1024x768x64k:
+ vga=791
+
+ F2 returns to the previous page.
+
+EOF
+ if [ "$(uname -m)" == "x86_64" ]; then # also install an EFI bootloader
+ mkdir -p $TMP/bootdisk/EFI/BOOT 1> $RDIR 2> $RDIR
+ cp $T_PX/boot/elilo-x86_64.efi $TMP/bootdisk/EFI/BOOT/BOOTX64.EFI 1> $RDIR 2> $RDIR
+ cat << EOF > $TMP/bootdisk/EFI/BOOT/message.txt 2> $RDIR
+
+Welcome to the Slackware Linux custom USB boot stick!
+
+By default, this stick boots a root Linux partition on $ROOT_DEVICE when you
+hit ENTER. If you'd like to boot some other partition, use a command like
+this on the prompt below:
+
+ huge.s root=/dev/sda1 ro
+
+Where "/dev/sda1" is the partition you want to boot, and "ro" specifies that
+the partition should be initially mounted as read-only. If you wish to mount
+the partition read-write, use "rw" instead. You may also add any other
+kernel parameters you might need depending on your hardware, and which
+drivers are included in your kernel.
+
+Hit ENTER to boot:
+
+EOF
+ cat << EOF > $TMP/bootdisk/EFI/BOOT/elilo.conf 2> $RDIR
+chooser=simple
+message=message.txt
+delay=300
+timeout=300
+#
+image=/vmlinuz
+ label=huge.s
+ read-only
+ append="root=$ROOT_DEVICE vga=normal ro"
+EOF
+ fi # end EFI installation
+ sync
+ umount /dev/${STICK}1
+ rm -r $TMP/bootdisk
+ # Sometimes the nomtools version of syslinux will leave the volume mounted,
+ # so umount again:
+ umount /dev/${STICK}1 2> $RDIR
+ if [ "$T_PX" = "/" ]; then
+ dialog --title "USB BOOT STICK CREATED" --msgbox \
+ "The USB boot stick has been successfully created on device /dev/$STICK." 6 60
+ exit
+ fi
+ dialog --title "USB BOOT STICK CREATED" --ok-label Continue --cancel-label Create --menu \
+"The USB boot stick has been successfully created on device /dev/$STICK. If you would like to \
+create an additional boot stick, please select 'Create' and we'll go back and make another \
+one, otherwise select 'Continue' to continue configuring your system." 12 71 2 \
+ "Continue" "Continue the configuration (done making boot sticks)" \
+ "Create" "Make a spare Linux boot stick in /dev/$STICK" \
+ 2> $TMP/return
+ REPLY=`cat $TMP/return`
+ rm -f $TMP/return
+ if [ "$REPLY" = "Create" ]; then
+ continue
+ else
+ break
+ fi
+ else # ! Create
+ break
+ fi
+done
diff --git a/testing/source/pkgtools/scripts/setup.htmlview b/testing/source/pkgtools/scripts/setup.htmlview
new file mode 100644
index 00000000..98039100
--- /dev/null
+++ b/testing/source/pkgtools/scripts/setup.htmlview
@@ -0,0 +1,33 @@
+#!/bin/sh
+#BLURB="Set a default browser link."
+# Sorry, this is not a full menu, and may not ever be.
+# It is trivial to find the htmllink symbolic link and
+# point it at the browser that you like. Besides,
+# this is not a Linux standard that could be locating
+# in any official document. It seems to have been
+# started without any consultation with other
+# distributions by <take a wild guess>, and now things
+# expect it to be there.
+#
+#
+# Note 1. Listing a browser doesn't mean we ship it.
+# Note 2. Complaints about our preferences or missing
+# browsers in the list will be considered.
+# Yell at Pat about it. ;-)
+
+# There must be no link, or we assume the admin set it and
+# do nothing. Can you tell this Q+D script was written for
+# the initial installation?
+
+for browser in firefox seamonkey konqueror galeon epiphany links lynx ; do
+ if [ ! -e usr/bin/htmlview -a -x usr/bin/$browser ]; then
+ cat << EOF > usr/bin/htmlview
+#!/bin/sh
+exec $browser "\$@"
+EOF
+ fi
+done
+if [ -e usr/bin/htmlview ]; then
+ chmod 755 usr/bin/htmlview
+fi
+
diff --git a/testing/source/pkgtools/scripts/setup.services b/testing/source/pkgtools/scripts/setup.services
new file mode 100644
index 00000000..2e83cb93
--- /dev/null
+++ b/testing/source/pkgtools/scripts/setup.services
@@ -0,0 +1,342 @@
+#!/bin/sh
+#BLURB="Select/deselect system daemons (services)"
+TMP=/var/lib/pkgtools/setup/tmp
+if [ ! -d $TMP ]; then
+ mkdir -p $TMP
+fi
+T_PX="$1"
+cd $T_PX
+rm -f $TMP/tmpscript
+
+cat << EOF > $TMP/tmpscript
+dialog --title "CONFIRM STARTUP SERVICES TO RUN" --item-help --checklist \\
+"The selected services will be started at boot time. If you \\
+don't need them, you may unselect them to turn them off (which may improve \\
+overall system security). You may also choose to start services that are \\
+not run by default, but be aware that more services means less security. \\
+Use the spacebar to select or unselect the services you wish to run. \\
+Recommended choices have been preselected. \\
+Press the ENTER key when you are finished." \\
+20 75 7 \\
+EOF
+
+if [ -r etc/rc.d/rc.atalk ]; then
+ if [ -x etc/rc.d/rc.atalk ]; then
+ RC_ATALK=on
+ else
+ RC_ATALK=off
+ fi
+ cat << EOF >> $TMP/tmpscript
+ "rc.atalk" "Netatalk Appletalk file/print server" $RC_ATALK "The Netatalk server is a file and print server for Macintosh networks." \\
+EOF
+fi
+
+if [ -r etc/rc.d/rc.atd ]; then
+ if [ -x etc/rc.d/rc.atd ]; then
+ RC_ATD=on
+ else
+ RC_ATD=off
+ fi
+ cat << EOF >> $TMP/tmpscript
+ "rc.atd" "Schedules jobs for later" $RC_ATD "The at daemon schedules jobs to be run at a specified time." \\
+EOF
+fi
+
+if [ -r etc/rc.d/rc.bind ]; then
+ if [ -x etc/rc.d/rc.bind ]; then
+ RC_BIND=on
+ else
+ RC_BIND=off
+ fi
+ cat << EOF >> $TMP/tmpscript
+ "rc.bind" "BIND (Domain Name System) server" $RC_BIND "BIND (Berkeley Internet Name Domain) is a Domain Name System (DNS) server." \\
+EOF
+fi
+
+if [ -r etc/rc.d/rc.crond ]; then
+ if [ -x etc/rc.d/rc.crond ]; then
+ RC_CROND=on
+ else
+ RC_CROND=off
+ fi
+ cat << EOF >> $TMP/tmpscript
+ "rc.crond" "Time based job scheduler" $RC_CROND "The cron daemon schedules jobs to run at fixed times, dates, or intervals." \\
+EOF
+fi
+
+if [ -r etc/rc.d/rc.cups ]; then
+ if [ -x etc/rc.d/rc.cups ]; then
+ RC_CUPS=on
+ else
+ RC_CUPS=off
+ fi
+ cat << EOF >> $TMP/tmpscript
+ "rc.cups" "CUPS print server" $RC_CUPS "The Common UNIX Printing system (print spooler choice #1)." \\
+EOF
+fi
+
+if [ -r etc/rc.d/rc.dnsmasq ]; then
+ if [ -x etc/rc.d/rc.dnsmasq ]; then
+ RC_DNSMASQ=on
+ else
+ RC_DNSMASQ=off
+ fi
+ cat << EOF >> $TMP/tmpscript
+ "rc.dnsmasq" "dnsmasq DHCP/DNS server" $RC_DNSMASQ "dnsmasq provides DNS and DHCP service to a LAN." \\
+EOF
+fi
+
+if [ -r etc/rc.d/rc.dovecot ]; then
+ if [ -x etc/rc.d/rc.dovecot ]; then
+ RC_DOVECOT=on
+ else
+ RC_DOVECOT=off
+ fi
+ cat << EOF >> $TMP/tmpscript
+ "rc.dovecot" "Dovecot IMAP/POP3 server" $RC_DOVECOT "Dovecot provides remote mailbox access for email clients." \\
+EOF
+fi
+
+if [ -r etc/rc.d/rc.fuse ]; then
+ if [ -x etc/rc.d/rc.fuse ]; then
+ RC_FUSE=on
+ else
+ RC_FUSE=off
+ fi
+ cat << EOF >> $TMP/tmpscript
+ "rc.fuse" "Filesystem in Userspace library" $RC_FUSE "FUSE is an interface to allow userspace programs to use filesystems." \\
+EOF
+fi
+
+if [ -r etc/rc.d/rc.hald ]; then
+ if [ -x etc/rc.d/rc.hald ]; then
+ RC_HALD=on
+ else
+ RC_HALD=off
+ fi
+ cat << EOF >> $TMP/tmpscript
+ "rc.hald" "Hardware Abstraction Layer" $RC_HALD "HAL makes access to CD/DVD drives and USB devices easier." \\
+EOF
+fi
+
+if [ -r etc/rc.d/rc.hplip ]; then
+ if [ -x etc/rc.d/rc.hplip ]; then
+ RC_HPLIP=on
+ else
+ RC_HPLIP=off
+ fi
+ cat << EOF >> $TMP/tmpscript
+ "rc.hplip" "HP printer/scanner daemons" $RC_HPLIP "Programs used to run printers and scanners from Hewlett Packard." \\
+EOF
+fi
+
+if [ -r etc/rc.d/rc.httpd ]; then
+ if [ -x etc/rc.d/rc.httpd ]; then
+ RC_HTTPD=on
+ else
+ RC_HTTPD=off
+ fi
+ cat << EOF >> $TMP/tmpscript
+ "rc.httpd" "The Apache web server" $RC_HTTPD "Apache, the most widely used web server on the net." \\
+EOF
+fi
+
+if [ -r etc/rc.d/rc.inetd ]; then
+ if [ -x etc/rc.d/rc.inetd ]; then
+ RC_INETD=on
+ else
+ RC_INETD=off
+ fi
+ cat << EOF >> $TMP/tmpscript
+ "rc.inetd" "The BSD Inetd daemon" $RC_INETD "Inetd daemon (this allows: time, ftp, comsat, talk, finger, and auth)." \\
+EOF
+fi
+
+if [ -r etc/rc.d/rc.ip_forward ]; then
+ if [ -x etc/rc.d/rc.ip_forward ]; then
+ RC_IP_FORWARD=on
+ else
+ RC_IP_FORWARD=off
+ fi
+ cat << EOF >> $TMP/tmpscript
+ "rc.ip_forward" "Activate IP packet forwarding" $RC_IP_FORWARD "Packet forwarding allows your Linux machine to act as a router." \\
+EOF
+fi
+
+if [ -r etc/rc.d/rc.lprng ]; then
+ if [ -x etc/rc.d/rc.lprng ]; then
+ RC_LPRNG=on
+ else
+ RC_LPRNG=off
+ fi
+ cat << EOF >> $TMP/tmpscript
+ "rc.lprng" "LPRng print server" $RC_LPRNG "The LPRng printing system (print spooler choice #2)." \\
+EOF
+fi
+
+if [ -r etc/rc.d/rc.messagebus ]; then
+ if [ -x etc/rc.d/rc.messagebus ]; then
+ RC_MESSAGEBUS=on
+ else
+ RC_MESSAGEBUS=off
+ fi
+ cat << EOF >> $TMP/tmpscript
+ "rc.messagebus" "D-Bus system message bus" $RC_MESSAGEBUS "Used for interprocess communication and coordination." \\
+EOF
+fi
+
+if [ -r etc/rc.d/rc.mysqld ]; then
+ if [ -x etc/rc.d/rc.mysqld ]; then
+ RC_MYSQLD=on
+ else
+ RC_MYSQLD=off
+ fi
+ cat << EOF >> $TMP/tmpscript
+ "rc.mysqld" "The MySQL database server" $RC_MYSQLD "MySQL, an SQL-based relational database daemon." \\
+EOF
+fi
+
+if [ -r etc/rc.d/rc.ntpd ]; then
+ if [ -x etc/rc.d/rc.ntpd ]; then
+ RC_NTPD=on
+ else
+ RC_NTPD=off
+ fi
+ cat << EOF >> $TMP/tmpscript
+ "rc.ntpd" "The network time server" $RC_NTPD "NTP synchronizes your time to/from other NTP servers." \\
+EOF
+fi
+
+if [ -r etc/rc.d/rc.pcmcia ]; then
+ if [ -x etc/rc.d/rc.pcmcia ]; then
+ RC_PCMCIA=on
+ else
+ RC_PCMCIA=off
+ fi
+ cat << EOF >> $TMP/tmpscript
+ "rc.pcmcia" "PCMCIA/Cardbus card services" $RC_PCMCIA "This supports PCMCIA or Cardbus cards used with laptops." \\
+EOF
+fi
+
+if [ -r etc/rc.d/rc.postfix ]; then
+ if [ -x etc/rc.d/rc.postfix ]; then
+ RC_POSTFIX=on
+ else
+ RC_POSTFIX=off
+ fi
+ cat << EOF >> $TMP/tmpscript
+ "rc.postfix" "The Postfix mail server" $RC_POSTFIX "The Postfix server allows your machine to send and receive mail." \\
+EOF
+fi
+
+if [ -r etc/rc.d/rc.rpc ]; then
+ if [ -x etc/rc.d/rc.rpc ]; then
+ RC_RPC=on
+ else
+ RC_RPC=off
+ fi
+ cat << EOF >> $TMP/tmpscript
+ "rc.rpc" "RPC (NFS) daemons" $RC_RPC "Needed to serve or mount NFS (Network File System) partitions." \\
+EOF
+fi
+
+if [ -r etc/rc.d/rc.samba ]; then
+ if [ -x etc/rc.d/rc.samba ]; then
+ RC_SAMBA=on
+ else
+ RC_SAMBA=off
+ fi
+ cat << EOF >> $TMP/tmpscript
+ "rc.samba" "The Samba file/print server" $RC_SAMBA "Samba is a file and print server for Windows networks." \\
+EOF
+fi
+
+if [ -r etc/rc.d/rc.saslauthd ]; then
+ if [ -x etc/rc.d/rc.saslauthd ]; then
+ RC_SASLAUTHD=on
+ else
+ RC_SASLAUTHD=off
+ fi
+ cat << EOF >> $TMP/tmpscript
+ "rc.saslauthd" "The SASL authentication server" $RC_SASLAUTHD "SASL is an authentication method often used by mail servers." \\
+EOF
+fi
+
+if [ -r etc/rc.d/rc.sendmail ]; then
+ if [ -x etc/rc.d/rc.sendmail ]; then
+ RC_SENDMAIL=on
+ else
+ RC_SENDMAIL=off
+ fi
+ cat << EOF >> $TMP/tmpscript
+ "rc.sendmail" "The Sendmail mail server" $RC_SENDMAIL "The Sendmail server allows your machine to send and receive mail." \\
+EOF
+fi
+
+if [ -r etc/rc.d/rc.smartd ]; then
+ if [ -x etc/rc.d/rc.smartd ]; then
+ RC_SMARTD=on
+ else
+ RC_SMARTD=off
+ fi
+ cat << EOF >> $TMP/tmpscript
+ "rc.smartd" "SMART monitoring daemon" $RC_SMARTD "The SMART daemon monitors your hard drives to help predict failures." \\
+EOF
+fi
+
+if [ -r etc/rc.d/rc.snmpd ]; then
+ if [ -x etc/rc.d/rc.snmpd ]; then
+ RC_SNMPD=on
+ else
+ RC_SNMPD=off
+ fi
+ cat << EOF >> $TMP/tmpscript
+ "rc.snmpd" "Net-SNMP daemon" $RC_SNMPD "SNMP daemon that receives and logs SNMP TRAP and INFORM messages." \\
+EOF
+fi
+
+if [ -r etc/rc.d/rc.syslog ]; then
+ if [ -x etc/rc.d/rc.syslog ]; then
+ RC_SYSLOGD=on
+ else
+ RC_SYSLOGD=off
+ fi
+ cat << EOF >> $TMP/tmpscript
+ "rc.syslog" "The Linux system logging utilities" $RC_SYSLOGD "The syslogd and klogd daemons log important messages under /var/log." \\
+EOF
+fi
+
+if [ -r etc/rc.d/rc.sshd ]; then
+ if [ -x etc/rc.d/rc.sshd ]; then
+ RC_SSHD=on
+ else
+ RC_SSHD=off
+ fi
+ cat << EOF >> $TMP/tmpscript
+ "rc.sshd" "The SSHD (secure shell) daemon" $RC_SSHD "SSHD allows secure encrypted logins to your machine." \\
+EOF
+fi
+
+cat << EOF >> $TMP/tmpscript
+ 2> $TMP/reply
+EOF
+
+. $TMP/tmpscript
+
+if [ ! $? = 0 ]; then
+ rm -f $TMP/reply $TMP/tmpscript
+ exit
+fi
+
+for service in rc.atalk rc.atd rc.bind rc.crond rc.cups rc.dovecot rc.dnsmasq rc.fuse rc.hald rc.hplip rc.httpd rc.inetd rc.ip_forward rc.lprng rc.messagebus rc.mysqld rc.ntpd rc.pcmcia rc.postfix rc.rpc rc.samba rc.saslauthd rc.smartd rc.snmpd rc.sendmail rc.syslog rc.sshd ; do
+ if [ -f etc/rc.d/$service ]; then
+ if grep -w $service $TMP/reply 1> /dev/null ; then
+ chmod 755 etc/rc.d/$service
+ else
+ chmod 644 etc/rc.d/$service
+ fi
+ fi
+done
+
+rm -f $TMP/reply $TMP/tmpscript
+
diff --git a/testing/source/pkgtools/scripts/upgradepkg b/testing/source/pkgtools/scripts/upgradepkg
new file mode 100644
index 00000000..f53d21d9
--- /dev/null
+++ b/testing/source/pkgtools/scripts/upgradepkg
@@ -0,0 +1,417 @@
+#!/bin/bash
+# Copyright 1999 Patrick Volkerding, Moorhead, Minnesota, USA
+# Copyright 2001, 2002, 2003 Slackware Linux, Inc., Concord, California, USA
+# Copyright 2009, 2015 Patrick J. Volkerding, Sebeka, MN, USA
+# Copyright 2015 Michal Nazarewicz <mina86@mina86.com>
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# Mon Jun 4 21:17:58 UTC 2018
+# Use /var/lib/pkgtools, not /var/log.
+#
+# Thu May 24 20:23:55 UTC 2018
+# Added --terselength option to set the line length in --terse mode.
+# Use a lockfile to prevent output collisions in --terse mode.
+#
+# Wed May 23 03:35:28 UTC 2018
+# Added --terse, which limits screen output to one line per package.
+#
+# Sat 17 Jan 16:21:32 UTC 2015 mina86
+# Various optimisation mostly resolving around avoiding having to fork
+# and call cut, basename and other helper commands. Slight
+# refactoring of code calling removepkg.
+#
+# Sat Apr 25 21:18:53 UTC 2009
+# Support new compression types and package extensions.
+# Converted to use new pkgbase() function to remove pathname and
+# valid package extensions.
+#
+# Added --dry-run, Sat Apr 26 18:13:29 PDT 2003
+#
+# Added --install-new and --reinstall, Fri May 31 14:11:14 PDT 2002 volkerdi
+#
+# Rewritten to clean out _all_ old packages of a given basename, not just
+# the first one found, Thu Apr 4 01:01:05 PST 2002 volkerdi
+#
+# Modified to handle either old 8.3 or new package-version-arch-build.tgz
+# packages, Sat Nov 17 14:25:58 PST 2001 volkerdi
+
+# Return a package name that has been stripped of the dirname portion
+# and any of the valid extensions (only):
+pkgbase() {
+ PKGRETURN=${1##*/}
+ case "$PKGRETURN" in *.t[gblx]z)
+ PKGRETURN=${PKGRETURN%.*}
+ esac
+ echo "$PKGRETURN"
+}
+
+usage() {
+ cat << EOF
+
+Usage: upgradepkg [options] <newpackage> ...
+ upgradepkg [options] <oldpackage%newpackage> ...
+
+Upgrade, install, or reinstall Slackware packages (.tgz, .tbz, .tlz, .txz).
+
+To operate on an alternate directory, such as /mnt:
+ ROOT=/mnt upgradepkg package.txz
+
+Options:
+ --dry-run only display what would be done
+ --install-new install new packages also
+ --reinstall upgrade packages of the same version
+ --terse display a single line for each package operation
+ --terselength <length> maximum line length of terse output
+ --verbose display all the gory details of the upgrade
+ --help display this help
+
+For more details see upgradepkg(8).
+EOF
+}
+
+# Set the prefix for the package database directories (packages, scripts).
+ADM_DIR="$ROOT/var/lib/pkgtools"
+
+# Make sure there's a proper temp directory:
+TMP=$ADM_DIR/setup/tmp
+# If the $TMP directory doesn't exist, create it:
+if [ ! -d $TMP ]; then
+ mkdir -p $TMP
+ chmod 700 $TMP # no need to leave it open
+fi
+
+# This script expects an 022 umask:
+umask 022
+
+# $ROOT defined?
+if [ -d "$ROOT" ]; then
+ export ROOT
+else
+ unset ROOT
+fi
+
+# --help or no args?
+if [ "$1" = "" -o "$1" = "-help" -o "$1" = "--help" -o "$1" = "-?" ]; then
+ usage;
+ exit 1;
+fi
+
+# Create a lockfile directory if it doesn't exist. We can use it to prevent
+# output line collisions in --terse mode.
+INSTLOCKDIR=${INSTLOCKDIR:-/run/lock/pkgtools}
+if [ ! -d $INSTLOCKDIR ]; then
+ mkdir -p $INSTLOCKDIR
+fi
+
+# Set default line length for terse mode:
+if tty -s && which tput 1> /dev/null 2> /dev/null ; then
+ TERSELENGTH=$(tput cols)
+else
+ TERSELENGTH=80
+fi
+
+# Arg processing loop. These must come before any packages are listed.
+while [ 0 ]; do
+ if [ "$1" = "-no-paranoia" -o "$1" = "--no-paranoia" ]; then
+ # Enable --no-paranoia mode. This is so not-recommended that we're
+ # not even going to document it. ;) If a file used to be directly
+ # managed and now is moved into place, using --no-paranoia will cause
+ # it to improperly disappear. It does slightly speed things up, though.
+ # Don't use it.
+ NOT_PARANOID="true"
+ shift 1
+ elif [ "$1" = "-install-new" -o "$1" = "--install-new" ]; then
+ # Install packages that do not already have an installed version.
+ # The usual default is to skip them.
+ INSTALL_NEW="yes"
+ shift 1
+ elif [ "$1" = "-reinstall" -o "$1" = "--reinstall" ]; then
+ # Reinstall packages even if the installed one is the same version.
+ REINSTALL="true"
+ shift 1
+ elif [ "$1" = "-verbose" -o "$1" = "--verbose" -o "$1" = "-v" ]; then
+ # We're adding a --verbose mode that doesn't filter removepkg as much
+ VERBOSE="verbose"
+ shift 1
+ elif [ "$1" = "-dry-run" -o "$1" = "--dry-run" ]; then
+ # Output a report about which packages would be installed or upgraded
+ # but don't actually perform the upgrades.
+ DRY_RUN="true"
+ shift 1
+ elif [ "$1" = "-terse" -o "$1" = "--terse" ]; then
+ # Output one line per installed/upgraded package by calling installpkg
+ # with --terse. Use TERSE=0 for true, so we can check with test.
+ TERSE=0
+ shift 1
+ elif [ "$1" = "-terselength" -o "$1" = "--terselength" ]; then
+ # Set line length in --terse mode:
+ TERSELENGTH=$2
+ shift 2
+ else # no more args
+ break;
+ fi
+done # processing args
+
+# A couple not-really-documented features to adjust the behavior of --terse
+# mode. These need to be used in addition to --terse, and passed in as
+# environment variables.
+# PLAINTERSE=0 (This outputs the standard terse line from installpkg, rather
+# than prefixing it with "Upgrading:" or "Installing:")
+# INFOBOX=0 (This outputs the installpkg --infobox instead of a terse line)
+
+# Here's a function to figure out the package name from one of those
+# new long filenames. We'll need this to double check the name of the
+# old package.
+
+package_name() {
+ STRING=$(pkgbase "$1")
+ case "$STRING" in
+ *-*-*-*)
+ # At least four segments, strip version arch and build and return name:
+ echo "${STRING%-*-*-*}"
+ # cruft for later ;)
+ # BUILD=${STRING##*-}
+ # STRING=${STRING%*-}
+ # ARCH=${STRING##*-}
+ # STRING=${STRING%*-}
+ # VER=${STRING%*-}
+ ;;
+ *)
+ # Old style package name with one segment or we don't have four
+ # segments: return the old-style (or out of spec) package name.
+ echo $STRING
+ esac
+}
+
+ERRCODE=0
+
+# Main processing loop:
+for ARG; do
+ OLD=${ARG%'%'*} # first segment, = $ARG if no %
+ NEW=${ARG#*'%'} # second segment, = $ARG if no %
+
+ # Simple package integrity check:
+ if ! [ -f "$NEW" ]; then
+ ERRCODE=4
+ echo "Cannot install $NEW: file not found"
+ continue;
+ fi
+
+ # Figure out the names of the old and new packages:
+ INCOMINGDIR=$(dirname $NEW)
+ # These are the package names with the extension:
+ NNAME=${NEW##*/}
+ ONAME=${OLD##*/}
+ # These are the package names without the extension:
+ OLD=$(pkgbase $OLD)
+ NEW=$(pkgbase $NEW)
+
+ # Make sure the extension is valid:
+ if [ "$NNAME" = "$NEW" ]; then
+ # We won't throw an ERRCODE for this, but the package is skipped:
+ echo "Cannot install $OLD: invalid package extension"
+ continue;
+ fi
+
+ # Check and fix the old package name:
+ SHORT="$(package_name $OLD)"
+ if [ ! -r $ADM_DIR/packages/$OLD ]; then
+ if ls $ADM_DIR/packages/$SHORT* 1> /dev/null 2> /dev/null ; then
+ for installed_package in $ADM_DIR/packages/$SHORT* ; do
+ if [ "$(package_name $installed_package)" = "$SHORT" ]; then # found one
+ OLD="${installed_package##*/}"
+ break
+ fi
+ done
+ fi
+ fi
+
+ # Test to see if both the old and new packages are where we expect them
+ # to be - skip to the next package (or package pair) if anything's wrong:
+
+ if [ ! -r $ADM_DIR/packages/$OLD ]; then
+ if [ ! "$INSTALL_NEW" = "yes" ]; then
+ if [ "$DRY_RUN" = "true" ]; then
+ echo "$OLD would not be upgraded (no installed package named $SHORT)."
+ else
+ ! [ $TERSE ] && echo
+ echo "Error: there is no installed package named $OLD."
+ ! [ $TERSE ] && echo " (looking for $ADM_DIR/packages/$OLD)"
+ ! [ $TERSE ] && echo
+ fi
+ ERRCODE=1
+ else # --install-new was given, so install the new package:
+ if [ "$DRY_RUN" = "true" ]; then
+ echo "$NEW would be installed (new package)."
+ else
+ if [ $PLAINTERSE ]; then
+ /sbin/installpkg --terse --terselength $TERSELENGTH $INCOMINGDIR/$NNAME
+ elif [ $INFOBOX ]; then
+ /sbin/installpkg --infobox $INCOMINGDIR/$NNAME
+ elif [ $TERSE ]; then
+ OUTPUTLINE="$(/sbin/installpkg --terse --terselength $(expr $TERSELENGTH - 12) $INCOMINGDIR/$NNAME)"
+ ( flock 9 || exit 11
+ echo "Installing: ${OUTPUTLINE}"
+ ) 9> $INSTLOCKDIR/outputline.lock
+ else
+ cat << EOF
+
++==============================================================================
+| Installing new package $INCOMINGDIR/$NNAME
++==============================================================================
+
+EOF
+ /sbin/installpkg $INCOMINGDIR/$NNAME
+ fi
+ fi
+ fi
+ continue;
+ elif [ ! -r "$INCOMINGDIR/$NNAME" ]; then
+ if [ "$DRY_RUN" = "true" ]; then
+ echo "$NEW incoming package not found (command line)."
+ else
+ ! [ $TERSE ] && echo
+ echo "Error: incoming package $INCOMINGDIR/$NNAME not found."
+ ! [ $TERSE ] && echo
+ fi
+ ERRCODE=1
+ continue;
+ fi
+
+ # Unless --reinstall was given, compare the package names
+ # and skip any exact matches:
+ if [ ! "$REINSTALL" = "true" ]; then
+ if [ "$OLD" = "$NEW" ]; then
+ if [ "$DRY_RUN" = "true" ]; then
+ echo "$NEW would be skipped (already installed)."
+ else
+ if ! [ $TERSE ]; then
+ cat << EOF
+
++==============================================================================
+| Skipping package $NEW (already installed)
++==============================================================================
+
+EOF
+ fi
+ fi
+ continue;
+ fi
+ fi
+
+ # Showtime. Let's do the upgrade. First, we will rename all the
+ # installed packages with this basename to make them easy to remove later:
+
+ TIMESTAMP=$(date +%Y-%m-%d,%T)
+ SHORT="$(package_name $OLD)"
+ if [ "$DRY_RUN" = "true" ]; then
+ echo -n "$NEW would upgrade: "
+ for installed_package in $ADM_DIR/packages/$SHORT* ; do
+ if [ "$(package_name $installed_package)" = "$SHORT" ]; then
+ echo -n "$(pkgbase $installed_package)"
+ fi
+ done
+ echo
+ continue
+ fi
+ for installed_package in $ADM_DIR/packages/$SHORT* ; do
+ if [ "$(package_name $installed_package)" = "$SHORT" ]; then
+ mv $installed_package ${installed_package}-upgraded-$TIMESTAMP
+ fi
+ done
+ for installed_script in $ADM_DIR/scripts/$SHORT* ; do
+ if [ "$(package_name $installed_script)" = "$SHORT" ]; then
+ if [ -r $installed_script ]; then
+ mv $installed_script ${installed_script}-upgraded-$TIMESTAMP
+ fi
+ fi
+ done
+
+ # Print a banner for the current upgrade:
+ if ! [ $TERSE ]; then
+ cat << EOF
+
++==============================================================================
+| Upgrading $OLD package using $INCOMINGDIR/$NNAME
++==============================================================================
+EOF
+ fi
+ # Next, the new package is pre-installed:
+ if [ "$VERBOSE" = "verbose" ]; then
+ if ! [ $TERSE ]; then
+ /sbin/installpkg $INCOMINGDIR/$NNAME
+ RETCODE=$?
+ else
+ /sbin/installpkg $INCOMINGDIR/$NNAME 1> /dev/null
+ RETCODE=$?
+ fi
+ else
+ if [ $PLAINTERSE ]; then
+ /sbin/installpkg --terse --terselength $TERSELENGTH $INCOMINGDIR/$NNAME
+ elif [ $INFOBOX ]; then
+ /sbin/installpkg --infobox $INCOMINGDIR/$NNAME
+ elif [ $TERSE ]; then
+ OUTPUTLINE="$(/sbin/installpkg --terse --terselength $(expr $TERSELENGTH - 12) $INCOMINGDIR/$NNAME)"
+ RETCODE=$?
+ ( flock 9 || exit 11
+ echo "Upgrading: ${OUTPUTLINE}"
+ ) 9> $INSTLOCKDIR/outputline.lock
+ else
+ echo "Pre-installing package $NEW..."
+ /sbin/installpkg $INCOMINGDIR/$NNAME 1> /dev/null
+ RETCODE=$?
+ fi
+ fi
+ # Make sure that worked:
+ if [ ! $RETCODE = 0 ]; then
+ echo "ERROR: Package $INCOMINGDIR/$NNAME did not install"
+ echo "correctly. You may need to reinstall your old package"
+ echo "to avoid problems. Make sure the new package is not"
+ echo "corrupted."
+ sleep 15
+ # Skip this package, but still try to proceed. Good luck...
+ continue;
+ fi
+ # Now, the leftovers from the old package(s) can go. Pretty simple, huh? :)
+ ( flock 9 || exit 11
+ for rempkg in "$ADM_DIR/packages/"*"-$TIMESTAMP"; do
+ if [ "$VERBOSE" = "verbose" ]; then
+ /sbin/removepkg "${rempkg##*/}"
+ elif ! [ $TERSE ]; then
+ /sbin/removepkg "${rempkg##*/}" | grep -v 'Skipping\.\|Removing files:'
+ else
+ /sbin/removepkg "${rempkg##*/}" > /dev/null
+ fi
+ done
+ ) 9> $INSTLOCKDIR/removepkg.lock
+ # Again! Again!
+ # Seriously, the reinstalling of a package can be crucial if any files
+ # shift location, so we should always reinstall as the final step:
+ if [ ! "$NOT_PARANOID" = "true" ]; then
+ if ! [ $TERSE ]; then
+ /sbin/installpkg $INCOMINGDIR/$NNAME
+ else
+ /sbin/installpkg $INCOMINGDIR/$NNAME 1> /dev/null
+ fi
+ fi
+ ! [ $TERSE ] && echo "Package $OLD upgraded with new package $INCOMINGDIR/$NNAME."
+ ERRCODE=0
+done
+exit $ERRCODE
diff --git a/testing/source/pkgtools/slack-desc b/testing/source/pkgtools/slack-desc
new file mode 100644
index 00000000..d06b5863
--- /dev/null
+++ b/testing/source/pkgtools/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description. Line
+# up the first '|' above the ':' following the base package name, and the '|' on
+# the right side marks the last column you can put a character in. You must make
+# exactly 11 lines for the formatting to be correct. It's also customary to
+# leave one space after the ':'.
+
+ |-----handy-ruler------------------------------------------------------|
+pkgtools: pkgtools (The Slackware package maintenance system)
+pkgtools:
+pkgtools: This package contains utilities for handling Slackware packages.
+pkgtools: Included are the command line utilities 'installpkg', 'removepkg',
+pkgtools: 'makepkg', 'explodepkg', and 'upgradepkg' that install, remove,
+pkgtools: build, examine, and upgrade software packages. Also included are
+pkgtools: 'pkgtool', a menu based program for installing packages, removing
+pkgtools: packages, or viewing the packages that are installed on the system,
+pkgtools: 'pkgdiff', a utility for comparing two packages, documentation (man
+pkgtools: pages), and a few other system admin scripts.
+pkgtools: