ChangeLog:
authorMoritz Schulte <mo@g10code.com>
Fri, 30 Sep 2005 20:26:09 +0000 (20:26 +0000)
committerMoritz Schulte <mo@g10code.com>
Fri, 30 Sep 2005 20:26:09 +0000 (20:26 +0000)
2005-09-25  Moritz Schulte  <moritz@g10code.com>

* conf: New directory.
* configure.ac (AC_CONFIG_FILES): Added: conf/Makefile.am.
* Makefile.am (SUBDIRS): Added: conf.
* THANKS: updated.

src/ctrl/ChangeLog:

2005-09-30  Moritz Schulte  <moritz@g10code.com>

* poldi-ctrl.c (struct poldi_ctrl_opt): Remove unnecessary, rather
annoying const attributes.
(cmd_add_user): Likewise.

2005-09-27  Moritz Schulte  <moritz@g10code.com>

* poldi-ctrl.c: Adjust to new card_init API; pass zero timeout.

src/common/ChangeLog:

2005-09-26  Moritz Schulte  <moritz@g10code.com>

Thanks to Alessandro Rubini:

* card.c: Include <time.h>.
(wait_for_card): New parameter: TIMEOUT; new variables T0, T;
return 1 in case the specified timeout elapsed without any card
being inserted.
(card_init): New parameter: TIMEOUT; new variable: RET; pass
TIMEOUT to wait_for_card();
* card.h (card_sign): Updated card_init API.

src/pam/ChangeLog:

2005-09-27  Moritz Schulte  <moritz@g10code.com>

* pam_poldi.c (struct pam_poldi_opt): New member: TIMEOUT.
(pam_poldi_opt): Extend struct initialization.
(enum arg_opt_ids): New entry: ARG_WAIT_TIMEOUT.
(pam_poldi_options_cb): Handle ARG_WAIT_TIMEOUT.
(wait_for_card): New variables; TIMEOUT, WAIT; initialize them
depending on FAKE and PAM_POLDI_OPT.TIMEOUT; pass TIMEOUT and WAIT
to card_init.
(lookup_key): Use usersdb_lookup_by_username() instead of
username_to_serialno(); remove const attribute from SERIALNO.
(wait_for_card): Remove const attribute from SERIALNO.
(pam_sm_authenticate): Likewise.
(pam_sm_authenticate): Use usersdb_lookup_by_serialno() instead of
serialno_to_username(); remove const attribute from account.

15 files changed:
ChangeLog
INSTALL
Makefile.am
THANKS
configure.ac
doc/mdate-sh
doc/poldi.texi
doc/texinfo.tex
src/common/ChangeLog
src/common/card.c
src/common/card.h
src/ctrl/ChangeLog
src/ctrl/poldi-ctrl.c
src/pam/ChangeLog
src/pam/pam_poldi.c

index 5c382c2..4838d91 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2005-09-25  Moritz Schulte  <moritz@g10code.com>
+
+       * conf: New directory.
+       * configure.ac (AC_CONFIG_FILES): Added: conf/Makefile.am.
+       * Makefile.am (SUBDIRS): Added: conf.
+       * THANKS: updated.
+
 2005-07-13  Moritz Schulte  <moritz@g10code.com>
 
        * configure.ac: Bump version number up to 0.3-cvs.
diff --git a/INSTALL b/INSTALL
index 54caf7c..095b1eb 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -1,13 +1,16 @@
-Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software
-Foundation, Inc.
+Installation Instructions
+*************************
 
-   This file is free documentation; the Free Software Foundation gives
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004 Free
+Software Foundation, Inc.
+
+This file is free documentation; the Free Software Foundation gives
 unlimited permission to copy, distribute and modify it.
 
 Basic Installation
 ==================
 
-   These are generic installation instructions.
+These are generic installation instructions.
 
    The `configure' shell script attempts to guess correct values for
 various system-dependent variables used during compilation.  It uses
@@ -67,9 +70,9 @@ The simplest way to compile this package is:
 Compilers and Options
 =====================
 
-   Some systems require unusual options for compilation or linking that
-the `configure' script does not know about.  Run `./configure --help'
-for details on some of the pertinent environment variables.
+Some systems require unusual options for compilation or linking that the
+`configure' script does not know about.  Run `./configure --help' for
+details on some of the pertinent environment variables.
 
    You can give `configure' initial values for configuration parameters
 by setting variables in the command line or in the environment.  Here
@@ -82,7 +85,7 @@ is an example:
 Compiling For Multiple Architectures
 ====================================
 
-   You can compile the package for more than one kind of computer at the
+You can compile the package for more than one kind of computer at the
 same time, by placing the object files for each architecture in their
 own directory.  To do this, you must use a version of `make' that
 supports the `VPATH' variable, such as GNU `make'.  `cd' to the
@@ -99,19 +102,19 @@ for another architecture.
 Installation Names
 ==================
 
-   By default, `make install' will install the package's files in
+By default, `make install' will install the package's files in
 `/usr/local/bin', `/usr/local/man', etc.  You can specify an
 installation prefix other than `/usr/local' by giving `configure' the
-option `--prefix=PATH'.
+option `--prefix=PREFIX'.
 
    You can specify separate installation prefixes for
 architecture-specific files and architecture-independent files.  If you
-give `configure' the option `--exec-prefix=PATH', the package will use
-PATH as the prefix for installing programs and libraries.
+give `configure' the option `--exec-prefix=PREFIX', the package will
+use PREFIX as the prefix for installing programs and libraries.
 Documentation and other data files will still use the regular prefix.
 
    In addition, if you use an unusual directory layout you can give
-options like `--bindir=PATH' to specify different values for particular
+options like `--bindir=DIR' to specify different values for particular
 kinds of files.  Run `configure --help' for a list of the directories
 you can set and what kinds of files go in them.
 
@@ -122,7 +125,7 @@ option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
 Optional Features
 =================
 
-   Some packages pay attention to `--enable-FEATURE' options to
+Some packages pay attention to `--enable-FEATURE' options to
 `configure', where FEATURE indicates an optional part of the package.
 They may also pay attention to `--with-PACKAGE' options, where PACKAGE
 is something like `gnu-as' or `x' (for the X Window System).  The
@@ -137,11 +140,11 @@ you can use the `configure' options `--x-includes=DIR' and
 Specifying the System Type
 ==========================
 
-   There may be some features `configure' cannot figure out
-automatically, but needs to determine by the type of machine the package
-will run on.  Usually, assuming the package is built to be run on the
-_same_ architectures, `configure' can figure that out, but if it prints
-message saying it cannot guess the machine type, give it the
+There may be some features `configure' cannot figure out automatically,
+but needs to determine by the type of machine the package will run on.
+Usually, assuming the package is built to be run on the _same_
+architectures, `configure' can figure that out, but if it prints a
+message saying it cannot guess the machine type, give it the
 `--build=TYPE' option.  TYPE can either be a short name for the system
 type, such as `sun4', or a canonical name which has the form:
 
@@ -167,9 +170,9 @@ eventually be run) with `--host=TYPE'.
 Sharing Defaults
 ================
 
-   If you want to set default values for `configure' scripts to share,
-you can create a site shell script called `config.site' that gives
-default values for variables like `CC', `cache_file', and `prefix'.
+If you want to set default values for `configure' scripts to share, you
+can create a site shell script called `config.site' that gives default
+values for variables like `CC', `cache_file', and `prefix'.
 `configure' looks for `PREFIX/share/config.site' if it exists, then
 `PREFIX/etc/config.site' if it exists.  Or, you can set the
 `CONFIG_SITE' environment variable to the location of the site script.
@@ -178,7 +181,7 @@ A warning: not all `configure' scripts look for a site script.
 Defining Variables
 ==================
 
-   Variables not defined in a site shell script can be set in the
+Variables not defined in a site shell script can be set in the
 environment passed to `configure'.  However, some packages may run
 configure again during the build, and the customized values of these
 variables may be lost.  In order to avoid this problem, you should set
@@ -192,8 +195,7 @@ overridden in the site shell script).
 `configure' Invocation
 ======================
 
-   `configure' recognizes the following options to control how it
-operates.
+`configure' recognizes the following options to control how it operates.
 
 `--help'
 `-h'
index 545a48c..985252a 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2004 g10 Code GmbH
+# Copyright (C) 2004, 2005 g10 Code GmbH
 #
 # This file is part of Poldi.
 #
@@ -17,7 +17,7 @@
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 # 02111-1307, USA
 
-SUBDIRS = src doc
+SUBDIRS = src doc conf
 
 install-pam-module:
        $(MAKE) -C src install-pam-module
diff --git a/THANKS b/THANKS
index 32e2efc..32e9aa8 100644 (file)
--- a/THANKS
+++ b/THANKS
@@ -1,3 +1,5 @@
-I'd like to thank the following people for valuable suggestions and lots of testing:
+I'd like to thank the following people for valuable suggestions,
+patches or testing:
 
+       Alessandro Rubini
        Joachim Breitner
index d77a517..3d7351e 100644 (file)
@@ -200,5 +200,6 @@ AC_CONFIG_FILES([Makefile
                 src/libscd/Makefile
                 src/common/Makefile
                 src/pam/Makefile
-                src/ctrl/Makefile])
+                src/ctrl/Makefile
+                conf/Makefile])
 AC_OUTPUT
index 05e828b..881782e 100755 (executable)
@@ -1,9 +1,9 @@
 #!/bin/sh
 # Get modification time of a file or directory and pretty-print it.
 
-scriptversion=2003-11-09.00
+scriptversion=2004-12-08.12
 
-# Copyright (C) 1995, 1996, 1997, 2003  Free Software Foundation, Inc.
+# Copyright (C) 1995, 1996, 1997, 2003, 2004 Free Software Foundation, Inc.
 # written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, June 1995
 #
 # This program is free software; you can redistribute it and/or modify
@@ -80,7 +80,7 @@ fi
 # words should be skipped to get the date.
 
 # On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below.
-set - x`$ls_command /`
+set x`ls -l -d /`
 
 # Find which argument is the month.
 month=
@@ -107,7 +107,7 @@ do
 done
 
 # Get the extended ls output of the file or directory.
-set x`eval "$ls_command \"\$save_arg1\""`
+set x`eval "$ls_command \"\$save_arg1\""`
 
 # Remove all preceding arguments
 eval $command
index 3907902..d6354e1 100644 (file)
@@ -1,5 +1,5 @@
 \input texinfo                  @c -*- Texinfo -*-
-@c Copyright (C) 2000, 2002, 2003, 2004 Free Software Foundation, Inc.
+@c Copyright (C) 2000, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 @c 
 @c This file is part of Poldi.
 @c
@@ -25,7 +25,7 @@ This file documents `Poldi'.
 This is Edition @value{EDITION}, last updated @value{UPDATED}, of
 @cite{The `Poldi Reference Manual}, for Version @value{VERSION}.
 
-Copyright @copyright{} 2004 g10 Code GmbH.
+Copyright @copyright{} 2004, 2005 g10 Code GmbH.
 
 Permission is granted to copy, distribute and/or modify this document
 under the terms of the GNU General Public License as published by the
@@ -46,7 +46,7 @@ section entitled ``Copying''.
 @center for version @value{VERSION}
 @page
 @vskip 0pt plus 1filll
-Copyright @copyright{} 2004 g10 Code GmbH.
+Copyright @copyright{} 2004, 2005 g10 Code GmbH.
 
 Permission is granted to copy, distribute and/or modify this document
 under the terms of the GNU General Public License as published by the
@@ -65,7 +65,7 @@ This is Edition @value{EDITION}, last updated @value{UPDATED}, of
 @cite{The `Poldi Reference Manual}, for Version
 @value{VERSION} of Poldi.
 
-Copyright @copyright{} 2004 g10 Code GmbH.
+Copyright @copyright{} 2004, 2005 g10 Code GmbH.
 
 Permission is granted to copy, distribute and/or modify this document
 under the terms of the GNU General Public License as published by the
index 6c8536c..c93912a 100644 (file)
@@ -3,7 +3,7 @@
 % Load plain if necessary, i.e., if running under initex.
 \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
 %
-\def\texinfoversion{2004-05-16.08}
+\def\texinfoversion{2004-11-25.16}
 %
 % Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
 % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
 \let\ptexhat=^
 \let\ptexi=\i
 \let\ptexindent=\indent
-\let\ptexnoindent=\noindent
 \let\ptexinsert=\insert
 \let\ptexlbrace=\{
 \let\ptexless=<
+\let\ptexnewwrite\newwrite
+\let\ptexnoindent=\noindent
 \let\ptexplus=+
 \let\ptexrbrace=\}
 \let\ptexslash=\/
 % The \TeX{} logo, as in plain, but resetting the spacing so that a
 % period following counts as ending a sentence.  (Idea found in latex.)
 %
-\edef\TeX{\TeX \spacefactor=3000 }
+\edef\TeX{\TeX \spacefactor=1000 }
 
 % @LaTeX{} logo.  Not quite the same results as the definition in
 % latex.ltx, since we use a different font for the raised A; it's most
@@ -1242,13 +1243,13 @@ where each line of input produces a line of output.}
       % Read toc silently, to get counts of subentries for \pdfoutline.
       \def\numchapentry##1##2##3##4{%
        \def\thischapnum{##2}%
-       \let\thissecnum\empty
-       \let\thissubsecnum\empty
+       \def\thissecnum{0}%
+       \def\thissubsecnum{0}%
       }%
       \def\numsecentry##1##2##3##4{%
        \advancenumber{chap\thischapnum}%
        \def\thissecnum{##2}%
-       \let\thissubsecnum\empty
+       \def\thissubsecnum{0}%
       }%
       \def\numsubsecentry##1##2##3##4{%
        \advancenumber{sec\thissecnum}%
@@ -1257,9 +1258,9 @@ where each line of input produces a line of output.}
       \def\numsubsubsecentry##1##2##3##4{%
        \advancenumber{subsec\thissubsecnum}%
       }%
-      \let\thischapnum\empty
-      \let\thissecnum\empty
-      \let\thissubsecnum\empty
+      \def\thischapnum{0}%
+      \def\thissecnum{0}%
+      \def\thissubsecnum{0}%
       %
       % use \def rather than \let here because we redefine \chapentry et
       % al. a second time, below.
@@ -1406,7 +1407,7 @@ where each line of input produces a line of output.}
 \def\rm{\fam=0 \setfontstyle{rm}}
 \def\it{\fam=\itfam \setfontstyle{it}}
 \def\sl{\fam=\slfam \setfontstyle{sl}}
-\def\bf{\fam=\bffam \setfontstyle{bf}}
+\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
 \def\tt{\fam=\ttfam \setfontstyle{tt}}
 
 % Texinfo sort of supports the sans serif font style, which plain TeX does not.
@@ -1468,17 +1469,10 @@ where each line of input produces a line of output.}
 \def\scbshape{csc}
 
 % Text fonts (11.2pt, magstep1).
-\newcount\mainmagstep
-\ifx\bigger\relax
-  % not really supported.
-  \mainmagstep=\magstep1
-  \setfont\textrm\rmshape{12}{1000}
-  \setfont\texttt\ttshape{12}{1000}
-\else
-  \mainmagstep=\magstephalf
-  \setfont\textrm\rmshape{10}{\mainmagstep}
-  \setfont\texttt\ttshape{10}{\mainmagstep}
-\fi
+\def\textnominalsize{11pt}
+\edef\mainmagstep{\magstephalf}
+\setfont\textrm\rmshape{10}{\mainmagstep}
+\setfont\texttt\ttshape{10}{\mainmagstep}
 \setfont\textbf\bfshape{10}{\mainmagstep}
 \setfont\textit\itshape{10}{\mainmagstep}
 \setfont\textsl\slshape{10}{\mainmagstep}
@@ -1495,6 +1489,7 @@ where each line of input produces a line of output.}
 \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
 
 % Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
 \setfont\smallrm\rmshape{9}{1000}
 \setfont\smalltt\ttshape{9}{1000}
 \setfont\smallbf\bfshape{10}{900}
@@ -1507,6 +1502,7 @@ where each line of input produces a line of output.}
 \font\smallsy=cmsy9
 
 % Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
 \setfont\smallerrm\rmshape{8}{1000}
 \setfont\smallertt\ttshape{8}{1000}
 \setfont\smallerbf\bfshape{10}{800}
@@ -1519,6 +1515,7 @@ where each line of input produces a line of output.}
 \font\smallersy=cmsy8
 
 % Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
 \setfont\titlerm\rmbshape{12}{\magstep3}
 \setfont\titleit\itbshape{10}{\magstep4}
 \setfont\titlesl\slbshape{10}{\magstep4}
@@ -1533,6 +1530,7 @@ where each line of input produces a line of output.}
 \def\authortt{\sectt}
 
 % Chapter (and unnumbered) fonts (17.28pt).
+\def\chapnominalsize{17pt}
 \setfont\chaprm\rmbshape{12}{\magstep2}
 \setfont\chapit\itbshape{10}{\magstep3}
 \setfont\chapsl\slbshape{10}{\magstep3}
@@ -1545,6 +1543,7 @@ where each line of input produces a line of output.}
 \font\chapsy=cmsy10 scaled \magstep3
 
 % Section fonts (14.4pt).
+\def\secnominalsize{14pt}
 \setfont\secrm\rmbshape{12}{\magstep1}
 \setfont\secit\itbshape{10}{\magstep2}
 \setfont\secsl\slbshape{10}{\magstep2}
@@ -1557,6 +1556,7 @@ where each line of input produces a line of output.}
 \font\secsy=cmsy10 scaled \magstep2
 
 % Subsection fonts (13.15pt).
+\def\ssecnominalsize{13pt}
 \setfont\ssecrm\rmbshape{12}{\magstephalf}
 \setfont\ssecit\itbshape{10}{1315}
 \setfont\ssecsl\slbshape{10}{1315}
@@ -1569,6 +1569,7 @@ where each line of input produces a line of output.}
 \font\ssecsy=cmsy10 scaled 1315
 
 % Reduced fonts for @acro in text (10pt).
+\def\reducednominalsize{10pt}
 \setfont\reducedrm\rmshape{10}{1000}
 \setfont\reducedtt\ttshape{10}{1000}
 \setfont\reducedbf\bfshape{10}{1000}
@@ -1608,6 +1609,7 @@ where each line of input produces a line of output.}
   \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
   \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
   \let\tenttsl=\textttsl
+  \def\curfontsize{text}%
   \def\lsize{reduced}\def\lllsize{smaller}%
   \resetmathfonts \setleading{\textleading}}
 \def\titlefonts{%
@@ -1615,13 +1617,16 @@ where each line of input produces a line of output.}
   \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
   \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
   \let\tenttsl=\titlettsl
+  \def\curfontsize{title}%
   \def\lsize{chap}\def\lllsize{subsec}%
   \resetmathfonts \setleading{25pt}}
 \def\titlefont#1{{\titlefonts\rm #1}}
 \def\chapfonts{%
   \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
   \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
-  \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl
+  \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
+  \let\tenttsl=\chapttsl
+  \def\curfontsize{chap}%
   \def\lsize{sec}\def\lllsize{text}%
   \resetmathfonts \setleading{19pt}}
 \def\secfonts{%
@@ -1629,6 +1634,7 @@ where each line of input produces a line of output.}
   \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
   \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
   \let\tenttsl=\secttsl
+  \def\curfontsize{sec}%
   \def\lsize{subsec}\def\lllsize{reduced}%
   \resetmathfonts \setleading{16pt}}
 \def\subsecfonts{%
@@ -1636,6 +1642,7 @@ where each line of input produces a line of output.}
   \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
   \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
   \let\tenttsl=\ssecttsl
+  \def\curfontsize{ssec}%
   \def\lsize{text}\def\lllsize{small}%
   \resetmathfonts \setleading{15pt}}
 \let\subsubsecfonts = \subsecfonts
@@ -1644,6 +1651,7 @@ where each line of input produces a line of output.}
   \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
   \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
   \let\tenttsl=\reducedttsl
+  \def\curfontsize{reduced}%
   \def\lsize{small}\def\lllsize{smaller}%
   \resetmathfonts \setleading{10.5pt}}
 \def\smallfonts{%
@@ -1651,6 +1659,7 @@ where each line of input produces a line of output.}
   \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
   \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
   \let\tenttsl=\smallttsl
+  \def\curfontsize{small}%
   \def\lsize{smaller}\def\lllsize{smaller}%
   \resetmathfonts \setleading{10.5pt}}
 \def\smallerfonts{%
@@ -1658,6 +1667,7 @@ where each line of input produces a line of output.}
   \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
   \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
   \let\tenttsl=\smallerttsl
+  \def\curfontsize{smaller}%
   \def\lsize{smaller}\def\lllsize{smaller}%
   \resetmathfonts \setleading{9.5pt}}
 
@@ -1715,13 +1725,18 @@ where each line of input produces a line of output.}
 \def\cite#1{{\sl #1}\futurelet\next\smartitalicx}
 
 \let\i=\smartitalic
+\let\slanted=\smartslanted
 \let\var=\smartslanted
 \let\dfn=\smartslanted
 \let\emph=\smartitalic
 
+% @b, explicit bold.
 \def\b#1{{\bf #1}}
 \let\strong=\b
 
+% @sansserif, explicit sans.
+\def\sansserif#1{{\sf #1}}
+
 % We can't just use \exhyphenpenalty, because that only has effect at
 % the end of a paragraph.  Restore normal hyphenation at the end of the
 % group within which \nohyphenation is presumably called.
@@ -1929,6 +1944,10 @@ where each line of input produces a line of output.}
 \def\sc#1{{\smallcaps#1}}       % smallcaps font
 \def\ii#1{{\it #1}}             % italic font
 
+% @acronym for "FBI", "NATO", and the like.
+% We print this one point size smaller, since it's intended for
+% all-uppercase.
+% 
 \def\acronym#1{\doacronym #1,,\finish}
 \def\doacronym#1,#2,#3\finish{%
   {\selectfonts\lsize #1}%
@@ -1938,10 +1957,70 @@ where each line of input produces a line of output.}
   \fi
 }
 
-% @pounds{} is a sterling sign, which is in the CM italic font.
+% @abbr for "Comput. J." and the like.
+% No font change, but don't do end-of-sentence spacing.
+% 
+\def\abbr#1{\doabbr #1,,\finish}
+\def\doabbr#1,#2,#3\finish{%
+  {\frenchspacing #1}%
+  \def\temp{#2}%
+  \ifx\temp\empty \else
+    \space ({\unsepspaces \ignorespaces \temp \unskip})%
+  \fi
+}
+
+% @pounds{} is a sterling sign, which Knuth put in the CM italic font.
 %
 \def\pounds{{\it\$}}
 
+% @euro{} comes from a separate font, depending on the current style.
+% We use the free feym* fonts from the eurosym package by Henrik
+% Theiling, which support regular, slanted, bold and bold slanted (and
+% "outlined" (blackboard board, sort of) versions, which we don't need).
+% It is available from http://www.ctan.org/tex-archive/fonts/eurosym.
+% 
+% Although only regular is the truly official Euro symbol, we ignore
+% that.  The Euro is designed to be slightly taller than the regular
+% font height.
+% 
+% feymr - regular
+% feymo - slanted
+% feybr - bold
+% feybo - bold slanted
+% 
+% There is no good (free) typewriter version, to my knowledge.
+% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.
+% Hmm.
+% 
+% Also doesn't work in math.  Do we need to do math with euro symbols?
+% Hope not.
+% 
+% 
+\def\euro{{\eurofont e}}
+\def\eurofont{%
+  % We set the font at each command, rather than predefining it in
+  % \textfonts and the other font-switching commands, so that
+  % installations which never need the symbold don't have to have the
+  % font installed.
+  % 
+  % There is only one designed size (nominal 10pt), so we always scale
+  % that to the current nominal size.
+  % 
+  % By the way, simply using "at 1em" works for cmr10 and the like, but
+  % does not work for cmbx10 and other extended/shrunken fonts.
+  % 
+  \def\eurosize{\csname\curfontsize nominalsize\endcsname}%
+  %
+  \ifx\curfontstyle\bfstylename 
+    % bold:
+    \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize
+  \else 
+    % regular:
+    \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize
+  \fi
+  \thiseurofont
+}
+
 % @registeredsymbol - R in a circle.  The font for the R should really
 % be smaller yet, but lllsize is the best we can do for now.
 % Adapted from the plain.tex definition of \copyright.
@@ -2265,17 +2344,13 @@ where each line of input produces a line of output.}
     % \parskip glue -- logically it's part of the @item we just started.
     \nobreak \vskip-\parskip
     %
-    % Stop a page break at the \parskip glue coming up.  (Unfortunately
-    % we can't prevent a possible page break at the following
-    % \baselineskip glue.)  However, if what follows is an environment
-    % such as @example, there will be no \parskip glue; then
-    % the negative vskip we just would cause the example and the item to
-    % crash together.  So we use this bizarre value of 10001 as a signal
-    % to \aboveenvbreak to insert \parskip glue after all.
-    % (Possibly there are other commands that could be followed by
-    % @example which need the same treatment, but not section titles; or
-    % maybe section titles are the only special case and they should be
-    % penalty 10001...)
+    % Stop a page break at the \parskip glue coming up.  However, if
+    % what follows is an environment such as @example, there will be no
+    % \parskip glue; then the negative vskip we just inserted would
+    % cause the example and the item to crash together.  So we use this
+    % bizarre value of 10001 as a signal to \aboveenvbreak to insert
+    % \parskip glue after all.  Section titles are handled this way also.
+    % 
     \penalty 10001
     \endgroup
     \itemxneedsnegativevskipfalse
@@ -2301,15 +2376,26 @@ where each line of input produces a line of output.}
 % @table, @ftable, @vtable.
 \envdef\table{%
   \let\itemindex\gobble
-  \tablex
+  \tablecheck{table}%
 }
 \envdef\ftable{%
   \def\itemindex ##1{\doind {fn}{\code{##1}}}%
-  \tablex
+  \tablecheck{ftable}%
 }
 \envdef\vtable{%
   \def\itemindex ##1{\doind {vr}{\code{##1}}}%
-  \tablex
+  \tablecheck{vtable}%
+}
+\def\tablecheck#1{%
+  \ifnum \the\catcode`\^^M=\active
+    \endgroup
+    \errmessage{This command won't work in this context; perhaps the problem is
+      that we are \inenvironment\thisenv}%
+    \def\next{\doignore{#1}}%
+  \else
+    \let\next\tablex
+  \fi
+  \next
 }
 \def\tablex#1{%
   \def\itemindicate{#1}%
@@ -2620,7 +2706,10 @@ where each line of input produces a line of output.}
   \startsavinginserts
   %
   % @item within a multitable starts a normal row.
-  \let\item\crcr
+  % We use \def instead of \let so that if one of the multitable entries
+  % contains an @itemize, we don't choke on the \item (seen as \crcr aka
+  % \endtemplate) expanding \doitemize.
+  \def\item{\crcr}%
   %
   \tolerance=9500
   \hbadness=9500
@@ -2705,19 +2794,17 @@ where each line of input produces a line of output.}
   \global\setpercentfalse
 }
 
-\def\setmultitablespacing{% test to see if user has set \multitablelinespace.
-% If so, do nothing. If not, give it an appropriate dimension based on
-% current baselineskip.
+\def\setmultitablespacing{%
+  \def\multistrut{\strut}% just use the standard line spacing
+  %
+  % Compute \multitablelinespace (if not defined by user) for use in
+  % \multitableparskip calculation.  We used define \multistrut based on
+  % this, but (ironically) that caused the spacing to be off.
+  % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
 \ifdim\multitablelinespace=0pt
 \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
 \global\advance\multitablelinespace by-\ht0
-%% strut to put in table in case some entry doesn't have descenders,
-%% to keep lines equally spaced
-\let\multistrut = \strut
-\else
-%% FIXME: what is \box0 supposed to be?
-\gdef\multistrut{\vrule height\multitablelinespace depth\dp0
-width0pt\relax} \fi
+\fi
 %% Test to see if parskip is larger than space between lines of
 %% table. If not, do nothing.
 %%        If so, set to same dimension as multitablelinespace.
@@ -2786,14 +2873,14 @@ width0pt\relax} \fi
   \doignorecount = 0
   %
   % Swallow text until we reach the matching `@end #1'.
-  \dodoignore {#1}%
+  \dodoignore{#1}%
 }
 
 { \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
   \obeylines %
   %
   \gdef\dodoignore#1{%
-    % #1 contains the string `ifinfo'.
+    % #1 contains the command name as a string, e.g., `ifinfo'.
     %
     % Define a command to find the next `@end #1', which must be on a line
     % by itself.
@@ -2947,9 +3034,8 @@ width0pt\relax} \fi
 % Index generation facilities
 
 % Define \newwrite to be identical to plain tex's \newwrite
-% except not \outer, so it can be used within \newindex.
-{\catcode`\@=11
-\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}}
+% except not \outer, so it can be used within macros and \if's.
+\edef\newwrite{\makecsname{ptexnewwrite}}
 
 % \newindex {foo} defines an index named foo.
 % It automatically defines \fooindex such that
@@ -3134,12 +3220,14 @@ width0pt\relax} \fi
   %
   % Assorted special characters.
   \definedummyword{bullet}%
+  \definedummyword{comma}%
   \definedummyword{copyright}%
   \definedummyword{registeredsymbol}%
   \definedummyword{dots}%
   \definedummyword{enddots}%
   \definedummyword{equiv}%
   \definedummyword{error}%
+  \definedummyword{euro}%
   \definedummyword{expansion}%
   \definedummyword{minus}%
   \definedummyword{pounds}%
@@ -3271,12 +3359,14 @@ width0pt\relax} \fi
   % Assorted special characters.
   % (The following {} will end up in the sort string, but that's ok.)
   \def\bullet{bullet}%
+  \def\comma{,}%
   \def\copyright{copyright}%
   \def\registeredsymbol{R}%
   \def\dots{...}%
   \def\enddots{...}%
   \def\equiv{==}%
   \def\error{error}%
+  \def\euro{euro}%
   \def\expansion{==>}%
   \def\minus{-}%
   \def\pounds{pounds}%
@@ -3406,17 +3496,18 @@ width0pt\relax} \fi
   \dosubindwrite
   %
   \ifx\lastskipmacro\zeroskipmacro
-    % if \lastskip was zero, perhaps the last item was a
-    % penalty, and perhaps it was >=10000, e.g., a \nobreak.
-    % In that case, we want to re-insert the penalty; since we
-    % just inserted a non-discardable item, any following glue
-    % (such as a \parskip) would be a breakpoint.  For example:
+    % If \lastskip was zero, perhaps the last item was a penalty, and
+    % perhaps it was >=10000, e.g., a \nobreak.  In that case, we want
+    % to re-insert the same penalty (values >10000 are used for various
+    % signals); since we just inserted a non-discardable item, any
+    % following glue (such as a \parskip) would be a breakpoint.  For example:
+    % 
     %   @deffn deffn-whatever
     %   @vindex index-whatever
     %   Description.
     % would allow a break between the index-whatever whatsit
     % and the "Description." paragraph.
-    \ifnum\count255>9999 \nobreak \fi
+    \ifnum\count255>9999 \penalty\count255 \fi
   \else
     % On the other hand, if we had a nonzero \lastskip,
     % this make-up glue would be preceded by a non-discardable item
@@ -3514,7 +3605,10 @@ width0pt\relax} \fi
   \removelastskip
   %
   % We like breaks before the index initials, so insert a bonus.
-  \penalty -300
+  \nobreak
+  \vskip 0pt plus 3\baselineskip
+  \penalty 0
+  \vskip 0pt plus -3\baselineskip
   %
   % Typeset the initial.  Making this add up to a whole number of
   % baselineskips increases the chance of the dots lining up from column
@@ -3524,10 +3618,9 @@ width0pt\relax} \fi
   % No shrink because it confuses \balancecolumns.
   \vskip 1.67\baselineskip plus .5\baselineskip
   \leftline{\secbf #1}%
-  \vskip .33\baselineskip plus .1\baselineskip
-  %
   % Do our best not to break after the initial.
   \nobreak
+  \vskip .33\baselineskip plus .1\baselineskip
 }}
 
 % \entry typesets a paragraph consisting of the text (#1), dot leaders, and
@@ -4348,14 +4441,14 @@ width0pt\relax} \fi
   % glue accumulate.  (Not a breakpoint because it's preceded by a
   % discardable item.)
   \vskip-\parskip
-  %
-  % This \nobreak is purely so the last item on the list is a \penalty
-  % of 10000.  This is so other code, for instance \parsebodycommon, can
-  % check for and avoid allowing breakpoints.  Otherwise, it would
-  % insert a valid breakpoint between:
+  % 
+  % This is purely so the last item on the list is a known \penalty >
+  % 10000.  This is so \startdefun can avoid allowing breakpoints after
+  % section headings.  Otherwise, it would insert a valid breakpoint between:
+  % 
   %   @section sec-whatever
   %   @deffn def-whatever
-  \nobreak
+  \penalty 10001
 }
 
 
@@ -4700,7 +4793,8 @@ width0pt\relax} \fi
 % start of the next paragraph will insert \parskip.
 %
 \def\aboveenvbreak{{%
-  % =10000 instead of <10000 because of a special case in \itemzzz, q.v.
+  % =10000 instead of <10000 because of a special case in \itemzzz and
+  % \sectionheading, q.v.
   \ifnum \lastpenalty=10000 \else
     \advance\envskipamount by \parskip
     \endgraf
@@ -5061,8 +5155,7 @@ width0pt\relax} \fi
 }
 
 % @copying ... @end copying.
-% Save the text away for @insertcopying later.  Many commands won't be
-% allowed in this context, but that's ok.
+% Save the text away for @insertcopying later.
 %
 % We save the uninterpreted tokens, rather than creating a box.
 % Saving the text in a box would be much easier, but then all the
@@ -5071,62 +5164,14 @@ width0pt\relax} \fi
 % file; b) letting users define the frontmatter in as flexible order as
 % possible is very desirable.
 %
-\def\copying{\begingroup
-  % Define a command to swallow text until we reach `@end copying'.
-  % \ is the escape char in this texinfo.tex file, so it is the
-  % delimiter for the command; @ will be the escape char when we read
-  % it, but that doesn't matter.
-  \long\def\docopying##1\end copying{\gdef\copyingtext{##1}\enddocopying}%
-  %
-  % We must preserve ^^M's in the input file; see \insertcopying below.
-  \catcode`\^^M = \active
-  \docopying
-}
-
-% What we do to finish off the copying text.
-%
-\def\enddocopying{\endgroup\ignorespaces}
-
-% @insertcopying.  Here we must play games with ^^M's.  On the one hand,
-% we need them to delimit commands such as `@end quotation', so they
-% must be active.  On the other hand, we certainly don't want every
-% end-of-line to be a \par, as would happen with the normal active
-% definition of ^^M.  On the third hand, two ^^M's in a row should still
-% generate a \par.
-%
-% Our approach is to make ^^M insert a space and a penalty1 normally;
-% then it can also check if \lastpenalty=1.  If it does, then manually
-% do \par.
-%
-% This messes up the normal definitions of @c[omment], so we redefine
-% it.  Similarly for @ignore.  (These commands are used in the gcc
-% manual for man page generation.)
-%
-% Seems pretty fragile, most line-oriented commands will presumably
-% fail, but for the limited use of getting the copying text (which
-% should be quite simple) inserted, we can hope it's ok.
-%
-{\catcode`\^^M=\active %
-\gdef\insertcopying{\begingroup %
-  \parindent = 0pt  % looks wrong on title page
-  \def^^M{%
-    \ifnum \lastpenalty=1 %
-      \par %
-    \else %
-      \space \penalty 1 %
-    \fi %
-  }%
-  %
-  % Fix @c[omment] for catcode 13 ^^M's.
-  \def\c##1^^M{\ignorespaces}%
-  \let\comment = \c %
-  %
-  % Don't bother jumping through all the hoops that \doignore does, it
-  % would be very hard since the catcodes are already set.
-  \long\def\ignore##1\end ignore{\ignorespaces}%
-  %
-  \copyingtext %
-\endgroup}%
+\def\copying{\checkenv{}\begingroup\scanargctxt\docopying}
+\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}
+%
+\def\insertcopying{%
+  \begingroup
+    \parindent = 0pt  % paragraph indentation looks wrong on title page
+    \scanexp\copyingtext
+  \endgroup
 }
 
 \message{defuns,}
@@ -5144,10 +5189,11 @@ width0pt\relax} \fi
     % If there are two @def commands in a row, we'll have a \nobreak,
     % which is there to keep the function description together with its
     % header.  But if there's nothing but headers, we need to allow a
-    % break somewhere.  Check for penalty 10002 (inserted by
-    % \defargscommonending) instead of 10000, since the sectioning
-    % commands insert a \penalty10000, and we don't want to allow a break
-    % between a section heading and a defun.
+    % break somewhere.  Check specifically for penalty 10002, inserted
+    % by \defargscommonending, instead of 10000, since the sectioning
+    % commands also insert a nobreak penalty, and we don't want to allow
+    % a break between a section heading and a defun.
+    % 
     \ifnum\lastpenalty=10002 \penalty2000 \fi
     %
     % Similarly, after a section heading, do not allow a break.
@@ -5471,7 +5517,7 @@ width0pt\relax} \fi
 \ifx\eTeXversion\undefined
   \newwrite\macscribble
   \def\scantokens#1{%
-    \toks0={#1\endinput}%
+    \toks0={#1}%
     \immediate\openout\macscribble=\jobname.tmp
     \immediate\write\macscribble{\the\toks0}%
     \immediate\closeout\macscribble
@@ -5484,7 +5530,11 @@ width0pt\relax} \fi
     \newlinechar`\^^M
     \let\xeatspaces\eatspaces
     % Undo catcode changes of \startcontents and \doprintindex
-    \catcode`\@=0 \catcode`\\=\other \escapechar=`\@
+    % When called from @insertcopying or (short)caption, we need active
+    % backslash to get it printed correctly.  Previously, we had
+    % \catcode`\\=\other instead.  We'll see whether a problem appears
+    % with macro expansion.                            --kasal, 19aug04
+    \catcode`\@=0 \catcode`\\=\active \escapechar=`\@
     % ... and \example
     \spaceisspace
     %
@@ -5496,6 +5546,11 @@ width0pt\relax} \fi
   \endgroup
 }
 
+\def\scanexp#1{%
+  \edef\temp{\noexpand\scanmacro{#1}}%
+  \temp
+}
+
 \newcount\paramno   % Count of parameters
 \newtoks\macname    % Macro name
 \newif\ifrecursive  % Is it recursive?
@@ -5503,13 +5558,15 @@ width0pt\relax} \fi
                     % \do\macro1\do\macro2...
 
 % Utility routines.
-% This does \let #1 = #2, except with \csnames.
+% This does \let #1 = #2, with \csnames; that is,
+%   \let \csname#1\endcsname = \csname#2\endcsname
+% (except of course we have to play expansion games).
+% 
 \def\cslet#1#2{%
-\expandafter\expandafter
-\expandafter\let
-\expandafter\expandafter
-\csname#1\endcsname
-\csname#2\endcsname}
+  \expandafter\let
+  \csname#1\expandafter\endcsname
+  \csname#2\endcsname
+}
 
 % Trim leading and trailing spaces off a string.
 % Concepts from aro-bend problem 15 (see CTAN).
@@ -5536,30 +5593,36 @@ width0pt\relax} \fi
 % done by  making ^^M (\endlinechar) catcode 12 when reading the macro
 % body, and then making it the \newlinechar in \scanmacro.
 
-\def\macrobodyctxt{%
-  \catcode`\~=\other
+\def\scanctxt{%
+  \catcode`\"=\other
+  \catcode`\+=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\@=\other
   \catcode`\^=\other
   \catcode`\_=\other
   \catcode`\|=\other
-  \catcode`\<=\other
-  \catcode`\>=\other
-  \catcode`\+=\other
+  \catcode`\~=\other
+}
+
+\def\scanargctxt{%
+  \scanctxt
+  \catcode`\\=\other
+  \catcode`\^^M=\other
+}
+
+\def\macrobodyctxt{%
+  \scanctxt
   \catcode`\{=\other
   \catcode`\}=\other
-  \catcode`\@=\other
   \catcode`\^^M=\other
-  \usembodybackslash}
+  \usembodybackslash
+}
 
 \def\macroargctxt{%
-  \catcode`\~=\other
-  \catcode`\^=\other
-  \catcode`\_=\other
-  \catcode`\|=\other
-  \catcode`\<=\other
-  \catcode`\>=\other
-  \catcode`\+=\other
-  \catcode`\@=\other
-  \catcode`\\=\other}
+  \scanctxt
+  \catcode`\\=\other
+}
 
 % \mbodybackslash is the definition of \ in @macro bodies.
 % It maps \foo\ => \csname macarg.foo\endcsname => #N
@@ -6365,11 +6428,14 @@ width0pt\relax} \fi
 \endgroup}
 
 
-% @float FLOATTYPE,LOC ... @end float for displayed figures, tables, etc.
-% We don't actually implement floating yet, we just plop the float "here".
-% But it seemed the best name for the future.
+% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables,
+% etc.  We don't actually implement floating yet, we always include the
+% float "here".  But it seemed the best name for the future.
 %
-\envparseargdef\float{\dofloat #1,,,\finish}
+\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish}
+
+% There may be a space before second and/or third parameter; delete it.
+\def\eatcommaspace#1, {#1,}
 
 % #1 is the optional FLOATTYPE, the text label for this float, typically
 % "Figure", "Table", "Example", etc.  Can't contain commas.  If omitted,
@@ -6390,6 +6456,10 @@ width0pt\relax} \fi
   \let\thisshortcaption=\empty
   %
   % don't lose footnotes inside @float.
+  %
+  % BEWARE: when the floats start float, we have to issue warning whenever an
+  % insert appears inside a float which could possibly float. --kasal, 26may04
+  %
   \startsavinginserts
   %
   % We can't be used inside a paragraph.
@@ -6474,7 +6544,7 @@ width0pt\relax} \fi
       \fi
       %
       % caption text.
-      \appendtomacro\captionline\thiscaption
+      \appendtomacro\captionline{\scanexp\thiscaption}%
     \fi
     %
     % If we have anything to print, print it, with space before.
@@ -6482,6 +6552,9 @@ width0pt\relax} \fi
     \ifx\captionline\empty \else
       \vskip.5\parskip
       \captionline
+      %
+      % Space below caption.
+      \vskip\parskip
     \fi
     %
     % If have an xref label, write the list of floats info.  Do this
@@ -6492,37 +6565,44 @@ width0pt\relax} \fi
       % caption if specified, else the full caption if specified, else nothing.
       {%
         \atdummies \turnoffactive \otherbackslash
-        \immediate\write\auxfile{@xrdef{\floatlabel-lof}{%
-          \floatident
-          \ifx\thisshortcaption\empty
-            \ifx\thiscaption\empty \else : \thiscaption \fi
-          \else
-            : \thisshortcaption
-          \fi
-        }}%
+        % since we read the caption text in the macro world, where ^^M
+        % is turned into a normal character, we have to scan it back, so
+        % we don't write the literal three characters "^^M" into the aux file.
+       \scanexp{%
+         \xdef\noexpand\gtemp{%
+           \ifx\thisshortcaption\empty
+             \thiscaption
+           \else
+             \thisshortcaption
+           \fi
+         }%
+       }%
+        \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident
+         \ifx\gtemp\empty \else : \gtemp \fi}}%
       }%
     \fi
-    %
-    % Space below caption, if we printed anything.
-    \ifx\printedsomething\empty \else \vskip\parskip \fi
   \egroup  % end of \vtop
+  %
+  % place the captured inserts
+  %
+  % BEWARE: when the floats start float, we have to issue warning whenever an
+  % insert appears inside a float which could possibly float. --kasal, 26may04
+  %
   \checkinserts
 }
 
 % Append the tokens #2 to the definition of macro #1, not expanding either.
 %
-\newtoks\appendtomacroAtoks
-\newtoks\appendtomacroBtoks
 \def\appendtomacro#1#2{%
-  \appendtomacroAtoks = \expandafter{#1}%
-  \appendtomacroBtoks = {#2}%
-  \edef#1{\the\appendtomacroAtoks \the\appendtomacroBtoks}%
+  \expandafter\def\expandafter#1\expandafter{#1#2}%
 }
 
-% @caption, @shortcaption are easy.
+% @caption, @shortcaption
 %
-\long\def\caption#1{\checkenv\float \def\thiscaption{#1}}
-\def\shortcaption#1{\checkenv\float \def\thisshortcaption{#1}}
+\def\caption{\docaption\thiscaption}
+\def\shortcaption{\docaption\thisshortcaption}
+\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption}
+\def\defcaption#1#2{\egroup \def#1{#2}}
 
 % The parameter is the control sequence identifying the counter we are
 % going to use.  Create it if it doesn't exist and assign it to \floatno.
index 2edb16f..60659b4 100644 (file)
@@ -1,3 +1,15 @@
+2005-09-26  Moritz Schulte  <moritz@g10code.com>
+
+       Thanks to Alessandro Rubini:
+
+       * card.c: Include <time.h>.
+       (wait_for_card): New parameter: TIMEOUT; new variables T0, T;
+       return 1 in case the specified timeout elapsed without any card
+       being inserted.
+       (card_init): New parameter: TIMEOUT; new variable: RET; pass
+       TIMEOUT to wait_for_card();
+       * card.h (card_sign): Updated card_init API.
+
 2005-07-26  Moritz Schulte  <moritz@g10code.com>
 
        * support.c (username_to_serialno): Renamed function to ...
index bb6fadc..40aed52 100644 (file)
@@ -26,6 +26,7 @@
 #include <errno.h>
 #include <unistd.h>
 #include <assert.h>
+#include <time.h>
 
 #include <gcrypt.h>
 
@@ -67,14 +68,26 @@ card_open (const char *port, int *slot)
   return err;
 }
 
-/* Wait until a new card has been inserted into the reader.  Return 0
-   on success.  */
+/* Wait until a new card has been inserted into the reader. If TIMEOUT
+   is non-zero, do not wait longer than TIMEOUT seconds.
+
+   Returns 0 in case a card has been inserted; returns 1 in case the
+   timeout has been reached without a card being inserted.  */
 static int
-wait_for_card (int slot, int require_card_switch)
+wait_for_card (int slot, int require_card_switch, unsigned int timeout)
 {
-  unsigned int status, changed;
-
-  for (;;)
+  unsigned int changed;
+  unsigned int status;
+  time_t t0;
+  time_t t;
+
+  if (timeout)
+    time (&t0);
+  //  else
+  /* FIXME: silence compiler?  */
+    
+
+  while (1)
     {
       status = changed = 0;
       apdu_get_status (slot, 0, &status, &changed);
@@ -97,26 +110,50 @@ wait_for_card (int slot, int require_card_switch)
 #else
       sleep (1);
 #endif
+
+      if (timeout)
+       {
+         time (&t);
+         if ((t - t0) > timeout)
+           return 1;
+       }
     }
 }
 
 gpg_error_t
-card_init (int slot, int wait, int require_card_switch)
+card_init (int slot, int wait, unsigned int timeout, int require_card_switch)
 {
   /* This is the AID (Application IDentifier) for OpenPGP.  */
   char const aid[] = { 0xD2, 0x76, 0x00, 0x01, 0x24, 0x01 };
   gpg_error_t err;
-  
+
+  /* A specified timeout makes no sense in case waiting is not
+     desired.  */
+  assert (! ((! wait) && timeout));
+
   apdu_get_status (slot, 0, &last_status, &change_counter);
   if (wait)
     {
+      int ret;
+
       apdu_activate (slot);
-      wait_for_card (slot, require_card_switch);
+      ret = wait_for_card (slot, require_card_switch, timeout);
+      if (ret)
+       {
+         err = gpg_error (GPG_ERR_CARD_NOT_PRESENT);
+         goto out;
+       }
+      else
+       err = 0;
     }
-  
+  else
+    err = 0;
+
   /* Select OpenPGP Application.  */
   err = iso7816_select_application (slot, aid, sizeof (aid));
 
+ out:
+
   return err;
 }
 
index 5227a87..fe3d220 100644 (file)
@@ -24,7 +24,8 @@
 #include <gcrypt.h>
 
 gcry_error_t card_open (const char *port, int *slot);
-gcry_error_t card_init (int slot, int wait, int require_card_switch);
+gcry_error_t card_init (int slot, int wait, unsigned int timeout,
+                       int require_card_switch);
 void card_close (int slot);
 
 gcry_error_t card_info (int slot, char **serial_no,
index 8a1e0d4..f5c845e 100644 (file)
@@ -1,3 +1,13 @@
+2005-09-30  Moritz Schulte  <moritz@g10code.com>
+
+       * poldi-ctrl.c (struct poldi_ctrl_opt): Remove unnecessary, rather
+       annoying const attributes.
+       (cmd_add_user): Likewise.
+
+2005-09-27  Moritz Schulte  <moritz@g10code.com>
+
+       * poldi-ctrl.c: Adjust to new card_init API; pass zero timeout.
+
 2005-07-26  Moritz Schulte  <moritz@g10code.com>
 
        * poldi-ctrl.c (cmd_test): Remove unnecessary const attributes and
index 978eda8..67f90e6 100644 (file)
@@ -44,15 +44,15 @@ struct poldi_ctrl_opt
   unsigned int debug; /* debug flags (DBG_foo_VALUE) */
   int debug_sc;     /* OpenSC debug level */
   int verbose;      /* verbosity level */
-  const char *ctapi_driver; /* Library to access the ctAPI. */
-  const char *pcsc_driver;  /* Library to access the PC/SC system. */
-  const char *reader_port;  /* NULL or reder port to use. */
+  char *ctapi_driver; /* Library to access the ctAPI. */
+  char *pcsc_driver;  /* Library to access the PC/SC system. */
+  char *reader_port;  /* NULL or reder port to use. */
   int disable_opensc;  /* Disable the use of the OpenSC framework. */
   int disable_ccid;    /* Disable the use of the internal CCID driver. */
   int debug_ccid_driver;       /* Debug the internal CCID driver.  */
-  const char *config_file;
-  const char *account;
-  const char *serialno;
+  char *config_file;
+  char *account;
+  char *serialno;
   int fake_wait_for_card;
   int require_card_switch;
   int cmd_test;
@@ -109,6 +109,7 @@ enum arg_opt_ids
     arg_reader_port,
     arg_disable_ccid,
     arg_disable_opensc,
+    arg_debug,
     arg_debug_ccid_driver,
     arg_fake_wait_for_card,
     arg_require_card_switch
@@ -116,6 +117,8 @@ enum arg_opt_ids
 
 static ARGPARSE_OPTS arg_opts[] =
   {
+    { arg_debug,
+      "debug", 256, "Enable debugging mode" },
     { arg_test,
       "test",        256, "Test authentication"                },
     { arg_dump,
@@ -281,6 +284,16 @@ poldi_ctrl_options_cb (ARGPARSE_ARGS *parg, void *opaque)
        poldi_ctrl_opt.disable_opensc = 1;
       break;
 
+    case arg_debug:
+      if (parsing_stage)
+       {
+         poldi_ctrl_opt.debug = ~0;
+         poldi_ctrl_opt.debug_sc = 1;
+         poldi_ctrl_opt.verbose = 1;
+         poldi_ctrl_opt.debug_ccid_driver = 1;
+       }
+      break;
+
     case arg_debug_ccid_driver:
       if (parsing_stage)
        poldi_ctrl_opt.debug_ccid_driver = 1;
@@ -350,6 +363,7 @@ cmd_test (void)
     printf ("Waiting for card...\n");
   err = card_init (slot,
                   !poldi_ctrl_opt.fake_wait_for_card,
+                  0,
                   poldi_ctrl_opt.require_card_switch);
   if (err)
     goto out;
@@ -446,7 +460,7 @@ cmd_dump (void)
   if (err)
     goto out;
 
-  err = card_init (slot, 0, 0);
+  err = card_init (slot, 0, 0, 0);
   if (err)
     goto out;
 
@@ -523,7 +537,7 @@ cmd_dump_shadowed_key (void)
   if (err)
     goto out;
 
-  err = card_init (slot, 0, 0);
+  err = card_init (slot, 0, 0, 0);
   if (err)
     goto out;
 
@@ -744,9 +758,9 @@ static gpg_error_t
 cmd_add_user (void)
 {
   struct passwd *pwent;
-  const char *serialno;
-  const char *account;
   gpg_error_t err;
+  char *serialno;
+  char *account;
 
   serialno = poldi_ctrl_opt.serialno;
   account = poldi_ctrl_opt.account;
@@ -850,7 +864,7 @@ cmd_set_key (void)
   if (err)
     goto out;
 
-  err = card_init (slot, 0, 0);
+  err = card_init (slot, 0, 0, 0);
   if (err)
     goto out;
 
index 15f272a..067dcd7 100644 (file)
@@ -1,8 +1,25 @@
+2005-09-27  Moritz Schulte  <moritz@g10code.com>
+
+       * pam_poldi.c (struct pam_poldi_opt): New member: TIMEOUT.
+       (pam_poldi_opt): Extend struct initialization.
+       (enum arg_opt_ids): New entry: ARG_WAIT_TIMEOUT.
+       (pam_poldi_options_cb): Handle ARG_WAIT_TIMEOUT.
+       (wait_for_card): New variables; TIMEOUT, WAIT; initialize them
+       depending on FAKE and PAM_POLDI_OPT.TIMEOUT; pass TIMEOUT and WAIT
+       to card_init.
+       (lookup_key): Use usersdb_lookup_by_username() instead of
+       username_to_serialno(); remove const attribute from SERIALNO.
+       (wait_for_card): Remove const attribute from SERIALNO.
+       (pam_sm_authenticate): Likewise.
+       (pam_sm_authenticate): Use usersdb_lookup_by_serialno() instead of
+       serialno_to_username(); remove const attribute from account.
+
+
 2005-07-13  Moritz Schulte  <moritz@g10code.com>
 
        * pam_poldi.c (wait_for_card): Adjust to new card_info() API.
 
 2004-11-27  Moritz Schulte  <moritz@g10code.com>
 
-       * pam_poldi.c (wait_for_card): Adjust card_init caller.
-       Implement require_card_switch option.
+       * pam_poldi.c (wait_for_card): Adjust card_init caller.  Implement
+       require_card_switch option.
index 7ab2a8b..c0a7710 100644 (file)
@@ -66,6 +66,7 @@ struct pam_poldi_opt
   int fake_wait_for_card;
   int require_card_switch;
   const char *logfile;
+  unsigned int wait_timeout;
 } pam_poldi_opt;
 
 /* Set defaults.  */
@@ -82,7 +83,8 @@ struct pam_poldi_opt pam_poldi_opt =
     0,
     0,
     0,
-    NULL
+    NULL,
+    0
   };
 
 
@@ -100,7 +102,8 @@ enum arg_opt_ids
     arg_debug_ccid_driver,
     arg_fake_wait_for_card,
     arg_require_card_switch,
-    arg_logfile
+    arg_logfile,
+    arg_wait_timeout
   };
 
 /* Option specifications. */
@@ -132,6 +135,8 @@ static ARGPARSE_OPTS arg_opts[] =
       "require-card-switch", 0, "Require re-insertion of card" },
     { arg_logfile,
       "log-file", 2, "Specify file to use for logging" },
+    { arg_wait_timeout,
+      "wait-timeout", 1, "|SEC|Specify timeout for waiting" },
     { 0 }
   };
 
@@ -186,6 +191,10 @@ pam_poldi_options_cb (ARGPARSE_ARGS *parg, void *opaque)
       pam_poldi_opt.logfile = xstrdup (parg->r.ret_str);
       break;
 
+    case arg_wait_timeout:
+      pam_poldi_opt.wait_timeout = parg->r.ret_int;
+      break;
+
     default:
       err = GPG_ERR_INTERNAL;  /* FIXME?  */
       break;
@@ -322,14 +331,14 @@ lookup_key (const char *username, gcry_sexp_t *key)
   gcry_sexp_t key_sexp;
   char *key_string;
   char *key_path;
-  const char *serialno;
+  char *serialno;
   gpg_error_t err;
 
   serialno = NULL;
   key_path = NULL;
   key_string = NULL;
 
-  err = username_to_serialno (username, &serialno);
+  err = usersdb_lookup_by_username (username, &serialno);
   if (err)
     goto out;
 
@@ -350,28 +359,42 @@ lookup_key (const char *username, gcry_sexp_t *key)
 
   free (key_path);
   free (key_string);
-  free ((void *) serialno);
+  free (serialno);
 
   return err;
 }
 
 static gpg_error_t
 wait_for_card (int slot, int fake, int require_card_switch,
-              const struct pam_conv *conv, const char **serialno)
+              const struct pam_conv *conv, char **serialno)
 {
-  const char *serialno_new;
+  char *serialno_new;
+  unsigned int timeout;
   gpg_error_t err;
+  int wait;
 
   if (fake)
-    err = ask_user (conv, "Press ENTER when card is available ...", NULL);
+    {
+      timeout = 0;
+      wait = 0;
+      err = ask_user (conv, "Press ENTER when card is available ...", NULL);
+    }
   else
-    err = tell_user (conv, "Insert card ...");
+    {
+      timeout = pam_poldi_opt.wait_timeout;
+      wait = 1; 
+      err = tell_user (conv, "Insert card ...");
+    }
   if (err)
     goto out;
 
-  err = card_init (slot, ! fake, require_card_switch);
+  err = card_init (slot, wait, timeout, require_card_switch);
   if (err)
-    goto out;
+    {
+      if (gpg_err_code (err) == GPG_ERR_CARD_NOT_PRESENT)
+       tell_user (conv, "Timeout inserting card");
+      goto out;
+    }
 
   err = card_info (slot, &serialno_new, NULL, NULL);
   if (err)
@@ -392,18 +415,25 @@ parse_argv (int argc, const char **argv)
 
   err = 0;
   for (i = 0; i < argc; i++)
-    if (! strcmp (argv[i], "debug"))
-      {
-       pam_poldi_opt.debug = ~0;
-       pam_poldi_opt.debug_sc = 1;
-       pam_poldi_opt.verbose = 1;
-       pam_poldi_opt.debug_ccid_driver = 1;
-      }
-    else
-      {
-       err = gpg_error (GPG_ERR_INTERNAL);
-       break;
-      }
+    {
+      if (! strcmp (argv[i], "debug"))
+       {
+         pam_poldi_opt.debug = ~0;
+         pam_poldi_opt.debug_sc = 1;
+         pam_poldi_opt.verbose = 1;
+         pam_poldi_opt.debug_ccid_driver = 1;
+       }
+      else if (! strncmp (argv[i], "timeout=", 4))
+       {
+         /* FIXME: 4.  */
+         pam_poldi_opt.wait_timeout = atoi (argv[i] + 8);
+       }
+      else
+       {
+         err = gpg_error (GPG_ERR_INTERNAL);
+         break;
+       }
+    }
 
   return err;
 }
@@ -416,8 +446,8 @@ pam_sm_authenticate (pam_handle_t *pam_handle, int flags, int argc, const char *
   gcry_sexp_t key;
   gpg_error_t err;
   char *username;
-  const char *serialno;
-  const char *account;
+  char *serialno;
+  char *account;
   int slot;
   int ret;
 
@@ -487,7 +517,7 @@ pam_sm_authenticate (pam_handle_t *pam_handle, int flags, int argc, const char *
       if (err)
        goto out;
 
-      err = serialno_to_username (serialno, &account);
+      err = usersdb_lookup_by_serialno (serialno, &account);
 
       if (err || strcmp (account, username))
        {
@@ -516,7 +546,7 @@ pam_sm_authenticate (pam_handle_t *pam_handle, int flags, int argc, const char *
       if (err)
        goto out;
 
-      err = serialno_to_username (serialno, &account);
+      err = usersdb_lookup_by_serialno (serialno, &account);
       if (err)
        goto out;
 
@@ -546,8 +576,8 @@ pam_sm_authenticate (pam_handle_t *pam_handle, int flags, int argc, const char *
  out:
   
   gcry_sexp_release (key);
-  free ((void *) serialno);
-  free ((void *) account);
+  free (serialno);
+  free (account);
   if (slot != -1)
     card_close (slot);