Skip to content
This repository was archived by the owner on Jul 8, 2020. It is now read-only.

Commit fa63b56

Browse files
committed
Merge pull request #4 from mechmind/shutdown
Add ability to shut down a server
2 parents 50f9855 + ac139b5 commit fa63b56

1 file changed

Lines changed: 15 additions & 3 deletions

File tree

server.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ type Server struct {
5353
listenTo string
5454
driverFactory DriverFactory
5555
logger *Logger
56+
listener net.Listener
5657
}
5758

5859
// serverOptsWithDefaults copies an ServerOpts struct into a new struct,
@@ -191,15 +192,17 @@ func (Server *Server) ListenAndServe() error {
191192

192193
Server.logger.Printf("%s listening on %d", Server.Name, Server.Port)
193194

195+
Server.listener = listener
194196
for {
195-
tcpConn, err := listener.Accept()
197+
tcpConn, err := Server.listener.Accept()
196198
if err != nil {
197-
Server.logger.Print("listening error")
199+
Server.logger.Printf("listening error: %v", err)
198200
break
199201
}
200202
driver, err := Server.driverFactory.NewDriver()
201203
if err != nil {
202-
Server.logger.Print("Error creating driver, aborting client connection")
204+
Server.logger.Printf("Error creating driver, aborting client connection: %v", err)
205+
tcpConn.Close()
203206
} else {
204207
ftpConn := Server.newConn(tcpConn, driver, Server.Auth)
205208
go ftpConn.Serve()
@@ -208,6 +211,15 @@ func (Server *Server) ListenAndServe() error {
208211
return nil
209212
}
210213

214+
// Gracefully stops a server. Already connected clients will retain their connections
215+
func (Server *Server) Shutdown() error {
216+
if Server.listener != nil {
217+
return Server.listener.Close()
218+
}
219+
// server wasnt even started
220+
return nil
221+
}
222+
211223
func buildTcpString(hostname string, port int) (result string) {
212224
if strings.Contains(hostname, ":") {
213225
// ipv6

0 commit comments

Comments
 (0)