From 62bbb9e144a4320df852c59fdb9317fd0248d7af Mon Sep 17 00:00:00 2001 From: Jaroslav Škarvada Date: May 03 2021 16:25:27 +0000 Subject: New version Resolves: rhbz#1955967 --- diff --git a/.gitignore b/.gitignore index 4734e27..537398d 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -oath-toolkit-*.tar.gz +/oath-toolkit-*.tar.gz diff --git a/gdoc b/gdoc deleted file mode 100644 index 0868329..0000000 --- a/gdoc +++ /dev/null @@ -1,913 +0,0 @@ -eval '(exit $?0)' && eval 'exec perl -S "$0" ${1+"$@"}' - & eval 'exec perl -S "$0" $argv:q' - if 0; -# Generate documentation from source code. - -## Copyright (c) 2002-2012 Simon Josefsson -## added -texinfo, -listfunc, -pkg-name -## man page revamp -## various improvements -## Copyright (c) 2001, 2002 Nikos Mavrogiannopoulos -## added -tex -## Copyright (c) 1998 Michael Zucchi - -# 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 3 of the License, 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 . - -# This will read a C source code file and scan for embedded comments -# in the style of gnome comments (+minor extensions - see below). - -# usage: -# gdoc [ -docbook | -html | -text | -man | -tex | -texinfo | -listfunc ] -# [ -sourceversion verno ] [ -include file | -includefuncprefix ] -# [ -bugsto address ] [ -pkg-name packagename ] -# [ -seeinfo infonode ] [ -copyright notice ] [ -verbatimcopying ] -# [ -function funcname [ -function funcname ...] ] c file(s)s > outputfile -# -# Set output format using one of -docbook, -html, -text, -man, -tex, -# -texinfo, or -listfunc. Default is man. -# -# -sourceversion -# Version number for source code, e.g. '1.0.4'. Used in 'man' headers. -# Defaults to using current date. -# -# -include FILE -# For man pages, mention #include in the synopsis. -# -# -includefuncprefix -# For man pages, mention a #include in the synopsis. -# The FILE derived from the function prefix. For example, a -# function gss_init_sec_context will generate an include -# statement of #include . -# -# -bugsto address -# For man pages, include a section about reporting bugs and mention -# the given e-mail address, e.g 'bug-libidn@gnu.org'. -# -# -pkg-name packagename -# For man pages when -bugsto is used, also include help URLs to the -# the project's home page. For example, "GNU Libidn". -# -# -seeinfo infonode -# For man pages, include a section that point to an info manual -# for more information. -# -# -copyright notice -# For man pages, include a copyright section with the given -# notice after a preamble. Use, e.g., '2002, 2003 Simon Josefsson'. -# -# -verbatimcopying -# For man pages, and when the -copyright parameter is used, -# add a licensing statement that say verbatim copying is permitted. -# -# -function funcname -# If set, then only generate documentation for the given function(s). All -# other functions are ignored. -# -# c files - list of 'c' files to process -# -# All output goes to stdout, with errors to stderr. - -# -# format of comments. -# In the following table, (...)? signifies optional structure. -# (...)* signifies 0 or more structure elements -# /** -# * function_name(:)? (- short description)? -# (* @parameterx: (description of parameter x)?)* -# (* a blank line)? -# * (Description:)? (Description of function)? -# * (Section header: (section description)? )* -# (*)?*/ -# -# So .. the trivial example would be: -# -# /** -# * my_function -# **/ -# -# If the Description: header tag is ommitted, then there must be a blank line -# after the last parameter specification. -# e.g. -# /** -# * my_function - does my stuff -# * @my_arg: its mine damnit -# * -# * Does my stuff explained. -# */ -# -# or, could also use: -# /** -# * my_function - does my stuff -# * @my_arg: its mine damnit -# * Description: Does my stuff explained. -# */ -# etc. -# -# All descriptions can be multiline, apart from the short function description. -# -# All descriptive text is further processed, scanning for the following special -# patterns, which are highlighted appropriately. -# -# 'funcname()' - function -# '$ENVVAR' - environmental variable OBSOLETE (?) -# '#struct_name' - name of a structure -# '@parameter' - name of a parameter -# '%CONST' - name of a constant. - -# -# Extensions for LaTeX: -# -# 1. the symbol '->' will be replaced with a rightarrow -# 2. x^y with ${x}^{y}$. -# 3. xxx\: with xxx: - -use POSIX qw(strftime); - -# match expressions used to find embedded type information -$type_constant = "\\\%(\\w+)"; -$type_func = "(\\w+\\(\\))"; -$type_param = "\\\@(\\w+)"; -$type_struct = "\\\#(\\w+)"; -$type_env = "(\\\$\\w+)"; - - -# Output conversion substitutions. -# One for each output format - -# these work fairly well -%highlights_html = ( $type_constant, "\$1", - $type_func, "\$1", - $type_struct, "\$1", - $type_param, "\$1" ); -$blankline_html = "

"; - -%highlights_texinfo = ( $type_constant, "\\\@code{\$1}", - $type_func, "\\\@code{\$1}", - $type_struct, "\\\@code{\$1}", - $type_param, "\\\@code{\$1}" ); -$blankline_texinfo = ""; - -%highlights_tex = ( $type_constant, "{\\\\it \$1}", - $type_func, "{\\\\bf \$1}", - $type_struct, "{\\\\it \$1}", - $type_param, "{\\\\bf \$1}" ); -$blankline_tex = "\\\\"; - -# sgml, docbook format -%highlights_sgml = ( $type_constant, "\$1", - $type_func, "\$1", - $type_struct, "\$1", - $type_env, "\$1", - $type_param, "\$1" ); -$blankline_sgml = "\n"; - -# these are pretty rough -%highlights_man = ( $type_constant, "\\\\fB\$1\\\\fP", - $type_func, "\\\\fB\$1\\\\fP", - $type_struct, "\\\\fB\$1\\\\fP", - $type_param, "\\\\fI\$1\\\\fP" ); -$blankline_man = ""; - -# text-mode -%highlights_text = ( $type_constant, "\$1", - $type_func, "\$1", - $type_struct, "\$1", - $type_param, "\$1" ); -$blankline_text = ""; - - -sub usage { - print "Usage: $0 [ -v ] [ -docbook | -html | -text | -man | -tex | -texinfo -listfunc ]\n"; - print " [ -sourceversion verno ] [ -include file | -includefuncprefix ]\n"; - print " [ -bugsto address ] [ -seeinfo infonode ] [ -copyright notice]\n"; - print " [ -verbatimcopying ] [ -pkg-name packagename ]\n"; - print " [ -function funcname [ -function funcname ...] ]\n"; - print " c source file(s) > outputfile\n"; - exit 1; -} - -# read arguments -if ($#ARGV==-1) { - usage(); -} - -$verbose = 0; -$output_mode = "man"; -%highlights = %highlights_man; -$blankline = $blankline_man; -$modulename = "API Documentation"; -$sourceversion = strftime "%Y-%m-%d", localtime; -$function_only = 0; -while ($ARGV[0] =~ m/^-(.*)/) { - $cmd = shift @ARGV; - if ($cmd eq "-html") { - $output_mode = "html"; - %highlights = %highlights_html; - $blankline = $blankline_html; - } elsif ($cmd eq "-man") { - $output_mode = "man"; - %highlights = %highlights_man; - $blankline = $blankline_man; - } elsif ($cmd eq "-tex") { - $output_mode = "tex"; - %highlights = %highlights_tex; - $blankline = $blankline_tex; - } elsif ($cmd eq "-texinfo") { - $output_mode = "texinfo"; - %highlights = %highlights_texinfo; - $blankline = $blankline_texinfo; - } elsif ($cmd eq "-text") { - $output_mode = "text"; - %highlights = %highlights_text; - $blankline = $blankline_text; - } elsif ($cmd eq "-docbook") { - $output_mode = "sgml"; - %highlights = %highlights_sgml; - $blankline = $blankline_sgml; - } elsif ($cmd eq "-listfunc") { - $output_mode = "listfunc"; - } elsif ($cmd eq "-module") { # not needed for sgml, inherits from calling document - $modulename = shift @ARGV; - } elsif ($cmd eq "-sourceversion") { - $sourceversion = shift @ARGV; - } elsif ($cmd eq "-include") { - $include = shift @ARGV; - } elsif ($cmd eq "-includefuncprefix") { - $includefuncprefix = 1; - } elsif ($cmd eq "-bugsto") { - $bugsto = shift @ARGV; - } elsif ($cmd eq "-pkg-name") { - $pkgname = shift @ARGV; - } elsif ($cmd eq "-copyright") { - $copyright = shift @ARGV; - } elsif ($cmd eq "-verbatimcopying") { - $verbatimcopying = 1; - } elsif ($cmd eq "-seeinfo") { - $seeinfo = shift @ARGV; - } elsif ($cmd eq "-function") { # to only output specific functions - $function_only = 1; - $function = shift @ARGV; - $function_table{$function} = 1; - } elsif ($cmd eq "-v") { - $verbose = 1; - } elsif (($cmd eq "-h") || ($cmd eq "--help")) { - usage(); - } -} - -## -# dumps section contents to arrays/hashes intended for that purpose. -# -sub dump_section { - my $name = shift @_; - my $contents = join "\n", @_; - - if ($name =~ m/$type_constant/) { - $name = $1; -# print STDERR "constant section '$1' = '$contents'\n"; - $constants{$name} = $contents; - } elsif ($name =~ m/$type_param/) { -# print STDERR "parameter def '$1' = '$contents'\n"; - $name = $1; - $parameters{$name} = $contents; - } else { -# print STDERR "other section '$name' = '$contents'\n"; - $sections{$name} = $contents; - push @sectionlist, $name; - } -} - -## -# output function -# -# parameters, a hash. -# function => "function name" -# parameterlist => @list of parameters -# parameters => %parameter descriptions -# sectionlist => @list of sections -# sections => %descriont descriptions -# - -sub repstr { - $pattern = shift; - $repl = shift; - $match1 = shift; - $match2 = shift; - $match3 = shift; - $match4 = shift; - - $output = $repl; - $output =~ s,\$1,$match1,g; - $output =~ s,\$2,$match2,g; - $output =~ s,\$3,$match3,g; - $output =~ s,\$4,$match4,g; - - eval "\$return = qq/$output/"; - -# print "pattern $pattern matched 1=$match1 2=$match2 3=$match3 4=$match4 replace $repl yielded $output interpolated $return\n"; - - $return; -} - -sub just_highlight { - my $contents = join "\n", @_; - my $line; - my $ret = ""; - - foreach $pattern (keys %highlights) { -# print "scanning pattern $pattern ($highlights{$pattern})\n"; - $contents =~ s:$pattern:repstr($pattern, $highlights{$pattern}, $1, $2, $3, $4):gse; - } - foreach $line (split "\n", $contents) { - if ($line eq ""){ - $ret = $ret . $lineprefix . $blankline; - } else { - $ret = $ret . $lineprefix . $line; - } - $ret = $ret . "\n"; - } - - return $ret; -} - -sub output_highlight { - print (just_highlight (@_)); -} - -# output in texinfo -sub output_texinfo { - my %args = %{$_[0]}; - my ($parameter, $section); - my $count; - - print "\@subheading ".$args{'function'}."\n"; - print "\@anchor{".$args{'function'}."}\n"; - print "\@deftypefun {" . $args{'functiontype'} . "} "; - print "{".$args{'function'}."} "; - print "("; - $count = 0; - foreach $parameter (@{$args{'parameterlist'}}) { - print $args{'parametertypes'}{$parameter}." \@var{".$parameter."}"; - if ($count != $#{$args{'parameterlist'}}) { - $count++; - print ", "; - } - } - print ")\n"; - foreach $parameter (@{$args{'parameterlist'}}) { - if ($args{'parameters'}{$parameter}) { - print "\@var{".$parameter."}: "; - output_highlight($args{'parameters'}{$parameter}); - print "\n"; - } - } - foreach $section (@{$args{'sectionlist'}}) { - print "\n\@strong{$section:} " if $section ne $section_default; - $args{'sections'}{$section} =~ s:([{}]):\@\1:gs; - output_highlight($args{'sections'}{$section}); - } - print "\@end deftypefun\n\n"; -} - -# output in html -sub output_html { - my %args = %{$_[0]}; - my ($parameter, $section); - my $count; - print "\n\n 

Function

\n"; - - print "".$args{'functiontype'}."\n"; - print "".$args{'function'}."\n"; - print "("; - $count = 0; - foreach $parameter (@{$args{'parameterlist'}}) { - print "".$args{'parametertypes'}{$parameter}." ".$parameter."\n"; - if ($count != $#{$args{'parameterlist'}}) { - $count++; - print ", "; - } - } - print ")\n"; - - print "

Arguments

\n"; - print "
\n"; - foreach $parameter (@{$args{'parameterlist'}}) { - print "
".$args{'parametertypes'}{$parameter}." ".$parameter."\n"; - print "
"; - output_highlight($args{'parameters'}{$parameter}); - } - print "
\n"; - foreach $section (@{$args{'sectionlist'}}) { - print "

$section

\n"; - print "
    \n"; - output_highlight($args{'sections'}{$section}); - print "
\n"; - } - print "
\n"; -} - -# output in tex -sub output_tex { - my %args = %{$_[0]}; - my ($parameter, $section); - my $count; - my $func = $args{'function'}; - my $param; - my $param2; - my $sec; - my $check; - my $type; - - $func =~ s/_/\\_/g; - - print "\n\n\\subsection{". $func . "}\n\\label{" . $args{'function'} . "}\n"; - - $type = $args{'functiontype'}; - $type =~ s/_/\\_/g; - - print "{\\it ".$type."}\n"; - print "{\\bf ".$func."}\n"; - print "("; - $count = 0; - foreach $parameter (@{$args{'parameterlist'}}) { - $param = $args{'parametertypes'}{$parameter}; - $param2 = $parameter; - $param =~ s/_/\\_/g; - $param2 =~ s/_/\\_/g; - - print "{\\it ".$param."} {\\bf ".$param2."}"; - if ($count != $#{$args{'parameterlist'}}) { - $count++; - print ", "; - } - } - print ")\n"; - - print "\n{\\large{Arguments}}\n"; - - print "\\begin{itemize}\n"; - $check=0; - foreach $parameter (@{$args{'parameterlist'}}) { - $param1 = $args{'parametertypes'}{$parameter}; - $param1 =~ s/_/\\_/g; - $param2 = $parameter; - $param2 =~ s/_/\\_/g; - - $check = 1; - print "\\item {\\it ".$param1."} {\\bf ".$param2."}: \n"; -# print "\n"; - - $param3 = $args{'parameters'}{$parameter}; - $param3 =~ s/#([a-zA-Z\_]+)/{\\it \1}/g; - - $out = just_highlight($param3); - $out =~ s/_/\\_/g; - print $out; - } - if ($check==0) { - print "\\item void\n"; - } - print "\\end{itemize}\n"; - - foreach $section (@{$args{'sectionlist'}}) { - $sec = $section; - $sec =~ s/_/\\_/g; - $sec =~ s/#([a-zA-Z\_]+)/{\\it \1}/g; - - print "\n{\\large{$sec}}\\\\\n"; - print "\\begin{rmfamily}\n"; - - $sec = $args{'sections'}{$section}; - $sec =~ s/\\:/:/g; - $sec =~ s/#([a-zA-Z\_]+)/{\\it \1}/g; - $sec =~ s/->/\$\\rightarrow\$/g; - $sec =~ s/([0-9]+)\^([0-9]+)/\$\{\1\}\^\{\2\}\$/g; - - $out = just_highlight($sec); - $out =~ s/_/\\_/g; - - print $out; - print "\\end{rmfamily}\n"; - } - print "\n"; -} - - -# output in sgml DocBook -sub output_sgml { - my %args = %{$_[0]}; - my ($parameter, $section); - my $count; - my $id; - - $id = $args{'module'}."-".$args{'function'}; - $id =~ s/[^A-Za-z0-9]/-/g; - - print "\n"; - print "\n"; - print "".$args{'function'}."\n"; - print "\n"; - print "\n"; - print " ".$args{'function'}."\n"; - print " \n"; - print " ".$args{'purpose'}."\n"; - print " \n"; - print "\n"; - - print "\n"; - print " Synopsis\n"; - print " \n"; - print " ".$args{'functiontype'}." "; - print "".$args{'function'}." "; - print "\n"; - -# print "\n"; -# print " Synopsis\n"; -# print " \n"; -# print " ".$args{'functiontype'}." "; -# print "".$args{'function'}." "; -# print "\n"; - - $count = 0; - if ($#{$args{'parameterlist'}} >= 0) { - foreach $parameter (@{$args{'parameterlist'}}) { - print " ".$args{'parametertypes'}{$parameter}; - print " $parameter\n"; - } - } else { - print " \n"; - } - print " \n"; - print "\n"; -# print "\n"; - - # print parameters - print "\n Arguments\n"; -# print "\nArguments\n"; - if ($#{$args{'parameterlist'}} >= 0) { - print " \n"; - foreach $parameter (@{$args{'parameterlist'}}) { - print " \n $parameter\n"; - print " \n \n"; - $lineprefix=" "; - output_highlight($args{'parameters'}{$parameter}); - print " \n \n \n"; - } - print " \n"; - } else { - print " \n None\n \n"; - } - print "\n"; - - # print out each section - $lineprefix=" "; - foreach $section (@{$args{'sectionlist'}}) { - print "\n $section\n \n"; -# print "\n$section\n"; - if ($section =~ m/EXAMPLE/i) { - print "\n"; - } - output_highlight($args{'sections'}{$section}); -# print ""; - if ($section =~ m/EXAMPLE/i) { - print "\n"; - } - print " \n\n"; - } - - print "\n\n"; -} - -## -# output in man -sub output_man { - my %args = %{$_[0]}; - my ($parameter, $section); - my $count; - - print ".\\\" DO NOT MODIFY THIS FILE! It was generated by gdoc.\n"; - print ".TH \"$args{'function'}\" 3 \"$args{'sourceversion'}\" \"". $args{'module'} . "\" \"". $args{'module'} . "\"\n"; - - print ".SH NAME\n"; - - print $args{'function'}; - if ($args{'purpose'}) { - print " \\- " . $args{'purpose'} . "\n"; - } else { - print " \\- API function\n"; - } - - print ".SH SYNOPSIS\n"; - print ".B #include <". $args{'include'} . ">\n" - if $args{'include'}; - print ".B #include <". lc((split /_/, $args{'function'})[0]) . ".h>\n" - if $args{'includefuncprefix'}; - print ".sp\n"; - print ".BI \"".$args{'functiontype'}." ".$args{'function'}."("; - $count = 0; - foreach $parameter (@{$args{'parameterlist'}}) { - print $args{'parametertypes'}{$parameter}." \" ".$parameter." \""; - if ($count != $#{$args{'parameterlist'}}) { - $count++; - print ", "; - } - } - print ");\"\n"; - - print ".SH ARGUMENTS\n"; - foreach $parameter (@{$args{'parameterlist'}}) { - print ".IP \"".$args{'parametertypes'}{$parameter}." ".$parameter."\" 12\n"; - $param = $args{'parameters'}{$parameter}; - $param =~ s/-/\\-/g; - output_highlight($param); - } - foreach $section (@{$args{'sectionlist'}}) { - print ".SH \"" . uc($section) . "\"\n"; - $sec = $args{'sections'}{$section}; - $sec =~ s/-/\\-/g; - output_highlight($sec); - } - - if ($args{'bugsto'}) { - print ".SH \"REPORTING BUGS\"\n"; - print "Report bugs to <". $args{'bugsto'} . ">.\n"; - if ($args{'pkgname'}) { - print $args{'pkgname'} . " home page: " . - "http://www.gnu.org/software/" . $args{'module'} . "/\n"; - } - print "General help using GNU software: http://www.gnu.org/gethelp/\n"; - } - - if ($args{'copyright'}) { - print ".SH COPYRIGHT\n"; - print "Copyright \\(co ". $args{'copyright'} . ".\n"; - if ($args{'verbatimcopying'}) { - print ".br\n"; - print "Copying and distribution of this file, with or without modification,\n"; - print "are permitted in any medium without royalty provided the copyright\n"; - print "notice and this notice are preserved.\n"; - } - } - - if ($args{'seeinfo'}) { - print ".SH \"SEE ALSO\"\n"; - print "The full documentation for\n"; - print ".B " . $args{'module'} . "\n"; - print "is maintained as a Texinfo manual. If the\n"; - print ".B info\n"; - print "and\n"; - print ".B " . $args{'module'} . "\n"; - print "programs are properly installed at your site, the command\n"; - print ".IP\n"; - print ".B info " . $args{'seeinfo'} . "\n"; - print ".PP\n"; - print "should give you access to the complete manual.\n"; - } -} - -sub output_listfunc { - my %args = %{$_[0]}; - print $args{'function'} . "\n"; -} - -## -# output in text -sub output_text { - my %args = %{$_[0]}; - my ($parameter, $section); - - print "Function = ".$args{'function'}."\n"; - print " return type: ".$args{'functiontype'}."\n\n"; - foreach $parameter (@{$args{'parameterlist'}}) { - print " ".$args{'parametertypes'}{$parameter}." ".$parameter."\n"; - print " -> ".$args{'parameters'}{$parameter}."\n"; - } - foreach $section (@{$args{'sectionlist'}}) { - print " $section:\n"; - print " -> "; - output_highlight($args{'sections'}{$section}); - } -} - -## -# generic output function - calls the right one based -# on current output mode. -sub output_function { -# output_html(@_); - eval "output_".$output_mode."(\@_);"; -} - - -## -# takes a function prototype and spits out all the details -# stored in the global arrays/hsahes. -sub dump_function { - my $prototype = shift @_; - - if ($prototype =~ m/^()([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/ || - $prototype =~ m/^(\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/ || - $prototype =~ m/^(\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/ || - $prototype =~ m/^(\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/ || - $prototype =~ m/^(\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/ || - $prototype =~ m/^(\w+\s+\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/) { - $return_type = $1; - $function_name = $2; - $args = $3; - -# print STDERR "ARGS = '$args'\n"; - - foreach $arg (split ',', $args) { - # strip leading/trailing spaces - $arg =~ s/^\s*//; - $arg =~ s/\s*$//; -# print STDERR "SCAN ARG: '$arg'\n"; - @args = split('\s', $arg); - -# print STDERR " -> @args\n"; - $param = pop @args; -# print STDERR " -> @args\n"; - if ($param =~ m/^(\*+)(.*)/) { - $param = $2; - push @args, $1; - } - if ($param =~ m/^(.*)(\[\])$/) { - $param = $1; - push @args, $2; - } -# print STDERR " :> @args\n"; - $type = join " ", @args; - - if ($parameters{$param} eq "" && $param != "void") { - $parameters{$param} = "-- undescribed --"; - print STDERR "warning: $lineno: Function parameter '$param' not described in '$function_name'\n"; - } - - push @parameterlist, $param; - $parametertypes{$param} = $type; - -# print STDERR "param = '$param', type = '$type'\n"; - } - } else { - print STDERR "warning: $lineno: Cannot understand prototype: '$prototype'\n"; - return; - } - - if ($function_only==0 || defined($function_table{$function_name})) { - output_function({'function' => $function_name, - 'module' => $modulename, - 'sourceversion' => $sourceversion, - 'include' => $include, - 'includefuncprefix' => $includefuncprefix, - 'bugsto' => $bugsto, - 'pkgname' => $pkgname, - 'copyright' => $copyright, - 'verbatimcopying' => $verbatimcopying, - 'seeinfo' => $seeinfo, - 'functiontype' => $return_type, - 'parameterlist' => \@parameterlist, - 'parameters' => \%parameters, - 'parametertypes' => \%parametertypes, - 'sectionlist' => \@sectionlist, - 'sections' => \%sections, - 'purpose' => $function_purpose - }); - } -} - -###################################################################### -# main -# states -# 0 - normal code -# 1 - looking for function name -# 2 - scanning field start. -# 3 - scanning prototype. -$state = 0; -$section = ""; - -$doc_special = "\@\%\$\#"; - -$doc_start = "^/\\*\\*\$"; -$doc_end = "\\*/"; -$doc_com = "\\s*\\*\\s*"; -$doc_func = $doc_com."(\\w+):?"; -$doc_sect = $doc_com."([".$doc_special."[:upper:]][\\w ]+):\\s*(.*)"; -$doc_content = $doc_com."(.*)"; - -%constants = (); -%parameters = (); -@parameterlist = (); -%sections = (); -@sectionlist = (); - -$contents = ""; -$section_default = "Description"; # default section -$section = $section_default; - -$lineno = 0; -foreach $file (@ARGV) { - if (!open(IN,"<$file")) { - print STDERR "Error: Cannot open file $file\n"; - next; - } - while () { - $lineno++; - - if ($state == 0) { - if (/$doc_start/o) { - $state = 1; # next line is always the function name - } - } elsif ($state == 1) { # this line is the function name (always) - if (/$doc_func/o) { - $function = $1; - $state = 2; - if (/-\s*(.*)/) { - $function_purpose = $1; - } else { - $function_purpose = ""; - } - if ($verbose) { - print STDERR "Info($lineno): Scanning doc for $function\n"; - } - } else { - print STDERR "warning: $lineno: Cannot understand $_ on line $lineno", - " - I thought it was a doc line\n"; - $state = 0; - } - } elsif ($state == 2) { # look for head: lines, and include content - if (/$doc_sect/o) { - $newsection = $1; - $newcontents = $2; - - if ($contents ne "") { - dump_section($section, $contents); - $section = $section_default; - } - - $contents = $newcontents; - if ($contents ne "") { - $contents .= "\n"; - } - $section = $newsection; - } elsif (/$doc_end/) { - - if ($contents ne "") { - dump_section($section, $contents); - $section = $section_default; - $contents = ""; - } - -# print STDERR "end of doc comment, looking for prototype\n"; - $prototype = ""; - $state = 3; - } elsif (/$doc_content/) { - # miguel-style comment kludge, look for blank lines after - # @parameter line to signify start of description - if ($1 eq "" && $section =~ m/^@/) { - dump_section($section, $contents); - $section = $section_default; - $contents = ""; - } else { - $contents .= $1."\n"; - } - } else { - # i dont know - bad line? ignore. - print STDERR "warning: $lineno: Bad line: $_"; - } - } elsif ($state == 3) { # scanning for function { (end of prototype) - if (m#\s*/\*\s+MACDOC\s*#io) { - # do nothing - } - elsif (/([^\{]*)/) { - $prototype .= $1; - } - if (/\{/) { - $prototype =~ s@/\*.*?\*/@@gos; # strip comments. - $prototype =~ s@[\r\n]+@ @gos; # strip newlines/cr's. - $prototype =~ s@^ +@@gos; # strip leading spaces - dump_function($prototype); - - $function = ""; - %constants = (); - %parameters = (); - %parametertypes = (); - @parameterlist = (); - %sections = (); - @sectionlist = (); - $prototype = ""; - - $state = 0; - } - } - } -} diff --git a/oath-toolkit-2.6.6-lockfile.patch b/oath-toolkit-2.6.6-lockfile.patch deleted file mode 100644 index 7c62440..0000000 --- a/oath-toolkit-2.6.6-lockfile.patch +++ /dev/null @@ -1,195 +0,0 @@ -diff --git a/liboath/global.c b/liboath/global.c -index d442cf3..cfe1cee 100644 ---- a/liboath/global.c -+++ b/liboath/global.c -@@ -25,9 +25,12 @@ - - #include /* For snprintf, getline. */ - #include /* For strverscmp. */ -+#include /* For free. */ - - #include "gc.h" - -+char *oath_lockfile_path = NULL; -+ - /** - * oath_init: - * -@@ -52,6 +55,8 @@ oath_init (void) - if (gc_init () != GC_OK) - return OATH_CRYPTO_ERROR; - -+ oath_lockfile_path = NULL; -+ - return OATH_OK; - } - -@@ -71,6 +76,11 @@ oath_done (void) - { - gc_done (); - -+ if (oath_lockfile_path) -+ { -+ free(oath_lockfile_path); -+ oath_lockfile_path = NULL; -+ } - return OATH_OK; - } - -@@ -99,3 +109,23 @@ oath_check_version (const char *req_version) - - return NULL; - } -+ -+int -+oath_set_lockfile_path(const char *lockfile) -+{ -+ int l; -+ -+ if (oath_lockfile_path) -+ { -+ free(oath_lockfile_path); -+ oath_lockfile_path = NULL; -+ } -+ -+ if (lockfile) -+ { -+ l = asprintf (&oath_lockfile_path, "%s", lockfile); -+ if (oath_lockfile_path == NULL || ((size_t) l) != strlen (lockfile)) -+ return OATH_PRINTF_ERROR; -+ } -+ return OATH_OK; -+} -diff --git a/liboath/liboath.map b/liboath/liboath.map -index 2f247ff..e8f8cdf 100644 ---- a/liboath/liboath.map -+++ b/liboath/liboath.map -@@ -75,6 +75,7 @@ LIBOATH_2.2.0 - global: - oath_totp_validate3; - oath_totp_validate3_callback; -+ oath_set_lockfile_path; - } LIBOATH_1.12.0; - - LIBOATH_2.6.0 -diff --git a/liboath/oath.h b/liboath/oath.h -index 04dc23d..5d4c0af 100644 ---- a/liboath/oath.h -+++ b/liboath/oath.h -@@ -155,11 +155,15 @@ typedef enum - - /* Global */ - -+extern char *oath_lockfile_path; -+ - extern OATHAPI int oath_init (void); - extern OATHAPI int oath_done (void); - - extern OATHAPI const char *oath_check_version (const char *req_version); - -+extern OATHAPI int oath_set_lockfile_path(const char *lockfile); -+ - /* Error handling */ - - extern OATHAPI const char *oath_strerror (int err); -diff --git a/liboath/oath.h.in b/liboath/oath.h.in -index 709bb2b..b2f8a0f 100644 ---- a/liboath/oath.h.in -+++ b/liboath/oath.h.in -@@ -155,11 +155,15 @@ typedef enum - - /* Global */ - -+extern char *oath_lockfile_path; -+ - extern OATHAPI int oath_init (void); - extern OATHAPI int oath_done (void); - - extern OATHAPI const char *oath_check_version (const char *req_version); - -+extern OATHAPI int oath_set_lockfile_path(const char *lockfile); -+ - /* Error handling */ - - extern OATHAPI const char *oath_strerror (int err); -diff --git a/liboath/usersfile.c b/liboath/usersfile.c -index 2c51da2..cb6a85f 100644 ---- a/liboath/usersfile.c -+++ b/liboath/usersfile.c -@@ -323,9 +323,18 @@ update_usersfile (const char *usersfile, - { - int l; - -- l = asprintf (&lockfile, "%s.lock", usersfile); -- if (lockfile == NULL || ((size_t) l) != strlen (usersfile) + 5) -- return OATH_PRINTF_ERROR; -+ if (oath_lockfile_path) -+ { -+ l = asprintf (&lockfile, "%s", oath_lockfile_path); -+ if (lockfile == NULL || ((size_t) l) != strlen (oath_lockfile_path)) -+ return OATH_PRINTF_ERROR; -+ } -+ else -+ { -+ l = asprintf (&lockfile, "%s.lock", usersfile); -+ if (lockfile == NULL || ((size_t) l) != strlen (usersfile) + 5) -+ return OATH_PRINTF_ERROR; -+ } - - lockfh = fopen (lockfile, "w"); - if (!lockfh) -diff --git a/pam_oath/pam_oath.c b/pam_oath/pam_oath.c -index ba577b4..c0fd13e 100644 ---- a/pam_oath/pam_oath.c -+++ b/pam_oath/pam_oath.c -@@ -70,6 +70,7 @@ struct cfg - int try_first_pass; - int use_first_pass; - char *usersfile; -+ char *lockfile; - unsigned digits; - unsigned window; - }; -@@ -84,6 +85,7 @@ parse_cfg (int flags, int argc, const char **argv, struct cfg *cfg) - cfg->try_first_pass = 0; - cfg->use_first_pass = 0; - cfg->usersfile = NULL; -+ cfg->lockfile = NULL; - cfg->digits = -1; - cfg->window = 5; - -@@ -99,6 +101,8 @@ parse_cfg (int flags, int argc, const char **argv, struct cfg *cfg) - cfg->use_first_pass = 1; - if (strncmp (argv[i], "usersfile=", 10) == 0) - cfg->usersfile = (char *) argv[i] + 10; -+ if (strncmp (argv[i], "lockfile=", 9) == 0) -+ cfg->lockfile = (char *) argv[i] + 9; - if (strncmp (argv[i], "digits=", 7) == 0) - cfg->digits = atoi (argv[i] + 7); - if (strncmp (argv[i], "window=", 7) == 0) -@@ -124,6 +128,7 @@ parse_cfg (int flags, int argc, const char **argv, struct cfg *cfg) - D (("try_first_pass=%d", cfg->try_first_pass)); - D (("use_first_pass=%d", cfg->use_first_pass)); - D (("usersfile=%s", cfg->usersfile ? cfg->usersfile : "(null)")); -+ D (("lockfile=%s", cfg->lockfile ? cfg->lockfile : "(null)")); - D (("digits=%d", cfg->digits)); - D (("window=%d", cfg->window)); - } -@@ -209,6 +214,17 @@ pam_sm_authenticate (pam_handle_t * pamh, - goto done; - } - -+ if (cfg.lockfile) -+ rc = oath_set_lockfile_path(cfg.lockfile); -+ else -+ rc = oath_set_lockfile_path("/var/lock/pam_oath.lock"); -+ if (rc != OATH_OK) -+ { -+ DBG (("oath_set_lockfile_path() failed (%d)", rc)); -+ retval = PAM_AUTHINFO_UNAVAIL; -+ goto done; -+ } -+ - if (password == NULL) - { - retval = pam_get_item (pamh, PAM_CONV, (const void **) &conv); diff --git a/oath-toolkit-2.6.7-lockfile.patch b/oath-toolkit-2.6.7-lockfile.patch new file mode 100644 index 0000000..0cd459a --- /dev/null +++ b/oath-toolkit-2.6.7-lockfile.patch @@ -0,0 +1,195 @@ +diff --git a/liboath/global.c b/liboath/global.c +index d442cf3..cfe1cee 100644 +--- a/liboath/global.c ++++ b/liboath/global.c +@@ -25,9 +25,12 @@ + + #include /* For snprintf, getline. */ + #include /* For strverscmp. */ ++#include /* For free. */ + + #include "gc.h" + ++char *oath_lockfile_path = NULL; ++ + /** + * oath_init: + * +@@ -52,6 +55,8 @@ oath_init (void) + if (gc_init () != GC_OK) + return OATH_CRYPTO_ERROR; + ++ oath_lockfile_path = NULL; ++ + return OATH_OK; + } + +@@ -71,6 +76,11 @@ oath_done (void) + { + gc_done (); + ++ if (oath_lockfile_path) ++ { ++ free(oath_lockfile_path); ++ oath_lockfile_path = NULL; ++ } + return OATH_OK; + } + +@@ -99,3 +109,23 @@ oath_check_version (const char *req_version) + + return NULL; + } ++ ++int ++oath_set_lockfile_path(const char *lockfile) ++{ ++ int l; ++ ++ if (oath_lockfile_path) ++ { ++ free(oath_lockfile_path); ++ oath_lockfile_path = NULL; ++ } ++ ++ if (lockfile) ++ { ++ l = asprintf (&oath_lockfile_path, "%s", lockfile); ++ if (oath_lockfile_path == NULL || ((size_t) l) != strlen (lockfile)) ++ return OATH_PRINTF_ERROR; ++ } ++ return OATH_OK; ++} +diff --git a/liboath/liboath.map b/liboath/liboath.map +index 2f247ff..e8f8cdf 100644 +--- a/liboath/liboath.map ++++ b/liboath/liboath.map +@@ -75,6 +75,7 @@ LIBOATH_2.2.0 + global: + oath_totp_validate3; + oath_totp_validate3_callback; ++ oath_set_lockfile_path; + } LIBOATH_1.12.0; + + LIBOATH_2.6.0 +diff --git a/liboath/oath.h b/liboath/oath.h +index fe93b9e..6660fb3 100644 +--- a/liboath/oath.h ++++ b/liboath/oath.h +@@ -159,11 +159,15 @@ typedef enum + + /* Global */ + ++extern char *oath_lockfile_path; ++ + extern OATHAPI int oath_init (void); + extern OATHAPI int oath_done (void); + + extern OATHAPI const char *oath_check_version (const char *req_version); + ++extern OATHAPI int oath_set_lockfile_path(const char *lockfile); ++ + /* Error handling */ + + extern OATHAPI const char *oath_strerror (int err); +diff --git a/liboath/oath.h.in b/liboath/oath.h.in +index eee284c..536cd30 100644 +--- a/liboath/oath.h.in ++++ b/liboath/oath.h.in +@@ -159,11 +159,15 @@ typedef enum + + /* Global */ + ++extern char *oath_lockfile_path; ++ + extern OATHAPI int oath_init (void); + extern OATHAPI int oath_done (void); + + extern OATHAPI const char *oath_check_version (const char *req_version); + ++extern OATHAPI int oath_set_lockfile_path(const char *lockfile); ++ + /* Error handling */ + + extern OATHAPI const char *oath_strerror (int err); +diff --git a/liboath/usersfile.c b/liboath/usersfile.c +index ef03f39..7cc4347 100644 +--- a/liboath/usersfile.c ++++ b/liboath/usersfile.c +@@ -323,9 +323,18 @@ update_usersfile (const char *usersfile, + { + int l; + +- l = asprintf (&lockfile, "%s.lock", usersfile); +- if (lockfile == NULL || ((size_t) l) != strlen (usersfile) + 5) +- return OATH_PRINTF_ERROR; ++ if (oath_lockfile_path) ++ { ++ l = asprintf (&lockfile, "%s", oath_lockfile_path); ++ if (lockfile == NULL || ((size_t) l) != strlen (oath_lockfile_path)) ++ return OATH_PRINTF_ERROR; ++ } ++ else ++ { ++ l = asprintf (&lockfile, "%s.lock", usersfile); ++ if (lockfile == NULL || ((size_t) l) != strlen (usersfile) + 5) ++ return OATH_PRINTF_ERROR; ++ } + + lockfh = fopen (lockfile, "w"); + if (!lockfh) +diff --git a/pam_oath/pam_oath.c b/pam_oath/pam_oath.c +index b2afed7..307ffc2 100644 +--- a/pam_oath/pam_oath.c ++++ b/pam_oath/pam_oath.c +@@ -75,6 +75,7 @@ struct cfg + int try_first_pass; + int use_first_pass; + char *usersfile; ++ char *lockfile; + unsigned digits; + unsigned window; + }; +@@ -89,6 +90,7 @@ parse_cfg (int flags, int argc, const char **argv, struct cfg *cfg) + cfg->try_first_pass = 0; + cfg->use_first_pass = 0; + cfg->usersfile = NULL; ++ cfg->lockfile = NULL; + cfg->digits = -1; + cfg->window = 5; + +@@ -104,6 +106,8 @@ parse_cfg (int flags, int argc, const char **argv, struct cfg *cfg) + cfg->use_first_pass = 1; + if (strncmp (argv[i], "usersfile=", 10) == 0) + cfg->usersfile = (char *) argv[i] + 10; ++ if (strncmp (argv[i], "lockfile=", 9) == 0) ++ cfg->lockfile = (char *) argv[i] + 9; + if (strncmp (argv[i], "digits=", 7) == 0) + cfg->digits = atoi (argv[i] + 7); + if (strncmp (argv[i], "window=", 7) == 0) +@@ -129,6 +133,7 @@ parse_cfg (int flags, int argc, const char **argv, struct cfg *cfg) + D (("try_first_pass=%d", cfg->try_first_pass)); + D (("use_first_pass=%d", cfg->use_first_pass)); + D (("usersfile=%s", cfg->usersfile ? cfg->usersfile : "(null)")); ++ D (("lockfile=%s", cfg->lockfile ? cfg->lockfile : "(null)")); + D (("digits=%d", cfg->digits)); + D (("window=%d", cfg->window)); + } +@@ -327,6 +332,17 @@ pam_sm_authenticate (pam_handle_t * pamh, + goto done; + } + ++ if (cfg.lockfile) ++ rc = oath_set_lockfile_path(cfg.lockfile); ++ else ++ rc = oath_set_lockfile_path("/var/lock/pam_oath.lock"); ++ if (rc != OATH_OK) ++ { ++ DBG (("oath_set_lockfile_path() failed (%d)", rc)); ++ retval = PAM_AUTHINFO_UNAVAIL; ++ goto done; ++ } ++ + if (password == NULL) + { + retval = pam_get_item (pamh, PAM_CONV, (const void **) &conv); diff --git a/oath-toolkit.spec b/oath-toolkit.spec index 3adfbbb..4d437d3 100644 --- a/oath-toolkit.spec +++ b/oath-toolkit.spec @@ -1,14 +1,20 @@ Name: oath-toolkit -Version: 2.6.6 -Release: 2%{?dist} +Version: 2.6.7 +Release: 1%{?dist} License: GPLv3+ Summary: One-time password components BuildRequires: make -BuildRequires: pam-devel, gtk-doc, libtool, libtool-ltdl-devel -BuildRequires: xmlsec1-devel, xmlsec1-openssl-devel, autoconf, automake +BuildRequires: pam-devel +BuildRequires: gtk-doc +BuildRequires: libtool +BuildRequires: libtool-ltdl-devel +BuildRequires: xmlsec1-devel +BuildRequires: xmlsec1-openssl-devel +BuildRequires: autoconf +BuildRequires: automake Source0: https://download.savannah.nongnu.org/releases/%{name}/%{name}-%{version}.tar.gz URL: https://www.nongnu.org/oath-toolkit/ -Patch0: oath-toolkit-2.6.6-lockfile.patch +Patch0: oath-toolkit-2.6.7-lockfile.patch %description The OATH Toolkit provide components for building one-time password @@ -176,6 +182,10 @@ mkdir -p -m 0600 %{buildroot}%{_sysconfdir}/liboath %{_libdir}/security/pam_oath.so %changelog +* Mon May 3 2021 Jaroslav Škarvada - 2.6.7-1 +- New version + Resolves: rhbz#1955967 + * Tue Jan 26 2021 Fedora Release Engineering - 2.6.6-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild diff --git a/sources b/sources index 24b6cda..2f0357d 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (oath-toolkit-2.6.6.tar.gz) = f5b6beee6e2afdcb2edfa0046650cb5cc6dee2dc759ce5db3a0350d579d589d35efc51ebcab1f353f103138b7de0ccfb6f3246d0e11ae81f4b31b63cbf9908be +SHA512 (oath-toolkit-2.6.7.tar.gz) = 50edff75c8366887d69cf4740c4cc3bdfc3e43cbd4910ff40f735bca489f0953d7e5a21130f12782ac7a1f2fb00f0db313aff139085f23daba78a69bc7b2eb12