#!/bin/bash
#
#  Copyright (c) 2025, The OpenThread Authors.
#  All rights reserved.
#
#  Redistribution and use in source and binary forms, with or without
#  modification, are permitted provided that the following conditions are met:
#  1. Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
#  2. Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#  3. Neither the name of the copyright holder nor the
#     names of its contributors may be used to endorse or promote products
#     derived from this software without specific prior written permission.
#
#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT HOLDER OR CONTRIBUTORS 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 -euxo pipefail

TEMP_PATH=$(mktemp -d)
SOCAT="socat-1.7.4.4"
SOCAT_TAR="$SOCAT.tar.bz2"
# Use the Yocto source mirror for HTTPS transport; verify the upstream archive hash below.
SOCAT_URL="https://downloads.yoctoproject.org/mirror/sources/$SOCAT_TAR"
SOCAT_SHA256="fbd42bd2f0e54a3af6d01bdf15385384ab82dbc0e4f1a5e153b3e0be1b6380ac"

trap 'rm -rf "$TEMP_PATH" || sudo rm -rf "$TEMP_PATH"' EXIT

verify_sha256()
{
    local actual_sha256
    local archive=$1

    if command -v sha256sum >/dev/null 2>&1; then
        actual_sha256=$(sha256sum "$archive" | awk '{print $1}')
    elif command -v shasum >/dev/null 2>&1; then
        actual_sha256=$(shasum -a 256 "$archive" | awk '{print $1}')
    else
        echo "sha256sum or shasum is required to verify $archive" >&2
        exit 1
    fi

    if [[ $actual_sha256 != "$SOCAT_SHA256" ]]; then
        echo "SHA-256 mismatch for $archive" >&2
        echo "Expected: $SOCAT_SHA256" >&2
        echo "Actual:   $actual_sha256" >&2
        exit 1
    fi
}

INSTALL_PREFIX="--prefix=/usr"
if command -v brew >/dev/null 2>&1; then
    INSTALL_PREFIX="" # On MacOS, it's not allowed to install to /usr/bin due to System Integrity Protection
fi

cd "$TEMP_PATH"
[[ -f $SOCAT_TAR ]] || wget \
    --tries 4 \
    --https-only \
    --secure-protocol=TLSv1_2 \
    --max-redirect=0 \
    --output-document="$SOCAT_TAR" \
    "$SOCAT_URL"
verify_sha256 "$SOCAT_TAR"
tar -xjf "$SOCAT_TAR"
cd "$SOCAT"
# Fix C23 / glibc 2.43 build failure where const-preserving strchr() rejects
# mutating asctime()'s char * return value through a const char * variable.
sed '/^static int printtime(/,/^}/s/const char \*s;/char *s;/' filan.c >filan.c.tmp
mv filan.c.tmp filan.c
./configure "$INSTALL_PREFIX"
make
sudo make install
