aboutsummaryrefslogtreecommitdiff
path: root/cmd/receivepack9418/run.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/receivepack9418/run.go')
-rw-r--r--cmd/receivepack9418/run.go64
1 files changed, 64 insertions, 0 deletions
diff --git a/cmd/receivepack9418/run.go b/cmd/receivepack9418/run.go
new file mode 100644
index 00000000..3c806e80
--- /dev/null
+++ b/cmd/receivepack9418/run.go
@@ -0,0 +1,64 @@
+package main
+
+import (
+ "errors"
+ "fmt"
+ "log"
+ "net"
+ "os"
+
+ "codeberg.org/lindenii/furgit/repository"
+)
+
+func run(listenAddr, repoPath string) error {
+ repoRoot, err := os.OpenRoot(repoPath)
+ if err != nil {
+ return fmt.Errorf("open repo root: %w", err)
+ }
+ defer func() { _ = repoRoot.Close() }()
+
+ repo, err := repository.Open(repoRoot)
+ if err != nil {
+ return fmt.Errorf("open repository: %w", err)
+ }
+ defer func() { _ = repo.Close() }()
+
+ objectsRoot, err := repoRoot.OpenRoot("objects")
+ if err != nil {
+ return fmt.Errorf("open objects root: %w", err)
+ }
+ defer func() { _ = objectsRoot.Close() }()
+
+ srv := &server{
+ repo: repo,
+ objectsRoot: objectsRoot,
+ }
+
+ ln, err := net.Listen("tcp", listenAddr)
+ if err != nil {
+ return fmt.Errorf("listen %q: %w", listenAddr, err)
+ }
+ defer func() { _ = ln.Close() }()
+
+ log.Printf("receivepack9418: listening on %s", listenAddr)
+ log.Printf("receivepack9418: repository=%s algorithm=%s", repoPath, repo.Algorithm())
+
+ for {
+ conn, err := ln.Accept()
+ if err != nil {
+ if errors.Is(err, net.ErrClosed) {
+ return nil
+ }
+
+ var nerr net.Error
+ if errors.As(err, &nerr) && nerr.Temporary() {
+ log.Printf("receivepack9418: temporary accept error: %v", err)
+ continue
+ }
+
+ return fmt.Errorf("accept: %w", err)
+ }
+
+ go srv.handleConn(conn)
+ }
+}