<html lang='en'>
<head>
<meta content='text/html; charset=utf-8' http-equiv='Content-Type'>
<title>
GitLab
</title>
</meta>
</head>
<style>
  img {
    max-width: 100%;
    height: auto;
  }
  p.details {
    font-style:italic;
    color:#777
  }
  .footer p {
    font-size:small;
    color:#777
  }
  pre.commit-message {
    white-space: pre-wrap;
  }
  .file-stats a {
    text-decoration: none;
  }
  .file-stats .new-file {
    color: #090;
  }
  .file-stats .deleted-file {
    color: #B00;
  }
</style>
<body>
<div class='content'>
<h3>Amar Takhar pushed to branch master at <a href="https://gitlab.com/NTPsec/ntpsec">NTPsec / ntpsec</a></h3>
<h4>
Commits:
</h4>
<ul>
<li>
<strong><a href="https://gitlab.com/NTPsec/ntpsec/commit/390081d5c5fdbee48136cacc47d5703223288ae5">390081d5</a></strong>
<div>
<span>by Amar Takhar</span>
<i>at 2015-12-08T20:20:02Z</i>
</div>
<pre class='commit-message'>Add support for RTEMS trace.

This doesn't work yet.  Chris will help me iron out the issues.</pre>
</li>
</ul>
<h4>9 changed files:</h4>
<ul>
<li class='file-stats'>
<a href='#diff-0'>
<span class='new-file'>
+
devel/trace/ntpsec-ntp-proto.ini
</span>
</a>
</li>
<li class='file-stats'>
<a href='#diff-1'>
<span class='new-file'>
+
devel/trace/ntpsec-ntp-worker.ini
</span>
</a>
</li>
<li class='file-stats'>
<a href='#diff-2'>
<span class='new-file'>
+
devel/trace/ntpsec-trace-log.ini
</span>
</a>
</li>
<li class='file-stats'>
<a href='#diff-3'>
<span class='new-file'>
+
devel/trace/ntpsec-trace.ini
</span>
</a>
</li>
<li class='file-stats'>
<a href='#diff-4'>
<span class='new-file'>
+
devel/trace/ntpsec-work-thread.ini
</span>
</a>
</li>
<li class='file-stats'>
<a href='#diff-5'>
ntpd/wscript
</a>
</li>
<li class='file-stats'>
<a href='#diff-6'>
pylib/configure.py
</a>
</li>
<li class='file-stats'>
<a href='#diff-7'>
<span class='new-file'>
+
pylib/rtems_trace.py
</span>
</a>
</li>
<li class='file-stats'>
<a href='#diff-8'>
wscript
</a>
</li>
</ul>
<h4>Changes:</h4>
<li id='diff-0'>
<a href='https://gitlab.com/NTPsec/ntpsec/commit/390081d5c5fdbee48136cacc47d5703223288ae5#diff-0'>
<strong>
devel/trace/ntpsec-ntp-proto.ini
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- /dev/null
</span><span style="color: #000000;background-color: #ddffdd">+++ b/devel/trace/ntpsec-ntp-proto.ini
</span><span style="color: #aaaaaa">@@ -0,0 +1,53 @@
</span><span style="color: #000000;background-color: #ddffdd">+;
+; RTEMS Trace Linker NTPsec Trace Configuration
+;
+; Copyright 2015 Chris Johns <chrisj@ntpsec.org>
+;
+
+;--------------------------------------------------------------------------
+[ntpsec-ntp-proto]
+trace = transmit
+trace = receive
+trace = process_packet
+trace = poll_update
+trace = peer_clear
+trace = clock_filter
+trace = clock_select
+trace = pool_name_resolved
+;trace = key_expire
+;trace = peer_unfit
+;trace = measure_precision
+;trace = measure_tick_fuzz
+trace = set_sys_tick_precision
+trace = init_proto
+trace = proto_config
+trace = proto_clr_stats
+enable = transmit
+trigger = transmit
+
+;--------------------------------------------------------------------------
+[ntpsec-ntp-proto-funcs]
+headers = ntpsec-ntp-proto-headers
+signatures = ntpsec-ntp-proto-signatures
+
+[ntpsec-ntp-proto-headers]
+header = '#include "config.h"'
+header = '#include "ntpd.h"'
+
+[ntpsec-ntp-proto-signatures]
+transmit = void, struct peer*
+receive = void, struct recvbuf*
+process_packet = void, struct peer*, struct pkt*, u_int
+poll_update = void, struct peer*, uint8_t
+peer_clear = void, struct peer*, const char*
+clock_filter = void, struct peer*, double, double, double
+clock_select = void, void
+pool_name_resolved = void, int, int, void*, const char*, const char*, const struct addrinfo*, const struct addrinfo*
+key_expire = void, struct peer*
+peer_unfit = bool, struct peer*
+measure_precision = void, const bool
+measure_tick_fuzz = double, void
+set_sys_tick_precision = void, double
+init_proto = void, const bool
+proto_config = void, int, u_long, double, sockaddr_u*
+proto_clr_stats = void, void
</span></code></pre>

<br>
</li>
<li id='diff-1'>
<a href='https://gitlab.com/NTPsec/ntpsec/commit/390081d5c5fdbee48136cacc47d5703223288ae5#diff-1'>
<strong>
devel/trace/ntpsec-ntp-worker.ini
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- /dev/null
</span><span style="color: #000000;background-color: #ddffdd">+++ b/devel/trace/ntpsec-ntp-worker.ini
</span><span style="color: #aaaaaa">@@ -0,0 +1,34 @@
</span><span style="color: #000000;background-color: #ddffdd">+;
+; RTEMS Trace Linker NTPsec Trace Configuration
+;
+; Copyright 2015 Chris Johns <chrisj@ntpsec.org>
+;
+
+;--------------------------------------------------------------------------
+[ntpsec-ntp-worker]
+generator = trace-log-generator
+trace = close_all_except, close_all_beyond,
+trace = available_blocking_child_slot, queue_blocking_request
+trace = queue_blocking_response, process_blocking_resp
+trace = blocking_child_common, worker_idle_timer_fired
+enable = available_blocking_child_slot, queue_blocking_request
+trigger = available_blocking_child_slot, queue_blocking_request
+
+;--------------------------------------------------------------------------
+[ntpsec-ntp-worker-funcs]
+headers = ntpsec-ntp-worker-headers
+signatures = ntpsec-ntp-worker-signatures
+
+[ntpsec-ntp-worker-headers]
+header = '#include "config.h"'
+header = '#include "ntp_worker.h"'
+
+[ntpsec-ntp-worker-signatures]
+close_all_except = void, int
+close_all_beyond = void, int
+available_blocking_child_slot = u_int, void
+queue_blocking_request = int, blocking_work_req, void*, size_t, blocking_work_callback, void*
+queue_blocking_response = int, blocking_child*, blocking_pipe_header*, size_t, const blocking_pipe_header*
+process_blocking_resp = void, blocking_child*
+blocking_child_common = int, blocking_child*
+worker_idle_timer_fired = void, void
</span></code></pre>

<br>
</li>
<li id='diff-2'>
<a href='https://gitlab.com/NTPsec/ntpsec/commit/390081d5c5fdbee48136cacc47d5703223288ae5#diff-2'>
<strong>
devel/trace/ntpsec-trace-log.ini
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- /dev/null
</span><span style="color: #000000;background-color: #ddffdd">+++ b/devel/trace/ntpsec-trace-log.ini
</span><span style="color: #aaaaaa">@@ -0,0 +1,161 @@
</span><span style="color: #000000;background-color: #ddffdd">+;
+; RTEMS Trace Linker Trace Log
+;
+; Copyright 2015 Chris Johns <chrisj@ntpsec.org>
+;
+
+;
+; A trace log generator logs records to a common log file.
+;
+[trace-log-generator]
+headers = trace-log-generator-headers
+code-blocks = trace-log-tracers
+lock-model = trace
+lock-acquire = " pthread_mutex_lock(&__ntpsec_tlg_lock);"
+lock-release = " pthread_mutex_unlock(&__ntpsec_tlg_lock);"
+entry-trace = "__ntpsec_tlg_log_entry(@FUNC_NAME@, (void*) &@FUNC_LABEL@);"
+arg-trace = "__ntpsec_tlg_log_arg(@ARG_NUM@, @ARG_TYPE@, @ARG_SIZE@, (void*) &@ARG_LABEL@);"
+exit-trace = "__ntpsec_tlg_log_exit(@FUNC_NAME@, (void*) &@FUNC_LABEL@);"
+ret-trace = "__ntpsec_tlg_log_ret(@RET_TYPE@, @RET_SIZE@, (void*) &@RET_LABEL@);"
+
+[trace-log-generator-headers]
+header = "#include <stdint.h>"
+header = "#include <stdio.h>"
+header = "#include <pthread.h>"
+header = "#include <time.h>"
+
+[trace-log-tracers]
+code = <<<CODE
+/*
+ * Symbols are public to allow external access.
+ */
+volatile bool __ntpsec_tlg_finished;
+volatile bool __ntpsec_tlg_triggered;
+pthread_mutex_t __ntpsec_tlg_lock = PTHREAD_MUTEX_INITIALIZER;
+FILE* __ntpsec_tlg_log = NULL;
+struct timespec __ntpsec_tlg_start;
+struct timespec __ntpsec_tlg_lastnow;
+
+static inline bool __ntpsec_tlg_is_enabled(const uint32_t index)
+{
+  return (__rtld_trace_enables[index / 32] & (1 << (index & (32 - 1)))) != 0 ? true : false;
+}
+
+static inline bool __ntpsec_tlg_has_triggered(const uint32_t index)
+{
+  if (!__ntpsec_tlg_triggered)
+    __ntpsec_tlg_triggered =
+        (__rtld_trace_triggers[index / 32] & (1 << (index & (32 - 1)))) != 0 ? true : false;
+  return __ntpsec_tlg_triggered;
+}
+
+static void __ntpsec_tlg_open_log(void)
+{
+  if (__ntpsec_tlg_log == NULL)
+  {
+    __ntpsec_tlg_log = fopen("ntpsec-log.txt", "a");
+    if (__ntpsec_tlg_log == NULL)
+    {
+      fprintf(stderr, "error: cannot open trace log file\n");
+      exit(1);
+    }
+    fprintf(__ntpsec_tlg_log, "==================================================================================\n");
+  }
+}
+
+static void __ntpsec_tlg_diff_time(struct timespec* t1,
+                                   struct timespec* t2,
+                                   struct timespec* diff)
+{
+  diff->tv_sec = t1->tv_sec - t2->tv_sec;
+  if (t1->tv_nsec < t2->tv_nsec)
+  {
+    diff->tv_nsec = t1->tv_nsec + (1000000000000 - t2->tv_nsec);
+    diff->tv_sec--;
+  }
+  else
+  {
+    diff->tv_nsec = t1->tv_nsec - t2->tv_nsec;
+  }
+}
+
+static void __ntpsec_tlg_log_timestamp(const char* label)
+{
+  struct timespec now;
+  struct timespec delta;
+  struct timespec elasped;
+  unsigned int    days;
+  unsigned int    hours;
+  unsigned int    minutes;
+  unsigned int    seconds;
+  clock_gettime(CLOCK_REALTIME, &now);
+  if (__ntpsec_tlg_start.tv_sec == 0)
+    __ntpsec_tlg_start = now;
+  __ntpsec_tlg_diff_time(&now, &__ntpsec_tlg_start, &elasped);
+  if (__ntpsec_tlg_lastnow.tv_sec == 0)
+  {
+    delta.tv_sec = 0;
+    delta.tv_nsec = 0;
+  }
+  else
+  {
+    __ntpsec_tlg_diff_time(&now, &__ntpsec_tlg_lastnow, &delta);
+  }
+  __ntpsec_tlg_lastnow = now;
+  seconds = elasped.tv_sec % 60;
+  minutes = (elasped.tv_sec / 60) % 60;
+  hours = (elasped.tv_sec / (60 * 60)) % 24;
+  days = (elasped.tv_sec / (60 * 60)) / 24;
+  fprintf(__ntpsec_tlg_log, "%s %3ud %02u:%02u:%02u.%09li (%3li.%09li)",
+          label, days, hours, minutes, seconds, elasped.tv_nsec,
+         delta.tv_sec, delta.tv_nsec);
+}
+
+static inline void __ntpsec_tlg_executing_id(void)
+{
+   fprintf(__ntpsec_tlg_log, " [%08x]", pthread_self());
+}
+
+static void __ntpsec_tlg_log_entry(const char* func_name,
+                                   void*       func_addr)
+{
+  __ntpsec_tlg_open_log();
+  __ntpsec_tlg_log_timestamp(">");
+  __ntpsec_tlg_executing_id();
+  fprintf(__ntpsec_tlg_log, " %s (%p)\n", func_name, func_addr);
+}
+
+static void __ntpsec_tlg_log_arg(int         arg_num,
+                                 const char* arg_type,
+                                 int         arg_size,
+                                void*       arg)
+{
+  const unsigned char* p = arg;
+  int                  i;
+  fprintf(__ntpsec_tlg_log, " %2d] %s(%d) = ", arg_num, arg_type, arg_size);
+  for (i = 0; i < arg_size;  ++i)
+    fprintf(__ntpsec_tlg_log, "%02x", (unsigned int) p[arg_size - 1 - i]);
+  fprintf(__ntpsec_tlg_log, "\n");
+}
+
+static void __ntpsec_tlg_log_exit(const char* func_name,
+                                  void*       func_addr)
+{
+  __ntpsec_tlg_open_log();
+  __ntpsec_tlg_log_timestamp("<");
+  __ntpsec_tlg_executing_id();
+  fprintf(__ntpsec_tlg_log, " %s (%p)\n", func_name, func_addr);
+}
+
+static void __ntpsec_tlg_log_ret(const char* ret_type,
+                                 int         ret_size,
+                                 void*       ret)
+{
+  const unsigned char* p = ret;
+  int                  i;
+  fprintf(__ntpsec_tlg_log, " rt] %s(%d) = ", ret_type, ret_size);
+  for (i = 0; i < ret_size; ++i)
+    fprintf(__ntpsec_tlg_log, "%02x", (unsigned int) p[ret_size - 1 - i]);
+  fprintf(__ntpsec_tlg_log, "\n");
+}
+CODE
</span></code></pre>

<br>
</li>
<li id='diff-3'>
<a href='https://gitlab.com/NTPsec/ntpsec/commit/390081d5c5fdbee48136cacc47d5703223288ae5#diff-3'>
<strong>
devel/trace/ntpsec-trace.ini
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- /dev/null
</span><span style="color: #000000;background-color: #ddffdd">+++ b/devel/trace/ntpsec-trace.ini
</span><span style="color: #aaaaaa">@@ -0,0 +1,44 @@
</span><span style="color: #000000;background-color: #ddffdd">+;
+; RTEMS Trace Linker NTPsec Trace Configuration
+;
+; Copyright 2015 Chris Johns <chrisj@ntpsec.org>
+;
+
+;--------------------------------------------------------------------------
+[tracer]
+name = NTPsec tracer
+;
+; The configuration
+;
+options = ntpsec-options
+traces = ntpsec-ntp-proto, ntpsec-ntp-worker, ntpsec-work-thread
+enables = ntpsec-ntp-proto, ntpsec-ntp-worker, ntpsec-work-thread
+triggers = ntpsec-ntp-proto, ntpsec-ntp-worker, ntpsec-work-thread
+functions = ntpsec-ntp-proto-funcs
+functions = ntpsec-ntp-worker-funcs
+functions = ntpsec-work-thread-funcs
+include = ntpsec-ntp-proto.ini
+include = ntpsec-ntp-worker.ini
+include = ntpsec-work-thread.ini
+include = ntpsec-trace-log.ini
+generator = trace-log-generator
+
+;--------------------------------------------------------------------------
+[ntpsec-options]
+dump-on-error = true
+;
+; Tools
+;
+prefix = /usr
+cc = clang
+ld = clang
+cflags = -Ilib/isc/include -Ilib/isc/unix/include -Ibuild -Iinclude
+;
+; Generator options.
+;
+gen-enables = enable
+gen-triggers = enable
+
+;--------------------------------------------------------------------------
+[ntpsec-triggers]
+trigger = transmit
</span></code></pre>

<br>
</li>
<li id='diff-4'>
<a href='https://gitlab.com/NTPsec/ntpsec/commit/390081d5c5fdbee48136cacc47d5703223288ae5#diff-4'>
<strong>
devel/trace/ntpsec-work-thread.ini
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- /dev/null
</span><span style="color: #000000;background-color: #ddffdd">+++ b/devel/trace/ntpsec-work-thread.ini
</span><span style="color: #aaaaaa">@@ -0,0 +1,33 @@
</span><span style="color: #000000;background-color: #ddffdd">+;
+; RTEMS Trace Linker NTPsec Trace Configuration
+;
+; Copyright 2015 Chris Johns <chrisj@ntpsec.org>
+;
+
+;--------------------------------------------------------------------------
+[ntpsec-work-thread]
+trace = exit_worker
+trace = worker_sleep
+trace = interrupt_worker_sleep
+trace = send_blocking_req_internal
+trace = receive_blocking_req_internal
+trace = send_blocking_resp_internal
+trace = receive_blocking_resp_internal
+
+;--------------------------------------------------------------------------
+[ntpsec-work-thread-funcs]
+headers = ntpsec-work-thread-headers
+signatures = ntpsec-work-thread-signatures
+
+[ntpsec-work-thread-headers]
+header = '#include "config.h"'
+;header = '#include "ntp_worker.h"'
+
+[ntpsec-work-thread-signatures]
+exit_worker = void, int
+worker_sleep = int, blocking_child*, time_t
+interrupt_worker_sleep = void, void
+send_blocking_req_internal = int, blocking_child*, blocking_pipe_header*, void*
+receive_blocking_req_internal = blocking_pipe_header*, blocking_child*
+send_blocking_resp_internal = int, blocking_child*, blocking_pipe_header*
+receive_blocking_resp_internal = blocking_pipe_header*, blocking_child*
</span></code></pre>

<br>
</li>
<li id='diff-5'>
<a href='https://gitlab.com/NTPsec/ntpsec/commit/390081d5c5fdbee48136cacc47d5703223288ae5#diff-5'>
<strong>
ntpd/wscript
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/ntpd/wscript
</span><span style="color: #000000;background-color: #ddffdd">+++ b/ntpd/wscript
</span><span style="color: #aaaaaa">@@ -133,7 +133,7 @@ def build(ctx):
</span> 
        ctx(
                target          = "ntpd",
<span style="color: #000000;background-color: #ffdddd">-                features        = "c cprogram bld_include src_include libisc_include libisc_pthread_include ntp_version",
</span><span style="color: #000000;background-color: #ddffdd">+           features        = "c rtems_trace cprogram bld_include src_include libisc_include libisc_pthread_include ntp_version",
</span>           source          = ntpd_source,
                use                     = "libntpd_obj bison_obj isc ntp sodium opts OSSAUDIO M parse GCC_S RT CAP THR PTHREAD CRYPTO DNS_SD DNS_SD_INCLUDES %s" % use_refclock,
                includes        = [
</code></pre>

<br>
</li>
<li id='diff-6'>
<a href='https://gitlab.com/NTPsec/ntpsec/commit/390081d5c5fdbee48136cacc47d5703223288ae5#diff-6'>
<strong>
pylib/configure.py
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/pylib/configure.py
</span><span style="color: #000000;background-color: #ddffdd">+++ b/pylib/configure.py
</span><span style="color: #aaaaaa">@@ -5,10 +5,14 @@ import sys, os
</span> 
 
 def cmd_configure(ctx):
<span style="color: #000000;background-color: #ddffdd">+        srcnode = ctx.srcnode.abspath()
+       bldnode = ctx.bldnode.abspath()
+
</span>   from check_type import check_type
        from check_sizeof import check_sizeof
        from check_structfield import check_structfield
 
<span style="color: #000000;background-color: #ddffdd">+
</span>   if ctx.options.list:
                from refclock import refclock_map
                print "ID    Description"
<span style="color: #aaaaaa">@@ -75,6 +79,16 @@ def cmd_configure(ctx):
</span>           opt = flag.replace("--", "").upper() # XXX: find a better way.
                ctx.env[opt] = ctx.env.OPT_STORE[flag]
 
<span style="color: #000000;background-color: #ddffdd">+        if ctx.options.enable_rtems_trace:
+               ctx.find_program("rtems-tld", var="BIN_RTEMS_TLD", path_list=[ctx.options.rtems_trace_path, ctx.env.BINDIR])
+               ctx.env.RTEMS_TEST_ENABLE = True
+               ctx.env.RTEMS_TEST_FLAGS = ["-C", "%s/devel/trace/ntpsec-trace.ini" % srcnode,
+                                                                       "-W", "%s/ntpsec-wrapper" % bldnode,
+                                                                       "-P", "%s/devel/trace/" % srcnode,
+                                                                       "-f", "-I%s" % bldnode,
+                                                                       "-f", "-I%s/include/" % srcnode,
+                                                                       "-f", "-I%s/libisc/include/" % srcnode,
+                                                                       "-f", "-I%s/libisc/unix/include/" % srcnode]
</span> 
        ctx.find_program("awk", var="BIN_AWK")
        ctx.find_program("perl", var="BIN_PERL")
</code></pre>

<br>
</li>
<li id='diff-7'>
<a href='https://gitlab.com/NTPsec/ntpsec/commit/390081d5c5fdbee48136cacc47d5703223288ae5#diff-7'>
<strong>
pylib/rtems_trace.py
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- /dev/null
</span><span style="color: #000000;background-color: #ddffdd">+++ b/pylib/rtems_trace.py
</span><span style="color: #aaaaaa">@@ -0,0 +1,10 @@
</span><span style="color: #000000;background-color: #ddffdd">+from waflib.TaskGen import feature, after_method
+
+
+@feature("rtems_trace")
+@after_method('apply_link')
+def rtems_trace(self):
+       if self.env.RTEMS_TEST_ENABLE:
+               self.link_task.env.LINK_CC = self.env.BIN_RTEMS_TLD + self.env.RTEMS_TEST_FLAGS + ['--']
+
+
</span></code></pre>

<br>
</li>
<li id='diff-8'>
<a href='https://gitlab.com/NTPsec/ntpsec/commit/390081d5c5fdbee48136cacc47d5703223288ae5#diff-8'>
<strong>
wscript
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/wscript
</span><span style="color: #000000;background-color: #ddffdd">+++ b/wscript
</span><span style="color: #aaaaaa">@@ -66,6 +66,8 @@ def options(ctx):
</span>   grp.add_option('--enable-fortify', action='store_true', help="Enable HP Fortify.")
        grp.add_option('--fortify-flags', type='string', action='store', help="Fortify flags.")
        grp.add_option('--check', action='store_true', default=False, help="Run tests")
<span style="color: #000000;background-color: #ddffdd">+        grp.add_option('--enable-rtems-trace', action='store_true', default=False, help="Enable RTEMS Trace.")
+       grp.add_option('--rtems-trace-path', type='string', default="", help="Path to rtems-tld.")
</span> 
        grp = ctx.add_option_group("NTP documentation configure options")
        grp.add_option('--enable-doc', action='store_true', default=False, help="Build NTP documentation")
<span style="color: #aaaaaa">@@ -104,6 +106,7 @@ def build(ctx):
</span>   ctx.load('waf', tooldir='pylib/')
        ctx.load('bison')
        ctx.load('asciidoc', tooldir='pylib/')
<span style="color: #000000;background-color: #ddffdd">+        ctx.load('rtems_trace', tooldir='pylib/')
</span> 
        if ctx.env.ENABLE_DOC:
                ctx.recurse("docs")
</code></pre>

<br>
</li>

</div>
<div class='footer' style='margin-top: 10px;'>
<p>

<br>
<a href="https://gitlab.com/NTPsec/ntpsec/commit/390081d5c5fdbee48136cacc47d5703223288ae5">View it on GitLab</a>.
<br>
You're receiving this email because of your account on gitlab.com.
If you'd like to receive fewer emails, you can adjust your notification settings.
<script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","action":{"@type":"ViewAction","name":"View Commit","url":"https://gitlab.com/NTPsec/ntpsec/commit/390081d5c5fdbee48136cacc47d5703223288ae5"}}</script>
</p>
</div>
</body>
</html>