|
|
@@ -10,7 +10,6 @@ import (
|
|
|
"bufio"
|
|
|
"fmt"
|
|
|
"net"
|
|
|
- "regexp"
|
|
|
"strings"
|
|
|
)
|
|
|
|
|
|
@@ -89,7 +88,21 @@ func (b *BIRDClient) exec(cmd string, args ...interface{}) (string, error) {
|
|
|
return b.readResponse()
|
|
|
}
|
|
|
|
|
|
-var respCodeRegex = regexp.MustCompile(`^\d{4}[ -]`)
|
|
|
+// hasResponseCode reports whether the provided byte slice is
|
|
|
+// prefixed with a BIRD response code.
|
|
|
+// Equivalent regex: `^\d{4}[ -]`.
|
|
|
+func hasResponseCode(s []byte) bool {
|
|
|
+ if len(s) < 5 {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ for _, b := range s[:4] {
|
|
|
+ if '0' <= b && b <= '9' {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ return s[4] == ' ' || s[4] == '-'
|
|
|
+}
|
|
|
|
|
|
func (b *BIRDClient) readResponse() (string, error) {
|
|
|
var resp strings.Builder
|
|
|
@@ -105,7 +118,7 @@ func (b *BIRDClient) readResponse() (string, error) {
|
|
|
if _, err := resp.Write(out); err != nil {
|
|
|
return "", err
|
|
|
}
|
|
|
- if respCodeRegex.Match(out) {
|
|
|
+ if hasResponseCode(out) {
|
|
|
done = out[4] == ' '
|
|
|
}
|
|
|
if !done {
|