Page MenuHome GnuPG

No OneTemporary

This document is not UTF8. It was detected as Shift JIS and converted to UTF8 for display.
diff --git a/util/ChangeLog b/util/ChangeLog
index 6a3a7850e..226f24592 100644
--- a/util/ChangeLog
+++ b/util/ChangeLog
@@ -1,1737 +1,1743 @@
+2007-04-15 David Shaw <dshaw@jabberwocky.com>
+
+ * argparse.c (default_strusage): Copyright 2007.
+
+ * cert.c, srv.c, pka.c: Need arpa/inet.h for ntohs().
+
2007-02-26 Werner Koch <wk@g10code.com>
* simple-gettext.c (set_gettext_file): Make use of the envvar
LANGUAGE to allow overriding of the registry setting.
2007-02-12 Werner Koch <wk@g10code.com>
* secmem.c (ptr_into_pool_p): New.
(m_is_secure): Implement in terms of above. Also check that the
pool has been initialized.
2007-02-10 David Shaw <dshaw@jabberwocky.com>
* http.c (do_parse_uri): Remove the hkp port 11371 detection. We
implement hkp in the keyserver handler, and the support here makes
it appear like a bad hkp request actually succeeded.
2007-01-31 David Shaw <dshaw@jabberwocky.com>
* ttyio.c (do_get): Assume that anything read from the user
without echoing to the screen is sensitive and put it in secure
memory. Suggested by Benjamin Bennett.
2006-12-14 Werner Koch <wk@g10code.com>
* http.c (http_wait_response): No more shutdown. Fixes bug#739.
2006-10-02 David Shaw <dshaw@jabberwocky.com>
* strsep.c (strsep): It's strsep, not strsep2 from testing. (If I
had a dollar for every time I've done that...)
2006-09-28 David Shaw <dshaw@jabberwocky.com>
* strgutil.c (strsep): Move to strsep.c for AC_REPLACE_FUNCS.
* Makefile.am: Build libcompat.a for keyserver helpers. libutil.a
always contains everything in libcompat.a, so we only need to link
to one or the other.
* miscutil.c: Move hextobyte to new file compat.c.
2006-07-31 Werner Koch <wk@g10code.com>
* iobuf.c (iobuf_ioctl, fd_cache_invalidate): Allow closing all
open files.
2006-07-29 Marcus Brinkmann <marcus@g10code.de>
* secmem.c (init_pool): Close FD after establishing the mapping.
2006-07-20 David Shaw <dshaw@jabberwocky.com>
* http.c (send_request): A zero-length proxy is the same as no
proxy at all. Suggested by J. Scott Berg.
2006-04-17 David Shaw <dshaw@jabberwocky.com>
* miscutil.c (make_printable_string): Fix bug where some control
characters lose part of their ASCII representation.
2006-04-11 David Shaw <dshaw@jabberwocky.com>
* memory.c (realloc): Revert m_guard fix and stick an #error in
there to inform people not to use it.
2006-04-11 Werner Koch <wk@g10code.com>
* iobuf.c (IOBUF_BUFFER_SIZE): New to replace hardwired 8192.
2006-04-06 David Shaw <dshaw@jabberwocky.com>
* memory.c (realloc): Fix compile problem with --enable-m-guard.
2006-03-30 David Shaw <dshaw@jabberwocky.com>
* cert.c (main): Fix test program build warning on OSX.
2006-03-16 David Shaw <dshaw@jabberwocky.com>
* cert.c (get_cert): Handle the fixed IPGP type with fingerprint.
2006-03-08 David Shaw <dshaw@jabberwocky.com>
* argparse.c (default_strusage): Update copyright year to 2006.
2006-02-19 David Shaw <dshaw@jabberwocky.com>
* http.c (send_request): A zero length proxy is the same as no
proxy.
2006-02-14 Werner Koch <wk@gnupg.org>
* errors.c (g10_errstr): Add NO_DATA.
2006-01-26 David Shaw <dshaw@jabberwocky.com>
* cert.c (get_cert): Disable IPGP types for now until the format
questions in the draft are settled.
* srv.c (getsrv): Error on oversize SRV responses.
2005-12-24 David Shaw <dshaw@jabberwocky.com>
* cert.c (get_cert): Properly chase down CNAMEs pointing to CERTs.
2005-12-23 David Shaw <dshaw@jabberwocky.com>
* cert.c, Makefile.am: New code to do DNS CERT queries.
2005-12-22 David Shaw <dshaw@jabberwocky.com>
* srv.c, Makefile.am: Only build srv.c if we need to.
2005-12-10 Ryan Lortie <desrt@desrt.ca> (dshaw)
* ttyio.c (tty_enable_completion, tty_disable_completion): Add
checks for no_terminal so we don't try to open("/dev/tty") when
invoked with --no-tty.
2005-12-06 David Shaw <dshaw@jabberwocky.com>
* Makefile.am: Some cleanup so we don't build files that are
completely ifdeffed out. This causes a warning on Sun's cc. Do
the internal regex code as well for consistency.
* mkdtemp.c (mkdtemp): Fix warning.
* secmem.c, assuan-buffer.c, dotlock.c: Fix a few warnings from
printf-ing %p where the arg wasn't void *.
2005-11-02 David Shaw <dshaw@jabberwocky.com>
* util.c [!HAVE_DECL_GETPAGESIZE]: Prototype getpagesize() if
unistd.h doesn't have it (for MinGW).
2005-09-22 Werner Koch <wk@g10code.com>
* iobuf.c (iobuf_get_filelength): New arg OVERFLOW.
(iobuf_get_filelength) [W32]: Use GetFileSizeEx if available.
* fileutil.c (is_file_compressed): Take care of the OVERFLOW
2005-08-31 David Shaw <dshaw@jabberwocky.com>
* fileutil.c (untilde): New. Expand ~/foo and ~username/foo
filenames into full paths using $HOME if possible, or
getpwuid/getpwnam if necessary.
(make_filename): Use it here.
2005-07-28 Werner Koch <wk@g10code.com>
* pka.c: New.
(parse_txt_record): Changed from v=1 to v=pka1.
* Makefile.am (pka-test): new.
2005-07-27 Werner Koch <wk@g10code.com>
* memory.c (FNAMEX, FNAMEXM): New macros to cope with the now used
names xmalloc style names.
2005-07-18 Werner Koch <wk@g10code.com>
* ttyio.c (do_get): Move printing of the prompt after disabling
echo. Suggested by Scott Worley.
2005-06-23 David Shaw <dshaw@jabberwocky.com>
* http.c (make_radix64_string): Add '=' padding as per standard.
(send_request, http_open, http_open_document): Clean up auth code.
Can now support different auth for a proxy and the file being
requested via that proxy. Unescape auth strings.
2005-06-22 David Shaw <dshaw@jabberwocky.com>
* memrchr.c (memrchr): Not all compilers allow initializing based
on a variable that is also being initialized. Noted by Nelson
H. F. Beebe.
2005-06-21 David Shaw <dshaw@jabberwocky.com>
* http.c (send_request, http_open, http_open_document): Pass in
auth and proxyauth that can override the in-url auth.
* http.c (send_request): Need == after the radix64-encoded basic
auth string.
2005-06-08 David Shaw <dshaw@jabberwocky.com>
* dotlock.c [HAVE_DOSISH_SYSTEM]: Fix unused function warnings on
mingw32. Noted by Joe Vender.
2005-05-31 Werner Koch <wk@g10code.com>
* regcomp.c (MB_CUR_MAX) [_WIN32]: Define it only if not defined.
2005-05-29 David Shaw <dshaw@jabberwocky.com>
* strgutil.c (set_native_charset) [_WIN32]: Add alias for codepage
CP65001 to utf-8.
2005-05-19 Werner Koch <wk@g10code.com>
* membuf.c: New. Taken from gnupg 1.9.
2005-05-05 David Shaw <dshaw@jabberwocky.com>
* miscutil.c (add_days_to_timestamp): Remove as unused.
2005-04-12 David Shaw <dshaw@jabberwocky.com>
* assuan-client.c: Fix warning on OSX.
* memrchr.c: New replacement function.
* assuan-buffer.c: Use it here.
2005-04-04 Werner Koch <wk@g10code.com>
* memory.c (xcalloc, xcalloc_secure): New wrappers.
* assuan-client.c (assuan_transact): Factored all code out to ..
(assuan_transact2): .. new. Add arg OKAY_CB. Wipe the memory
processed though that callback.
2005-03-31 Werner Koch <wk@g10code.com>
* isascii.c: New. This is an autoconf replacement function.
* Makefile.am (assuan_source): New. Only used when agent support
has been requested.
* assuan-buffer.c, assuan-client.c, assuan-defs.h,
* assuan-errors.c, assuan-logging.c, assuan-socket-connect.c,
* assuan-socket.c, assuan-util.c, assuan-connect.c: New. Taken
from libassuan 0.6.9 and adjusted for our limited use of Assuan.
2005-03-18 David Shaw <dshaw@jabberwocky.com>
* ttyio.c (tty_enable_completion, tty_disable_completion): Enable
and disable readline completion.
(init_ttyfp): Completion is disabled by default.
2005-03-14 Werner Koch <wk@g10code.com>
* miscutil.c (isotimestamp): New.
2005-03-10 Werner Koch <wk@g10code.com>
* secmem.c (secmem_realloc): Take control information into account
when checking whether a resize is needed.
2005-03-08 Werner Koch <wk@g10code.com>
* miscutil.c (asctimestamp) [W32]: Don't use %Z.
2005-02-03 Werner Koch <wk@g10code.com>
* w32reg.c (read_w32_registry_string): Fallback to HKLM also for a
missing name.
* http.c (connect_server): Define ERR outside of the !W32 block.
2005-02-01 David Shaw <dshaw@jabberwocky.com>
* http.c (connect_server): Fix fd leak when connecting to a
round-robin server set that has some down servers. Noted by Phil
Pennock.
2005-01-20 Werner Koch <wk@g10code.com>
* simple-gettext.c (set_gettext_file): Use MO files depending on
the installation directory. Add new arg REGKEY.
2005-01-18 Werner Koch <wk@g10code.com>
* argparse.c (default_strusage): Changed default copyright year to
2005.
* strgutil.c (handle_iconv_error): Print error messages only once.
(native_to_utf8, utf8_to_native): Ditto.
2005-01-11 Werner Koch <wk@g10code.com>
* strgutil.c (set_native_charset) [W32]: Use the alias table from
libiconv 1.9.2.
2005-01-13 David Shaw <dshaw@jabberwocky.com>
* http.c (connect_server): Use INADDR_NONE instead of
SOCKET_ERROR. Noted by Timo.
2005-01-06 Werner Koch <wk@g10code.com>
* strgutil.c (set_native_charset): Assume that ASCII,
ANSI_X3.4-1968 and 646 are actually meant as Latin-1. If
nl_langinfo is not available get the charset from environment
variables. For W32 use GetACP as error fallback. Removed Latin-15
to Latin-1 aliasing.
2004-12-28 David Shaw <dshaw@jabberwocky.com>
* srv.h: Better implementation for the SRV check. We don't need
to actually check all the header files individually since the SRV
test compile uses them together.
2004-12-20 Werner Koch <wk@g10code.com>
* strgutil.c (handle_iconv_error): Turn diagnostics into warnings
so that gpg does not return with failure.
(native_to_utf8, utf8_to_native): Ditto.
2004-12-16 Werner Koch <wk@g10code.com>
* iobuf.c (fd_cache_strcmp) [W32]: Casting is a Bad Thing. Cast to
an unsigned char pointer and to an unsigned integer.
2004-12-18 David Shaw <dshaw@jabberwocky.com>
* ttyio.c: Use only HAVE_LIBREADLINE to detect readline
availability.
2004-12-16 David Shaw <dshaw@jabberwocky.com>
* srv.h: Don't include arpa/nameser.h unless we have it. Include
"types.h" for u16.
* secmem.c (secmem_init): Return a flag to indicate whether we got
the lock.
2004-12-06 Werner Koch <wk@g10code.com>
* iobuf.c (fd_cache_strcmp): New. Use whenever we compare
filenames for the fd_cache. This is needed because the backslash
is an alias for a slash under W32. Reported by Tobias Winkler.
2004-12-03 David Shaw <dshaw@jabberwocky.com>
* http.c (send_request): Include the port if non-80 in the Host:
header. Noted by Jason Harris.
2004-11-03 Timo Schulz <twoaday@g10code.com>
* strgutil.c (w32_strerror): New.
* ttyio.c (init_ttyfp, tty_printf, do_get): Use it here.
* iobuf.c (fd_cache_open, file_filter): Likewise.
(iobuf_seek, translate_file_handle): Likewise.
2004-11-02 Werner Koch <wk@g10code.com>
* strgutil.c (load_libiconv): Use log_info to avoid failures when
iconv.dll is not installed.
2004-10-31 Werner Koch <wk@g10code.com>
* simple-gettext.c (get_string): Removed debugging hack.
2004-10-27 Werner Koch <wk@g10code.com>
* simple-gettext.c: Removed windows.h.
(get_string): On the fly translation from utf-8 to active
character set.
* strgutil.c (load_libiconv) [_WIN32]: new.
(set_native_charset) [_WIN32]: Call it here and autodetect the
used code page.
(native_to_utf8, utf8_to_native): Reverted arguments for
iconv_open.
(handle_iconv_error): Made this function match iconv_open argumnet
ordering.
(utf8_to_native): Disable all quoting for DELIM == -1.
2004-10-26 Werner Koch <wk@g10code.com>
* strgutil.c (mem2str): Translated comment to English.
(handle_iconv_error) [USE_GNUPG_ICONV]: New.
(set_native_charset) [USE_GNUPG_ICONV]: Added iconv based
conversion checks.
(native_to_utf8, utf8_to_native): Added iconv based conversion.
2004-10-21 Werner Koch <wk@g10code.com>
* vasprintf.c: Removed. It was used only at one place and I don't
want to get into build problems in 1.4.
2004-10-18 David Shaw <dshaw@jabberwocky.com>
* http.c (connect_server, send_request): Use the URI scheme as the
SRV tag rather than hard-coding _hkp.
2004-10-16 David Shaw <dshaw@jabberwocky.com>
* http.c (connect_server): [_WIN32] actually fill in the sin_addr
so we aren't always talking to localhost. Add some general sanity
checking of parameters learned from gethostbyname().
2004-10-15 Werner Koch <wk@g10code.com>
* vasprintf.c: New. Taken from gnupg 1.9.
2004-10-14 Werner Koch <wk@g10code.com>
* iobuf.c (iobuf_get_fd): Removed double check on directfp and
cats it to FILEP becuase directfp is actually a void *. Notes by
Stefan.
2004-10-13 Werner Koch <wk@g10code.com>
* logger.c (g10_log_error_f, g10_log_fatal_f, g10_log_info_f)
(g10_log_debug_f, print_prefix_f): Removed.
* iobuf.c (iobuf_is_pipe_filename): New.
(iobuf_get_fd): New.
* fileutil.c (is_file_compressed): Use it here.
2004-09-30 David Shaw <dshaw@jabberwocky.com>
* iobuf.c (pop_filter): Make static.
* dotlock.c (destroy_dotlock): New. Remove the handle from the
list of locks.
(release_dotlock): Don't act if we don't have any locks at all.
From Werner on stable branch.
2004-09-10 David Shaw <dshaw@jabberwocky.com>
* http.c (make_radix64_string, do_parse_uri, send_request): Add
basic auth for proxies and direct requests. Suggested by Florent
Thoumie.
* http.c (main): Fix test code for http-test.
2004-09-09 Werner Koch <wk@g10code.com>
* errors.c (g10_errstr): New error codes G10ERR_NO_CARD,
G10ERR_CANCELED.
* ttyio.c (tty_get): Add readline support.
* iobuf.c (iobuf_skip_rest): New. Orginal patch by Florian
Weimer. Added new argument PARTIAL.
2004-08-19 David Shaw <dshaw@jabberwocky.com>
* http.c (insert_escapes): Fix encoding problem for non-URI-safe
characters. Noted by Vladimir Novak.
2004-05-21 David Shaw <dshaw@jabberwocky.com>
* timegm.c: New replacement function. Removes the need for
setenv.c and unsetenv.c.
* setenv.c: Removed.
* unsetenv.c: Removed.
2004-03-04 David Shaw <dshaw@jabberwocky.com>
* iobuf.c (block_filter): Remove the old gpg indeterminate length
mode.
(iobuf_set_block_mode, iobuf_in_block_mode): Removed as
superfluous.
2004-03-01 David Shaw <dshaw@jabberwocky.com>
* iobuf.c (block_filter): Properly handle a partial body stream
that ends with a 5-byte length that happens to be zero.
2004-02-28 David Shaw <dshaw@jabberwocky.com>
* unsetenv.c: Fixed debugging typo.
2004-02-24 Werner Koch <wk@gnupg.org>
* secmem.c (lock_pool) [_AIX]: Also set errno.
2004-02-21 David Shaw <dshaw@jabberwocky.com>
* miscutil.c (hextobyte): Moved here from g10/misc.c so I can use
it in the keyserver helpers.
2004-02-20 David Shaw <dshaw@jabberwocky.com>
* mkdtemp.c: New (moved from g10/), setenv.c: New, unsetenv.c:
New.
* Makefile.am: Include @LIBOBJS@ for replacement functions.
2004-01-15 David Shaw <dshaw@jabberwocky.com>
* argparse.c (default_strusage): Update copyright date.
(initialize): Avoid a number of -Wformat-nonliteral warnings.
These aren't actual problems, but the warnings bothered me.
* miscutil.c (print_string2): New variation on print_string that
allows two delimiters.
(print_string): Call print_string2 to do work.
2003-12-29 David Shaw <dshaw@jabberwocky.com>
* g10u.c: Dead code. Remove.
* Makefile.am: Don't compile g10u.c.
* iobuf.c (block_filter): Properly handle a partial body stream
that ends with a 5-byte length.
2003-12-28 David Shaw <dshaw@jabberwocky.com>
* http.c (send_request, http_open_document, http_open): Pass the
http proxy from outside rather than pulling it from the
evironment.
2003-12-28 Stefan Bellon <sbellon@sbellon.de>
* riscos.c [__riscos__]: Better filetype handling (use a
different SWI) and removal of unnecessary function.
* memory.c (out_of_core) [__riscos__]: Produce stack backtrace on
RISC OS if out_of_core() is called and M_GUARD is compiled in.
2003-12-06 David Shaw <dshaw@jabberwocky.com>
* http.c (send_request): Add a Host: header for virtual hosts.
2003-12-04 David Shaw <dshaw@jabberwocky.com>
* miscutil.c (answer_is_yes_no_default, answer_is_yes_no_quit):
Don't use alternate strings when not needed so we don't have to
re-translate them. Hopefully the comment will be enough to
indicate multiple match strings.
2003-11-20 David Shaw <dshaw@jabberwocky.com>
* miscutil.c (match_multistr): New. Match against each segment in
a string with tokens separated by |.
(answer_is_yes_no_default, answer_is_yes_no_quit,
answer_is_okay_cancel): Use it here to enable alternate
translations.
2003-11-01 David Shaw <dshaw@jabberwocky.com>
* http.c (connect_server): Differentiate between generic "can't
connect" errors and the more specific "host not found". Suggested
by Samuel Tardieu.
2003-10-29 Werner Koch <wk@gnupg.org>
* miscutil.c (answer_is_okay_cancel): New.
2003-10-25 Werner Koch <wk@gnupg.org>
* Makefile.am: Replaced INTLLIBS by LIBINTL.
2003-10-23 Werner Koch <wk@gnupg.org>
* secmem.c (lock_pool) [_AIX]: Don't use plock.
2003-10-12 David Shaw <dshaw@jabberwocky.com>
* srv.c: OSX 10.2.8/Darwin 6.8 seems to have some #include
ordering issues? Move sys/types.h up higher to work around.
2003-10-08 Werner Koch <wk@gnupg.org>
* ttyio.c (tty_print_string, tty_print_utf8_string2)
(tty_print_utf8_string): Made string arg const.
2003-09-28 Timo Schulz <twoaday@freakmail.de>
* strgutil.c [WIN32] (asprintf): New.
2003-09-28 Werner Koch <wk@gnupg.org>
* ttyio.c (tty_fprintf): New.
2003-09-21 Timo Schulz <twoaday@freakmail.de>
* http.c [WIN32]: Define MB_CUR_MAX.
(connect_server): use unsigned long since W32 does not have in_addr_t.
2003-08-28 David Shaw <dshaw@jabberwocky.com>
* dotlock.c, http.c, iobuf.c, simple-gettext.c, srv.c, srv.h,
strgutil.c, ttyio.c, w32reg.c: s/__MINGW32__/_WIN32/ to help
building on native Windows compilers. Requested by Brian Gladman.
From Werner on stable branch.
* http.c (connect_server): Oops - forgot to freeaddrinfo().
2003-08-24 David Shaw <dshaw@jabberwocky.com>
* http.c (connect_server): Try and use getaddrinfo if it is
available. Try for IPv6 via getaddrinfo() or a IPv6-ized
gethostbyname(). Suggested by Jun-ichiro itojun Hagino.
2003-07-10 David Shaw <dshaw@jabberwocky.com> (from Werner on stable branch)
* iobuf.c (check_special_filename): Replaced is isdigit by digitp
to avoid passing negative values and potential locale problems.
Problem noted by Christian Biere.
* strgutil.c (strlwr,strcasecmp,strncasecmp): Make sure we don't
pass a negative value.
* miscutil.c (scan_isodatestr): Ditto.
2003-05-30 David Shaw <dshaw@jabberwocky.com>
* srv.h, srv.c: Include windows.h with MINGW32.
2003-05-24 David Shaw <dshaw@jabberwocky.com>
* argparse.c, dotlock.c, fileutil.c, iobuf.c, miscutil.c,
simple-gettext.c, errors.c, http.c, memory.c, secmem.c, ttyio.c:
Edit all preprocessor instructions to remove whitespace before the
'#'. This is not required by C89, but there are some compilers
out there that don't like it.
2003-05-21 Werner Koch <wk@gnupg.org>
* fileutil.c (is_file_compressed): Fixed checking for "-" filename.
2003-04-13 David Shaw <dshaw@jabberwocky.com>
* srv.c (main): Test against wwwkeys.pgp.net.
* srv.h: Grr. The RH7.3 Linux man page defines the fourth arg of
dn_expand as unsigned char*, but it is really char* according to
resolv.h.
2003-03-23 David Shaw <dshaw@jabberwocky.com>
* argparse.c (default_strusage): Change copyright date.
2003-03-14 David Shaw <dshaw@jabberwocky.com>
* srv.h, srv.c (getsrv): Use unsigned char rather than char.
Noted by Stefan Bellon.
2003-03-11 David Shaw <dshaw@jabberwocky.com>
* http.c (connect_server): Use DNS SRV to get a server list. Fail
over to A records if necessary.
* Makefile.am, srv.h, srv.c: New DNS SRV handling code.
2003-02-22 David Shaw <dshaw@jabberwocky.com>
* ttyio.c (tty_print_utf8_string, tty_print_utf8_string2): Use 0
to indicate a string with no maximum size. This prevents early
truncation of strings that contain control chars which are
expanded into \xXX form.
2002-12-26 David Shaw <dshaw@jabberwocky.com>
* iobuf.c (iobuf_flush): Only print debug info if debugging is on.
2002-11-13 David Shaw <dshaw@jabberwocky.com>
* secmem.c (lock_pool) [__CYGWIN__]: Don't print secmem warning.
From Werner on stable branch.
2002-11-09 Werner Koch <wk@gnupg.org>
* ttyio.c (TERMDEVICE): Removed.
(tty_get_ttyname): New.
(init_ttyfp): Use it here instead of the TERMDEVICE macro.
2002-11-06 David Shaw <dshaw@jabberwocky.com>
* w32reg.c (read_w32_registry_string): Fixed expanding of the
environment buffer; didn't worked at all. Reported by Thijmen
Klok. From Werner on stable branch.
* secmem.c (secmem_free, secmem_term): Use wipememory2() instead
of memset() to overwrite secure memory
* iobuf.c (direct_open): Handle mode 'b' if O_BINARY is available.
From Werner on stable branch.
* fileutil.c: Comment from stable branch.
2002-10-31 Stefan Bellon <sbellon@sbellon.de>
* riscos.c (riscos_load_module, riscos_check_regexp): New.
(riscos_set_filetype_by_mimetype, riscos_dump_fdlist)
(riscos_fdopenfile, riscos_close_fds, riscos_renamefile)
(riscos_gstrans, riscos_list_openfiles, riscos_not_implemented):
Renamed functions to contain riscos prefix.
* dotlock.c [__riscos__]: Renames due to changes in riscos.c.
* fileutil.c [__riscos__]: Likewise.
2002-10-29 Stefan Bellon <sbellon@sbellon.de>
* fileutil.c: Removed unnecessary left-over includes for RISC OS.
(make_filename): Tidied up RISC OS stuff.
(compare_filenames) [__riscos__]: Compare with ascii_strcasecmp().
(make_basename) [__riscos__]: Branch to own RISC OS routine from
here.
* riscos.c (riscos_make_basename): New.
2002-10-28 Stefan Bellon <sbellon@sbellon.de>
* fileutil.c (make_basename) [__riscos__]: Cut off RISC OS' filing
systems from filepath.
* riscos.c (riscos_get_filetype_from_string, riscos_get_filetype):
Added.
(riscos_set_filetype_by_number): Made public.
2002-10-19 David Shaw <dshaw@jabberwocky.com>
* Makefile.am, regcomp.c, regex.c, regex_internal.c,
regex_internal.h, regexec.c: Add new regex files from glibc 2.3.1.
2002-10-17 David Shaw <dshaw@jabberwocky.com>
* http.c (connect_server): Try all A records for names with
multiple addresses until one answers for both MINGW32 and not
MINGW32.
2002-10-10 David Shaw <dshaw@jabberwocky.com>
* http.c (connect_server): Properly handle a single A record that
fails connect().
2002-10-03 David Shaw <dshaw@jabberwocky.com>
* logger.c (g10_log_warning, log_set_strict): Add new log_warning
logger command which can be switched between log_info and
log_error via log_set_strict.
2002-09-24 David Shaw <dshaw@jabberwocky.com>
* http.c (connect_server): Try all A records for names with
multiple addresses until one answers (not MINGW32).
2002-09-16 Werner Koch <wk@gnupg.org>
* w32reg.c (read_w32_registry_string): Fallback to HLM.
2002-09-12 Stefan Bellon <sbellon@sbellon.de>
* fileutil.c (make_filename): Removed variable for RISC OS to
avoid compiler warning.
* secmem.c: Removed static variable for RISC OS to avoid
compiler warning.
2002-09-11 Werner Koch <wk@gnupg.org>
* simple-gettext.c: Disable charset mappings. We do it now when
installing the files.
2002-09-09 Werner Koch <wk@gnupg.org>
* w32reg.c (read_w32_registry_string): Handle REG_EXPAND_SZ.
Suggested by Ryan Malayter.
* strgutil.c (ascii_strcasecmp): Replaced by code from gnulib.
(ascii_strncasecmp): New.
2002-09-02 Werner Koch <wk@gnupg.org>
* simple-gettext.c (set_gettext_file): Make sure that we only use
backslashes.
* strgutil.c (set_native_charset): Allow NULL as argument to use
nl_langinfo for selection. Mapped latin-15 to latin-1.
2002-08-30 Werner Koch <wk@gnupg.org>
* iobuf.c (block_filter): Removed the assert, so that one can pass
the first character of a message and use the block filter for
non partial length encoded packets.
2002-08-06 Stefan Bellon <sbellon@sbellon.de>
* ttyio.c [__riscos__]: Moved low-level RISC OS stuff to riscos.c.
* riscos.c: Use new SWI calling mechanism of UnixLib.
2002-08-03 Stefan Bellon <sbellon@sbellon.de>
* secmem.c (init_pool, secmem_term): Changed #if to #ifdef in
order to avoid warning with RISC OS' Norcroft C.
2002-07-25 David Shaw <dshaw@jabberwocky.com>
* secmem.c: "Warning" -> "WARNING"
2002-07-05 Werner Koch <wk@gnupg.org>
* argparse.c (initialize): We better exit after a read error so
that we don't run into an endless loop when reading a directory.
Noted by Andrew Suffield.
2002-07-01 David Shaw <dshaw@jabberwocky.com>
* argparse.c (optfile_parse): Fix variable typo - 'p2' should be
'p' :)
2002-06-29 Werner Koch <wk@gnupg.org>
* argparse.c (optfile_parse): Renamed an auto I to P2 to avoid
shadowing warning.
2002-06-21 Stefan Bellon <sbellon@sbellon.de>
* riscos.c (riscos_global_defaults): New.
2002-06-20 Stefan Bellon <sbellon@sbellon.de>
* riscos.c (riscos_set_filetype_by_number, riscos_set_filetype):
New. Set RISC OS filetype according to MIME type.
2002-06-14 David Shaw <dshaw@jabberwocky.com>
* strgutil.c (pop_strlist): New function to pop the head off of a
strlist.
2002-06-05 Timo Schulz <ts@winpt.org>
* fileutil.c (is_file_compressed): Corrected the magic values
for bzip2 and gzip. Noted by David.
2002-05-22 Werner Koch <wk@gnupg.org>
* fileutil.c (compare_filenames): Replaced stricmp by strcasecmp.
* miscutil.c (answer_is_yes_no_quit,answer_is_yes_no_default): Ditto.
* strgutil.c (strncasecmp): New.
(memicmp): Removed.
2002-05-10 Stefan Bellon <sbellon@sbellon.de>
* memory.c (add_entry) [M_DEBUG]: Added some missing EXTRA_ALIGN.
(free_entry) [M_DEBUG]: Free secure memory via secmem_free.
(alloc_secure): Malloc at least 1 byte.
(realloc) [M_GUARD]: Added missing FNAMEARG to function call.
* logger.c (g10_log_bug0) [__riscos__]: Make use of first
g10_log_bug0 function for later Norcroft compiler.
* riscos.c: Added stdlib.h include.
2002-05-04 Werner Koch <wk@gnupg.org>
* http.c (write_server) [__MINGW32__]: Replaced WriteFile by send
because sockets don't work with WriteFile under NT anymore.
2002-05-03 David Shaw <dshaw@jabberwocky.com>
* argparse.c (optfile_parse): Remove quotes only if they totally
enclose the string, and do not occur within the string. This
makes specifying a program under Win32 easier when you need quotes
around part of a string, but not around the whole string.
2002-05-02 Werner Koch <wk@gnupg.org>
* memory.c (alloc): Malloc at least 1 byte. Noted by Winona Brown.
2002-04-23 David Shaw <dshaw@jabberwocky.com>
* miscutil.c: New function answer_is_yes_no_default() to give a
default answer.
2002-04-22 Stefan Bellon <sbellon@sbellon.de>
* riscos.c (riscos_open, riscos_fopen, riscos_fstat, set_filetype):
Removed as they're not needed anymore.
* iobuf.c (direct_open) [__riscos__]: Don't allow opening of
directories.
2002-04-08 Werner Koch <wk@gnupg.org>
Fixed filename of last entry.
2002-03-29 David Shaw <dshaw@jabberwocky.com>
* miscutil.c (print_string, utf8_to_native): If a delimiter is
used, then quote the backslash character as well. Problem noted
by Rainer Perske.
2002-03-15 Werner Koch <wk@gnupg.org>
* argparse.c (optfile_parse): Fixed missing argument handling.
2002-02-28 Timo Schulz <ts@winpt.org>
* http.c (write_server): Convert integer to a HANDLE for W32.
2002-01-27 David Shaw <dshaw@jabberwocky.com>
* iobuf.c (iobuf_fdopen, iobuf_sockopen): Do not cache fdopened
fds on close.
2002-01-08 Werner Koch <wk@gnupg.org>
* secmem.c (print_warn): Print a pointer to the FAQ.
2002-01-05 Werner Koch <wk@gnupg.org>
* argparse.c (default_strusage): Set default copyright date to 2002.
2002-01-02 Stefan Bellon <sbellon@sbellon.de>
* iobuf.c [__riscos__]: Updated include file name.
* fileutil.c [__riscos__]: Ditto.
* ttyio.d [__riscos__]: Ditto.
* riscos.c [__riscos__]: Ditto. Added debugging code and
unified error messages.
2001-12-27 David Shaw <dshaw@jabberwocky.com>
* errors.c (g10_errstr): Added G10ERR_KEYSERVER
2001-12-27 Werner Koch <wk@gnupg.org>
* simple-gettext.c [MINGW32]: Fixed last changed.
2001-12-22 Stefan Bellon <sbellon@sbellon.de>
* memory.c (realloc): Fixed realloc not working when M_GUARD is
defined and first parameter is NULL.
2001-12-22 Timo Schulz <ts@winpt.org>
* fileutil.c (is_file_compressed): New.
2001-12-19 Werner Koch <wk@gnupg.org>
* simple-gettext.c, w32reg.c [CYGWIN32]: Allow to use this file
2001-10-11 Werner Koch <wk@gnupg.org>
* http.c (do_parse_uri): Changed initialization of the port number
so that it does also work with x-hkp. By David Shaw.
2001-09-19 Werner Koch <wk@gnupg.org>
* w32reg.c (get_root_key): New.
(read_w32_registry_string): Use it here.
(write_w32_registry_string): New. Contributed by Timo.
* iobuf.c (iobuf_ioctl): New command to disable fd
caching. Implemented no_cache flag where needed.
(iobuf_sockopen): Always set no_cache flag.
* strgutil.c (utf8_to_native): Add a delim arg and changed all
callers. Make sure that quoting is done when translation is
disabled.
* miscutil.c (print_utf8_string2): New.
2001-09-17 Werner Koch <wk@gnupg.org>
* miscutil.c (print_string): Use explicit ranges and not iscntrl().
(make_printable_string): Ditto.
2001-09-07 Werner Koch <wk@gnupg.org>
* strgutil.c (strsep): New, taken from glibc 2.2.1.
2001-09-03 Werner Koch <wk@gnupg.org>
* miscutil.c (strtimestamp,asctimestamp): Avoid trigraphs.
2001-08-21 Stefan Bellon <sbellon@sbellon.de>
* riscos.c [__riscos__] (close_fds): Fixed possible endless loop.
2001-08-20 Werner Koch <wk@gnupg.org>
Applied patches from Stefan Bellon <sbellon@sbellon.de> to support
RISC OS. Nearly all of these patches are identified by the
__riscos__ macro.
* secmem.c [__riscos__]: Disabled secure memory stuff.
* dotlock.c, ttyio.c [__riscos__]: Adapted for RISC OS
* fileutil.c, iobuf.c: Adapted for RISC OS; mainly replaced
hardcoded path separators with EXTSEP_S like macros.
* http.c (send_request): Use macros for the env-var name.
* logger.c [__riscos__]: Do an fflush at the end of each log
function.
* memory.c [__riscos__]: Minor patches
* riscos.c (set_filetype): New.
* secmem.c (lock_pool): Under HPUX mlock is broken but we might
have plock, so we use this to lock the entire process. By Albert
Chin.
2001-07-03 Werner Koch <wk@gnupg.org>
* strgutil.c (utf8_to_native): Fixed printing of invalid utf-8
characters. Thomas Roessler reported that the escaping didn't work
correct.
2001-06-12 Werner Koch <wk@gnupg.org>
* strgutil.c (ascii_memistr,ascii_isupper,ascii_islower,
ascii_toupper,ascii_tolower, ascii_strcasecmp, ascii_memcasecmp): New.
(set_native_charset): Use ascii_strcasecmp()
* fileutil.c (compare_filenames): Ditto
* miscutil.c (answer_is_yes): Ditto.
(answer_is_yes_no_quit): Ditto.
2001-06-06 Werner Koch <wk@gnupg.org>
* strgutil.c (vasprintf) [__MINGW32__]: New. Taken from libiberty.
* ttyio.c (tty_printf) [__MINGW32__]: Replaced the sprintf with
the new vasprintf.
2001-06-05 Werner Koch <wk@gnupg.org>
* dotlock.c (make_dotlock): Typo fixes.
2001-05-25 Werner Koch <wk@gnupg.org>
* ttyio.c (do_get): Fixed a serious format string bug. Thanks to
fish stiqz.
2001-05-23 Werner Koch <wk@gnupg.org>
* secmem.c (EPERM): Try to work around a Slackware problem.
2001-05-05 Werner Koch <wk@gnupg.org>
* http.c (http_start_data): Flush before writing.
(http_wait_response): No need to flush here.
2001-04-27 Werner Koch <wk@gnupg.org>
* memory.c (out_of_core): Print an explanation on reasons why
secret memory can get exhausted.
2001-04-23 Werner Koch <wk@gnupg.org>
* http.c (http_wait_response): Implement new flag to inhibit the
TCP shutdown.
2001-04-20 Werner Koch <wk@gnupg.org>
* http.c (http_start_data): Use write_server and not the iobuf
stuff. I wonder why we are at all using write_server - shouldn't
it be handled by iobuf?
* strgutil.c (set_native_charset): Allow utf-8 by introducing the
new no_translation variable.
(native_to_utf8): Handle no_translation.
(utf8_to_native): Ditto.
2001-04-19 Werner Koch <wk@gnupg.org>
* miscutil.c (asctimestamp): Handle negative times. We must do
this because Windoze segvs on negative times passed to gmtime().
(strtimestamp): Ditto.
2001-04-14 Werner Koch <wk@gnupg.org>
* strgutil.c (utf8_to_native): Fixed a segv. Thanks to Keith Clayton.
2001-04-13 Werner Koch <wk@gnupg.org>
* iobuf.c (iobuf_fopen): Removed because it is not used and
furthermore mode is ignored for an fname of "-". Suggested by
Florian Weimer.
2001-04-02 Werner Koch <wk@gnupg.org>
* iobuf.c (translate_file_handle): New. Use this function
everywhere in this file.
(iobuf_translate_file_handle): Always use the osfhandle stuff here
because callers don't know the implementation details of iobuf and
they expect that the handles are translated.
2001-03-29 Werner Koch <wk@gnupg.org>
* miscutil.c (answer_is_yes): An empty string does now return no.
(answer_is_yes_no_quit): Likewise.
* iobuf.c (iobuf_close): Burn the buffers.
2001-03-26 Werner Koch <wk@gnupg.org>
* ttyio.c: Define TERMDEVICE depending on OS.
* http.c (http_start_data): send a CRLF and not just a LF.
Pointed out by Steven Murdoch.
2001-03-13 Werner Koch <wk@gnupg.org>
* iobuf.c (iobuf_sockopen): New.
(sock_filter) [__MINGW32__]: New.
(iobuf_ioctl): New.
(file_filter): Implemented keep_open mode.
* http.c (http_open, http_wait_response): Replaced iobuf_fdopen by
iobuf_sockopen and use an iobuf_ioctl to avoid the dup().
(deinit_sockets, init_sockets) [__MINGW32__]: New.
(connect_server, write_server): Add code to work with W32 sockets.
2001-03-12 Werner Koch <wk@gnupg.org>
* strgutil.c (check_trailing_chars,check_trailing_ws): New.
2001-03-08 Werner Koch <wk@gnupg.org>
* argparse.c (default_strusage): Changed year of printed copyright
to 2001.
* iobuf.c (fd_cache_invalidate, fd_cache_close, fd_cache_open): New.
(direct_open): Invalidate the fd_cache for read access.
(file_filter): Cache the close here.
(iobuf_open): Use new my_fopen_ro macro to try the cache first.
2001-03-07 Werner Koch <wk@gnupg.org>
* iobuf.c: Made the old stdio file handling cpp conditional
controlled by FILE_FILTER_USES_STDIO and added a new
open/read/close based one. We don't need the stdio buffering
becuase we are doing our own buffering anyway. And it is a
prerequesite to allow the use of ReadFile et al for W32 which in
turn is needed to make the http stuff work there. The new W32
stuff has also been implemented. Minor changes to all open functions.
(direct_open): New.
(file_filter): Core of the new read/write handling.
(iobuf_get_filelength): Use W32 API function here. But it is
currently limited to 2GB files.
(iobuf_seek): Ditto.
2001-03-01 Werner Koch <wk@gnupg.org>
* errors.c (g10_errstr): New codes UNU_SECKEY and UNU_PUBKEY.
2000-12-28 Werner Koch <wk@gnupg.org>
* dotlock.c: Made all_lockfiles volatile.
(remove_lockfiles): Made public.
2000-11-30 Werner Koch <wk@gnupg.org>
* iobuf.c (iobuf_translate_file_handle): New.
(iobuf_open, iobuf_create): Use it for special filenames
2000-11-11 Paul Eggert <eggert@twinsun.com>
* iobuf.c (iobuf_get_filelength): Now returns off_t, not u32.
Remove kludges to worry about large files; the callers check
for files that are too large, and they should already be doing
the right thing in an implementation-independent way.
(fopen, fstat): Remove macros.
* iobuf.c (iobuf_set_limit, iobuf_tell, iobuf_seek):
Use off_t, not ulong, for file offsets.
(<limits.h>): Include if needed.
(LONG_MAX, LONG_MIN): Define a substitute if needed.
(fseeko): Define a substitute if needed.
* iobuf.c (iobuf_seek): Do not use %lu to report file
2000-11-09 Werner Koch <wk@gnupg.org>
* iobuf.c (iobuf_enable_special_filenames): New.
(check_special_filename): New.
(iobuf_open): check for special filenames.
(iobuf_create): Ditto.
2000-10-23 Werner Koch <wk@gnupg.org>
* secmem.c (lock_pool): Don't print warning for Windows.
2000-10-16 Werner Koch <wk@gnupg.org>
* secmem.c (lock_pool): Fixed error checking for Linux.
By James Troup.
Thu Sep 14 14:20:38 CEST 2000 Werner Koch <wk@openit.de>
* miscutil.c (answer_is_yes_no_quit): Swapped order of yes/no test
so that no is returned for an empty input. By David Champion.
Wed Sep 6 17:55:47 CEST 2000 Werner Koch <wk@openit.de>
* iobuf.c: Use fopen64 insead of fopen when available.
(iobuf_get_filelength): Use fstat64 when available but return
2^32-1 if the file is larger than this value.
Wed Sep 6 14:59:09 CEST 2000 Werner Koch <wk@openit.de>
* secmem.c (secmem_realloc): check for failed secmem_malloc. By
Matt Kraai.
* strgutil.c (utf8_to_native): Fixed null ptr problem. By
Giampaolo Tomassoni.
Thu Jul 27 10:02:38 CEST 2000 Werner Koch <wk@openit.de>
* iobuf.c: Use setmode() at several places to set stdin and stdout
to binary mode for MSDOS based systems
* iobuf.c (underflow): Initialize dummy_len to keep memory checker happy.
Fri Jun 9 10:09:52 CEST 2000 Werner Koch <wk@openit.de>
* ttyio.c: Simulate termios with termios. By Dave Dykstra.
Thu Jun 8 20:22:00 CEST 2000 Werner Koch <wk@openit.de>
* secmem.c (lock_pool,secmem_init): Additional check for dropped privs.
Tue May 30 16:37:55 CEST 2000 Werner Koch <wk@openit.de>
* iobuf.c (iobuf_cancel): Fix for MSDOS.
Fri Apr 14 19:37:08 CEST 2000 Werner Koch <wk@openit.de>
* dotlock.c (disable_dotlock): New. Implmented this in the module.
2000-03-09 14:04:22 Werner Koch (wk@habibti.openit.de)
* argparse.c (default_strusage): Changed year of default copyright.
Tue Mar 7 18:45:31 CET 2000 Werner Koch <wk@gnupg.de>
* secmem.c (lock_pool): No more warning for QNX. By Sam Roberts.
2000-03-02 15:51:04 Werner Koch (wk@habibti.gnupg.de)
* ttyio.c (tty_print_utf8_string): Oops.
Thu Mar 2 15:37:46 CET 2000 Werner Koch <wk@gnupg.de>
* ttyio.c (tty_print_utf8_string2): New to allow a max output size.
Wed Feb 23 10:07:57 CET 2000 Werner Koch <wk@gnupg.de>
* miscutil.c (asctimestamp): Fix for possible buffer overflow by
large system returned date format string.
Fri Dec 31 14:08:15 CET 1999 Werner Koch <wk@gnupg.de>
* logger.c (log_inc_errorcount): New.
Sat Dec 4 12:30:28 CET 1999 Werner Koch <wk@gnupg.de>
* iobuf.c (iobuf_cancel): Broadcast the new Cancel mesaage to all
filters.
Mon Nov 22 11:14:53 CET 1999 Werner Koch <wk@gnupg.de>
* strgutil.c (strcasecmp): New.
* secmem.c (pool_is_mmapped): Made volatile.
Sat Oct 9 20:34:41 CEST 1999 Werner Koch <wk@gnupg.de>
* Makefile.am: Removed libtool.
Fri Oct 8 20:32:01 CEST 1999 Werner Koch <wk@gnupg.de>
* w32reg.c: New.
* simple-gettext.c: Use the Registry to locate the mo file.
* http.c (send_request): Add support for proxys; suggested by
Walter Hofmann.
(http_open_document): Pass flags to http_open.
Fri Sep 17 12:56:42 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
* secmem.c (lock_pool): Check for ENOSYS return my mlock() on
old SCOs.
* ttyio.c (do_get): Replaced #if __MINGW32__ by #ifdef becuase
gcc 2.95.1 assigns a floating point value (0.2) to this macro,
which in turn can't be used in an expression.
Wed Sep 15 16:22:17 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
* simple-gettext.c: New.
Wed Sep 1 15:30:44 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
* argparse.c (arg_parse): Add standard options to the dump-options
output.
Tue Aug 31 17:20:44 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
* strgutil (utf8_to_native): Implemented.
(check_utf8_string): Removed.
* miscutil.c (make_printable_string): Fixed possible buffer overflow.
(print_utf8_string): New.
* ttyio.c (tty_print_utf8_string): New.
Mon Aug 30 20:38:33 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
* secmem.c (pool_okay): declared volatile.
* miscutil.c (answer_is_yes): Always check for plain "yes".
(answer_is_yes_no_quit): Likewise.
* dotlock.c (create_dotlock): Fixed segv during cleanup.
Mon Jul 12 14:55:34 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
* argparse.c (initialize): Init ret_xxx.
(optfile_parse): Remove quotes from arguments.
Wed Jul 7 13:08:40 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
* memory.c (membug): Use if either M_DEBUG or M_GUARD is used.
* miscutil.c (scan_isodatestr): New.
* logger.c (g10_log_mpidump): Moved to ../mpi/mpicoder.c
(g10_log_print_prefix): Renamed from print_prefix and made global.
* Makefile.am: Support for libtool.
Thu Jul 1 12:47:31 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
* miscutil.c (make_printable_string): New.
* strgutil.c (add_to_strlist2,append_to_strlist2): New.
Tue Jun 29 21:44:25 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
* secmem.c (USE_CAPABILITIES): Capabilities support (Remi).
Sat Jun 26 12:15:59 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
* dotlock.c (create_dotlock): s/uts/utsbuf/ cause there an Amdahl
system with the name UTS (Dave Dykstra).
* secmem.c (DEFAULT_POOLSIZE): Doubled the size.
Fri Jun 18 00:18:02 CEST 1999 Michael Roth <mroth@nessie.de>
* iobuf.c: file_filter() Detection of EOF on terminals
improved/fixed (see Bug #21).
Mon Jun 14 21:18:54 CEST 1999 Michael Roth <mroth@nessie.de>
* ttyio.c: tty_no_terminal() new.
Sat Jun 5 15:30:33 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
* strgutil.c (set_native_charset): Support Latin-2
Tue Jun 1 16:01:46 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
* iobuf.c (iobuf_get_real_fname): Made global and now keep a
copy of the name in the iobuf struct.
Mon May 31 19:41:10 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
* iobuf.c (file_filter,block_filter): Speed patches (R駑i).
Thu May 27 09:40:55 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
* miscutil.c (answer_is_yes_no_quit): New.
Sun May 23 14:20:22 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
* dotlock.c: Tweaked to make it compile under mingw32
* http.c: Disabled for mingw32.
Sat May 22 22:47:26 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
* logger.c (log_set_logfile): New.
Thu May 20 14:04:08 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
* memory.c (membug): Nanu, there was a const instead of a static.
* strgutil.c (trim_trailing_chars): New.
Mon May 17 21:54:43 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
* logger.c (g10_log_hexdump): Made 2nd arg a const.
Wed Apr 28 13:03:03 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
* miscutil.c (asctimestamp): Use nl_langinfo (Ga? Qu駻i).
Sun Apr 18 10:11:28 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
* argparse.c (store_alias): Disabled becuase it is not used.
* ttyio.c (tty_batchmode): New
Sat Mar 20 11:44:21 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
* http.c: Swapped to includes.
Tue Mar 2 16:44:57 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
* strgutil.c (get_native_charset): New.
Fri Feb 26 17:55:41 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
* secmem.c (memblock_struct): Force align (R駑i Guyomarch)
Wed Feb 24 11:07:27 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
* iobuf.c (block_filter): Fixed the oscillating partial packet chunks.
Fri Feb 19 15:49:15 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
* iobuf.c (iobuf_push_filter2): New to allow transer of context
ownership to the iobuf. Released the context where needed.
Tue Feb 16 14:10:02 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
* strgutil.c (add_to_strglist): Clear the new flags field
(append_to_strglist): Ditto.
* dotlock.c (read_lockfile): terminate pidstr (Michael).
Wed Feb 10 17:15:39 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
* dotlock.c (remove_lockfiles): Add cleanup function.
(make_dotlock): Add deadlock check.
* secmem.c (secmem_malloc): Changed error message.
Wed Jan 20 21:40:21 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
* http.c (http_wait_response): Moved the shutdown behind the dup
Wed Jan 20 18:59:49 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
* http.c (send_request): Removed double LF
Tue Jan 19 19:34:58 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
* * iobuf.c (iobuf_push_filter): Allow filters for temp streams
(iobuf_write_temp): Ditto.
(iobuf_flush_temp): New.
(iobuf_unget_and_close_temp): Removed.
* http.c (close_http_document): Renamed to http_close().
(open_http_document): Renamed to http_open_document().
(http_open): New.
(http_start_data): New.
(http_wait_response): New.
Sun Jan 17 11:04:33 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
* strgutil.c (trim_trailing_ws): New.
Sat Jan 16 12:03:27 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
* http.c (connect_server): Fixed stupid bug.
Sat Jan 16 09:27:30 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
* http.c: New
Wed Jan 13 14:10:15 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
* iobuf.c (iobuf_fdopen): New.
Sat Jan 9 16:02:23 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
* secmem.c (lock_pool): add another check that setuid() worked.
(secmem_init): Ditto.
Thu Jan 7 18:00:58 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
* iobuf.c (iobuf_clear_eof): Removed.
(underflow): Changed the eof handling.
(iobuf_pop_filter): Made static and renamed to pop_filter.
* iobuf.c (iobuf_read_line): New.
Sun Jan 3 15:28:44 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
* dotlock.c (make_dotlock): print another informal message.
(make_dotlock): Removed the cpp checks.
Tue Dec 29 14:41:47 CET 1998 Werner Koch <wk@isil.d.shuttle.de>
* secmem.c: Moved unistd.h out of the #ifdef
* dotlock.c (make_dotlock): Sun has no SYS_NMLN
* iobuf.c (iobuf_unget_and_close_temp): Reset .start
Sat Dec 12 18:40:32 CET 1998 Werner Koch <wk@isil.d.shuttle.de>
* argparse.c (arg_pars): fixed opts[i] with negative index.
Fri Nov 27 21:37:41 CET 1998 Werner Koch <wk@isil.d.shuttle.de>
* dotlock.c: Implemented
Wed Nov 25 11:30:07 1998 Werner Koch (wk@isil.d.shuttle.de)
* iobuf.c (iobuf_pop_filter): Fixed sigsegv after error.
Thu Nov 19 07:09:55 1998 Werner Koch <werner.koch@guug.de>
* miscutil.c (strtimevalue): New.
Tue Nov 10 10:01:53 1998 Werner Koch (wk@isil.d.shuttle.de)
* strgutil.c (set_native_charset): New.
(native_to_utf8): Now handles koi8-r.
Tue Nov 3 16:17:56 1998 Werner Koch (wk@isil.d.shuttle.de)
* strgutil.c (native_to_utf8): New.
(utf8_to_native): New, but only as a stub.
* argparse.c (optfile_parse): Trimmed spaces from args.
Wed Oct 28 08:01:49 1998 me,,, (wk@tobold)
* argparse.c (find_long_option): New.
(arg_parse): option=value is now allowed. Add a new internal
option "--dump-options".
Thu Oct 22 16:25:49 1998 Michael Roth (mroth@nessie.de)
* fileutil.c (make_basename): New.
(make_dirname): New.
Wed Oct 21 12:20:29 1998 Werner Koch (wk@isil.d.shuttle.de)
* util.c (iobuf_flush): autoincreasing of a temp. iobuf
(iobuf_temp_with_content): New.
Tue Oct 13 12:40:13 1998 Werner Koch (wk@isil.d.shuttle.de)
* util.c (.nofast): set this variable
Wed Oct 7 19:27:50 1998 Werner Koch (wk@isil.d.shuttle.de)
* memory.c (m_print_stats): New.
Tue Oct 6 09:53:56 1998 Werner Koch (wk@isil.d.shuttle.de)
* strgutil.c (memicmp): Add HAVE_MEMICMP.
Mon Sep 21 19:45:01 1998 Werner Koch (wk@(none))
* secmem.c: New flags to allow suspend/resume of warnings.
Fri Sep 18 16:25:47 1998 Werner Koch (wk@(none))
* secmem.c (lock_pool): Kludge for broken mlock on HPUX 10.20
Tue Sep 15 17:52:21 1998 Werner Koch (wk@(none))
* miscutil.c (asctimestamp): New.
Mon Sep 14 09:38:18 1998 Werner Koch (wk@(none))
* secmem.c (init_pool): Now mmaps /dev/zero if we do not have MAP_ANON.
Wed Sep 9 13:52:28 1998 Werner Koch (wk@(none))
* ttyio.c (do_get): Ctrl-D is now a valid but special character
Mon Sep 7 13:52:41 1998 Werner Koch (wk@(none))
* iobuf.c (get_real_fname): New and changed file_filter datastructures
and their initialization.
Tue Aug 11 15:12:35 1998 Werner Koch (wk@(none))
* miscutil.c (answer_is_yes): i18ned
Sat Aug 8 18:35:00 1998 Werner Koch (wk@(none))
* ttyio.c (cleanup): New.
Mon Aug 3 17:06:00 1998 Werner Koch (wk@(none))
* secmem.c (MAP_ANON): Add a macro test
Wed Jul 29 14:53:34 1998 Werner Koch (wk@(none))
* ttyio.c (tty_get_answer_is_yes): New.
Tue Jul 21 10:35:48 1998 Werner Koch (wk@(none))
* argparse.c: New option flag to distinguish options and commands.
Sat Jul 18 19:49:30 1998 Werner Koch (wk@(none))
* argparse.c (arg_parse): Added -? as alias for -h
Thu Jul 9 14:47:20 1998 Werner Koch (wk@isil.d.shuttle.de)
* secmem.c (secmem_init): Drops setuid if called with 0.
Tue Jul 7 11:49:25 1998 Werner Koch (wk@isil.d.shuttle.de)
* logger.c (log_set_filename): New.
Mon Jul 6 09:03:49 1998 Werner Koch (wk@isil.d.shuttle.de)
* strgutil.c (append_to_strlist): New.
Thu Jul 2 15:55:44 1998 Werner Koch (wk@isil.d.shuttle.de)
* iobuf.c (block_filter): Add writing of OP partial length headers.
Fri Jun 26 10:38:35 1998 Werner Koch (wk@isil.d.shuttle.de)
* ttyio.c (do_get): all iso8859-1 characters are now allowed.
Thu Jun 25 15:57:21 1998 Werner Koch (wk@isil.d.shuttle.de)
* secmem.c (lock_pool): Removed left over test code.
Wed Jun 10 07:39:41 1998 Werner Koch,mobil,,, (wk@tobold)
* fileutil.c (compare_filenames): New.
* argparse.c (arg_parse): New flag bit 6 to ignore --version
Thu May 14 16:45:13 1998 Werner Koch (wk@isil.d.shuttle.de)
* argparse.c (show_help): Add some formatting stuff
Fri May 8 17:06:49 1998 Werner Koch (wk@isil.d.shuttle.de)
* errors.c (strerror): New if !HAVE_STRERROR
Mon May 4 19:48:03 1998 Werner Koch (wk@isil.d.shuttle.de)
* iobuf.c (iobuf_read): Code is now faster.
* (iobuf_write): ditto.
Mon Apr 27 11:01:32 1998 Werner Koch (wk@isil.d.shuttle.de)
* strgutil.c (memicmp): New.
Thu Mar 19 11:29:03 1998 Werner Koch (wk@isil.d.shuttle.de)
* strgutil.c (memistr): Add const to return and first arg.
Sat Mar 7 11:54:35 1998 Werner Koch (wk@isil.d.shuttle.de)
* miscutil.c (print_string): New arg delim; changed all callers.
Thu Mar 5 12:19:30 1998 Werner Koch (wk@isil.d.shuttle.de)
* errors.c: New strings.
Thu Mar 5 12:06:31 1998 Werner Koch (wk@isil.d.shuttle.de)
* iobuf.c (iobuf_open): A name of "-" now opens stdin.
* fileutil.c (print_fname_stdout, print_fname_stdin): New.
Fri Feb 27 10:20:03 1998 Werner Koch (wk@isil.d.shuttle.de)
* memory.c (m_is_secure): Removed.
* secmem.c (m_is_secure): Moved to here.
* secmem.c (secmem_realloc): New.
* memory.c (M_GUARD,EXTRA_ALIGN): New (all functions).
Thu Feb 26 14:36:51 1998 Werner Koch (wk@isil.d.shuttle.de)
* secmem.c (lock_pool): No error if EAGAIN is returned instead
of EPERM.
Fri Feb 20 17:43:05 1998 Werner Koch (wk@isil.d.shuttle.de)
* ttyio.c [MINGW32]: Add support for mingw32.
Tue Feb 17 19:43:44 1998 Werner Koch (wk@isil.d.shuttle.de)
* memory.c (dump_table_at_exit): New.
Mon Feb 16 10:07:28 1998 Werner Koch (wk@isil.d.shuttle.de)
* argparse.c (show_version, show_help, default_strusage): Changed
according to GNU standards.
Mon Feb 16 08:58:25 1998 Werner Koch (wk@isil.d.shuttle.de)
* iobuf.c (iobuf_peek): New
Fri Feb 13 19:34:59 1998 Werner Koch (wk@isil.d.shuttle.de)
* iobuf.c (iobuf_seek): Set counters to new offset.
Fri Feb 13 17:13:04 1998 Werner Koch (wk@isil.d.shuttle.de)
* logger.c (log_set_name, log_get_name): New.
(print_prefix, pgm_name): New, changed all function to make use it.
(log_mpidump): Removed the "DBG" prefix.
(log_hexdump): Ditto.
* logger.c (printstr): Removed.
Fri Feb 13 15:14:13 1998 Werner Koch (wk@isil.d.shuttle.de)
* argparse.c (show_help): New '\v' kludge.
Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004,
2005 Free Software Foundation, Inc.
This file is free software; as a special exception the author gives
unlimited permission to copy and/or distribute it, with or without
modifications, as long as this notice is preserved.
This file is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
diff --git a/util/argparse.c b/util/argparse.c
index cdc56bf3a..cd29c0cef 100644
--- a/util/argparse.c
+++ b/util/argparse.c
@@ -1,1004 +1,1004 @@
/* [argparse.c wk 17.06.97] Argument Parser for option handling
- * Copyright (C) 1998, 1999, 2000, 2001, 2003,
- * 2004 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
+ * 2007 Free Software Foundation, Inc.
*
* This file is part of GnuPG.
*
* GnuPG 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.
*
* GnuPG 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*
*
* Note: This is an independent version of the one in WkLib
*/
#include <config.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "util.h"
#include "i18n.h"
/*********************************
* @Summary arg_parse
* #include <wk/lib.h>
*
* typedef struct {
* char *argc; pointer to argc (value subject to change)
* char ***argv; pointer to argv (value subject to change)
* unsigned flags; Global flags (DO NOT CHANGE)
* int err; print error about last option
* 1 = warning, 2 = abort
* int r_opt; return option
* int r_type; type of return value (0 = no argument found)
* union {
* int ret_int;
* long ret_long
* ulong ret_ulong;
* char *ret_str;
* } r; Return values
* struct {
* int idx;
* const char *last;
* void *aliases;
* } internal; DO NOT CHANGE
* } ARGPARSE_ARGS;
*
* typedef struct {
* int short_opt;
* const char *long_opt;
* unsigned flags;
* } ARGPARSE_OPTS;
*
* int arg_parse( ARGPARSE_ARGS *arg, ARGPARSE_OPTS *opts );
*
* @Description
* This is my replacement for getopt(). See the example for a typical usage.
* Global flags are:
* Bit 0 : Do not remove options form argv
* Bit 1 : Do not stop at last option but return other args
* with r_opt set to -1.
* Bit 2 : Assume options and real args are mixed.
* Bit 3 : Do not use -- to stop option processing.
* Bit 4 : Do not skip the first arg.
* Bit 5 : allow usage of long option with only one dash
* Bit 6 : ignore --version and --help
* all other bits must be set to zero, this value is modified by the
* function, so assume this is write only.
* Local flags (for each option):
* Bit 2-0 : 0 = does not take an argument
* 1 = takes int argument
* 2 = takes string argument
* 3 = takes long argument
* 4 = takes ulong argument
* Bit 3 : argument is optional (r_type will the be set to 0)
* Bit 4 : allow 0x etc. prefixed values.
* Bit 7 : this is a command and not an option
* You stop the option processing by setting opts to NULL, the function will
* then return 0.
* @Return Value
* Returns the args.r_opt or 0 if ready
* r_opt may be -2/-7 to indicate an unknown option/command.
* @See Also
* ArgExpand
* @Notes
* You do not need to process the options 'h', '--help' or '--version'
* because this function includes standard help processing; but if you
* specify '-h', '--help' or '--version' you have to do it yourself.
* The option '--' stops argument processing; if bit 1 is set the function
* continues to return normal arguments.
* To process float args or unsigned args you must use a string args and do
* the conversion yourself.
* @Example
*
* ARGPARSE_OPTS opts[] = {
* { 'v', "verbose", 0 },
* { 'd', "debug", 0 },
* { 'o', "output", 2 },
* { 'c', "cross-ref", 2|8 },
* { 'm', "my-option", 1|8 },
* { 500, "have-no-short-option-for-this-long-option", 0 },
* {0} };
* ARGPARSE_ARGS pargs = { &argc, &argv, 0 }
*
* while( ArgParse( &pargs, &opts) ) {
* switch( pargs.r_opt ) {
* case 'v': opt.verbose++; break;
* case 'd': opt.debug++; break;
* case 'o': opt.outfile = pargs.r.ret_str; break;
* case 'c': opt.crf = pargs.r_type? pargs.r.ret_str:"a.crf"; break;
* case 'm': opt.myopt = pargs.r_type? pargs.r.ret_int : 1; break;
* case 500: opt.a_long_one++; break
* default : pargs.err = 1; break; -- force warning output --
* }
* }
* if( argc > 1 )
* log_fatal( "Too many args");
*
*/
typedef struct alias_def_s *ALIAS_DEF;
struct alias_def_s {
ALIAS_DEF next;
char *name; /* malloced buffer with name, \0, value */
const char *value; /* ptr into name */
};
static int set_opt_arg(ARGPARSE_ARGS *arg, unsigned flags, char *s);
static void show_help(ARGPARSE_OPTS *opts, unsigned flags);
static void show_version(void);
static void
initialize( ARGPARSE_ARGS *arg, const char *filename, unsigned *lineno )
{
if( !(arg->flags & (1<<15)) ) { /* initialize this instance */
arg->internal.idx = 0;
arg->internal.last = NULL;
arg->internal.inarg = 0;
arg->internal.stopped = 0;
arg->internal.aliases = NULL;
arg->internal.cur_alias = NULL;
arg->err = 0;
arg->flags |= 1<<15; /* mark initialized */
if( *arg->argc < 0 )
log_bug("Invalid argument for ArgParse\n");
}
if( arg->err ) { /* last option was erroneous */
if( filename ) {
if( arg->r_opt == -6 )
log_error("%s:%u: argument not expected\n", filename, *lineno );
else if( arg->r_opt == -5 )
log_error("%s:%u: read error\n", filename, *lineno );
else if( arg->r_opt == -4 )
log_error("%s:%u: keyword too long\n", filename, *lineno );
else if( arg->r_opt == -3 )
log_error("%s:%u: missing argument\n", filename, *lineno );
else if( arg->r_opt == -7 )
log_error("%s:%u: invalid command\n", filename, *lineno );
else if( arg->r_opt == -10 )
log_error("%s:%u: invalid alias definition\n",filename,*lineno);
else
log_error("%s:%u: invalid option\n", filename, *lineno );
}
else {
if( arg->r_opt == -3 )
log_error("Missing argument for option \"%.50s\"\n",
arg->internal.last? arg->internal.last:"[??]" );
else if( arg->r_opt == -6 )
log_error("Option \"%.50s\" does not expect an argument\n",
arg->internal.last? arg->internal.last:"[??]" );
else if( arg->r_opt == -7 )
log_error("Invalid command \"%.50s\"\n",
arg->internal.last? arg->internal.last:"[??]" );
else if( arg->r_opt == -8 )
log_error("Option \"%.50s\" is ambiguous\n",
arg->internal.last? arg->internal.last:"[??]" );
else if( arg->r_opt == -9 )
log_error("Command \"%.50s\" is ambiguous\n",
arg->internal.last? arg->internal.last:"[??]" );
else
log_error("Invalid option \"%.50s\"\n",
arg->internal.last? arg->internal.last:"[??]" );
}
if( arg->err != 1 || arg->r_opt == -5 )
exit(2);
arg->err = 0;
}
/* clearout the return value union */
arg->r.ret_str = NULL;
arg->r.ret_long= 0;
}
static void
store_alias( ARGPARSE_ARGS *arg, char *name, char *value )
{
/* TODO: replace this dummy function with a rea one
* and fix the probelms IRIX has with (ALIAS_DEV)arg..
* used as lvalue
*/
#if 0
ALIAS_DEF a = xmalloc( sizeof *a );
a->name = name;
a->value = value;
a->next = (ALIAS_DEF)arg->internal.aliases;
(ALIAS_DEF)arg->internal.aliases = a;
#endif
}
/****************
* Get options from a file.
* Lines starting with '#' are comment lines.
* Syntax is simply a keyword and the argument.
* Valid keywords are all keywords from the long_opt list without
* the leading dashes. The special keywords "help", "warranty" and "version"
* are not valid here.
* The special keyword "alias" may be used to store alias definitions,
* which are later expanded like long options.
* Caller must free returned strings.
* If called with FP set to NULL command line args are parse instead.
*
* Q: Should we allow the syntax
* keyword = value
* and accept for boolean options a value of 1/0, yes/no or true/false?
* Note: Abbreviation of options is here not allowed.
*/
int
optfile_parse( FILE *fp, const char *filename, unsigned *lineno,
ARGPARSE_ARGS *arg, ARGPARSE_OPTS *opts)
{
int state, i, c;
int idx=0;
char keyword[100];
char *buffer = NULL;
size_t buflen = 0;
int inverse=0;
int in_alias=0;
if( !fp ) /* same as arg_parse() in this case */
return arg_parse( arg, opts );
initialize( arg, filename, lineno );
/* find the next keyword */
state = i = 0;
for(;;) {
c=getc(fp);
if( c == '\n' || c== EOF ) {
if( c != EOF )
++*lineno;
if( state == -1 )
break;
else if( state == 2 ) {
keyword[i] = 0;
for(i=0; opts[i].short_opt; i++ )
if( opts[i].long_opt && !strcmp( opts[i].long_opt, keyword) )
break;
idx = i;
arg->r_opt = opts[idx].short_opt;
if( inverse ) /* this does not have an effect, hmmm */
arg->r_opt = -arg->r_opt;
if( !opts[idx].short_opt ) /* unknown command/option */
arg->r_opt = (opts[idx].flags & 256)? -7:-2;
else if( !(opts[idx].flags & 7) ) /* does not take an arg */
arg->r_type = 0; /* okay */
else if( (opts[idx].flags & 8) ) /* argument is optional */
arg->r_type = 0; /* okay */
else /* required argument */
arg->r_opt = -3; /* error */
break;
}
else if( state == 3 ) { /* no argument found */
if( in_alias )
arg->r_opt = -3; /* error */
else if( !(opts[idx].flags & 7) ) /* does not take an arg */
arg->r_type = 0; /* okay */
else if( (opts[idx].flags & 8) ) /* no optional argument */
arg->r_type = 0; /* okay */
else /* no required argument */
arg->r_opt = -3; /* error */
break;
}
else if( state == 4 ) { /* have an argument */
if( in_alias ) {
if( !buffer )
arg->r_opt = -6;
else {
char *p;
buffer[i] = 0;
p = strpbrk( buffer, " \t" );
if( p ) {
*p++ = 0;
trim_spaces( p );
}
if( !p || !*p ) {
xfree( buffer );
arg->r_opt = -10;
}
else {
store_alias( arg, buffer, p );
}
}
}
else if( !(opts[idx].flags & 7) ) /* does not take an arg */
arg->r_opt = -6; /* error */
else {
char *p;
if( !buffer ) {
keyword[i] = 0;
buffer = xstrdup(keyword);
}
else
buffer[i] = 0;
trim_spaces( buffer );
p = buffer;
/* remove quotes if they totally enclose the
string, and do not occur within the string */
if( *p == '"' && p[strlen(p)-1]=='"') {
char *p2=p;
while(*(++p2))
if(*p2=='"')
break;
if(*p2=='"' && *(p2+1)=='\0') {
p[strlen(p)-1] = 0;
p++;
}
}
if( !set_opt_arg(arg, opts[idx].flags, p) )
xfree(buffer);
}
break;
}
else if( c == EOF ) {
if( ferror(fp) )
arg->r_opt = -5; /* read error */
else
arg->r_opt = 0; /* eof */
break;
}
state = 0;
i = 0;
}
else if( state == -1 )
; /* skip */
else if( !state && isspace(c) )
; /* skip leading white space */
else if( !state && c == '#' )
state = 1; /* start of a comment */
else if( state == 1 )
; /* skip comments */
else if( state == 2 && isspace(c) ) {
keyword[i] = 0;
for(i=0; opts[i].short_opt; i++ )
if( opts[i].long_opt && !strcmp( opts[i].long_opt, keyword) )
break;
idx = i;
arg->r_opt = opts[idx].short_opt;
if( !opts[idx].short_opt ) {
if( !strcmp( keyword, "alias" ) ) {
in_alias = 1;
state = 3;
}
else {
arg->r_opt = (opts[idx].flags & 256)? -7:-2;
state = -1; /* skip rest of line and leave */
}
}
else
state = 3;
}
else if( state == 3 ) { /* skip leading spaces of the argument */
if( !isspace(c) ) {
i = 0;
keyword[i++] = c;
state = 4;
}
}
else if( state == 4 ) { /* collect the argument */
if( buffer ) {
if( i < buflen-1 )
buffer[i++] = c;
else {
buflen += 50;
buffer = xrealloc(buffer, buflen);
buffer[i++] = c;
}
}
else if( i < DIM(keyword)-1 )
keyword[i++] = c;
else {
buflen = DIM(keyword)+50;
buffer = xmalloc(buflen);
memcpy(buffer, keyword, i);
buffer[i++] = c;
}
}
else if( i >= DIM(keyword)-1 ) {
arg->r_opt = -4; /* keyword to long */
state = -1; /* skip rest of line and leave */
}
else {
keyword[i++] = c;
state = 2;
}
}
return arg->r_opt;
}
static int
find_long_option( ARGPARSE_ARGS *arg,
ARGPARSE_OPTS *opts, const char *keyword )
{
int i;
size_t n;
/* Would be better if we can do a binary search, but it is not
possible to reorder our option table because we would mess
up our help strings - What we can do is: Build a nice option
lookup table wehn this function is first invoked */
if( !*keyword )
return -1;
for(i=0; opts[i].short_opt; i++ )
if( opts[i].long_opt && !strcmp( opts[i].long_opt, keyword) )
return i;
#if 0
{
ALIAS_DEF a;
/* see whether it is an alias */
for( a = args->internal.aliases; a; a = a->next ) {
if( !strcmp( a->name, keyword) ) {
/* todo: must parse the alias here */
args->internal.cur_alias = a;
return -3; /* alias available */
}
}
}
#endif
/* not found, see whether it is an abbreviation */
/* aliases may not be abbreviated */
n = strlen( keyword );
for(i=0; opts[i].short_opt; i++ ) {
if( opts[i].long_opt && !strncmp( opts[i].long_opt, keyword, n ) ) {
int j;
for(j=i+1; opts[j].short_opt; j++ ) {
if( opts[j].long_opt
&& !strncmp( opts[j].long_opt, keyword, n ) )
return -2; /* abbreviation is ambiguous */
}
return i;
}
}
return -1;
}
int
arg_parse( ARGPARSE_ARGS *arg, ARGPARSE_OPTS *opts)
{
int idx;
int argc;
char **argv;
char *s, *s2;
int i;
initialize( arg, NULL, NULL );
argc = *arg->argc;
argv = *arg->argv;
idx = arg->internal.idx;
if( !idx && argc && !(arg->flags & (1<<4)) ) { /* skip the first entry */
argc--; argv++; idx++;
}
next_one:
if( !argc ) { /* no more args */
arg->r_opt = 0;
goto leave; /* ready */
}
s = *argv;
arg->internal.last = s;
if( arg->internal.stopped && (arg->flags & (1<<1)) ) {
arg->r_opt = -1; /* not an option but a argument */
arg->r_type = 2;
arg->r.ret_str = s;
argc--; argv++; idx++; /* set to next one */
}
else if( arg->internal.stopped ) { /* ready */
arg->r_opt = 0;
goto leave;
}
else if( *s == '-' && s[1] == '-' ) { /* long option */
char *argpos;
arg->internal.inarg = 0;
if( !s[2] && !(arg->flags & (1<<3)) ) { /* stop option processing */
arg->internal.stopped = 1;
argc--; argv++; idx++;
goto next_one;
}
argpos = strchr( s+2, '=' );
if( argpos )
*argpos = 0;
i = find_long_option( arg, opts, s+2 );
if( argpos )
*argpos = '=';
if( i < 0 && !strcmp( "help", s+2) ) {
if( !(arg->flags & (1<<6)) ) {
show_help(opts, arg->flags);
}
}
else if( i < 0 && !strcmp( "version", s+2) ) {
if( !(arg->flags & (1<<6)) ) {
show_version();
exit(0);
}
}
else if( i < 0 && !strcmp( "warranty", s+2) ) {
puts( strusage(16) );
exit(0);
}
else if( i < 0 && !strcmp( "dump-options", s+2) ) {
for(i=0; opts[i].short_opt; i++ ) {
if( opts[i].long_opt )
printf( "--%s\n", opts[i].long_opt );
}
fputs("--dump-options\n--help\n--version\n--warranty\n", stdout );
exit(0);
}
if( i == -2 ) /* ambiguous option */
arg->r_opt = -8;
else if( i == -1 ) {
arg->r_opt = -2;
arg->r.ret_str = s+2;
}
else
arg->r_opt = opts[i].short_opt;
if( i < 0 )
;
else if( (opts[i].flags & 7) ) {
if( argpos ) {
s2 = argpos+1;
if( !*s2 )
s2 = NULL;
}
else
s2 = argv[1];
if( !s2 && (opts[i].flags & 8) ) { /* no argument but it is okay*/
arg->r_type = 0; /* because it is optional */
}
else if( !s2 ) {
arg->r_opt = -3; /* missing argument */
}
else if( !argpos && *s2 == '-' && (opts[i].flags & 8) ) {
/* the argument is optional and the next seems to be
* an option. We do not check this possible option
* but assume no argument */
arg->r_type = 0;
}
else {
set_opt_arg(arg, opts[i].flags, s2);
if( !argpos ) {
argc--; argv++; idx++; /* skip one */
}
}
}
else { /* does not take an argument */
if( argpos )
arg->r_type = -6; /* argument not expected */
else
arg->r_type = 0;
}
argc--; argv++; idx++; /* set to next one */
}
else if( (*s == '-' && s[1]) || arg->internal.inarg ) { /* short option */
int dash_kludge = 0;
i = 0;
if( !arg->internal.inarg ) {
arg->internal.inarg++;
if( arg->flags & (1<<5) ) {
for(i=0; opts[i].short_opt; i++ )
if( opts[i].long_opt && !strcmp( opts[i].long_opt, s+1)) {
dash_kludge=1;
break;
}
}
}
s += arg->internal.inarg;
if( !dash_kludge ) {
for(i=0; opts[i].short_opt; i++ )
if( opts[i].short_opt == *s )
break;
}
if( !opts[i].short_opt && ( *s == 'h' || *s == '?' ) ) {
if( !(arg->flags & (1<<6)) ) {
show_help(opts, arg->flags);
}
}
arg->r_opt = opts[i].short_opt;
if( !opts[i].short_opt ) {
arg->r_opt = (opts[i].flags & 256)? -7:-2;
arg->internal.inarg++; /* point to the next arg */
arg->r.ret_str = s;
}
else if( (opts[i].flags & 7) ) {
if( s[1] && !dash_kludge ) {
s2 = s+1;
set_opt_arg(arg, opts[i].flags, s2);
}
else {
s2 = argv[1];
if( !s2 && (opts[i].flags & 8) ) { /* no argument but it is okay*/
arg->r_type = 0; /* because it is optional */
}
else if( !s2 ) {
arg->r_opt = -3; /* missing argument */
}
else if( *s2 == '-' && s2[1] && (opts[i].flags & 8) ) {
/* the argument is optional and the next seems to be
* an option. We do not check this possible option
* but assume no argument */
arg->r_type = 0;
}
else {
set_opt_arg(arg, opts[i].flags, s2);
argc--; argv++; idx++; /* skip one */
}
}
s = "x"; /* so that !s[1] yields false */
}
else { /* does not take an argument */
arg->r_type = 0;
arg->internal.inarg++; /* point to the next arg */
}
if( !s[1] || dash_kludge ) { /* no more concatenated short options */
arg->internal.inarg = 0;
argc--; argv++; idx++;
}
}
else if( arg->flags & (1<<2) ) {
arg->r_opt = -1; /* not an option but a argument */
arg->r_type = 2;
arg->r.ret_str = s;
argc--; argv++; idx++; /* set to next one */
}
else {
arg->internal.stopped = 1; /* stop option processing */
goto next_one;
}
leave:
*arg->argc = argc;
*arg->argv = argv;
arg->internal.idx = idx;
return arg->r_opt;
}
static int
set_opt_arg(ARGPARSE_ARGS *arg, unsigned flags, char *s)
{
int base = (flags & 16)? 0 : 10;
switch( arg->r_type = (flags & 7) ) {
case 1: /* takes int argument */
arg->r.ret_int = (int)strtol(s,NULL,base);
return 0;
case 3: /* takes long argument */
arg->r.ret_long= strtol(s,NULL,base);
return 0;
case 4: /* takes ulong argument */
arg->r.ret_ulong= strtoul(s,NULL,base);
return 0;
case 2: /* takes string argument */
default:
arg->r.ret_str = s;
return 1;
}
}
static size_t
long_opt_strlen( ARGPARSE_OPTS *o )
{
size_t n = strlen(o->long_opt);
if( o->description && *o->description == '|' ) {
const char *s;
s=o->description+1;
if( *s != '=' )
n++;
for(; *s && *s != '|'; s++ )
n++;
}
return n;
}
/****************
* Print formatted help. The description string has some special
* meanings:
* - A description string which is "@" suppresses help output for
* this option
* - a description,ine which starts with a '@' and is followed by
* any other characters is printed as is; this may be used for examples
* ans such.
* - A description which starts with a '|' outputs the string between this
* bar and the next one as arguments of the long option.
*/
static void
show_help( ARGPARSE_OPTS *opts, unsigned flags )
{
const char *s;
show_version();
putchar('\n');
s = strusage(41);
puts(s);
if( opts[0].description ) { /* auto format the option description */
int i,j, indent;
/* get max. length of long options */
for(i=indent=0; opts[i].short_opt; i++ ) {
if( opts[i].long_opt )
if( !opts[i].description || *opts[i].description != '@' )
if( (j=long_opt_strlen(opts+i)) > indent && j < 35 )
indent = j;
}
/* example: " -v, --verbose Viele Sachen ausgeben" */
indent += 10;
if( *opts[0].description != '@' )
puts("Options:");
for(i=0; opts[i].short_opt; i++ ) {
s = _( opts[i].description );
if( s && *s== '@' && !s[1] ) /* hide this line */
continue;
if( s && *s == '@' ) { /* unindented comment only line */
for(s++; *s; s++ ) {
if( *s == '\n' ) {
if( s[1] )
putchar('\n');
}
else
putchar(*s);
}
putchar('\n');
continue;
}
j = 3;
if( opts[i].short_opt < 256 ) {
printf(" -%c", opts[i].short_opt );
if( !opts[i].long_opt ) {
if(s && *s == '|' ) {
putchar(' '); j++;
for(s++ ; *s && *s != '|'; s++, j++ )
putchar(*s);
if( *s )
s++;
}
}
}
else
fputs(" ", stdout);
if( opts[i].long_opt ) {
j += printf("%c --%s", opts[i].short_opt < 256?',':' ',
opts[i].long_opt );
if(s && *s == '|' ) {
if( *++s != '=' ) {
putchar(' ');
j++;
}
for( ; *s && *s != '|'; s++, j++ )
putchar(*s);
if( *s )
s++;
}
fputs(" ", stdout);
j += 3;
}
for(;j < indent; j++ )
putchar(' ');
if( s ) {
if( *s && j > indent ) {
putchar('\n');
for(j=0;j < indent; j++ )
putchar(' ');
}
for(; *s; s++ ) {
if( *s == '\n' ) {
if( s[1] ) {
putchar('\n');
for(j=0;j < indent; j++ )
putchar(' ');
}
}
else
putchar(*s);
}
}
putchar('\n');
}
if( flags & 32 )
puts("\n(A single dash may be used instead of the double ones)");
}
if( (s=strusage(19)) ) { /* bug reports to ... */
putchar('\n');
fputs(s, stdout);
}
fflush(stdout);
exit(0);
}
static void
show_version()
{
const char *s;
int i;
/* version line */
fputs(strusage(11), stdout);
if( (s=strusage(12)) )
printf(" (%s)", s );
printf(" %s\n", strusage(13) );
/* additional version lines */
for(i=20; i < 30; i++ )
if( (s=strusage(i)) )
printf("%s\n", s );
/* copyright string */
if( (s=strusage(14)) )
printf("%s\n", s );
/* copying conditions */
if( (s=strusage(15)) )
fputs(s, stdout);
/* thanks */
if( (s=strusage(18)) )
fputs(s, stdout);
/* additional program info */
for(i=30; i < 40; i++ )
if( (s=strusage(i)) )
fputs( (const byte*)s, stdout);
fflush(stdout);
}
void
usage( int level )
{
if( !level ) {
fprintf(stderr,"%s %s; %s\n", strusage(11), strusage(13),
strusage(14) );
fflush(stderr);
}
else if( level == 1 ) {
fputs(strusage(40),stderr);
exit(2);
}
else if( level == 2 ) {
puts(strusage(41));
exit(0);
}
}
/* Level
* 0: Copyright String auf stderr ausgeben
* 1: Kurzusage auf stderr ausgeben und beenden
* 2: Langusage auf stdout ausgeben und beenden
* 11: name of program
* 12: optional name of package which includes this program.
* 13: version string
* 14: copyright string
* 15: Short copying conditions (with LFs)
* 16: Long copying conditions (with LFs)
* 17: Optional printable OS name
* 18: Optional thanks list (with LFs)
* 19: Bug report info
*20..29: Additional lib version strings.
*30..39: Additional program info (with LFs)
* 40: short usage note (with LF)
* 41: long usage note (with LF)
*/
const char *
default_strusage( int level )
{
const char *p = NULL;
switch( level ) {
case 11: p = "foo"; break;
case 13: p = "0.0"; break;
- case 14: p = "Copyright (C) 2006 Free Software Foundation, Inc."; break;
+ case 14: p = "Copyright (C) 2007 Free Software Foundation, Inc."; break;
case 15: p =
"This program comes with ABSOLUTELY NO WARRANTY.\n"
"This is free software, and you are welcome to redistribute it\n"
"under certain conditions. See the file COPYING for details.\n"; break;
case 16: p =
"This is free software; you can redistribute it and/or modify\n"
"it under the terms of the GNU General Public License as published by\n"
"the Free Software Foundation; either version 2 of the License, or\n"
"(at your option) any later version.\n\n"
"It is distributed in the hope that it will be useful,\n"
"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
"GNU General Public License for more details.\n\n"
"You should have received a copy of the GNU General Public License\n"
"along with this program; if not, write to the Free Software\n"
"Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n";
break;
case 40: /* short and long usage */
case 41: p = ""; break;
}
return p;
}
#ifdef TEST
static struct {
int verbose;
int debug;
char *outfile;
char *crf;
int myopt;
int echo;
int a_long_one;
}opt;
int
main(int argc, char **argv)
{
ARGPARSE_OPTS opts[] = {
{ 'v', "verbose", 0 , "Laut sein"},
{ 'e', "echo" , 0 , "Zeile ausgeben, damit wir sehen, was wir einegegeben haben"},
{ 'd', "debug", 0 , "Debug\nfalls mal etasws\nSchief geht"},
{ 'o', "output", 2 },
{ 'c', "cross-ref", 2|8, "cross-reference erzeugen\n" },
{ 'm', "my-option", 1|8 },
{ 500, "a-long-option", 0 },
{0} };
ARGPARSE_ARGS pargs = { &argc, &argv, 2|4|32 };
int i;
while( ArgParse( &pargs, opts) ) {
switch( pargs.r_opt ) {
case -1 : printf( "arg=`%s'\n", pargs.r.ret_str); break;
case 'v': opt.verbose++; break;
case 'e': opt.echo++; break;
case 'd': opt.debug++; break;
case 'o': opt.outfile = pargs.r.ret_str; break;
case 'c': opt.crf = pargs.r_type? pargs.r.ret_str:"a.crf"; break;
case 'm': opt.myopt = pargs.r_type? pargs.r.ret_int : 1; break;
case 500: opt.a_long_one++; break;
default : pargs.err = 1; break; /* force warning output */
}
}
for(i=0; i < argc; i++ )
printf("%3d -> (%s)\n", i, argv[i] );
puts("Options:");
if( opt.verbose )
printf(" verbose=%d\n", opt.verbose );
if( opt.debug )
printf(" debug=%d\n", opt.debug );
if( opt.outfile )
printf(" outfile=`%s'\n", opt.outfile );
if( opt.crf )
printf(" crffile=`%s'\n", opt.crf );
if( opt.myopt )
printf(" myopt=%d\n", opt.myopt );
if( opt.a_long_one )
printf(" a-long-one=%d\n", opt.a_long_one );
if( opt.echo )
printf(" echo=%d\n", opt.echo );
return 0;
}
#endif
/**** bottom of file ****/
diff --git a/util/cert.c b/util/cert.c
index 1b3390b80..317c14b37 100644
--- a/util/cert.c
+++ b/util/cert.c
@@ -1,251 +1,252 @@
/* cert.c - DNS CERT code
- * Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+ * Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
*
* This file is part of GNUPG.
*
* GNUPG 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.
*
* GNUPG 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*/
#include <config.h>
#include <sys/types.h>
#ifdef USE_DNS_CERT
#ifdef _WIN32
#include <windows.h>
#else
#include <netinet/in.h>
#include <arpa/nameser.h>
+#include <arpa/inet.h>
#include <resolv.h>
#endif
#include <string.h>
#include "memory.h"
#endif
#include "iobuf.h"
#include "util.h"
/* Not every installation has gotten around to supporting CERTs
yet... */
#ifndef T_CERT
#define T_CERT 37
#endif
#ifdef USE_DNS_CERT
/* Returns -1 on error, 0 for no answer, 1 for PGP provided and 2 for
IPGP provided. */
int
get_cert(const char *name,size_t max_size,IOBUF *iobuf,
unsigned char **fpr,size_t *fpr_len,char **url)
{
unsigned char *answer;
int r,ret=-1;
u16 count;
if(fpr)
*fpr=NULL;
if(url)
*url=NULL;
answer=xmalloc(max_size);
r=res_query(name,C_IN,T_CERT,answer,max_size);
/* Not too big, not too small, no errors and at least 1 answer. */
if(r>=sizeof(HEADER) && r<=max_size
&& (((HEADER *)answer)->rcode)==NOERROR
&& (count=ntohs(((HEADER *)answer)->ancount)))
{
int rc;
unsigned char *pt,*emsg;
emsg=&answer[r];
pt=&answer[sizeof(HEADER)];
/* Skip over the query */
rc=dn_skipname(pt,emsg);
if(rc==-1)
goto fail;
pt+=rc+QFIXEDSZ;
/* There are several possible response types for a CERT request.
We're interested in the PGP (a key) and IPGP (a URI) types.
Skip all others. TODO: A key is better than a URI since
we've gone through all this bother to fetch it, so favor that
if we have both PGP and IPGP? */
while(count-->0 && pt<emsg)
{
u16 type,class,dlen,ctype;
rc=dn_skipname(pt,emsg); /* the name we just queried for */
if(rc==-1)
break;
pt+=rc;
/* Truncated message? 15 bytes takes us to the point where
we start looking at the ctype. */
if((emsg-pt)<15)
break;
type=*pt++ << 8;
type|=*pt++;
class=*pt++ << 8;
class|=*pt++;
/* We asked for IN and got something else !? */
if(class!=C_IN)
break;
/* ttl */
pt+=4;
/* data length */
dlen=*pt++ << 8;
dlen|=*pt++;
/* We asked for CERT and got something else - might be a
CNAME, so loop around again. */
if(type!=T_CERT)
{
pt+=dlen;
continue;
}
/* The CERT type */
ctype=*pt++ << 8;
ctype|=*pt++;
/* Skip the CERT key tag and algo which we don't need. */
pt+=3;
dlen-=5;
/* 15 bytes takes us to here */
if(ctype==3 && iobuf && dlen)
{
/* PGP type */
*iobuf=iobuf_temp_with_content((char *)pt,dlen);
ret=1;
break;
}
else if(ctype==6 && dlen && dlen<1023 && dlen>=pt[0]+1
&& fpr && fpr_len && url)
{
/* IPGP type */
*fpr_len=pt[0];
if(*fpr_len)
{
*fpr=xmalloc(*fpr_len);
memcpy(*fpr,&pt[1],*fpr_len);
}
else
*fpr=NULL;
if(dlen>*fpr_len+1)
{
*url=xmalloc(dlen-(*fpr_len+1)+1);
memcpy(*url,&pt[*fpr_len+1],dlen-(*fpr_len+1));
(*url)[dlen-(*fpr_len+1)]='\0';
}
else
*url=NULL;
ret=2;
break;
}
/* Neither type matches, so go around to the next answer. */
pt+=dlen;
}
}
fail:
xfree(answer);
return ret;
}
#else /* !USE_DNS_CERT */
int
get_cert(const char *name,size_t max_size,IOBUF *iobuf,
unsigned char **fpr,size_t *fpr_len,char **url)
{
return -1;
}
#endif
/* Test with simon.josefsson.org */
#ifdef TEST
int
main(int argc,char *argv[])
{
unsigned char *fpr;
size_t fpr_len;
char *url;
int rc;
IOBUF iobuf;
if(argc!=2)
{
printf("cert-test [name]\n");
return 1;
}
printf("CERT lookup on %s\n",argv[1]);
rc=get_cert(argv[1],16384,&iobuf,&fpr,&fpr_len,&url);
if(rc==-1)
printf("error\n");
else if(rc==0)
printf("no answer\n");
else if(rc==1)
{
printf("key found: %d bytes\n",(int)iobuf_get_temp_length(iobuf));
iobuf_close(iobuf);
}
else if(rc==2)
{
if(fpr)
{
size_t i;
printf("Fingerprint found (%d bytes): ",(int)fpr_len);
for(i=0;i<fpr_len;i++)
printf("%02X",fpr[i]);
printf("\n");
}
else
printf("No fingerprint found\n");
if(url)
printf("URL found: %s\n",url);
else
printf("No URL found\n");
xfree(fpr);
xfree(url);
}
return 0;
}
#endif /* TEST */
diff --git a/util/pka.c b/util/pka.c
index 3c9e5c437..2a39a4feb 100644
--- a/util/pka.c
+++ b/util/pka.c
@@ -1,254 +1,255 @@
/* pka.c - DNS Public Key Association RR access
- * Copyright (C) 2005 Free Software Foundation, Inc.
+ * Copyright (C) 2005, 2007 Free Software Foundation, Inc.
*
* This file is part of GnuPG.
*
* GnuPG 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.
*
* GnuPG 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*/
#include <config.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef USE_DNS_PKA
#include <sys/types.h>
#ifdef _WIN32
#include <windows.h>
#else
#include <netinet/in.h>
#include <arpa/nameser.h>
+#include <arpa/inet.h>
#include <resolv.h>
#endif
#endif /* USE_DNS_PKA */
#include "memory.h"
#include "types.h"
#include "util.h"
#ifdef USE_DNS_PKA
/* Parse the TXT resource record. Format is:
v=pka1;fpr=a4d94e92b0986ab5ee9dcd755de249965b0358a2;uri=string
For simplicity white spaces are not allowed. Because we expect to
use a new RRTYPE for this in the future we define the TXT really
strict for simplicity: No white spaces, case sensitivity of the
names, order must be as given above. Only URI is optional.
This function modifies BUFFER. On success 0 is returned, the 20
byte fingerprint stored at FPR and BUFFER contains the URI or an
empty string.
*/
static int
parse_txt_record (char *buffer, unsigned char *fpr)
{
char *p, *pend;
int i;
p = buffer;
pend = strchr (p, ';');
if (!pend)
return -1;
*pend++ = 0;
if (strcmp (p, "v=pka1"))
return -1; /* Wrong or missing version. */
p = pend;
pend = strchr (p, ';');
if (pend)
*pend++ = 0;
if (strncmp (p, "fpr=", 4))
return -1; /* Missing fingerprint part. */
p += 4;
for (i=0; i < 20 && hexdigitp (p) && hexdigitp (p+1); i++, p += 2)
fpr[i] = xtoi_2 (p);
if (i != 20)
return -1; /* Fingerprint consists not of exactly 40 hexbytes. */
p = pend;
if (!p || !*p)
{
*buffer = 0;
return 0; /* Success (no URI given). */
}
if (strncmp (p, "uri=", 4))
return -1; /* Unknown part. */
p += 4;
/* There is an URI, copy it to the start of the buffer. */
while (*p)
*buffer++ = *p++;
*buffer = 0;
return 0;
}
/* For the given email ADDRESS lookup the PKA information in the DNS.
On success the 20 byte SHA-1 fingerprint is stored at FPR and the
URI will be returned in an allocated buffer. Note that the URI
might be an zero length string as this information is optiobnal.
Caller must xfree the returned string.
On error NULL is returned and the 20 bytes at FPR are not
defined. */
char *
get_pka_info (const char *address, unsigned char *fpr)
{
unsigned char answer[PACKETSZ];
int anslen;
int qdcount, ancount, nscount, arcount;
int rc;
unsigned char *p, *pend;
const char *domain;
char *name;
domain = strrchr (address, '@');
if (!domain || domain == address || !domain[1])
return NULL; /* invalid mail address given. */
name = malloc (strlen (address) + 5 + 1);
memcpy (name, address, domain - address);
strcpy (stpcpy (name + (domain-address), "._pka."), domain+1);
anslen = res_query (name, C_IN, T_TXT, answer, PACKETSZ);
xfree (name);
if (anslen < sizeof(HEADER))
return NULL; /* DNS resolver returned a too short answer. */
if ( (rc=((HEADER*)answer)->rcode) != NOERROR )
return NULL; /* DNS resolver returned an error. */
/* We assume that PACKETSZ is large enough and don't do dynmically
expansion of the buffer. */
if (anslen > PACKETSZ)
return NULL; /* DNS resolver returned a too long answer */
qdcount = ntohs (((HEADER*)answer)->qdcount);
ancount = ntohs (((HEADER*)answer)->ancount);
nscount = ntohs (((HEADER*)answer)->nscount);
arcount = ntohs (((HEADER*)answer)->arcount);
if (!ancount)
return NULL; /* Got no answer. */
p = answer + sizeof (HEADER);
pend = answer + anslen; /* Actually points directly behind the buffer. */
while (qdcount-- && p < pend)
{
rc = dn_skipname (p, pend);
if (rc == -1)
return NULL;
p += rc + QFIXEDSZ;
}
if (ancount > 1)
return NULL; /* more than one possible gpg trustdns record - none used. */
while (ancount-- && p <= pend)
{
unsigned int type, class, txtlen, n;
char *buffer, *bufp;
rc = dn_skipname (p, pend);
if (rc == -1)
return NULL;
p += rc;
if (p >= pend - 10)
return NULL; /* RR too short. */
type = *p++ << 8;
type |= *p++;
class = *p++ << 8;
class |= *p++;
p += 4;
txtlen = *p++ << 8;
txtlen |= *p++;
if (type != T_TXT || class != C_IN)
return NULL; /* Answer does not match the query. */
buffer = bufp = xmalloc (txtlen + 1);
while (txtlen && p < pend)
{
for (n = *p++, txtlen--; txtlen && n && p < pend; txtlen--, n--)
*bufp++ = *p++;
}
*bufp = 0;
if (parse_txt_record (buffer, fpr))
{
xfree (buffer);
return NULL; /* Not a valid gpg trustdns RR. */
}
return buffer;
}
return NULL;
}
#else /* !USE_DNS_PKA */
/* Dummy version of the function if we can't use the resolver
functions. */
char *
get_pka_info (const char *address, unsigned char *fpr)
{
return NULL;
}
#endif /* !USE_DNS_PKA */
#ifdef TEST
int
main(int argc,char *argv[])
{
unsigned char fpr[20];
char *uri;
int i;
if (argc < 2)
{
fprintf (stderr, "usage: pka mail-addresses\n");
return 1;
}
argc--;
argv++;
for (; argc; argc--, argv++)
{
uri = get_pka_info ( *argv, fpr );
printf ("%s", *argv);
if (uri)
{
putchar (' ');
for (i=0; i < 20; i++)
printf ("%02X", fpr[i]);
if (*uri)
printf (" %s", uri);
xfree (uri);
}
putchar ('\n');
}
return 0;
}
#endif /* TEST */
/*
Local Variables:
compile-command: "cc -DUSE_DNS_PKA -DTEST -I.. -I../include -Wall -g -o pka pka.c -lresolv libutil.a"
End:
*/
diff --git a/util/srv.c b/util/srv.c
index 95187dbc8..1cbc52eb6 100644
--- a/util/srv.c
+++ b/util/srv.c
@@ -1,257 +1,258 @@
/* srv.c - DNS SRV code
- * Copyright (C) 2003 Free Software Foundation, Inc.
+ * Copyright (C) 2003, 2005, 2006, 2007 Free Software Foundation, Inc.
*
* This file is part of GNUPG.
*
* GNUPG 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.
*
* GNUPG 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*/
#include <config.h>
#include <sys/types.h>
#ifdef _WIN32
#include <windows.h>
#else
#include <netinet/in.h>
#include <arpa/nameser.h>
+#include <arpa/inet.h>
#include <resolv.h>
#endif
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "memory.h"
#include "types.h"
#include "srv.h"
/* Not every installation has gotten around to supporting SRVs
yet... */
#ifndef T_SRV
#define T_SRV 33
#endif
static int
priosort(const void *a,const void *b)
{
const struct srventry *sa=a,*sb=b;
if(sa->priority>sb->priority)
return 1;
else if(sa->priority<sb->priority)
return -1;
else
return 0;
}
int
getsrv(const char *name,struct srventry **list)
{
unsigned char answer[PACKETSZ];
int r,srvcount=0;
unsigned char *pt,*emsg;
u16 count,dlen;
*list=NULL;
r=res_query(name,C_IN,T_SRV,answer,PACKETSZ);
if(r<sizeof(HEADER) || r>PACKETSZ)
return -1;
if((((HEADER *)answer)->rcode)==NOERROR &&
(count=ntohs(((HEADER *)answer)->ancount)))
{
int i,rc;
emsg=&answer[r];
pt=&answer[sizeof(HEADER)];
/* Skip over the query */
rc=dn_skipname(pt,emsg);
if(rc==-1)
goto fail;
pt+=rc+QFIXEDSZ;
while(count-->0 && pt<emsg)
{
struct srventry *srv=NULL;
u16 type,class;
*list=xrealloc(*list,(srvcount+1)*sizeof(struct srventry));
memset(&(*list)[srvcount],0,sizeof(struct srventry));
srv=&(*list)[srvcount];
srvcount++;
rc=dn_skipname(pt,emsg); /* the name we just queried for */
if(rc==-1)
goto fail;
pt+=rc;
/* Truncated message? */
if((emsg-pt)<16)
goto fail;
type=*pt++ << 8;
type|=*pt++;
/* We asked for SRV and got something else !? */
if(type!=T_SRV)
goto fail;
class=*pt++ << 8;
class|=*pt++;
/* We asked for IN and got something else !? */
if(class!=C_IN)
goto fail;
pt+=4; /* ttl */
dlen=*pt++ << 8;
dlen|=*pt++;
srv->priority=*pt++ << 8;
srv->priority|=*pt++;
srv->weight=*pt++ << 8;
srv->weight|=*pt++;
srv->port=*pt++ << 8;
srv->port|=*pt++;
/* Get the name. 2782 doesn't allow name compression, but
dn_expand still works to pull the name out of the
packet. */
rc=dn_expand(answer,emsg,pt,srv->target,MAXDNAME);
if(rc==1 && srv->target[0]==0) /* "." */
goto noanswer;
if(rc==-1)
goto fail;
pt+=rc;
/* Corrupt packet? */
if(dlen!=rc+6)
goto fail;
#if 0
printf("count=%d\n",srvcount);
printf("priority=%d\n",srv->priority);
printf("weight=%d\n",srv->weight);
printf("port=%d\n",srv->port);
printf("target=%s\n",srv->target);
#endif
}
/* Now we have an array of all the srv records. */
/* Order by priority */
qsort(*list,srvcount,sizeof(struct srventry),priosort);
/* For each priority, move the zero-weighted items first. */
for(i=0;i<srvcount;i++)
{
int j;
for(j=i;j<srvcount && (*list)[i].priority==(*list)[j].priority;j++)
{
if((*list)[j].weight==0)
{
/* Swap j with i */
if(j!=i)
{
struct srventry temp;
memcpy(&temp,&(*list)[j],sizeof(struct srventry));
memcpy(&(*list)[j],&(*list)[i],sizeof(struct srventry));
memcpy(&(*list)[i],&temp,sizeof(struct srventry));
}
break;
}
}
}
/* Run the RFC-2782 weighting algorithm. We don't need very
high quality randomness for this, so regular libc srand/rand
is sufficient. */
srand(time(NULL)*getpid());
for(i=0;i<srvcount;i++)
{
int j;
float prio_count=0,chose;
for(j=i;j<srvcount && (*list)[i].priority==(*list)[j].priority;j++)
{
prio_count+=(*list)[j].weight;
(*list)[j].run_count=prio_count;
}
chose=prio_count*rand()/RAND_MAX;
for(j=i;j<srvcount && (*list)[i].priority==(*list)[j].priority;j++)
{
if(chose<=(*list)[j].run_count)
{
/* Swap j with i */
if(j!=i)
{
struct srventry temp;
memcpy(&temp,&(*list)[j],sizeof(struct srventry));
memcpy(&(*list)[j],&(*list)[i],sizeof(struct srventry));
memcpy(&(*list)[i],&temp,sizeof(struct srventry));
}
break;
}
}
}
}
return srvcount;
noanswer:
xfree(*list);
*list=NULL;
return 0;
fail:
xfree(*list);
*list=NULL;
return -1;
}
#ifdef TEST
int
main(int argc,char *argv[])
{
struct srventry *srv;
int rc,i;
rc=getsrv("_hkp._tcp.wwwkeys.pgp.net",&srv);
printf("Count=%d\n\n",rc);
for(i=0;i<rc;i++)
{
printf("priority=%d\n",srv[i].priority);
printf("weight=%d\n",srv[i].weight);
printf("port=%d\n",srv[i].port);
printf("target=%s\n",srv[i].target);
printf("\n");
}
xfree(srv);
return 0;
}
#endif /* TEST */
/*
Local Variables:
compile-command: "cc -DTEST -I.. -I../include -Wall -g -o srv srv.c -lresolv libutil.a"
End:
*/

File Metadata

Mime Type
text/x-diff
Expires
Thu, Feb 26, 6:47 PM (20 h, 15 m)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
78/c2/5639d4b62d6517b7b8f642e0234d

Event Timeline