diff options
Diffstat (limited to 'jnlib')
-rw-r--r-- | jnlib/ChangeLog | 758 | ||||
-rw-r--r-- | jnlib/Makefile.am | 85 | ||||
-rw-r--r-- | jnlib/README | 8 | ||||
-rw-r--r-- | jnlib/argparse.c | 1205 | ||||
-rw-r--r-- | jnlib/argparse.h | 183 | ||||
-rw-r--r-- | jnlib/dotlock.c | 713 | ||||
-rw-r--r-- | jnlib/dotlock.h | 33 | ||||
-rw-r--r-- | jnlib/dynload.h | 86 | ||||
-rw-r--r-- | jnlib/libjnlib-config.h | 99 | ||||
-rw-r--r-- | jnlib/logging.c | 651 | ||||
-rw-r--r-- | jnlib/logging.h | 88 | ||||
-rw-r--r-- | jnlib/mischelp.c | 197 | ||||
-rw-r--r-- | jnlib/mischelp.h | 102 | ||||
-rw-r--r-- | jnlib/stringhelp.c | 1151 | ||||
-rw-r--r-- | jnlib/stringhelp.h | 136 | ||||
-rw-r--r-- | jnlib/strlist.c | 204 | ||||
-rw-r--r-- | jnlib/strlist.h | 50 | ||||
-rw-r--r-- | jnlib/t-stringhelp.c | 414 | ||||
-rw-r--r-- | jnlib/t-support.c | 147 | ||||
-rw-r--r-- | jnlib/t-support.h | 60 | ||||
-rw-r--r-- | jnlib/t-timestuff.c | 145 | ||||
-rw-r--r-- | jnlib/t-w32-reg.c | 70 | ||||
-rw-r--r-- | jnlib/types.h | 114 | ||||
-rw-r--r-- | jnlib/utf8conv.c | 813 | ||||
-rw-r--r-- | jnlib/utf8conv.h | 45 | ||||
-rw-r--r-- | jnlib/w32-afunix.c | 138 | ||||
-rw-r--r-- | jnlib/w32-afunix.h | 52 | ||||
-rw-r--r-- | jnlib/w32-reg.c | 312 | ||||
-rw-r--r-- | jnlib/w32help.h | 32 | ||||
-rw-r--r-- | jnlib/xmalloc.c | 87 | ||||
-rw-r--r-- | jnlib/xmalloc.h | 30 |
31 files changed, 0 insertions, 8208 deletions
diff --git a/jnlib/ChangeLog b/jnlib/ChangeLog deleted file mode 100644 index 53ceedf27..000000000 --- a/jnlib/ChangeLog +++ /dev/null @@ -1,758 +0,0 @@ -2010-03-01 Werner Koch <[email protected]> - - * t-w32-reg.c: New. - - * w32-reg.c (read_w32_registry_string) - (write_w32_registry_string): Support W32CE. - -2010-02-26 Werner Koch <[email protected]> - - * t-timestuff.c: New. - - * dynload.h (dlopen, dlsym) [W32CE]: Map to wchar_t. - - * mischelp.c (_jnlib_free): New. - (same_file_p) [W32CE]: Map to wchar_t. - - * utf8conv.c (set_native_charset) [W32CE]: Do not use - GetConsoleOutputCP. - (wchar_to_utf8, utf8_to_wchar) [W32]: New. - - * Makefile.am (t_jnlib_ldadd) [W32CE]: Add gpg-error. - - * t-support.h (getenv) [HAVE_GETENV]: Add getenv stub. - [W32CE]: Include gpg-error.h - * t-support.c (gpg_err_code_from_errno) - (gpg_err_code_from_syserror) [GPG_ERROR_H]: Do not build. - - * t-stringhelp.c (gethome) [!HAVE_GETPWUID]: Keep result of getenv. - - * dotlock.c [!HAVE_SIGNAL_H]: Don't include signal.h. - (create_dotlock) [W32CE]: Map filename top wchar_t. - - * libjnlib-config.h [USE_SIMPLE_GETTEXT]: Include gpg-error.h and - remove w32help.h. - (jnlib_set_errno): New. Use it everywhere to set ERRNO. - (getenv) [!HAVE_GETENV]: New. - (getpid) [W32E]: New. - - * stringhelp.c (get_pwdir) [!HAVE_PWD_H]: Mark unused args. - (w32_strerror) [W32CE]: Use a simple implementation. - - * w32help.h [USE_SIMPLE_GETTEXT]: Remove all definitions; we are - now using the gpg-error included implementation. - * w32-gettext.c: Remove. - - * mischelp.c (same_file_p): Fix bug in case the second file can't - be opened. - -2009-10-19 Werner Koch <[email protected]> - - * strlist.c (add_to_strlist_try): New. - -2009-09-22 Werner Koch <[email protected]> - - * dotlock.h (DOTLOCK): Rename to dotlock_t. Change all users. - -2009-08-26 Werner Koch <[email protected]> - - * stringhelp.c (do_make_filename): Factor some code out to .. - (get_pwdir): .. new. - -2009-08-26 Werner Koch <[email protected]> - - * stringhelp.c [HAVE_PWD_H]: Include pwd.h. - (do_make_filename): New. - (make_filename, make_filename_try): Implement using the new - function. - * t-stringhelp.c (test_make_filename_try): New. - * t-support.c (gcry_strdup): Fix. - - * stringhelp.h (make_filename, make_filename_try): Add sentinel - attribute. - -2009-08-25 Werner Koch <[email protected]> - - * stringhelp.c: Include errno.h. - (do_strconcat): New. - (strconcat, xstrconcat): New. - * types.h (GNUPG_GCC_A_SENTINEL): New. - * t-stringhelp.c (test_strconcat, test_xstrconcat): New. - (main): Run them. - -2009-07-07 Werner Koch <[email protected]> - - * stringhelp.c (make_filename_try): Use jnlib_malloc. - - * dotlock.c (read_lockfile): Replace jnlib_xmalloc by jnlib_malloc. - -2009-06-04 Werner Koch <[email protected]> - - * mischelp.h: Include SUN_LEN etc also for W32. - -2009-05-19 Werner Koch <[email protected]> - - * mischelp.h: Define PF_LOCAL, AF_LOCAL and SUN_LEN if requested. - * logging.c (fun_writer): Use SUN_LEN to fix a Mac OS X freeze. - -2009-03-25 Werner Koch <[email protected]> - - * logging.c (fun_closer): Never close fd 2. - (set_file_fd): Close logstream early. - -2009-02-25 Werner Koch <[email protected]> - - * logging.c (get_tid_callback): New. - (do_logv): Use it. - (log_set_get_tid_callback): New. - -2009-01-22 Werner Koch <[email protected]> - - * t-support.c (gpg_err_code_from_errno) - (gpg_err_code_from_syserror): New. - -2008-11-20 Werner Koch <[email protected]> - - * argparse.c (arg_parse): Fix last change. - -2008-11-11 Werner Koch <[email protected]> - - * argparse.h: Add a bunch of macros and constants. - * argparse.c: Use the new macros. Re-indent the code. Change - license back to LGPL 2.1. - -2008-11-04 Werner Koch <[email protected]> - - * w32-gettext.c: Merged with code from libgpg-error and rewrote - most parts. - - * Makefile.am (AM_CFLAGS): Add -DJNLIB_IN_JNLIB. - -2008-10-29 Werner Koch <[email protected]> - - * stringhelp.c (make_filename): Implement using macros. Factor some - code out to .. - (change_slashes): New. - (make_filename_try): New. - - * w32-gettext.c (gettext): Return if no domain is loaded. - Reported by Tom Pegios. - -2008-10-28 Werner Koch <[email protected]> - - * w32-gettext.c (gettext): Try the binary search if the string was - not found in the hash table. - -2008-10-20 Werner Koch <[email protected]> - - * w32-afunix.c (_w32_sock_connect): Mark ADDRLEN as unused. - - * dotlock.c (release_dotlock): Do not mix declaration and code. - - * stringhelp.c (make_basename): Silent gcc warning about unused arg. - * argparse.c (store_alias): Ditto. - (find_long_option): - -2008-10-15 Werner Koch <[email protected]> - - * logging.c (do_logv) [W32]: Flush the log stream. - -2008-09-29 Werner Koch <[email protected]> - - * argparse.c (ARGERR_): Use constants for error values. - (optfile_parse): Prettify. Replace xmalloc and xrealloc by malloc - and realloc. - * libjnlib-config.h (jnlib_strdup, jnlib_realloc): New. - -2008-06-26 Werner Koch <[email protected]> - - * stringhelp.c (print_sanitized_buffer2): Loose check for control - characters to better cope with utf-8. The range 0x80..0x9f is - nowadays not anymore accidently used for control charaters. - -2008-06-13 Werner Koch <[email protected]> - - * dotlock.c: Reformat code and implement locking for W32. - (create_dotlock): Use snprintf. - -2008-06-11 Werner Koch <[email protected]> - - * utf8conv.c: Remove useless variable ACTIVE_CHARSET. Suggested - by Petr Uzel. - -2008-05-26 Werner Koch <[email protected]> - - * argparse.c (usage): Make sure to print a trailing LF for usage(1). - -2008-04-08 Werner Koch <[email protected]> - - * w32-gettext.c (gettext_select_utf8): New. - (get_string): Support switching encodings. - (load_domain): Allocate space for DATA_NATIVE. - -2008-03-25 Werner Koch <[email protected]> - - * w32-gettext.c (_nl_locale_name): New. Taken from - ../common/localename and GNU gettext's localename.c. - (set_gettext_file): Rewritten. - (gettext_localename): New. - -2008-03-17 Werner Koch <[email protected]> - - * logging.c (my_funopen_hook_size_t): New. - (fun_writer): Use it to cope with fopencookie/funopen differences. - * dotlock.c (read_lockfile): Initialize PID. Reported by Stéphane - Corthésy. - -2008-02-22 Werner Koch <[email protected]> - - * argparse.c (strusage): Set copyright year to 2008. - -2007-11-19 Werner Koch <[email protected]> - - * stringhelp.c (percent_escape): Factor code out to - (do_percent_escape): .. new. - (try_percent_escape): New. - -2007-10-01 Werner Koch <[email protected]> - - * w32-afunix.c: Only keep the client related code. - (read_port_and_nonce): New. Taken from Assuan. - (_w32_sock_connect): Rewritten. - -2007-08-29 Werner Koch <[email protected]> - - * argparse.c (initialize): Make strings translatable and remove - extra LF. - -2007-08-24 Werner Koch <[email protected]> - - * mischelp.c (same_file_p): New. - (libjnlib_dummy_mischelp_func): Remove as we now always have one - function. - -2007-08-09 Werner Koch <[email protected]> - - * argparse.c (show_help): Expand the @EMAIL@ macro in the package - bug reporting address. - -2007-08-02 Werner Koch <[email protected]> - - * t-stringhelp.c (test_compare_filenames): New. - - * stringhelp.c (compare_filenames) [HAVE_DRIVE_LETTERS]: Fixed - comparison to take slash and backslash in account. - (make_filename): Avoid mixing / and \. - -2007-07-04 Werner Koch <[email protected]> - - * utf8conv.c (load_libiconv): Remove URL from translatble string. - - Switched JNLIB from LGPLv2.1 to LGPLv3. - -2007-07-01 Werner Koch <[email protected]> - - * argparse.c (strusage): Use id 10 for the license string; - default to GPL3+. Change long note to version 3 or later. - (show_version): Print the license info. - -2007-06-19 Werner Koch <[email protected]> - - * Makefile.am: Add support for regression tests. - * t-support.h, t-support.c: New. - * t-stringhelp.c: New. - - * stringhelp.c (percent_escape): Add arg EXTRA to make it a more - general function. Changed all callers. - -2007-06-18 Werner Koch <[email protected]> - - * w32-afunix.c (_w32_sock_bind): Changed to properly detect an - already used socket. - -2007-06-18 Marcus Brinkmann <[email protected]> - - * stringhelp.h (percent_escape): New prototype. - * stringhelp.c (percent_escape): New function. - -2007-06-11 Werner Koch <[email protected]> - - * utf8conv.c (jnlib_iconv_open, jnlib_iconv, jnlib_iconv_close): New. - -2007-06-06 Werner Koch <[email protected]> - - * w32help.h: New. - * w32-gettext.c: New. Taken from gnupg 1.4, added ngettext, - changed to use jnlib malloc functions and put under the LGPL. - * w32-reg.c: New. Taken from../common/w32reg.c and changed to - LGPL. Changed API to use the jnlib malloc functions. - * Makefile.am (libjnlib_a_SOURCES) [!W32]: Do not build the w32 - specific modules. - - * dotlock.c: Include stringhelp.h for stpcpy prototype. - -2007-06-04 Werner Koch <[email protected]> - - * dynload.h: New. Taken from ../common and changed to LGPL. - - * utf8conv.c (load_libiconv): New. Taken from GnuPG 1.4 - -2007-05-30 Werner Koch <[email protected]> - - * w32-pth.h, w32-pth.c: Remove. - -2007-04-25 Werner Koch <[email protected]> - - * argparse.c (long_opt_strlen): Fixed for utf-8. - -2007-03-07 Werner Koch <[email protected]> - - * argparse.c (strusage): Set copyright year to 2007. - -2007-01-25 Werner Koch <[email protected]> - - * stringhelp.c (utf8_charcount): New. - -2006-11-29 Werner Koch <[email protected]> - - * utf8conv.c (set_native_charset) [HAVE_W32_SYSTEM]: Fixed typo in - macro name. - -2006-11-15 Werner Koch <[email protected]> - - * logging.c (my_funopen_hook_ret_t): New. - (fun_writer): Use it. - -2006-10-19 Werner Koch <[email protected]> - - * stringhelp.c (memrchr) [!HAVE_MEMRCHR]: Provide a replacement. - -2006-09-27 Werner Koch <[email protected]> - - * mischelp.c: New. - (timegm): Copied from gnupg 1.4, changed from GPL to LGPL. Fixed - a memory leak. - - * stringhelp.h (isascii): New. - - * stringhelp.c (strsep): New. Copied from gnupg 1.4.5 - util/strgutil.c. - - * strlist.h (STRLIST): Removed deprecated typedef. - - * types.h: Made cpp commands work with old compilers. Also shows - up nicer with Emacs' font locking. - - * w32-afunix.c (_w32_sock_connect): Set ERRNO for an invalid port. - - Changed license from GPL to LGPL. Note that all code has either - been written by me, David, employees of g10 Code or taken from - glibc. - - * libjnlib-config.h, stringhelp.c, stringhelp.h: - * strlist.c, strlist.h, utf8conv.c, utf8conv.h: - * argparse.c, argparse.h, logging.c, logging.h: - * dotlock.c, dotlock.h, types.h, mischelp.h: - * xmalloc.c, xmalloc.h, w32-pth.c, w32-pth.h: - * w32-afunix.c, w32-afunix.h: Tagged them to be long to jnlib - which is a part of GnuPG but also used by other projetcs. - -2006-09-22 Werner Koch <[email protected]> - - * utf8conv.c: Reworked to match the gnupg 1.4.5 code. This now - requires iconv support but this is reasonable for all modern - systems. - -2006-08-29 Werner Koch <[email protected]> - - * logging.c (do_logv): Emit a missing LF for fatal errors. - -2006-06-28 Werner Koch <[email protected]> - - * dotlock.c (make_dotlock, release_dotlock, read_lockfile) - (maybe_deadlock, destroy_dotlock, create_dotlock): Re-indented. - (create_dotlock): Repalces some log_fatal by log_error as it was - not intended that they should terminate. Write the nodename to - the locking file. Code cleanups. - (read_lockfile): Reworked to read the node name. - (make_dotlock): Test for identical node name and delete lock stale - file. - (release_dotlock): Likewise. - -2006-05-23 Werner Koch <[email protected]> - - * libjnlib-config.h (JNLIB_NEED_UTF8CONV): Fixed typo in name. - - * dotlock.c (release_dotlock): Don't act if we don't have any - locks at all. - (destroy_dotlock): New. From 1.4.3. - (dotlock_remove_lockfiles): Make use of destroy function. - -2006-05-19 Werner Koch <[email protected]> - - * strlist.c (append_to_strlist2): Enabled. - - * stringhelp.c (print_sanitized_buffer2): New. Changed the rules - to match the behaviour of print_string2 from gnupg 1.4.3. - (print_sanitized_buffer): Use the new function. - (print_sanitized_string2): New. - (hextobyte): New. Taken from gpg 1.4.3. - -2006-04-28 Werner Koch <[email protected]> - - * stringhelp.c (print_sanitized_buffer): Fix bug where the count - got wrong for the \xNN representation. - (sanitize_buffer): Fix bug where some control characters lose part - of their \xNN representation. - -2006-04-20 Werner Koch <[email protected]> - - * stringhelp.c (make_basename): New arg INPUTPATH for future - riscos compatibility. - -2006-04-18 Werner Koch <[email protected]> - - * libjnlib-config.h (JNLIB_NEED_UTF8CONF): Defined. - * strlist.c (add_to_strlist2) [JNLIB_NEED_UTF8CONV]: Enabled. - -2005-06-15 Werner Koch <[email protected]> - - * stringhelp.c (sanitize_buffer): Make P a void*. - (ascii_memistr, memistr): Ditto. - (ascii_memcasecmp): Ditto. - * logging.c (writen): Use void * for arg BUFFER. - * stringhelp.c (memistr): Fixed unsigned/signed pointer conflict. - (ascii_memistr): Ditto. - (ascii_memcasemem): Ditto. - * utf8conv.c (utf8_to_native): Ditto. - (utf8_to_native): Ditto. - * argparse.c (show_version): Removed non-required cast. - -2005-01-19 Werner Koch <[email protected]> - - * logging.c (fun_writer): Don't fallback to stderr. Print to - stderr only if connected to a tty. - -2004-12-20 Werner Koch <[email protected]> - - * w32-pth.c (do_pth_event_free): The events are hold in a ring - buffer. Adjust for that. - (do_pth_event_body): Ditto. - (pth_event_isolate): Ditto. - (do_pth_wait): Ditto. - (_pth_event_count): Renamed to .. - (event_count): .. and adjusted as above. - (pth_init): Define 3 debug levels and change all debug calls to - make use of them. This makes the moule now silent. - -2004-12-19 Werner Koch <[email protected]> - - * w32-pth.c (pth_init): Enable debugging depending on env var. - (pth_self): New. - (pth_mutex_release, pth_mutex_acquire): Implemented directly using - the W32 API. - -2004-12-18 Werner Koch <[email protected]> - - * w32-pth.c (pth_init): Reverse return values. Use TRUE and FALSE - constants. - (pth_kill, pth_mutex_acquire, pth_attr_set, pth_join, pth_cancel): - Ditto. - -2004-12-15 Werner Koch <[email protected]> - - * logging.c [W32]: Don't include unavailable headers. - -2004-12-14 Werner Koch <[email protected]> - - * w32-pth.c (_pth_strerror): Renamed to ... - (w32_strerror): .. this. And let callers provide a buffer. - (spawn_helper_thread): Removed HD arg and hardwire the stack size - to 32k. - (do_pth_wait): Removed use of ATTR; not needed for the helper - threads. - (helper_thread): Renamed to .. - (launch_thread): .. this. Release handle if not joinable. - (struct pth_priv_hd_s): Renamed to ... - (struct thread_info_s): .. this. Add member JOINABLE and TH. - -2004-12-14 Timo Schulz <[email protected]> - - * w32-pth.c (pth_kill): Just release the crit section if - pth_init was really called. And set all handles to NULL. - (_pth_strerror): New. - (do_pth_wait): Before we enter the loop we check if there - are too much events in the ring. - -2004-12-14 Werner Koch <[email protected]> - - * w32-pth.h (pth_event_occured): Removed macro. - * w32-pth.c: Fixed license statement; its under the LGPL. - (enter_pth, leave_pth): Use them to bracket almost all public - functions. - -2004-12-13 Timo Schulz <[email protected]> - - * w32-pth.c (enter_pth, leave_pth): New. - (pth_init): Initialize global mutex section. - (pth_kill): Release global mutex section. - (helper_thread): New. - (pth_spawn): Make sure only one thread is running. - -2004-12-13 Werner Koch <[email protected]> - - * stringhelp.c (w32_strerror) [W32]: New. - - * w32-pth.c, w32-pth.h: Added real code written by Timo Schulz. - Not finished, though. - -2004-12-07 Werner Koch <[email protected]> - - * w32-pth.c, w32-pth.h: New. - -2004-11-26 Werner Koch <[email protected]> - - * logging.c [_WIN32]: Don't include socket headers. - -2004-11-30 Timo Schulz <[email protected]> - - * w32-afunix.c: New. AF_UNIX emulation for W32. - * w32-afunix.h: Likewise. - -2004-11-22 Werner Koch <[email protected]> - - * logging.c (log_test_fd): Add test on LOGSTREAM. Reported by - Barry Schwartz. - -2004-11-18 Werner Koch <[email protected]> - - * logging.c: Explicitly include sys/stat.h for the S_I* constants. - -2004-10-21 Werner Koch <[email protected]> - - * logging.c (do_logv): Use set_log_stream to setup a default. - (log_set_file): Factored code out to .. - (set_file_fd): .. New function to allow using a file descriptor. - (log_set_fd): Make use of new fucntion. - (fun_writer): Reworked. - -2004-08-18 Werner Koch <[email protected]> - - * stringhelp.c (print_sanitized_utf8_string): Actually implement - it. - -2004-06-21 Werner Koch <[email protected]> - - * logging.c (log_set_file): Do not close an old logstream if it - used to be stderr or stdout. - -2004-05-05 Werner Koch <[email protected]> - - * logging.c (log_set_file): Oops, don't close if LOGSTREAM is NULL. - -2004-04-30 Werner Koch <[email protected]> - - * logging.c (log_set_file): Make sure the log stream will be - closed even if the stderr fileno will be assigned to a new socket. - -2004-04-16 Werner Koch <[email protected]> - - * logging.h (JNLIB_LOG_WITH_PREFIX): Add constants for the flag - values. - * logging.c (log_set_prefix): New flag DETACHED. - (fun_writer): Take care of this flag. - (log_test_fd): New. - -2004-02-18 Werner Koch <[email protected]> - - * stringhelp.c (print_sanitized_buffer): Don't care about - non-ASCII characaters. - (sanitize_buffer): Ditto. - -2004-02-12 Werner Koch <[email protected]> - - * Makefile.am: Replaced INCLUDES by AM_CPPFLAGS. - -2004-01-05 Werner Koch <[email protected]> - - * argparse.c (strusage): Changed default copyright year to 2004. - -2003-12-17 Werner Koch <[email protected]> - - * argparse.c (initialize): Replaced use of non-literal format - args. Suggested by Florian Weimer. - -2003-12-16 Werner Koch <[email protected]> - - * logging.c (writen, fun_writer, fun_closer): New. - (log_set_file): Add feature to log to a socket. - (log_set_file, do_logv): Force printing with prefix and pid. - -2003-11-13 Werner Koch <[email protected]> - - * strlist.c (strlist_copy): New. - - * dotlock.c: Define DIRSEP_C et al. if not defined. - -2003-11-06 Werner Koch <[email protected]> - - * strlist.h (strlist_t): New. STRLIST is now deprecated. - -2003-06-18 Werner Koch <[email protected]> - - * strlist.c (strlist_pop): New. - - * dotlock.c (dotlock_remove_lockfiles): Prefixed with dotlock_ and - made global. - -2003-06-17 Werner Koch <[email protected]> - - * stringhelp.c (length_sans_trailing_chars) - (length_sans_trailing_ws): New. - - * logging.c (log_inc_errorcount): New. - - * stringhelp.c (print_sanitized_utf8_buffer): Implement utf8 - conversion. - (sanitize_buffer): New. Based on gnupg 1.3.2 make_printable_string. - - * dotlock.c: Updated to match the version from 1.3.2 - * utf8conv.c: New. Code taken from strgutil.c of gnupg 1.3.2. - * utf8conv.h: New. - -2003-06-16 Werner Koch <[email protected]> - - * logging.c (do_logv): Hack to optionally suppress a leading space. - - * stringhelp.c (ascii_strncasecmp): New. Taken from gnupg 1.3. - (ascii_memistr): New. Taken from gnupg 1.3 - -2003-06-13 Werner Koch <[email protected]> - - * mischelp.h (wipememory2,wipememory): New. Taken from GnuPG 1.3.2. - -2002-06-04 Werner Koch <[email protected]> - - * stringhelp.c (print_sanitized_utf8_string): New. No real - implementation for now. - (print_sanitized_utf8_buffer): Ditto. - -2002-04-04 Werner Koch <[email protected]> - - * logging.c (log_get_prefix): New. - -2002-03-15 Werner Koch <[email protected]> - - * argparse.c (optfile_parse): Fixed missing argument handling. - -2002-02-25 Werner Koch <[email protected]> - - * stringhelp.c (ascii_memcasemem): New. - -2002-02-14 Werner Koch <[email protected]> - - * Makefile.am (INCLUDES): Add cflags for libgcrypt. - -2002-02-07 Werner Koch <[email protected]> - - * logging.c (log_set_fd): New. - - * stringhelp.c (print_sanitized_buffer): New. - (print_sanitized_string): New. - -2002-01-24 Werner Koch <[email protected]> - - * argparse.c (strusage): Set default copyright notice year to 2002. - - Fixed the copyright notice of this file, as it has always been - part of GnuPG and therefore belongs to the FSF. - -2001-11-01 Marcus Brinkmann <[email protected]> - - * logging.c (log_printf): Do not initialize ARG_PTR with 0, we - don't know the correct type. Instead, run va_start and va_end - unconditionally. - Reported by Jose Carlos Garcia Sogo <[email protected]>. - -2002-01-19 Werner Koch <[email protected]> - - * logging.c (log_get_stream): New. - -2001-12-05 Werner Koch <[email protected]> - - * logging.c (log_set_prefix): New. - (do_logv): Include prefix and pid only if enabled. Print time only - when explicitly enabled. - (log_logv): New. - * logging.h: Include log_logv() only when requested. - -2001-11-06 Werner Koch <[email protected]> - - * strlist.c, strlist.h: New. Taken from pgnupg/util/strgutil.c - -2001-08-30 Werner Koch <[email protected]> - - * logging.c (log_printf): Don't pass NULL instead of arg_ptr. - -2001-07-19 Werner Koch <[email protected]> - - * stringhelp.c (ascii_memistr,ascii_isupper,ascii_islower, - ascii_toupper,ascii_tolower, ascii_strcasecmp, ascii_memcasecmp): New. - -2000-07-26 10:02:51 Werner Koch ([email protected]) - - * stringhelp.c.: Add stdarg.h - * argparse.h: s/ulong/unsigned long/ although this should be defined - by types.h. - -2000-06-28 19:40:23 Werner Koch ([email protected]) - - * Makefile.am: Replaced second logging.c by .h - -2000-05-24 08:58:15 Werner Koch ([email protected]) - - * logging.c (log_get_errorcount): New. - -2000-05-24 08:44:47 Werner Koch ([email protected]) - - * stringhelp.c: Added a few filename related helper functions. - -2000-05-11 18:04:43 Werner Koch ([email protected]) - - * xmalloc.c (xstrcat2): Replaced stpcpy to quickly address W32 - problems. - -2000-05-02 19:43:38 Werner Koch ([email protected]) - - * xmalloc.c (xstrcat2): New. - -Mon Jan 24 13:04:28 CET 2000 Werner Koch <[email protected]> - - * README: New. - * Makefile.am: new. - * argparse.c, argparse.h, logging.c, logging.h: - * mischelp.h, stringhelp.c, stringhelp.h, xmalloc.c: - * xmalloc.h, dotlock.c: Moved from ../util to here. - * dotlock.h: New. - * libjnlib-config.h: New. - - * logging.c (log_set_file): New. - (log_printf): New. - (do_logv): Add kludge to insert LFs. - - - *********************************************************** - * Please note that JNLIB is maintained as part of GnuPG. * - * You may find it source-copied in other packages. * - *********************************************************** - - Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, - 2010 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/jnlib/Makefile.am b/jnlib/Makefile.am deleted file mode 100644 index 232aef980..000000000 --- a/jnlib/Makefile.am +++ /dev/null @@ -1,85 +0,0 @@ -# Makefile for the JNLIB part of GnuPG -# Copyright (C) 1999, 2000, 2001, 2004, 2006, -# 2010 Feee Software Soundation, Inc. -# -# This file is part of JNLIB. -# -# JNLIB is free software; you can redistribute it and/or modify it -# under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation; either version 3 of -# the License, or (at your option) any later version. -# -# JNLIB 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <http://www.gnu.org/licenses/>. - - -## Process this file with automake to produce Makefile.in - -EXTRA_DIST = README -noinst_PROGRAMS = $(module_tests) -TESTS = $(module_tests) - -AM_CPPFLAGS = -I$(top_srcdir)/intl - -# We need libgcrypt because libjnlib-config includes gcrypt.h -AM_CFLAGS = -DJNLIB_IN_JNLIB $(LIBGCRYPT_CFLAGS) - -noinst_LIBRARIES = libjnlib.a - - -#libjnlib_a_LDFLAGS = -libjnlib_a_SOURCES = \ - libjnlib-config.h \ - stringhelp.c stringhelp.h \ - strlist.c strlist.h \ - utf8conv.c utf8conv.h \ - argparse.c argparse.h \ - logging.c logging.h \ - dotlock.c dotlock.h \ - types.h mischelp.c mischelp.h dynload.h w32help.h - -if HAVE_W32_SYSTEM -libjnlib_a_SOURCES += w32-reg.c w32-afunix.c w32-afunix.h -endif - - -# For GnuPG we don't need the xmalloc stuff. -# xmalloc.c xmalloc.h - - -# -# Module tests. -# -# These tests should only be used at the canonical location of jnlib -# which is the GnuPG package. The reason for this is that t-support.c -# defines replacements for the actual used memory allocation functions -# so that there is no dependency on libgcrypt. -# -module_tests = t-stringhelp t-timestuff -if HAVE_W32_SYSTEM -module_tests += t-w32-reg -endif - -t_jnlib_src = t-support.c t-support.h -t_jnlib_ldadd = libjnlib.a $(LIBINTL) $(LIBICONV) -# For W32 we need libgpg-error because it provides gettext. -if HAVE_W32_SYSTEM -t_jnlib_ldadd += $(GPG_ERROR_LIBS) -endif - -t_stringhelp_SOURCES = t-stringhelp.c $(t_jnlib_src) -t_stringhelp_LDADD = $(t_jnlib_ldadd) - -t_timestuff_SOURCES = t-timestuff.c $(t_jnlib_src) -t_timestuff_LDADD = $(t_jnlib_ldadd) - -if HAVE_W32_SYSTEM -t_w32_reg_SOURCES = t-w32-reg.c $(t_jnlib_src) -t_w32_reg_LDADD = $(t_jnlib_ldadd) -endif - diff --git a/jnlib/README b/jnlib/README deleted file mode 100644 index 5536e1ade..000000000 --- a/jnlib/README +++ /dev/null @@ -1,8 +0,0 @@ -JNLIB - This is a collection of utility function which are too small -to put into a library. The code here is licensed under the LGPL. - -libjnlib-config.h should be be modified for each project to make these -functions fit into the software. Mainly these are memory functions in -case you need another allocator. - - diff --git a/jnlib/argparse.c b/jnlib/argparse.c deleted file mode 100644 index ab88922a4..000000000 --- a/jnlib/argparse.c +++ /dev/null @@ -1,1205 +0,0 @@ -/* [argparse.c wk 17.06.97] Argument Parser for option handling - * Copyright (C) 1998, 1999, 2000, 2001, 2006 - * 2007, 2008 Free Software Foundation, Inc. - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <ctype.h> -#include <string.h> - -#include "libjnlib-config.h" -#include "mischelp.h" -#include "stringhelp.h" -#include "logging.h" -#ifdef JNLIB_NEED_UTF8CONV -#include "utf8conv.h" -#endif -#include "argparse.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 - * 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 const char *(*strusage_handler)( int ) = NULL; - -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 as initialized. */ - if ( *arg->argc < 0 ) - jnlib_log_bug ("invalid argument for arg_parsee\n"); - } - - - if (arg->err) - { - /* Last option was erroneous. */ - const char *s; - - if (filename) - { - if ( arg->r_opt == ARGPARSE_UNEXPECTED_ARG ) - s = _("argument not expected"); - else if ( arg->r_opt == ARGPARSE_READ_ERROR ) - s = _("read error"); - else if ( arg->r_opt == ARGPARSE_KEYWORD_TOO_LONG ) - s = _("keyword too long"); - else if ( arg->r_opt == ARGPARSE_MISSING_ARG ) - s = _("missing argument"); - else if ( arg->r_opt == ARGPARSE_INVALID_COMMAND ) - s = _("invalid command"); - else if ( arg->r_opt == ARGPARSE_INVALID_ALIAS ) - s = _("invalid alias definition"); - else if ( arg->r_opt == ARGPARSE_OUT_OF_CORE ) - s = _("out of core"); - else - s = _("invalid option"); - jnlib_log_error ("%s:%u: %s\n", filename, *lineno, s); - } - else - { - s = arg->internal.last? arg->internal.last:"[??]"; - - if ( arg->r_opt == ARGPARSE_MISSING_ARG ) - jnlib_log_error (_("missing argument for option \"%.50s\"\n"), s); - else if ( arg->r_opt == ARGPARSE_UNEXPECTED_ARG ) - jnlib_log_error (_("option \"%.50s\" does not expect an " - "argument\n"), s ); - else if ( arg->r_opt == ARGPARSE_INVALID_COMMAND ) - jnlib_log_error (_("invalid command \"%.50s\"\n"), s); - else if ( arg->r_opt == ARGPARSE_AMBIGUOUS_OPTION ) - jnlib_log_error (_("option \"%.50s\" is ambiguous\n"), s); - else if ( arg->r_opt == ARGPARSE_AMBIGUOUS_OPTION ) - jnlib_log_error (_("command \"%.50s\" is ambiguous\n"),s ); - else if ( arg->r_opt == ARGPARSE_OUT_OF_CORE ) - jnlib_log_error ("%s\n", _("out of core\n")); - else - jnlib_log_error (_("invalid option \"%.50s\"\n"), s); - } - if ( arg->err != 1 ) - exit (2); - arg->err = 0; - } - - /* Zero out 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 - */ - (void)arg; - (void)name; - (void)value; -#if 0 - ALIAS_DEF a = jnlib_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 in_alias=0; - - if (!fp) /* Divert to to 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 (!opts[idx].short_opt ) - arg->r_opt = ((opts[idx].flags & ARGPARSE_OPT_COMMAND) - ? ARGPARSE_INVALID_COMMAND - : ARGPARSE_INVALID_OPTION); - else if (!(opts[idx].flags & 7)) - arg->r_type = 0; /* Does not take an arg. */ - else if ((opts[idx].flags & 8) ) - arg->r_type = 0; /* Arg is optional. */ - else - arg->r_opt = ARGPARSE_MISSING_ARG; - - break; - } - else if (state == 3) - { - /* No argument found. */ - if (in_alias) - arg->r_opt = ARGPARSE_MISSING_ARG; - else if (!(opts[idx].flags & 7)) - arg->r_type = 0; /* Does not take an arg. */ - else if ((opts[idx].flags & 8)) - arg->r_type = 0; /* No optional argument. */ - else - arg->r_opt = ARGPARSE_MISSING_ARG; - - break; - } - else if (state == 4) - { - /* Has an argument. */ - if (in_alias) - { - if (!buffer) - arg->r_opt = ARGPARSE_UNEXPECTED_ARG; - else - { - char *p; - - buffer[i] = 0; - p = strpbrk (buffer, " \t"); - if (p) - { - *p++ = 0; - trim_spaces (p); - } - if (!p || !*p) - { - jnlib_free (buffer); - arg->r_opt = ARGPARSE_INVALID_ALIAS; - } - else - { - store_alias (arg, buffer, p); - } - } - } - else if (!(opts[idx].flags & 7)) - arg->r_opt = ARGPARSE_UNEXPECTED_ARG; - else - { - char *p; - - if (!buffer) - { - keyword[i] = 0; - buffer = jnlib_strdup (keyword); - if (!buffer) - arg->r_opt = ARGPARSE_OUT_OF_CORE; - } - else - buffer[i] = 0; - - if (buffer) - { - trim_spaces (buffer); - p = buffer; - if (*p == '"') - { - /* Remove quotes. */ - p++; - if (*p && p[strlen(p)-1] == '\"' ) - p[strlen(p)-1] = 0; - } - if (!set_opt_arg (arg, opts[idx].flags, p)) - jnlib_free(buffer); - } - } - break; - } - else if (c == EOF) - { - if (ferror (fp)) - arg->r_opt = ARGPARSE_READ_ERROR; - else - arg->r_opt = 0; /* EOF. */ - break; - } - state = 0; - i = 0; - } - else if (state == -1) - ; /* Skip. */ - else if (state == 0 && isascii (c) && isspace(c)) - ; /* Skip leading white space. */ - else if (state == 0 && c == '#' ) - state = 1; /* Start of a comment. */ - else if (state == 1) - ; /* Skip comments. */ - else if (state == 2 && isascii (c) && isspace(c)) - { - /* Check keyword. */ - 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 & ARGPARSE_OPT_COMMAND) - ? ARGPARSE_INVALID_COMMAND - : ARGPARSE_INVALID_OPTION); - state = -1; /* Skip rest of line and leave. */ - } - } - else - state = 3; - } - else if (state == 3) - { - /* Skip leading spaces of the argument. */ - if (!isascii (c) || !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 - { - char *tmp; - size_t tmplen = buflen + 50; - - tmp = jnlib_realloc (buffer, tmplen); - if (tmp) - { - buflen = tmplen; - buffer = tmp; - buffer[i++] = c; - } - else - { - jnlib_free (buffer); - arg->r_opt = ARGPARSE_OUT_OF_CORE; - break; - } - } - } - else if (i < DIM(keyword)-1) - keyword[i++] = c; - else - { - size_t tmplen = DIM(keyword) + 50; - buffer = jnlib_malloc (tmplen); - if (buffer) - { - buflen = tmplen; - memcpy(buffer, keyword, i); - buffer[i++] = c; - } - else - { - arg->r_opt = ARGPARSE_OUT_OF_CORE; - break; - } - } - } - else if (i >= DIM(keyword)-1) - { - arg->r_opt = ARGPARSE_KEYWORD_TOO_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; - - (void)arg; - - /* 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 & ARGPARSE_FLAG_ARG0)) - { - /* Skip the first argument. */ - 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 & ARGPARSE_FLAG_ALL)) - { - arg->r_opt = ARGPARSE_IS_ARG; /* Not an option but an argument. */ - arg->r_type = 2; - arg->r.ret_str = s; - argc--; argv++; idx++; /* set to next one */ - } - else if( arg->internal.stopped ) - { - arg->r_opt = 0; - goto leave; /* Ready. */ - } - else if ( *s == '-' && s[1] == '-' ) - { - /* Long option. */ - char *argpos; - - arg->internal.inarg = 0; - if (!s[2] && !(arg->flags & ARGPARSE_FLAG_NOSTOP)) - { - /* 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) ) - show_help (opts, arg->flags); - else if ( i < 0 && !strcmp ( "version", s+2) ) - { - if (!(arg->flags & ARGPARSE_FLAG_NOVERSION)) - { - 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 ) - arg->r_opt = ARGPARSE_AMBIGUOUS_OPTION; - else if ( i == -1 ) - { - arg->r_opt = ARGPARSE_INVALID_OPTION; - arg->r.ret_str = s+2; - } - else - arg->r_opt = opts[i].short_opt; - if ( i < 0 ) - ; - else if ( (opts[i].flags & 0x07) ) - { - if ( argpos ) - { - s2 = argpos+1; - if ( !*s2 ) - s2 = NULL; - } - else - s2 = argv[1]; - if ( !s2 && (opts[i].flags & ARGPARSE_OPT_OPTIONAL) ) - { - arg->r_type = ARGPARSE_TYPE_NONE; /* Argument is optional. */ - } - else if ( !s2 ) - { - arg->r_opt = ARGPARSE_MISSING_ARG; - } - else if ( !argpos && *s2 == '-' - && (opts[i].flags & ARGPARSE_OPT_OPTIONAL) ) - { - /* 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 = ARGPARSE_TYPE_NONE; - } - 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 = ARGPARSE_UNEXPECTED_ARG; - 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 & ARGPARSE_FLAG_ONEDASH) ) - { - 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 == '?' ) ) - show_help (opts, arg->flags); - - arg->r_opt = opts[i].short_opt; - if (!opts[i].short_opt ) - { - arg->r_opt = (opts[i].flags & ARGPARSE_OPT_COMMAND)? - ARGPARSE_INVALID_COMMAND:ARGPARSE_INVALID_OPTION; - 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 & ARGPARSE_OPT_OPTIONAL) ) - { - arg->r_type = ARGPARSE_TYPE_NONE; - } - else if ( !s2 ) - { - arg->r_opt = ARGPARSE_MISSING_ARG; - } - else if ( *s2 == '-' && s2[1] - && (opts[i].flags & ARGPARSE_OPT_OPTIONAL) ) - { - /* 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 = ARGPARSE_TYPE_NONE; - } - else - { - set_opt_arg (arg, opts[i].flags, s2); - argc--; argv++; idx++; /* Skip one. */ - } - } - s = "x"; /* This is so that !s[1] yields false. */ - } - else - { - /* Does not take an argument. */ - arg->r_type = ARGPARSE_TYPE_NONE; - 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 & ARGPARSE_FLAG_MIXED ) - { - arg->r_opt = ARGPARSE_IS_ARG; - 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 ARGPARSE_TYPE_INT: - arg->r.ret_int = (int)strtol(s,NULL,base); - return 0; - case ARGPARSE_TYPE_LONG: - arg->r.ret_long= strtol(s,NULL,base); - return 0; - case ARGPARSE_TYPE_ULONG: - arg->r.ret_ulong= strtoul(s,NULL,base); - return 0; - case ARGPARSE_TYPE_STRING: - 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; -#ifdef JNLIB_NEED_UTF8CONV - int is_utf8 = is_native_utf8 (); -#endif - - s=o->description+1; - if ( *s != '=' ) - n++; - /* For a (mostly) correct length calculation we exclude - continuation bytes (10xxxxxx) if we are on a native utf8 - terminal. */ - for (; *s && *s != '|'; s++ ) -#ifdef JNLIB_NEED_UTF8CONV - if ( is_utf8 && (*s&0xc0) != 0x80 ) -#endif - 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 int 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 & ARGPARSE_FLAG_ONEDASH) ) - puts ("\n(A single dash may be used instead of the double ones)"); - } - if ( (s=strusage(19)) ) - { - /* bug reports to ... */ - char *s2; - - putchar('\n'); - s2 = strstr (s, "@EMAIL@"); - if (s2) - { - if (s2-s) - fwrite (s, s2-s, 1, stdout); -#ifdef PACKAGE_BUGREPORT - fputs (PACKAGE_BUGREPORT, stdout); -#else - fputs ("[email protected]", stdout); -#endif - s2 += 7; - if (*s2) - fputs (s2, stdout); - } - else - 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 ); - /* Licence string. */ - if( (s=strusage (10)) ) - 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 (s, stdout); - fflush (stdout); -} - - -void -usage (int level) -{ - const char *p; - - if (!level) - { - fprintf(stderr,"%s %s; %s\n", strusage(11), strusage(13), strusage (14)); - fflush (stderr); - } - else if (level == 1) - { - p = strusage (40); - fputs (p, stderr); - if (*p && p[strlen(p)] != '\n') - putc ('\n', stderr); - exit (2); - } - else if (level == 2) - { - puts (strusage(41)); - exit (0); - } -} - -/* Level - * 0: Print copyright string to stderr - * 1: Print a short usage hint to stderr and terminate - * 2: Print a long usage hint to stdout and terminate - * 10: Return license info string - * 11: Return the name of the program - * 12: Return 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 * -strusage( int level ) -{ - const char *p = strusage_handler? strusage_handler(level) : NULL; - - if ( p ) - return p; - - switch ( level ) - { - case 10: p = ("License GPLv3+: GNU GPL version 3 or later " - "<http://gnu.org/licenses/gpl.html>"); - break; - case 11: p = "foo"; break; - case 13: p = "0.0"; break; - case 14: p = "Copyright (C) 2010 Free Software Foundation, Inc."; break; - case 15: p = -"This is free software: you are free to change and redistribute it.\n" -"There is NO WARRANTY, to the extent permitted by law.\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 3 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 software. If not, see <http://www.gnu.org/licenses/>.\n"; - break; - case 40: /* short and long usage */ - case 41: p = ""; break; - } - - return p; -} - -void -set_strusage ( const char *(*f)( int ) ) -{ - strusage_handler = f; -} - - -#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[] = { - ARGPARSE_x('v', "verbose", NONE, 0, "Laut sein"), - ARGPARSE_s_n('e', "echo" , ("Zeile ausgeben, damit wir sehen, " - "was wir ein gegeben haben")), - ARGPARSE_s_n('d', "debug", "Debug\nfalls mal etwas\nschief geht"), - ARGPARSE_s_s('o', "output", 0 ), - ARGPARSE_o_s('c', "cross-ref", "cross-reference erzeugen\n" ), - /* Note that on a non-utf8 terminal the ß might garble the output. */ - ARGPARSE_s_n('s', "street","|Straße|set the name of the street to Straße"), - ARGPARSE_o_i('m', "my-option", 0), - ARGPARSE_s_n(500, "a-long-option", 0 ), - ARGPARSE_end - }; - ARGPARSE_ARGS pargs = { &argc, &argv, 2|4|32 }; - int i; - - while( arg_parse ( &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 = ARGPARSE_PRINT_WARNING; break; - } - } - 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/jnlib/argparse.h b/jnlib/argparse.h deleted file mode 100644 index b211e5fdf..000000000 --- a/jnlib/argparse.h +++ /dev/null @@ -1,183 +0,0 @@ -/* argparse.h - Argument parser for option handling. - * Copyright (C) 1998,1999,2000,2001,2006 Free Software Foundation, Inc. - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef LIBJNLIB_ARGPARSE_H -#define LIBJNLIB_ARGPARSE_H - -#include <stdio.h> -#include "types.h" - -typedef struct -{ - int *argc; /* Pointer to ARGC (value subject to change). */ - char ***argv; /* Pointer to ARGV (value subject to change). */ - unsigned int flags; /* Global flags. May be set prior to calling the - parser. The parser may change the value. */ - int err; /* Print error description for last option. - Either 0, ARGPARSE_PRINT_WARNING or - ARGPARSE_PRINT_ERROR. */ - - int r_opt; /* Returns option code. */ - int r_type; /* Returns type of option value. */ - union { - int ret_int; - long ret_long; - unsigned long ret_ulong; - char *ret_str; - } r; /* Return values */ - - struct { - int idx; - int inarg; - int stopped; - const char *last; - void *aliases; - const void *cur_alias; - } internal; /* Private - do not change. */ -} ARGPARSE_ARGS; - -typedef struct -{ - int short_opt; - const char *long_opt; - unsigned int flags; - const char *description; /* Optional option description. */ -} ARGPARSE_OPTS; - - -/* Global flags (ARGPARSE_ARGS). */ -#define ARGPARSE_FLAG_KEEP 1 /* Do not remove options form argv. */ -#define ARGPARSE_FLAG_ALL 2 /* Do not stop at last option but return - remaining args with R_OPT set to -1. */ -#define ARGPARSE_FLAG_MIXED 4 /* Assume options and args are mixed. */ -#define ARGPARSE_FLAG_NOSTOP 8 /* Do not stop processing at "--". */ -#define ARGPARSE_FLAG_ARG0 16 /* Do not skip the first arg. */ -#define ARGPARSE_FLAG_ONEDASH 32 /* Allow long options with one dash. */ -#define ARGPARSE_FLAG_NOVERSION 64 /* No output for "--version". */ - -/* Flags for each option (ARGPARSE_OPTS). The type code may be - ORed with the OPT flags. */ -#define ARGPARSE_TYPE_NONE 0 /* Does not take an argument. */ -#define ARGPARSE_TYPE_INT 1 /* Takes an int argument. */ -#define ARGPARSE_TYPE_STRING 2 /* Takes a string argument. */ -#define ARGPARSE_TYPE_LONG 3 /* Takes a long argument. */ -#define ARGPARSE_TYPE_ULONG 4 /* Takes an unsigned long argument. */ -#define ARGPARSE_OPT_OPTIONAL (1<<3) /* Argument is optional. */ -#define ARGPARSE_OPT_PREFIX (1<<4) /* Allow 0x etc. prefixed values. */ -#define ARGPARSE_OPT_COMMAND (1<<8) /* The argument is a command. */ - -/* A set of macros to make option definitions easier to read. */ -#define ARGPARSE_x(s,l,t,f,d) \ - { (s), (l), ARGPARSE_TYPE_ ## t | (f), (d) } - -#define ARGPARSE_s(s,l,t,d) \ - { (s), (l), ARGPARSE_TYPE_ ## t, (d) } -#define ARGPARSE_s_n(s,l,d) \ - { (s), (l), ARGPARSE_TYPE_NONE, (d) } -#define ARGPARSE_s_i(s,l,d) \ - { (s), (l), ARGPARSE_TYPE_INT, (d) } -#define ARGPARSE_s_s(s,l,d) \ - { (s), (l), ARGPARSE_TYPE_STRING, (d) } -#define ARGPARSE_s_l(s,l,d) \ - { (s), (l), ARGPARSE_TYPE_LONG, (d) } -#define ARGPARSE_s_u(s,l,d) \ - { (s), (l), ARGPARSE_TYPE_ULONG, (d) } - -#define ARGPARSE_o(s,l,t,d) \ - { (s), (l), (ARGPARSE_TYPE_ ## t | ARGPARSE_OPT_OPTIONAL), (d) } -#define ARGPARSE_o_n(s,l,d) \ - { (s), (l), (ARGPARSE_TYPE_NONE | ARGPARSE_OPT_OPTIONAL), (d) } -#define ARGPARSE_o_i(s,l,d) \ - { (s), (l), (ARGPARSE_TYPE_INT | ARGPARSE_OPT_OPTIONAL), (d) } -#define ARGPARSE_o_s(s,l,d) \ - { (s), (l), (ARGPARSE_TYPE_STRING | ARGPARSE_OPT_OPTIONAL), (d) } -#define ARGPARSE_o_l(s,l,d) \ - { (s), (l), (ARGPARSE_TYPE_LONG | ARGPARSE_OPT_OPTIONAL), (d) } -#define ARGPARSE_o_u(s,l,d) \ - { (s), (l), (ARGPARSE_TYPE_ULONG | ARGPARSE_OPT_OPTIONAL), (d) } - -#define ARGPARSE_p(s,l,t,d) \ - { (s), (l), (ARGPARSE_TYPE_ ## t | ARGPARSE_OPT_PREFIX), (d) } -#define ARGPARSE_p_n(s,l,d) \ - { (s), (l), (ARGPARSE_TYPE_NONE | ARGPARSE_OPT_PREFIX), (d) } -#define ARGPARSE_p_i(s,l,d) \ - { (s), (l), (ARGPARSE_TYPE_INT | ARGPARSE_OPT_PREFIX), (d) } -#define ARGPARSE_p_s(s,l,d) \ - { (s), (l), (ARGPARSE_TYPE_STRING | ARGPARSE_OPT_PREFIX), (d) } -#define ARGPARSE_p_l(s,l,d) \ - { (s), (l), (ARGPARSE_TYPE_LONG | ARGPARSE_OPT_PREFIX), (d) } -#define ARGPARSE_p_u(s,l,d) \ - { (s), (l), (ARGPARSE_TYPE_ULONG | ARGPARSE_OPT_PREFIX), (d) } - -#define ARGPARSE_op(s,l,t,d) \ - { (s), (l), (ARGPARSE_TYPE_ ## t \ - | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) } -#define ARGPARSE_op_n(s,l,d) \ - { (s), (l), (ARGPARSE_TYPE_NONE \ - | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) } -#define ARGPARSE_op_i(s,l,d) \ - { (s), (l), (ARGPARSE_TYPE_INT \ - | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) } -#define ARGPARSE_op_s(s,l,d) \ - { (s), (l), (ARGPARSE_TYPE_STRING \ - | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) } -#define ARGPARSE_op_l(s,l,d) \ - { (s), (l), (ARGPARSE_TYPE_LONG \ - | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) } -#define ARGPARSE_op_u(s,l,d) \ - { (s), (l), (ARGPARSE_TYPE_ULONG \ - | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) } - -#define ARGPARSE_c(s,l,d) \ - { (s), (l), (ARGPARSE_TYPE_NONE | ARGPARSE_OPT_COMMAND), (d) } - - -#define ARGPARSE_group(s,d) \ - { (s), NULL, 0, (d) } - -#define ARGPARSE_end() { 0, NULL, 0, NULL } - - -/* Other constants. */ -#define ARGPARSE_PRINT_WARNING 1 -#define ARGPARSE_PRINT_ERROR 2 - - -/* Error values. */ -#define ARGPARSE_IS_ARG (-1) -#define ARGPARSE_INVALID_OPTION (-2) -#define ARGPARSE_MISSING_ARG (-3) -#define ARGPARSE_KEYWORD_TOO_LONG (-4) -#define ARGPARSE_READ_ERROR (-5) -#define ARGPARSE_UNEXPECTED_ARG (-6) -#define ARGPARSE_INVALID_COMMAND (-7) -#define ARGPARSE_AMBIGUOUS_OPTION (-8) -#define ARGPARSE_AMBIGUOUS_COMMAND (-9) -#define ARGPARSE_INVALID_ALIAS (-10) -#define ARGPARSE_OUT_OF_CORE (-11) - - -int arg_parse( ARGPARSE_ARGS *arg, ARGPARSE_OPTS *opts); -int optfile_parse( FILE *fp, const char *filename, unsigned *lineno, - ARGPARSE_ARGS *arg, ARGPARSE_OPTS *opts); -void usage( int level ); -const char *strusage( int level ); -void set_strusage( const char *(*f)( int ) ); - -#endif /*LIBJNLIB_ARGPARSE_H*/ diff --git a/jnlib/dotlock.c b/jnlib/dotlock.c deleted file mode 100644 index 0d5a7bce9..000000000 --- a/jnlib/dotlock.c +++ /dev/null @@ -1,713 +0,0 @@ -/* dotlock.c - dotfile locking - * Copyright (C) 1998, 2000, 2001, 2003, 2004, - * 2005, 2006, 2008 Free Software Foundation, Inc. - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include <config.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <ctype.h> -#include <errno.h> -#include <unistd.h> -#ifdef HAVE_DOSISH_SYSTEM -# define WIN32_LEAN_AND_MEAN -# include <windows.h> -#else -# include <sys/utsname.h> -#endif -#include <sys/types.h> -#include <sys/time.h> -#include <sys/stat.h> -#include <fcntl.h> -#ifdef HAVE_SIGNAL_H -# include <signal.h> -#endif - -#include "libjnlib-config.h" -#include "stringhelp.h" -#include "dotlock.h" -#include "utf8conv.h" - -#if !defined(DIRSEP_C) && !defined(EXTSEP_C) \ - && !defined(DIRSEP_S) && !defined(EXTSEP_S) -#ifdef HAVE_DOSISH_SYSTEM -#define DIRSEP_C '\\' -#define EXTSEP_C '.' -#define DIRSEP_S "\\" -#define EXTSEP_S "." -#else -#define DIRSEP_C '/' -#define EXTSEP_C '.' -#define DIRSEP_S "/" -#define EXTSEP_S "." -#endif -#endif - - -/* The object describing a lock. */ -struct dotlock_handle -{ - struct dotlock_handle *next; - char *lockname; /* Name of the actual lockfile. */ - int locked; /* Lock status. */ - int disable; /* If true, locking is disabled. */ - -#ifdef HAVE_DOSISH_SYSTEM - HANDLE lockhd; /* The W32 handle of the lock file. */ -#else - char *tname; /* Name of the lockfile template. */ - size_t nodename_off; /* Offset in TNAME of the nodename part. */ - size_t nodename_len; /* Length of the nodename part. */ -#endif /* HAVE_DOSISH_SYSTEM */ -}; - - -/* A list of of all lock handles. */ -static volatile dotlock_t all_lockfiles; - -/* If this has the value true all locking is disabled. */ -static int never_lock; - - -/* Local protototypes. */ -#ifndef HAVE_DOSISH_SYSTEM -static int read_lockfile (dotlock_t h, int *same_node); -#endif /*!HAVE_DOSISH_SYSTEM*/ - - - - -/* Entirely disable all locking. This function should be called - before any locking is done. It may be called right at startup of - the process as it only sets a global value. */ -void -disable_dotlock(void) -{ - never_lock = 1; -} - - - -/* Create a lockfile for a file name FILE_TO_LOCK and returns an - object of type dotlock_t which may be used later to actually acquire - the lock. A cleanup routine gets installed to cleanup left over - locks or other files used internally by the lock mechanism. - - Calling this function with NULL does only install the atexit - handler and may thus be used to assure that the cleanup is called - after all other atexit handlers. - - This function creates a lock file in the same directory as - FILE_TO_LOCK using that name and a suffix of ".lock". Note that on - POSIX systems a temporary file ".#lk.<hostname>.pid[.threadid] is - used. - - The function returns an new handle which needs to be released using - destroy_dotlock but gets also released at the termination of the - process. On error NULL is returned. - */ -dotlock_t -create_dotlock (const char *file_to_lock) -{ - static int initialized; - dotlock_t h; -#ifndef HAVE_DOSISH_SYSTEM - int fd = -1; - char pidstr[16]; - const char *nodename; - const char *dirpart; - int dirpartlen; - struct utsname utsbuf; - size_t tnamelen; -#endif - - if ( !initialized ) - { - atexit (dotlock_remove_lockfiles); - initialized = 1; - } - - if ( !file_to_lock ) - return NULL; /* Only initialization was requested. */ - - h = jnlib_calloc (1, sizeof *h); - if (!h) - return NULL; - - if (never_lock) - { - h->disable = 1; -#ifdef _REENTRANT - /* fixme: aquire mutex on all_lockfiles */ -#endif - h->next = all_lockfiles; - all_lockfiles = h; - return h; - } - -#ifndef HAVE_DOSISH_SYSTEM - /* - This is the POSIX version which uses a temporary file and the - link system call to make locking an atomic operation. - */ - - snprintf (pidstr, sizeof pidstr, "%10d\n", (int)getpid() ); - - /* Create a temporary file. */ - if ( uname ( &utsbuf ) ) - nodename = "unknown"; - else - nodename = utsbuf.nodename; - -#ifdef __riscos__ - { - char *iter = (char *) nodename; - for (; iter[0]; iter++) - if (iter[0] == '.') - iter[0] = '/'; - } -#endif /* __riscos__ */ - - if ( !(dirpart = strrchr (file_to_lock, DIRSEP_C)) ) - { - dirpart = EXTSEP_S; - dirpartlen = 1; - } - else - { - dirpartlen = dirpart - file_to_lock; - dirpart = file_to_lock; - } - -#ifdef _REENTRANT - /* fixme: aquire mutex on all_lockfiles */ -#endif - h->next = all_lockfiles; - all_lockfiles = h; - - tnamelen = dirpartlen + 6 + 30 + strlen(nodename) + 10; - h->tname = jnlib_malloc (tnamelen + 1); - if (!h->tname) - { - all_lockfiles = h->next; - jnlib_free (h); - return NULL; - } - h->nodename_len = strlen (nodename); - -#ifndef __riscos__ - snprintf (h->tname, tnamelen, "%.*s/.#lk%p.", dirpartlen, dirpart, h ); - h->nodename_off = strlen (h->tname); - snprintf (h->tname+h->nodename_off, tnamelen - h->nodename_off, - "%s.%d", nodename, (int)getpid ()); -#else /* __riscos__ */ - snprintf (h->tname, tnamelen, "%.*s.lk%p/", dirpartlen, dirpart, h ); - h->nodename_off = strlen (h->tname); - snprintf (h->tname+h->nodename_off, tnamelen - h->modename_off, - "%s/%d", nodename, (int)getpid () ); -#endif /* __riscos__ */ - - do - { - jnlib_set_errno (0); - fd = open (h->tname, O_WRONLY|O_CREAT|O_EXCL, - S_IRUSR|S_IRGRP|S_IROTH|S_IWUSR ); - } - while (fd == -1 && errno == EINTR); - - if ( fd == -1 ) - { - all_lockfiles = h->next; - log_error (_("failed to create temporary file `%s': %s\n"), - h->tname, strerror(errno)); - jnlib_free (h->tname); - jnlib_free (h); - return NULL; - } - if ( write (fd, pidstr, 11 ) != 11 ) - goto write_failed; - if ( write (fd, nodename, strlen (nodename) ) != strlen (nodename) ) - goto write_failed; - if ( write (fd, "\n", 1 ) != 1 ) - goto write_failed; - if ( close (fd) ) - goto write_failed; - -# ifdef _REENTRANT - /* release mutex */ -# endif - h->lockname = jnlib_malloc ( strlen (file_to_lock) + 6 ); - if (!h->lockname) - { - all_lockfiles = h->next; - unlink (h->tname); - jnlib_free (h->tname); - jnlib_free (h); - return NULL; - } - strcpy (stpcpy (h->lockname, file_to_lock), EXTSEP_S "lock"); - return h; - - write_failed: - all_lockfiles = h->next; -# ifdef _REENTRANT - /* fixme: release mutex */ -# endif - log_error ( _("error writing to `%s': %s\n"), h->tname, strerror(errno) ); - close (fd); - unlink (h->tname); - jnlib_free (h->tname); - jnlib_free (h); - return NULL; - -#else /* HAVE_DOSISH_SYSTEM */ - - /* The Windows version does not need a temporary file but uses the - plain lock file along with record locking. We create this file - here so that we later do only need to do the file locking. For - error reporting it is useful to keep the name of the file in the - handle. */ - h->next = all_lockfiles; - all_lockfiles = h; - - h->lockname = jnlib_malloc ( strlen (file_to_lock) + 6 ); - if (!h->lockname) - { - all_lockfiles = h->next; - jnlib_free (h); - return NULL; - } - strcpy (stpcpy(h->lockname, file_to_lock), EXTSEP_S "lock"); - - /* If would be nice if we would use the FILE_FLAG_DELETE_ON_CLOSE - along with FILE_SHARE_DELETE but that does not work due to a race - condition: Despite the OPEN_ALWAYS flag CreateFile may return an - error and we can't reliable create/open the lock file unless we - would wait here until it works - however there are other valid - reasons why a lock file can't be created and thus the process - would not stop as expected but spin til until Windows crashes. - Our solution is to keep the lock file open; that does not - harm. */ - { -#ifdef HAVE_W32CE_SYSTEM - wchar_t *wname = utf8_to_wchar (h->lockname); - - h->lockhd = INVALID_HANDLE_VALUE; - if (wname) - h->lockhd = CreateFile (wname, -#else - h->lockhd = CreateFile (h->lockname, -#endif - GENERIC_READ|GENERIC_WRITE, - FILE_SHARE_READ|FILE_SHARE_WRITE, - NULL, OPEN_ALWAYS, 0, NULL); -#ifdef HAVE_W32CE_SYSTEM - jnlib_free (wname); -#endif - } - if (h->lockhd == INVALID_HANDLE_VALUE) - { - log_error (_("can't create `%s': %s\n"), h->lockname, w32_strerror (-1)); - all_lockfiles = h->next; - jnlib_free (h->lockname); - jnlib_free (h); - return NULL; - } - return h; - -#endif /* HAVE_DOSISH_SYSTEM */ -} - - -/* Destroy the local handle H and release the lock. */ -void -destroy_dotlock (dotlock_t h) -{ - dotlock_t hprev, htmp; - - if ( !h ) - return; - - /* First remove the handle from our global list of all locks. */ - for (hprev=NULL, htmp=all_lockfiles; htmp; hprev=htmp, htmp=htmp->next) - if (htmp == h) - { - if (hprev) - hprev->next = htmp->next; - else - all_lockfiles = htmp->next; - h->next = NULL; - break; - } - - /* Then destroy the lock. */ - if (!h->disable) - { -#ifdef HAVE_DOSISH_SYSTEM - if (h->locked) - { - UnlockFile (h->lockhd, 0, 0, 1, 0); - } - CloseHandle (h->lockhd); -#else /* !HAVE_DOSISH_SYSTEM */ - if (h->locked && h->lockname) - unlink (h->lockname); - if (h->tname) - unlink (h->tname); - jnlib_free (h->tname); -#endif /* HAVE_DOSISH_SYSTEM */ - jnlib_free (h->lockname); - } - jnlib_free(h); -} - - -#ifndef HAVE_DOSISH_SYSTEM -static int -maybe_deadlock (dotlock_t h) -{ - dotlock_t r; - - for ( r=all_lockfiles; r; r = r->next ) - { - if ( r != h && r->locked ) - return 1; - } - return 0; -} -#endif /*!HAVE_DOSISH_SYSTEM*/ - - - -/* Do a lock on H. A TIMEOUT of 0 returns immediately, -1 waits - forever (hopefully not), other values are reserved (should then be - timeouts in milliseconds). Returns: 0 on success */ -int -make_dotlock (dotlock_t h, long timeout) -{ - int backoff = 0; -#ifndef HAVE_DOSISH_SYSTEM - int pid; - const char *maybe_dead=""; - int same_node; -#endif /*!HAVE_DOSISH_SYSTEM*/ - - if ( h->disable ) - return 0; /* Locks are completely disabled. Return success. */ - - if ( h->locked ) - { -#ifndef __riscos__ - log_debug ("Oops, `%s' is already locked\n", h->lockname); -#endif /* !__riscos__ */ - return 0; - } - - for (;;) - { -#ifndef HAVE_DOSISH_SYSTEM -# ifndef __riscos__ - if ( !link(h->tname, h->lockname) ) - { - /* fixme: better use stat to check the link count */ - h->locked = 1; - return 0; /* okay */ - } - if ( errno != EEXIST ) - { - log_error ( "lock not made: link() failed: %s\n", strerror(errno) ); - return -1; - } -# else /* __riscos__ */ - if ( !renamefile(h->tname, h->lockname) ) - { - h->locked = 1; - return 0; /* okay */ - } - if ( errno != EEXIST ) - { - log_error( "lock not made: rename() failed: %s\n", strerror(errno) ); - return -1; - } -# endif /* __riscos__ */ - - if ( (pid = read_lockfile (h, &same_node)) == -1 ) - { - if ( errno != ENOENT ) - { - log_info ("cannot read lockfile\n"); - return -1; - } - log_info( "lockfile disappeared\n"); - continue; - } - else if ( pid == getpid() && same_node ) - { - log_info( "Oops: lock already held by us\n"); - h->locked = 1; - return 0; /* okay */ - } - else if ( same_node && kill (pid, 0) && errno == ESRCH ) - { -# ifndef __riscos__ - log_info (_("removing stale lockfile (created by %d)\n"), pid ); - unlink (h->lockname); - continue; -# else /* __riscos__ */ - /* Under RISCOS we are *pretty* sure that the other task - is dead and therefore we remove the stale lock file. */ - maybe_dead = _(" - probably dead - removing lock"); - unlink(h->lockname); -# endif /* __riscos__ */ - } - - if ( timeout == -1 ) - { - /* Wait until lock has been released. */ - struct timeval tv; - - log_info (_("waiting for lock (held by %d%s) %s...\n"), - pid, maybe_dead, maybe_deadlock(h)? _("(deadlock?) "):""); - - - /* We can't use sleep, cause signals may be blocked. */ - tv.tv_sec = 1 + backoff; - tv.tv_usec = 0; - select(0, NULL, NULL, NULL, &tv); - if ( backoff < 10 ) - backoff++ ; - } - else - return -1; -#else /*HAVE_DOSISH_SYSTEM*/ - int w32err; - - if (LockFile (h->lockhd, 0, 0, 1, 0)) - { - h->locked = 1; - return 0; /* okay */ - } - w32err = GetLastError (); - if (w32err != ERROR_LOCK_VIOLATION) - { - log_error (_("lock `%s' not made: %s\n"), - h->lockname, w32_strerror (w32err)); - return -1; - } - - if ( timeout == -1 ) - { - /* Wait until lock has been released. */ - log_info (_("waiting for lock %s...\n"), h->lockname); - Sleep ((1 + backoff)*1000); - if ( backoff < 10 ) - backoff++ ; - } - else - return -1; -#endif /*HAVE_DOSISH_SYSTEM*/ - } - /*NOTREACHED*/ -} - - -/* Release a lock. Returns 0 on success. */ -int -release_dotlock (dotlock_t h) -{ -#ifndef HAVE_DOSISH_SYSTEM - int pid, same_node; -#endif - - /* To avoid atexit race conditions we first check whether there are - any locks left. It might happen that another atexit handler - tries to release the lock while the atexit handler of this module - already ran and thus H is undefined. */ - if (!all_lockfiles) - return 0; - - if ( h->disable ) - return 0; - - if ( !h->locked ) - { - log_debug("Oops, `%s' is not locked\n", h->lockname); - return 0; - } - -#ifdef HAVE_DOSISH_SYSTEM - if (!UnlockFile (h->lockhd, 0, 0, 1, 0)) - { - log_error ("release_dotlock: error removing lockfile `%s': %s\n", - h->lockname, w32_strerror (-1)); - return -1; - } -#else - - pid = read_lockfile (h, &same_node); - if ( pid == -1 ) - { - log_error( "release_dotlock: lockfile error\n"); - return -1; - } - if ( pid != getpid() || !same_node ) - { - log_error( "release_dotlock: not our lock (pid=%d)\n", pid); - return -1; - } - -#ifndef __riscos__ - if ( unlink( h->lockname ) ) - { - log_error ("release_dotlock: error removing lockfile `%s'\n", - h->lockname); - return -1; - } - /* Fixme: As an extra check we could check whether the link count is - now really at 1. */ -#else /* __riscos__ */ - if ( renamefile (h->lockname, h->tname) ) - { - log_error ("release_dotlock: error renaming lockfile `%s' to `%s'\n", - h->lockname, h->tname); - return -1; - } -#endif /* __riscos__ */ - -#endif /* !HAVE_DOSISH_SYSTEM */ - h->locked = 0; - return 0; -} - - -/* Read the lock file and return the pid, returns -1 on error. True - will be stored in the integer at address SAME_NODE if the lock file - has been created on the same node. */ -#ifndef HAVE_DOSISH_SYSTEM -static int -read_lockfile (dotlock_t h, int *same_node ) -{ - char buffer_space[10+1+70+1]; /* 70 is just an estimated value; node - name are usually shorter. */ - int fd; - int pid = -1; - char *buffer, *p; - size_t expected_len; - int res, nread; - - *same_node = 0; - expected_len = 10 + 1 + h->nodename_len + 1; - if ( expected_len >= sizeof buffer_space) - { - buffer = jnlib_malloc (expected_len); - if (!buffer) - return -1; - } - else - buffer = buffer_space; - - if ( (fd = open (h->lockname, O_RDONLY)) == -1 ) - { - int e = errno; - log_info ("error opening lockfile `%s': %s\n", - h->lockname, strerror(errno) ); - if (buffer != buffer_space) - jnlib_free (buffer); - jnlib_set_errno (e); /* Need to return ERRNO here. */ - return -1; - } - - p = buffer; - nread = 0; - do - { - res = read (fd, p, expected_len - nread); - if (res == -1 && errno == EINTR) - continue; - if (res < 0) - { - log_info ("error reading lockfile `%s'", h->lockname ); - close (fd); - if (buffer != buffer_space) - jnlib_free (buffer); - jnlib_set_errno (0); /* Do not return an inappropriate ERRNO. */ - return -1; - } - p += res; - nread += res; - } - while (res && nread != expected_len); - close(fd); - - if (nread < 11) - { - log_info ("invalid size of lockfile `%s'", h->lockname ); - if (buffer != buffer_space) - jnlib_free (buffer); - jnlib_set_errno (0); /* Better don't return an inappropriate ERRNO. */ - return -1; - } - - if (buffer[10] != '\n' - || (buffer[10] = 0, pid = atoi (buffer)) == -1 -#ifndef __riscos__ - || !pid -#else /* __riscos__ */ - || (!pid && riscos_getpid()) -#endif /* __riscos__ */ - ) - { - log_error ("invalid pid %d in lockfile `%s'", pid, h->lockname ); - if (buffer != buffer_space) - jnlib_free (buffer); - jnlib_set_errno (0); - return -1; - } - - if (nread == expected_len - && !memcmp (h->tname+h->nodename_off, buffer+11, h->nodename_len) - && buffer[11+h->nodename_len] == '\n') - *same_node = 1; - - if (buffer != buffer_space) - jnlib_free (buffer); - return pid; -} -#endif /* !HAVE_DOSISH_SYSTEM */ - - -/* Remove all lockfiles. This is usually called by the atexit handler - installed by this module but may also be called by other - termination handlers. */ -void -dotlock_remove_lockfiles (void) -{ - dotlock_t h, h2; - - h = all_lockfiles; - all_lockfiles = NULL; - - while ( h ) - { - h2 = h->next; - destroy_dotlock (h); - h = h2; - } -} - diff --git a/jnlib/dotlock.h b/jnlib/dotlock.h deleted file mode 100644 index 407a80b37..000000000 --- a/jnlib/dotlock.h +++ /dev/null @@ -1,33 +0,0 @@ -/* dotlock.h - * Copyright (C) 2000, 2001, 2006 Free Software Foundation, Inc. - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef LIBJNLIB_DOTLOCK_H -#define LIBJNLIB_DOTLOCK_H - -struct dotlock_handle; -typedef struct dotlock_handle *dotlock_t; - -void disable_dotlock (void); -dotlock_t create_dotlock (const char *file_to_lock); -void destroy_dotlock ( dotlock_t h ); -int make_dotlock (dotlock_t h, long timeout); -int release_dotlock (dotlock_t h); -void dotlock_remove_lockfiles (void); - -#endif /*LIBJNLIB_DOTLOCK_H*/ diff --git a/jnlib/dynload.h b/jnlib/dynload.h deleted file mode 100644 index 0c8a3bbaa..000000000 --- a/jnlib/dynload.h +++ /dev/null @@ -1,86 +0,0 @@ -/* dynload.h - Wrapper functions for run-time dynamic loading - * Copyright (C) 2003, 2010 Free Software Foundation, Inc. - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef LIBJNLIB_DYNLOAD_H -#define LIBJNLIB_DYNLOAD_H - -#ifndef __MINGW32__ -# include <dlfcn.h> -#else -# include <windows.h> -# include "utf8conv.h" -# include "mischelp.h" -# define RTLD_LAZY 0 - -static inline void * -dlopen (const char *name, int flag) -{ - void *hd; -#ifdef HAVE_W32CE_SYSTEM - wchar_t *wname = utf8_to_wchar (name); - hd = wname? LoadLibrary (wname) : NULL; - _jnlib_free (wname); -#else - hd = LoadLibrary (name); -#endif - (void)flag; - return hd; -} - -static inline void * -dlsym (void *hd, const char *sym) -{ - if (hd && sym) - { -#ifdef HAVE_W32CE_SYSTEM - wchar_t *wsym = utf8_to_wchar (sym); - void *fnc = wsym? GetProcAddress (hd, wsym) : NULL; - _jnlib_free (wsym); -#else - void *fnc = GetProcAddress (hd, sym); -#endif - if (!fnc) - return NULL; - return fnc; - } - return NULL; -} - - -static inline const char * -dlerror (void) -{ - static char buf[32]; - snprintf (buf, sizeof buf, "ec=%lu", GetLastError ()); - return buf; -} - - -static inline int -dlclose (void * hd) -{ - if (hd) - { - CloseHandle (hd); - return 0; - } - return -1; -} -# endif /*__MINGW32__*/ -#endif /*LIBJNLIB_DYNLOAD_H*/ diff --git a/jnlib/libjnlib-config.h b/jnlib/libjnlib-config.h deleted file mode 100644 index 621e89feb..000000000 --- a/jnlib/libjnlib-config.h +++ /dev/null @@ -1,99 +0,0 @@ -/* libjnlib-config.h - local configuration of the jnlib functions - * Copyright (C) 2000, 2001, 2006 Free Software Foundation, Inc. - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -/**************** - * This header is to be included only by the files in this directory - * it should not be used by other modules. - */ - -#ifndef LIBJNLIB_CONFIG_H -#define LIBJNLIB_CONFIG_H - -#include <gcrypt.h> /* gcry_malloc & Cie. */ -#include "logging.h" - -/* We require support for utf-8 conversion. */ -#define JNLIB_NEED_UTF8CONV 1 - - - -#if !defined(JNLIB_NEED_UTF8CONV) && defined(HAVE_W32_SYSTEM) -#define JNLIB_NEED_UTF8CONV 1 -#endif - -/* Gettext stuff */ -#ifdef USE_SIMPLE_GETTEXT -# include <gpg-error.h> -# define _(a) gettext (a) -# define N_(a) (a) - -#else -#ifdef HAVE_LOCALE_H -# include <locale.h> -#endif - -#ifdef ENABLE_NLS -# 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 /* !USE_SIMPLE_GETTEXT */ - -/* Malloc functions to be used by jnlib. */ -#define jnlib_malloc(a) gcry_malloc( (a) ) -#define jnlib_calloc(a,b) gcry_calloc( (a), (b) ) -#define jnlib_realloc(a,b) gcry_realloc( (a), (b) ) -#define jnlib_strdup(a) gcry_strdup( (a) ) -#define jnlib_xmalloc(a) gcry_xmalloc( (a) ) -#define jnlib_xcalloc(a,b) gcry_xcalloc( (a), (b) ) -#define jnlib_xrealloc(a,n) gcry_xrealloc( (a), (n) ) -#define jnlib_xstrdup(a) gcry_xstrdup( (a) ) -#define jnlib_free(a) gcry_free( (a) ) - -/* Logging functions to be used by jnlib. */ -#define jnlib_log_debug log_debug -#define jnlib_log_info log_info -#define jnlib_log_error log_error -#define jnlib_log_fatal log_fatal -#define jnlib_log_bug log_bug - -/* Wrapper to set ERRNO. */ -#ifdef HAVE_W32CE_SYSTEM -# define jnlib_set_errno(e) gpg_err_set_errno ((e)) -#else -# define jnlib_set_errno(e) do { errno = (e); } while (0) -#endif - -/* Dummy replacement for getenv. */ -#ifndef HAVE_GETENV -#define getenv(a) (NULL) -#endif - -#ifdef HAVE_W32CE_SYSTEM -#define getpid() GetCurrentProcessId () -#endif - -#endif /*LIBJNUTIL_CONFIG_H*/ diff --git a/jnlib/logging.c b/jnlib/logging.c deleted file mode 100644 index 028697b78..000000000 --- a/jnlib/logging.c +++ /dev/null @@ -1,651 +0,0 @@ -/* logging.c - Useful logging functions - * Copyright (C) 1998, 1999, 2000, 2001, 2003, - * 2004, 2005, 2006, 2009 Free Software Foundation, Inc. - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - - -#include <config.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <stdarg.h> -#include <stddef.h> -#include <errno.h> -#include <time.h> -#include <sys/types.h> -#include <sys/stat.h> -#ifndef HAVE_W32_SYSTEM -#include <sys/socket.h> -#include <sys/un.h> -#endif /*!HAVE_W32_SYSTEM*/ -#include <unistd.h> -#include <fcntl.h> -#include <assert.h> - - -#define JNLIB_NEED_LOG_LOGV 1 -#define JNLIB_NEED_AFLOCAL 1 -#include "libjnlib-config.h" -#include "logging.h" - -#if defined (HAVE_FOPENCOOKIE) || defined (HAVE_FUNOPEN) -#define USE_FUNWRITER 1 -#endif - -#ifdef HAVE_FOPENCOOKIE -typedef ssize_t my_funopen_hook_ret_t; -typedef size_t my_funopen_hook_size_t; -#else -typedef int my_funopen_hook_ret_t; -typedef int my_funopen_hook_size_t; -#endif - - -static FILE *logstream; -static int log_socket = -1; -static char prefix_buffer[80]; -static int with_time; -static int with_prefix; -static int with_pid; -static unsigned long (*get_tid_callback)(void); -static int running_detached; -static int force_prefixes; - -static int missing_lf; -static int errorcount; - - -int -log_get_errorcount (int clear) -{ - int n = errorcount; - if( clear ) - errorcount = 0; - return n; -} - -void -log_inc_errorcount (void) -{ - errorcount++; -} - - -/* The follwing 3 functions are used by funopen to write logs to a - socket. */ -#ifdef USE_FUNWRITER -struct fun_cookie_s { - int fd; - int quiet; - int want_socket; - int is_socket; - char name[1]; -}; - -/* Write NBYTES of BUFFER to file descriptor FD. */ -static int -writen (int fd, const void *buffer, size_t nbytes) -{ - const char *buf = buffer; - size_t nleft = nbytes; - int nwritten; - - while (nleft > 0) - { - nwritten = write (fd, buf, nleft); - if (nwritten < 0 && errno == EINTR) - continue; - if (nwritten < 0) - return -1; - nleft -= nwritten; - buf = buf + nwritten; - } - - return 0; -} - - -static my_funopen_hook_ret_t -fun_writer (void *cookie_arg, const char *buffer, my_funopen_hook_size_t size) -{ - struct fun_cookie_s *cookie = cookie_arg; - - /* Note that we always try to reconnect to the socket but print - error messages only the first time an error occured. If - RUNNING_DETACHED is set we don't fall back to stderr and even do - not print any error messages. This is needed because detached - processes often close stderr and by writing to file descriptor 2 - we might send the log message to a file not intended for logging - (e.g. a pipe or network connection). */ - if (cookie->want_socket && cookie->fd == -1) - { - /* Not yet open or meanwhile closed due to an error. */ - cookie->is_socket = 0; - cookie->fd = socket (PF_LOCAL, SOCK_STREAM, 0); - if (cookie->fd == -1) - { - if (!cookie->quiet && !running_detached - && isatty (fileno (stderr))) - fprintf (stderr, "failed to create socket for logging: %s\n", - strerror(errno)); - } - else - { - struct sockaddr_un addr; - size_t addrlen; - - memset (&addr, 0, sizeof addr); - addr.sun_family = PF_LOCAL; - strncpy (addr.sun_path, cookie->name, sizeof (addr.sun_path)-1); - addr.sun_path[sizeof (addr.sun_path)-1] = 0; - addrlen = SUN_LEN (&addr); - - if (connect (cookie->fd, (struct sockaddr *) &addr, addrlen) == -1) - { - if (!cookie->quiet && !running_detached - && isatty (fileno (stderr))) - fprintf (stderr, "can't connect to `%s': %s\n", - cookie->name, strerror(errno)); - close (cookie->fd); - cookie->fd = -1; - } - } - - if (cookie->fd == -1) - { - if (!running_detached) - { - /* Due to all the problems with apps not running - detached but being called with stderr closed or - used for a different purposes, it does not make - sense to switch to stderr. We therefore disable it. */ - if (!cookie->quiet) - { - /* fputs ("switching logging to stderr\n", stderr);*/ - cookie->quiet = 1; - } - cookie->fd = -1; /*fileno (stderr);*/ - } - } - else /* Connection has been established. */ - { - cookie->quiet = 0; - cookie->is_socket = 1; - } - } - - log_socket = cookie->fd; - if (cookie->fd != -1 && !writen (cookie->fd, buffer, size)) - return (my_funopen_hook_ret_t)size; /* Okay. */ - - if (!running_detached && cookie->fd != -1 - && isatty (fileno (stderr))) - { - if (*cookie->name) - fprintf (stderr, "error writing to `%s': %s\n", - cookie->name, strerror(errno)); - else - fprintf (stderr, "error writing to file descriptor %d: %s\n", - cookie->fd, strerror(errno)); - } - if (cookie->is_socket && cookie->fd != -1) - { - close (cookie->fd); - cookie->fd = -1; - log_socket = -1; - } - - return (my_funopen_hook_ret_t)size; -} - -static int -fun_closer (void *cookie_arg) -{ - struct fun_cookie_s *cookie = cookie_arg; - - if (cookie->fd != -1 && cookie->fd != 2) - close (cookie->fd); - jnlib_free (cookie); - log_socket = -1; - return 0; -} -#endif /*USE_FUNWRITER*/ - - - -/* Common function to either set the logging to a file or a file - descriptor. */ -static void -set_file_fd (const char *name, int fd) -{ - FILE *fp; - int want_socket; -#ifdef USE_FUNWRITER - struct fun_cookie_s *cookie; -#endif - - /* Close an open log stream. */ - if (logstream) - { - if (logstream != stderr && logstream != stdout) - fclose (logstream); - logstream = NULL; - } - - /* Figure out what kind of logging we want. */ - if (name && !strcmp (name, "-")) - { - name = NULL; - fd = fileno (stderr); - } - - if (name) - { - want_socket = (!strncmp (name, "socket://", 9) && name[9]); - if (want_socket) - name += 9; - } - else - { - want_socket = 0; - } - - /* Setup a new stream. */ -#ifdef USE_FUNWRITER - /* The xmalloc below is justified because we can expect that this - function is called only during initialization and there is no - easy way out of this error condition. */ - cookie = jnlib_xmalloc (sizeof *cookie + (name? strlen (name):0)); - strcpy (cookie->name, name? name:""); - cookie->quiet = 0; - cookie->is_socket = 0; - cookie->want_socket = want_socket; - if (!name) - cookie->fd = fd; - else if (want_socket) - cookie->fd = -1; - else - { - do - cookie->fd = open (name, O_WRONLY|O_APPEND|O_CREAT, - (S_IRUSR|S_IRGRP|S_IROTH|S_IWUSR|S_IWGRP|S_IWOTH)); - while (cookie->fd == -1 && errno == EINTR); - } - log_socket = cookie->fd; - -#ifdef HAVE_FOPENCOOKIE - { - cookie_io_functions_t io = { NULL }; - io.write = fun_writer; - io.close = fun_closer; - - fp = fopencookie (cookie, "w", io); - } -#else /*!HAVE_FOPENCOOKIE*/ - fp = funopen (cookie, NULL, fun_writer, NULL, fun_closer); -#endif /*!HAVE_FOPENCOOKIE*/ - -#else /*!USE_FUNWRITER*/ - - /* The system does not feature custom streams. Thus fallback to - plain stdio. */ - if (want_socket) - { - fprintf (stderr, "system does not support logging to a socket - " - "using stderr\n"); - fp = stderr; - } - else if (name) - fp = fopen (name, "a"); - else if (fd == 1) - fp = stdout; - else if (fd == 2) - fp = stderr; - else - fp = fdopen (fd, "a"); - - log_socket = -1; - -#endif /*!USE_FUNWRITER*/ - - /* On error default to stderr. */ - if (!fp) - { - if (name) - fprintf (stderr, "failed to open log file `%s': %s\n", - name, strerror(errno)); - else - fprintf (stderr, "failed to fdopen file descriptor %d: %s\n", - fd, strerror(errno)); - /* We need to make sure that there is a log stream. We use stderr. */ - fp = stderr; - } - else - setvbuf (fp, NULL, _IOLBF, 0); - - logstream = fp; - - /* We always need to print the prefix and the pid for socket mode, - so that the server reading the socket can do something - meaningful. */ - force_prefixes = want_socket; - - missing_lf = 0; -} - - -/* Set the file to write log to. The special names NULL and "-" may - be used to select stderr and names formatted like - "socket:///home/foo/mylogs" may be used to write the logging to the - socket "/home/foo/mylogs". If the connection to the socket fails - or a write error is detected, the function writes to stderr and - tries the next time again to connect the socket. - */ -void -log_set_file (const char *name) -{ - set_file_fd (name? name: "-", -1); -} - -void -log_set_fd (int fd) -{ - set_file_fd (NULL, fd); -} - - -void -log_set_get_tid_callback (unsigned long (*cb)(void)) -{ - get_tid_callback = cb; -} - - -void -log_set_prefix (const char *text, unsigned int flags) -{ - if (text) - { - strncpy (prefix_buffer, text, sizeof (prefix_buffer)-1); - prefix_buffer[sizeof (prefix_buffer)-1] = 0; - } - - with_prefix = (flags & JNLIB_LOG_WITH_PREFIX); - with_time = (flags & JNLIB_LOG_WITH_TIME); - with_pid = (flags & JNLIB_LOG_WITH_PID); - running_detached = (flags & JNLIB_LOG_RUN_DETACHED); -} - - -const char * -log_get_prefix (unsigned int *flags) -{ - if (flags) - { - *flags = 0; - if (with_prefix) - *flags |= JNLIB_LOG_WITH_PREFIX; - if (with_time) - *flags |= JNLIB_LOG_WITH_TIME; - if (with_pid) - *flags |= JNLIB_LOG_WITH_PID; - if (running_detached) - *flags |= JNLIB_LOG_RUN_DETACHED; - } - return prefix_buffer; -} - -/* This function returns true if the file descriptor FD is in use for - logging. This is preferable over a test using log_get_fd in that - it allows the logging code to use more then one file descriptor. */ -int -log_test_fd (int fd) -{ - if (logstream) - { - int tmp = fileno (logstream); - if ( tmp != -1 && tmp == fd) - return 1; - } - if (log_socket != -1 && log_socket == fd) - return 1; - return 0; -} - -int -log_get_fd () -{ - return fileno(logstream?logstream:stderr); -} - -FILE * -log_get_stream () -{ - /* FIXME: We should not return stderr here but initialize the log - stream properly. This might break more things than using stderr, - though */ - return logstream?logstream:stderr; -} - -static void -do_logv (int level, const char *fmt, va_list arg_ptr) -{ - if (!logstream) - { - log_set_file (NULL); /* Make sure a log stream has been set. */ - assert (logstream); - } - - if (missing_lf && level != JNLIB_LOG_CONT) - putc('\n', logstream ); - missing_lf = 0; - - if (level != JNLIB_LOG_CONT) - { /* Note this does not work for multiple line logging as we would - * need to print to a buffer first */ - if (with_time && !force_prefixes) - { - struct tm *tp; - time_t atime = time (NULL); - - tp = localtime (&atime); - fprintf (logstream, "%04d-%02d-%02d %02d:%02d:%02d ", - 1900+tp->tm_year, tp->tm_mon+1, tp->tm_mday, - tp->tm_hour, tp->tm_min, tp->tm_sec ); - } - if (with_prefix || force_prefixes) - fputs (prefix_buffer, logstream); - if (with_pid || force_prefixes) - { - if (get_tid_callback) - fprintf (logstream, "[%u.%lx]", - (unsigned int)getpid (), get_tid_callback ()); - else - fprintf (logstream, "[%u]", (unsigned int)getpid ()); - } - if (!with_time || force_prefixes) - putc (':', logstream); - /* A leading backspace suppresses the extra space so that we can - correctly output, programname, filename and linenumber. */ - if (fmt && *fmt == '\b') - fmt++; - else - putc (' ', logstream); - } - - switch (level) - { - case JNLIB_LOG_BEGIN: break; - case JNLIB_LOG_CONT: break; - case JNLIB_LOG_INFO: break; - case JNLIB_LOG_WARN: break; - case JNLIB_LOG_ERROR: break; - case JNLIB_LOG_FATAL: fputs("Fatal: ",logstream ); break; - case JNLIB_LOG_BUG: fputs("Ohhhh jeeee: ", logstream); break; - case JNLIB_LOG_DEBUG: fputs("DBG: ", logstream ); break; - default: fprintf(logstream,"[Unknown log level %d]: ", level ); break; - } - - - if (fmt) - { - vfprintf(logstream,fmt,arg_ptr) ; - if (*fmt && fmt[strlen(fmt)-1] != '\n') - missing_lf = 1; -#ifdef HAVE_W32_SYSTEM - else - fflush (logstream); -#endif - } - - if (level == JNLIB_LOG_FATAL) - { - if (missing_lf) - putc('\n', logstream ); - exit(2); - } - if (level == JNLIB_LOG_BUG) - { - if (missing_lf) - putc('\n', logstream ); - abort(); - } -} - -static void -do_log( int level, const char *fmt, ... ) -{ - va_list arg_ptr ; - - va_start( arg_ptr, fmt ) ; - do_logv( level, fmt, arg_ptr ); - va_end(arg_ptr); -} - - -void -log_logv (int level, const char *fmt, va_list arg_ptr) -{ - do_logv (level, fmt, arg_ptr); -} - -void -log_info( const char *fmt, ... ) -{ - va_list arg_ptr ; - - va_start( arg_ptr, fmt ) ; - do_logv( JNLIB_LOG_INFO, fmt, arg_ptr ); - va_end(arg_ptr); -} - -void -log_error( const char *fmt, ... ) -{ - va_list arg_ptr ; - - va_start( arg_ptr, fmt ) ; - do_logv( JNLIB_LOG_ERROR, fmt, arg_ptr ); - va_end(arg_ptr); - /* protect against counter overflow */ - if( errorcount < 30000 ) - errorcount++; -} - - -void -log_fatal( const char *fmt, ... ) -{ - va_list arg_ptr ; - - va_start( arg_ptr, fmt ) ; - do_logv( JNLIB_LOG_FATAL, fmt, arg_ptr ); - va_end(arg_ptr); - abort(); /* never called, but it makes the compiler happy */ -} - -void -log_bug( const char *fmt, ... ) -{ - va_list arg_ptr ; - - va_start( arg_ptr, fmt ) ; - do_logv( JNLIB_LOG_BUG, fmt, arg_ptr ); - va_end(arg_ptr); - abort(); /* never called, but it makes the compiler happy */ -} - -void -log_debug( const char *fmt, ... ) -{ - va_list arg_ptr ; - - va_start( arg_ptr, fmt ) ; - do_logv( JNLIB_LOG_DEBUG, fmt, arg_ptr ); - va_end(arg_ptr); -} - - -void -log_printf (const char *fmt, ...) -{ - va_list arg_ptr; - - va_start (arg_ptr, fmt); - do_logv (fmt ? JNLIB_LOG_CONT : JNLIB_LOG_BEGIN, fmt, arg_ptr); - va_end (arg_ptr); -} - -/* Print a hexdump of BUFFER. With TEXT of NULL print just the raw - dump, with TEXT just an empty string, print a trailing linefeed, - otherwise print an entire debug line. */ -void -log_printhex (const char *text, const void *buffer, size_t length) -{ - if (text && *text) - log_debug ("%s ", text); - if (length) - { - const unsigned char *p = buffer; - log_printf ("%02X", *p); - for (length--, p++; length--; p++) - log_printf (" %02X", *p); - } - if (text) - log_printf ("\n"); -} - - -#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 5 ) -void -bug_at( const char *file, int line, const char *func ) -{ - do_log( JNLIB_LOG_BUG, - ("... this is a bug (%s:%d:%s)\n"), file, line, func ); - abort(); /* never called, but it makes the compiler happy */ -} -#else -void -bug_at( const char *file, int line ) -{ - do_log( JNLIB_LOG_BUG, - _("you found a bug ... (%s:%d)\n"), file, line); - abort(); /* never called, but it makes the compiler happy */ -} -#endif - diff --git a/jnlib/logging.h b/jnlib/logging.h deleted file mode 100644 index 0b96108a8..000000000 --- a/jnlib/logging.h +++ /dev/null @@ -1,88 +0,0 @@ -/* logging.h - * Copyright (C) 1999, 2000, 2001, 2004, 2006 Free Software Foundation, Inc. - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef LIBJNLIB_LOGGING_H -#define LIBJNLIB_LOGGING_H - -#include <stdio.h> -#include "mischelp.h" - -/* Flag values for log_set_prefix. */ -#define JNLIB_LOG_WITH_PREFIX 1 -#define JNLIB_LOG_WITH_TIME 2 -#define JNLIB_LOG_WITH_PID 4 -#define JNLIB_LOG_RUN_DETACHED 256 - -int log_get_errorcount (int clear); -void log_inc_errorcount (void); -void log_set_file( const char *name ); -void log_set_fd (int fd); -void log_set_get_tid_callback (unsigned long (*cb)(void)); -void log_set_prefix (const char *text, unsigned int flags); -const char *log_get_prefix (unsigned int *flags); -int log_test_fd (int fd); -int log_get_fd(void); -FILE *log_get_stream (void); - -#ifdef JNLIB_GCC_M_FUNCTION - void bug_at( const char *file, int line, const char *func ) JNLIB_GCC_A_NR; -# define BUG() bug_at( __FILE__ , __LINE__, __FUNCTION__ ) -#else - void bug_at( const char *file, int line ); -# define BUG() bug_at( __FILE__ , __LINE__ ) -#endif - -/* To avoid mandatory inclusion of stdarg and other stuff, do it only - if explicitly requested to do so. */ -#ifdef JNLIB_NEED_LOG_LOGV -#include <stdarg.h> -enum jnlib_log_levels { - JNLIB_LOG_BEGIN, - JNLIB_LOG_CONT, - JNLIB_LOG_INFO, - JNLIB_LOG_WARN, - JNLIB_LOG_ERROR, - JNLIB_LOG_FATAL, - JNLIB_LOG_BUG, - JNLIB_LOG_DEBUG -}; -void log_logv (int level, const char *fmt, va_list arg_ptr); -#endif /*JNLIB_NEED_LOG_LOGV*/ - - -void log_bug( const char *fmt, ... ) JNLIB_GCC_A_NR_PRINTF(1,2); -void log_fatal( const char *fmt, ... ) JNLIB_GCC_A_NR_PRINTF(1,2); -void log_error( const char *fmt, ... ) JNLIB_GCC_A_PRINTF(1,2); -void log_info( const char *fmt, ... ) JNLIB_GCC_A_PRINTF(1,2); -void log_debug( const char *fmt, ... ) JNLIB_GCC_A_PRINTF(1,2); -void log_printf( const char *fmt, ... ) JNLIB_GCC_A_PRINTF(1,2); - -/* Print a hexdump of BUFFER. With TEXT passes as NULL print just the - raw dump, with TEXT being an empty string, print a trailing - linefeed, otherwise print an entire debug line with TEXT followed - by the hexdump and a final LF. */ -void log_printhex (const char *text, const void *buffer, size_t length); - - -#endif /*LIBJNLIB_LOGGING_H*/ - - - - - diff --git a/jnlib/mischelp.c b/jnlib/mischelp.c deleted file mode 100644 index e06be21f2..000000000 --- a/jnlib/mischelp.c +++ /dev/null @@ -1,197 +0,0 @@ -/* mischelp.c - Miscellaneous helper functions - * Copyright (C) 1998, 2000, 2001, 2006, 2007 Free Software Foundation, Inc. - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include <config.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> -#ifdef HAVE_W32_SYSTEM -# define WIN32_LEAN_AND_MEAN -# include <windows.h> -#else /*!HAVE_W32_SYSTEM*/ -# include <sys/types.h> -# include <sys/stat.h> -# include <unistd.h> -#endif /*!HAVE_W32_SYSTEM*/ -#include <errno.h> - -#include "libjnlib-config.h" -#include "stringhelp.h" -#include "utf8conv.h" -#include "mischelp.h" - - -/* Because we can't use our jnlib_free macro in inline functions we - provide this wrapper. */ -void -_jnlib_free (void *p) -{ - if (p) - jnlib_free (p); -} - - -/* Check whether the files NAME1 and NAME2 are identical. This is for - example achieved by comparing the inode numbers of the files. */ -int -same_file_p (const char *name1, const char *name2) -{ - int yes; - - /* First try a shortcut. */ - if (!compare_filenames (name1, name2)) - yes = 1; - else - { -#ifdef HAVE_W32_SYSTEM - HANDLE file1, file2; - BY_HANDLE_FILE_INFORMATION info1, info2; - -#ifdef HAVE_W32CE_SYSTEM - { - wchar_t *wname = utf8_to_wchar (name1); - if (wname) - file1 = CreateFile (wname, 0, 0, NULL, OPEN_EXISTING, 0, NULL); - else - file1 = INVALID_HANDLE_VALUE; - jnlib_free (wname); - } -#else - file1 = CreateFile (name1, 0, 0, NULL, OPEN_EXISTING, 0, NULL); -#endif - if (file1 == INVALID_HANDLE_VALUE) - yes = 0; /* If we can't open the file, it is not the same. */ - else - { -#ifdef HAVE_W32CE_SYSTEM - { - wchar_t *wname = utf8_to_wchar (name2); - if (wname) - file2 = CreateFile (wname, 0, 0, NULL, OPEN_EXISTING, 0, NULL); - else - file2 = INVALID_HANDLE_VALUE; - jnlib_free (wname); - } -#else - file2 = CreateFile (name2, 0, 0, NULL, OPEN_EXISTING, 0, NULL); -#endif - if (file2 == INVALID_HANDLE_VALUE) - yes = 0; /* If we can't open the file, it is not the same. */ - else - { - yes = (GetFileInformationByHandle (file1, &info1) - && GetFileInformationByHandle (file2, &info2) - && info1.dwVolumeSerialNumber==info2.dwVolumeSerialNumber - && info1.nFileIndexHigh == info2.nFileIndexHigh - && info1.nFileIndexLow == info2.nFileIndexLow); - CloseHandle (file2); - } - CloseHandle (file1); - } -#else /*!HAVE_W32_SYSTEM*/ - struct stat info1, info2; - - yes = (!stat (name1, &info1) && !stat (name2, &info2) - && info1.st_dev == info2.st_dev && info1.st_ino == info2.st_ino); -#endif /*!HAVE_W32_SYSTEM*/ - } - return yes; -} - - -/* - timegm() is a GNU function that might not be available everywhere. - It's basically the inverse of gmtime() - you give it a struct tm, - and get back a time_t. It differs from mktime() in that it handles - the case where the struct tm is UTC and the local environment isn't. - - Note, that this replacement implementation might not be thread-safe! - - Some BSDs don't handle the putenv("foo") case properly, so we use - unsetenv if the platform has it to remove environment variables. -*/ -#ifndef HAVE_TIMEGM -time_t -timegm (struct tm *tm) -{ -#ifdef HAVE_W32_SYSTEM - /* This one is thread safe. */ - SYSTEMTIME st; - FILETIME ft; - unsigned long long cnsecs; - - st.wYear = tm->tm_year + 1900; - st.wMonth = tm->tm_mon + 1; - st.wDay = tm->tm_mday; - st.wHour = tm->tm_hour; - st.wMinute = tm->tm_min; - st.wSecond = tm->tm_sec; - st.wMilliseconds = 0; /* Not available. */ - st.wDayOfWeek = 0; /* Ignored. */ - - /* System time is UTC thus the conversion is pretty easy. */ - if (!SystemTimeToFileTime (&st, &ft)) - { - jnlib_set_errno (EINVAL); - return (time_t)(-1); - } - - cnsecs = (((unsigned long long)ft.dwHighDateTime << 32) - | ft.dwLowDateTime); - cnsecs -= 116444736000000000ULL; /* The filetime epoch is 1601-01-01. */ - return (time_t)(cnsecs / 10000000ULL); - -#else /* (Non thread safe implementation!) */ - - time_t answer; - char *zone; - - zone=getenv("TZ"); - putenv("TZ=UTC"); - tzset(); - answer=mktime(tm); - if(zone) - { - static char *old_zone; - - if (!old_zone) - { - old_zone = malloc(3+strlen(zone)+1); - if (old_zone) - { - strcpy(old_zone,"TZ="); - strcat(old_zone,zone); - } - } - if (old_zone) - putenv (old_zone); - } - else -#ifdef HAVE_UNSETENV - unsetenv("TZ"); -#else - putenv("TZ"); -#endif - - tzset(); - return answer; -#endif -} -#endif /*!HAVE_TIMEGM*/ - diff --git a/jnlib/mischelp.h b/jnlib/mischelp.h deleted file mode 100644 index 52781e12f..000000000 --- a/jnlib/mischelp.h +++ /dev/null @@ -1,102 +0,0 @@ -/* mischelp.h - Miscellaneous helper macros and functions - * Copyright (C) 1999, 2000, 2001, 2002, 2003, - * 2006, 2007, 2009 Free Software Foundation, Inc. - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef LIBJNLIB_MISCHELP_H -#define LIBJNLIB_MISCHHELP_H - - -/* Because we can't use the internal jnlib_free macro in inline - functions we provide a wrapper fucntion as well. */ -void _jnlib_free (void *p); - -/* Check whether the files NAME1 and NAME2 are identical. This is for - example achieved by comparing the inode numbers of the files. */ -int same_file_p (const char *name1, const char *name2); - - -#ifndef HAVE_TIMEGM -#include <time.h> -time_t timegm (struct tm *tm); -#endif /*!HAVE_TIMEGM*/ - - -#define DIM(v) (sizeof(v)/sizeof((v)[0])) -#define DIMof(type,member) DIM(((type *)0)->member) - - -#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 5 ) -# define JNLIB_GCC_M_FUNCTION 1 -# define JNLIB_GCC_A_NR __attribute__ ((noreturn)) -# define JNLIB_GCC_A_PRINTF( f, a ) __attribute__ ((format (printf,f,a))) -# define JNLIB_GCC_A_NR_PRINTF( f, a ) \ - __attribute__ ((noreturn, format (printf,f,a))) -#else -# define JNLIB_GCC_A_NR -# define JNLIB_GCC_A_PRINTF( f, a ) -# define JNLIB_GCC_A_NR_PRINTF( f, a ) -#endif - - -/* To avoid that a compiler optimizes certain memset calls away, these - macros may be used instead. */ -#define wipememory2(_ptr,_set,_len) do { \ - volatile char *_vptr=(volatile char *)(_ptr); \ - size_t _vlen=(_len); \ - while(_vlen) { *_vptr=(_set); _vptr++; _vlen--; } \ - } while(0) -#define wipememory(_ptr,_len) wipememory2(_ptr,0,_len) - - -/* Include hacks which are mainly required for Slowaris. */ -#ifdef JNLIB_NEED_AFLOCAL -#ifndef HAVE_W32_SYSTEM -# include <sys/socket.h> -# include <sys/un.h> -#else -# include <windows.h> -#endif - -#ifndef PF_LOCAL -# ifdef PF_UNIX -# define PF_LOCAL PF_UNIX -# else -# define PF_LOCAL AF_UNIX -# endif -#endif /*PF_LOCAL*/ -#ifndef AF_LOCAL -# define AF_LOCAL AF_UNIX -#endif /*AF_UNIX*/ - -/* We used to avoid this macro in GnuPG and inlined the AF_LOCAL name - length computation directly with the little twist of adding 1 extra - byte. It seems that this was needed once on an old HP/UX box and - there are also rumours that 4.3 Reno and DEC systems need it. This - one-off buglet did not harm any current system until it came to Mac - OS X where the kernel (as of May 2009) exhibited a strange bug: The - systems basically froze in the connect call if the passed name - contained an invalid directory part. Ignore the old Unices. */ -#ifndef SUN_LEN -# define SUN_LEN(ptr) ((size_t) (((struct sockaddr_un *) 0)->sun_path) \ - + strlen ((ptr)->sun_path)) -#endif /*SUN_LEN*/ -#endif /*JNLIB_NEED_AFLOCAL*/ - - -#endif /*LIBJNLIB_MISCHELP_H*/ diff --git a/jnlib/stringhelp.c b/jnlib/stringhelp.c deleted file mode 100644 index 36f96b8ff..000000000 --- a/jnlib/stringhelp.c +++ /dev/null @@ -1,1151 +0,0 @@ -/* stringhelp.c - standard string helper functions - * Copyright (C) 1998, 1999, 2000, 2001, 2003, 2004, 2005, - * 2006, 2007, 2008, 2009 Free Software Foundation, Inc. - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include <config.h> -#include <stdlib.h> -#include <string.h> -#include <stdarg.h> -#include <ctype.h> -#include <errno.h> -#ifdef HAVE_PWD_H -# include <pwd.h> -#endif -#include <unistd.h> -#include <sys/types.h> -#ifdef HAVE_W32_SYSTEM -# include <windows.h> -#endif - -#include "libjnlib-config.h" -#include "utf8conv.h" -#include "stringhelp.h" - - -#define tohex_lower(n) ((n) < 10 ? ((n) + '0') : (((n) - 10) + 'a')) - -/* Sometimes we want to avoid mixing slashes and backslashes on W32 - and prefer backslashes. There is usual no problem with mixing - them, however a very few W32 API calls can't grok plain slashes. - Printing filenames with mixed slashes also looks a bit strange. - This function has no effext on POSIX. */ -static inline char * -change_slashes (char *name) -{ -#ifdef HAVE_DRIVE_LETTERS - char *p; - - if (strchr (name, '\\')) - { - for (p=name; *p; p++) - if (*p == '/') - *p = '\\'; - } -#endif /*HAVE_DRIVE_LETTERS*/ - return name; -} - - -/* - * Look for the substring SUB in buffer and return a pointer to that - * substring in BUFFER or NULL if not found. - * Comparison is case-insensitive. - */ -const char * -memistr (const void *buffer, size_t buflen, const char *sub) -{ - const unsigned char *buf = buffer; - const unsigned char *t = (const unsigned char *)buffer; - const unsigned char *s = (const unsigned char *)sub; - size_t n = buflen; - - for ( ; n ; t++, n-- ) - { - if ( toupper (*t) == toupper (*s) ) - { - for ( buf=t++, buflen = n--, s++; - n && toupper (*t) == toupper (*s); t++, s++, n-- ) - ; - if (!*s) - return (const char*)buf; - t = buf; - s = (const unsigned char *)sub ; - n = buflen; - } - } - return NULL; -} - -const char * -ascii_memistr ( const void *buffer, size_t buflen, const char *sub ) -{ - const unsigned char *buf = buffer; - const unsigned char *t = (const unsigned char *)buf; - const unsigned char *s = (const unsigned char *)sub; - size_t n = buflen; - - for ( ; n ; t++, n-- ) - { - if (ascii_toupper (*t) == ascii_toupper (*s) ) - { - for ( buf=t++, buflen = n--, s++; - n && ascii_toupper (*t) == ascii_toupper (*s); t++, s++, n-- ) - ; - if (!*s) - return (const char*)buf; - t = (const unsigned char *)buf; - s = (const unsigned char *)sub ; - n = buflen; - } - } - return NULL; -} - -/* This function is similar to strncpy(). However it won't copy more - than N - 1 characters and makes sure that a '\0' is appended. With - N given as 0, nothing will happen. With DEST given as NULL, memory - will be allocated using jnlib_xmalloc (i.e. if it runs out of core - the function terminates). Returns DES or a pointer to the - allocated memory. - */ -char * -mem2str( char *dest , const void *src , size_t n ) -{ - char *d; - const char *s; - - if( n ) { - if( !dest ) - dest = jnlib_xmalloc( n ) ; - d = dest; - s = src ; - for(n--; n && *s; n-- ) - *d++ = *s++; - *d = '\0' ; - } - - return dest ; -} - - -/**************** - * remove leading and trailing white spaces - */ -char * -trim_spaces( char *str ) -{ - char *string, *p, *mark; - - string = str; - /* find first non space character */ - for( p=string; *p && isspace( *(byte*)p ) ; p++ ) - ; - /* move characters */ - for( (mark = NULL); (*string = *p); string++, p++ ) - if( isspace( *(byte*)p ) ) { - if( !mark ) - mark = string ; - } - else - mark = NULL ; - if( mark ) - *mark = '\0' ; /* remove trailing spaces */ - - return str ; -} - -/**************** - * remove trailing white spaces - */ -char * -trim_trailing_spaces( char *string ) -{ - char *p, *mark; - - for( mark = NULL, p = string; *p; p++ ) { - if( isspace( *(byte*)p ) ) { - if( !mark ) - mark = p; - } - else - mark = NULL; - } - if( mark ) - *mark = '\0' ; - - return string ; -} - - -unsigned -trim_trailing_chars( byte *line, unsigned len, const char *trimchars ) -{ - byte *p, *mark; - unsigned n; - - for(mark=NULL, p=line, n=0; n < len; n++, p++ ) { - if( strchr(trimchars, *p ) ) { - if( !mark ) - mark = p; - } - else - mark = NULL; - } - - if( mark ) { - *mark = 0; - return mark - line; - } - return len; -} - -/**************** - * remove trailing white spaces and return the length of the buffer - */ -unsigned -trim_trailing_ws( byte *line, unsigned len ) -{ - return trim_trailing_chars( line, len, " \t\r\n" ); -} - -size_t -length_sans_trailing_chars (const unsigned char *line, size_t len, - const char *trimchars ) -{ - const unsigned char *p, *mark; - size_t n; - - for( mark=NULL, p=line, n=0; n < len; n++, p++ ) - { - if (strchr (trimchars, *p )) - { - if( !mark ) - mark = p; - } - else - mark = NULL; - } - - if (mark) - return mark - line; - return len; -} - -/* - * Return the length of line ignoring trailing white-space. - */ -size_t -length_sans_trailing_ws (const unsigned char *line, size_t len) -{ - return length_sans_trailing_chars (line, len, " \t\r\n"); -} - - - -/* - * Extract from a given path the filename component. This function - * terminates the process on memory shortage. - */ -char * -make_basename(const char *filepath, const char *inputpath) -{ -#ifdef __riscos__ - return riscos_make_basename(filepath, inputpath); -#else - char *p; - - (void)inputpath; /* Only required for riscos. */ - - if ( !(p=strrchr(filepath, '/')) ) -#ifdef HAVE_DRIVE_LETTERS - if ( !(p=strrchr(filepath, '\\')) ) - if ( !(p=strrchr(filepath, ':')) ) -#endif - { - return jnlib_xstrdup(filepath); - } - - return jnlib_xstrdup(p+1); -#endif -} - - - -/* - * Extract from a given filename the path prepended to it. If there - * isn't a path prepended to the filename, a dot is returned ('.'). - * This function terminates the process on memory shortage. - */ -char * -make_dirname(const char *filepath) -{ - char *dirname; - int dirname_length; - char *p; - - if ( !(p=strrchr(filepath, '/')) ) -#ifdef HAVE_DRIVE_LETTERS - if ( !(p=strrchr(filepath, '\\')) ) - if ( !(p=strrchr(filepath, ':')) ) -#endif - { - return jnlib_xstrdup("."); - } - - dirname_length = p-filepath; - dirname = jnlib_xmalloc(dirname_length+1); - strncpy(dirname, filepath, dirname_length); - dirname[dirname_length] = 0; - - return dirname; -} - - - -static char * -get_pwdir (int xmode, const char *name) -{ - char *result = NULL; -#ifdef HAVE_PWD_H - struct passwd *pwd = NULL; - - if (name) - { -#ifdef HAVE_GETPWNAM - /* Fixme: We should use getpwnam_r if available. */ - pwd = getpwnam (name); -#endif - } - else - { -#ifdef HAVE_GETPWUID - /* Fixme: We should use getpwuid_r if available. */ - pwd = getpwuid (getuid()); -#endif - } - if (pwd) - { - if (xmode) - result = jnlib_xstrdup (pwd->pw_dir); - else - result = jnlib_strdup (pwd->pw_dir); - } -#else /*!HAVE_PWD_H*/ - /* No support at all. */ - (void)xmode; - (void)name; -#endif /*HAVE_PWD_H*/ - return result; -} - -static char * -do_make_filename (int xmode, const char *first_part, va_list arg_ptr) -{ - const char *argv[32]; - int argc; - size_t n; - int skip = 1; - char *home_buffer = NULL; - char *name, *home, *p; - - n = strlen (first_part) + 1; - argc = 0; - while ( (argv[argc] = va_arg (arg_ptr, const char *)) ) - { - n += strlen (argv[argc]) + 1; - if (argc >= DIM (argv)-1) - { - if (xmode) - BUG (); - jnlib_set_errno (EINVAL); - return NULL; - } - argc++; - } - n++; - - home = NULL; - if (*first_part == '~') - { - if (first_part[1] == '/' || !first_part[1]) - { - /* This is the "~/" or "~" case. */ - home = getenv("HOME"); - if (!home) - home = home_buffer = get_pwdir (xmode, NULL); - if (home && *home) - n += strlen (home); - } - else - { - /* This is the "~username/" or "~username" case. */ - char *user; - - if (xmode) - user = jnlib_xstrdup (first_part+1); - else - { - user = jnlib_strdup (first_part+1); - if (!user) - return NULL; - } - p = strchr (user, '/'); - if (p) - *p = 0; - skip = 1 + strlen (user); - - home = home_buffer = get_pwdir (xmode, user); - jnlib_free (user); - if (home) - n += strlen (home); - else - skip = 1; - } - } - - if (xmode) - name = jnlib_xmalloc (n); - else - { - name = jnlib_malloc (n); - if (!name) - { - jnlib_free (home_buffer); - return NULL; - } - } - - if (home) - p = stpcpy (stpcpy (name, home), first_part + skip); - else - p = stpcpy (name, first_part); - - jnlib_free (home_buffer); - - for (argc=0; argv[argc]; argc++) - p = stpcpy (stpcpy (p, "/"), argv[argc]); - - return change_slashes (name); -} - -/* Construct a filename from the NULL terminated list of parts. Tilde - expansion is done for the first argument. This function terminates - the process on memory shortage. */ -char * -make_filename (const char *first_part, ... ) -{ - va_list arg_ptr; - char *result; - - va_start (arg_ptr, first_part); - result = do_make_filename (1, first_part, arg_ptr); - va_end (arg_ptr); - return result; -} - -/* Construct a filename from the NULL terminated list of parts. Tilde - expansion is done for the first argument. This function may return - NULL on error. */ -char * -make_filename_try (const char *first_part, ... ) -{ - va_list arg_ptr; - char *result; - - va_start (arg_ptr, first_part); - result = do_make_filename (0, first_part, arg_ptr); - va_end (arg_ptr); - return result; -} - - - -/* Compare whether the filenames are identical. This is a - special version of strcmp() taking the semantics of filenames in - account. Note that this function works only on the supplied names - without considereing any context like the current directory. See - also same_file_p(). */ -int -compare_filenames (const char *a, const char *b) -{ -#ifdef HAVE_DRIVE_LETTERS - for ( ; *a && *b; a++, b++ ) - { - if (*a != *b - && (toupper (*(const unsigned char*)a) - != toupper (*(const unsigned char*)b) ) - && !((*a == '/' && *b == '\\') || (*a == '\\' && *b == '/'))) - break; - } - if ((*a == '/' && *b == '\\') || (*a == '\\' && *b == '/')) - return 0; - else - return (toupper (*(const unsigned char*)a) - - toupper (*(const unsigned char*)b)); -#else - return strcmp(a,b); -#endif -} - - -/* Convert 2 hex characters at S to a byte value. Return this value - or -1 if there is an error. */ -int -hextobyte (const char *s) -{ - int c; - - if ( *s >= '0' && *s <= '9' ) - c = 16 * (*s - '0'); - else if ( *s >= 'A' && *s <= 'F' ) - c = 16 * (10 + *s - 'A'); - else if ( *s >= 'a' && *s <= 'f' ) - c = 16 * (10 + *s - 'a'); - else - return -1; - s++; - if ( *s >= '0' && *s <= '9' ) - c += *s - '0'; - else if ( *s >= 'A' && *s <= 'F' ) - c += 10 + *s - 'A'; - else if ( *s >= 'a' && *s <= 'f' ) - c += 10 + *s - 'a'; - else - return -1; - return c; -} - - -/* Print a BUFFER to stream FP while replacing all control characters - and the characters DELIM and DELIM2 with standard C escape - sequences. Returns the number of characters printed. */ -size_t -print_sanitized_buffer2 (FILE *fp, const void *buffer, size_t length, - int delim, int delim2) -{ - const unsigned char *p = buffer; - size_t count = 0; - - for (; length; length--, p++, count++) - { - if (*p < 0x20 - || *p == 0x7f - || *p == delim - || *p == delim2 - || ((delim || delim2) && *p=='\\')) - { - putc ('\\', fp); - count++; - if (*p == '\n') - { - putc ('n', fp); - count++; - } - else if (*p == '\r') - { - putc ('r', fp); - count++; - } - else if (*p == '\f') - { - putc ('f', fp); - count++; - } - else if (*p == '\v') - { - putc ('v', fp); - count++; - } - else if (*p == '\b') - { - putc ('b', fp); - count++; - } - else if (!*p) - { - putc('0', fp); - count++; - } - else - { - fprintf (fp, "x%02x", *p); - count += 3; - } - } - else - { - putc (*p, fp); - count++; - } - } - - return count; -} - -/* Same as print_sanitized_buffer2 but with just one delimiter. */ -size_t -print_sanitized_buffer (FILE *fp, const void *buffer, size_t length, - int delim) -{ - return print_sanitized_buffer2 (fp, buffer, length, delim, 0); -} - - -size_t -print_sanitized_utf8_buffer (FILE *fp, const void *buffer, - size_t length, int delim) -{ - const char *p = buffer; - size_t i; - - /* We can handle plain ascii simpler, so check for it first. */ - for (i=0; i < length; i++ ) - { - if ( (p[i] & 0x80) ) - break; - } - if (i < length) - { - char *buf = utf8_to_native (p, length, delim); - /*(utf8 conversion already does the control character quoting)*/ - i = strlen (buf); - fputs (buf, fp); - jnlib_free (buf); - return i; - } - else - return print_sanitized_buffer (fp, p, length, delim); -} - - -size_t -print_sanitized_string2 (FILE *fp, const char *string, int delim, int delim2) -{ - return string? print_sanitized_buffer2 (fp, string, strlen (string), - delim, delim2):0; -} - -size_t -print_sanitized_string (FILE *fp, const char *string, int delim) -{ - return string? print_sanitized_buffer (fp, string, strlen (string), delim):0; -} - -size_t -print_sanitized_utf8_string (FILE *fp, const char *string, int delim) -{ - return string? print_sanitized_utf8_buffer (fp, - string, strlen (string), - delim) : 0; -} - -/* Create a string from the buffer P_ARG of length N which is suitable - for printing. Caller must release the created string using xfree. - This function terminates the process on memory shortage. */ -char * -sanitize_buffer (const void *p_arg, size_t n, int delim) -{ - const unsigned char *p = p_arg; - size_t save_n, buflen; - const unsigned char *save_p; - char *buffer, *d; - - /* First count length. */ - for (save_n = n, save_p = p, buflen=1 ; n; n--, p++ ) - { - if ( *p < 0x20 || *p == 0x7f || *p == delim || (delim && *p=='\\')) - { - if ( *p=='\n' || *p=='\r' || *p=='\f' - || *p=='\v' || *p=='\b' || !*p ) - buflen += 2; - else - buflen += 5; - } - else - buflen++; - } - p = save_p; - n = save_n; - /* And now make the string */ - d = buffer = jnlib_xmalloc( buflen ); - for ( ; n; n--, p++ ) - { - if (*p < 0x20 || *p == 0x7f || *p == delim || (delim && *p=='\\')) { - *d++ = '\\'; - if( *p == '\n' ) - *d++ = 'n'; - else if( *p == '\r' ) - *d++ = 'r'; - else if( *p == '\f' ) - *d++ = 'f'; - else if( *p == '\v' ) - *d++ = 'v'; - else if( *p == '\b' ) - *d++ = 'b'; - else if( !*p ) - *d++ = '0'; - else { - sprintf(d, "x%02x", *p ); - d += 3; - } - } - else - *d++ = *p; - } - *d = 0; - return buffer; -} - - -/* Given a string containing an UTF-8 encoded text, return the number - of characters in this string. It differs from strlen in that it - only counts complete UTF-8 characters. Note, that this function - does not take combined characters into account. */ -size_t -utf8_charcount (const char *s) -{ - size_t n; - - for (n=0; *s; s++) - if ( (*s&0xc0) != 0x80 ) /* Exclude continuation bytes: 10xxxxxx */ - n++; - - return n; -} - - -/**************************************************** - ********** W32 specific functions **************** - ****************************************************/ - -#ifdef HAVE_W32_SYSTEM -const char * -w32_strerror (int ec) -{ - static char strerr[256]; - - if (ec == -1) - ec = (int)GetLastError (); -#ifdef HAVE_W32CE_SYSTEM - /* There is only a wchar_t FormatMessage. It does not make much - sense to play the conversion game; we print only the code. */ - snprintf (strerr, sizeof strerr, "ec=%d", (int)GetLastError ()); -#else - FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, ec, - MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), - strerr, DIM (strerr)-1, NULL); -#endif - return strerr; -} -#endif /*HAVE_W32_SYSTEM*/ - - -/**************************************************** - ******** Locale insensitive ctype functions ******** - ****************************************************/ -/* FIXME: replace them by a table lookup and macros */ -int -ascii_isupper (int c) -{ - return c >= 'A' && c <= 'Z'; -} - -int -ascii_islower (int c) -{ - return c >= 'a' && c <= 'z'; -} - -int -ascii_toupper (int c) -{ - if (c >= 'a' && c <= 'z') - c &= ~0x20; - return c; -} - -int -ascii_tolower (int c) -{ - if (c >= 'A' && c <= 'Z') - c |= 0x20; - return c; -} - - -int -ascii_strcasecmp( const char *a, const char *b ) -{ - if (a == b) - return 0; - - for (; *a && *b; a++, b++) { - if (*a != *b && ascii_toupper(*a) != ascii_toupper(*b)) - break; - } - return *a == *b? 0 : (ascii_toupper (*a) - ascii_toupper (*b)); -} - -int -ascii_strncasecmp (const char *a, const char *b, size_t n) -{ - const unsigned char *p1 = (const unsigned char *)a; - const unsigned char *p2 = (const unsigned char *)b; - unsigned char c1, c2; - - if (p1 == p2 || !n ) - return 0; - - do - { - c1 = ascii_tolower (*p1); - c2 = ascii_tolower (*p2); - - if ( !--n || c1 == '\0') - break; - - ++p1; - ++p2; - } - while (c1 == c2); - - return c1 - c2; -} - - -int -ascii_memcasecmp (const void *a_arg, const void *b_arg, size_t n ) -{ - const char *a = a_arg; - const char *b = b_arg; - - if (a == b) - return 0; - for ( ; n; n--, a++, b++ ) - { - if( *a != *b && ascii_toupper (*a) != ascii_toupper (*b) ) - return *a == *b? 0 : (ascii_toupper (*a) - ascii_toupper (*b)); - } - return 0; -} - -int -ascii_strcmp( const char *a, const char *b ) -{ - if (a == b) - return 0; - - for (; *a && *b; a++, b++) { - if (*a != *b ) - break; - } - return *a == *b? 0 : (*(signed char *)a - *(signed char *)b); -} - - -void * -ascii_memcasemem (const void *haystack, size_t nhaystack, - const void *needle, size_t nneedle) -{ - - if (!nneedle) - return (void*)haystack; /* finding an empty needle is really easy */ - if (nneedle <= nhaystack) - { - const char *a = haystack; - const char *b = a + nhaystack - nneedle; - - for (; a <= b; a++) - { - if ( !ascii_memcasecmp (a, needle, nneedle) ) - return (void *)a; - } - } - return NULL; -} - -/********************************************* - ********** missing string functions ********* - *********************************************/ - -#ifndef HAVE_STPCPY -char * -stpcpy(char *a,const char *b) -{ - while( *b ) - *a++ = *b++; - *a = 0; - - return (char*)a; -} -#endif - -#ifndef HAVE_STRSEP -/* Code taken from glibc-2.2.1/sysdeps/generic/strsep.c. */ -char * -strsep (char **stringp, const char *delim) -{ - char *begin, *end; - - begin = *stringp; - if (begin == NULL) - return NULL; - - /* A frequent case is when the delimiter string contains only one - character. Here we don't need to call the expensive `strpbrk' - function and instead work using `strchr'. */ - if (delim[0] == '\0' || delim[1] == '\0') - { - char ch = delim[0]; - - if (ch == '\0') - end = NULL; - else - { - if (*begin == ch) - end = begin; - else if (*begin == '\0') - end = NULL; - else - end = strchr (begin + 1, ch); - } - } - else - /* Find the end of the token. */ - end = strpbrk (begin, delim); - - if (end) - { - /* Terminate the token and set *STRINGP past NUL character. */ - *end++ = '\0'; - *stringp = end; - } - else - /* No more delimiters; this is the last token. */ - *stringp = NULL; - - return begin; -} -#endif /*HAVE_STRSEP*/ - - -#ifndef HAVE_STRLWR -char * -strlwr(char *s) -{ - char *p; - for(p=s; *p; p++ ) - *p = tolower(*p); - return s; -} -#endif - - -#ifndef HAVE_STRCASECMP -int -strcasecmp( const char *a, const char *b ) -{ - for( ; *a && *b; a++, b++ ) { - if( *a != *b && toupper(*a) != toupper(*b) ) - break; - } - return *(const byte*)a - *(const byte*)b; -} -#endif - - -/**************** - * mingw32/cpd has a memicmp() - */ -#ifndef HAVE_MEMICMP -int -memicmp( const char *a, const char *b, size_t n ) -{ - for( ; n; n--, a++, b++ ) - if( *a != *b && toupper(*(const byte*)a) != toupper(*(const byte*)b) ) - return *(const byte *)a - *(const byte*)b; - return 0; -} -#endif - - -#ifndef HAVE_MEMRCHR -void * -memrchr (const void *buffer, int c, size_t n) -{ - const unsigned char *p = buffer; - - for (p += n; n ; n--) - if (*--p == c) - return (void *)p; - return NULL; -} -#endif /*HAVE_MEMRCHR*/ - - -/* Percent-escape the string STR by replacing colons with '%3a'. If - EXTRA is not NULL all characters in EXTRA are also escaped. */ -static char * -do_percent_escape (const char *str, const char *extra, int die) -{ - int i, j; - char *ptr; - - if (!str) - return NULL; - - for (i=j=0; str[i]; i++) - if (str[i] == ':' || str[i] == '%' || (extra && strchr (extra, str[i]))) - j++; - if (die) - ptr = jnlib_xmalloc (i + 2 * j + 1); - else - { - ptr = jnlib_malloc (i + 2 * j + 1); - if (!ptr) - return NULL; - } - i = 0; - while (*str) - { - if (*str == ':') - { - ptr[i++] = '%'; - ptr[i++] = '3'; - ptr[i++] = 'a'; - } - else if (*str == '%') - { - ptr[i++] = '%'; - ptr[i++] = '2'; - ptr[i++] = '5'; - } - else if (extra && strchr (extra, *str)) - { - ptr[i++] = '%'; - ptr[i++] = tohex_lower ((*str>>4)&15); - ptr[i++] = tohex_lower (*str&15); - } - else - ptr[i++] = *str; - str++; - } - ptr[i] = '\0'; - - return ptr; -} - -/* Percent-escape the string STR by replacing colons with '%3a'. If - EXTRA is not NULL all characters in EXTRA are also escaped. This - function terminates the process on memory shortage. */ -char * -percent_escape (const char *str, const char *extra) -{ - return do_percent_escape (str, extra, 1); -} - -/* Same as percent_escape but return NULL instead of exiting on memory - error. */ -char * -try_percent_escape (const char *str, const char *extra) -{ - return do_percent_escape (str, extra, 0); -} - - - -static char * -do_strconcat (const char *s1, va_list arg_ptr) -{ - const char *argv[48]; - size_t argc; - size_t needed; - char *buffer, *p; - - argc = 0; - argv[argc++] = s1; - needed = strlen (s1); - while (((argv[argc] = va_arg (arg_ptr, const char *)))) - { - needed += strlen (argv[argc]); - if (argc >= DIM (argv)-1) - { - jnlib_set_errno (EINVAL); - return NULL; - } - argc++; - } - needed++; - buffer = jnlib_malloc (needed); - if (buffer) - { - for (p = buffer, argc=0; argv[argc]; argc++) - p = stpcpy (p, argv[argc]); - } - return buffer; -} - - -/* Concatenate the string S1 with all the following strings up to a - NULL. Returns a malloced buffer with the new string or NULL on a - malloc error or if too many arguments are given. */ -char * -strconcat (const char *s1, ...) -{ - va_list arg_ptr; - char *result; - - if (!s1) - result = jnlib_strdup (""); - else - { - va_start (arg_ptr, s1); - result = do_strconcat (s1, arg_ptr); - va_end (arg_ptr); - } - return result; -} - -/* Same as strconcat but terminate the process with an error message - if something goes wrong. */ -char * -xstrconcat (const char *s1, ...) -{ - va_list arg_ptr; - char *result; - - if (!s1) - result = jnlib_xstrdup (""); - else - { - va_start (arg_ptr, s1); - result = do_strconcat (s1, arg_ptr); - va_end (arg_ptr); - } - if (!result) - { - if (errno == EINVAL) - fputs ("\nfatal: too many args for xstrconcat\n", stderr); - else - fputs ("\nfatal: out of memory\n", stderr); - exit (2); - } - return result; -} - diff --git a/jnlib/stringhelp.h b/jnlib/stringhelp.h deleted file mode 100644 index a560b163e..000000000 --- a/jnlib/stringhelp.h +++ /dev/null @@ -1,136 +0,0 @@ -/* stringhelp.h - * Copyright (C) 1998, 1999, 2000, 2001, 2003, - * 2006, 2007, 2009 Free Software Foundation, Inc. - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef LIBJNLIB_STRINGHELP_H -#define LIBJNLIB_STRINGHELP_H - -#include "types.h" - -const char *memistr (const void *buf, size_t buflen, const char *sub); -char *mem2str( char *, const void *, size_t); -char *trim_spaces( char *string ); -char *trim_trailing_spaces( char *string ); -unsigned int trim_trailing_chars( unsigned char *line, unsigned len, - const char *trimchars); -unsigned int trim_trailing_ws( unsigned char *line, unsigned len ); -size_t length_sans_trailing_chars (const unsigned char *line, size_t len, - const char *trimchars ); -size_t length_sans_trailing_ws (const unsigned char *line, size_t len); - - -char *make_basename(const char *filepath, const char *inputpath); -char *make_dirname(const char *filepath); -char *make_filename( const char *first_part, ... ) GNUPG_GCC_A_SENTINEL(0); -char *make_filename_try (const char *first_part, ... ) GNUPG_GCC_A_SENTINEL(0); -int compare_filenames( const char *a, const char *b ); - -int hextobyte (const char *s); - -size_t print_sanitized_buffer (FILE *fp, const void *buffer, size_t length, - int delim); -size_t print_sanitized_buffer2 (FILE *fp, const void *buffer, size_t length, - int delim, int delim2); -size_t print_sanitized_utf8_buffer (FILE *fp, const void *buffer, - size_t length, int delim); -size_t print_sanitized_string (FILE *fp, const char *string, int delim); -size_t print_sanitized_string2 (FILE *fp, const char *string, - int delim, int delim2); -size_t print_sanitized_utf8_string (FILE *fp, const char *string, int delim); -char *sanitize_buffer (const void *p, size_t n, int delim); - - -size_t utf8_charcount (const char *s); - - -#ifdef HAVE_W32_SYSTEM -const char *w32_strerror (int ec); -#endif - - -int ascii_isupper (int c); -int ascii_islower (int c); -int ascii_toupper (int c); -int ascii_tolower (int c); -int ascii_strcasecmp( const char *a, const char *b ); -int ascii_strncasecmp (const char *a, const char *b, size_t n); -int ascii_memcasecmp( const void *a, const void *b, size_t n ); -const char *ascii_memistr ( const void *buf, size_t buflen, const char *sub); -void *ascii_memcasemem (const void *haystack, size_t nhaystack, - const void *needle, size_t nneedle); - - -#ifndef HAVE_MEMICMP -int memicmp( const char *a, const char *b, size_t n ); -#endif -#ifndef HAVE_STPCPY -char *stpcpy(char *a,const char *b); -#endif -#ifndef HAVE_STRSEP -char *strsep (char **stringp, const char *delim); -#endif -#ifndef HAVE_STRLWR -char *strlwr(char *a); -#endif -#ifndef HAVE_STRTOUL -# define strtoul(a,b,c) ((unsigned long)strtol((a),(b),(c))) -#endif -#ifndef HAVE_MEMMOVE -# define memmove(d, s, n) bcopy((s), (d), (n)) -#endif -#ifndef HAVE_STRICMP -# define stricmp(a,b) strcasecmp( (a), (b) ) -#endif -#ifndef HAVE_MEMRCHR -void *memrchr (const void *buffer, int c, size_t n); -#endif - - -#ifndef HAVE_ISASCII -static inline int -isascii (int c) -{ - return (((c) & ~0x7f) == 0); -} -#endif /* !HAVE_ISASCII */ - - -#ifndef STR -# define STR(v) #v -#endif -#define STR2(v) STR(v) - -/* Percent-escape the string STR by replacing colons with '%3a'. If - EXTRA is not NULL, also replace all characters given in EXTRA. The - "try_" variant fails with NULL if not enough memory can be - allocated. */ -char *percent_escape (const char *str, const char *extra); -char *try_percent_escape (const char *str, const char *extra); - - -/* Concatenate the string S1 with all the following strings up to a - NULL. Returns a malloced buffer with the new string or NULL on a - malloc error or if too many arguments are given. */ -char *strconcat (const char *s1, ...) GNUPG_GCC_A_SENTINEL(0); -/* Ditto, but die on error. */ -char *xstrconcat (const char *s1, ...) GNUPG_GCC_A_SENTINEL(0); - - - -#endif /*LIBJNLIB_STRINGHELP_H*/ diff --git a/jnlib/strlist.c b/jnlib/strlist.c deleted file mode 100644 index b31e6213a..000000000 --- a/jnlib/strlist.c +++ /dev/null @@ -1,204 +0,0 @@ -/* strlist.c - string helpers - * Copyright (C) 1998, 2000, 2001, 2006 Free Software Foundation, Inc. - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include <config.h> -#include <stdlib.h> -#include <string.h> -#include <stdarg.h> -#include <ctype.h> - -#include "libjnlib-config.h" -#include "strlist.h" -#ifdef JNLIB_NEED_UTF8CONV -#include "utf8conv.h" -#endif - -void -free_strlist( strlist_t sl ) -{ - strlist_t sl2; - - for(; sl; sl = sl2 ) { - sl2 = sl->next; - jnlib_free(sl); - } -} - - -/* Add STRING to the LIST at the front. This function terminates the - process on memory shortage. */ -strlist_t -add_to_strlist( strlist_t *list, const char *string ) -{ - strlist_t sl; - - sl = jnlib_xmalloc( sizeof *sl + strlen(string)); - sl->flags = 0; - strcpy(sl->d, string); - sl->next = *list; - *list = sl; - return sl; -} - - -/* Add STRING to the LIST at the front. This function returns NULL - and sets ERRNO on memory shortage. */ -strlist_t -add_to_strlist_try (strlist_t *list, const char *string) -{ - strlist_t sl; - - sl = jnlib_malloc (sizeof *sl + strlen (string)); - if (sl) - { - sl->flags = 0; - strcpy (sl->d, string); - sl->next = *list; - *list = sl; - } - return sl; -} - - -/* Same as add_to_strlist() but if IS_UTF8 is *not* set, a conversion - to UTF-8 is done. This function terminates the process on memory - shortage. */ -#ifdef JNLIB_NEED_UTF8CONV -strlist_t -add_to_strlist2( strlist_t *list, const char *string, int is_utf8 ) -{ - strlist_t sl; - - if (is_utf8) - sl = add_to_strlist( list, string ); - else - { - char *p = native_to_utf8( string ); - sl = add_to_strlist( list, p ); - jnlib_free ( p ); - } - return sl; -} -#endif /* JNLIB_NEED_UTF8CONV*/ - - -/* Add STRING to the LIST at the end. This function terminates the - process on memory shortage. */ -strlist_t -append_to_strlist( strlist_t *list, const char *string ) -{ - strlist_t r, sl; - - sl = jnlib_xmalloc( sizeof *sl + strlen(string)); - sl->flags = 0; - strcpy(sl->d, string); - sl->next = NULL; - if( !*list ) - *list = sl; - else { - for( r = *list; r->next; r = r->next ) - ; - r->next = sl; - } - return sl; -} - - -#ifdef JNLIB_NEED_UTF8CONV -strlist_t -append_to_strlist2( strlist_t *list, const char *string, int is_utf8 ) -{ - strlist_t sl; - - if( is_utf8 ) - sl = append_to_strlist( list, string ); - else - { - char *p = native_to_utf8 (string); - sl = append_to_strlist( list, p ); - jnlib_free( p ); - } - return sl; -} -#endif /* JNLIB_NEED_UTF8CONV */ - - -/* Return a copy of LIST. This function terminates the process on - memory shortage.*/ -strlist_t -strlist_copy (strlist_t list) -{ - strlist_t newlist = NULL, sl, *last; - - last = &newlist; - for (; list; list = list->next) - { - sl = jnlib_xmalloc (sizeof *sl + strlen (list->d)); - sl->flags = list->flags; - strcpy(sl->d, list->d); - sl->next = NULL; - *last = sl; - last = &sl; - } - return newlist; -} - - - -strlist_t -strlist_prev( strlist_t head, strlist_t node ) -{ - strlist_t n; - - for(n=NULL; head && head != node; head = head->next ) - n = head; - return n; -} - -strlist_t -strlist_last( strlist_t node ) -{ - if( node ) - for( ; node->next ; node = node->next ) - ; - return node; -} - - -/* Remove the first item from LIST and return its content in an - allocated buffer. This function terminates the process on memory - shortage. */ -char * -strlist_pop (strlist_t *list) -{ - char *str=NULL; - strlist_t sl=*list; - - if(sl) - { - str=jnlib_xmalloc(strlen(sl->d)+1); - strcpy(str,sl->d); - - *list=sl->next; - jnlib_free(sl); - } - - return str; -} - diff --git a/jnlib/strlist.h b/jnlib/strlist.h deleted file mode 100644 index 1e2ffa8da..000000000 --- a/jnlib/strlist.h +++ /dev/null @@ -1,50 +0,0 @@ -/* strlist.h - * Copyright (C) 1998, 2000, 2001, 2006 Free Software Foundation, Inc. - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef LIBJNLIB_STRLIST_H -#define LIBJNLIB_STRLIST_H - -struct string_list -{ - struct string_list *next; - unsigned int flags; - char d[1]; -}; -typedef struct string_list *strlist_t; - -void free_strlist (strlist_t sl); -strlist_t add_to_strlist (strlist_t *list, const char *string); -strlist_t add_to_strlist_try (strlist_t *list, const char *string); - -strlist_t add_to_strlist2( strlist_t *list, const char *string, int is_utf8); - -strlist_t append_to_strlist (strlist_t *list, const char *string); -strlist_t append_to_strlist2 (strlist_t *list, const char *string, - int is_utf8); - -strlist_t strlist_copy (strlist_t list); - -strlist_t strlist_prev (strlist_t head, strlist_t node); -strlist_t strlist_last (strlist_t node); -char * strlist_pop (strlist_t *list); - -#define FREE_STRLIST(a) do { free_strlist((a)); (a) = NULL ; } while(0) - - -#endif /*LIBJNLIB_STRLIST_H*/ diff --git a/jnlib/t-stringhelp.c b/jnlib/t-stringhelp.c deleted file mode 100644 index 0c921b03d..000000000 --- a/jnlib/t-stringhelp.c +++ /dev/null @@ -1,414 +0,0 @@ -/* t-stringhelp.c - Regression tests for stringhelp.c - * Copyright (C) 2007 Free Software Foundation, Inc. - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include <config.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#ifdef HAVE_PWD_H -# include <pwd.h> -#endif -#include <unistd.h> -#include <sys/types.h> - -#include "stringhelp.h" - -#include "t-support.h" - - -static char *home_buffer; - - -const char * -gethome (void) -{ - if (!home_buffer) - { - char *home = getenv("HOME"); - - if(home) - home_buffer = xstrdup (home); -#if defined(HAVE_GETPWUID) && defined(HAVE_PWD_H) - else - { - struct passwd *pwd; - - pwd = getpwuid (getuid()); - if (pwd) - home_buffer = xstrdup (pwd->pw_dir); - } -#endif - } - return home_buffer; -} - - -static void -test_percent_escape (void) -{ - char *result; - static struct { - const char *extra; - const char *value; - const char *expected; - } tests[] = - { - { NULL, "", "" }, - { NULL, "%", "%25" }, - { NULL, "%%", "%25%25" }, - { NULL, " %", " %25" }, - { NULL, ":", "%3a" }, - { NULL, " :", " %3a" }, - { NULL, ": ", "%3a " }, - { NULL, " : ", " %3a " }, - { NULL, "::", "%3a%3a" }, - { NULL, ": :", "%3a %3a" }, - { NULL, "%:", "%25%3a" }, - { NULL, ":%", "%3a%25" }, - { "\\\n:", ":%", "%3a%25" }, - { "\\\n:", "\\:%", "%5c%3a%25" }, - { "\\\n:", "\n:%", "%0a%3a%25" }, - { "\\\n:", "\xff:%", "\xff%3a%25" }, - { "\\\n:", "\xfe:%", "\xfe%3a%25" }, - { "\\\n:", "\x01:%", "\x01%3a%25" }, - { "\x01", "\x01:%", "%01%3a%25" }, - { "\xfe", "\xfe:%", "%fe%3a%25" }, - { "\xfe", "\xff:%", "\xff%3a%25" }, - - { NULL, NULL, NULL } - }; - int testno; - - result = percent_escape (NULL, NULL); - if (result) - fail (0); - for (testno=0; tests[testno].value; testno++) - { - result = percent_escape (tests[testno].value, tests[testno].extra); - if (!result) - fail (testno); - if (strcmp (result, tests[testno].expected)) - fail (testno); - xfree (result); - } - -} - - -static void -test_compare_filenames (void) -{ - struct { - const char *a; - const char *b; - int result; - } tests[] = { - { "", "", 0 }, - { "", "a", -1 }, - { "a", "", 1 }, - { "a", "a", 0 }, - { "a", "aa", -1 }, - { "aa", "a", 1 }, - { "a", "b", -1 }, - -#ifdef HAVE_W32_SYSTEM - { "a", "A", 0 }, - { "A", "a", 0 }, - { "foo/bar", "foo\\bar", 0 }, - { "foo\\bar", "foo/bar", 0 }, - { "foo\\", "foo/", 0 }, - { "foo/", "foo\\", 0 }, -#endif /*HAVE_W32_SYSTEM*/ - { NULL, NULL, 0} - }; - int testno, result; - - for (testno=0; tests[testno].a; testno++) - { - result = compare_filenames (tests[testno].a, tests[testno].b); - result = result < 0? -1 : result > 0? 1 : 0; - if (result != tests[testno].result) - fail (testno); - } -} - - -static void -test_strconcat (void) -{ - char *out; - - out = strconcat ("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", NULL); - if (!out) - fail (0); - else - xfree (out); - out = strconcat ("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", "8", NULL); - if (out) - fail (0); - else if (errno != EINVAL) - fail (0); - - out = strconcat ("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", "8", "9", NULL); - if (out) - fail (0); - else if (errno != EINVAL) - fail (0); - -#if __GNUC__ < 4 /* gcc 4.0 has a sentinel attribute. */ - out = strconcat (NULL); - if (!out || *out) - fail (1); -#endif - out = strconcat (NULL, NULL); - if (!out || *out) - fail (1); - out = strconcat ("", NULL); - if (!out || *out) - fail (1); - xfree (out); - - out = strconcat ("", "", NULL); - if (!out || *out) - fail (2); - xfree (out); - - out = strconcat ("a", "b", NULL); - if (!out || strcmp (out, "ab")) - fail (3); - xfree (out); - out = strconcat ("a", "b", "c", NULL); - if (!out || strcmp (out, "abc")) - fail (3); - xfree (out); - - out = strconcat ("a", "b", "cc", NULL); - if (!out || strcmp (out, "abcc")) - fail (4); - xfree (out); - out = strconcat ("a1", "b1", "c1", NULL); - if (!out || strcmp (out, "a1b1c1")) - fail (4); - xfree (out); - - out = strconcat ("", " long b ", "", "--even-longer--", NULL); - if (!out || strcmp (out, " long b --even-longer--")) - fail (5); - xfree (out); - - out = strconcat ("", " long b ", "", "--even-longer--", NULL); - if (!out || strcmp (out, " long b --even-longer--")) - fail (5); - xfree (out); -} - -static void -test_xstrconcat (void) -{ - char *out; - - out = xstrconcat ("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", NULL); - if (!out) - fail (0); - -#if __GNUC__ < 4 /* gcc 4.0 has a sentinel attribute. */ - out = xstrconcat (NULL); - if (!out) - fail (1); -#endif - out = xstrconcat (NULL, NULL); - if (!out) - fail (1); - out = xstrconcat ("", NULL); - if (!out || *out) - fail (1); - xfree (out); - - out = xstrconcat ("", "", NULL); - if (!out || *out) - fail (2); - xfree (out); - - out = xstrconcat ("a", "b", NULL); - if (!out || strcmp (out, "ab")) - fail (3); - xfree (out); - out = xstrconcat ("a", "b", "c", NULL); - if (!out || strcmp (out, "abc")) - fail (3); - xfree (out); - - out = xstrconcat ("a", "b", "cc", NULL); - if (!out || strcmp (out, "abcc")) - fail (4); - xfree (out); - out = xstrconcat ("a1", "b1", "c1", NULL); - if (!out || strcmp (out, "a1b1c1")) - fail (4); - xfree (out); - - out = xstrconcat ("", " long b ", "", "--even-longer--", NULL); - if (!out || strcmp (out, " long b --even-longer--")) - fail (5); - xfree (out); - - out = xstrconcat ("", " long b ", "", "--even-longer--", NULL); - if (!out || strcmp (out, " long b --even-longer--")) - fail (5); - xfree (out); -} - - -static void -test_make_filename_try (void) -{ - char *out; - const char *home = gethome (); - size_t homelen = home? strlen (home):0; - - out = make_filename_try ("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", NULL); - if (out) - fail (0); - else if (errno != EINVAL) - fail (0); - xfree (out); - out = make_filename_try ("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", NULL); - if (out) - fail (0); - else if (errno != EINVAL) - fail (0); - xfree (out); - - out = make_filename_try ("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - "1", "2", NULL); - if (!out || strcmp (out, - "1/2/3/4/5/6/7/8/9/10/" - "1/2/3/4/5/6/7/8/9/10/" - "1/2/3/4/5/6/7/8/9/10/" - "1/2")) - fail (0); - xfree (out); - - out = make_filename_try ("foo", "~/bar", "baz/cde", NULL); - if (!out || strcmp (out, "foo/~/bar/baz/cde")) - fail (1); - xfree (out); - - out = make_filename_try ("foo", "~/bar", "baz/cde/", NULL); - if (!out || strcmp (out, "foo/~/bar/baz/cde/")) - fail (1); - xfree (out); - - out = make_filename_try ("/foo", "~/bar", "baz/cde/", NULL); - if (!out || strcmp (out, "/foo/~/bar/baz/cde/")) - fail (1); - xfree (out); - - out = make_filename_try ("//foo", "~/bar", "baz/cde/", NULL); - if (!out || strcmp (out, "//foo/~/bar/baz/cde/")) - fail (1); - xfree (out); - - out = make_filename_try ("", "~/bar", "baz/cde", NULL); - if (!out || strcmp (out, "/~/bar/baz/cde")) - fail (1); - xfree (out); - - - out = make_filename_try ("~/foo", "bar", NULL); - if (!out) - fail (2); - if (home) - { - if (strlen (out) < homelen + 7) - fail (2); - if (strncmp (out, home, homelen)) - fail (2); - if (strcmp (out+homelen, "/foo/bar")) - fail (2); - } - else - { - if (strcmp (out, "~/foo/bar")) - fail (2); - } - xfree (out); - - out = make_filename_try ("~", "bar", NULL); - if (!out) - fail (2); - if (home) - { - if (strlen (out) < homelen + 3) - fail (2); - if (strncmp (out, home, homelen)) - fail (2); - if (strcmp (out+homelen, "/bar")) - fail (2); - } - else - { - if (strcmp (out, "~/bar")) - fail (2); - } - xfree (out); -} - - -int -main (int argc, char **argv) -{ - (void)argc; - (void)argv; - - test_percent_escape (); - test_compare_filenames (); - test_strconcat (); - test_xstrconcat (); - test_make_filename_try (); - - xfree (home_buffer); - return 0; -} - diff --git a/jnlib/t-support.c b/jnlib/t-support.c deleted file mode 100644 index bf05c4c06..000000000 --- a/jnlib/t-support.c +++ /dev/null @@ -1,147 +0,0 @@ -/* t-support.c - helper functions for the regression tests. - * Copyright (C) 2007 Free Software Foundation, Inc. - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include <config.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <assert.h> - -#include "t-support.h" - - -/* Replacements for the malloc functions as used here. */ - -static void -out_of_memory (void) -{ - fprintf (stderr,"error: out of core in regression tests: %s\n", - strerror (errno)); - exit (2); -} - - -void * -gcry_malloc (size_t n) -{ - return malloc (n); -} - -void * -gcry_xmalloc (size_t n) -{ - void *p = malloc (n); - if (!p) - out_of_memory (); - return p; -} - -char * -gcry_strdup (const char *string) -{ - char *p = malloc (strlen (string)+1); - if (p) - strcpy (p, string); - return p; -} - - -void * -gcry_realloc (void *a, size_t n) -{ - return realloc (a, n); -} - -void * -gcry_xrealloc (void *a, size_t n) -{ - void *p = realloc (a, n); - if (!p) - out_of_memory (); - return p; -} - - - -void * -gcry_calloc (size_t n, size_t m) -{ - return calloc (n, m); -} - -void * -gcry_xcalloc (size_t n, size_t m) -{ - void *p = calloc (n, m); - if (!p) - out_of_memory (); - return p; -} - - -char * -gcry_xstrdup (const char *string) -{ - void *p = malloc (strlen (string)+1); - if (!p) - out_of_memory (); - strcpy (p, string); - return p; -} - -void -gcry_free (void *a) -{ - if (a) - free (a); -} - - - -/* Stubs for gpg-error functions required because some compilers do - not eliminate the supposed-to-be-unused-inline-functions and thus - require functions called from these inline fucntions. Although we - do not use gpg-error, gpg-error.h may get included via gcrypt.h if - it happens to be used used in libjnlib-config.h. */ -#ifndef GPG_ERROR_H /* Don't do this if gpg-error.h has been included. */ -int -gpg_err_code_from_errno (int err) -{ - (void)err; - assert (!"stub function"); - return -1; -} -#endif /*GPG_ERROR_H*/ - - -/* Retrieve the error code directly from the ERRNO variable. This - returns GPG_ERR_UNKNOWN_ERRNO if the system error is not mapped - (report this) and GPG_ERR_MISSING_ERRNO if ERRNO has the value 0. */ -#ifndef GPG_ERROR_H /* Don't do this if gpg-error.h has been included. */ -int -gpg_err_code_from_syserror (void) -{ - assert (!"stub function"); - return -1; -} -#endif /*GPG_ERROR_H*/ - - - diff --git a/jnlib/t-support.h b/jnlib/t-support.h deleted file mode 100644 index 2dfbc0990..000000000 --- a/jnlib/t-support.h +++ /dev/null @@ -1,60 +0,0 @@ -/* t-support.h - Helper for the regression tests - * Copyright (C) 2007 Free Software Foundation, Inc. - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef LIBJNLIB_T_SUPPORT_H -#define LIBJNLIB_T_SUPPORT_H 1 - -#ifdef GCRYPT_VERSION -#error The regression tests should not include with gcrypt.h -#endif - -#ifdef HAVE_W32CE_SYSTEM -#include <gpg-error.h> /* Defines strerror. */ -#endif - - -#ifndef HAVE_GETENV -# define getenv(a) (NULL) -#endif - - -/* Replacement prototypes. */ -void *gcry_xmalloc (size_t n); -void *gcry_xcalloc (size_t n, size_t m); -void *gcry_xrealloc (void *a, size_t n); -char *gcry_xstrdup (const char * a); -void gcry_free (void *a); - -/* Map the used xmalloc functions to those implemented by t-support.c */ -#define xmalloc(a) gcry_xmalloc ( (a) ) -#define xcalloc(a,b) gcry_xcalloc ( (a), (b) ) -#define xrealloc(a,n) gcry_xrealloc ( (a), (n) ) -#define xstrdup(a) gcry_xstrdup ( (a) ) -#define xfree(a) gcry_free ( (a) ) - - -/* Macros to print the result of a test. */ -#define pass() do { ; } while(0) -#define fail(a) do { fprintf (stderr, "%s:%d: test %d failed\n",\ - __FILE__,__LINE__, (a)); \ - exit (1); \ - } while(0) - - -#endif /*LIBJNLIB_T_SUPPORT_H*/ diff --git a/jnlib/t-timestuff.c b/jnlib/t-timestuff.c deleted file mode 100644 index 46816765d..000000000 --- a/jnlib/t-timestuff.c +++ /dev/null @@ -1,145 +0,0 @@ -/* t-timestuff.c - Regression tests for time functions - * Copyright (C) 2007 Free Software Foundation, Inc. - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include <config.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <time.h> - -#include "mischelp.h" - -#include "t-support.h" - - -static int -cmp_time_s (struct tm *a, struct tm *b) -{ - if (a->tm_year != b->tm_year - || a->tm_mon != b->tm_mon - || a->tm_mday != b->tm_mday - || a->tm_hour != b->tm_hour - || a->tm_min != b->tm_min - || a->tm_sec != b->tm_sec - || a->tm_wday != b->tm_wday - || a->tm_yday != b->tm_yday - || !a->tm_isdst != !b->tm_isdst) - return -1; - return 0; -} - - - -static void -test_timegm (void) -{ - static struct { - int year, mon, mday, hour, min, sec; - } tvalues[] = { - { -1 }, - { -2, 1 }, - { -2, 2 }, - { -2, 86399 }, - { -2, 86400 }, - { -2, 0x7ffffffe }, - { -2, 0x7fffffff }, - /* Note: Because we use mktime below we can only start with the - day after Epoch. */ - { 1970, 1, 2, 0, 0 , 1}, - { 1970, 1, 2, 0, 0 , 2}, - { 1970, 1, 2, 12, 0 , 0}, - { 1970, 1, 2, 23, 59 , 59}, - { 1999, 12, 31, 23, 59 , 59}, - { 2000, 1, 1, 0, 0, 0}, - { 2000, 1, 1, 0, 0, 1}, - { 2010, 12, 31, 23, 59 , 59}, - { 2010, 1, 1, 0, 0, 0}, - { 2010, 1, 1, 0, 0, 1}, - /* The date below is about the last time mktime works in CET on - Windows XP; this is a somewhat strange because 32 bit Unices - will happily work along for another month until they reach the - end of all ticks on 20380119T031408 (unless Uli takes - compassion on us and changes time_t to a u64). */ - { 2037, 12, 18, 23, 59, 59} - - }; - int tidx; - time_t now, atime, counter; - struct tm tbuf, tbuf2, *tp; - - counter = 0; - for (tidx=0; tidx < DIM (tvalues); tidx++) - { - if (tvalues[tidx].year == -1) - { - now = time (NULL); - } - else if (tvalues[tidx].year == -2) - { - now = tvalues[tidx].mon; - } - else - { - memset (&tbuf, 0, sizeof tbuf); - tbuf.tm_year = tvalues[tidx].year - 1900; - tbuf.tm_mon = tvalues[tidx].mon; - tbuf.tm_mday = tvalues[tidx].mday; - tbuf.tm_hour = tvalues[tidx].hour; - tbuf.tm_min = tvalues[tidx].min; - tbuf.tm_sec = tvalues[tidx].sec; - now = mktime (&tbuf); - } - if (now == (time_t)(-1)) - fail (tidx); - - tp = gmtime (&now); - if (!tp) - fail (tidx); - tbuf = *tp; - tbuf2 = tbuf; - atime = timegm (&tbuf); - if (atime == (time_t)(-1)) - fail (tidx); - if (atime != now) - fail (tidx); - - tp = gmtime (&atime); - if (!tp) - fail (tidx); - if (cmp_time_s (tp, &tbuf)) - fail (tidx); - if (cmp_time_s (tp, &tbuf2)) - fail (tidx); - } -} - - - -int -main (int argc, char **argv) -{ - (void)argc; - (void)argv; - - test_timegm (); - - return 0; -} - diff --git a/jnlib/t-w32-reg.c b/jnlib/t-w32-reg.c deleted file mode 100644 index f4848cbaa..000000000 --- a/jnlib/t-w32-reg.c +++ /dev/null @@ -1,70 +0,0 @@ -/* t-w32-reg.c - Regression tests for W32 registry functions - * Copyright (C) 2010 Free Software Foundation, Inc. - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include <config.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <time.h> - -#include "mischelp.h" - -#include "t-support.h" -#include "w32help.h" - - -static void -test_read_registry (void) -{ - char *string; - -#ifdef HAVE_W32CE_SYSTEM - string = read_w32_registry_string ("HKEY_CLASSES_ROOT", - "BOOTSTRAP\\CLSID", NULL); - if (!string) - fail (0); - fprintf (stderr, "Bootstrap clsid: %s\n", string); - xfree (string); -#endif - - string = read_w32_registry_string - ("HKEY_CURRENT_USER", - "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", - "User Agent"); - if (!string) - fail (0); - fprintf (stderr, "User agent: %s\n", string); - xfree (string); -} - - - - -int -main (int argc, char **argv) -{ - (void)argc; - (void)argv; - - test_read_registry (); - - return 0; -} - diff --git a/jnlib/types.h b/jnlib/types.h deleted file mode 100644 index 62fa0470d..000000000 --- a/jnlib/types.h +++ /dev/null @@ -1,114 +0,0 @@ -/* types.h - define some extra types - * Copyright (C) 1999, 2000, 2001, 2006 Free Software Foundation, Inc. - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef LIBJNLIB_TYPES_H -#define LIBJNLIB_TYPES_H - -/* The AC_CHECK_SIZEOF() in configure fails for some machines. - * we provide some fallback values here */ -#if !SIZEOF_UNSIGNED_SHORT -# undef SIZEOF_UNSIGNED_SHORT -# define SIZEOF_UNSIGNED_SHORT 2 -#endif -#if !SIZEOF_UNSIGNED_INT -# undef SIZEOF_UNSIGNED_INT -# define SIZEOF_UNSIGNED_INT 4 -#endif -#if !SIZEOF_UNSIGNED_LONG -# undef SIZEOF_UNSIGNED_LONG -# define SIZEOF_UNSIGNED_LONG 4 -#endif - - -#include <sys/types.h> - - -#ifndef HAVE_BYTE_TYPEDEF -# undef byte /* There might be a macro with this name. */ -/* Windows typedefs byte in the rpc headers. Avoid warning about - double definition. */ -#if !(defined(_WIN32) && defined(cbNDRContext)) - typedef unsigned char byte; -#endif -# define HAVE_BYTE_TYPEDEF -#endif - -#ifndef HAVE_USHORT_TYPEDEF -# undef ushort /* There might be a macro with this name. */ - typedef unsigned short ushort; -# define HAVE_USHORT_TYPEDEF -#endif - -#ifndef HAVE_ULONG_TYPEDEF -# undef ulong /* There might be a macro with this name. */ - typedef unsigned long ulong; -# define HAVE_ULONG_TYPEDEF -#endif - -#ifndef HAVE_U16_TYPEDEF -# undef u16 /* There might be a macro with this name. */ -# if SIZEOF_UNSIGNED_INT == 2 - typedef unsigned int u16; -# elif SIZEOF_UNSIGNED_SHORT == 2 - typedef unsigned short u16; -# else -# error no typedef for u16 -# endif -# define HAVE_U16_TYPEDEF -#endif - -#ifndef HAVE_U32_TYPEDEF -# undef u32 /* There might be a macro with this name. */ -# if SIZEOF_UNSIGNED_INT == 4 - typedef unsigned int u32; -# elif SIZEOF_UNSIGNED_LONG == 4 - typedef unsigned long u32; -# else -# error no typedef for u32 -# endif -# define HAVE_U32_TYPEDEF -#endif - -#ifndef HAVE_U64_TYPEDEF -# undef u64 /* There might be a macro with this name. */ -# if SIZEOF_UNSIGNED_INT == 8 - typedef unsigned int u64; -# define HAVE_U64_TYPEDEF -# elif SIZEOF_UNSIGNED_LONG == 8 - typedef unsigned long u64; -# define HAVE_U64_TYPEDEF -# elif __GNUC__ >= 2 || defined(__SUNPRO_C) - typedef unsigned long long u64; -# define HAVE_U64_TYPEDEF -# endif -#endif - - -/* Some GCC attributes. Note that we use also define some in - mischelp.h, but this header and types.h are not always included. - Should eventually be put into one file (e.g. nlib-common.h). */ -#if __GNUC__ >= 4 -# define GNUPG_GCC_A_SENTINEL(a) __attribute__ ((sentinel(a))) -#else -# define GNUPG_GCC_A_SENTINEL(a) -#endif - - - -#endif /*LIBJNLIB_TYPES_H*/ diff --git a/jnlib/utf8conv.c b/jnlib/utf8conv.c deleted file mode 100644 index 6cbe4e92c..000000000 --- a/jnlib/utf8conv.c +++ /dev/null @@ -1,813 +0,0 @@ -/* utf8conf.c - UTF8 character set conversion - * Copyright (C) 1994, 1998, 1999, 2000, 2001, 2003, 2006, - * 2008, 2010 Free Software Foundation, Inc. - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include <config.h> -#include <stdlib.h> -#include <string.h> -#include <stdarg.h> -#include <ctype.h> -#ifdef HAVE_LANGINFO_CODESET -#include <langinfo.h> -#endif -#include <errno.h> -#ifndef HAVE_W32_SYSTEM -# include <iconv.h> -#endif - -#include "libjnlib-config.h" -#include "stringhelp.h" -#include "dynload.h" -#include "utf8conv.h" - -#ifndef MB_LEN_MAX -#define MB_LEN_MAX 16 -#endif - -static const char *active_charset_name = "iso-8859-1"; -static int no_translation; /* Set to true if we let simply pass through. */ -static int use_iconv; /* iconv comversion fucntions required. */ - - -/* Under W32 we dlopen the iconv dll and don't require any iconv - related headers at all. However we need to define some stuff. */ -#ifdef HAVE_W32_SYSTEM -typedef void *iconv_t; -#ifndef ICONV_CONST -#define ICONV_CONST -#endif -static iconv_t (* __stdcall iconv_open) (const char *tocode, - const char *fromcode); -static size_t (* __stdcall iconv) (iconv_t cd, - char **inbuf, size_t *inbytesleft, - char **outbuf, size_t *outbytesleft); -static int (* __stdcall iconv_close) (iconv_t cd); - -static int -load_libiconv (void) -{ - static int done; - - if (!done) - { - void *handle; - - done = 1; /* Do it right now because we might get called recursivly - through gettext. */ - - handle = dlopen ("iconv.dll", RTLD_LAZY); - if (handle) - { - iconv_open = dlsym (handle, "libiconv_open"); - if (iconv_open) - iconv = dlsym (handle, "libiconv"); - if (iconv) - iconv_close = dlsym (handle, "libiconv_close"); - } - if (!handle || !iconv_close) - { - log_info (_("error loading `%s': %s\n"), - "iconv.dll", dlerror ()); - log_info (_("please see %s for more information\n"), - "http://www.gnupg.org/download/iconv.html"); - iconv_open = NULL; - iconv = NULL; - iconv_close = NULL; - if (handle) - dlclose (handle); - } - } - return iconv_open? 0: -1; -} -#endif /*HAVE_W32_SYSTEM*/ - - -/* Error handler for iconv failures. This is needed to not clutter the - output with repeated diagnostics about a missing conversion. */ -static void -handle_iconv_error (const char *to, const char *from, int use_fallback) -{ - if (errno == EINVAL) - { - static int shown1, shown2; - int x; - - if (to && !strcmp (to, "utf-8")) - { - x = shown1; - shown1 = 1; - } - else - { - x = shown2; - shown2 = 1; - } - - if (!x) - log_info (_("conversion from `%s' to `%s' not available\n"), - from, to); - } - else - { - static int shown; - - if (!shown) - log_info (_("iconv_open failed: %s\n"), strerror (errno)); - shown = 1; - } - - if (use_fallback) - { - /* To avoid further error messages we fallback to Latin-1 for the - native encoding. This is justified as one can expect that on a - utf-8 enabled system nl_langinfo() will work and thus we won't - never get to here. Thus Latin-1 seems to be a reasonable - default. */ - active_charset_name = "iso-8859-1"; - no_translation = 0; - use_iconv = 0; - } -} - - - -int -set_native_charset (const char *newset) -{ - const char *full_newset; - - if (!newset) - { -#ifdef HAVE_W32_SYSTEM - static char codepage[30]; - unsigned int cpno; - const char *aliases; - - /* We are a console program thus we need to use the - GetConsoleOutputCP function and not the the GetACP which - would give the codepage for a GUI program. Note this is not - a bulletproof detection because GetConsoleCP might return a - different one for console input. Not sure how to cope with - that. If the console Code page is not known we fall back to - the system code page. */ -#ifndef HAVE_W32CE_SYSTEM - cpno = GetConsoleOutputCP (); - if (!cpno) -#endif - cpno = GetACP (); - sprintf (codepage, "CP%u", cpno ); - /* Resolve alias. We use a long string string and not the usual - array to optimize if the code is taken to a DSO. Taken from - libiconv 1.9.2. */ - newset = codepage; - for (aliases = ("CP936" "\0" "GBK" "\0" - "CP1361" "\0" "JOHAB" "\0" - "CP20127" "\0" "ASCII" "\0" - "CP20866" "\0" "KOI8-R" "\0" - "CP21866" "\0" "KOI8-RU" "\0" - "CP28591" "\0" "ISO-8859-1" "\0" - "CP28592" "\0" "ISO-8859-2" "\0" - "CP28593" "\0" "ISO-8859-3" "\0" - "CP28594" "\0" "ISO-8859-4" "\0" - "CP28595" "\0" "ISO-8859-5" "\0" - "CP28596" "\0" "ISO-8859-6" "\0" - "CP28597" "\0" "ISO-8859-7" "\0" - "CP28598" "\0" "ISO-8859-8" "\0" - "CP28599" "\0" "ISO-8859-9" "\0" - "CP28605" "\0" "ISO-8859-15" "\0" - "CP65001" "\0" "UTF-8" "\0"); - *aliases; - aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1) - { - if (!strcmp (codepage, aliases) ||(*aliases == '*' && !aliases[1])) - { - newset = aliases + strlen (aliases) + 1; - break; - } - } - -#else /*!HAVE_W32_SYSTEM*/ - -#ifdef HAVE_LANGINFO_CODESET - newset = nl_langinfo (CODESET); -#else /*!HAVE_LANGINFO_CODESET*/ - /* Try to get the used charset from environment variables. */ - static char codepage[30]; - const char *lc, *dot, *mod; - - strcpy (codepage, "iso-8859-1"); - lc = getenv ("LC_ALL"); - if (!lc || !*lc) - { - lc = getenv ("LC_CTYPE"); - if (!lc || !*lc) - lc = getenv ("LANG"); - } - if (lc && *lc) - { - dot = strchr (lc, '.'); - if (dot) - { - mod = strchr (++dot, '@'); - if (!mod) - mod = dot + strlen (dot); - if (mod - dot < sizeof codepage && dot != mod) - { - memcpy (codepage, dot, mod - dot); - codepage [mod - dot] = 0; - } - } - } - newset = codepage; -#endif /*!HAVE_LANGINFO_CODESET*/ -#endif /*!HAVE_W32_SYSTEM*/ - } - - full_newset = newset; - if (strlen (newset) > 3 && !ascii_memcasecmp (newset, "iso", 3)) - { - newset += 3; - if (*newset == '-' || *newset == '_') - newset++; - } - - /* Note that we silently assume that plain ASCII is actually meant - as Latin-1. This makes sense because many Unix system don't have - their locale set up properly and thus would get annoying error - messages and we have to handle all the "bug" reports. Latin-1 has - always been the character set used for 8 bit characters on Unix - systems. */ - if ( !*newset - || !ascii_strcasecmp (newset, "8859-1" ) - || !ascii_strcasecmp (newset, "646" ) - || !ascii_strcasecmp (newset, "ASCII" ) - || !ascii_strcasecmp (newset, "ANSI_X3.4-1968" ) - ) - { - active_charset_name = "iso-8859-1"; - no_translation = 0; - use_iconv = 0; - } - else if ( !ascii_strcasecmp (newset, "utf8" ) - || !ascii_strcasecmp(newset, "utf-8") ) - { - active_charset_name = "utf-8"; - no_translation = 1; - use_iconv = 0; - } - else - { - iconv_t cd; - -#ifdef HAVE_W32_SYSTEM - if (load_libiconv ()) - return -1; -#endif /*HAVE_W32_SYSTEM*/ - - cd = iconv_open (full_newset, "utf-8"); - if (cd == (iconv_t)-1) - { - handle_iconv_error (full_newset, "utf-8", 0); - return -1; - } - iconv_close (cd); - cd = iconv_open ("utf-8", full_newset); - if (cd == (iconv_t)-1) - { - handle_iconv_error ("utf-8", full_newset, 0); - return -1; - } - iconv_close (cd); - active_charset_name = full_newset; - no_translation = 0; - use_iconv = 1; - } - return 0; -} - -const char * -get_native_charset () -{ - return active_charset_name; -} - -/* Return true if the native charset is utf-8. */ -int -is_native_utf8 (void) -{ - return no_translation; -} - - -/* Convert string, which is in native encoding to UTF8 and return a - new allocated UTF-8 string. This function terminates the process - on memory shortage. */ -char * -native_to_utf8 (const char *orig_string) -{ - const unsigned char *string = (const unsigned char *)orig_string; - const unsigned char *s; - char *buffer; - unsigned char *p; - size_t length = 0; - - if (no_translation) - { - /* Already utf-8 encoded. */ - buffer = jnlib_xstrdup (orig_string); - } - else if (!use_iconv) - { - /* For Latin-1 we can avoid the iconv overhead. */ - for (s = string; *s; s++) - { - length++; - if (*s & 0x80) - length++; - } - buffer = jnlib_xmalloc (length + 1); - for (p = (unsigned char *)buffer, s = string; *s; s++) - { - if ( (*s & 0x80 )) - { - *p++ = 0xc0 | ((*s >> 6) & 3); - *p++ = 0x80 | (*s & 0x3f); - } - else - *p++ = *s; - } - *p = 0; - } - else - { - /* Need to use iconv. */ - iconv_t cd; - const char *inptr; - char *outptr; - size_t inbytes, outbytes; - - cd = iconv_open ("utf-8", active_charset_name); - if (cd == (iconv_t)-1) - { - handle_iconv_error ("utf-8", active_charset_name, 1); - return native_to_utf8 (string); - } - - for (s=string; *s; s++ ) - { - length++; - if ((*s & 0x80)) - length += 5; /* We may need up to 6 bytes for the utf8 output. */ - } - buffer = jnlib_xmalloc (length + 1); - - inptr = string; - inbytes = strlen (string); - outptr = buffer; - outbytes = length; - if ( iconv (cd, (ICONV_CONST char **)&inptr, &inbytes, - &outptr, &outbytes) == (size_t)-1) - { - static int shown; - - if (!shown) - log_info (_("conversion from `%s' to `%s' failed: %s\n"), - active_charset_name, "utf-8", strerror (errno)); - shown = 1; - /* We don't do any conversion at all but use the strings as is. */ - strcpy (buffer, string); - } - else /* Success. */ - { - *outptr = 0; - /* We could realloc the buffer now but I doubt that it makes - much sense given that it will get freed anyway soon - after. */ - } - iconv_close (cd); - } - return buffer; -} - - - -static char * -do_utf8_to_native (const char *string, size_t length, int delim, - int with_iconv) -{ - int nleft; - int i; - unsigned char encbuf[8]; - int encidx; - const unsigned char *s; - size_t n; - char *buffer = NULL; - char *p = NULL; - unsigned long val = 0; - size_t slen; - int resync = 0; - - /* First pass (p==NULL): count the extended utf-8 characters. */ - /* Second pass (p!=NULL): create string. */ - for (;;) - { - for (slen = length, nleft = encidx = 0, n = 0, - s = (const unsigned char *)string; - slen; - s++, slen--) - { - if (resync) - { - if (!(*s < 128 || (*s >= 0xc0 && *s <= 0xfd))) - { - /* Still invalid. */ - if (p) - { - sprintf (p, "\\x%02x", *s); - p += 4; - } - n += 4; - continue; - } - resync = 0; - } - if (!nleft) - { - if (!(*s & 0x80)) - { - /* Plain ascii. */ - if ( delim != -1 - && (*s < 0x20 || *s == 0x7f || *s == delim - || (delim && *s == '\\'))) - { - n++; - if (p) - *p++ = '\\'; - switch (*s) - { - case '\n': n++; if ( p ) *p++ = 'n'; break; - case '\r': n++; if ( p ) *p++ = 'r'; break; - case '\f': n++; if ( p ) *p++ = 'f'; break; - case '\v': n++; if ( p ) *p++ = 'v'; break; - case '\b': n++; if ( p ) *p++ = 'b'; break; - case 0: n++; if ( p ) *p++ = '0'; break; - default: - n += 3; - if (p) - { - sprintf (p, "x%02x", *s); - p += 3; - } - break; - } - } - else - { - if (p) - *p++ = *s; - n++; - } - } - else if ((*s & 0xe0) == 0xc0) /* 110x xxxx */ - { - val = *s & 0x1f; - nleft = 1; - encidx = 0; - encbuf[encidx++] = *s; - } - else if ((*s & 0xf0) == 0xe0) /* 1110 xxxx */ - { - val = *s & 0x0f; - nleft = 2; - encidx = 0; - encbuf[encidx++] = *s; - } - else if ((*s & 0xf8) == 0xf0) /* 1111 0xxx */ - { - val = *s & 0x07; - nleft = 3; - encidx = 0; - encbuf[encidx++] = *s; - } - else if ((*s & 0xfc) == 0xf8) /* 1111 10xx */ - { - val = *s & 0x03; - nleft = 4; - encidx = 0; - encbuf[encidx++] = *s; - } - else if ((*s & 0xfe) == 0xfc) /* 1111 110x */ - { - val = *s & 0x01; - nleft = 5; - encidx = 0; - encbuf[encidx++] = *s; - } - else /* Invalid encoding: print as \xNN. */ - { - if (p) - { - sprintf (p, "\\x%02x", *s); - p += 4; - } - n += 4; - resync = 1; - } - } - else if (*s < 0x80 || *s >= 0xc0) /* Invalid utf-8 */ - { - if (p) - { - for (i = 0; i < encidx; i++) - { - sprintf (p, "\\x%02x", encbuf[i]); - p += 4; - } - sprintf (p, "\\x%02x", *s); - p += 4; - } - n += 4 + 4 * encidx; - nleft = 0; - encidx = 0; - resync = 1; - } - else - { - encbuf[encidx++] = *s; - val <<= 6; - val |= *s & 0x3f; - if (!--nleft) /* Ready. */ - { - if (no_translation) - { - if (p) - { - for (i = 0; i < encidx; i++) - *p++ = encbuf[i]; - } - n += encidx; - encidx = 0; - } - else if (with_iconv) - { - /* Our strategy for using iconv is a bit strange - but it better keeps compatibility with - previous versions in regard to how invalid - encodings are displayed. What we do is to - keep the utf-8 as is and have the real - translation step then at the end. Yes, I - know that this is ugly. However we are short - of the 1.4 release and for this branch we - should not mess too much around with iconv - things. One reason for this is that we don't - know enough about non-GNU iconv - implementation and want to minimize the risk - of breaking the code on too many platforms. */ - if ( p ) - { - for (i=0; i < encidx; i++ ) - *p++ = encbuf[i]; - } - n += encidx; - encidx = 0; - } - else /* Latin-1 case. */ - { - if (val >= 0x80 && val < 256) - { - /* We can simply print this character */ - n++; - if (p) - *p++ = val; - } - else - { - /* We do not have a translation: print utf8. */ - if (p) - { - for (i = 0; i < encidx; i++) - { - sprintf (p, "\\x%02x", encbuf[i]); - p += 4; - } - } - n += encidx * 4; - encidx = 0; - } - } - } - - } - } - if (!buffer) - { - /* Allocate the buffer after the first pass. */ - buffer = p = jnlib_xmalloc (n + 1); - } - else if (with_iconv) - { - /* Note: See above for comments. */ - iconv_t cd; - const char *inptr; - char *outbuf, *outptr; - size_t inbytes, outbytes; - - *p = 0; /* Terminate the buffer. */ - - cd = iconv_open (active_charset_name, "utf-8"); - if (cd == (iconv_t)-1) - { - handle_iconv_error (active_charset_name, "utf-8", 1); - jnlib_free (buffer); - return utf8_to_native (string, length, delim); - } - - /* Allocate a new buffer large enough to hold all possible - encodings. */ - n = p - buffer + 1; - inbytes = n - 1;; - inptr = buffer; - outbytes = n * MB_LEN_MAX; - if (outbytes / MB_LEN_MAX != n) - BUG (); /* Actually an overflow. */ - outbuf = outptr = jnlib_xmalloc (outbytes); - if ( iconv (cd, (ICONV_CONST char **)&inptr, &inbytes, - &outptr, &outbytes) == (size_t)-1) - { - static int shown; - - if (!shown) - log_info (_("conversion from `%s' to `%s' failed: %s\n"), - "utf-8", active_charset_name, strerror (errno)); - shown = 1; - /* Didn't worked out. Try again but without iconv. */ - jnlib_free (buffer); - buffer = NULL; - jnlib_free (outbuf); - outbuf = do_utf8_to_native (string, length, delim, 0); - } - else /* Success. */ - { - *outptr = 0; /* Make sure it is a string. */ - /* We could realloc the buffer now but I doubt that it - makes much sense given that it will get freed - anyway soon after. */ - jnlib_free (buffer); - } - iconv_close (cd); - return outbuf; - } - else /* Not using iconv. */ - { - *p = 0; /* Make sure it is a string. */ - return buffer; - } - } -} - -/* Convert string, which is in UTF-8 to native encoding. Replace - illegal encodings by some "\xnn" and quote all control - characters. A character with value DELIM will always be quoted, it - must be a vanilla ASCII character. A DELIM value of -1 is special: - it disables all quoting of control characters. This function - terminates the process on memory shortage. */ -char * -utf8_to_native (const char *string, size_t length, int delim) -{ - return do_utf8_to_native (string, length, delim, use_iconv); -} - - - - -/* Wrapper function for iconv_open, required for W32 as we dlopen that - library on that system. */ -jnlib_iconv_t -jnlib_iconv_open (const char *tocode, const char *fromcode) -{ -#ifdef HAVE_W32_SYSTEM - if (load_libiconv ()) - return (jnlib_iconv_t)(-1); -#endif /*HAVE_W32_SYSTEM*/ - - return (jnlib_iconv_t)iconv_open (tocode, fromcode); -} - - -/* Wrapper function for iconv, required for W32 as we dlopen that - library on that system. */ -size_t -jnlib_iconv (jnlib_iconv_t cd, - const char **inbuf, size_t *inbytesleft, - char **outbuf, size_t *outbytesleft) -{ - -#ifdef HAVE_W32_SYSTEM - if (load_libiconv ()) - return 0; -#endif /*HAVE_W32_SYSTEM*/ - - return iconv ((iconv_t)cd, (char**)inbuf, inbytesleft, outbuf, outbytesleft); -} - -/* Wrapper function for iconv_close, required for W32 as we dlopen that - library on that system. */ -int -jnlib_iconv_close (jnlib_iconv_t cd) -{ -#ifdef HAVE_W32_SYSTEM - if (load_libiconv ()) - return 0; -#endif /*HAVE_W32_SYSTEM*/ - - return iconv_close ((iconv_t)cd); -} - - -#ifdef HAVE_W32_SYSTEM -/* Return a malloced string encoded in UTF-8 from the wide char input - string STRING. Caller must free this value. Returns NULL and sets - ERRNO on failure. Calling this function with STRING set to NULL is - not defined. */ -char * -wchar_to_utf8 (const wchar_t *string) -{ - int n; - char *result; - - n = WideCharToMultiByte (CP_UTF8, 0, string, -1, NULL, 0, NULL, NULL); - if (n < 0) - { - jnlib_set_errno (EINVAL); - return NULL; - } - - result = jnlib_malloc (n+1); - if (!result) - return NULL; - - n = WideCharToMultiByte (CP_UTF8, 0, string, -1, result, n, NULL, NULL); - if (n < 0) - { - jnlib_free (result); - jnlib_set_errno (EINVAL); - result = NULL; - } - return result; -} - - -/* Return a malloced wide char string from an UTF-8 encoded input - string STRING. Caller must free this value. Returns NULL and sets - ERRNO on failure. Calling this function with STRING set to NULL is - not defined. */ -wchar_t * -utf8_to_wchar (const char *string) -{ - int n; - size_t nbytes; - wchar_t *result; - - n = MultiByteToWideChar (CP_UTF8, 0, string, -1, NULL, 0); - if (n < 0) - { - jnlib_set_errno (EINVAL); - return NULL; - } - - nbytes = (size_t)(n+1) * sizeof(*result); - if (nbytes / sizeof(*result) != (n+1)) - { - jnlib_set_errno (ENOMEM); - return NULL; - } - result = malloc (nbytes); - if (!result) - return NULL; - - n = MultiByteToWideChar (CP_UTF8, 0, string, -1, result, n); - if (n < 0) - { - free (result); - jnlib_set_errno (EINVAL); - result = NULL; - } - return result; -} -#endif /*HAVE_W32_SYSTEM*/ diff --git a/jnlib/utf8conv.h b/jnlib/utf8conv.h deleted file mode 100644 index 28dd450dd..000000000 --- a/jnlib/utf8conv.h +++ /dev/null @@ -1,45 +0,0 @@ -/* utf8conf.h - * Copyright (C) 2003, 2006 Free Software Foundation, Inc. - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef LIBJNLIB_UTF8CONF_H -#define LIBJNLIB_UTF8CONF_H - -int set_native_charset (const char *newset); -const char *get_native_charset (void); -int is_native_utf8 (void); - -char *native_to_utf8 (const char *string); -char *utf8_to_native (const char *string, size_t length, int delim); - - -/* Silly wrappers, required for W32 portability. */ -typedef void *jnlib_iconv_t; - -jnlib_iconv_t jnlib_iconv_open (const char *tocode, const char *fromcode); -size_t jnlib_iconv (jnlib_iconv_t cd, const char **inbuf, size_t *inbytesleft, - char **outbuf, size_t *outbytesleft); -int jnlib_iconv_close (jnlib_iconv_t cd); - -#ifdef HAVE_W32_SYSTEM -char *wchar_to_utf8 (const wchar_t *string); -wchar_t *utf8_to_wchar (const char *string); -#endif /*HAVE_W32_SYSTEM*/ - - -#endif /*LIBJNLIB_UTF8CONF_H*/ diff --git a/jnlib/w32-afunix.c b/jnlib/w32-afunix.c deleted file mode 100644 index 579621491..000000000 --- a/jnlib/w32-afunix.c +++ /dev/null @@ -1,138 +0,0 @@ -/* w32-afunix.c - AF_UNIX emulation for Windows (Client only). - * Copyright (C) 2004, 2006 g10 Code GmbH - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -/* Use of this code is preprecated - you better use the sockt wrappers - from libassuan. */ - -#ifdef _WIN32 -#include <stdio.h> -#include <stdlib.h> -#define WIN32_LEAN_AND_MEAN -#include <windows.h> -#include <fcntl.h> -#include <sys/stat.h> -#include <io.h> -#include <errno.h> - -#include "w32-afunix.h" - - - -/* The buffer for NONCE needs to be at least 16 bytes. Returns 0 on - success. */ -static int -read_port_and_nonce (const char *fname, unsigned short *port, char *nonce) -{ - FILE *fp; - char buffer[50], *p; - size_t nread; - int aval; - - fp = fopen (fname, "rb"); - if (!fp) - return -1; - nread = fread (buffer, 1, sizeof buffer - 1, fp); - fclose (fp); - if (!nread) - { -#warning remove this file - jnlib_set_errno (EIO); - return -1; - } - buffer[nread] = 0; - aval = atoi (buffer); - if (aval < 1 || aval > 65535) - { - jnlib_set_errno (EINVAL); - return -1; - } - *port = (unsigned int)aval; - for (p=buffer; nread && *p != '\n'; p++, nread--) - ; - if (*p != '\n' || nread != 17) - { - jnlib_set_errno (EINVAL); - return -1; - } - p++; nread--; - memcpy (nonce, p, 16); - return 0; -} - - - -int -_w32_close (int fd) -{ - int rc = closesocket (fd); - if (rc && WSAGetLastError () == WSAENOTSOCK) - rc = close (fd); - return rc; -} - - -int -_w32_sock_new (int domain, int type, int proto) -{ - if (domain == AF_UNIX || domain == AF_LOCAL) - domain = AF_INET; - return socket (domain, type, proto); -} - - -int -_w32_sock_connect (int sockfd, struct sockaddr *addr, int addrlen) -{ - struct sockaddr_in myaddr; - struct sockaddr_un *unaddr; - unsigned short port; - char nonce[16]; - int ret; - - (void)addrlen; - - unaddr = (struct sockaddr_un *)addr; - if (read_port_and_nonce (unaddr->sun_path, &port, nonce)) - return -1; - - myaddr.sin_family = AF_INET; - myaddr.sin_port = htons (port); - myaddr.sin_addr.s_addr = htonl (INADDR_LOOPBACK); - - /* Set return values. */ - unaddr->sun_family = myaddr.sin_family; - unaddr->sun_port = myaddr.sin_port; - unaddr->sun_addr.s_addr = myaddr.sin_addr.s_addr; - - ret = connect (sockfd, (struct sockaddr *)&myaddr, sizeof myaddr); - if (!ret) - { - /* Send the nonce. */ - ret = send (sockfd, nonce, 16, 0); - if (ret >= 0 && ret != 16) - { - jnlib_set_errno (EIO); - ret = -1; - } - } - return ret; -} - - -#endif /*_WIN32*/ diff --git a/jnlib/w32-afunix.h b/jnlib/w32-afunix.h deleted file mode 100644 index 23681ddeb..000000000 --- a/jnlib/w32-afunix.h +++ /dev/null @@ -1,52 +0,0 @@ -/* w32-afunix.h - AF_UNIX emulation for Windows - * Copyright (C) 2004, 2006 g10 Code GmbH - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifdef _WIN32 -#ifndef W32AFUNIX_DEFS_H -#define W32AFUNIX_DEFS_H - -#include <sys/types.h> -#include <windows.h> -#include <ws2tcpip.h> -#include <unistd.h> - -/* We can easiliy replace this code by the socket wrappers from libassuan. */ -#warning Please do not use this module anymore - -#define DIRSEP_C '\\' - -#define AF_LOCAL AF_UNIX -/* We need to prefix the structure with a sockaddr_in header so we can - use it later for sendto and recvfrom. */ -struct sockaddr_un -{ - short sun_family; - unsigned short sun_port; - struct in_addr sun_addr; - char sun_path[108-2-4]; /* Path name. */ -}; - - -int _w32_close (int fd); -int _w32_sock_new (int domain, int type, int proto); -int _w32_sock_connect (int sockfd, struct sockaddr *addr, int addrlen); - - -#endif /*W32AFUNIX_DEFS_H*/ -#endif /*_WIN32*/ diff --git a/jnlib/w32-reg.c b/jnlib/w32-reg.c deleted file mode 100644 index 5809c32bb..000000000 --- a/jnlib/w32-reg.c +++ /dev/null @@ -1,312 +0,0 @@ -/* w32-reg.c - MS-Windows Registry access - * Copyright (C) 1999, 2002, 2007 Free Software Foundation, Inc. - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include <config.h> -#ifdef HAVE_W32_SYSTEM - /* This module is only used in this environment */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <stdarg.h> -#include <windows.h> - -#include "libjnlib-config.h" -#include "utf8conv.h" -#include "w32help.h" - - -static HKEY -get_root_key(const char *root) -{ - HKEY root_key; - - if (!root) - root_key = HKEY_CURRENT_USER; - else if (!strcmp( root, "HKEY_CLASSES_ROOT" ) ) - root_key = HKEY_CLASSES_ROOT; - else if (!strcmp( root, "HKEY_CURRENT_USER" ) ) - root_key = HKEY_CURRENT_USER; - else if (!strcmp( root, "HKEY_LOCAL_MACHINE" ) ) - root_key = HKEY_LOCAL_MACHINE; - else if (!strcmp( root, "HKEY_USERS" ) ) - root_key = HKEY_USERS; - else if (!strcmp( root, "HKEY_PERFORMANCE_DATA" ) ) - root_key = HKEY_PERFORMANCE_DATA; - else if (!strcmp( root, "HKEY_CURRENT_CONFIG" ) ) - root_key = HKEY_CURRENT_CONFIG; - else - return NULL; - - return root_key; -} - - -/* Return a string from the Win32 Registry or NULL in case of error. - Caller must release the return value. A NULL for root is an alias - for HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE in turn. */ -char * -read_w32_registry_string (const char *root, const char *dir, const char *name) -{ -#ifdef HAVE_W32CE_SYSTEM - HKEY root_key, key_handle; - DWORD n1, nbytes, type; - char *result = NULL; - wchar_t *wdir, *wname; - - if ( !(root_key = get_root_key(root) ) ) - return NULL; - - wdir = utf8_to_wchar (dir); - if (!wdir) - return NULL; - - if (RegOpenKeyEx (root_key, wdir, 0, KEY_READ, &key_handle) ) - { - if (root) - { - jnlib_free (wdir); - return NULL; /* No need for a RegClose, so return immediately. */ - } - /* It seems to be common practise to fall back to HKLM. */ - if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, wdir, 0, KEY_READ, &key_handle) ) - { - jnlib_free (wdir); - return NULL; /* Still no need for a RegClose. */ - } - } - jnlib_free (wdir); - - if (name) - { - wname = utf8_to_wchar (name); - if (!wname) - goto leave; - } - else - wname = NULL; - - nbytes = 2; - if (RegQueryValueEx (key_handle, wname, 0, NULL, NULL, &nbytes)) - goto leave; - result = jnlib_malloc ((n1=nbytes+2)); - if (!result) - goto leave; - if (RegQueryValueEx (key_handle, wname, 0, &type, result, &n1)) - { - jnlib_free (result); - result = NULL; - goto leave; - } - result[nbytes] = 0; /* Make sure it is a string. */ - result[nbytes+1] = 0; - if (type == REG_SZ || type == REG_EXPAND_SZ) - { - wchar_t *tmp = (void*)result; - result = wchar_to_utf8 (tmp); - jnlib_free (tmp); - } - - leave: - jnlib_free (wname); - RegCloseKey (key_handle); - return result; -#else /*!HAVE_W32CE_SYSTEM*/ - HKEY root_key, key_handle; - DWORD n1, nbytes, type; - char *result = NULL; - - if ( !(root_key = get_root_key(root) ) ) - return NULL; - - if (RegOpenKeyEx (root_key, dir, 0, KEY_READ, &key_handle) ) - { - if (root) - return NULL; /* No need for a RegClose, so return immediately. */ - /* It seems to be common practise to fall back to HKLM. */ - if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, dir, 0, KEY_READ, &key_handle) ) - return NULL; /* Still no need for a RegClose. */ - } - - nbytes = 1; - if (RegQueryValueEx( key_handle, name, 0, NULL, NULL, &nbytes ) ) - goto leave; - result = jnlib_malloc ((n1=nbytes+1)); - if (!result) - goto leave; - if (RegQueryValueEx( key_handle, name, 0, &type, result, &n1 )) - { - jnlib_free (result); - result = NULL; - goto leave; - } - result[nbytes] = 0; /* Make sure it is a string. */ - if (type == REG_EXPAND_SZ && strchr (result, '%')) - { - char *tmp; - - n1 += 1000; - tmp = jnlib_malloc (n1+1); - if (!tmp) - goto leave; - nbytes = ExpandEnvironmentStrings (result, tmp, n1); - if (nbytes && nbytes > n1) - { - jnlib_free (tmp); - n1 = nbytes; - tmp = jnlib_malloc (n1 + 1); - if (!tmp) - goto leave; - nbytes = ExpandEnvironmentStrings (result, tmp, n1); - if (nbytes && nbytes > n1) - { - /* Oops - truncated, better don't expand at all. */ - jnlib_free (tmp); - goto leave; - } - tmp[nbytes] = 0; - jnlib_free (result); - result = tmp; - } - else if (nbytes) - { - /* Okay, reduce the length. */ - tmp[nbytes] = 0; - jnlib_free (result); - result = jnlib_malloc (strlen (tmp)+1); - if (!result) - result = tmp; - else - { - strcpy (result, tmp); - jnlib_free (tmp); - } - } - else - { - /* Error - don't expand. */ - jnlib_free (tmp); - } - } - - leave: - RegCloseKey (key_handle); - return result; -#endif /*!HAVE_W32CE_SYSTEM*/ -} - - -/* Note: This code is not well tested. However, it is not used in - GnuPG. */ -int -write_w32_registry_string (const char *root, const char *dir, - const char *name, const char *value) -{ - HKEY root_key, reg_key; -#ifdef HAVE_W32CE_SYSTEM - wchar_t *wdir, *wname, *wvalue; - DWORD disp; - - if ( !(root_key = get_root_key(root) ) ) - return -1; - - wdir = utf8_to_wchar (dir); - if (!wdir) - return -1; - - if (RegOpenKeyEx (root_key, wdir, 0, 0, ®_key)) - { - jnlib_free (wdir); - return -1; - } - jnlib_free (wdir); - - if (name) - { - wname = utf8_to_wchar (name); - if (!wname) - return -1; - } - else - wname = NULL; - - wvalue = utf8_to_wchar (value); - if (wvalue) - { - jnlib_free (wname); - return -1; - } - - if (RegSetValueEx (reg_key, wname, 0, REG_SZ, - (BYTE *)wvalue, wcslen (wvalue)) != ERROR_SUCCESS ) - { - - if (RegCreateKeyEx (root_key, wname, 0, NULL, 0, 0, NULL, - ®_key, &disp) != ERROR_SUCCESS) - { - RegCloseKey(reg_key); - jnlib_free (wname); - jnlib_free (wvalue); - return -1; - } - if (RegSetValueEx (reg_key, wname, 0, REG_SZ, - (BYTE *)wvalue, wcslen (wvalue)) != ERROR_SUCCESS ) - { - RegCloseKey(reg_key); - jnlib_free (wname); - jnlib_free (wvalue); - return -1; - } - } - - jnlib_free (wname); - jnlib_free (wvalue); - RegCloseKey (reg_key); - return 0; -#else /*!HAVE_W32CE_SYSTEM*/ - - if ( !(root_key = get_root_key(root) ) ) - return -1; - - if ( RegOpenKeyEx( root_key, dir, 0, KEY_WRITE, ®_key ) - != ERROR_SUCCESS ) - return -1; - - if ( RegSetValueEx (reg_key, name, 0, REG_SZ, (BYTE *)value, - strlen( value ) ) != ERROR_SUCCESS ) - { - if ( RegCreateKey( root_key, name, ®_key ) != ERROR_SUCCESS ) - { - RegCloseKey(reg_key); - return -1; - } - if ( RegSetValueEx (reg_key, name, 0, REG_SZ, (BYTE *)value, - strlen( value ) ) != ERROR_SUCCESS ) - { - RegCloseKey(reg_key); - return -1; - } - } - - RegCloseKey (reg_key); - return 0; -#endif /*!HAVE_W32CE_SYSTEM*/ -} - -#endif /*HAVE_W32_SYSTEM*/ diff --git a/jnlib/w32help.h b/jnlib/w32help.h deleted file mode 100644 index 518d4251c..000000000 --- a/jnlib/w32help.h +++ /dev/null @@ -1,32 +0,0 @@ -/* w32help.h - W32 speicif functions - * Copyright (C) 2007 Free Software Foundation, Inc. - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef LIBJNLIB_W32HELP_H -#define LIBJNLIB_W32HELP_H -#ifdef HAVE_W32_SYSTEM - -/*-- w32-reg.c --*/ -char *read_w32_registry_string (const char *root, - const char *dir, const char *name ); -int write_w32_registry_string (const char *root, const char *dir, - const char *name, const char *value); - - -#endif /*HAVE_W32_SYSTEM*/ -#endif /*LIBJNLIB_MISCHELP_H*/ diff --git a/jnlib/xmalloc.c b/jnlib/xmalloc.c deleted file mode 100644 index eb6d5ab11..000000000 --- a/jnlib/xmalloc.c +++ /dev/null @@ -1,87 +0,0 @@ -/* xmalloc.c - standard malloc wrappers - * Copyright (C) 1999, 2000, 2001, 2006 Free Software Foundation, Inc. - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include <config.h> -#include <stdlib.h> -#include <string.h> -#include <stdio.h> - -#include "libjnlib-config.h" -#include "xmalloc.h" - -static void -out_of_core(void) -{ - fputs("\nfatal: out of memory\n", stderr ); - exit(2); -} - - -void * -xmalloc( size_t n ) -{ - void *p = malloc( n ); - if( !p ) - out_of_core(); - return p; -} - -void * -xrealloc( void *a, size_t n ) -{ - void *p = realloc( a, n ); - if( !p ) - out_of_core(); - return p; -} - -void * -xcalloc( size_t n, size_t m ) -{ - void *p = calloc( n, m ); - if( !p ) - out_of_core(); - return p; -} - -char * -xstrdup( const char *string ) -{ - void *p = xmalloc( strlen(string)+1 ); - strcpy( p, string ); - return p; -} - - -char * -xstrcat2( const char *a, const char *b ) -{ - size_t n1; - char *p; - - if( !b ) - return xstrdup( a ); - - n1 = strlen(a); - p = xmalloc( n1 + strlen(b) + 1 ); - memcpy(p, a, n1 ); - strcpy(p+n1, b ); - return p; -} - diff --git a/jnlib/xmalloc.h b/jnlib/xmalloc.h deleted file mode 100644 index 8c9c5292b..000000000 --- a/jnlib/xmalloc.h +++ /dev/null @@ -1,30 +0,0 @@ -/* xmalloc.h - * Copyright (C) 1999, 2000, 2001, 2006 Free Software Foundation, Inc. - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * JNLIB 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef LIBJNLIB_XMALLOC_H -#define LIBJNLIB_XMALLOC_H - -void *xmalloc( size_t n ); -void *xrealloc( void *a, size_t n ); -void *xcalloc( size_t n, size_t m ); -char *xstrdup( const char *string ); -char *xstrcat2( const char *a, const char *b ); - - -#endif /*LIBJNLIB_XMALLOC_H*/ |