From dd03756f07c5e027f5a4a28ca384fcbed3544916 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Sun, 9 Feb 2014 19:55:36 -0800 Subject: [PATCH] netutil: add little AwaitReachable func Change-Id: I52af3add776cd57ca91c073e0ec563c50923d40f --- pkg/netutil/netutil.go | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 pkg/netutil/netutil.go diff --git a/pkg/netutil/netutil.go b/pkg/netutil/netutil.go new file mode 100644 index 000000000..5916ff7fb --- /dev/null +++ b/pkg/netutil/netutil.go @@ -0,0 +1,38 @@ +/* +Copyright 2014 The Camlistore Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package netutil + +import ( + "errors" + "net" + "time" +) + +// AwaitReachable tries to make a TCP connection to addr regularly. +// It returns an error if it's unable to make a connection before maxWait. +func AwaitReachable(addr string, maxWait time.Duration) error { + done := time.Now().Add(maxWait) + for time.Now().Before(done) { + c, err := net.Dial("tcp", addr) + if err == nil { + c.Close() + return nil + } + time.Sleep(100 * time.Millisecond) + } + return errors.New("timeout") +}