Skip to content

Commit

Permalink
Merge branch 'goreleaser' into patch-1
Browse files Browse the repository at this point in the history
  • Loading branch information
mgdigital authored Mar 11, 2024
2 parents 8522d1d + 2fff99d commit c9d0351
Show file tree
Hide file tree
Showing 4 changed files with 194 additions and 76 deletions.
7 changes: 7 additions & 0 deletions internal/database/search/criteria_content_identifier.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package search

import (
"github.com/bitmagnet-io/bitmagnet/internal/database/query"
"github.com/bitmagnet-io/bitmagnet/internal/maps"
"github.com/bitmagnet-io/bitmagnet/internal/model"
"gorm.io/gen"
)
Expand Down Expand Up @@ -46,6 +47,9 @@ func contentCanonicalIdentifierCriteria(contentMap contentMap) query.Criteria {
)
criteria = append(criteria, query.RawCriteria{
Query: q.Content.Where(conds...).UnderlyingDB(),
Joins: maps.NewInsertMap(
maps.MapEntry[string, struct{}]{Key: model.TableNameContent},
),
})
}
}
Expand Down Expand Up @@ -82,6 +86,9 @@ func contentAlternativeIdentifierCriteria(contentMap contentMap) query.Criteria
Query: gen.Exists(
q.ContentAttribute.Where(conds...),
),
Joins: maps.NewInsertMap(
maps.MapEntry[string, struct{}]{Key: model.TableNameContent},
),
})
}
}
Expand Down
77 changes: 1 addition & 76 deletions internal/protocol/dht/server/socket.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package server

import (
"errors"
"fmt"
"golang.org/x/sys/unix"
"net/netip"
)

Expand All @@ -15,77 +12,5 @@ type Socket interface {
}

func NewSocket() Socket {
fd, sockErr := unix.Socket(unix.SOCK_DGRAM, unix.AF_INET, 0)
if sockErr != nil {
panic(fmt.Errorf("error creating socket: %w", sockErr))
}
return &socket{
fd: fd,
}
}

type socket struct {
fd int
}

func (s *socket) Open(localAddr netip.AddrPort) error {
sAddr, addrErr := addrPortToSockaddr(localAddr)
if addrErr != nil {
return addrErr
}
if bindErr := unix.Bind(s.fd, sAddr); bindErr != nil {
return bindErr
}
return nil
}

func (s *socket) Close() error {
return unix.Close(s.fd)
}

func (s *socket) Send(remoteAddr netip.AddrPort, data []byte) error {
sAddr, addrErr := addrPortToSockaddr(remoteAddr)
if addrErr != nil {
return addrErr
}
return unix.Sendto(s.fd, data, 0, sAddr)
}

func (s *socket) Receive(data []byte) (int, netip.AddrPort, error) {
n, sAddr, recvErr := unix.Recvfrom(s.fd, data, 0)
if recvErr != nil {
return n, netip.AddrPort{}, recvErr
}
addr, addrErr := sockaddrToAddrPort(sAddr)
if addrErr != nil {
return n, netip.AddrPort{}, addrErr
}
return n, addr, nil
}

func addrPortToSockaddr(addr netip.AddrPort) (unix.Sockaddr, error) {
if addr.Addr().Is4() {
return &unix.SockaddrInet4{
Addr: addr.Addr().As4(),
Port: int(addr.Port()),
}, nil
}
if addr.Addr().Is6() {
return &unix.SockaddrInet6{
Addr: addr.Addr().As16(),
Port: int(addr.Port()),
}, nil
}
return nil, errors.New("invalid address")
}

func sockaddrToAddrPort(addr unix.Sockaddr) (netip.AddrPort, error) {
switch addr := addr.(type) {
case *unix.SockaddrInet4:
return netip.AddrPortFrom(netip.AddrFrom4(addr.Addr), uint16(addr.Port)), nil
case *unix.SockaddrInet6:
return netip.AddrPortFrom(netip.AddrFrom16(addr.Addr), uint16(addr.Port)), nil
default:
return netip.AddrPort{}, fmt.Errorf("unsupported sockaddr type: %T", addr)
}
return newSocket()
}
87 changes: 87 additions & 0 deletions internal/protocol/dht/server/socket_unix.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
//go:build !windows

package server

import (
"errors"
"fmt"
"net/netip"

"golang.org/x/sys/unix"
)

func newSocket() Socket {
fd, sockErr := unix.Socket(unix.SOCK_DGRAM, unix.AF_INET, 0)
if sockErr != nil {
panic(fmt.Errorf("error creating socket: %w", sockErr))
}
return &socket{
fd: fd,
}
}

type socket struct {
fd int
}

func (s *socket) Open(localAddr netip.AddrPort) error {
sAddr, addrErr := addrPortToSockaddr(localAddr)
if addrErr != nil {
return addrErr
}
if bindErr := unix.Bind(s.fd, sAddr); bindErr != nil {
return bindErr
}
return nil
}

func (s *socket) Close() error {
return unix.Close(s.fd)
}

func (s *socket) Send(remoteAddr netip.AddrPort, data []byte) error {
sAddr, addrErr := addrPortToSockaddr(remoteAddr)
if addrErr != nil {
return addrErr
}
return unix.Sendto(s.fd, data, 0, sAddr)
}

func (s *socket) Receive(data []byte) (int, netip.AddrPort, error) {
n, sAddr, recvErr := unix.Recvfrom(s.fd, data, 0)
if recvErr != nil {
return n, netip.AddrPort{}, recvErr
}
addr, addrErr := sockaddrToAddrPort(sAddr)
if addrErr != nil {
return n, netip.AddrPort{}, addrErr
}
return n, addr, nil
}

func addrPortToSockaddr(addr netip.AddrPort) (unix.Sockaddr, error) {
if addr.Addr().Is4() {
return &unix.SockaddrInet4{
Addr: addr.Addr().As4(),
Port: int(addr.Port()),
}, nil
}
if addr.Addr().Is6() {
return &unix.SockaddrInet6{
Addr: addr.Addr().As16(),
Port: int(addr.Port()),
}, nil
}
return nil, errors.New("invalid address")
}

func sockaddrToAddrPort(addr unix.Sockaddr) (netip.AddrPort, error) {
switch addr := addr.(type) {
case *unix.SockaddrInet4:
return netip.AddrPortFrom(netip.AddrFrom4(addr.Addr), uint16(addr.Port)), nil
case *unix.SockaddrInet6:
return netip.AddrPortFrom(netip.AddrFrom16(addr.Addr), uint16(addr.Port)), nil
default:
return netip.AddrPort{}, fmt.Errorf("unsupported sockaddr type: %T", addr)
}
}
99 changes: 99 additions & 0 deletions internal/protocol/dht/server/socket_windows.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package server

import (
"errors"
"fmt"
"net/netip"
"syscall"

"golang.org/x/sys/windows"
)

type socket struct {
fd windows.Handle
}

func newSocket() Socket {
fd, _ := windows.Socket(windows.AF_INET, windows.SOCK_DGRAM, 0)
return &socket{fd: fd}
}

func (s *socket) Open(localAddr netip.AddrPort) error {
sAddr, addrErr := addrPortToSockaddr(localAddr)
if addrErr != nil {
return addrErr
}
return windows.Bind(s.fd, sAddr)
}

func (s *socket) Close() error {
return windows.Close(s.fd)
}

func (s *socket) Send(remoteAddr netip.AddrPort, data []byte) error {
sAddr, addrErr := addrPortToSockaddr(remoteAddr)
if addrErr != nil {
return addrErr
}
return windows.Sendto(s.fd, data, 0, sAddr)
}

func (s *socket) Receive(data []byte) (int, netip.AddrPort, error) {
n, sAddr, recvErr := windows.Recvfrom(s.fd, data, 0)
if recvErr != nil {
if ignoreReadFromError(recvErr) {
return 0, netip.AddrPort{}, nil
}
return n, netip.AddrPort{}, recvErr
}
addr, addrErr := sockaddrToAddrPort(sAddr)
if addrErr != nil {
return n, netip.AddrPort{}, addrErr
}
return n, addr, nil
}

// see https://github.com/bitmagnet-io/bitmagnet/pull/203 and https://github.com/anacrolix/dht/issues/16
func ignoreReadFromError(err error) bool {
var errno syscall.Errno
if errors.As(err, &errno) {
switch errno {
case
windows.WSAENETRESET,
windows.WSAECONNRESET,
windows.WSAECONNABORTED,
windows.WSAECONNREFUSED,
windows.WSAENETUNREACH,
windows.WSAETIMEDOUT:
return true
}
}
return false
}

func addrPortToSockaddr(addr netip.AddrPort) (windows.Sockaddr, error) {
if addr.Addr().Is4() {
return &windows.SockaddrInet4{
Addr: addr.Addr().As4(),
Port: int(addr.Port()),
}, nil
}
if addr.Addr().Is6() {
return &windows.SockaddrInet6{
Addr: addr.Addr().As16(),
Port: int(addr.Port()),
}, nil
}
return nil, errors.New("invalid address")
}

func sockaddrToAddrPort(addr windows.Sockaddr) (netip.AddrPort, error) {
switch addr := addr.(type) {
case *windows.SockaddrInet4:
return netip.AddrPortFrom(netip.AddrFrom4(addr.Addr), uint16(addr.Port)), nil
case *windows.SockaddrInet6:
return netip.AddrPortFrom(netip.AddrFrom16(addr.Addr), uint16(addr.Port)), nil
default:
return netip.AddrPort{}, fmt.Errorf("unsupported sockaddr type: %T", addr)
}
}

0 comments on commit c9d0351

Please sign in to comment.