From 81ebc234678af08692aad7f3c2d1128f6c2f75c4 Mon Sep 17 00:00:00 2001 From: EuAndreh Date: Thu, 8 Aug 2024 18:48:25 -0300 Subject: Makefile: Use "go tool {compile,link}" over "go {build,test}" --- .gitignore | 3 ++ Makefile | 65 ++++++++++++++++++-------- src/binder.go | 133 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/cmd/main.go | 7 --- src/lib.go | 133 ------------------------------------------------------ src/main.go | 7 +++ tests/binder.go | 21 +++++++++ tests/lib_test.go | 24 ---------- tests/main.go | 7 +++ 9 files changed, 218 insertions(+), 182 deletions(-) create mode 100644 src/binder.go delete mode 100644 src/cmd/main.go delete mode 100644 src/lib.go create mode 100644 src/main.go create mode 100644 tests/binder.go delete mode 100644 tests/lib_test.go create mode 100644 tests/main.go diff --git a/.gitignore b/.gitignore index 85a298a..75d542a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ /*.bin +/src/*.a +/src/*.bin +/tests/*.a /tests/*.bin diff --git a/Makefile b/Makefile index 17bcd03..38ec6d9 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,7 @@ LANGUAGES = en PREFIX = /usr BINDIR = $(PREFIX)/bin LIBDIR = $(PREFIX)/lib +GOLIBDIR = $(LIBDIR)/go INCLUDEDIR = $(PREFIX)/include SRCDIR = $(PREFIX)/src/$(NAME) SHAREDIR = $(PREFIX)/share @@ -17,12 +18,11 @@ EXEC = ./ ## Where to store the installation. Empty by default. DESTDIR = LDLIBS = -GOFLAGS = .SUFFIXES: -.SUFFIXES: .go .bin +.SUFFIXES: .go .a .bin .bin-check @@ -30,14 +30,22 @@ all: include deps.mk +objects = \ + src/$(NAME).a \ + src/main.a \ + tests/$(NAME).a \ + tests/main.a \ + sources = \ - src/lib.go \ - src/cmd/main.go \ + src/$(NAME).go \ + src/main.go \ derived-assets = \ + $(objects) \ + src/main.bin \ + tests/main.bin \ $(NAME).bin \ - tests/lib_test.bin \ side-assets = \ glaze.socket \ @@ -49,16 +57,37 @@ side-assets = \ all: $(derived-assets) -$(NAME).bin: src/lib.go src/cmd/main.go Makefile - go build $(GOFLAGS) -v -o $@ src/cmd/main.go +$(objects): Makefile + +src/$(NAME).a: src/$(NAME).go + go tool compile $(GOCFLAGS) -o $@ -p $(*F) $*.go + +tests/$(NAME).a: tests/$(NAME).go src/$(NAME).go + go tool compile $(GOCFLAGS) -o $@ -p $(*F) $*.go src/$(NAME).go + +src/main.a: src/main.go src/$(NAME).a +tests/main.a: tests/main.go tests/$(NAME).a +src/main.a tests/main.a: + go tool compile $(GOCFLAGS) -o $@ -I $(@D) $*.go + +src/main.bin: src/main.a +tests/main.bin: tests/main.a +src/main.bin tests/main.bin: + go tool link $(GOLDFLAGS) -o $@ -L $(@D) $*.a + +$(NAME).bin: src/main.bin + ln -fs $? $@ + -tests/lib_test.bin: src/lib.go tests/lib_test.go Makefile - go test $(GOFLAGS) -v -o $@ -c $*.go +tests.bin-check = \ + tests/main.bin-check +$(tests.bin-check): tests/main.bin +$(tests.bin-check): + $(EXEC)$*.bin -check-unit: tests/lib_test.bin - ./tests/lib_test.bin +check-unit: $(tests.bin-check) integration-tests = \ @@ -91,21 +120,21 @@ clean: install: all mkdir -p \ '$(DESTDIR)$(BINDIR)' \ + '$(DESTDIR)$(GOLIBDIR)' \ + '$(DESTDIR)$(SRCDIR)' \ cp $(NAME).bin '$(DESTDIR)$(BINDIR)'/$(NAME) - for f in $(sources); do \ - dir='$(DESTDIR)$(SRCDIR)'/"`dirname "$${f#src/}"`"; \ - mkdir -p "$$dir"; \ - cp -P "$$f" "$$dir"; \ - done + cp src/$(NAME).a '$(DESTDIR)$(GOLIBDIR)' + cp $(sources) '$(DESTDIR)$(SRCDIR)' ## Uninstalls from $(DESTDIR)$(PREFIX). This is a perfect mirror ## of the "install" target, and removes *all* that was installed. ## A dedicated test asserts that this is always true. uninstall: rm -rf \ - '$(DESTDIR)$(BINDIR)'/$(NAME) \ - '$(DESTDIR)$(SRCDIR)' \ + '$(DESTDIR)$(BINDIR)'/$(NAME) \ + '$(DESTDIR)$(GOLIBDIR)'/$(NAME).a \ + '$(DESTDIR)$(SRCDIR)' \ diff --git a/src/binder.go b/src/binder.go new file mode 100644 index 0000000..8950c29 --- /dev/null +++ b/src/binder.go @@ -0,0 +1,133 @@ +package binder + +import ( + "fmt" + "net" + "os" + "os/user" + "strconv" + "syscall" + + g "gobang" +) + + + +type CLIArgs struct { + FromAddr string + ToAddr string +} + + + +const USER = "nobody" + + + +var EmitActiveConnection = g.MakeGauge("active-connections") + + + +func dropPrivileges(username string) { + g.Info("Dropping privileges", "drop-root-init") + + user, err := user.Lookup(username) + g.FatalIf(err) + + gid, err := strconv.Atoi(user.Gid) + g.FatalIf(err) + + uid, err := strconv.Atoi(user.Uid) + g.FatalIf(err) + + err = syscall.Setgid(gid) + g.FatalIf(err) + + err = syscall.Setgroups([]int{}) + g.FatalIf(err) + + err = syscall.Setuid(uid) + g.FatalIf(err) + + g.Info("Privileges dropped", "drop-root-end") +} + +func isRunningAsRoot() bool { + return os.Geteuid() == 0 +} + +func ParseArgs(args []string) CLIArgs { + if len(args) != 3 { + fmt.Fprintf( + os.Stderr, + "Usage: %s FROM-ADDRESS TO-ADDRESS\n", + args[0], + ) + os.Exit(2) + } + return CLIArgs { + FromAddr: args[1], + ToAddr: args[2], + } +} + +func Listen(fromAddr string) net.Listener { + listener, err := net.Listen("tcp", fromAddr) + g.FatalIf(err) + g.Info("Started listening", "listen-start", "from-address", fromAddr) + return listener +} + +func DropRoot() { + if isRunningAsRoot() { + dropPrivileges(USER) + if isRunningAsRoot() { + panic("Failed to drop privileges") + } + } +} + +func Start(toAddr string, listener net.Listener) { + for { + connFrom, err := listener.Accept() + if err != nil { + g.Warning( + "Error accepting connection", + "accept-connection-error", + "err", err, + ) + continue + } + defer connFrom.Close() + EmitActiveConnection.Inc() + + connTo, err := net.Dial("unix", toAddr) + if err != nil { + g.Warning( + "Error dialing connection", + "dial-connection-error", + "err", err, + ) + connFrom.Close() + continue + } + defer connTo.Close() + + c := make(chan g.CopyResult) + go g.CopyData(c, "c2s", connFrom, connTo) + go g.CopyData(c, "s2c", connTo, connFrom) + go func() { + <- c + EmitActiveConnection.Dec() + }() + } +} + + +func Main() { + g.Init() + args := ParseArgs(os.Args) + listener := Listen(args.FromAddr) + DropRoot() + Start(args.ToAddr, listener) +} diff --git a/src/cmd/main.go b/src/cmd/main.go deleted file mode 100644 index d9c8379..0000000 --- a/src/cmd/main.go +++ /dev/null @@ -1,7 +0,0 @@ -package main - -import "euandre.org/binder/src" - -func main() { - binder.Main() -} diff --git a/src/lib.go b/src/lib.go deleted file mode 100644 index 4ece950..0000000 --- a/src/lib.go +++ /dev/null @@ -1,133 +0,0 @@ -package binder - -import ( - "fmt" - "net" - "os" - "os/user" - "strconv" - "syscall" - - g "euandre.org/gobang/src" -) - - - -type CLIArgs struct { - FromAddr string - ToAddr string -} - - - -const USER = "nobody" - - - -var EmitActiveConnection = g.MakeGauge("active-connections") - - - -func dropPrivileges(username string) { - g.Info("Dropping privileges", "drop-root-init") - - user, err := user.Lookup(username) - g.FatalIf(err) - - gid, err := strconv.Atoi(user.Gid) - g.FatalIf(err) - - uid, err := strconv.Atoi(user.Uid) - g.FatalIf(err) - - err = syscall.Setgid(gid) - g.FatalIf(err) - - err = syscall.Setgroups([]int{}) - g.FatalIf(err) - - err = syscall.Setuid(uid) - g.FatalIf(err) - - g.Info("Privileges dropped", "drop-root-end") -} - -func isRunningAsRoot() bool { - return os.Geteuid() == 0 -} - -func ParseArgs(args []string) CLIArgs { - if len(args) != 3 { - fmt.Fprintf( - os.Stderr, - "Usage: %s FROM-ADDRESS TO-ADDRESS\n", - args[0], - ) - os.Exit(2) - } - return CLIArgs { - FromAddr: args[1], - ToAddr: args[2], - } -} - -func Listen(fromAddr string) net.Listener { - listener, err := net.Listen("tcp", fromAddr) - g.FatalIf(err) - g.Info("Started listening", "listen-start", "from-address", fromAddr) - return listener -} - -func DropRoot() { - if isRunningAsRoot() { - dropPrivileges(USER) - if isRunningAsRoot() { - panic("Failed to drop privileges") - } - } -} - -func Start(toAddr string, listener net.Listener) { - for { - connFrom, err := listener.Accept() - if err != nil { - g.Warning( - "Error accepting connection", - "accept-connection-error", - "err", err, - ) - continue - } - defer connFrom.Close() - EmitActiveConnection.Inc() - - connTo, err := net.Dial("unix", toAddr) - if err != nil { - g.Warning( - "Error dialing connection", - "dial-connection-error", - "err", err, - ) - connFrom.Close() - continue - } - defer connTo.Close() - - c := make(chan g.CopyResult) - go g.CopyData(c, "c2s", connFrom, connTo) - go g.CopyData(c, "s2c", connTo, connFrom) - go func() { - <- c - EmitActiveConnection.Dec() - }() - } -} - - -func Main() { - g.Init() - args := ParseArgs(os.Args) - listener := Listen(args.FromAddr) - DropRoot() - Start(args.ToAddr, listener) -} diff --git a/src/main.go b/src/main.go new file mode 100644 index 0000000..8fb49be --- /dev/null +++ b/src/main.go @@ -0,0 +1,7 @@ +package main + +import "binder" + +func main() { + binder.Main() +} diff --git a/tests/binder.go b/tests/binder.go new file mode 100644 index 0000000..0a1c3b7 --- /dev/null +++ b/tests/binder.go @@ -0,0 +1,21 @@ +package binder + +import ( + g "gobang" +) + + + +func test_ParseArgs() { + given := ParseArgs([]string { "a", "b", "c" }) + expected := CLIArgs { + FromAddr: "b", + ToAddr: "c", + } + + g.AssertEqual(given, expected) +} + +func MainTest() { + test_ParseArgs() +} diff --git a/tests/lib_test.go b/tests/lib_test.go deleted file mode 100644 index 4e63d06..0000000 --- a/tests/lib_test.go +++ /dev/null @@ -1,24 +0,0 @@ -package binder_test - -import ( - "testing" - - g "euandre.org/gobang/src" - - "euandre.org/binder/src" -) - - -func TestPlaceholder(t *testing.T) { - g.AssertEqual(t, binder.USER, "nobody") -} - -func TestParseArgs(t *testing.T) { - given := binder.ParseArgs([]string { "a", "b", "c" }) - expected := binder.CLIArgs { - FromAddr: "b", - ToAddr: "c", - } - - g.AssertEqual(t, given, expected) -} diff --git a/tests/main.go b/tests/main.go new file mode 100644 index 0000000..846bc7e --- /dev/null +++ b/tests/main.go @@ -0,0 +1,7 @@ +package main + +import "binder" + +func main() { + binder.MainTest() +} -- cgit v1.2.3