* Discern temporary network errors and don't treat those as fatal.
authorUrban Wallasch <urban.wallasch@freenet.de>
Wed, 10 Apr 2019 17:01:04 +0000 (19:01 +0200)
committerUrban Wallasch <urban.wallasch@freenet.de>
Wed, 10 Apr 2019 17:01:04 +0000 (19:01 +0200)
gogopherd.go
logger.go

index e400a97e89ddfd26033e23d5b1401437965bf0ad..4cf1c288fd835e6c6aa6c5a3b0021701f5f13ef1 100644 (file)
@@ -248,14 +248,17 @@ func handleRequest(conn net.Conn) {
 }
 
 func serveTCP(listener *net.TCPListener) {
+       defer listener.Close()
+       logger.Print("listening on TCP ", listener.Addr())
        for {
                conn, err := listener.AcceptTCP()
                if shutting_down {
                        return
                }
-               checkFatal(err, "Accept")
-               logger.Print("connect from ", conn.RemoteAddr())
-               go handleRequest(conn)
+               if checkFatal(err, "Accept") == nil {
+                       logger.Print("connect from ", conn.RemoteAddr())
+                       go handleRequest(conn)
+               }
        }
 }
 
@@ -268,14 +271,13 @@ func main() {
        checkFatal(err, "ResolveTCPAddr")
        listener, err := net.ListenTCP("tcp", address)
        checkFatal(err, "ListenTCP")
-       logger.Print("listening on TCP ", address)
        go serveTCP(listener)
 
        // wait for signal
        sigchan := make(chan os.Signal)
        signal.Notify(sigchan, syscall.SIGINT, syscall.SIGTERM)
        sig := <-sigchan
-       tracer.Print("Received signal: ", sig)
+       logger.Print("shutdown on signal: ", sig)
        shutting_down = true
        tracer.Print("Bye.")
 }
index 9b6dbcacecc563565e849e578d56e90e8051359e..c5a896b2cdca07882e8c008e0ed4db86849517f5 100644 (file)
--- a/logger.go
+++ b/logger.go
@@ -11,6 +11,7 @@ package main
 import (
        "io/ioutil"
        "log"
+       "net"
        "os"
        "path/filepath"
        "runtime"
@@ -43,11 +44,17 @@ func initLogger(verbose bool, logfilename string) {
        }
 }
 
-func checkFatal(err error, msg string) {
+func checkFatal(err error, msg string) error {
        if err != nil {
                _, file, line, _ := runtime.Caller(1)
-               loggex.Fatalf("%s:%d: %s %v\n", filepath.Base(file), line, msg, err)
+               if ne, ok := err.(net.Error); ok && ne.Temporary() {
+                       // this a temporary error so we should sleep and retry
+                       loggex.Printf("%s:%d: %s %v\n", filepath.Base(file), line, msg, err)
+               } else {
+                       loggex.Fatalf("%s:%d: %s %v\n", filepath.Base(file), line, msg, err)
+               }
        }
+       return err
 }
 
 func check(err error, msg string) error {