From c6c88526b568253eb251d9a5a84f6e14abbd4cef Mon Sep 17 00:00:00 2001 From: Matthias Hochgatterer Date: Fri, 7 Dec 2018 12:28:55 +0100 Subject: [PATCH 1/4] Fix binding to can interface on linux --- Makefile | 5 +++-- readwritecloser.go | 33 --------------------------------- 2 files changed, 3 insertions(+), 35 deletions(-) diff --git a/Makefile b/Makefile index 1481641..4224663 100644 --- a/Makefile +++ b/Makefile @@ -3,10 +3,11 @@ GOBUILD=$(GOCMD) build GOCLEAN=$(GOCMD) clean GOTEST=$(GOCMD) test GOGET=$(GOCMD) get + BINARY_NAME=candump +VERSION=$(shell git describe --exact-match --tags 2>/dev/null) BUILD_DIR=build BUILD_SRC=cmd/candump.go -PACKAGE_RPI=$(BINARY_NAME)_linux_armhf all: test build build: @@ -20,7 +21,7 @@ clean: rm -rf $(BINARY_NAME) package-rpi: build-rpi - tar -cvzf $(PACKAGE_RPI).tar.gz -C $(BUILD_DIR) $(BINARY_NAME) + tar -cvzf $(BINARY_NAME)-$(VERSION)_linux_armhf.tar.gz -C $(BUILD_DIR) $(BINARY_NAME) build-rpi: GOOS=linux GOARCH=arm GOARM=6 $(GOBUILD) -o $(BUILD_DIR)/$(BINARY_NAME) -i $(BUILD_SRC) \ No newline at end of file diff --git a/readwritecloser.go b/readwritecloser.go index 4460a05..db48d22 100644 --- a/readwritecloser.go +++ b/readwritecloser.go @@ -1,11 +1,7 @@ package can import ( - "fmt" "io" - "net" - "os" - "syscall" ) // The Reader interface extends the `io.Reader` interface by method @@ -31,39 +27,10 @@ type ReadWriteCloser interface { io.Closer } -// Socket protocols -const ( - Raw uint8 = 1 // CAN_RAW - Bcm uint8 = 2 // CAN_BCM - TP16 uint8 = 3 - TP20 uint8 = 4 - MCNet uint8 = 5 - ISOTp uint8 = 6 -) - type readWriteCloser struct { rwc io.ReadWriteCloser } -// NewReadWriteCloserForInterface returns a ReadWriteCloser for a network interface. -func NewReadWriteCloserForInterface(i *net.Interface) (ReadWriteCloser, error) { - proto := Raw - s, err := syscall.Socket(AF_CAN, syscall.SOCK_RAW, int(proto) /* 0? */) - if err != nil { - return nil, err - } - - addr := NewSockaddr(uint16(proto) /* can.AF_CAN? */, i.Index /* 0 for all interfaces? */) - - if err := syscall.Bind(s, addr); err != nil { - return nil, err - } - - f := os.NewFile(uintptr(s), fmt.Sprintf("fd %d", s)) - - return &readWriteCloser{f}, nil -} - // NewReadWriteCloser returns a ReadWriteCloser for an `io.ReadWriteCloser`. func NewReadWriteCloser(rwc io.ReadWriteCloser) ReadWriteCloser { return &readWriteCloser{rwc} From 0fabf410d81a4e018191b32b70acdc7415118242 Mon Sep 17 00:00:00 2001 From: Matthias Hochgatterer Date: Mon, 10 Dec 2018 14:58:38 +0100 Subject: [PATCH 2/4] Add missing files --- readwritecloser_darwin.go | 10 ++++++++++ readwritecloser_linux.go | 21 +++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 readwritecloser_darwin.go create mode 100644 readwritecloser_linux.go diff --git a/readwritecloser_darwin.go b/readwritecloser_darwin.go new file mode 100644 index 0000000..a78ae3c --- /dev/null +++ b/readwritecloser_darwin.go @@ -0,0 +1,10 @@ +package can + +import ( + "fmt" + "net" +) + +func NewReadWriteCloserForInterface(i *net.Interface) (ReadWriteCloser, error) { + return nil, fmt.Errorf("Binding to can interface no supported on Darwin") +} diff --git a/readwritecloser_linux.go b/readwritecloser_linux.go new file mode 100644 index 0000000..3dd88a8 --- /dev/null +++ b/readwritecloser_linux.go @@ -0,0 +1,21 @@ +package can + +import ( + "fmt" + "golang.org/x/sys/unix" + "net" + "os" + "syscall" +) + +func NewReadWriteCloserForInterface(i *net.Interface) (ReadWriteCloser, error) { + s, _ := syscall.Socket(syscall.AF_CAN, syscall.SOCK_RAW, unix.CAN_RAW) + addr := &unix.SockaddrCAN{Ifindex: i.Index} + if err := unix.Bind(s, addr); err != nil { + return nil, err + } + + f := os.NewFile(uintptr(s), fmt.Sprintf("fd %d", s)) + + return &readWriteCloser{f}, nil +} From 4f952b2be6e394b8d313da45ac11f55fc01640ac Mon Sep 17 00:00:00 2001 From: Matthias Hochgatterer Date: Sat, 15 Dec 2018 13:51:08 +0100 Subject: [PATCH 3/4] Update makefile --- Makefile | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 4224663..36eef5f 100644 --- a/Makefile +++ b/Makefile @@ -4,24 +4,22 @@ GOCLEAN=$(GOCMD) clean GOTEST=$(GOCMD) test GOGET=$(GOCMD) get -BINARY_NAME=candump VERSION=$(shell git describe --exact-match --tags 2>/dev/null) BUILD_DIR=build -BUILD_SRC=cmd/candump.go +PACKAGE_RPI=candump-$(VERSION)_linux_armhf -all: test build -build: - $(GOBUILD) -o $(BUILD_DIR)/$(BINARY_NAME) -i $(BUILD_SRC) +# unset GOPATH to us Go modules +unexport GOPATH test: $(GOTEST) -v ./... clean: $(GOCLEAN) - rm -rf $(BINARY_NAME) + rm -rf $(BUILD_DIR) package-rpi: build-rpi - tar -cvzf $(BINARY_NAME)-$(VERSION)_linux_armhf.tar.gz -C $(BUILD_DIR) $(BINARY_NAME) + tar -cvzf $(PACKAGE_RPI).tar.gz -C $(BUILD_DIR) $(PACKAGE_RPI) build-rpi: - GOOS=linux GOARCH=arm GOARM=6 $(GOBUILD) -o $(BUILD_DIR)/$(BINARY_NAME) -i $(BUILD_SRC) \ No newline at end of file + GOOS=linux GOARCH=arm GOARM=6 $(GOBUILD) -o $(BUILD_DIR)/$(PACKAGE_RPI)/usr/bin/candump -i cmd/candump.go \ No newline at end of file From 3278841f7363dd6e2210c006e94b9f4b000826a3 Mon Sep 17 00:00:00 2001 From: Matthias Hochgatterer Date: Sat, 15 Dec 2018 13:51:24 +0100 Subject: [PATCH 4/4] Add Go modules support --- go.mod | 3 +++ go.sum | 2 ++ 2 files changed, 5 insertions(+) create mode 100644 go.mod create mode 100644 go.sum diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..d8c25a8 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module github.com/brutella/can + +require golang.org/x/sys v0.0.0-20181213200352-4d1cda033e06 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..e5b9e5a --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +golang.org/x/sys v0.0.0-20181213200352-4d1cda033e06 h1:0oC8rFnE+74kEmuHZ46F6KHsMr5Gx2gUQPuNz28iQZM= +golang.org/x/sys v0.0.0-20181213200352-4d1cda033e06/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=