added initial i18n stuff
authorWerner Koch <wk@gnupg.org>
Mon, 26 Jan 1998 22:09:01 +0000 (22:09 +0000)
committerWerner Koch <wk@gnupg.org>
Mon, 26 Jan 1998 22:09:01 +0000 (22:09 +0000)
26 files changed:
Makefile.am
Makefile.in
README
TODO
acconfig.h
config.h.in
configure.in
g10/Makefile.am
g10/Makefile.in
g10/OPTIONS
g10/export.c [new file with mode: 0644]
g10/g10.c
g10/getkey.c
g10/main.h
g10/options.h
g10/pkclist.c
include/distfiles
include/errors.h
include/i18n.h [new file with mode: 0644]
include/util.h
po/Makefile.in.in [new file with mode: 0644]
po/POTFILES.in [new file with mode: 0644]
po/de.po [new file with mode: 0644]
util/argparse.c
util/errors.c
util/strgutil.c

index dea36e9..a2a1d87 100644 (file)
@@ -1,6 +1,6 @@
 ## Process this file with automake to produce Makefile.in
 
-SUBDIRS =  util mpi cipher tools g10
+SUBDIRS =  util mpi cipher tools po intl g10
 EXTRA_DIST = VERSION
 
 
index ff52314..41e1626 100644 (file)
@@ -38,15 +38,15 @@ INSTALL_DATA = @INSTALL_DATA@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 transform = @program_transform_name@
 
-SUBDIRS =  util mpi cipher tools g10
+SUBDIRS =  util mpi cipher tools po intl g10
 EXTRA_DIST = VERSION
 ACCONFIG = acconfig.h
 CONFIG_HEADER_IN = config.h.in
 mkinstalldirs = $(top_srcdir)/scripts/mkinstalldirs
 CONFIG_HEADER = ./config.h
-DIST_COMMON = README AUTHORS COPYING ChangeLog INSTALL Makefile.am \
-Makefile.in NEWS README TODO acconfig.h config.h.in configure \
-configure.in stamp-h.in
+DIST_COMMON = README ABOUT-NLS AUTHORS COPYING ChangeLog INSTALL \
+Makefile.am Makefile.in NEWS README TODO acconfig.h config.h.in \
+configure configure.in stamp-h.in
 
 
 PACKAGE = @PACKAGE@
diff --git a/README b/README
index 4aa3f6e..91d3ac9 100644 (file)
--- a/README
+++ b/README
     Ditto, but sign the file with the user id "Suttner"
 
 
+    How to Specify a UserID
+    -----------------------
+    There are several ways to specify a userID, here are some examples:
+
+    * Only by the short keyid (prepend a zero if it start with A..F):
+
+       "234567C4"
+       "0F34E556E"
+       "01347A56A"
+
+    * By a complete keyid:
+
+       "234AABBCC34567C4"
+       "0F323456784E56EAB"
+       "01AB3FED1347A5612"
+
+    * By a fingerprint (not yet implemented):
+
+       "1234343434343434C434343434343434"
+       "123434343434343C3434343434343734349A3434"
+       "0E12343434343434343434EAB3484343434343434"
+
+      The first one is MD5 the others are ripemd160 or sha1.
+
+    * By an exact string (not yet implemented):
+
+       "=Heinrich Heine <heinrichh@uni-duesseldorf.de>"
+
+    * By an email address:
+
+       "<heinrichh@uni-duesseldorf.de>"
+
+      This can be used by a keyserver instead of a substring to
+      find this key faster.
+
+    * By the Local ID (from the trustdb):
+
+       "#34"
+
+      This can be used by a MUA to specify an exact key after selecting
+      a key from G10 (by the use of a special option or an extra utility)
+
+
+    * Or by the usual substring:
+
+       "Heine"
+       "*Heine"
+
+      The '*' indicates substring search explicitly.
+
+
+
+
     Batch mode
     ----------
     If you use the option "--batch", G10 runs in non-interactive mode and
diff --git a/TODO b/TODO
index 65079b6..283e72c 100644 (file)
--- a/TODO
+++ b/TODO
     * complete cipher/cast.c
     * complete cipher/dsa.c
 
-    * define a standard way to specify keyid/userid and other stuff
-      to identify a user.  We could look at the first character and
-      say: If it's a digit, a keyid follows (need to add a zero in
-      case the keyid starts with A..F); if it is a left angle bracket,
-      this is a email address and should be used, all others are substrings
-      of the userid.
-      [can be handles in get_pubkey_by_name()]
-
     * armor has now some problems.
 
     * add g10 stuff to Mutt's pgpinvoke.c
 
     * Burn the buffers used by fopen().
 
-    * bug: g10/trustdb.c#build_sigrecs caled to often by do_list_path
+    * bug: g10/trustdb.c#build_sigrecs called to often by do_list_path
       and remove the bad kludge. Maybe we should put all sigs into the trustdb
       and mark them as valid/invalid/nopubkey, and how do we check, that
       we have a self-signature -> put this stuff into a kind of directory
index 3f83ef1..728d4d1 100644 (file)
 #undef M_DEBUG
 #undef VERSION
 #undef PACKAGE
+#undef G10_LOCALEDIR
+
+/* Define if your locale.h file contains LC_MESSAGES.  */
+#undef HAVE_LC_MESSAGES
+
+/* Define to 1 if NLS is requested.  */
+#undef ENABLE_NLS
+
+/* Define as 1 if you have catgets and don't want to use GNU gettext.  */
+#undef HAVE_CATGETS
+
+/* Define as 1 if you have gettext and don't want to use GNU gettext.  */
+#undef HAVE_GETTEXT
+
+#undef HAVE_STPCPY
+
 
 #undef BIG_ENDIAN_HOST
 #undef LITTLE_ENDIAN_HOST
index 94550cc..fb81609 100644 (file)
 
 
 
+/* Define if using alloca.c.  */
+#undef C_ALLOCA
+
 /* Define to empty if the keyword does not work.  */
 #undef const
 
+/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems.
+   This function is required for alloca.c support on those systems.  */
+#undef CRAY_STACKSEG_END
+
+/* Define if you have alloca, as a function or macro.  */
+#undef HAVE_ALLOCA
+
+/* Define if you have <alloca.h> and it should be used (not on Ultrix).  */
+#undef HAVE_ALLOCA_H
+
 /* Define if you don't have vprintf but do have _doprnt.  */
 #undef HAVE_DOPRNT
 
+/* Define if you have a working `mmap' system call.  */
+#undef HAVE_MMAP
+
 /* Define if you have the vprintf function.  */
 #undef HAVE_VPRINTF
 
 /* Define as __inline if that's what the C compiler calls it.  */
 #undef inline
 
+/* Define to `long' if <sys/types.h> doesn't define.  */
+#undef off_t
+
 /* Define to `unsigned' if <sys/types.h> doesn't define.  */
 #undef size_t
 
+/* If using the C implementation of alloca, define if you know the
+   direction of stack growth for your system; otherwise it will be
+   automatically deduced at run-time.
+ STACK_DIRECTION > 0 => grows toward higher addresses
+ STACK_DIRECTION < 0 => grows toward lower addresses
+ STACK_DIRECTION = 0 => direction of growth unknown
+ */
+#undef STACK_DIRECTION
+
 /* Define if you have the ANSI C header files.  */
 #undef STDC_HEADERS
 
 #undef M_DEBUG
 #undef VERSION
 #undef PACKAGE
+#undef G10_LOCALEDIR
+
+/* Define if your locale.h file contains LC_MESSAGES.  */
+#undef HAVE_LC_MESSAGES
+
+/* Define to 1 if NLS is requested.  */
+#undef ENABLE_NLS
+
+/* Define as 1 if you have catgets and don't want to use GNU gettext.  */
+#undef HAVE_CATGETS
+
+/* Define as 1 if you have gettext and don't want to use GNU gettext.  */
+#undef HAVE_GETTEXT
+
+#undef HAVE_STPCPY
 
 #undef BIG_ENDIAN_HOST
 #undef LITTLE_ENDIAN_HOST
 /* The number of bytes in a unsigned short.  */
 #undef SIZEOF_UNSIGNED_SHORT
 
+/* Define if you have the dcgettext function.  */
+#undef HAVE_DCGETTEXT
+
+/* Define if you have the getcwd function.  */
+#undef HAVE_GETCWD
+
+/* Define if you have the getpagesize function.  */
+#undef HAVE_GETPAGESIZE
+
+/* Define if you have the munmap function.  */
+#undef HAVE_MUNMAP
+
+/* Define if you have the putenv function.  */
+#undef HAVE_PUTENV
+
 /* Define if you have the rand function.  */
 #undef HAVE_RAND
 
+/* Define if you have the setenv function.  */
+#undef HAVE_SETENV
+
+/* Define if you have the setlocale function.  */
+#undef HAVE_SETLOCALE
+
 /* Define if you have the stpcpy function.  */
 #undef HAVE_STPCPY
 
+/* Define if you have the strcasecmp function.  */
+#undef HAVE_STRCASECMP
+
+/* Define if you have the strchr function.  */
+#undef HAVE_STRCHR
+
 /* Define if you have the strerror function.  */
 #undef HAVE_STRERROR
 
 /* Define if you have the tcgetattr function.  */
 #undef HAVE_TCGETATTR
 
+/* Define if you have the <limits.h> header file.  */
+#undef HAVE_LIMITS_H
+
+/* Define if you have the <locale.h> header file.  */
+#undef HAVE_LOCALE_H
+
+/* Define if you have the <malloc.h> header file.  */
+#undef HAVE_MALLOC_H
+
+/* Define if you have the <nl_types.h> header file.  */
+#undef HAVE_NL_TYPES_H
+
+/* Define if you have the <string.h> header file.  */
+#undef HAVE_STRING_H
+
 /* Define if you have the <unistd.h> header file.  */
 #undef HAVE_UNISTD_H
 
+/* Define if you have the <values.h> header file.  */
+#undef HAVE_VALUES_H
+
 /* Define if you have the <zlib.h> header file.  */
 #undef HAVE_ZLIB_H
 
+/* Define if you have the i library (-li).  */
+#undef HAVE_LIBI
+
+/* Define if you have the intl library (-lintl).  */
+#undef HAVE_LIBINTL
+
 
 /* The AC_CHECK_SIZEOF() fails for some machines.
  * we provide some fallback values here */
index 39e8776..b9b8ccd 100644 (file)
@@ -8,12 +8,27 @@ AC_CONFIG_AUX_DIR(scripts)
 AC_CONFIG_HEADER(config.h)
 
 
+if test "x$exec_prefix" = xNONE ; then
+    if test "x$prefix" = xNONE ; then
+       g10_prefix="$ac_default_prefix"
+    else
+       g10_prefix="$prefix"
+    fi
+else
+    g10_prefix="$exec_prefix"
+fi
+
+
 VERSION=`cat $srcdir/VERSION`
 PACKAGE=g10
+ALL_LINGUAS="de"
+G10_LOCALEDIR="$g10_prefix/share/locale"
 AC_SUBST(VERSION)
 AC_SUBST(PACKAGE)
+AC_SUBST(G10_LOCALEDIR)
 AC_DEFINE_UNQUOTED(VERSION, "$VERSION")
 AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE")
+AC_DEFINE_UNQUOTED(G10_LOCALEDIR, "$G10_LOCALEDIR")
 
 AC_ARG_ENABLE(m-debug,
 [  --enable-m-debug    Enable debugging of memory allocation])
@@ -22,6 +37,250 @@ if test "$enableval" = y || test "$enableval" = yes; then
 fi
 CFLAGS="-g -Wall"
 
+g10_ln_sources=
+g10_ln_dests=
+
+
+
+dnl BEGIN===========================
+dnl FIXME: move this to aclocal.m4
+AC_PREREQ(2.5)
+
+AC_DEFUN(md_TYPE_PTRDIFF_T,
+  [AC_CACHE_CHECK([for ptrdiff_t], ac_cv_type_ptrdiff_t,
+     [AC_TRY_COMPILE(stddef.h, [ptrdiff_t p], ac_cv_type_ptrdiff_t=yes,
+                    ac_cv_type_ptrdiff_t=no)])
+   if test $ac_cv_type_ptrdiff_t = yes; then
+     AC_DEFINE(HAVE_PTRDIFF_T)
+   fi
+])
+
+AC_DEFUN(md_PATH_PROG,
+  [AC_PATH_PROG($1,$2,$3)dnl
+   if echo $$1 | grep openwin > /dev/null; then
+     echo "WARNING: Do not use OpenWin's $2.  (Better remove it.) >&AC_FD_MSG"
+     ac_cv_path_$1=$2
+     $1=$2
+   fi
+])
+
+
+dnl --------------------------------------------------------- ##
+dnl Use AC_PROG_INSTALL, supplementing it with INSTALL_SCRIPT ##
+dnl substitution.                                            ##
+dnl --------------------------------------------------------- ##
+
+AC_DEFUN(fp_PROG_INSTALL,
+[AC_PROG_INSTALL
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL} -m 755'
+AC_SUBST(INSTALL_SCRIPT)dnl
+])
+
+dnl Check NLS options
+
+AC_DEFUN(ud_LC_MESSAGES,
+  [if test $ac_cv_header_locale_h = yes; then
+    AC_CACHE_CHECK([for LC_MESSAGES], ud_cv_val_LC_MESSAGES,
+      [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
+       ud_cv_val_LC_MESSAGES=yes, ud_cv_val_LC_MESSAGES=no)])
+    if test $ud_cv_val_LC_MESSAGES = yes; then
+      AC_DEFINE(HAVE_LC_MESSAGES)
+    fi
+  fi])
+
+AC_DEFUN(ud_WITH_NLS,
+  [AC_MSG_CHECKING([whether NLS is requested])
+    dnl Default is enabled NLS
+    AC_ARG_ENABLE(nls,
+      [  --disable-nls          do not use Native Language Support],
+      nls_cv_use_nls=$enableval, nls_cv_use_nls=yes)
+    AC_MSG_RESULT($nls_cv_use_nls)
+
+    dnl If we use NLS figure out what method
+    if test "$nls_cv_use_nls" = "yes"; then
+      AC_DEFINE(ENABLE_NLS)
+      AC_MSG_CHECKING([for explicitly using GNU gettext])
+      AC_ARG_WITH(gnu-gettext,
+       [  --with-gnu-gettext      use the GNU gettext library],
+       nls_cv_force_use_gnu_gettext=$withval,
+       nls_cv_force_use_gnu_gettext=no)
+      AC_MSG_RESULT($nls_cv_force_use_gnu_gettext)
+
+      if test "$nls_cv_force_use_gnu_gettext" = "yes"; then
+       nls_cv_use_gnu_gettext=yes
+      else
+       dnl User does not insist on using GNU NLS library.  Figure out what
+       dnl to use.  If gettext or catgets are available (in this order) we
+       dnl use this.  Else we have to fall back to GNU NLS library.
+       AC_CHECK_LIB(intl, main)
+       AC_CHECK_LIB(i, main)
+       CATOBJEXT=NONE
+       AC_CHECK_FUNC(gettext,
+         [AC_DEFINE(HAVE_GETTEXT)
+          md_PATH_PROG(MSGFMT, msgfmt, no)dnl
+          if test "$MSGFMT" != "no"; then
+            AC_CHECK_FUNCS(dcgettext)
+            md_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
+            md_PATH_PROG(XGETTEXT, xgettext, xgettext)
+            CATOBJEXT=.mo
+            INSTOBJEXT=.mo
+            DATADIRNAME=lib
+          fi])
+
+       if test "$CATOBJEXT" = "NONE"; then
+         dnl No gettext in C library.  Try catgets next.
+         AC_CHECK_FUNC(catgets,
+           [AC_DEFINE(HAVE_CATGETS)
+            INTLOBJS="\$(CATOBJS)"
+            AC_PATH_PROG(GENCAT, gencat, no)dnl
+            if test "$GENCAT" != "no"; then
+              AC_PATH_PROGS(GMSGFMT, [gmsgfmt msgfmt], msgfmt)
+              md_PATH_PROG(XGETTEXT, xgettext, xgettext)
+              CATOBJEXT=.cat
+              INSTOBJEXT=.cat
+              DATADIRNAME=lib
+              INTLDEPS="../intl/libintl.a"
+              INTLLIBS=$INTLDEPS
+              LIBS=`echo $LIBS | sed -e 's/-lintl//'`
+              nls_cv_header_intl=intl/libintl.h
+              nls_cv_header_libgt=intl/libgettext.h
+            fi])
+       fi
+
+       if test "$CATOBJEXT" = "NONE"; then
+         dnl Neither gettext nor catgets in included in the C library.
+         dnl Fall back on GNU gettext library.
+         nls_cv_use_gnu_gettext=yes
+       fi
+      fi
+
+      if test "$nls_cv_use_gnu_gettext" = "yes"; then
+       dnl Mark actions used to generate GNU NLS library.
+       INTLOBJS="\$(GETTOBJS)"
+       md_PATH_PROG(MSGFMT, msgfmt, msgfmt)
+       md_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
+       md_PATH_PROG(XGETTEXT, xgettext, xgettext)
+       AC_SUBST(MSGFMT)
+       CATOBJEXT=.gmo
+       INSTOBJEXT=.mo
+       DATADIRNAME=share
+       INTLDEPS="../intl/libintl.a"
+       INTLLIBS=$INTLDEPS
+       LIBS=`echo $LIBS | sed -e 's/-lintl//'`
+       nls_cv_header_intl=intl/libintl.h
+       nls_cv_header_libgt=intl/libgettext.h
+      fi
+
+      # We need to process the intl/ and po/ directory.
+      INTLSUB=intl
+      POSUB=po
+    else
+      DATADIRNAME=share
+      nls_cv_header_intl=intl/libintl.h
+      nls_cv_header_libgt=intl/libgettext.h
+    fi
+
+    dnl These rules are solely for the distribution goal.  While doing this
+    dnl we only have to keep exactly one list of the available catalogs
+    dnl in configure.in.
+    for lang in $ALL_LINGUAS; do
+      GMOFILES="$GMOFILES $lang.gmo"
+      POFILES="$POFILES $lang.po"
+    done
+
+    dnl Make all variables we use known to autoconf.
+    AC_SUBST(CATALOGS)
+    AC_SUBST(CATOBJEXT)
+    AC_SUBST(DATADIRNAME)
+    AC_SUBST(GMOFILES)
+    AC_SUBST(INSTOBJEXT)
+    AC_SUBST(INTLDEPS)
+    AC_SUBST(INTLLIBS)
+    AC_SUBST(INTLOBJS)
+    AC_SUBST(INTLSUB)
+    AC_SUBST(POFILES)
+    AC_SUBST(POSUB)
+  ])
+
+AC_DEFUN(ud_GNU_GETTEXT,
+  [AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+   AC_REQUIRE([AC_PROG_CC])dnl
+   AC_REQUIRE([AC_PROG_RANLIB])dnl
+   AC_REQUIRE([AC_HEADER_STDC])dnl
+   AC_REQUIRE([AC_C_CONST])dnl
+   AC_REQUIRE([AC_C_INLINE])dnl
+   AC_REQUIRE([AC_TYPE_OFF_T])dnl
+   AC_REQUIRE([AC_TYPE_SIZE_T])dnl
+   AC_REQUIRE([AC_FUNC_ALLOCA])dnl
+   AC_REQUIRE([AC_FUNC_MMAP])dnl
+
+   AC_CHECK_HEADERS([limits.h locale.h nl_types.h malloc.h string.h unistd.h values.h])
+   AC_CHECK_FUNCS([getcwd munmap putenv setenv setlocale strchr strcasecmp])
+
+   if test "${ac_cv_func_stpcpy+set}" != "set"; then
+     AC_CHECK_FUNCS(stpcpy)
+   fi
+   if test "${ac_cv_func_stpcpy}" = "yes"; then
+     AC_DEFINE(HAVE_STPCPY)
+   fi
+
+   ud_LC_MESSAGES
+   ud_WITH_NLS
+
+   if test "x$CATOBJEXT" != "x"; then
+     if test "x$ALL_LINGUAS" = "x"; then
+       LINGUAS=
+     else
+       AC_MSG_CHECKING(for catalogs to be installed)
+       NEW_LINGUAS=
+       for lang in ${LINGUAS=$ALL_LINGUAS}; do
+        case "$ALL_LINGUAS" in
+         *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;;
+        esac
+       done
+       LINGUAS=$NEW_LINGUAS
+       AC_MSG_RESULT($LINGUAS)
+     fi
+
+     dnl Construct list of names of catalog files to be constructed.
+     if test -n "$LINGUAS"; then
+       for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
+     fi
+   fi
+
+   dnl Determine which catalog format we have (if any is needed)
+   dnl For now we know about two different formats:
+   dnl  Linux and the normal X/Open format
+   test -d intl || mkdir intl
+   if test "$CATOBJEXT" = ".cat"; then
+     AC_CHECK_HEADER(linux/version.h, msgformat=linux, msgformat=xopen)
+
+     dnl Transform the SED scripts while copying because some dumb SEDs
+     dnl cannot handle comments.
+     sed -e '/^#/d' $srcdir/intl/$msgformat-msg.sed > intl/po2msg.sed
+   fi
+   dnl po2tbl.sed is always needed.
+   sed -e '/^#.*[^\\]$/d' -e '/^#$/d' \
+     $srcdir/intl/po2tbl.sed.in > intl/po2tbl.sed
+
+   dnl Generate list of files to be processed by xgettext which will
+   dnl be included in po/Makefile.
+   test -d po || mkdir po
+   if test "x$srcdir" != "x."; then
+     if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then
+       posrcprefix="$srcdir/"
+     else
+       posrcprefix="../$srcdir/"
+     fi
+   else
+     posrcprefix="../"
+   fi
+   sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \
+       < $srcdir/po/POTFILES.in > po/POTFILES
+  ])
+
+dnl END========================
+
 dnl some additional macros
 
 dnl WK_MSG_PRINT(STRING)
@@ -44,8 +303,6 @@ fi
 ])
 
 
-
-
 dnl
 AC_CANONICAL_SYSTEM
 AC_MSG_CHECKING(cached information)
@@ -91,13 +348,14 @@ dnl Checks for header files.
 AC_HEADER_STDC
 AC_CHECK_HEADERS(unistd.h)
 
+ud_GNU_GETTEXT
+
 
 dnl Checks for typedefs, structures, and compiler characteristics.
 AC_C_CONST
 AC_C_INLINE
 AC_TYPE_SIZE_T
 
-
 dnl autoconf doesn't support a default value for AC_C_BIGENDIAN
 dnl so here is the modified version
 if test "$cross_compiling" = yes; then
@@ -181,8 +439,14 @@ else
 ac_cv_mpi_config_done=""
 if test -f $srcdir/mpi/config.links ; then
     . $srcdir/mpi/config.links
+    if test "x$g10_ln_sources" = "x"; then
+       g10_ln_sources="$mpi_ln_src"
+       g10_ln_dests="$mpi_ln_dst"
+    else
+       g10_ln_sources="$g10_ln_sources $mpi_ln_src"
+       g10_ln_dests="$g10_ln_dests $mpi_ln_dst"
+    fi
     ac_cv_mpi_extra_asm_modules="$mpi_extra_modules"
-    AC_LINK_FILES( ${mpi_ln_src}, ${mpi_ln_dst} )
     ac_cv_mpi_config_done="yes"
     AC_MSG_RESULT(done)
 else
@@ -223,11 +487,25 @@ fi
 AC_SUBST(CIPHER_EXTRA_OBJS)
 AC_SUBST(CIPHER_EXTRA_DIST)
 
-AC_OUTPUT([ Makefile   \
-           util/Makefile    \
-           mpi/Makefile \
-           cipher/Makefile \
-           g10/Makefile     \
-           tools/Makefile   \
-], [echo timestamp > stamp-h ] )
+if test "x$g10_ln_sources" = "x"; then
+    g10_ln_sources="$nls_cv_header_libgt"
+    g10_ln_dests="$nls_cv_header_intl"
+else
+    g10_ln_sources="$g10_ln_sources $nls_cv_header_libgt"
+    g10_ln_dests="$g10_ln_dests $nls_cv_header_intl"
+fi
+
+AC_LINK_FILES($g10_ln_sources,$g10_ln_dests)
+
+
+AC_OUTPUT([
+Makefile
+intl/Makefile
+po/Makefile.in
+util/Makefile
+mpi/Makefile
+cipher/Makefile
+g10/Makefile
+tools/Makefile
+],[echo timestamp >stamp-h; sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile])
 
index 5c22b4b..ec432e0 100644 (file)
@@ -41,11 +41,13 @@ g10_SOURCES = g10.c         \
              seskey.c          \
              sign.c            \
              import.c          \
+             export.c          \
              comment.c         \
              sig-check.c
 
 
-LDADD = -L ../cipher -L ../mpi -L ../util -lcipher -lmpi -lutil
+LDADD = -L ../cipher -L ../mpi -L ../util -L ../intl \
+       -lcipher -lmpi -lutil -lintl
 
 
 $(PROGRAMS): ../cipher/libcipher.a ../mpi/libmpi.a ../util/libutil.a
index 1212499..ec99a5b 100644 (file)
@@ -79,10 +79,12 @@ g10_SOURCES = g10.c         \
              seskey.c          \
              sign.c            \
              import.c          \
+             export.c          \
              comment.c         \
              sig-check.c
 
-LDADD = -L ../cipher -L ../mpi -L ../util -lcipher -lmpi -lutil
+LDADD = -L ../cipher -L ../mpi -L ../util -L ../intl \
+       -lcipher -lmpi -lutil -lintl
 mkinstalldirs = $(top_srcdir)/scripts/mkinstalldirs
 CONFIG_HEADER = ../config.h
 PROGRAMS = $(bin_PROGRAMS)
@@ -104,7 +106,7 @@ g10_OBJECTS = g10.o build-packet.o compress.o encode.o encr-data.o \
 free-packet.o getkey.o pkclist.o skclist.o ringedit.o kbnode.o keygen.o \
 mainproc.o armor.o mdfilter.o textfilter.o cipher.o elg.o rsa.o \
 openfile.o keyid.o trustdb.o parse-packet.o passphrase.o plaintext.o \
-pubkey-enc.o seckey-cert.o seskey.o sign.o import.o comment.o \
+pubkey-enc.o seckey-cert.o seskey.o sign.o import.o export.o comment.o \
 sig-check.o
 EXTRA_g10_SOURCES =
 g10_LDADD = $(LDADD)
@@ -124,8 +126,8 @@ DEP_FILES = $(srcdir)/.deps/armor.P $(srcdir)/.deps/build-packet.P \
 $(srcdir)/.deps/cipher.P $(srcdir)/.deps/comment.P \
 $(srcdir)/.deps/compress.P $(srcdir)/.deps/elg.P \
 $(srcdir)/.deps/encode.P $(srcdir)/.deps/encr-data.P \
-$(srcdir)/.deps/free-packet.P $(srcdir)/.deps/g10.P \
-$(srcdir)/.deps/getkey.P $(srcdir)/.deps/import.P \
+$(srcdir)/.deps/export.P $(srcdir)/.deps/free-packet.P \
+$(srcdir)/.deps/g10.P $(srcdir)/.deps/getkey.P $(srcdir)/.deps/import.P \
 $(srcdir)/.deps/kbnode.P $(srcdir)/.deps/keygen.P \
 $(srcdir)/.deps/keyid.P $(srcdir)/.deps/mainproc.P \
 $(srcdir)/.deps/mdfilter.P $(srcdir)/.deps/openfile.P \
index 684abd2..ed91fcf 100644 (file)
@@ -42,6 +42,12 @@ encrypt
 # (Can be combined with a "sign")
 # encrypt data
 
+export <names>
+# Either export all keys from all keyrings (default keyrings and
+# those registered via option "keyring"), or if at least one name is
+# given, those of the givename. The new keyring is written to stdout
+# or to the file given with option "output"
+
 fingerprint
 # show the fingerprints,
 
diff --git a/g10/export.c b/g10/export.c
new file mode 100644 (file)
index 0000000..d45c128
--- /dev/null
@@ -0,0 +1,47 @@
+/* export.c
+ *     Copyright (c) 1998 by Werner Koch (dd9jn)
+ *
+ * This file is part of G10.
+ *
+ * G10 is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * G10 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+#include "options.h"
+#include "packet.h"
+#include "errors.h"
+#include "keydb.h"
+#include "memory.h"
+#include "util.h"
+
+
+/****************
+ * Make a new keyring from all internal keyrings (if no user is given)
+ * or for all selected users.
+ */
+int
+export_pubkeys( STRLIST users )
+{
+    log_fatal("Not yet implemented");
+    return 0;
+}
+
+
index b9ce925..73cb147 100644 (file)
--- a/g10/g10.c
+++ b/g10/g10.c
 #include "filter.h"
 #include "trustdb.h"
 #include "ttyio.h"
+#include "i18n.h"
+
 
 enum cmd_values { aNull = 0,
     aSym, aStore, aEncr, aPrimegen, aKeygen, aSign, aSignEncr,
     aPrintMDs, aSignKey, aClearsig, aListPackets, aEditSig,
     aKMode, aKModeC, aChangePass, aImport, aListTrustDB,
-    aListTrustPath,
+    aListTrustPath, aExport,
 aTest };
 
 
@@ -67,24 +69,31 @@ strusage( int level )
                break;
       case 2:
       case 12: p =
-    "Syntax: g10 [options] [files]\n"
-    "sign, check, encrypt or decrypt\n"
-    "default operation depends on the input data\n"; break;
+    _("Syntax: g10 [options] [files]\n"
+      "sign, check, encrypt or decrypt\n"
+      "default operation depends on the input data\n"); break;
 
       case 26:
-       p = "Please report bugs to <g10-bugs@isil.d.shuttle.de>.\n";
+       p = _("Please report bugs to <g10-bugs@isil.d.shuttle.de>.\n");
        break;
 
-      case 30: p = ""
-  #ifndef HAVE_ZLIB_H
+  #if !defined(HAVE_ZLIB_H) && defined(HAVE_RSA_CIPHER)
+      case 30: p = _(
     "   NOTE: This version is compiled without ZLIB support;\n"
     "         you are not able to process compresssed data!\n"
-  #endif
-  #ifdef HAVE_RSA_CIPHER
     "WARNING: This version has RSA support! Your are not allowed to\n"
-    "         use it inside the Unites States before Sep 30, 2000!\n"
+    "         use it inside the Unites States before Sep 30, 2000!\n" );
+  #elif !defined(HAVE_ZLIB_H)
+      case 30: p = _(
+    "   NOTE: This version is compiled without ZLIB support;\n"
+    "         you are not able to process compresssed data!\n");
+  #elif defined(HAVE_RSA_CIPHER)
+      case 30: p = _(
+    "WARNING: This version has RSA support! Your are not allowed to\n"
+    "         use it inside the Unites States before Sep 30, 2000!\n" );
+  #else
+      case 30: p = "";
   #endif
-       ;
        break;
       default: p = default_strusage(level);
     }
@@ -92,9 +101,19 @@ strusage( int level )
 }
 
 static void
+i18n_init(void)
+{
+  #ifdef HAVE_LIBINTL
+    setlocale( LC_MESSAGES, "" );
+    bindtextdomain( PACKAGE, G10_LOCALEDIR );
+    textdomain( PACKAGE );
+  #endif
+}
+
+static void
 wrong_args( const char *text)
 {
-    fputs("Usage: g10 [options] ",stderr);
+    fputs(_("Usage: g10 [options] "),stderr);
     fputs(text,stderr);
     putc('\n',stderr);
     exit(2);
@@ -130,7 +149,7 @@ set_cmd( enum cmd_values *ret_cmd, enum cmd_values new_cmd )
     else if( cmd == aKMode && new_cmd == aSym )
        cmd = aKModeC;
     else {
-       log_error("conflicting commands\n");
+       log_error(_("conflicting commands\n"));
        exit(2);
     }
 
@@ -142,57 +161,58 @@ int
 main( int argc, char **argv )
 {
     static ARGPARSE_OPTS opts[] = {
-    { 'a', "armor",     0, "create ascii armored output"},
-    { 'v', "verbose",   0, "verbose" },
-    { 'z', NULL,        1, "set compress level (0 disables)" },
-    { 'n', "dry-run",   0, "don't make any changes" },
-    { 'c', "symmetric", 0, "do only a symmetric encryption" },
-    { 'o', "output",    2, "use as output file" },
-    { 500, "batch",     0, "batch mode: never ask" },
-    { 501, "yes",       0, "assume yes on most questions"},
-    { 502, "no",        0, "assume no on most questions"},
-    { 503, "gen-key",   0, "generate a new key pair" },
-    { 504, "add-key",   0, "add key to the public keyring" },
-    { 505, "delete-key",0, "remove key from public keyring" },
-    { 506, "sign-key"  ,0, "make a signature on a key in the keyring" },
-    { 507, "store",     0, "store only" },
-    { 508, "check-key" ,0, "check signatures on a key in the keyring" },
-    { 509, "keyring"   ,2, "add this keyring to the list of keyrings" },
-    { 's', "sign",      0, "make a signature"},
-    { 't', "textmode",  0, "use canonical text mode"},
-    { 'b', "detach-sign", 0, "make a detached signature"},
-    { 'e', "encrypt",   0, "encrypt data" },
-    { 'd', "decrypt",   0, "decrypt data (default)" },
-    { 'u', "local-user",2, "use this user-id to sign or decrypt" },
-    { 'r', "remote-user", 2, "use this user-id for encryption" },
-    { 'k', NULL      , 0, "list keys" },
-    { 510, "debug"     ,4|16, "set debugging flags" },
-    { 511, "debug-all" ,0, "enable full debugging"},
-    { 512, "cache-all" ,0, "hold everything in memory"},
+    { 'a', "armor",     0, N_("create ascii armored output")},
+    { 'v', "verbose",   0, N_("verbose") },
+    { 'z', NULL,        1, N_("set compress level (0 disables)") },
+    { 'n', "dry-run",   0, N_("don't make any changes") },
+    { 'c', "symmetric", 0, N_("do only a symmetric encryption")},
+    { 'o', "output",    2, N_("use as output file")},
+    { 500, "batch",     0, N_("batch mode: never ask")},
+    { 501, "yes",       0, N_("assume yes on most questions")},
+    { 502, "no",        0, N_("assume no on most questions")},
+    { 503, "gen-key",   0, N_("generate a new key pair")},
+    { 504, "add-key",   0, N_("add key to the public keyring")},
+    { 505, "delete-key",0, N_("remove key from public keyring")},
+    { 506, "sign-key"  ,0, N_("make a signature on a key in the keyring")},
+    { 507, "store",     0, N_("store only")},
+    { 508, "check-key" ,0, N_("check signatures on a key in the keyring")},
+    { 509, "keyring"   ,2, N_("add this keyring to the list of keyrings")},
+    { 's', "sign",      0, N_("make a signature")},
+    { 't', "textmode",  0, N_("use canonical text mode")},
+    { 'b', "detach-sign", 0, N_("make a detached signature")},
+    { 'e', "encrypt",   0, N_("encrypt data")},
+    { 'd', "decrypt",   0, N_("decrypt data (default)")},
+    { 'u', "local-user",2, N_("use this user-id to sign or decrypt")},
+    { 'r', "remote-user", 2, N_("use this user-id for encryption")},
+    { 'k', NULL      , 0, N_("list keys")},
+    { 510, "debug"     ,4|16, N_("set debugging flags")},
+    { 511, "debug-all" ,0, N_("enable full debugging")},
+ /* { 512 unused */
     { 513, "gen-prime" , 0, "\r" },
     { 514, "test"      , 0, "\r" },
-    { 515, "fingerprint", 0, "show the fingerprints"},
-    { 516, "print-mds" , 0, "print all message digests"},
-    { 517, "secret-keyring" ,2, "add this secret keyring to the list" },
-    { 518, "options"   , 2, "read options from file" },
+    { 515, "fingerprint", 0, N_("show the fingerprints")},
+    { 516, "print-mds" , 0, N_("print all message digests")},
+    { 517, "secret-keyring" ,2, N_("add this secret keyring to the list")},
+    { 518, "options"   , 2, N_("read options from file")},
     { 519, "no-armor",   0, "\r"},
     { 520, "no-default-keyring", 0, "\r" },
-    { 521, "list-packets",0,"list only the sequence of packets"},
+    { 521, "list-packets",0,N_("list only the sequence of packets")},
     { 522, "no-greeting", 0, "\r" },
     { 523, "passphrase-fd",1, "\r" },
-    { 524, "edit-sig"  ,0, "edit a key signature" },
-    { 525, "change-passphrase", 0, "change the passphrase of your secret keyring"},
+    { 524, "edit-sig"  ,0, N_("edit a key signature")},
+    { 525, "change-passphrase", 0, N_("change the passphrase of your secret keyring")},
     { 526, "no-verbose", 0, "\r"},
-    { 527, "cipher-algo", 2 , "select default cipher algorithm" },
-    { 528, "pubkey-algo", 2 , "select default puplic key algorithm" },
-    { 529, "digest-algo", 2 , "select default message digest algorithm" },
-    { 530, "import",      0 , "put public keys into the trustdb" },
+    { 527, "cipher-algo", 2 , N_("select default cipher algorithm")},
+    { 528, "pubkey-algo", 2 , N_("select default puplic key algorithm")},
+    { 529, "digest-algo", 2 , N_("select default message digest algorithm")},
+    { 530, "import",      0 , N_("put public keys into the trustdb")},
     { 531, "list-trustdb",0 , "\r"},
     { 532, "quick-random", 0, "\r"},
     { 533, "list-trust-path",0, "\r"},
-    { 534, "no-comment", 0,   "do not write comment packets"},
-    { 535, "completes_needed", 1, "(default is 1)"},
-    { 536, "marginals_needed", 1, "(default is 3)"},
+    { 534, "no-comment", 0,   N_("do not write comment packets")},
+    { 535, "completes-needed", 1, N_("(default is 1)")},
+    { 536, "marginals-needed", 1, N_("(default is 3)")},
+    { 537, "export", 0, N_("export all or the given keys") },
 
     {0} };
     ARGPARSE_ARGS pargs;
@@ -217,6 +237,7 @@ main( int argc, char **argv )
     enum cmd_values cmd = 0;
 
 
+    i18n_init();
     opt.compress = -1; /* defaults to standard compress level */
     opt.def_cipher_algo = CIPHER_ALGO_BLOWFISH;
     opt.def_pubkey_algo = PUBKEY_ALGO_ELGAMAL;
@@ -256,15 +277,15 @@ main( int argc, char **argv )
        if( !configfp ) {
            if( default_config ) {
                if( parse_verbose > 1 )
-               log_info("note: no default option file '%s'\n", configname );
+               log_info(_("note: no default option file '%s'\n"), configname );
            }
            else
-               log_fatal("option file '%s': %s\n",
+               log_fatal(_("option file '%s': %s\n"),
                                    configname, strerror(errno) );
            m_free(configname); configname = NULL;
        }
        if( parse_verbose > 1 )
-           log_info("reading options from '%s'\n", configname );
+           log_info(_("reading options from '%s'\n"), configname );
        default_config = 0;
     }
 
@@ -306,7 +327,7 @@ main( int argc, char **argv )
          case 509: add_keyring(pargs.r.ret_str); nrings++; break;
          case 510: opt.debug |= pargs.r.ret_ulong; break;
          case 511: opt.debug = ~0; break;
-         case 512: opt.cache_all = 1; break;
+       /*  case 512: */
          case 513: set_cmd( &cmd, aPrimegen); break;
          case 514: set_cmd( &cmd, aTest); break;
          case 515: opt.fingerprint = 1; break;
@@ -344,6 +365,7 @@ main( int argc, char **argv )
          case 534: opt.no_comment=1; break;
          case 535: opt.completes_needed = pargs.r.ret_int; break;
          case 536: opt.marginals_needed = pargs.r.ret_int; break;
+         case 537: set_cmd( &cmd, aExport); break;
          default : errors++; pargs.err = configfp? 1:2; break;
        }
     }
@@ -355,23 +377,23 @@ main( int argc, char **argv )
     }
     m_free( configname ); configname = NULL;
     if( !opt.def_cipher_algo || check_cipher_algo(opt.def_cipher_algo) ) {
-       log_error("selected cipher algorithm is invalid\n");
+       log_error(_("selected cipher algorithm is invalid\n"));
        errors++;
     }
     if( !opt.def_pubkey_algo || check_pubkey_algo(opt.def_pubkey_algo) ) {
-       log_error("selected pubkey algorithm is invalid\n");
+       log_error(_("selected pubkey algorithm is invalid\n"));
        errors++;
     }
     if( !opt.def_digest_algo || check_digest_algo(opt.def_digest_algo) ) {
-       log_error("selected digest algorithm is invalid\n");
+       log_error(_("selected digest algorithm is invalid\n"));
        errors++;
     }
     if( opt.completes_needed < 1 ) {
-       log_error("completes_needed must be greater than 0\n");
+       log_error(_("completes-needed must be greater than 0\n"));
        errors++;
     }
     if( opt.marginals_needed < 2 ) {
-       log_error("marginals_needed must be greater than 1\n");
+       log_error(_("marginals-needed must be greater than 1\n"));
        errors++;
     }
     if( errors )
@@ -435,7 +457,7 @@ main( int argc, char **argv )
       default: rc = init_trustdb(1); break;
     }
     if( rc )
-       log_error("failed to initialize the TrustDB: %s\n", g10_errstr(rc));
+       log_error(_("failed to initialize the TrustDB: %s\n"), g10_errstr(rc));
 
 
     switch( cmd ) {
@@ -527,7 +549,7 @@ main( int argc, char **argv )
 
            while( (s=get_keyring(seq++)) ) {
                if( !(a = iobuf_open(s)) ) {
-                   log_error("can't open '%s'\n", s);
+                   log_error(_("can't open '%s'\n"), s);
                    continue;
                }
                if( seq > 1 )
@@ -544,7 +566,7 @@ main( int argc, char **argv )
        }
        else if( argc == 1) { /* list the given keyring */
            if( !(a = iobuf_open(fname)) )
-               log_fatal("can't open '%s'\n", fname_print);
+               log_fatal(_("can't open '%s'\n"), fname_print);
            proc_packets( a );
            iobuf_close(a);
        }
@@ -603,6 +625,15 @@ main( int argc, char **argv )
        }
        break;
 
+      case aExport:
+       sl = NULL;
+       for( ; argc; argc--, argv++ )
+           add_to_strlist( &sl, *argv );
+       export_pubkeys( sl );
+       free_strlist(sl);
+       break;
+
+
       case aListTrustDB:
        if( !argc )
            list_trustdb(NULL);
@@ -614,7 +645,7 @@ main( int argc, char **argv )
 
       case aListTrustPath:
        if( argc != 2 )
-           wrong_args("--list-trust-path  <maxdepth> <username>");
+           wrong_args("--list-trust-path [-- -]<maxdepth> <username>");
        list_trust_path( atoi(*argv), argv[1] );
        break;
 
@@ -624,7 +655,7 @@ main( int argc, char **argv )
        if( argc > 1 )
            usage(1);
        if( !(a = iobuf_open(fname)) )
-           log_fatal("can't open '%s'\n", fname_print);
+           log_fatal(_("can't open '%s'\n"), fname_print);
        if( !opt.no_armor ) {
            /* push the armor filter, so it can peek at the input data */
            memset( &afx, 0, sizeof afx);
index b1cb64a..eea9b6b 100644 (file)
@@ -23,6 +23,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <assert.h>
+#include <ctype.h>
 #include "util.h"
 #include "packet.h"
 #include "memory.h"
@@ -215,15 +216,6 @@ get_pubkey( PKT_public_cert *pkc, u32 *keyid )
     STRLIST sl;
 
 
-    if( opt.cache_all && !pkc_cache ) {
-       log_info("reading all entries ...\n");
-       for(sl = keyrings; sl; sl = sl->next )
-           if( !scan_keyring( NULL, NULL, NULL, sl->d ) )
-               goto leave;
-       log_info("cached %d entries\n", pkc_cache_entries);
-    }
-
-
     /* lets see wether we checked the keyid already */
     for( kl = unknown_keyids; kl; kl = kl->next )
        if( kl->keyid[0] == keyid[0] && kl->keyid[1] == keyid[1] )
@@ -273,6 +265,19 @@ get_pubkey( PKT_public_cert *pkc, u32 *keyid )
  * first pubkey certificate which has the given name in a user_id.
  * if pkc has the pubkey algo set, the function will only return
  * a pubkey with that algo.
+ *
+ * - If the username starts with 8,9,16 or 17 hex-digits (the first one
+ *   must be in the range 0..9), this is considered a keyid; depending
+ *   on the length a short or complete one.
+ * - If the username starts with 32,33,40 or 41 hex-digits (the first one
+ *   must be in the range 0..9), this is considered a fingerprint.
+ *   (Not yet implemented)
+ * - If the username starts with a left angle, we assume it is a complete
+ *   email address and look only at this part.
+ * - If the userid start with an '=' an exact compare is done; this may
+ *   also follow the keyid in which case both parts are matched.
+ *   (Not yet implemented)
+ *
  */
 int
 get_pubkey_byname( PKT_public_cert *pkc, const char *name )
@@ -280,6 +285,58 @@ get_pubkey_byname( PKT_public_cert *pkc, const char *name )
     int internal = 0;
     int rc = 0;
     STRLIST sl;
+    const char *s;
+    u32 keyid[2] = {0}; /* init to avoid compiler warning */
+    int use_keyid=0;
+
+    /* check what kind of name it is */
+    for(s = name; *s && isspace(*s); s++ )
+       ;
+    if( isdigit( *s ) ) { /* a keyid */
+       int i;
+       char buf[9];
+
+       for(i=0; isxdigit(s[i]); i++ )
+           ;
+       if( s[i] && !isspace(s[i]) ) /* not terminated by EOS or blank*/
+           rc = G10ERR_INV_USER_ID;
+       else if( i == 8 || (i == 9 && *s == '0') ) { /* short keyid */
+           if( i==9 )
+               s++;
+           keyid[1] = strtoul( s, NULL, 16 );
+           use_keyid++;
+       }
+       else if( i == 16 || (i == 17 && *s == '0') ) { /* complete keyid */
+           if( i==17 )
+               s++;
+           mem2str(buf, s, 9 );
+           keyid[0] = strtoul( buf, NULL, 16 );
+           keyid[1] = strtoul( s+8, NULL, 16 );
+           return get_pubkey( pkc, keyid );
+       }
+       else
+           rc = G10ERR_INV_USER_ID;
+    }
+    else if( *s == '<' ) { /* an email address */
+       /* for now handled like a substring */
+       /* a keyserver might use this for quicker access */
+    }
+    else if( *s == '=' ) { /* exact search */
+       rc = G10ERR_INV_USER_ID; /* nox yet implemented */
+    }
+    else if( *s == '#' ) { /* use local id */
+       rc = G10ERR_INV_USER_ID; /* nox yet implemented */
+    }
+    else if( *s == '*' ) { /* substring search */
+       name++;
+    }
+    else if( !*s )  /* empty string */
+       rc = G10ERR_INV_USER_ID;
+
+    if( rc )
+       goto leave;
+
+
 
     if( !pkc ) {
        pkc = m_alloc_clear( sizeof *pkc );
@@ -288,9 +345,14 @@ get_pubkey_byname( PKT_public_cert *pkc, const char *name )
 
     /* 2. Try to get it from the keyrings */
     for(sl = keyrings; sl; sl = sl->next )
-       if( !scan_keyring( pkc, NULL, name, sl->d ) )
-           goto leave;
-
+       if( use_keyid ) {
+           if( !scan_keyring( pkc, keyid, name, sl->d ) )
+               goto leave;
+       }
+       else {
+           if( !scan_keyring( pkc, NULL, name, sl->d ) )
+               goto leave;
+       }
     /* 3. Try to get it from a key server */
 
     /* 4. not found: store it for future reference */
@@ -363,6 +425,9 @@ get_seckey_byname( PKT_secret_cert *skc, const char *name, int unprotect )
 
 /****************
  * scan the keyring and look for either the keyid or the name.
+ * If both, keyid and name are given, look for keyid but use only
+ * the low word of it (name is only used as a flag to indicate this mode
+ * of operation).
  */
 static int
 scan_keyring( PKT_public_cert *pkc, u32 *keyid,
@@ -375,11 +440,11 @@ scan_keyring( PKT_public_cert *pkc, u32 *keyid,
     int save_mode;
     u32 akeyid[2];
     PKT_public_cert *last_pk = NULL;
+    int shortkeyid;
 
-    assert( !keyid || !name );
-
-    if( opt.cache_all && (name || keyid) )
-       return G10ERR_NO_PUBKEY;
+    shortkeyid = keyid && name;
+    if( shortkeyid )
+       name = NULL; /* not used anymore */
 
     if( !(a = iobuf_open( filename ) ) ) {
        log_debug("scan_keyring: can't open '%s'\n", filename );
@@ -388,6 +453,8 @@ scan_keyring( PKT_public_cert *pkc, u32 *keyid,
 
     if( !DBG_CACHE )
        ;
+    else if( shortkeyid )
+       log_debug("scan_keyring %s for %08lx\n",  filename, keyid[1] );
     else if( name )
        log_debug("scan_keyring %s for '%s'\n",  filename, name );
     else if( keyid )
@@ -410,7 +477,8 @@ scan_keyring( PKT_public_cert *pkc, u32 *keyid,
              case PUBKEY_ALGO_ELGAMAL:
              case PUBKEY_ALGO_RSA:
                keyid_from_pkc( pkt.pkt.public_cert, akeyid );
-               if( akeyid[0] == keyid[0] && akeyid[1] == keyid[1] ) {
+               if( (shortkeyid || akeyid[0] == keyid[0])
+                   && akeyid[1] == keyid[1] ) {
                    copy_public_cert( pkc, pkt.pkt.public_cert );
                    found++;
                }
index 273e7a8..5a76173 100644 (file)
@@ -79,6 +79,8 @@ void g10_rsa_sign( PKT_secret_cert *skc, PKT_signature *sig, MD_HANDLE md );
 
 /*-- import.c --*/
 int import_pubkeys( const char *filename );
+/*-- export.c --*/
+int export_pubkeys( STRLIST users );
 
 
 #endif /*G10_MAIN_H*/
index ed0cc65..89388f1 100644 (file)
@@ -31,7 +31,7 @@ struct {
     int answer_yes; /* answer yes on most questions */
     int answer_no;  /* answer no on most questions */
     int check_sigs; /* check key signatures */
-    int cache_all;
+    int reserved1;
     int fingerprint; /* list fingerprints */
     int list_sigs;   /* list signatures */
     int no_armor;
index 5381ac3..411435f 100644 (file)
@@ -33,6 +33,7 @@
 #include "util.h"
 #include "trustdb.h"
 #include "ttyio.h"
+#include "i18n.h"
 
 /****************
  * Returns true if a ownertrust has changed.
@@ -61,14 +62,14 @@ query_ownertrust( ulong lid )
        return 0;
     }
 
-    tty_printf("No ownertrust defined for %lu:\n"
-              "%4u%c/%08lX %s \"", lid,
+    tty_printf(_("No ownertrust defined for %lu:\n"
+              "%4u%c/%08lX %s \""), lid,
              nbits_from_pkc( pkc ), pubkey_letter( pkc->pubkey_algo ),
              (ulong)keyid[1], datestr_from_pkc( pkc ) );
     p = get_user_id( keyid, &n );
     tty_print_string( p, n ),
     m_free(p);
-    tty_printf("\"\n\n"
+    tty_printf(_("\"\n\n"
 "Please decide in how far do you trust this user to\n"
 "correctly sign other users keys (looking at his passport,\n"
 "checking the fingerprints from different sources ...)?\n\n"
@@ -76,19 +77,19 @@ query_ownertrust( ulong lid )
 " 2 = I do NOT trust\n"
 " 3 = I trust marginally\n"
 " 4 = I trust fully\n"
-" s = please show me more informations\n\n" );
+" s = please show me more informations\n\n") );
 
     for(;;) {
-       p = tty_get("Your decision? ");
+       p = tty_get(_("Your decision? "));
        trim_spaces(p);
        tty_kill_prompt();
        if( *p && p[1] )
            ;
        else if( *p == '?' ) {
-           tty_printf(
+           tty_printf(_(
 "It's up to you to assign a value here; this value will never be exported\n"
 "to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
-"to do with the (implicitly created) web-of-certificates.\n");
+"to do with the (implicitly created) web-of-certificates.\n"));
        }
        else if( !p[1] && (*p >= '1' && *p <= '4') ) {
            unsigned trust;
@@ -104,7 +105,7 @@ query_ownertrust( ulong lid )
            break;
        }
        else if( *p == 's' || *p == 'S' ) {
-           tty_printf("You will see a list of signators etc. here\n");
+           tty_printf(_("You will see a list of signators etc. here\n"));
        }
        m_free(p); p = NULL;
     }
@@ -128,8 +129,8 @@ add_ownertrust( PKT_public_cert *pkc )
     int any=0;
 
     tty_printf(
-"Could not find a valid trust path to the key.  Lets see, wether we\n"
-"can assign some missing owner trust values.\n\n");
+_("Could not find a valid trust path to the key.  Lets see, wether we\n"
+  "can assign some missing owner trust values.\n\n"));
 
     rc = query_trust_record( pkc );
     if( rc ) {
index 342530c..d847316 100644 (file)
@@ -6,3 +6,5 @@ mpi.h
 ttyio.h
 types.h
 util.h
+i18n.h
+
index 305a147..fcae69e 100644 (file)
@@ -54,5 +54,6 @@
 #define G10ERR_INV_KEYRING    32
 #define G10ERR_TRUSTDB       33 /* a problem with the trustdb */
 #define G10ERR_BAD_CERT       34 /* bad certicate */
+#define G10ERR_INV_USER_ID    35
 
 #endif /*G10_ERRORS_H*/
diff --git a/include/i18n.h b/include/i18n.h
new file mode 100644 (file)
index 0000000..a75f3c4
--- /dev/null
@@ -0,0 +1,37 @@
+/* i18n.h
+ *     Copyright (c) 1998 by Werner Koch (dd9jn)
+ *
+ * This file is part of G10.
+ *
+ * G10 is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * G10 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef G10_I18N_H
+#define G10_I18N_H
+
+#ifdef HAVE_LIBINTL
+  #include <libintl.h>
+  #define _(a) gettext (a)
+  #ifdef gettext_noop
+    #define N_(a) gettext_noop (a)
+  #else
+    #define N_(a) (a)
+  #endif
+#else
+  #define _(a) (a)
+  #define N_(a) (a)
+#endif
+
+#endif /*G10_I18N_H*/
index fe834e1..962efa5 100644 (file)
@@ -111,6 +111,7 @@ void free_strlist( STRLIST sl );
 #define FREE_STRLIST(a) do { free_strlist((a)); (a) = NULL ; } while(0)
 void add_to_strlist( STRLIST *list, const char *string );
 char *memistr( char *buf, size_t buflen, const char *sub );
+char *mem2str( char *, const void *, size_t);
 char *trim_spaces( char *string );
 int string_count_chr( const char *string, int c );
 
diff --git a/po/Makefile.in.in b/po/Makefile.in.in
new file mode 100644 (file)
index 0000000..49a7b1c
--- /dev/null
@@ -0,0 +1,209 @@
+# Makefile for program source directory in GNU NLS utilities package.
+# Copyright (C) 1995 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+
+SHELL = /bin/sh
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datadir = $(prefix)/@DATADIRNAME@
+localedir = $(datadir)/locale
+gnulocaledir = $(prefix)/share/locale
+gettextsrcdir = $(prefix)/share/gettext
+subdir = po
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+CC = @CC@
+GENCAT = @GENCAT@
+GMSGFMT = @GMSGFMT@
+MSGFMT = @MSGFMT@
+XGETTEXT = @XGETTEXT@
+TUPDATE = tupdate
+
+DEFS = @DEFS@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+
+INCLUDES = -I.. -I$(top_srcdir)/intl
+
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
+
+SOURCES = cat-id-tbl.c
+POFILES = @POFILES@
+GMOFILES = @GMOFILES@
+DISTFILES = ChangeLog Makefile.in.in POTFILES.in $(PACKAGE).pot \
+stamp-cat-id $(POFILES) $(GMOFILES) $(SOURCES)
+
+POTFILES = \
+
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+INSTOBJEXT = @INSTOBJEXT@
+
+.SUFFIXES:
+.SUFFIXES: .c .o .po .pox .gmo .mo .msg .cat
+
+.c.o:
+       $(COMPILE) $<
+
+.po.pox:
+       $(MAKE) $(PACKAGE).pot
+       $(TUPDATE) $(srcdir)/$(PACKAGE).pot $< > $*.pox
+
+.po.mo:
+       $(MSGFMT) -o $@ $<
+
+.po.gmo:
+       file=$(srcdir)/`echo $* | sed 's,.*/,,'`.gmo \
+         && rm -f $$file && $(GMSGFMT) -o $$file $<
+
+.po.cat:
+       sed -f ../intl/po2msg.sed < $< > $*.msg \
+         && rm -f $@ && $(GENCAT) $@ $*.msg
+
+
+all: cat-id-tbl.c $(CATALOGS)
+
+$(PACKAGE).pot: $(POTFILES)
+       $(XGETTEXT) --default-domain=$(PACKAGE) --directory=$(top_srcdir) \
+         --add-comments --keyword=_ --keyword=N_ \
+         --files-from=$(srcdir)/POTFILES.in
+       if cmp -s $(PACKAGE).po $(srcdir)/$(PACKAGE).pot; then \
+         rm -f $(PACKAGE).po; \
+       else \
+         rm -f $(srcdir)/$(PACKAGE).pot \
+           && mv $(PACKAGE).po $(srcdir)/$(PACKAGE).pot; \
+       fi
+
+cat-id-tbl.c: stamp-cat-id
+stamp-cat-id: $(PACKAGE).pot
+       rm -f cat-id-tbl.tmp.c
+       sed -f ../intl/po2tbl.sed $(srcdir)/$(PACKAGE).pot \
+               | sed -e "s/@PACKAGE NAME@/$(PACKAGE)/" > cat-id-tbl.tmp.c
+       if cmp -s cat-id-tbl.tmp.c $(srcdir)/cat-id-tbl.c; then \
+         rm cat-id-tbl.tmp.c; \
+       else \
+         echo cat-id-tbl.c changed; \
+         rm -f $(srcdir)/cat-id-tbl.c; \
+         mv cat-id-tbl.tmp.c $(srcdir)/cat-id-tbl.c; \
+       fi
+       cd $(srcdir) && rm -f stamp-cat-id && echo timestamp > stamp-cat-id
+
+
+install: install-exec install-data
+install-exec:
+install-data: all
+       $(top_srcdir)/scripts/mkinstalldirs $(datadir)
+       catalogs='$(CATALOGS)'; \
+       for cat in $$catalogs; do \
+         if test "`echo $$cat | sed 's/.*\(\..*\)/\1/'`" = ".gmo"; then \
+           destdir=$(gnulocaledir); \
+         else \
+           destdir=$(localedir); \
+         fi; \
+         lang=`echo $$cat | sed 's/$(CATOBJEXT)$$//'`; \
+         dir=$$destdir/$$lang/LC_MESSAGES; \
+         $(top_srcdir)/scripts/mkinstalldirs $$dir; \
+         if test -r $$cat; then \
+           $(INSTALL_DATA) $$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \
+         else \
+           $(INSTALL_DATA) $(srcdir)/$$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \
+         fi; \
+       done
+
+# This installation goal is only used in GNU gettext.  Packages which
+# only use the library should use install instead.
+install-src: install
+       $(top_srcdir)/scripts/mkinstalldirs $(gettextsrcdir)
+       cd $(srcdir) && \
+         $(INSTALL_DATA) Makefile.in.in $(gettextsrcdir)/po-Makefile.in.in
+
+uninstall:
+       catalogs='$(CATALOGS)'; \
+       for cat in $$catalogs; do \
+         lang=`echo $$cat | sed 's/$(CATOBJEXT)$$//'`; \
+         rm -f $(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \
+         rm -f $(gnulocaledir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \
+       done
+       rm -f $(gettextsrcdir)/po-Makefile.in.in
+
+check: all
+
+cat-id-tbl.o: ../intl/libgettext.h
+
+TAGS ID:
+
+mostlyclean:
+       rm -f core core.* *.pox $(PACKAGE).po *.old.po cat-id-tbl.tmp.c
+
+clean: mostlyclean
+
+distclean: clean
+       rm -f Makefile Makefile.in POTFILES *.mo *.msg *.cat
+
+maintainer-clean: distclean
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
+dist dist-gettext: update-po $(DISTFILES)
+       for file in $(DISTFILES); do \
+         ln $(srcdir)/$$file $(distdir) 2> /dev/null \
+           || cp -p $(srcdir)/$$file $(distdir); \
+       done
+
+update-po: Makefile
+       $(MAKE) $(PACKAGE).pot
+       cd $(srcdir); \
+       catalogs='$(CATALOGS)'; \
+       for cat in $$catalogs; do \
+         lang=`echo $$cat | sed 's/$(CATOBJEXT)$$//'`; \
+         mv $$lang.po $$lang.old.po; \
+         if $(TUPDATE) $(PACKAGE).pot $$lang.old.po > $$lang.po; then \
+           rm -f $$lang.old.po; \
+         else \
+           echo "tupdate for $$cat failed!"; \
+           rm -f $$lang.po; \
+           mv $$lang.old.po $$lang.po; \
+         fi; \
+       done
+
+POTFILES: POTFILES.in
+       ( if test 'x$(srcdir)' != 'x.'; then \
+           posrcprefix='$(top_srcdir)/'; \
+         else \
+           posrcprefix="../"; \
+         fi; \
+         sed -e '/^#/d' -e '/^[        ]*$$/d' \
+             -e "s@.*@ $$posrcprefix& \\\\@" \
+             -e '$$s/\(.*\) \\/\1/' < $(srcdir)/POTFILES.in > POTFILES )
+
+Makefile: Makefile.in.in ../config.status POTFILES
+       cd .. && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= ./config.status
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/po/POTFILES.in b/po/POTFILES.in
new file mode 100644 (file)
index 0000000..fe5d394
--- /dev/null
@@ -0,0 +1,14 @@
+# List of source files containing translatable strings for G10.
+# Copyright (c) 1998 by Werner Koch (dd9jn)
+
+# utility
+
+# cipher
+
+
+# main program
+
+g10/g10.c
+g10/pkclist.c
+
+
diff --git a/po/de.po b/po/de.po
new file mode 100644 (file)
index 0000000..a62cf14
--- /dev/null
+++ b/po/de.po
@@ -0,0 +1,308 @@
+msgid ""
+msgstr ""
+"Date: 1998-01-26 22:08:36+0100\n"
+"From: Werner Koch <wk@frodo>\n"
+"Content-Type: text/plain; charset=\n"
+"Xgettext-Options: --default-domain=g10 --directory=.. --add-comments --keyword=_ --keyword=N_ --files-from=./POTFILES.in\n"
+"Files: g10/g10.c g10/pkclist.c\n"
+
+#: g10/g10.c:77
+msgid "Please report bugs to <g10-bugs@isil.d.shuttle.de>.\n"
+msgstr "Berichte über Wanzen bitte an <g10-bugs@isil.d.shuttle.de>.\n"
+
+#: g10/g10.c:82
+msgid ""
+"   NOTE: This version is compiled without ZLIB support;\n"
+"         you are not able to process compresssed data!\n"
+"WARNING: This version has RSA support! Your are not allowed to\n"
+"         use it inside the Unites States before Sep 30, 2000!\n"
+msgstr ""
+"Achtung: Komprimierte Daten können nicht bearbeiten werden,\n"
+"         da auf diesem System ZLIN nicht installiert ist!\n"
+"         (RSA Verfahren ist vorhanden.)\n"
+
+#: g10/g10.c:88
+msgid ""
+"   NOTE: This version is compiled without ZLIB support;\n"
+"         you are not able to process compresssed data!\n"
+msgstr ""
+"Achtung: Komprimierte Daten können nicht bearbeiten werden,\n"
+"         da auf diesem System ZLIB nicht installiert ist!\n"
+
+#: g10/g10.c:92
+msgid ""
+"WARNING: This version has RSA support! Your are not allowed to\n"
+"         use it inside the Unites States before Sep 30, 2000!\n"
+msgstr ""
+"         (RSA Verfahren ist vorhanden.)\n"
+
+#: g10/g10.c:109
+msgid "Usage: g10 [options] "
+msgstr "Aufruf: g10 [Opeionen] "
+
+#: g10/g10.c:145
+msgid "conflicting commands\n"
+msgstr ""
+
+#: g10/g10.c:157
+msgid "create ascii armored output"
+msgstr "Ausgabe mit ASCII Armor versehen"
+
+#: g10/g10.c:158
+msgid "verbose"
+msgstr "detailierte Informationen"
+
+#: g10/g10.c:159
+msgid "set compress level (0 disables)"
+msgstr "Kompressionspegel sethen (aussschalten mit 0)"
+
+#: g10/g10.c:160
+msgid "don't make any changes"
+msgstr "Keine wirklichen Änderungen durchführen"
+
+#: g10/g10.c:168
+msgid "do only a symmetric encryption"
+msgstr ""
+
+#: g10/g10.c:169
+msgid "use as output file"
+msgstr ""
+
+#: g10/g10.c:170
+msgid "batch mode: never ask"
+msgstr ""
+
+#: g10/g10.c:171
+msgid "assume yes on most questions"
+msgstr ""
+
+#: g10/g10.c:172
+msgid "assume no on most questions"
+msgstr ""
+
+#: g10/g10.c:173
+msgid "generate a new key pair"
+msgstr ""
+
+#: g10/g10.c:174
+msgid "add key to the public keyring"
+msgstr ""
+
+#: g10/g10.c:175
+msgid "remove key from public keyring"
+msgstr "Key entfernen"
+
+#: g10/g10.c:176
+msgid "make a signature on a key in the keyring"
+msgstr "key signieren"
+
+#: g10/g10.c:177
+msgid "store only"
+msgstr ""
+
+#: g10/g10.c:178
+msgid "check signatures on a key in the keyring"
+msgstr "  "
+
+#: g10/g10.c:179
+msgid "add this keyring to the list of keyrings"
+msgstr ""
+
+#: g10/g10.c:180
+msgid "make a signature"
+msgstr ""
+
+#: g10/g10.c:181
+msgid "use canonical text mode"
+msgstr ""
+
+#: g10/g10.c:182
+msgid "make a detached signature"
+msgstr ""
+
+#: g10/g10.c:183
+msgid "encrypt data"
+msgstr ""
+
+#: g10/g10.c:184
+msgid "decrypt data (default)"
+msgstr ""
+
+#: g10/g10.c:185
+msgid "use this user-id to sign or decrypt"
+msgstr ""
+
+#: g10/g10.c:186
+msgid "use this user-id for encryption"
+msgstr ""
+
+#: g10/g10.c:187
+msgid "list keys"
+msgstr ""
+
+#: g10/g10.c:188
+msgid "set debugging flags"
+msgstr ""
+
+#: g10/g10.c:189
+msgid "enable full debugging"
+msgstr ""
+
+#: g10/g10.c:193
+msgid "show the fingerprints"
+msgstr ""
+
+#: g10/g10.c:194
+msgid "print all message digests"
+msgstr ""
+
+#: g10/g10.c:195
+msgid "add this secret keyring to the list"
+msgstr ""
+
+#: g10/g10.c:196
+msgid "read options from file"
+msgstr ""
+
+#: g10/g10.c:199
+msgid "list only the sequence of packets"
+msgstr ""
+
+#: g10/g10.c:202
+msgid "edit a key signature"
+msgstr ""
+
+#: g10/g10.c:203
+msgid "change the passphrase of your secret keyring"
+msgstr ""
+
+#: g10/g10.c:205
+msgid "select default cipher algorithm"
+msgstr ""
+
+#: g10/g10.c:206
+msgid "select default puplic key algorithm"
+msgstr ""
+
+#: g10/g10.c:207
+msgid "select default message digest algorithm"
+msgstr ""
+
+#: g10/g10.c:208
+msgid "put public keys into the trustdb"
+msgstr ""
+
+#: g10/g10.c:212
+msgid "do not write comment packets"
+msgstr ""
+
+#: g10/g10.c:213
+msgid "(default is 1)"
+msgstr ""
+
+#: g10/g10.c:214
+msgid "(default is 3)"
+msgstr ""
+
+#: g10/g10.c:215
+msgid "export all or the given keys"
+msgstr ""
+
+#: g10/g10.c:280
+msgid "note: no default option file '%s'\n"
+msgstr ""
+
+#: g10/g10.c:283
+msgid "option file '%s': %s\n"
+msgstr ""
+
+#: g10/g10.c:288
+msgid "reading options from '%s'\n"
+msgstr ""
+
+#: g10/g10.c:380
+msgid "selected cipher algorithm is invalid\n"
+msgstr ""
+
+#: g10/g10.c:384
+msgid "selected pubkey algorithm is invalid\n"
+msgstr ""
+
+#: g10/g10.c:388
+msgid "selected digest algorithm is invalid\n"
+msgstr ""
+
+#: g10/g10.c:392
+msgid "completes-needed must be greater than 0\n"
+msgstr ""
+
+#: g10/g10.c:396
+msgid "marginals-needed must be greater than 1\n"
+msgstr ""
+
+#: g10/g10.c:460
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr ""
+
+#: g10/g10.c:552 g10/g10.c:569 g10/g10.c:658
+msgid "can't open '%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:65
+msgid ""
+"No ownertrust defined for %lu:\n"
+"%4u%c/%08lX %s \""
+msgstr ""
+
+#: g10/pkclist.c:72
+msgid ""
+"\"\n"
+"\n"
+"Please decide in how far do you trust this user to\n"
+"correctly sign other users keys (looking at his passport,\n"
+"checking the fingerprints from different sources ...)?\n"
+"\n"
+" 1 = Don't know\n"
+" 2 = I do NOT trust\n"
+" 3 = I trust marginally\n"
+" 4 = I trust fully\n"
+" s = please show me more informations\n"
+"\n"
+msgstr ""
+"\"\n"
+"\n"
+"Bitte entscheiden Sie, in wieweit Sie diesem User zutrauen,\n"
+"eines anderen Users Key korrekt zu signieren (Vergleich mit dem Paß,\n"
+"vergleichen der Fingerprints aus unterschiedlichen Quellen ...)?\n"
+"\n"
+" 1 = Weiß nicht so recht\n"
+" 2 = Neeh, dem traue ich das nicht zu\n"
+" 3 = Ich vertraue ihm normalerweise\n"
+" 4 = Ich vertraue ihm immer\n"
+" s = Bitte weitere Information anzeigen\n"
+"\n"
+
+#: g10/pkclist.c:83
+msgid "Your decision? "
+msgstr "Ihre Auswahl? "
+
+#: g10/pkclist.c:90
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates.\n"
+msgstr ""
+
+#: g10/pkclist.c:108
+msgid "You will see a list of signators etc. here\n"
+msgstr ""
+
+#: g10/pkclist.c:132
+msgid ""
+"Could not find a valid trust path to the key.  Lets see, wether we\n"
+"can assign some missing owner trust values.\n"
+"\n"
+msgstr ""
+"Ein gültiger Trust Path konnte für diesen Key nicht gefunden werden.\n"
+"Mal sehen ob wir now weitere Ownertrust Werte zuordnen können.\n"
+"\n"
index 89c873c..09c820a 100644 (file)
@@ -27,6 +27,7 @@
 #include <string.h>
 
 #include "util.h"
+#include "i18n.h"
 
 
 /*********************************
@@ -544,7 +545,7 @@ show_help( ARGPARSE_OPTS *opts, unsigned flags )
        indent += 10;
        puts("Options:");
        for(i=0; opts[i].short_opt; i++ ) {
-           s = opts[i].description;
+           s = _(opts[i].description);
            if( s && *s== '\r' ) /* hide this line */
                continue;
            if( opts[i].short_opt < 256 )
index b6024cb..79a96d6 100644 (file)
@@ -66,6 +66,7 @@ g10_errstr( int err )
       X(SIG_CLASS      ,"Unknown signature class")
       X(TRUSTDB        ,"TrustDB error")
       X(BAD_CERT       ,"Bad certificate")
+      X(INV_USER_ID    ,"malformed user id")
 
       default: p = buf; sprintf(buf, "g10err=%d", err); break;
     }
index cb80c57..286e902 100644 (file)
@@ -73,6 +73,31 @@ memistr( char *buf, size_t buflen, const char *sub )
     return NULL ;
 }
 
+/****************
+ * Wie strncpy(), aber es werden maximal n-1 zeichen kopiert und ein
+ * '\0' angehängt. Ist n = 0, so geschieht nichts, ist Destination
+ * gleich NULL, so wird via m_alloc Speicher besorgt, ist dann nicht
+ * genügend Speicher vorhanden, so bricht die funktion ab.
+ */
+char *
+mem2str( char *dest , const void *src , size_t n )
+{
+    char *d;
+    const char *s;
+
+    if( n ) {
+       if( !dest )
+           dest = m_alloc( n ) ;
+       d = dest;
+       s = src ;
+       for(n--; n && *s; n-- )
+           *d++ = *s++;
+       *d = '\0' ;
+    }
+
+    return dest ;
+}
+
 
 /****************
  * remove leading and trailing white spaces