go.mod | 1 + go.sum | 2 ++ run.go | 8 ++++---- tai64n.go | 30 +++--------------------------- diff --git a/go.mod b/go.mod index 38e317a9cd1019f8aca1e55f8725129757b05ec9547a211ad14a530f5c1b999a..a077e0bad2b77b93b9e5dbc204cb57d921498ba01849fd6bd3114da1bb25fe30 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.14 require ( go.cypherpunks.ru/recfile v0.3.0 + go.cypherpunks.ru/tai64n v0.1.0 golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9 golang.org/x/sys v0.0.0-20201117222635-ba5294a509c7 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221 diff --git a/go.sum b/go.sum index 4b3078d5dbeba18eb6ab518a53669cf0e28d89f1238e51164af9a14016aaa120..20116d4d10aefad46805aafab5bd2e07fd11f3d3f9ca232e47473111b52716c4 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ go.cypherpunks.ru/recfile v0.3.0 h1:aZRMMst8hoNOIhGjCA/VxjTN5VBSEN4W4zyhWF/7xSU= go.cypherpunks.ru/recfile v0.3.0/go.mod h1:p1ZUMeyQQbQg+ICtKH3+Zt59QLI0tCZYZj/75Vp1buk= +go.cypherpunks.ru/tai64n v0.1.0 h1:XT1ys6lbo4/bjDQpMA8Xu5TCx6Y6aAYYYn5G0quE8sk= +go.cypherpunks.ru/tai64n v0.1.0/go.mod h1:mjuUq/ZQAOEKvzAAl25RIrN6JExWA4fRkOs7o7OVvYE= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9 h1:phUcVbl53swtrUN8kQEXFhUxPlIlWyBfKmidCu7P95o= golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= diff --git a/run.go b/run.go index 065aadc8f5cb3c0e906eb13d797dc9c6a7729098d4e1e62146a69019447021f5..6b6740ad0f55fe1a0eca7946fff3b5a4c90227a456ea03fea03fdda067e5d5e9 100644 --- a/run.go +++ b/run.go @@ -21,7 +21,6 @@ package main import ( "bufio" - "encoding/hex" "errors" "flag" "fmt" @@ -35,6 +34,7 @@ "syscall" "time" "go.cypherpunks.ru/recfile" + "go.cypherpunks.ru/tai64n" "golang.org/x/sys/unix" ) @@ -409,7 +409,7 @@ stderrTerm := make(chan struct{}, 0) go func() { scanner := bufio.NewScanner(stderr) var line string - ts := new(TAI64N) + ts := new(tai64n.TAI64N) for scanner.Scan() { line = scanner.Text() if strings.HasPrefix(line, childStderrPrefix) { @@ -418,9 +418,9 @@ os.Stderr.WriteString(StderrPrefix + line + "\n") continue } if fdStderr != nil { - tai64nNow(ts) + tai64n.FromTime(time.Now(), ts) LogMutex.Lock() - fmt.Fprintf(fdStderr, "@%s %s\n", hex.EncodeToString(ts[:]), line) + fmt.Fprintf(fdStderr, "%s %s\n", ts.Encode(), line) LogMutex.Unlock() } if StderrSilent { diff --git a/tai64n.go b/tai64n.go index 3153d9180161facd9be3e15ebf95854c9b2fa766e05c69dca2ba1113ee726e80..c689763dbfd0dca19fd36254dee1234817dc3f0f03b13e81278b2c58cd5646f7 100644 --- a/tai64n.go +++ b/tai64n.go @@ -19,36 +19,18 @@ package main import ( "bufio" - "encoding/binary" - "encoding/hex" - "errors" "io" "strings" "time" -) -const ( - TAI64NSize = 12 - TAI64NBase = 0x400000000000000a - TAI64NLocalFmt = "2006-01-02 15:04:05.000000000" + "go.cypherpunks.ru/tai64n" ) -type TAI64N [TAI64NSize]byte - -func tai64nNow(ts *TAI64N) { - t := time.Now() - binary.BigEndian.PutUint64(ts[:], uint64(TAI64NBase)+uint64(t.Unix())) - binary.BigEndian.PutUint32(ts[8:], uint32(t.Nanosecond())) -} - func tai64nLocal(dst io.StringWriter, src io.Reader) error { scanner := bufio.NewScanner(src) var err error var s string var sep int - var ts []byte - var secs int64 - var nano int64 var t time.Time for { if !scanner.Scan() { @@ -66,17 +48,11 @@ sep = strings.IndexByte(s, byte(' ')) if sep == -1 { dst.WriteString(s + "\n") } - ts, err = hex.DecodeString(s[1:sep]) + t, err = tai64n.Decode(s[1:sep]) if err != nil { return err } - if len(ts) != TAI64NSize { - return errors.New("invalid ts length") - } - secs = int64(binary.BigEndian.Uint64(ts[:8])) - nano = int64(binary.BigEndian.Uint32(ts[8:])) - t = time.Unix(secs-TAI64NBase, nano) - dst.WriteString(t.Format(TAI64NLocalFmt) + s[sep:] + "\n") + dst.WriteString(t.Format(tai64n.LocalFmt) + s[sep:] + "\n") } return nil }