diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 000000000..0e40fe8f5 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ + +# Default ignored files +/workspace.xml \ No newline at end of file diff --git a/.idea/ZeroTierOne.iml b/.idea/ZeroTierOne.iml new file mode 100644 index 000000000..5e764c4f0 --- /dev/null +++ b/.idea/ZeroTierOne.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 000000000..a55e7a179 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/dictionaries/api.xml b/.idea/dictionaries/api.xml new file mode 100644 index 000000000..53167764f --- /dev/null +++ b/.idea/dictionaries/api.xml @@ -0,0 +1,11 @@ + + + + apisocket + nwid + secrand + sockaddr + unmarshals + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 000000000..146ab09b7 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 000000000..28a804d89 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 000000000..6b5db6854 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 000000000..94a25f7f4 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/watcherTasks.xml b/.idea/watcherTasks.xml new file mode 100644 index 000000000..97ad6d2d9 --- /dev/null +++ b/.idea/watcherTasks.xml @@ -0,0 +1,29 @@ + + + + + + + + \ No newline at end of file diff --git a/go/pkg/zerotier/api.go b/go/pkg/zerotier/api.go index 3b7750100..a4c456cdc 100644 --- a/go/pkg/zerotier/api.go +++ b/go/pkg/zerotier/api.go @@ -25,7 +25,7 @@ import ( "strings" "time" - acl "github.com/hectane/go-acl" + "github.com/hectane/go-acl" ) // APISocketName is the default socket name for accessing the API @@ -151,7 +151,7 @@ func apiSendObj(out http.ResponseWriter, req *http.Request, httpStatusCode int, func apiReadObj(out http.ResponseWriter, req *http.Request, dest interface{}) (err error) { err = json.NewDecoder(req.Body).Decode(&dest) if err != nil { - apiSendObj(out, req, http.StatusBadRequest, nil) + _ = apiSendObj(out, req, http.StatusBadRequest, nil) } return } @@ -165,7 +165,7 @@ func apiCheckAuth(out http.ResponseWriter, req *http.Request, token string) bool if len(ah) > 0 && strings.TrimSpace(ah) == token { return true } - apiSendObj(out, req, http.StatusUnauthorized, nil) + _ = apiSendObj(out, req, http.StatusUnauthorized, nil) return false } @@ -182,13 +182,13 @@ func createAPIServer(basePath string, node *Node) (*http.Server, error) { return nil, err } for i := 0; i < 20; i++ { - atb[i] = byte("abcdefghijklmnopqrstuvwxyz0123456789"[atb[i]%36]) + atb[i] = "abcdefghijklmnopqrstuvwxyz0123456789"[atb[i]%36] } err = ioutil.WriteFile(authTokenFile, atb[:], 0600) if err != nil { return nil, err } - acl.Chmod(authTokenFile, 0600) + _ = acl.Chmod(authTokenFile, 0600) authToken = string(atb[:]) } else { authToken = strings.TrimSpace(string(authTokenB)) @@ -202,7 +202,7 @@ func createAPIServer(basePath string, node *Node) (*http.Server, error) { } apiSetStandardHeaders(out) if req.Method == http.MethodGet || req.Method == http.MethodHead { - apiSendObj(out, req, http.StatusOK, &APIStatus{ + _ = apiSendObj(out, req, http.StatusOK, &APIStatus{ Address: node.Address(), Clock: TimeMs(), Config: node.LocalConfig(), @@ -218,7 +218,7 @@ func createAPIServer(basePath string, node *Node) (*http.Server, error) { }) } else { out.Header().Set("Allow", "GET, HEAD") - apiSendObj(out, req, http.StatusMethodNotAllowed, nil) + _ = apiSendObj(out, req, http.StatusMethodNotAllowed, nil) } }) @@ -230,14 +230,14 @@ func createAPIServer(basePath string, node *Node) (*http.Server, error) { if req.Method == http.MethodPost || req.Method == http.MethodPut { var c LocalConfig if apiReadObj(out, req, &c) == nil { - node.SetLocalConfig(&c) - apiSendObj(out, req, http.StatusOK, node.LocalConfig()) + _, _ = node.SetLocalConfig(&c) + _ = apiSendObj(out, req, http.StatusOK, node.LocalConfig()) } } else if req.Method == http.MethodGet || req.Method == http.MethodHead { - apiSendObj(out, req, http.StatusOK, node.LocalConfig()) + _ = apiSendObj(out, req, http.StatusOK, node.LocalConfig()) } else { out.Header().Set("Allow", "GET, HEAD, PUT, POST") - apiSendObj(out, req, http.StatusMethodNotAllowed, nil) + _ = apiSendObj(out, req, http.StatusMethodNotAllowed, nil) } }) @@ -252,7 +252,7 @@ func createAPIServer(basePath string, node *Node) (*http.Server, error) { var err error queriedID, err = NewAddressFromString(req.URL.Path[6:]) if err != nil { - apiSendObj(out, req, http.StatusNotFound, nil) + _ = apiSendObj(out, req, http.StatusNotFound, nil) return } } @@ -266,13 +266,13 @@ func createAPIServer(basePath string, node *Node) (*http.Server, error) { p2 = append(p2, p) } } - apiSendObj(out, req, http.StatusOK, p2) + _ = apiSendObj(out, req, http.StatusOK, p2) } else { - apiSendObj(out, req, http.StatusOK, peers) + _ = apiSendObj(out, req, http.StatusOK, peers) } } else { out.Header().Set("Allow", "GET, HEAD") - apiSendObj(out, req, http.StatusMethodNotAllowed, nil) + _ = apiSendObj(out, req, http.StatusMethodNotAllowed, nil) } }) @@ -287,14 +287,14 @@ func createAPIServer(basePath string, node *Node) (*http.Server, error) { var err error queriedID, err = NewNetworkIDFromString(req.URL.Path[9:]) if err != nil { - apiSendObj(out, req, http.StatusNotFound, nil) + _ = apiSendObj(out, req, http.StatusNotFound, nil) return } } if req.Method == http.MethodPost || req.Method == http.MethodPut { if queriedID == 0 { - apiSendObj(out, req, http.StatusBadRequest, nil) + _ = apiSendObj(out, req, http.StatusBadRequest, nil) } else { var nw APINetwork if apiReadObj(out, req, &nw) == nil { @@ -302,15 +302,15 @@ func createAPIServer(basePath string, node *Node) (*http.Server, error) { if n == nil { n, err := node.Join(nw.ID, nw.Settings, nil) if err != nil { - apiSendObj(out, req, http.StatusBadRequest, nil) + _ = apiSendObj(out, req, http.StatusBadRequest, nil) } else { - apiSendObj(out, req, http.StatusOK, apiNetworkFromNetwork(n)) + _ = apiSendObj(out, req, http.StatusOK, apiNetworkFromNetwork(n)) } } else { if nw.Settings != nil { n.SetLocalSettings(nw.Settings) } - apiSendObj(out, req, http.StatusOK, apiNetworkFromNetwork(n)) + _ = apiSendObj(out, req, http.StatusOK, apiNetworkFromNetwork(n)) } } } @@ -321,18 +321,18 @@ func createAPIServer(basePath string, node *Node) (*http.Server, error) { for _, nw := range networks { nws = append(nws, apiNetworkFromNetwork(nw)) } - apiSendObj(out, req, http.StatusOK, nws) + _ = apiSendObj(out, req, http.StatusOK, nws) } else { for _, nw := range networks { if nw.ID() == queriedID { - apiSendObj(out, req, http.StatusOK, apiNetworkFromNetwork(nw)) + _ = apiSendObj(out, req, http.StatusOK, apiNetworkFromNetwork(nw)) break } } } } else { out.Header().Set("Allow", "GET, HEAD, PUT, POST") - apiSendObj(out, req, http.StatusMethodNotAllowed, nil) + _ = apiSendObj(out, req, http.StatusMethodNotAllowed, nil) } }) @@ -347,14 +347,14 @@ func createAPIServer(basePath string, node *Node) (*http.Server, error) { var err error queriedID, err = NewAddressFromString(req.URL.Path[6:]) if err != nil { - apiSendObj(out, req, http.StatusNotFound, nil) + _ = apiSendObj(out, req, http.StatusNotFound, nil) return } } if req.Method == http.MethodPost || req.Method == http.MethodPut { if queriedID == 0 { - apiSendObj(out, req, http.StatusBadRequest, nil) + _ = apiSendObj(out, req, http.StatusBadRequest, nil) } else { var r Root if apiReadObj(out, req, &r) == nil { @@ -362,10 +362,10 @@ func createAPIServer(basePath string, node *Node) (*http.Server, error) { } } else if req.Method == http.MethodGet || req.Method == http.MethodHead { roots := node.Roots() - apiSendObj(out, req, http.StatusOK, roots) + _ = apiSendObj(out, req, http.StatusOK, roots) } else { out.Header().Set("Allow", "GET, HEAD, PUT, POST") - apiSendObj(out, req, http.StatusMethodNotAllowed, nil) + _ = apiSendObj(out, req, http.StatusMethodNotAllowed, nil) } }) @@ -382,8 +382,11 @@ func createAPIServer(basePath string, node *Node) (*http.Server, error) { } httpServer.SetKeepAlivesEnabled(true) go func() { - httpServer.Serve(listener) - listener.Close() + err := httpServer.Serve(listener) + if err != nil { + node.log.Printf("ERROR: unable to start API HTTP server: %s (continuing anyway but CLI will not work!)", err.Error()) + } + _ = listener.Close() }() return httpServer, nil diff --git a/go/pkg/zerotier/errors.go b/go/pkg/zerotier/errors.go index 444d159fc..5dedc87fd 100644 --- a/go/pkg/zerotier/errors.go +++ b/go/pkg/zerotier/errors.go @@ -20,15 +20,15 @@ func (e Err) Error() string { return (string)(e) } // Simple ZeroTier Errors const ( - ErrInternal Err = "internal error" - ErrNodeInitFailed Err = "unable to initialize core Node instance" - ErrInvalidMACAddress Err = "invalid MAC address" - ErrInvalidZeroTierAddress Err = "invalid ZeroTier address" - ErrInvalidNetworkID Err = "invalid network ID" - ErrInvalidParameter Err = "invalid parameter" - ErrTapInitFailed Err = "unable to create native Tap instance" - ErrUncrecognizedIdentityType Err = "unrecognized identity type" - ErrInvalidKey Err = "invalid key data" - ErrInvalidSignature Err = "invalid signature" - ErrSecretKeyRequired Err = "secret key required" + ErrInternal Err = "internal error" + ErrNodeInitFailed Err = "unable to initialize core Node instance" + ErrInvalidMACAddress Err = "invalid MAC address" + ErrInvalidZeroTierAddress Err = "invalid ZeroTier address" + ErrInvalidNetworkID Err = "invalid network ID" + ErrInvalidParameter Err = "invalid parameter" + ErrTapInitFailed Err = "unable to create native Tap instance" + ErrUnrecognizedIdentityType Err = "unrecognized identity type" + ErrInvalidKey Err = "invalid key data" + ErrInvalidSignature Err = "invalid signature" + ErrSecretKeyRequired Err = "secret key required" ) diff --git a/go/pkg/zerotier/identity.go b/go/pkg/zerotier/identity.go index dcd510658..bc8603fce 100644 --- a/go/pkg/zerotier/identity.go +++ b/go/pkg/zerotier/identity.go @@ -62,7 +62,7 @@ func NewIdentityFromString(s string) (*Identity, error) { } else if ss[1] == "1" { id.idtype = 1 } else { - return nil, ErrUncrecognizedIdentityType + return nil, ErrUnrecognizedIdentityType } switch id.idtype { diff --git a/go/pkg/zerotier/mac.go b/go/pkg/zerotier/mac.go index 1b8aeb05c..eb9ed9d04 100644 --- a/go/pkg/zerotier/mac.go +++ b/go/pkg/zerotier/mac.go @@ -36,7 +36,7 @@ func NewMACFromString(s string) (MAC, error) { if c > 0xff { return MAC(0), ErrInvalidMACAddress } - m |= (c & 0xff) + m |= c & 0xff } return MAC(m), nil } diff --git a/go/pkg/zerotier/misc.go b/go/pkg/zerotier/misc.go index a0c841f38..8a0b839b8 100644 --- a/go/pkg/zerotier/misc.go +++ b/go/pkg/zerotier/misc.go @@ -53,7 +53,7 @@ func checkPort(port int) bool { ua.Port = port uc, err := net.ListenUDP("udp6", &ua) if uc != nil { - uc.Close() + _ = uc.Close() } if err != nil { return false @@ -61,7 +61,7 @@ func checkPort(port int) bool { ua.IP = net.IPv4zero uc, err = net.ListenUDP("udp4", &ua) if uc != nil { - uc.Close() + _ = uc.Close() } if err != nil { return false @@ -72,7 +72,7 @@ func checkPort(port int) bool { ta.Port = port tc, err := net.ListenTCP("tcp6", &ta) if tc != nil { - tc.Close() + _ = tc.Close() } if err != nil { return false @@ -80,7 +80,7 @@ func checkPort(port int) bool { ta.IP = net.IPv4zero tc, err = net.ListenTCP("tcp4", &ta) if tc != nil { - tc.Close() + _ = tc.Close() } if err != nil { return false diff --git a/go/pkg/zerotier/multicastgroup.go b/go/pkg/zerotier/multicastgroup.go index f659c2426..27b30ccb8 100644 --- a/go/pkg/zerotier/multicastgroup.go +++ b/go/pkg/zerotier/multicastgroup.go @@ -28,7 +28,7 @@ func (mg *MulticastGroup) String() string { // Less returns true if this MulticastGroup is less than another. func (mg *MulticastGroup) Less(mg2 *MulticastGroup) bool { - return (mg.MAC < mg2.MAC || (mg.MAC == mg2.MAC && mg.ADI < mg2.ADI)) + return mg.MAC < mg2.MAC || (mg.MAC == mg2.MAC && mg.ADI < mg2.ADI) } // key returns an array usable as a key for a map[] diff --git a/go/pkg/zerotier/nativetap.go b/go/pkg/zerotier/nativetap.go index 04112693c..dae784116 100644 --- a/go/pkg/zerotier/nativetap.go +++ b/go/pkg/zerotier/nativetap.go @@ -233,11 +233,11 @@ func handleTapMulticastGroupChange(gn unsafe.Pointer, nwid, mac C.uint64_t, adi } //export goHandleTapAddedMulticastGroup -func goHandleTapAddedMulticastGroup(gn, tapP unsafe.Pointer, nwid, mac C.uint64_t, adi C.uint32_t) { +func goHandleTapAddedMulticastGroup(gn, _ unsafe.Pointer, nwid, mac C.uint64_t, adi C.uint32_t) { handleTapMulticastGroupChange(gn, nwid, mac, adi, true) } //export goHandleTapRemovedMulticastGroup -func goHandleTapRemovedMulticastGroup(gn, tapP unsafe.Pointer, nwid, mac C.uint64_t, adi C.uint32_t) { +func goHandleTapRemovedMulticastGroup(gn, _ unsafe.Pointer, nwid, mac C.uint64_t, adi C.uint32_t) { handleTapMulticastGroupChange(gn, nwid, mac, adi, false) } diff --git a/go/pkg/zerotier/network.go b/go/pkg/zerotier/network.go index 959a06c9e..05f800ab5 100644 --- a/go/pkg/zerotier/network.go +++ b/go/pkg/zerotier/network.go @@ -312,7 +312,7 @@ func (n *Network) updateConfig(nc *NetworkConfig, ls *NetworkLocalSettings) { wantAssignedIPs[k] = true if _, have := haveAssignedIPs[k]; !have { n.node.log.Printf("%.16x adding managed IP %s", uint64(n.id), ip.String()) - n.tap.AddIP(&ip) + _ = n.tap.AddIP(&ip) } } } @@ -320,7 +320,7 @@ func (n *Network) updateConfig(nc *NetworkConfig, ls *NetworkLocalSettings) { for k, ip := range haveAssignedIPs { if _, want := wantAssignedIPs[k]; !want { n.node.log.Printf("%.16x removing managed IP %s", uint64(n.id), ip.String()) - n.tap.RemoveIP(ip) + _ = n.tap.RemoveIP(ip) } } @@ -341,7 +341,7 @@ func (n *Network) updateConfig(nc *NetworkConfig, ls *NetworkLocalSettings) { wantManagedRoutes[k] = true if _, have := haveManagedRoutes[k]; !have { n.node.log.Printf("%.16x adding managed route %s", uint64(n.id), r.String()) - n.tap.AddRoute(&r) + _ = n.tap.AddRoute(&r) } } } @@ -349,7 +349,7 @@ func (n *Network) updateConfig(nc *NetworkConfig, ls *NetworkLocalSettings) { for k, r := range haveManagedRoutes { if _, want := wantManagedRoutes[k]; !want { n.node.log.Printf("%.16x removing managed route %s", uint64(n.id), r.String()) - n.tap.RemoveRoute(r) + _ = n.tap.RemoveRoute(r) } } diff --git a/go/pkg/zerotier/node.go b/go/pkg/zerotier/node.go index 9bc6d408a..426e5d85c 100644 --- a/go/pkg/zerotier/node.go +++ b/go/pkg/zerotier/node.go @@ -26,7 +26,7 @@ import ( "fmt" "io/ioutil" "log" - rand "math/rand" + "math/rand" "net" "net/http" "os" @@ -38,7 +38,7 @@ import ( "time" "unsafe" - acl "github.com/hectane/go-acl" + "github.com/hectane/go-acl" ) var nullLogger = log.New(ioutil.Discard, "", 0) @@ -90,14 +90,14 @@ func sockaddrStorageToIPNet(ss *C.struct_sockaddr_storage) *net.IPNet { sa4 := (*C.struct_sockaddr_in)(unsafe.Pointer(ss)) var ip4 [4]byte copy(ip4[:], (*[4]byte)(unsafe.Pointer(&sa4.sin_addr))[:]) - a.IP = net.IP(ip4[:]) + a.IP = ip4[:] a.Mask = net.CIDRMask(int(binary.BigEndian.Uint16(((*[2]byte)(unsafe.Pointer(&sa4.sin_port)))[:])), 32) return &a case AFInet6: sa6 := (*C.struct_sockaddr_in6)(unsafe.Pointer(ss)) var ip6 [16]byte copy(ip6[:], (*[16]byte)(unsafe.Pointer(&sa6.sin6_addr))[:]) - a.IP = net.IP(ip6[:]) + a.IP = ip6[:] a.Mask = net.CIDRMask(int(binary.BigEndian.Uint16(((*[2]byte)(unsafe.Pointer(&sa6.sin6_port)))[:])), 128) return &a } @@ -111,14 +111,14 @@ func sockaddrStorageToUDPAddr(ss *C.struct_sockaddr_storage) *net.UDPAddr { sa4 := (*C.struct_sockaddr_in)(unsafe.Pointer(ss)) var ip4 [4]byte copy(ip4[:], (*[4]byte)(unsafe.Pointer(&sa4.sin_addr))[:]) - a.IP = net.IP(ip4[:]) + a.IP = ip4[:] a.Port = int(binary.BigEndian.Uint16(((*[2]byte)(unsafe.Pointer(&sa4.sin_port)))[:])) return &a case AFInet6: sa6 := (*C.struct_sockaddr_in6)(unsafe.Pointer(ss)) var ip6 [16]byte copy(ip6[:], (*[16]byte)(unsafe.Pointer(&sa6.sin6_addr))[:]) - a.IP = net.IP(ip6[:]) + a.IP = ip6[:] a.Port = int(binary.BigEndian.Uint16(((*[2]byte)(unsafe.Pointer(&sa6.sin6_port)))[:])) return &a } @@ -176,7 +176,7 @@ type Node struct { func NewNode(basePath string) (*Node, error) { var err error - os.MkdirAll(basePath, 0755) + _ = os.MkdirAll(basePath, 0755) if _, err := os.Stat(basePath); err != nil { return nil, err } @@ -257,15 +257,15 @@ func NewNode(basePath string) (*Node, error) { } if portsChanged { - n.localConfig.Write(n.localConfigPath) + _ = n.localConfig.Write(n.localConfigPath) } } else if !checkPort(n.localConfig.Settings.PrimaryPort) { return nil, errors.New("unable to bind to primary port") } - cpath := C.CString(basePath) - n.gn = C.ZT_GoNode_new(cpath) - C.free(unsafe.Pointer(cpath)) + cPath := C.CString(basePath) + n.gn = C.ZT_GoNode_new(cPath) + C.free(unsafe.Pointer(cPath)) if n.gn == nil { n.log.Println("FATAL: node initialization failed") return nil, ErrNodeInitFailed @@ -274,10 +274,10 @@ func NewNode(basePath string) (*Node, error) { var ns C.ZT_NodeStatus C.ZT_Node_status(unsafe.Pointer(n.zn), &ns) - idstr := C.GoString(ns.secretIdentity) - n.id, err = NewIdentityFromString(idstr) + idString := C.GoString(ns.secretIdentity) + n.id, err = NewIdentityFromString(idString) if err != nil { - n.log.Printf("FATAL: node's identity does not seem valid (%s)", idstr) + n.log.Printf("FATAL: node's identity does not seem valid (%s)", string(idString)) C.ZT_GoNode_delete(n.gn) return nil, err } @@ -381,7 +381,7 @@ func NewNode(basePath string) (*Node, error) { // Trim log if it's gone over its size limit if n.localConfig.Settings.LogSizeMax > 0 && n.logW != nil { - n.logW.trim(n.localConfig.Settings.LogSizeMax*1024, 0.5, true) + _ = n.logW.trim(n.localConfig.Settings.LogSizeMax*1024, 0.5, true) } n.localConfigLock.RUnlock() @@ -396,7 +396,7 @@ func NewNode(basePath string) (*Node, error) { // Close closes this Node and frees its underlying C++ Node structures func (n *Node) Close() { if atomic.SwapUint32(&n.running, 0) != 0 { - n.apiServer.Close() + _ = n.apiServer.Close() C.ZT_GoNode_delete(n.gn) nodesByUserPtrLock.Lock() delete(nodesByUserPtr, uintptr(unsafe.Pointer(n.gn))) @@ -453,7 +453,7 @@ func (n *Node) SetLocalConfig(lc *LocalConfig) (restartRequired bool, err error) } if lc.Settings.LogSizeMax < 0 { n.log = nullLogger - n.logW.Close() + _ = n.logW.Close() n.logW = nil } else if n.logW != nil { n.logW, err = sizeLimitWriterOpen(path.Join(n.basePath, "service.log")) @@ -492,7 +492,7 @@ func (n *Node) Join(nwid NetworkID, settings *NetworkLocalSettings, tap Tap) (*N return nil, ErrTapInitFailed } - nw, err := newNetwork(n, NetworkID(nwid), &nativeTap{tap: unsafe.Pointer(ntap), enabled: 1}) + nw, err := newNetwork(n, nwid, &nativeTap{tap: unsafe.Pointer(ntap), enabled: 1}) if err != nil { n.log.Printf("join network %.16x failed: network failed to initialize: %s", nwid, err.Error()) C.ZT_GoNode_leave(n.gn, C.uint64_t(nwid)) @@ -561,8 +561,8 @@ func (n *Node) Roots() []*Root { Name: C.GoString(root.name), Identity: id, Addresses: addrs, - Preferred: (root.preferred != 0), - Online: (root.online != 0), + Preferred: root.preferred != 0, + Online: root.online != 0, }) } } @@ -588,7 +588,7 @@ func (n *Node) SetRoot(name string, locator *Locator) error { } var lbp unsafe.Pointer if len(lb) > 0 { - lbp = unsafe.Pointer(&lb[0]) + lbp = &lb[0] } cn := C.CString(name) defer C.free(unsafe.Pointer(cn)) @@ -732,12 +732,12 @@ func (n *Node) makeStateObjectPath(objType int, id [2]uint64) (string, bool) { secret = true case C.ZT_STATE_OBJECT_PEER: fp = path.Join(n.basePath, "peers.d") - os.Mkdir(fp, 0700) + _ = os.Mkdir(fp, 0700) fp = path.Join(fp, fmt.Sprintf("%.10x.peer", id[0])) secret = true case C.ZT_STATE_OBJECT_NETWORK_CONFIG: fp = path.Join(n.basePath, "networks.d") - os.Mkdir(fp, 0755) + _ = os.Mkdir(fp, 0755) fp = path.Join(fp, fmt.Sprintf("%.16x.conf", id[0])) case C.ZT_STATE_OBJECT_ROOT_LIST: fp = path.Join(n.basePath, "roots") @@ -752,9 +752,9 @@ func (n *Node) stateObjectPut(objType int, id [2]uint64, data []byte) { if secret { fileMode = os.FileMode(0600) } - ioutil.WriteFile(fp, data, fileMode) + _ = ioutil.WriteFile(fp, data, fileMode) if secret { - acl.Chmod(fp, 0600) // this emulates Unix chmod on Windows and uses os.Chmod on Unix-type systems + _ = acl.Chmod(fp, 0600) // this emulates Unix chmod on Windows and uses os.Chmod on Unix-type systems } } } @@ -762,7 +762,7 @@ func (n *Node) stateObjectPut(objType int, id [2]uint64, data []byte) { func (n *Node) stateObjectDelete(objType int, id [2]uint64) { fp, _ := n.makeStateObjectPath(objType, id) if len(fp) > 0 { - os.Remove(fp) + _ = os.Remove(fp) } } @@ -801,14 +801,22 @@ func goPathCheckFunc(gn unsafe.Pointer, ztAddress C.uint64_t, af C.int, ip unsaf nodesByUserPtrLock.RLock() node := nodesByUserPtr[uintptr(gn)] nodesByUserPtrLock.RUnlock() - if node != nil && node.pathCheck(Address(ztAddress), int(af), nil, int(port)) { + var nip net.IP + if af == AFInet { + nip = ((*[4]byte)(ip))[:] + } else if af == AFInet6 { + nip = ((*[16]byte)(ip))[:] + } else { + return 0 + } + if node != nil && len(nip) > 0 && node.pathCheck(Address(ztAddress), int(af), nip, int(port)) { return 1 } return 0 } //export goPathLookupFunc -func goPathLookupFunc(gn unsafe.Pointer, ztAddress C.uint64_t, desiredAddressFamily int, familyP, ipP, portP unsafe.Pointer) C.int { +func goPathLookupFunc(gn unsafe.Pointer, ztAddress C.uint64_t, _ int, familyP, ipP, portP unsafe.Pointer) C.int { nodesByUserPtrLock.RLock() node := nodesByUserPtr[uintptr(gn)] nodesByUserPtrLock.RUnlock() @@ -903,7 +911,7 @@ func goDNSResolverFunc(gn unsafe.Pointer, dnsRecordTypes unsafe.Pointer, numDNSR } //export goVirtualNetworkConfigFunc -func goVirtualNetworkConfigFunc(gn, tapP unsafe.Pointer, nwid C.uint64_t, op C.int, conf unsafe.Pointer) { +func goVirtualNetworkConfigFunc(gn, _ unsafe.Pointer, nwid C.uint64_t, op C.int, conf unsafe.Pointer) { go func() { nodesByUserPtrLock.RLock() node := nodesByUserPtr[uintptr(gn)] @@ -911,47 +919,52 @@ func goVirtualNetworkConfigFunc(gn, tapP unsafe.Pointer, nwid C.uint64_t, op C.i if node == nil { return } + node.networksLock.RLock() network := node.networks[NetworkID(nwid)] node.networksLock.RUnlock() + if network != nil { - ncc := (*C.ZT_VirtualNetworkConfig)(conf) - if network.networkConfigRevision() > uint64(ncc.netconfRevision) { - return - } - var nc NetworkConfig - nc.ID = NetworkID(ncc.nwid) - nc.MAC = MAC(ncc.mac) - nc.Name = C.GoString(&ncc.name[0]) - nc.Status = int(ncc.status) - nc.Type = int(ncc._type) - nc.MTU = int(ncc.mtu) - nc.Bridge = (ncc.bridge != 0) - nc.BroadcastEnabled = (ncc.broadcastEnabled != 0) - nc.NetconfRevision = uint64(ncc.netconfRevision) - for i := 0; i < int(ncc.assignedAddressCount); i++ { - a := sockaddrStorageToIPNet(&ncc.assignedAddresses[i]) - if a != nil { - nc.AssignedAddresses = append(nc.AssignedAddresses, *a) + switch op { + case C.ZT_VIRTUAL_NETWORK_CONFIG_OPERATION_UP, C.ZT_VIRTUAL_NETWORK_CONFIG_OPERATION_UP: + ncc := (*C.ZT_VirtualNetworkConfig)(conf) + if network.networkConfigRevision() > uint64(ncc.netconfRevision) { + return } - } - for i := 0; i < int(ncc.routeCount); i++ { - tgt := sockaddrStorageToIPNet(&ncc.routes[i].target) - viaN := sockaddrStorageToIPNet(&ncc.routes[i].via) - var via net.IP - if viaN != nil { - via = viaN.IP + var nc NetworkConfig + nc.ID = NetworkID(ncc.nwid) + nc.MAC = MAC(ncc.mac) + nc.Name = C.GoString(&ncc.name[0]) + nc.Status = int(ncc.status) + nc.Type = int(ncc._type) + nc.MTU = int(ncc.mtu) + nc.Bridge = ncc.bridge != 0 + nc.BroadcastEnabled = ncc.broadcastEnabled != 0 + nc.NetconfRevision = uint64(ncc.netconfRevision) + for i := 0; i < int(ncc.assignedAddressCount); i++ { + a := sockaddrStorageToIPNet(&ncc.assignedAddresses[i]) + if a != nil { + nc.AssignedAddresses = append(nc.AssignedAddresses, *a) + } } - if tgt != nil { - nc.Routes = append(nc.Routes, Route{ - Target: *tgt, - Via: via, - Flags: uint16(ncc.routes[i].flags), - Metric: uint16(ncc.routes[i].metric), - }) + for i := 0; i < int(ncc.routeCount); i++ { + tgt := sockaddrStorageToIPNet(&ncc.routes[i].target) + viaN := sockaddrStorageToIPNet(&ncc.routes[i].via) + var via net.IP + if viaN != nil { + via = viaN.IP + } + if tgt != nil { + nc.Routes = append(nc.Routes, Route{ + Target: *tgt, + Via: via, + Flags: uint16(ncc.routes[i].flags), + Metric: uint16(ncc.routes[i].metric), + }) + } } + network.updateConfig(&nc, nil) } - network.updateConfig(&nc, nil) } }() } diff --git a/go/pkg/zerotier/osdep-posix.go b/go/pkg/zerotier/osdep-posix.go index 019ee51a0..07d3612d9 100644 --- a/go/pkg/zerotier/osdep-posix.go +++ b/go/pkg/zerotier/osdep-posix.go @@ -26,7 +26,7 @@ import ( func createNamedSocketListener(basePath, name string) (net.Listener, error) { apiSockPath := path.Join(basePath, name) - os.Remove(apiSockPath) + _ = os.Remove(apiSockPath) return net.Listen("unix", apiSockPath) } diff --git a/go/pkg/zerotier/osdep-windows.go b/go/pkg/zerotier/osdep-windows.go index 8a9c99234..2073243f6 100644 --- a/go/pkg/zerotier/osdep-windows.go +++ b/go/pkg/zerotier/osdep-windows.go @@ -26,3 +26,8 @@ const windowsAPISocketPathPrefix = "\\\\.\\pipe\\zerotier_" func createNamedSocketListener(basePath, name string) (net.Listener, error) { winio.ListenPipe(windowsAPISocketPathPrefix+name, nil) } + +func createNamedSocketHTTPClient(basePath, name string) (*http.Client, error) { + panic("needs implementation") + return nil, nil +} diff --git a/go/pkg/zerotier/sizelimitwriter.go b/go/pkg/zerotier/sizelimitwriter.go index a8ab86c52..61257e8b3 100644 --- a/go/pkg/zerotier/sizelimitwriter.go +++ b/go/pkg/zerotier/sizelimitwriter.go @@ -14,6 +14,7 @@ package zerotier import ( + "io" "os" "sync" ) @@ -28,7 +29,7 @@ func sizeLimitWriterOpen(p string) (*sizeLimitWriter, error) { if err != nil { return nil, err } - f.Seek(0, os.SEEK_END) + _, _ = f.Seek(0, io.SeekEnd) return &sizeLimitWriter{f: f}, nil } @@ -50,7 +51,7 @@ func (w *sizeLimitWriter) trim(maxSize int, trimFactor float64, trimAtCR bool) e w.l.Lock() defer w.l.Unlock() - flen, err := w.f.Seek(0, os.SEEK_END) + flen, err := w.f.Seek(0, io.SeekEnd) if err != nil { return err } @@ -100,7 +101,7 @@ func (w *sizeLimitWriter) trim(maxSize int, trimFactor float64, trimAtCR bool) e if err != nil { return err } - _, err = w.f.Seek(0, os.SEEK_END) + _, err = w.f.Seek(0, io.SeekEnd) return err }