Hello community,

here is the log from the commit of package apache2-mod_authn_otp for 
openSUSE:Factory checked in at 2019-06-24 21:52:51
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/apache2-mod_authn_otp (Old)
 and      /work/SRC/openSUSE:Factory/.apache2-mod_authn_otp.new.4615 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "apache2-mod_authn_otp"

Mon Jun 24 21:52:51 2019 rev:9 rq:711566 version:1.1.9

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/apache2-mod_authn_otp/apache2-mod_authn_otp.changes  
    2017-11-01 11:09:53.521217230 +0100
+++ 
/work/SRC/openSUSE:Factory/.apache2-mod_authn_otp.new.4615/apache2-mod_authn_otp.changes
    2019-06-24 21:53:51.916129288 +0200
@@ -1,0 +2,7 @@
+Sat Jun 22 18:14:41 UTC 2019 - [email protected]
+
+- Update to version 1.1.9
+  + Added genotpurl(1) utility
+  + Added "-F" flag to otptool(1).
+
+-------------------------------------------------------------------

Old:
----
  mod_authn_otp-1.1.8.tar.gz

New:
----
  mod_authn_otp-1.1.9.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ apache2-mod_authn_otp.spec ++++++
--- /var/tmp/diff_new_pack.Rp01pw/_old  2019-06-24 21:53:53.188130271 +0200
+++ /var/tmp/diff_new_pack.Rp01pw/_new  2019-06-24 21:53:53.244130314 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package apache2-mod_authn_otp
 #
-# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
 # Copyright (c) 2012 Archie L. Cobbs <[email protected]>
 #
 # All modifications and additions to the file contributed by third parties
@@ -19,7 +19,7 @@
 
 %define mod_name           mod_authn_otp
 Name:           apache2-%{mod_name}
-Version:        1.1.8
+Version:        1.1.9
 Release:        0
 Summary:        Apache module for one-time password authentication
 License:        Apache-2.0
@@ -157,7 +157,9 @@
 %defattr(-,root,root,-)
 %{apache_libexecdir}/%{mod_name}.so
 %{_bindir}/otptool
+%{_bindir}/genotpurl
 %{_mandir}/man1/otptool.1.gz
+%{_mandir}/man1/genotpurl.1.gz
 %doc CHANGES LICENSE README users.sample
 
 %changelog

++++++ mod_authn_otp-1.1.8.tar.gz -> mod_authn_otp-1.1.9.tar.gz ++++++
++++ 2655 lines of diff (skipped)
++++    retrying with extended exclude list
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/mod_authn_otp-1.1.8/CHANGES new/mod_authn_otp-1.1.9/CHANGES
--- old/mod_authn_otp-1.1.8/CHANGES     2017-10-30 16:40:57.000000000 +0100
+++ new/mod_authn_otp-1.1.9/CHANGES     2019-06-22 19:59:12.000000000 +0200
@@ -1,3 +1,8 @@
+Version 1.1.9 released June 22, 2019
+
+    - Added genotpurl(1) utility
+    - Added "-F" flag to otptool(1).
+
 Version 1.1.8 relesed October 30, 2017
 
     - Added PINFakeBasicAuth configuration option
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/mod_authn_otp-1.1.8/INSTALL new/mod_authn_otp-1.1.9/INSTALL
--- old/mod_authn_otp-1.1.8/INSTALL     2017-10-30 16:36:25.000000000 +0100
+++ new/mod_authn_otp-1.1.9/INSTALL     2019-06-22 19:58:39.000000000 +0200
@@ -12,3 +12,19 @@
     3. Run `make'
     4. Run `make install'
 
+Once the module is installed on your system, you'll also need to do the
+following steps to add it to Apache:
+
+    1. Add the "mod_authn_otp" module to your Apache config. This usually
+       involves adding a line looking something like this:
+
+        LoadModule authn_otp_module /usr/lib64/apache2/mod_authn_otp.so
+
+       There should already be a bunch of similar "LoadModule" lines nearby.
+
+    2. Enable the "mod_authn_otp" module, typically by running this command:
+
+        a2enmod authn_otp
+
+    3. Restart Apache
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/mod_authn_otp-1.1.8/Makefile.am new/mod_authn_otp-1.1.9/Makefile.am
--- old/mod_authn_otp-1.1.8/Makefile.am 2017-10-30 16:36:25.000000000 +0100
+++ new/mod_authn_otp-1.1.9/Makefile.am 2019-06-22 20:04:49.000000000 +0200
@@ -30,16 +30,19 @@
 install-exec-hook:
                test -z "$(STRIP)" || $(STRIP) $(DESTDIR)`$(APXS) -q 
LIBEXECDIR`/mod_authn_otp.so
                test -z "$(STRIP)" || $(STRIP) $(DESTDIR)$(bindir)/otptool
+               test -z "$(STRIP)" || $(STRIP) $(DESTDIR)$(bindir)/genotpurl
 
-bin_PROGRAMS=       otptool
+bin_PROGRAMS=       otptool genotpurl
 
-noinst_HEADERS=     otptool.h
+noinst_HEADERS=     otptool.h errinc.h base32.h
 
-man_MANS=           otptool.1
+man_MANS=           otptool.1 genotpurl.1
 
 otptool_SOURCES=    otptool.c hotp.c motp.c phex.c
 
+genotpurl_SOURCES=  genotpurl.c base32.c
+
 CLEANFILES=         *.la *.lo *.o *.so *.slo .libs/*
 
-EXTRA_DIST=         CHANGES LICENSE mod_authn_otp.c users.sample otptool.1
+EXTRA_DIST=         CHANGES LICENSE mod_authn_otp.c genotpurl.c users.sample 
otptool.1 genotpurl.1 base32.c
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/mod_authn_otp-1.1.8/base32.c new/mod_authn_otp-1.1.9/base32.c
--- old/mod_authn_otp-1.1.8/base32.c    1970-01-01 01:00:00.000000000 +0100
+++ new/mod_authn_otp-1.1.9/base32.c    2018-07-22 04:26:56.000000000 +0200
@@ -0,0 +1,233 @@
+/**
+ * base32 (de)coder implementation as specified by RFC4648.
+ *
+ * Copyright (c) 2010 Adrien Kunysz
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to 
deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ **/
+
+#include <assert.h>  // assert()
+#include <limits.h>  // CHAR_BIT
+
+#include "base32.h"
+
+/**
+ * Let this be a sequence of plain data before encoding:
+ *
+ *  01234567 01234567 01234567 01234567 01234567
+ * +--------+--------+--------+--------+--------+
+ * |< 0 >< 1| >< 2 ><|.3 >< 4.|>< 5 ><.|6 >< 7 >|
+ * +--------+--------+--------+--------+--------+
+ *
+ * There are 5 octets of 8 bits each in each sequence.
+ * There are 8 blocks of 5 bits each in each sequence.
+ *
+ * You probably want to refer to that graph when reading the algorithms in this
+ * file. We use "octet" instead of "byte" intentionnaly as we really work with
+ * 8 bits quantities. This implementation will probably not work properly on
+ * systems that don't have exactly 8 bits per (unsigned) char.
+ **/
+
+static size_t min(size_t x, size_t y)
+{
+       return x < y ? x : y;
+}
+
+static const unsigned char PADDING_CHAR = '=';
+
+/**
+ * Pad the given buffer with len padding characters.
+ */
+static void pad(unsigned char *buf, int len)
+{
+    int i;
+
+       for (i = 0; i < len; i++)
+               buf[i] = PADDING_CHAR;
+}
+
+/**
+ * This convert a 5 bits value into a base32 character.
+ * Only the 5 least significant bits are used.
+ */
+static unsigned char encode_char(unsigned char c)
+{
+       static unsigned char base32[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
+       return base32[c & 0x1F];  // 0001 1111
+}
+
+/**
+ * Decode given character into a 5 bits value.
+ * Returns -1 iff the argument given was an invalid base32 character
+ * or a padding character.
+ */
+static int decode_char(unsigned char c)
+{
+       char retval = -1;
+
+       if (c >= 'A' && c <= 'Z')
+               retval = c - 'A';
+       if (c >= '2' && c <= '7')
+               retval = c - '2' + 26;
+
+       assert(retval == -1 || ((retval & 0x1F) == retval));
+
+       return  retval;
+}
+
+/**
+ * Given a block id between 0 and 7 inclusive, this will return the index of
+ * the octet in which this block starts. For example, given 3 it will return 1
+ * because block 3 starts in octet 1:
+ *
+ * +--------+--------+
+ * | ......<|.3 >....|
+ * +--------+--------+
+ *  octet 1 | octet 2
+ */
+static int get_octet(int block)
+{
+       assert(block >= 0 && block < 8);
+       return (block*5) / 8;
+}
+
+/**
+ * Given a block id between 0 and 7 inclusive, this will return how many bits
+ * we can drop at the end of the octet in which this block starts.
+ * For example, given block 0 it will return 3 because there are 3 bits
+ * we don't care about at the end:
+ *
+ *  +--------+-
+ *  |< 0 >...|
+ *  +--------+-
+ *
+ * Given block 1, it will return -2 because there
+ * are actually two bits missing to have a complete block:
+ *
+ *  +--------+-
+ *  |.....< 1|..
+ *  +--------+-
+ **/
+static int get_offset(int block)
+{
+       assert(block >= 0 && block < 8);
+       return (8 - 5 - (5*block) % 8);
+}
+
+/**
+ * Like "b >> offset" but it will do the right thing with negative offset.
+ * We need this as bitwise shifting by a negative offset is undefined
+ * behavior.
+ */
+static unsigned char shift_right(unsigned char byte, char offset)
+{
+       if (offset > 0)
+               return byte >>  offset;
+       else
+               return byte << -offset;
+}
+
+static unsigned char shift_left(unsigned char byte, char offset)
+{
+       return shift_right(byte, - offset);
+}
+
+/**
+ * Encode a sequence. A sequence is no longer than 5 octets by definition.
+ * Thus passing a length greater than 5 to this function is an error. Encoding
+ * sequences shorter than 5 octets is supported and padding will be added to 
the
+ * output as per the specification.
+ */
+static void encode_sequence(const unsigned char *plain, int len, unsigned char 
*coded)
+{
+    int block;
+
+       assert(CHAR_BIT == 8);  // not sure this would work otherwise
+       assert(len >= 0 && len <= 5);
+
+       for (block = 0; block < 8; block++) {
+               int octet = get_octet(block);  // figure out which octet this 
block starts in
+               int junk = get_offset(block);  // how many bits do we drop from 
this octet?
+
+               if (octet >= len) { // we hit the end of the buffer
+                       pad(&coded[block], 8 - block);
+                       return;
+               }
+
+               unsigned char c = shift_right(plain[octet], junk);  // first 
part
+
+               if (junk < 0  // is there a second part?
+               &&  octet < len - 1)  // is there still something to read?
+               {
+                       c |= shift_right(plain[octet+1], 8 + junk);
+               }
+               coded[block] = encode_char(c);
+       }
+}
+
+void base32_encode(const unsigned char *plain, size_t len, unsigned char 
*coded)
+{
+       size_t i;
+       size_t j;
+
+       // All the hard work is done in encode_sequence(),
+       // here we just need to feed it the data sequence by sequence.
+       for (i = 0, j = 0; i < len; i += 5, j += 8) {
+               encode_sequence(&plain[i], min(len - i, 5), &coded[j]);
+       }
+}
+
+static int decode_sequence(const unsigned char *coded, unsigned char *plain)
+{
+    int block;
+
+       assert(CHAR_BIT == 8);
+       assert(coded && plain);
+
+       plain[0] = 0;
+       for (block = 0; block < 8; block++) {
+               int offset = get_offset(block);
+               int octet = get_octet(block);
+
+               int c = decode_char(coded[block]);
+               if (c < 0)  // invalid char, stop here
+                       return octet;
+
+               plain[octet] |= shift_left(c, offset);
+               if (offset < 0) {  // does this block overflows to next octet?
+                       assert(octet < 4);
+                       plain[octet+1] = shift_left(c, 8 + offset);
+               }
+       }
+       return 5;
+}
+
+size_t base32_decode(const unsigned char *coded, unsigned char *plain)
+{
+       size_t written = 0;
+       size_t i;
+       size_t j;
+
+       for (i = 0, j = 0; ; i += 8, j += 5) {
+               int n = decode_sequence(&coded[i], &plain[j]);
+               written += n;
+               if (n < 5)
+                       return written;
+       }
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/mod_authn_otp-1.1.8/base32.h new/mod_authn_otp-1.1.9/base32.h
--- old/mod_authn_otp-1.1.8/base32.h    1970-01-01 01:00:00.000000000 +0100
+++ new/mod_authn_otp-1.1.9/base32.h    2018-07-22 04:26:56.000000000 +0200
@@ -0,0 +1,4 @@
+#include <sys/types.h>
+
+extern void base32_encode(const unsigned char *plain, size_t len, unsigned 
char *coded);
+extern size_t base32_decode(const unsigned char *coded, unsigned char *plain);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/mod_authn_otp-1.1.8/configure.ac new/mod_authn_otp-1.1.9/configure.ac
--- old/mod_authn_otp-1.1.8/configure.ac        2017-10-30 16:36:25.000000000 
+0100
+++ new/mod_authn_otp-1.1.9/configure.ac        2019-06-22 19:59:23.000000000 
+0200
@@ -17,7 +17,7 @@
 # limitations under the License.
 #
 
-AC_INIT([mod_authn_otp Apache2 authentication module supporting one-time 
passwords], [1.1.8], [https://github.com/archiecobbs/mod-authn-otp], 
[mod_authn_otp])
+AC_INIT([mod_authn_otp Apache2 authentication module supporting one-time 
passwords], [1.1.9], [https://github.com/archiecobbs/mod-authn-otp], 
[mod_authn_otp])
 AC_CONFIG_AUX_DIR(scripts)
 AM_INIT_AUTOMAKE
 dnl AM_MAINTAINER_MODE
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/mod_authn_otp-1.1.8/errinc.h new/mod_authn_otp-1.1.9/errinc.h
--- old/mod_authn_otp-1.1.8/errinc.h    1970-01-01 01:00:00.000000000 +0100
+++ new/mod_authn_otp-1.1.9/errinc.h    2018-07-22 04:27:53.000000000 +0200
@@ -0,0 +1,48 @@
+
+/*
+ * Copyright 2009 Archie L. Cobbs <[email protected]>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <errno.h>
+
+#ifdef HAVE_ERR_H
+#include <err.h>
+#else
+#define err(E, FMT...)          do {                                           
     \
+                                    int _esave = (errno);                      
     \
+                                    fprintf(stderr, "%s: ", PROG_NAME);        
     \
+                                    fprintf(stderr, FMT);                      
     \
+                                    fprintf(stderr, ": %s\n", 
strerror(_esave));    \
+                                    exit(E);                                   
     \
+                                } while (0)
+#define errx(E, FMT...)         do {                                           
     \
+                                    fprintf(stderr, "%s: ", PROG_NAME);        
     \
+                                    fprintf(stderr, FMT);                      
     \
+                                    fprintf(stderr, "\n");                     
     \
+                                    exit(E);                                   
     \
+                                } while (0)
+#define warn(FMT...)            do {                                           
     \
+                                    int _esave = (errno);                      
     \
+                                    fprintf(stderr, "%s: ", PROG_NAME);        
     \
+                                    fprintf(stderr, FMT);                      
     \
+                                    fprintf(stderr, ": %s\n", 
strerror(_esave));    \
+                                } while (0)
+#define warnx(FMT...)           do {                                           
     \
+                                    fprintf(stderr, "%s: ", PROG_NAME);        
     \
+                                    fprintf(stderr, FMT);                      
     \
+                                    fprintf(stderr, "\n");                     
     \
+                                } while (0)
+#endif
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/mod_authn_otp-1.1.8/genotpurl.1 new/mod_authn_otp-1.1.9/genotpurl.1
--- old/mod_authn_otp-1.1.8/genotpurl.1 1970-01-01 01:00:00.000000000 +0100
+++ new/mod_authn_otp-1.1.9/genotpurl.1 2018-07-22 04:28:45.000000000 +0200
@@ -0,0 +1,112 @@
+.\"  -*- nroff -*-
+.\"
+.\" genotpurl - Generate Google Authenticator URLs
+.\"
+.\" Copyright 2009 Archie L. Cobbs <[email protected]>
+.\"
+.\" Licensed under the Apache License, Version 2.0 (the "License");
+.\" you may not use this file except in compliance with the License.
+.\" You may obtain a copy of the License at
+.\"
+.\"     http://www.apache.org/licenses/LICENSE-2.0
+.\"
+.\" Unless required by applicable law or agreed to in writing, software
+.\" distributed under the License is distributed on an "AS IS" BASIS,
+.\" WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+.\" See the License for the specific language governing permissions and
+.\" limitations under the License.
+.\"/
+.Dd July 21, 2018
+.Dt GENOTPURL 1
+.Os
+.Sh NAME
+.Nm genotpurl
+.Nd Generate Google Authenticator URLs
+.Sh SYNOPSIS
+.Nm genotpurl
+.Bk -words
+.Fl I Ar issuer
+.Fl L Ar label
+.Op Fl k Ar key
+.Op Fl i
+.Op Fl c Ar counter
+.Op Fl d Ar num-digits
+.Op Fl p Ar period
+.Ek
+.Sh DESCRIPTION
+.Nm
+is a utility for generating URLs for the Google Authenticator cell phone app, 
which
+generates one-time passwords compatible with the HOTP/OATH algorithm defined 
by RFC 4226.
+When such and URL is clicked on a cell phone, the token is automatically 
installed
+into the Google Authenticator app. This is a convenient way to deploy such 
tokens.
+.Pp
+The
+.Ar issuer
+and
+.Ar label
+are required; these strings are displayed in the app along with the current 
token value.
+.Pp
+The
+.Ar key
+is the token's binary secret key and is specified as a hexadecimal string.
+If no
+.Ar key
+is given,
+.Nm
+generates a random key and prints it to standard output.
+.Pp
+The
+.Fl i ,
+.Fl c ,
+.Fl d ,
+and
+.Fl p
+flags allow creation of non-standard tokens, but these may not be supported by 
Google Authenticator.
+.Sh OPTIONS
+.Bl -tag -width Ds
+.It Fl c
+Specify the starting target counter value for the one-time password generation.
+This flag is incompatible with the
+.Fl t
+flag.
+.It Fl d
+Specify the number of digits in the one-time password.
+The default value is six.
+.It Fl h
+Print the usage message and exit successfully.
+.It Fl I
+Specify token issuer (e.g., "Example Industries, Inc.")
+.It Fl i
+Create an interval-based token instead of a time-based token.
+.It Fl k
+Specify the token binary secret key as a hexadecimal string.
+.Pp
+If no
+.Ar key
+is given,
+.Nm
+generates a random key and prints it to standard output.
+.It Fl L
+Specify token label (e.g., "[email protected]")
+.It Fl p
+Specify the length of a single time interval in seconds.
+The default value is 30 seconds.
+Ignored if
+.Fl i
+is given.
+.El
+.Sh SEE ALSO
+.Rs
+.%T "mod_authn_otp: Apache module for one-time password authentication"
+.%O "https://github.com/archiecobbs/mod-authn-otp";
+.Re
+.Rs
+.%T "Google Authenticator (iOS)"
+.%O "https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8";
+.Re
+.Rs
+.%T "Google Authenticator (Android)"
+.%O 
"https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en_US";
+.Re
+.Sh AUTHOR
+.An Archie L. Cobbs Aq [email protected]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/mod_authn_otp-1.1.8/genotpurl.c new/mod_authn_otp-1.1.9/genotpurl.c
--- old/mod_authn_otp-1.1.8/genotpurl.c 1970-01-01 01:00:00.000000000 +0100
+++ new/mod_authn_otp-1.1.9/genotpurl.c 2018-07-22 04:27:48.000000000 +0200
@@ -0,0 +1,217 @@
+/*
+ * Generates URLs for Google Authenticator.
+ */
+
+#include <sys/types.h>
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <unistd.h>
+#include "errinc.h"
+#include "base32.h"
+
+static void urlencode(FILE *fp, const char *s);
+static void print_key(FILE *fp, const unsigned char *key, u_int len, int 
base32);
+static void usage(void);
+
+#define PROG_NAME               "genotpurl"
+
+#define DEFAULT_COUNTER         0
+#define DEFAULT_KEYLEN          10
+#define DEFAULT_NUM_DIGITS      6
+#define DEFAULT_PERIOD          30
+
+#define RANDOM_FILE             "/dev/urandom"
+
+int
+main(int argc, char **argv)
+{
+#ifdef DEFAULT_ISSUER
+    const char *issuer = DEFAULT_ISSUER;
+#else
+    const char *issuer = NULL;
+#endif
+#ifdef DEFAULT_LABEL
+    const char *label = DEFAULT_LABEL;
+#else
+    const char *label = NULL;
+#endif
+    unsigned int period = DEFAULT_PERIOD;
+    unsigned int counter = DEFAULT_COUNTER;
+    unsigned int num_digits = 6;
+    int time_based = 1;
+    unsigned char *key = NULL;
+    int keylen = DEFAULT_KEYLEN;
+    FILE *fp;
+    int i, j;
+    unsigned int b;
+
+    // Parse command line
+    while ((i = getopt(argc, argv, "c:d:iI:k:L:p:")) != -1) {
+        switch (i) {
+        case 'c':
+            counter = atoi(optarg);
+            break;
+        case 'd':
+            num_digits = atoi(optarg);
+            break;
+        case 'i':
+            time_based = 0;
+            break;
+        case 'I':
+            issuer = optarg;
+            break;
+        case 'k':
+            if (strlen(optarg) % 2 != 0)
+                errx(1, "invalid hex key `%s': odd number of digits", optarg);
+            if ((key = malloc((keylen = strlen(optarg) / 2))) == NULL)
+                err(1, "malloc");
+            for (j = 0; j < keylen; j++) {
+                if (sscanf(optarg + 2 * j, "%2x", &b) != 1)
+                    errx(1, "invalid hex key `%s': can't parse", optarg);
+                key[j] = b & 0xff;
+            }
+            break;
+        case 'L':
+            label = optarg;
+            break;
+        case 'p':
+            period = atoi(optarg);
+            break;
+        case '?':
+        default:
+            usage();
+            exit(1);
+        }
+    }
+    argv += optind;
+    argc -= optind;
+    switch (argc) {
+    case 0:
+        break;
+    default:
+        usage();
+        exit(1);
+    }
+
+    // Sanity check
+    if (time_based && counter != DEFAULT_COUNTER)
+        errx(1, "use of `-c' flag is invalid with time-based tokens");
+    if (!time_based && period != DEFAULT_PERIOD)
+        errx(1, "use of `-p' flag is invalid with time-based tokens");
+    if (label == NULL)
+        errx(1, "label required; use `-L' flag");
+    if (issuer == NULL)
+        errx(1, "issuer required; use `-I' flag");
+    if (strchr(issuer, ':') != NULL || strchr(label, ':') != NULL)
+        errx(1, "issuer and label must not contain the colon character");
+    if (time_based && period != DEFAULT_PERIOD)
+        errx(1, "google authenticator does not support time periods other than 
%d seconds", DEFAULT_PERIOD);
+    if (num_digits != DEFAULT_NUM_DIGITS)
+        errx(1, "google authenticator does not support number digits other 
than %d", DEFAULT_NUM_DIGITS);
+
+    // Generate key (if not supplied)
+    if (key == NULL) {
+        if ((key = malloc((keylen = DEFAULT_KEYLEN))) == NULL)
+            err(1, "malloc");
+        if ((fp = fopen(RANDOM_FILE, "r")) == NULL)
+            err(1, "%s", RANDOM_FILE);
+        if (fread(key, 1, keylen, fp) != keylen)
+            err(1, "%s", RANDOM_FILE);
+        fclose(fp);
+        fprintf(stderr, "generated key (hex): ");
+        print_key(stderr, key, keylen, 0);
+        fprintf(stderr, "\n");
+    }
+
+    // Output URL
+    printf("otpauth://%s/", time_based ? "totp" : "hotp");
+    urlencode(stdout, issuer);
+    printf(":");
+    urlencode(stdout, label);
+    printf("?issuer=");
+    urlencode(stdout, issuer);
+    printf("&secret=");
+    print_key(stdout, key, keylen, 1);
+    if (num_digits != DEFAULT_NUM_DIGITS)
+        printf("&digits=%u", num_digits);
+    if (!time_based)
+        printf("&counter=%u", counter);
+    else if (period != DEFAULT_PERIOD)
+        printf("&period=%u", period);
+    printf("\n");
+
+    // Done
+    return 0;
+}
+
+static void
+urlencode(FILE *fp, const char *s)
+{
+    while (*s != '\0') {
+        if (isalnum(*s))
+            fprintf(fp, "%c", *s);
+        else
+            fprintf(fp, "%%%02x", *s & 0xff);
+        s++;
+    }
+}
+
+static void
+print_key(FILE *fp, const unsigned char *key, u_int len, int base32)
+{
+    unsigned char *buf;
+    u_int buflen;
+    int i;
+
+    if (base32) {
+        buflen = ((len + 4) / 5) * 8;
+        if ((buf = malloc(buflen + 1)) == NULL)
+            err(1, "malloc");
+        buf[buflen] = 0;
+        base32_encode(key, len, buf);
+        assert(buf[buflen] == 0 && (buflen == 0 || buf[buflen - 1] != 0));
+        for (i = 0; i < buflen; i++)
+            fputc(buf[i], fp);
+        free(buf);
+    } else {
+        for (i = 0; i < len; i++)
+            fprintf(fp, "%02x", key[i] & 0xff);
+    }
+}
+
+static void
+usage(void)
+{
+    fprintf(stderr, "Usage: genotpurl [-i]");
+#ifdef DEFAULT_ISSUER
+    fprintf(stderr, " [-I issuer]");
+#else
+    fprintf(stderr, " -I issuer");
+#endif
+#ifdef DEFAULT_LABEL
+    fprintf(stderr, " [-L label]");
+#else
+    fprintf(stderr, " -L label");
+#endif
+    fprintf(stderr, " [-c counter] [-d num-digits] [-p period] [-k key]\n");
+    fprintf(stderr, "Options:\n");
+    fprintf(stderr, "  -c\tInitial counter value (default %d)\n", 
DEFAULT_COUNTER);
+    fprintf(stderr, "  -d\tNumber of digits (default %d)\n", 
DEFAULT_NUM_DIGITS);
+    fprintf(stderr, "  -i\tInterval-based instead of time-based\n");
+#ifdef DEFAULT_ISSUER
+    fprintf(stderr, "  -I\tSpecify issuer (default \"%s\")\n", DEFAULT_ISSUER);
+#else
+    fprintf(stderr, "  -I\tSpecify issuer (REQUIRED)\n");
+#endif
+    fprintf(stderr, "  -p\tTime period in seconds (default %d)\n", 
DEFAULT_PERIOD);
+    fprintf(stderr, "  -k\tSpecify hex key (default auto-generate and 
report)\n");
+#ifdef DEFAULT_LABEL
+    fprintf(stderr, "  -L\tSpecify label (default \"%s\")\n", DEFAULT_LABEL);
+#else
+    fprintf(stderr, "  -L\tSpecify label (REQUIRED)\n");
+#endif
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/mod_authn_otp-1.1.8/mod_authn_otp.c new/mod_authn_otp-1.1.9/mod_authn_otp.c
--- old/mod_authn_otp-1.1.8/mod_authn_otp.c     2017-10-30 16:36:25.000000000 
+0100
+++ new/mod_authn_otp-1.1.9/mod_authn_otp.c     2018-05-25 22:58:12.000000000 
+0200
@@ -889,7 +889,7 @@
         window_start = 1;
         window_stop = conf->max_offset;
     } else {
-        counter = (int)now / user->time_interval + user->offset;
+        counter = (int)(now / user->time_interval) + user->offset;
         window_start = -conf->max_offset;
         window_stop = conf->max_offset;
 
@@ -1025,7 +1025,7 @@
         }
 
         /* Get expected counter value */
-        counter = user->time_interval == 0 ? user->offset : (int)now / 
user->time_interval + user->offset;
+        counter = user->time_interval == 0 ? user->offset : (int)(now / 
user->time_interval) + user->offset;
 
         /* Generate OTP using expected counter */
         ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, "generating digest hash 
for \"%s\" assuming OTP counter %d",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/mod_authn_otp-1.1.8/otptool.1 new/mod_authn_otp-1.1.9/otptool.1
--- old/mod_authn_otp-1.1.8/otptool.1   2017-10-30 16:36:25.000000000 +0100
+++ new/mod_authn_otp-1.1.9/otptool.1   2018-07-27 15:55:01.000000000 +0200
@@ -25,7 +25,7 @@
 .Sh SYNOPSIS
 .Nm otptool
 .Bk -words
-.Op Fl fht
+.Op Fl Ffht
 .Op Fl c Ar counter
 .Op Fl d Ar #digits
 .Op Fl i Ar secs
@@ -41,7 +41,12 @@
 .Pp
 The
 .Ar key
-is the token's binary secret key and is specified as a hexadecimal string.
+is the token's binary secret key and may be specified on the command line as a 
hexadecimal string,
+or read from a file using the
+.Fl F
+or
+.Fl f
+flag.
 .Pp
 If no
 .Ar password
@@ -99,12 +104,12 @@
 Otherwise, the default value is the length of
 .Ar password ,
 if given, or else six if not.
+.It Fl F
+Read the key as a hexadecimal string from the file named
+.Ar key .
 .It Fl f
-Read the key from the file named
-.Ar key
-instead of parsing
-.Ar key
-as a hexadecimal string.
+Read the key in raw, binary format from the file named
+.Ar key .
 .It Fl h
 Print the usage message and exit successfully.
 .It Fl i
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/mod_authn_otp-1.1.8/otptool.c new/mod_authn_otp-1.1.9/otptool.c
--- old/mod_authn_otp-1.1.8/otptool.c   2017-10-30 16:36:25.000000000 +0100
+++ new/mod_authn_otp-1.1.9/otptool.c   2018-07-27 15:57:13.000000000 +0200
@@ -32,14 +32,16 @@
     const char *key = NULL;
     const char *motp_pin = NULL;
     unsigned char keybuf[128];
+    unsigned char filebuf[520];
     char otpbuf10[OTP_BUF_SIZE];
     char otpbuf16[OTP_BUF_SIZE];
-    size_t keylen;
+    size_t keylen = -1;
     int time_interval = DEFAULT_TIME_INTERVAL;
     int ndigits = -1;
     int counter_start;
     int counter_stop;
     int read_from_file = 0;
+    int parse_ascii_key = 1;
     int counter = -1;
     int use_time = 0;
     int window = 0;
@@ -47,7 +49,7 @@
     int i;
 
     /* Parse command line */
-    while ((ch = getopt(argc, argv, "c:d:fhi:m:tvw:")) != -1) {
+    while ((ch = getopt(argc, argv, "c:d:fFhi:m:tvw:")) != -1) {
         switch (ch) {
         case 'c':
             if (use_time)
@@ -61,8 +63,13 @@
             if (ndigits < 1)
                 errx(EXIT_USAGE_ERROR, "invalid digit count `%s'", optarg);
             break;
+        case 'F':
+            read_from_file = 1;
+            parse_ascii_key = 1;
+            break;
         case 'f':
             read_from_file = 1;
+            parse_ascii_key = 0;
             break;
         case 'h':
             usage();
@@ -114,19 +121,37 @@
     if (ndigits == -1)
         ndigits = DEFAULT_NUM_DIGITS;
 
-    /* Read or parse key */
+    /* Read from file if needed */
     if (read_from_file) {
         FILE *fp;
+        size_t len;
 
+        /* Read data */
         if ((fp = fopen(key, "rb")) == NULL)
             err(EXIT_SYSTEM_ERROR, "error reading `%s'", key);
-        keylen = fread(keybuf, 1, sizeof(keybuf), fp);
+        len = fread(filebuf, 1, sizeof(filebuf) - 1, fp);
         if (ferror(fp))
             err(EXIT_SYSTEM_ERROR, "error reading `%s'", key);
         if (!feof(fp))
             errx(EXIT_SYSTEM_ERROR, "error reading `%s': %s", key, "key is too 
long");
         fclose(fp);
-    } else {
+
+        /* Optionally parse file content as ASCII */
+        if (parse_ascii_key) {
+            filebuf[len] = 0;
+            while (len > 0 && isspace(filebuf[len - 1]))        /* trim 
whitespace */
+                filebuf[--len] = 0;
+            key = (char *)filebuf;
+        } else {
+            if (len > sizeof(keybuf))
+                errx(EXIT_SYSTEM_ERROR, "error reading `%s': %s", key, "key is 
too long");
+            memcpy(keybuf, filebuf, len);
+            keylen = len;
+        }
+    }
+
+    /* Parse key */
+    if (parse_ascii_key) {
         for (keylen = 0; keylen < sizeof(keybuf) && key[keylen * 2] != '\0'; 
keylen++) {
             const char *s = &key[keylen * 2];
             int nibs[2];
@@ -202,10 +227,11 @@
 static void
 usage()
 {
-    fprintf(stderr, "Usage: %s [-fht] [-c counter] [-d digits] [-i interval] 
[-m PIN] [-w window] key [otp]\n", PROG_NAME);
+    fprintf(stderr, "Usage: %s [-Ffht] [-c counter] [-d digits] [-i interval] 
[-m PIN] [-w window] key [otp]\n", PROG_NAME);
     fprintf(stderr, "Options:\n");
     fprintf(stderr, "  -c\tSpecify the initial counter value (conflicts with 
`-t')\n");
-    fprintf(stderr, "  -f\t`key' refers to the file containing the key\n");
+    fprintf(stderr, "  -F\t`key' refers to the file containing the key in 
hexadecimal format\n");
+    fprintf(stderr, "  -f\t`key' refers to the file containing the key in 
binary format\n");
     fprintf(stderr, "  -h\tDisplay this usage message\n");
     fprintf(stderr, "  -i\tSpecify time interval in seconds (default %d)\n", 
DEFAULT_TIME_INTERVAL);
     fprintf(stderr, "  -m\tUse mOTP algorithm with given PIN; also implies `-d 
6' and `-i 10'\n");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/mod_authn_otp-1.1.8/otptool.h new/mod_authn_otp-1.1.9/otptool.h
--- old/mod_authn_otp-1.1.8/otptool.h   2017-10-30 16:36:25.000000000 +0100
+++ new/mod_authn_otp-1.1.9/otptool.h   2018-07-22 04:26:56.000000000 +0200
@@ -27,39 +27,12 @@
 #include <time.h>
 #include <unistd.h>
 
-#ifdef HAVE_ERR_H
-#include <err.h>
-#else
-#define err(E, FMT...)          do {                                           
     \
-                                    int _esave = (errno);                      
     \
-                                    fprintf(stderr, "%s: ", PROG_NAME);        
     \
-                                    fprintf(stderr, FMT);                      
     \
-                                    fprintf(stderr, ": %s\n", 
strerror(_esave));    \
-                                    exit(E);                                   
     \
-                                } while (0)
-#define errx(E, FMT...)         do {                                           
     \
-                                    fprintf(stderr, "%s: ", PROG_NAME);        
     \
-                                    fprintf(stderr, FMT);                      
     \
-                                    fprintf(stderr, "\n");                     
     \
-                                    exit(E);                                   
     \
-                                } while (0)
-#define warn(FMT...)            do {                                           
     \
-                                    int _esave = (errno);                      
     \
-                                    fprintf(stderr, "%s: ", PROG_NAME);        
     \
-                                    fprintf(stderr, FMT);                      
     \
-                                    fprintf(stderr, ": %s\n", 
strerror(_esave));    \
-                                } while (0)
-#define warnx(FMT...)           do {                                           
     \
-                                    fprintf(stderr, "%s: ", PROG_NAME);        
     \
-                                    fprintf(stderr, FMT);                      
     \
-                                    fprintf(stderr, "\n");                     
     \
-                                } while (0)
-#endif
-
 #include <openssl/evp.h>
 #include <openssl/hmac.h>
 #include <openssl/md5.h>
 
+#include "errinc.h"
+
 /* Program name */
 #define PROG_NAME                   "otptool"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/mod_authn_otp-1.1.8/scripts/compile new/mod_authn_otp-1.1.9/scripts/compile
--- old/mod_authn_otp-1.1.8/scripts/compile     1970-01-01 01:00:00.000000000 
+0100
+++ new/mod_authn_otp-1.1.9/scripts/compile     2019-06-22 20:07:10.000000000 
+0200
@@ -0,0 +1,348 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand '-c -o'.
+
+scriptversion=2016-01-11.22; # UTC
+
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
+# Written by Tom Tromey <[email protected]>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <[email protected]> or send patches to
+# <[email protected]>.
+
+nl='
+'
+
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent tools from complaining about whitespace usage.
+IFS=" ""       $nl"
+
+file_conv=
+
+# func_file_conv build_file lazy
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts. If the determined conversion
+# type is listed in (the comma separated) LAZY, no conversion will
+# take place.
+func_file_conv ()
+{
+  file=$1
+  case $file in
+    / | /[!/]*) # absolute file, and not a UNC file
+      if test -z "$file_conv"; then
+       # lazily determine how to convert abs files
+       case `uname -s` in
+         MINGW*)
+           file_conv=mingw
+           ;;
+         CYGWIN*)
+           file_conv=cygwin
+           ;;
+         *)
+           file_conv=wine
+           ;;
+       esac
+      fi
+      case $file_conv/,$2, in
+       *,$file_conv,*)
+         ;;
+       mingw/*)
+         file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+         ;;
+       cygwin/*)
+         file=`cygpath -m "$file" || echo "$file"`
+         ;;
+       wine/*)
+         file=`winepath -w "$file" || echo "$file"`
+         ;;
+      esac
+      ;;
+  esac
+}
+
+# func_cl_dashL linkdir
+# Make cl look for libraries in LINKDIR
+func_cl_dashL ()
+{
+  func_file_conv "$1"
+  if test -z "$lib_path"; then
+    lib_path=$file
+  else
+    lib_path="$lib_path;$file"
+  fi
+  linker_opts="$linker_opts -LIBPATH:$file"
+}
+
+# func_cl_dashl library
+# Do a library search-path lookup for cl
+func_cl_dashl ()
+{
+  lib=$1
+  found=no
+  save_IFS=$IFS
+  IFS=';'
+  for dir in $lib_path $LIB
+  do
+    IFS=$save_IFS
+    if $shared && test -f "$dir/$lib.dll.lib"; then
+      found=yes
+      lib=$dir/$lib.dll.lib
+      break
+    fi
+    if test -f "$dir/$lib.lib"; then
+      found=yes
+      lib=$dir/$lib.lib
+      break
+    fi
+    if test -f "$dir/lib$lib.a"; then
+      found=yes
+      lib=$dir/lib$lib.a
+      break
+    fi
+  done
+  IFS=$save_IFS
+
+  if test "$found" != yes; then
+    lib=$lib.lib
+  fi
+}
+
+# func_cl_wrapper cl arg...
+# Adjust compile command to suit cl
+func_cl_wrapper ()
+{
+  # Assume a capable shell
+  lib_path=
+  shared=:
+  linker_opts=
+  for arg
+  do
+    if test -n "$eat"; then
+      eat=
+    else
+      case $1 in
+       -o)
+         # configure might choose to run compile as 'compile cc -o foo foo.c'.
+         eat=1
+         case $2 in
+           *.o | *.[oO][bB][jJ])
+             func_file_conv "$2"
+             set x "$@" -Fo"$file"
+             shift
+             ;;
+           *)
+             func_file_conv "$2"
+             set x "$@" -Fe"$file"
+             shift
+             ;;
+         esac
+         ;;
+       -I)
+         eat=1
+         func_file_conv "$2" mingw
+         set x "$@" -I"$file"
+         shift
+         ;;
+       -I*)
+         func_file_conv "${1#-I}" mingw
+         set x "$@" -I"$file"
+         shift
+         ;;
+       -l)
+         eat=1
+         func_cl_dashl "$2"
+         set x "$@" "$lib"
+         shift
+         ;;
+       -l*)
+         func_cl_dashl "${1#-l}"
+         set x "$@" "$lib"
+         shift
+         ;;
+       -L)
+         eat=1
+         func_cl_dashL "$2"
+         ;;
+       -L*)
+         func_cl_dashL "${1#-L}"
+         ;;
+       -static)
+         shared=false
+         ;;
+       -Wl,*)
+         arg=${1#-Wl,}
+         save_ifs="$IFS"; IFS=','
+         for flag in $arg; do
+           IFS="$save_ifs"
+           linker_opts="$linker_opts $flag"
+         done
+         IFS="$save_ifs"
+         ;;
+       -Xlinker)
+         eat=1
+         linker_opts="$linker_opts $2"
+         ;;
+       -*)
+         set x "$@" "$1"
+         shift
+         ;;
+       *.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
+         func_file_conv "$1"
+         set x "$@" -Tp"$file"
+         shift
+         ;;
+       *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
+         func_file_conv "$1" mingw
+         set x "$@" "$file"
+         shift
+         ;;
+       *)
+         set x "$@" "$1"
+         shift
+         ;;
+      esac
+    fi
+    shift
+  done
+  if test -n "$linker_opts"; then
+    linker_opts="-link$linker_opts"
+  fi
+  exec "$@" $linker_opts
+  exit 1
+}
+
+eat=
+
+case $1 in
+  '')
+     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand '-c -o'.
+Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file 'INSTALL'.
+
+Report bugs to <[email protected]>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "compile $scriptversion"
+    exit $?
+    ;;
+  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
+  icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
+    func_cl_wrapper "$@"      # Doesn't return...
+    ;;
+esac
+
+ofile=
+cfile=
+
+for arg
+do
+  if test -n "$eat"; then
+    eat=
+  else
+    case $1 in
+      -o)
+       # configure might choose to run compile as 'compile cc -o foo foo.c'.
+       # So we strip '-o arg' only if arg is an object.
+       eat=1
+       case $2 in
+         *.o | *.obj)
+           ofile=$2
+           ;;
+         *)
+           set x "$@" -o "$2"
+           shift
+           ;;
+       esac
+       ;;
+      *.c)
+       cfile=$1
+       set x "$@" "$1"
+       shift
+       ;;
+      *)
+       set x "$@" "$1"
+       shift
+       ;;
+    esac
+  fi
+  shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+  # If no '-o' option was seen then we might have been invoked from a
+  # pattern rule where we don't need one.  That is ok -- this is a
+  # normal compilation that the losing compiler can handle.  If no
+  # '.c' file was seen then we are probably linking.  That is also
+  # ok.
+  exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use '[/\\:.-]' here to ensure that we don't use the same name
+# that we are using for the .o file.  Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
+while true; do
+  if mkdir "$lockdir" >/dev/null 2>&1; then
+    break
+  fi
+  sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/mod_authn_otp-1.1.8/scripts/missing new/mod_authn_otp-1.1.9/scripts/missing
--- old/mod_authn_otp-1.1.8/scripts/missing     2017-10-30 16:43:10.000000000 
+0100
+++ new/mod_authn_otp-1.1.9/scripts/missing     2019-06-22 20:07:10.000000000 
+0200
@@ -1,9 +1,9 @@
 #! /bin/sh
 # Common wrapper for a few potentially missing GNU programs.
 
-scriptversion=2012-06-26.16; # UTC
+scriptversion=2016-01-11.22; # UTC
 
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
 # Originally written by Fran,cois Pinard <[email protected]>, 1996.
 
 # This program is free software; you can redistribute it and/or modify
@@ -160,7 +160,7 @@
       ;;
    autom4te*)
       echo "You might have modified some maintainer files that require"
-      echo "the 'automa4te' program to be rebuilt."
+      echo "the 'autom4te' program to be rebuilt."
       program_details 'autom4te'
       ;;
     bison*|yacc*)
@@ -210,6 +210,6 @@
 # eval: (add-hook 'write-file-hooks 'time-stamp)
 # time-stamp-start: "scriptversion="
 # time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
+# time-stamp-time-zone: "UTC0"
 # time-stamp-end: "; # UTC"
 # End:


Reply via email to