120 lines
3.0 KiB
Go
120 lines
3.0 KiB
Go
package mangler
|
|
|
|
import (
|
|
"net"
|
|
"net/netip"
|
|
"net/url"
|
|
"reflect"
|
|
"time"
|
|
_ "unsafe"
|
|
)
|
|
|
|
func init() {
|
|
// Register standard library performant manglers.
|
|
Register(reflect.TypeOf(net.IPAddr{}), mangle_ipaddr)
|
|
Register(reflect.TypeOf(&net.IPAddr{}), mangle_ipaddr_ptr)
|
|
Register(reflect.TypeOf(netip.Addr{}), mangle_addr)
|
|
Register(reflect.TypeOf(&netip.Addr{}), mangle_addr_ptr)
|
|
Register(reflect.TypeOf(netip.AddrPort{}), mangle_addrport)
|
|
Register(reflect.TypeOf(&netip.AddrPort{}), mangle_addrport_ptr)
|
|
Register(reflect.TypeOf(time.Time{}), mangle_time)
|
|
Register(reflect.TypeOf(&time.Time{}), mangle_time_ptr)
|
|
Register(reflect.TypeOf(url.URL{}), mangle_url)
|
|
Register(reflect.TypeOf(&url.URL{}), mangle_url_ptr)
|
|
}
|
|
|
|
//go:linkname time_sec time.(*Time).sec
|
|
func time_sec(*time.Time) int64
|
|
|
|
//go:linkname time_nsec time.(*Time).nsec
|
|
func time_nsec(*time.Time) int32
|
|
|
|
//go:linkname time_stripMono time.(*Time).stripMono
|
|
func time_stripMono(*time.Time)
|
|
|
|
func mangle_url(buf []byte, a any) []byte {
|
|
u := (*url.URL)(iface_value(a))
|
|
return append(buf, u.String()...)
|
|
}
|
|
|
|
func mangle_url_ptr(buf []byte, a any) []byte {
|
|
if ptr := (*url.URL)(iface_value(a)); ptr != nil {
|
|
s := ptr.String()
|
|
buf = append(buf, '1')
|
|
return append(buf, s...)
|
|
}
|
|
buf = append(buf, '0')
|
|
return buf
|
|
}
|
|
|
|
func mangle_time(buf []byte, a any) []byte {
|
|
t := *(*time.Time)(iface_value(a))
|
|
time_stripMono(&t) // force non-monotonic time value.
|
|
buf = append_uint64(buf, uint64(time_sec(&t)))
|
|
buf = append_uint32(buf, uint32(time_nsec(&t)))
|
|
return buf
|
|
}
|
|
|
|
func mangle_time_ptr(buf []byte, a any) []byte {
|
|
if ptr := (*time.Time)(iface_value(a)); ptr != nil {
|
|
t := *ptr
|
|
buf = append(buf, '1')
|
|
time_stripMono(&t) // force non-monotonic time value.
|
|
buf = append_uint64(buf, uint64(time_sec(&t)))
|
|
buf = append_uint32(buf, uint32(time_nsec(&t)))
|
|
return buf
|
|
}
|
|
buf = append(buf, '0')
|
|
return buf
|
|
}
|
|
|
|
func mangle_ipaddr(buf []byte, a any) []byte {
|
|
i := *(*net.IPAddr)(iface_value(a))
|
|
buf = append(buf, i.IP...)
|
|
buf = append(buf, i.Zone...)
|
|
return buf
|
|
}
|
|
|
|
func mangle_ipaddr_ptr(buf []byte, a any) []byte {
|
|
if ptr := (*net.IPAddr)(iface_value(a)); ptr != nil {
|
|
buf = append(buf, '1')
|
|
buf = append(buf, ptr.IP...)
|
|
buf = append(buf, ptr.Zone...)
|
|
return buf
|
|
}
|
|
buf = append(buf, '0')
|
|
return buf
|
|
}
|
|
|
|
func mangle_addr(buf []byte, a any) []byte {
|
|
i := (*netip.Addr)(iface_value(a))
|
|
b, _ := i.MarshalBinary()
|
|
return append(buf, b...)
|
|
}
|
|
|
|
func mangle_addr_ptr(buf []byte, a any) []byte {
|
|
if ptr := (*netip.Addr)(iface_value(a)); ptr != nil {
|
|
buf = append(buf, '1')
|
|
b, _ := ptr.MarshalBinary()
|
|
return append(buf, b...)
|
|
}
|
|
buf = append(buf, '0')
|
|
return buf
|
|
}
|
|
|
|
func mangle_addrport(buf []byte, a any) []byte {
|
|
i := (*netip.AddrPort)(iface_value(a))
|
|
b, _ := i.MarshalBinary()
|
|
return append(buf, b...)
|
|
}
|
|
|
|
func mangle_addrport_ptr(buf []byte, a any) []byte {
|
|
if ptr := (*netip.AddrPort)(iface_value(a)); ptr != nil {
|
|
buf = append(buf, '1')
|
|
b, _ := ptr.MarshalBinary()
|
|
return append(buf, b...)
|
|
}
|
|
buf = append(buf, '0')
|
|
return buf
|
|
}
|