123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- package srs
- import (
- "encoding/binary"
- "net/netip"
- "os"
- "unsafe"
- "github.com/sagernet/sing/common"
- M "github.com/sagernet/sing/common/metadata"
- "github.com/sagernet/sing/common/varbin"
- "go4.org/netipx"
- )
- type myIPSet struct {
- rr []myIPRange
- }
- type myIPRange struct {
- from netip.Addr
- to netip.Addr
- }
- type myIPRangeData struct {
- From []byte
- To []byte
- }
- func readIPSet(reader varbin.Reader) (*netipx.IPSet, error) {
- version, err := reader.ReadByte()
- if err != nil {
- return nil, err
- }
- if version != 1 {
- return nil, os.ErrInvalid
- }
- // WTF why using uint64 here
- var length uint64
- err = binary.Read(reader, binary.BigEndian, &length)
- if err != nil {
- return nil, err
- }
- ranges := make([]myIPRangeData, length)
- err = varbin.Read(reader, binary.BigEndian, &ranges)
- if err != nil {
- return nil, err
- }
- mySet := &myIPSet{
- rr: make([]myIPRange, len(ranges)),
- }
- for i, rangeData := range ranges {
- mySet.rr[i].from = M.AddrFromIP(rangeData.From)
- mySet.rr[i].to = M.AddrFromIP(rangeData.To)
- }
- return (*netipx.IPSet)(unsafe.Pointer(mySet)), nil
- }
- func writeIPSet(writer varbin.Writer, set *netipx.IPSet) error {
- err := writer.WriteByte(1)
- if err != nil {
- return err
- }
- dataList := common.Map((*myIPSet)(unsafe.Pointer(set)).rr, func(rr myIPRange) myIPRangeData {
- return myIPRangeData{
- From: rr.from.AsSlice(),
- To: rr.to.AsSlice(),
- }
- })
- err = binary.Write(writer, binary.BigEndian, uint64(len(dataList)))
- if err != nil {
- return err
- }
- for _, data := range dataList {
- err = varbin.Write(writer, binary.BigEndian, data)
- if err != nil {
- return err
- }
- }
- return nil
- }
|