xref: /aosp_15_r20/external/libcap/contrib/bug216610/package_fns.sh (revision 2810ac1b38eead2603277920c78344c84ddf3aff)
1*2810ac1bSKiyoung Kim#!/bin/bash
2*2810ac1bSKiyoung Kim#
3*2810ac1bSKiyoung Kim# Generate some Go code to make calling into the C code of the .syso
4*2810ac1bSKiyoung Kim# file easier.
5*2810ac1bSKiyoung Kim
6*2810ac1bSKiyoung Kimpackage="${1}"
7*2810ac1bSKiyoung Kimsyso="${2}"
8*2810ac1bSKiyoung Kim
9*2810ac1bSKiyoung Kimif [[ -z "${syso}" ]]; then
10*2810ac1bSKiyoung Kim    echo "usage: $0 <package> <.....syso>" >&2
11*2810ac1bSKiyoung Kim    exit 1
12*2810ac1bSKiyoung Kimfi
13*2810ac1bSKiyoung Kim
14*2810ac1bSKiyoung Kimif [[ "${syso%.syso}" == "${syso}" ]]; then
15*2810ac1bSKiyoung Kim    echo "2nd argument should be a .syso file" >&2
16*2810ac1bSKiyoung Kim    exit 1
17*2810ac1bSKiyoung Kimfi
18*2810ac1bSKiyoung Kim
19*2810ac1bSKiyoung Kimcat<<EOF
20*2810ac1bSKiyoung Kimpackage ${package}
21*2810ac1bSKiyoung Kim
22*2810ac1bSKiyoung Kimimport (
23*2810ac1bSKiyoung Kim	"unsafe"
24*2810ac1bSKiyoung Kim)
25*2810ac1bSKiyoung Kim
26*2810ac1bSKiyoung Kim// syso is how we call, indirectly, into the C-code.
27*2810ac1bSKiyoung Kimfunc syso(cFn, state unsafe.Pointer)
28*2810ac1bSKiyoung Kim
29*2810ac1bSKiyoung Kimtype sysoCaller struct {
30*2810ac1bSKiyoung Kim	ptr unsafe.Pointer
31*2810ac1bSKiyoung Kim}
32*2810ac1bSKiyoung Kim
33*2810ac1bSKiyoung Kim// call calls the syso linked C-function, $sym().
34*2810ac1bSKiyoung Kimfunc (s *sysoCaller) call(data unsafe.Pointer) {
35*2810ac1bSKiyoung Kim	syso(s.ptr, data)
36*2810ac1bSKiyoung Kim}
37*2810ac1bSKiyoung KimEOF
38*2810ac1bSKiyoung Kim
39*2810ac1bSKiyoung Kimfor sym in $(objdump -x "${syso}" | grep -F 'g     F' | awk '{print $6}'); do
40*2810ac1bSKiyoung Kim    cat<<EOF
41*2810ac1bSKiyoung Kim
42*2810ac1bSKiyoung Kim//go:linkname _${sym} ${sym}
43*2810ac1bSKiyoung Kimvar _${sym} byte
44*2810ac1bSKiyoung Kimvar syso__${sym} = &sysoCaller{ptr: unsafe.Pointer(&_${sym})}
45*2810ac1bSKiyoung Kim
46*2810ac1bSKiyoung KimEOF
47*2810ac1bSKiyoung Kimdone
48