summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS3
-rw-r--r--doc/index.html2
-rw-r--r--doc/s6-tai64ndiff.html60
-rw-r--r--doc/upgrade.html4
-rw-r--r--package/deps.mak3
-rw-r--r--package/info2
-rw-r--r--package/modes1
-rw-r--r--package/targets.mak1
-rw-r--r--src/skaembutils/deps-exe/s6-tai64ndiff1
-rw-r--r--src/skaembutils/s6-tai64ndiff.c74
10 files changed, 146 insertions, 5 deletions
diff --git a/NEWS b/NEWS
index 2fafcb3..e5ed5c9 100644
--- a/NEWS
+++ b/NEWS
@@ -1,11 +1,12 @@
Changelog for s6-portable-utils.
-In 2.2.2.5
+In 2.2.3.0
----------
- Bugfixes that have nothing to do with 2.2.2.4 but that
were reported *right after* 2.2.2.4 was released, because
things do be like that
+ - New binary: s6-tai64ndiff
In 2.2.2.4
diff --git a/doc/index.html b/doc/index.html
index 157400a..f191c4f 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -77,7 +77,7 @@ library. </li>
<ul>
<li> The current released version of s6-portable-utils is
-<a href="s6-portable-utils-2.2.2.5.tar.gz">2.2.2.5</a>. </li>
+<a href="s6-portable-utils-2.2.3.0.tar.gz">2.2.3.0</a>. </li>
<li> Alternatively, you can checkout a copy of the
<a href="//git.skarnet.org/cgi-bin/cgit.cgi/s6-portable-utils/">s6-portable-utils
git repository</a>:
diff --git a/doc/s6-tai64ndiff.html b/doc/s6-tai64ndiff.html
new file mode 100644
index 0000000..c1f0440
--- /dev/null
+++ b/doc/s6-tai64ndiff.html
@@ -0,0 +1,60 @@
+<html>
+ <head>
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <meta http-equiv="Content-Language" content="en" />
+ <title>s6-portable-utils: the s6-tai64ndiff program</title>
+ <meta name="Description" content="s6-portable-utils: the s6-tai64ndiff program" />
+ <meta name="Keywords" content="s6 command s6-tai64ndiff filter timestamp TAI64 TAI64N diff time difference log line" />
+ <!-- <link rel="stylesheet" type="text/css" href="//skarnet.org/default.css" /> -->
+ </head>
+<body>
+
+<p>
+<a href="index.html">s6-portable-utils</a><br />
+<a href="//skarnet.org/software/">Software</a><br />
+<a href="//skarnet.org/">skarnet.org</a>
+</p>
+
+<h1> The s6-tai64ndiff program </h1>
+
+<p>
+s6-tai64ndiff acts as a filter, reading from stdin and writing to stdout.
+It expects every line of its input to begin with a
+<a href="//skarnet.org/software/skalibs/libstddjb/tai.html#timestamp">TAI64N
+timestamp</a>. It replaces this timestamp with a prefix showing the time
+difference between this line and the previous line.
+</p>
+
+<h2> Interface </h2>
+
+<pre>
+ s6-tai64ndiff
+</pre>
+
+<ul>
+ <li> s6-tai64ndiff exits 0 when it sees the end of stdin. If there's an
+unfinished line, s6-tai64ndiff processes it and writes it before exiting. </li>
+ <li> The prefix it prints is of the form <tt>[ <em>seconds</em>.<em>microseconds</em> ]</tt>,
+in decimal. It can be interpreted as a fixed-point decimal number of seconds that
+elapsed between the timestamp on the previous line and the timestamp on the
+current line. </li>
+ <li> If the difference isn't defined, <em>seconds</em> and <em>microseconds</em>
+are just whitespace. The difference is not defined on the first line of stdin or
+on non-timestamped lines. Following non-timestamped lines, the difference may not
+be accurate. </li>
+</ul>
+
+<h2> Notes </h2>
+
+<ul>
+ <li> The typical use case of s6-tai64ndiff is to read files that have
+been filtered through <a href="s6-tai64n.html">s6-tai64n</a>, or log files
+that have been produced by <a href="s6-log.html">s6-log</a> with the <tt>t</tt>
+directive. </li>
+ <li> The difference is a signed number. Negative numbers probably indicate
+a backwards clock jump, which is a bad thing to have on a system. </li>
+</ul>
+
+</body>
+</html>
diff --git a/doc/upgrade.html b/doc/upgrade.html
index 270cea5..9600316 100644
--- a/doc/upgrade.html
+++ b/doc/upgrade.html
@@ -18,10 +18,10 @@
<h1> What has changed in s6-portable-utils </h1>
-<h2> in 2.2.2.5 </h2>
+<h2> in 2.2.3.0 </h2>
<ul>
- <li> Bugfix release, no changes. </li>
+ <li> New binary: <a href="s6-tai64ndiff.html">s6-tai64ndiff</a>. </li>
</ul>
<h2> in 2.2.2.4 </h2>
diff --git a/package/deps.mak b/package/deps.mak
index da2b80a..b7f08df 100644
--- a/package/deps.mak
+++ b/package/deps.mak
@@ -36,6 +36,7 @@ src/skaembutils/s6-seq.o src/skaembutils/s6-seq.lo: src/skaembutils/s6-seq.c
src/skaembutils/s6-sleep.o src/skaembutils/s6-sleep.lo: src/skaembutils/s6-sleep.c
src/skaembutils/s6-sort.o src/skaembutils/s6-sort.lo: src/skaembutils/s6-sort.c
src/skaembutils/s6-sync.o src/skaembutils/s6-sync.lo: src/skaembutils/s6-sync.c
+src/skaembutils/s6-tai64ndiff.o src/skaembutils/s6-tai64ndiff.lo: src/skaembutils/s6-tai64ndiff.c
src/skaembutils/s6-tail.o src/skaembutils/s6-tail.lo: src/skaembutils/s6-tail.c
src/skaembutils/s6-test.o src/skaembutils/s6-test.lo: src/skaembutils/s6-test.c
src/skaembutils/s6-touch.o src/skaembutils/s6-touch.lo: src/skaembutils/s6-touch.c
@@ -114,6 +115,8 @@ s6-sort: EXTRA_LIBS := -lskarnet
s6-sort: src/skaembutils/s6-sort.o
s6-sync: EXTRA_LIBS :=
s6-sync: src/skaembutils/s6-sync.o
+s6-tai64ndiff: EXTRA_LIBS := -lskarnet
+s6-tai64ndiff: src/skaembutils/s6-tai64ndiff.o
s6-tail: EXTRA_LIBS := -lskarnet
s6-tail: src/skaembutils/s6-tail.o
s6-test: EXTRA_LIBS := -lskarnet
diff --git a/package/info b/package/info
index 259da96..07da201 100644
--- a/package/info
+++ b/package/info
@@ -1,4 +1,4 @@
package=s6-portable-utils
-version=2.2.2.5
+version=2.2.3.0
category=admin
package_macro_name=S6_PORTABLE_UTILS
diff --git a/package/modes b/package/modes
index a14e4bc..6dfaf11 100644
--- a/package/modes
+++ b/package/modes
@@ -32,6 +32,7 @@ s6-seq 0755
s6-sleep 0755
s6-sort 0755
s6-sync 0755
+s6-tai64ndiff 0755
s6-tail 0755
s6-test 0755
s6-touch 0755
diff --git a/package/targets.mak b/package/targets.mak
index 8a56b39..6a413b7 100644
--- a/package/targets.mak
+++ b/package/targets.mak
@@ -33,6 +33,7 @@ s6-seq \
s6-sleep \
s6-sort \
s6-sync \
+s6-tai64ndiff \
s6-tail \
s6-test \
s6-touch \
diff --git a/src/skaembutils/deps-exe/s6-tai64ndiff b/src/skaembutils/deps-exe/s6-tai64ndiff
new file mode 100644
index 0000000..e7187fe
--- /dev/null
+++ b/src/skaembutils/deps-exe/s6-tai64ndiff
@@ -0,0 +1 @@
+-lskarnet
diff --git a/src/skaembutils/s6-tai64ndiff.c b/src/skaembutils/s6-tai64ndiff.c
new file mode 100644
index 0000000..25abea3
--- /dev/null
+++ b/src/skaembutils/s6-tai64ndiff.c
@@ -0,0 +1,74 @@
+/* ISC license. */
+
+#include <stdint.h>
+#include <string.h>
+#include <errno.h>
+
+#include <skalibs/uint32.h>
+#include <skalibs/uint64.h>
+#include <skalibs/buffer.h>
+#include <skalibs/strerr2.h>
+#include <skalibs/tai.h>
+#include <skalibs/stralloc.h>
+#include <skalibs/skamisc.h>
+
+int main (int argc, char const *const *argv)
+{
+ stralloc sa = STRALLOC_ZERO ;
+ tain_t prev ;
+ int defined = 0 ;
+ PROG = "s6-tai64ndiff" ;
+
+ for (;;)
+ {
+ unsigned int p = 0 ;
+ char prefix[23] = "[ . ]" ;
+ int r = skagetln(buffer_0f1, &sa, '\n') ;
+ if (r == -1)
+ if (errno != EPIPE)
+ strerr_diefu1sys(111, "read from stdin") ;
+ else r = 1 ;
+ else if (!r) break ;
+ if (sa.len > TIMESTAMP)
+ {
+ tain_t cur ;
+ p = timestamp_scan(sa.s, &cur) ;
+ if (p)
+ {
+ if (defined)
+ {
+ tain_t diff ;
+ int64_t secs ;
+ size_t len ;
+ tain_sub(&diff, &cur, &prev) ;
+ secs = tai_sec(tain_secp(&diff)) ;
+ len = int64_fmt(0, secs) ;
+ if (len > 10)
+ {
+ char fmtn[9] ;
+ size_t m = 1 + (len < 20) ;
+ m += int64_fmt(prefix + m, secs) ;
+ prefix[m++] = '.' ;
+ uint320_fmt(fmtn, tain_nano(&diff), 9) ;
+ memcpy(prefix + m, fmtn, 22 - m) ;
+ }
+ else
+ {
+ int64_fmt(prefix + 11 - len, secs) ;
+ uint320_fmt(prefix + 12, tain_nano(&diff), 9) ;
+ }
+ }
+ prev = cur ;
+ defined = 1 ;
+ if (buffer_put(buffer_1, prefix, 23) < 23)
+ strerr_diefu1sys(111, "write to stdout") ;
+ }
+ else defined = 0 ;
+ }
+ else defined = 0 ;
+ if (buffer_put(buffer_1, sa.s + p, sa.len - p) < (ssize_t)(sa.len - p))
+ strerr_diefu1sys(111, "write to stdout") ;
+ sa.len = 0 ;
+ }
+ return 0 ;
+}