#!/bin/bash
ulimit -s unlimited
shopt -s extglob

# tigervnc.SlackBuild
# Heavily based on the original Slackware build scripts,
# Modified by Stuart Winter for Slackware ARM.
#
# Copyright 2010, 2011, 2012, 2013, 2014, 2015  Eric Hameleers, Eindhoven. NL
# Copyright 2015-2027  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.

# Record toolchain & other info for the build log:
slackbuildinfo

# Paths to skeleton port's source & real Slackware source tree:
slackset_var_cwds

# Temporary build locations:
export TMPBUILD=$TMP/build-$PKGNAM
export PKG=$TMP/package-$PKGNAM
mkpkgdirs # Delete & re-create temporary directories then cd into $TMPBUILD

# Add -fPIC to CFLAGS:
case $ARCH in
   arm|aarch64) export SLKCFLAGS="$SLKCFLAGS -fPIC"
                export LIBDIRSUFFIX="" ;;
   *)           export SLKCFLAGS="-O2" ;;
esac

case "$ARCH" in
    arm*) TARGET=${SLK_ARCH_HOST} ;;
    *)    TARGET=${SLK_ARCH_HOST} ;;
esac

# To save on maintenance, and since we carry the same versions as x86 Slackware,
# let's pull the version numbers from the x86 trunk:
pushd $CWD
XSB=$CWD/$PKGNAM.SlackBuild
[ ! -x $XSB ] && { echo "ERROR: Cannot find x86 SlackBuild for ${PKGNAM}!" ; exit 1; }
for upstreamvar in \
  XORGVER \
  JAVA_APPLET \
  ; do
  eval $( egrep "^${upstreamvar}=" $XSB  )
  echo "Upstream variable: ${upstreamvar} version $( eval $( echo "echo \$${upstreamvar}" ) )"
done
popd

# Create some build framework:
mkdir -p $TMPBUILD/deps/usr

# Extract source:
tar xvvf $CWD/$PKGNAM-$VERSION.tar.!(*sign|*asc|*sig)
cd $PKGNAM-$VERSION || failextract
# Extract the X server sources:
tar xvf $CWD/xorg-server-$XORGVER.tar.?z --strip-components=1 -C unix/xserver || exit 1
# Patch the X server sources:
( cd unix/xserver
  zcat $CWD/patches/xserver120.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/x11.startwithblackscreen.diff.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/xorg-server.combo.mouse.keyboard.layout.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/fix-nouveau-segfault.diff.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/0001-Always-install-vbe-and-int10-sdk-headers.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/0001-autobind-GPUs-to-the-screen.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/0001-xfree86-use-modesetting-driver-by-default-on-GeForce.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/fix-pci-segfault.diff.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/06_use-intel-only-on-pre-gen4.diff.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/0001-f1070c01d616c5f21f939d5ebc533738779451ac.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/0002-dd8caf39e9e15d8f302e54045dd08d8ebf1025dc.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/0003-6907b6ea2b4ce949cb07271f5b678d5966d9df42.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2022-3550.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2022-3551.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2022-3553.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2022-4283.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2022-46340.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2022-46341.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2022-46342.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2022-46343.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2022-46344.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2022-46340.correction.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2023-0494.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/857.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2023-1393.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2023-5367.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2023-5380.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2023-6377.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2023-6478.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2023-6816.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2024-0229.01.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2024-0229.02.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2024-0229.03.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2024-0408.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2024-0409.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2024-21885.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2024-21886.01.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2024-21886.02.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2024-31080.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2024-31081.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2024-31082.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2024-31083.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2024-9632.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2025-26594.01.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2025-26594.02.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2025-26595.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2025-26596.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2025-26597.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2025-26598.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2025-26599.01.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2025-26599.02.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2025-26600.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2025-26601.01.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2025-26601.02.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2025-26601.03.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2025-26601.04.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2025-62229.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2025-62230_1.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2025-62230_2.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2025-62231.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2026-33999.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2026-34000.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2026-34001.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2026-34002.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2026-34003_1.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/CVE-2026-34003_2.patch.gz | patch -p1 --verbose || exit 1

  autoreconf -vif || exit 1
) || failpatch

# HACK! Force protocol 3.3 for UVNCSC
zcat $CWD/patches/force_protocol_3.3_for_UVNCSC.patch.gz | patch -p1 || exit 1

# Fix pam.d file:
zcat $CWD/patches/tigervnc.pam.d.diff.gz | patch -p1 --verbose || exit 1

if [ "$JAVA_APPLET" = "ON" ]; then
  # Explicitly put the java applet into a directory named 'tigervnc':
  sed -i -e 's#/vnc/class#/tigervnc/class#'g $(grep -rl vnc/class .)
  sed -i -e 's#DESTINATION vnc/class#DESTINATION share/tigervnc/class#'g $(grep -rl vnc/class .)
fi

slackhousekeeping

# Configure:
cmake \
   -G "Unix Makefiles" \
   -Wno-dev \
   -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
   -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
   -DCMAKE_INSTALL_PREFIX=/usr \
   -DSYSCONF_INSTALL_DIR=/etc \
   -DLIB_SUFFIX=${LIBDIRSUFFIX} \
   -DENABLE_PAM:BOOL=ON \
   -DINSTALL_SYSTEMD_UNITS=OFF \
   -DBUILD_JAVA:BOOL=${JAVA_APPLET} \
   . || failconfig

# Build:
make V=1 $NUMJOBS || make || failmake

# Install into package:
make DESTDIR=$PKG install || failinstall

# Build and install the VNC server:
( cd unix/xserver
  # Default font paths to be used by the X server
  DEF_FONTPATH="/usr/share/fonts/local,/usr/share/fonts/TTF,/usr/share/fonts/OTF,/usr/share/fonts/Type1,/usr/share/fonts/misc,/usr/share/fonts/CID,/usr/share/fonts/75dpi/:unscaled,/usr/share/fonts/100dpi/:unscaled,/usr/share/fonts/75dpi,/usr/share/fonts/100dpi,/usr/share/fonts/cyrillic"
  ./configure \
    --prefix=/usr \
    --libdir=/usr/lib${LIBDIRSUFFIX} \
    --sysconfdir=/etc \
    --localstatedir=/var \
    --disable-dri --enable-dri2 --disable-dri3 \
    --disable-static \
    --disable-xorg --disable-xnest --disable-xvfb --disable-dmx \
    --disable-xwin --disable-xephyr --disable-kdrive --disable-xwayland \
    --enable-composite \
    --enable-glx --enable-glx-tls \
    --enable-install-libxf86config \
    --enable-xcsecurity \
    --enable-xinerama \
    --with-int10=x86emu \
    --with-default-font-path="${DEF_FONTPATH}" \
    --with-dri-driver-path=/usr/lib${LIBDIRSUFFIX}/xorg/modules/dri \
    --with-module-dir=/usr/lib${LIBDIRSUFFIX}/xorg/modules \
    --with-pic \
    --with-xkb-path=/etc/X11/xkb \
    --with-xkb-output=/var/lib/xkb \
    --disable-config-dbus \
    --disable-config-hal \
    --disable-config-udev \
    --disable-docs --disable-devel-docs \
    --disable-selective-werror \
    --disable-unit-tests \
    --without-dtrace \
    --with-os-name="$(head -1 /etc/slackware-version)" \
    --with-os-vendor="Slackware Linux Project" \
    --with-builderstring="Built by Slackware for xorg-server-$XORGVER" \
    --build=$TARGET || failconfig

  # Build:
  make V=1 TIGERVNC_SRCDIR="$TMPBUILD/${PKGNAM}-${VERSION}/" $NUMJOBS || failmake
  # Install into package:
  make TIGERVNC_SRCDIR="$TMPBUILD/${PKGNAM}-${VERSION}/" -C hw/vnc DESTDIR=$PKG install || failinstall
) || failmake

# Relocate the man pages:
mv $PKG/usr/share/man $PKG/usr

# Remove installed docs (we'll install them later):
rm -r $PKG/usr/share/doc

# Provide a sample configuration for the libvnc.so extension of X.Org,
# documentation is available inside the file:
mkdir -p $PKG/etc/X11/xorg.conf.d
install -m644 $CWD/10-libvnc.conf $PKG/etc/X11/xorg.conf.d/10-libvnc.conf.new

# Protect these config files as .new:
mv -fv $PKG/etc/tigervnc/vncserver-config-defaults $PKG/etc/tigervnc/vncserver-config-defaults.new
mv -fv $PKG/etc/tigervnc/vncserver-config-mandatory $PKG/etc/tigervnc/vncserver-config-mandatory.new
mv -fv $PKG/etc/tigervnc/vncserver.users $PKG/etc/tigervnc/vncserver.users.new

# Install icons:
mkdir -p $PKG/usr/share/icons/hicolor/{16x16,24x24,32x32,48x48}/apps
for PSIZE in 16 24 32 48; do
  install -m644 media/icons/tigervnc_${PSIZE}.png \
    $PKG/usr/share/icons/hicolor/${PSIZE}x${PSIZE}/apps/tigervnc.png
done

# Check some additional locations for a suitable startup script, in this order:
# 1. $HOME/.vnc/xstartup
# 2. $HOME/.xinitrc
# 3. /etc/X11/xinit/xinitrc
( cd $PKG/usr/libexec
  zcat $CWD/patches/vncserver.xinitrc.diff.gz | patch -p1 --verbose || exit 1
  rm -f vncserver.orig ) || exit 1

# Make a symlink for vncserver in the old location:
if [ ! -r $PKG/usr/bin/vncserver ]; then
  ( cd $PKG/usr/bin ; ln -sf ../libexec/vncserver . )
fi

# Add a documentation directory:
mkdir -p $PKG/usr/doc/${PKGNAM}-$VERSION
cp -fav \
  BUILDING* LICENCE* README* doc/* \
  $PKG/usr/doc/${PKGNAM}-$VERSION
cp -fav \
  unix/xserver/COPYING \
  $PKG/usr/doc/${PKGNAM}-$VERSION/COPYING.xorg-server

# Apply generic Slackware packaging policies:
cd $PKG
slackstripall   # strip all .a archives and all ELFs
#slackstriprpaths     # strip rpaths
slack_delete_lafiles # delete usr/lib{,64}/*.la
slackgzpages -i # compress man & info pages and delete usr/info/dir
slackslack      # chown -R root:root, chmod -R og-w, slackchown, slack644docs
slackdesc       # install slack-desc and doinst.sh
slackmp         # run makepkg -l y -c n

# Perform any final checks on the package:
cd $PKG
slackhlinks     # search for any hard links
