@@ -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+
211223func buildTcpString (hostname string , port int ) (result string ) {
212224 if strings .Contains (hostname , ":" ) {
213225 // ipv6
0 commit comments