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