1#!/bin/sh
2#
3# Namespace munging inspired by an equivalent hack in NetBSD's tree: add
4# the "Fssh_" prefix to every symbol in libssh which doesn't already have
5# it.  This prevents collisions between symbols in libssh and symbols in
6# other libraries or applications which link with libssh, either directly
7# or indirectly (e.g. through PAM loading pam_ssh).
8#
9
10set -e
11
12eval "unset $(env | sed -nE 's/^(LC_[A-Z]+)=.*$/\1/p')"
13export LANG=C
14
15error() {
16	echo "$@" >&2
17	exit 1
18}
19
20# Locate the source directories
21self=$(realpath ${0})
22srcdir=${self%/*}
23header=${srcdir}/ssh_namespace.h
24top_srcdir=${srcdir%/crypto/openssh}
25libssh_srcdir=${top_srcdir}/secure/lib/libssh
26
27if [ ! -d ${srcdir} -o \
28     ! -f ${header} -o \
29     ! -d ${libssh_srcdir} -o \
30     ! -f ${libssh_srcdir}/Makefile ] ; then
31	error "Where is the libssh Makefile?"
32fi
33
34ncpu=$(sysctl -n hw.ncpu)
35ssh_make() {
36	make -C${libssh_srcdir} -j$((ncpu + 1)) "$@"
37}
38
39# Clear out, recreate and locate the libssh build directory
40ssh_make cleandir
41ssh_make cleandir
42ssh_make obj
43libssh_builddir=$(realpath $(ssh_make -V.OBJDIR))
44libssh=libprivatessh.a
45
46# Clear the existing header
47generated="@""generated"
48cat >${header} <<EOF
49/*
50 * This file was machine-$generated.  Do not edit manually.
51 * Run crypto/openssh/freebsd-namespace.sh to regenerate.
52 */
53EOF
54
55# Build libssh
56ssh_make depend
57ssh_make ${libssh}
58if [ ! -f ${libssh_builddir}/${libssh} ] ; then
59	error "Where is ${libssh}?"
60fi
61
62# Extract symbols
63nm ${libssh_builddir}/${libssh} | awk '
64     /^[0-9a-z]+ [Tt] [A-Za-z_][0-9A-Za-z_]*$/ && $3 !~ /^Fssh_/ {
65         printf("#define %-39s Fssh_%s\n", $3, $3)
66     }
67' | unexpand -a | sort -u >>${header}
68
69# Clean and rebuild the library
70ssh_make clean
71ssh_make ${libssh}
72
73# Double-check
74nm ${libssh_builddir}/${libssh} | awk '
75    /^[0-9a-z]+ [Tt] [A-Za-z_][0-9A-Za-z_]*$/ && $3 !~ /^Fssh_/ {
76         printf("ERROR: %s was not renamed!\n", $3);
77         err++;
78    }
79    END {
80        if (err > 0)
81            exit(1);
82    }
83'
84