diff options
| author | 2026-03-08 01:56:58 +0800 | |
|---|---|---|
| committer | 2026-03-08 02:00:11 +0800 | |
| commit | 33fda1b8e4da0ad9d4208a8b8249c8d7b305f4ae (patch) | |
| tree | 4028b1362b816703c9df011797f060dc8b8ad0d5 /cmd/receivepack9418/run.go | |
| parent | receivepack: Actually test it (diff) | |
| signature | No signature | |
cmd/receivepack9418: Init
Diffstat (limited to 'cmd/receivepack9418/run.go')
| -rw-r--r-- | cmd/receivepack9418/run.go | 64 |
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) + } +} |
