summaryrefslogtreecommitdiff
path: root/pkg/auth/sip2/telnet.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/auth/sip2/telnet.go')
-rw-r--r--pkg/auth/sip2/telnet.go58
1 files changed, 51 insertions, 7 deletions
diff --git a/pkg/auth/sip2/telnet.go b/pkg/auth/sip2/telnet.go
index 7d8c4fa..469f980 100644
--- a/pkg/auth/sip2/telnet.go
+++ b/pkg/auth/sip2/telnet.go
@@ -16,7 +16,12 @@
package sip2
import (
- "github.com/reiver/go-telnet"
+ //"github.com/reiver/go-telnet"
+ /* TODO this one exposes DialTimeout */
+ "github.com/linxiaozhi/go-telnet"
+ "log"
+ "net"
+ "time"
)
// The terminator can be configured differently for different SIP endpoints.
@@ -24,16 +29,29 @@ import (
var telnetTerminator string
-func telnetRead(conn *telnet.Conn) (out string) {
+var telnetTimeout string = "2000ms"
+
+func telnetRead(conn gote.Connection) (string, error) {
var buffer [1]byte
recvData := buffer[:]
var n int
var err error
+ var out string
for {
+ setDeadline(conn)
n, err = conn.Read(recvData)
if n <= 0 || err != nil {
- break
+ if netErr, ok := err.(net.Error); ok && netErr.Timeout() {
+ log.Println("telnet: read timeout:", err)
+ return "", err
+ } else {
+ // some other error, do something else, for example create new conn
+ /* TODO -- should modify attributes of the error, or raise a non-recoverable one */
+ /* ie, broken pipe errors will not be solved by retries */
+ log.Println("telnet: read error:", err)
+ return "", err
+ }
} else {
out += string(recvData)
}
@@ -41,11 +59,14 @@ func telnetRead(conn *telnet.Conn) (out string) {
break
}
}
- return out
+ return out, nil
}
-func telnetSend(conn *telnet.Conn, command string) {
+func telnetSend(conn gote.Connection, command string) error {
var commandBuffer []byte
+
+ setDeadline(conn)
+
for _, char := range command {
commandBuffer = append(commandBuffer, byte(char))
}
@@ -53,6 +74,29 @@ func telnetSend(conn *telnet.Conn, command string) {
var crlfBuffer [2]byte = [2]byte{'\r', '\n'}
crlf := crlfBuffer[:]
- conn.Write(commandBuffer)
- conn.Write(crlf)
+ _, err := conn.Write(commandBuffer)
+ if err != nil {
+ return err
+ }
+
+ _, err = conn.Write(crlf)
+ if err != nil {
+ return err
+ }
+ return nil
+}
+
+func setDeadline(conn gote.Connection) error {
+ /* TODO do we need to set deadline explicitely here? */
+ t, err := time.ParseDuration(telnetTimeout)
+ if err != nil {
+ log.Println("telnet: error parsing duration")
+ return err
+ }
+ err = conn.SetDeadline(time.Now().Add(t * time.Second))
+ if err != nil {
+ log.Println("telnet: error setting deadline")
+ return err
+ }
+ return nil
}