diff -pruN 5.1.58-1/BUILD/check-cpu 5.1.61-2/BUILD/check-cpu
--- 5.1.58-1/BUILD/check-cpu	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/BUILD/check-cpu	2011-12-16 19:06:02.000000000 +0000
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-# Copyright (C) 2005, 2008 MySQL AB, 2009 Sun Microsystems, Inc.
+# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
 # 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
 # 
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
 
 #
 # Check cpu of current machine and find the
diff -pruN 5.1.58-1/BUILD/compile-dist 5.1.61-2/BUILD/compile-dist
--- 5.1.58-1/BUILD/compile-dist	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/BUILD/compile-dist	2011-12-16 19:06:02.000000000 +0000
@@ -1,6 +1,7 @@
 #!/bin/sh
 
-# Copyright (C) 2004, 2006 MySQL AB, 2008, 2009 Sun Microsystems, Inc.
+# Copyright (c) 2004-2008 MySQL AB, 2008, 2009 Sun Microsystems, Inc.
+# Use is subject to license terms.
 # 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +14,7 @@
 # 
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
 
 #
 # This script's purpose is to update the automake/autoconf helper scripts and
diff -pruN 5.1.58-1/BUILD/compile-pentium64-valgrind-max 5.1.61-2/BUILD/compile-pentium64-valgrind-max
--- 5.1.58-1/BUILD/compile-pentium64-valgrind-max	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/BUILD/compile-pentium64-valgrind-max	2011-12-16 19:06:02.000000000 +0000
@@ -1,6 +1,6 @@
 #! /bin/sh
 
-# Copyright (C) 2005 MySQL AB
+# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
 # 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
 # 
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
 
 path=`dirname $0`
 . "$path/SETUP.sh"
diff -pruN 5.1.58-1/BUILD/compile-pentium-icc-valgrind-max 5.1.61-2/BUILD/compile-pentium-icc-valgrind-max
--- 5.1.58-1/BUILD/compile-pentium-icc-valgrind-max	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/BUILD/compile-pentium-icc-valgrind-max	2011-12-16 19:06:02.000000000 +0000
@@ -1,6 +1,6 @@
 #! /bin/sh
 
-# Copyright (C) 2005 MySQL AB
+# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
 # 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
 # 
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
 
 path=`dirname $0`
 . "$path/SETUP.sh"
diff -pruN 5.1.58-1/BUILD/compile-pentium-mysqlfs-debug 5.1.61-2/BUILD/compile-pentium-mysqlfs-debug
--- 5.1.58-1/BUILD/compile-pentium-mysqlfs-debug	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/BUILD/compile-pentium-mysqlfs-debug	2011-12-16 19:06:02.000000000 +0000
@@ -1,6 +1,6 @@
 #! /bin/sh
 
-# Copyright (C) 2001, 2002 MySQL AB
+# Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
 # 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
 # 
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
 
 path=`dirname $0`
 . "$path/SETUP.sh"
diff -pruN 5.1.58-1/BUILD/compile-pentium-valgrind-max 5.1.61-2/BUILD/compile-pentium-valgrind-max
--- 5.1.58-1/BUILD/compile-pentium-valgrind-max	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/BUILD/compile-pentium-valgrind-max	2011-12-16 19:06:02.000000000 +0000
@@ -1,6 +1,6 @@
 #! /bin/sh
 
-# Copyright (C) 2002, 2005 MySQL AB
+# Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
 # 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
 # 
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
 
 path=`dirname $0`
 . "$path/SETUP.sh"
diff -pruN 5.1.58-1/BUILD/compile-solaris-amd64-forte 5.1.61-2/BUILD/compile-solaris-amd64-forte
--- 5.1.58-1/BUILD/compile-solaris-amd64-forte	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/BUILD/compile-solaris-amd64-forte	2011-12-16 19:06:02.000000000 +0000
@@ -1,6 +1,7 @@
 #! /bin/sh
 
-# Copyright (C) 2007 MySQL AB
+# Copyright (c) 2007 MySQL AB, 2008 Sun Microsystems, Inc.
+# Use is subject to license terms.
 # 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +14,7 @@
 # 
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
 
 gmake -k clean || true
 /bin/rm -f */.deps/*.P config.cache
diff -pruN 5.1.58-1/BUILD/compile-solaris-amd64-forte-debug 5.1.61-2/BUILD/compile-solaris-amd64-forte-debug
--- 5.1.58-1/BUILD/compile-solaris-amd64-forte-debug	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/BUILD/compile-solaris-amd64-forte-debug	2011-12-16 19:06:02.000000000 +0000
@@ -1,6 +1,7 @@
 #! /bin/sh
 
-# Copyright (C) 2007 MySQL AB
+# Copyright (c) 2007 MySQL AB, 2008 Sun Microsystems, Inc.
+# Use is subject to license terms.
 # 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +14,7 @@
 # 
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
 
 gmake -k clean || true
 /bin/rm -f */.deps/*.P config.cache
diff -pruN 5.1.58-1/BUILD/compile-solaris-sparc 5.1.61-2/BUILD/compile-solaris-sparc
--- 5.1.58-1/BUILD/compile-solaris-sparc	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/BUILD/compile-solaris-sparc	2011-12-16 19:06:02.000000000 +0000
@@ -1,6 +1,7 @@
 #! /bin/sh
 
-# Copyright (C) 2000, 2005 MySQL AB
+# Copyright (c) 2000-2002, 2005-2007 MySQL AB, 2008 Sun Microsystems, Inc.
+# Use is subject to license terms.
 # 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +14,7 @@
 # 
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
 
 make -k clean || true
 /bin/rm -f */.deps/*.P config.cache
diff -pruN 5.1.58-1/BUILD/compile-solaris-sparc-forte 5.1.61-2/BUILD/compile-solaris-sparc-forte
--- 5.1.58-1/BUILD/compile-solaris-sparc-forte	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/BUILD/compile-solaris-sparc-forte	2011-12-16 19:06:02.000000000 +0000
@@ -1,6 +1,7 @@
 #! /bin/sh
 
-# Copyright (C) 2001, 2005 MySQL AB
+# Copyright (c) 2001, 2002, 2005, 2007 MySQL AB, 2008 Sun Microsystems, Inc.
+# Use is subject to license terms.
 # 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +14,7 @@
 # 
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
 
 # Assume Forte is installed in /opt/SUNWSpro and ld is installed in
 # /usr/ccs/bin
diff -pruN 5.1.58-1/BUILD/FINISH.sh 5.1.61-2/BUILD/FINISH.sh
--- 5.1.58-1/BUILD/FINISH.sh	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/BUILD/FINISH.sh	2011-12-16 19:06:02.000000000 +0000
@@ -1,4 +1,5 @@
-# Copyright (C) 2000, 2005 MySQL AB, 2008 Sun Microsystems, Inc.
+# Copyright (c) 2000-2007 MySQL AB, 2008 Sun Microsystems, Inc.
+# Use is subject to license terms.
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Library General Public
@@ -12,8 +13,8 @@
 #
 # You should have received a copy of the GNU Library General Public
 # License along with this library; if not, write to the Free
-# Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
-# MA 02111-1307, USA
+# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+# MA 02110-1301, USA
 
 cflags="$c_warnings $extra_flags"
 cxxflags="$cxx_warnings $base_cxxflags $extra_flags"
diff -pruN 5.1.58-1/BUILD/SETUP.sh 5.1.61-2/BUILD/SETUP.sh
--- 5.1.58-1/BUILD/SETUP.sh	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/BUILD/SETUP.sh	2011-12-16 19:06:03.000000000 +0000
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-# Copyright (C) 2000, 2007 MySQL AB
+# Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Library General Public
@@ -14,8 +14,8 @@
 #
 # You should have received a copy of the GNU Library General Public
 # License along with this library; if not, write to the Free
-# Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
-# MA 02111-1307, USA
+# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+# MA 02110-1301, USA
 
 ########################################################################
 
diff -pruN 5.1.58-1/ChangeLog 5.1.61-2/ChangeLog
--- 5.1.58-1/ChangeLog	2011-07-01 15:23:33.000000000 +0000
+++ 5.1.61-2/ChangeLog	2011-12-16 19:07:02.000000000 +0000
@@ -1,616 +1,211 @@
 ------------------------------------------------------------
-revno: 3585
-committer: Karen Langford <karen.langford@oracle.com>
-branch nick: mysql-5.1.58-release
-timestamp: Fri 2011-07-01 17:18:27 +0200
+revno: 3622
+tags: clone-5.1.61-build
+committer: Mattias Jonsson <mattias.jonsson@oracle.com>
+branch nick: topush-5.1-sec
+timestamp: Thu 2011-12-15 16:59:18 +0100
 message:
-  Small update to Patch to fix SS #12698716
+  Post push fix for merge.test and mysqlcheck.test on windows
 ------------------------------------------------------------
-revno: 3584
-committer: Karen Langford <karen.langford@oracle.com>
-branch nick: mysql-5.1.58-release
-timestamp: Fri 2011-07-01 16:15:50 +0200
-message:
-  Patch to fix SS #12698716 : Java/ConnectorJ regression problem
-------------------------------------------------------------
-revno: 3583 [merge]
-tags: clone-5.1.58-build
+revno: 3621 [merge]
 committer: Georgi Kodinov <Georgi.Kodinov@Oracle.com>
 branch nick: merge-5.1-security
-timestamp: Mon 2011-06-06 16:53:46 +0300
+timestamp: Thu 2011-12-15 14:10:20 +0200
 message:
-  merge of mysql-5.1->mysql-5.1-security
+  merge mysql-5.1->mysql-5.1-security
     ------------------------------------------------------------
-    revno: 3452.71.20
-    committer: Georgi Kodinov <Georgi.Kodinov@Oracle.com>
-    branch nick: B11749418-5.1
-    timestamp: Mon 2011-06-06 13:13:54 +0300
-    message:
-      Bug #11749418: 38965: TEST CASES GIS-RTREE, TYPE_FLOAT, TYPE_NEWDECIMAL 
-        FAIL IN EMBEDDED SERVER
-      
-      FreeBSD 64 bit needs the FP_X_DNML to fpsetmask() to prevent exceptions from
-      propagating into mysql (as a threaded application).
-      However fpsetmask() itself is deprecated in favor of fedisableexcept().
-      1. Fixed the #ifdef to check for FP_X_DNML instead of i386.
-      2. Added a configure.in check for fedisableexcept() and, if present,
-         this function is called insted of the fpsetmask().
-      No need for new tests, as the existing tests cover this already.
-      Removed the affected tests from the experimental list.
-    ------------------------------------------------------------
-    revno: 3452.71.19
-    committer: Anitha Gopi <anitha.gopi@oracle.com>
-    branch nick: mysql-5.1-mod
-    timestamp: Fri 2011-06-03 14:13:10 +0530
-    message:
-      Bug#11756699 : Move test to disabled group
-    ------------------------------------------------------------
-    revno: 3452.71.18 [merge]
-    committer: Sergey Vojtovich <sergey.vojtovich@oracle.com>
-    branch nick: mysql-5.1-push
-    timestamp: Fri 2011-06-03 11:31:13 +0400
-    message:
-      Merge.
-        ------------------------------------------------------------
-        revno: 3452.75.1
-        committer: Sergey Vojtovich <sergey.vojtovich@oracle.com>
-        branch nick: mysql-5.1-bug60976
-        timestamp: Wed 2011-05-18 14:01:43 +0400
-        message:
-          BUG#12402794 - 60976: CRASH, VALGRIND WARNING AND MEMORY
-                         LEAK WITH PARTITIONED ARCHIVE TABLES
-          
-          CHECK TABLE against archive table, when file descriptors
-          are exhausted, caused server crash.
-          
-          Archive didn't handle errors when opening data file for
-          CHECK TABLE.
-    ------------------------------------------------------------
-    revno: 3452.71.17
-    committer: Davi Arnaut <davi.arnaut@oracle.com>
-    branch nick: 12563279-5.1
-    timestamp: Mon 2011-05-30 07:42:30 -0300
-    message:
-      Bug#12563279: REGRESSION IN HANDLING PRE-4.1 AUTHENTICATION PACKET
-      
-      The problem is that clients implementing the 4.0 version of the
-      protocol (that is, mysql-4.0) do not null terminate a string
-      at the end of the authentication packet. These clients denote
-      the end of the string with the end of the packet.
-      
-      Although this goes against the documented (see MySQL Internals
-      ClientServer Protocol wiki) description of the protocol, these
-      old clients still need to be supported.
-      
-      The solution is to support the documented and actual behavior
-      of the clients. If a client is using the pre-4.1 version of
-      the protocol, the end of a string in the authentication packet
-      can either be denoted with a null character or by the end of
-      the packet. This restores backwards compatibility with old
-      clients implementing either the documented or actual behavior.
+    revno: 3560.6.71
+    committer: Annamalai Gurusami <annamalai.gurusami@oracle.com>
+    branch nick: mysql-5.1-bug13117023
+    timestamp: Tue 2011-12-13 14:26:12 +0530
+    message:
+      Bug #13117023: Innodb increments handler_read_key when it should not
+      
+      The counter handler_read_key (SSV::ha_read_key_count) is incremented 
+      incorrectly.
+      
+      The mysql server maintains a per thread system_status_var (SSV)
+      object.  This object contains among other things the counter
+      SSV::ha_read_key_count. The purpose of this counter is to measure the
+      number of requests to read a row based on a key (or the number of
+      index lookups).
+      
+      This counter was wrongly incremented in the
+      ha_innobase::innobase_get_index(). The fix removes
+      this increment statement (for both innodb and innodb_plugin).
+      
+      The various callers of the innobase_get_index() was checked to
+      determine if anybody must increment this counter (if they first call
+      innobase_get_index() and then perform an index lookup).  It was found
+      that no caller of innobase_get_index() needs to worry about the
+      SSV::ha_read_key_count counter.
     ------------------------------------------------------------
-    revno: 3452.71.16
-    committer: Davi Arnaut <davi.arnaut@oracle.com>
+    revno: 3560.6.70
+    committer: Marko M?kel? <marko.makela@oracle.com>
     branch nick: mysql-5.1
-    timestamp: Fri 2011-05-27 08:09:25 -0300
+    timestamp: Mon 2011-12-12 13:48:24 +0200
     message:
-      BUG 11763056 - 55721: AIX 5.1.50 build failing, cannot locate bzero
+      Bug#13418887 ERROR IN DIAGNOSTIC FUNCTION PAGE_REC_PRINT()
       
-      The problem is that although AIX implements bzero, its prototype
-      is not declared by default. Since AC_CHECK_FUNC(bzero) succeeds
-      even though a prototype is not declared, this breaks compilation
-      in C++ files where a prototype is required.
-      
-      The solution is to only use bzero if a prototype is also declared.
-    ------------------------------------------------------------
-    revno: 3452.71.15
-    committer: Dmitry Shulga <Dmitry.Shulga@oracle.com>
-    branch nick: mysql-5.1-bug12546938
-    timestamp: Fri 2011-05-27 16:23:08 +0700
-    message:
-      Fixed bug#12546938 (formerly known as 61005) - CREATE IF NOT EXIST EVENT
-      will create multiple running events.
-      
-      A CREATE IF NOT EXIST on an event that existed and was enabled caused
-      multiple instances of the event to run. Disabling the event didn't  help.
-      If the event was  dropped, the event stopped running, but when created
-      again, multiple instances of the event were still running. The only way
-      to get out of this situation was  to restart the server.
-      
-      The problem was that Event_db_repository::create_event() didn't return
-      enough information to discriminate between situation when event didn't
-      exist and was created and when event did exist and was not created
-      (but a warning was emitted). As result in the latter case event
-      was added to in-memory queue of events second time. And this led to
-      unwarranted multiple executions of the same event.
-      
-      The solution is to add out-parameter to Event_db_repository::create_event()
-      method which will signal that event was not created because it already
-      exists and so it should not be added to the in-memory queue.
-    ------------------------------------------------------------
-    revno: 3452.71.14
-    committer: Dmitry Lenev <Dmitry.Lenev@oracle.com>
-    branch nick: mysql-5.1-11762012
-    timestamp: Thu 2011-05-26 17:14:47 +0400
-    message:
-      Fix for bug #11762012 - "54553: INNODB ASSERTS IN 
-      HA_INNOBASE::UPDATE_ROW, TEMPORARY TABLE, TABLE LOCK".
-      
-      Attempt to update an InnoDB temporary table under LOCK TABLES
-      led to assertion failure in both debug and production builds
-      if this temporary table was explicitly locked for READ. The 
-      same scenario works fine for MyISAM temporary tables.
-      
-      The assertion failure was caused by discrepancy between lock 
-      that was requested on the rows of temporary table at LOCK TABLES
-      time and by update operation. Since SQL-layer requested a 
-      read-lock at LOCK TABLES time InnoDB engine assumed that upcoming
-      statements which are going to be executed under LOCK TABLES will 
-      only read table and therefore should acquire only S-lock.
-      An update operation broken this assumption by requesting X-lock.
-      
-      Possible approaches to fixing this problem are:
-      
-      1) Skip locking of temporary tables as locking doesn't make any
-         sense for connection-local objects.
-      2) Prohibit changing of temporary table locked by LOCK TABLES ... 
-         READ.
-      
-      Unfortunately both of these approaches have drawbacks which make 
-      them unviable for stable versions of server.
-      
-      So this patch takes another approach and changes code in such way
-      that LOCK TABLES for a temporary table will always request write
-      lock. In 5.1 version of this patch switch from read lock to write
-      lock is done inside of InnoDBs handler methods as doing it on 
-      SQL-layer causes compatibility troubles with FLUSH TABLES WITH
-      READ LOCK.
-    ------------------------------------------------------------
-    revno: 3452.71.13
-    committer: Sven Sandberg <sven.sandberg@oracle.com>
-    branch nick: 5.1
-    timestamp: Thu 2011-05-26 12:50:43 +0200
-    message:
-      BUG#12574820: binlog.binlog_tmp_table timing out in daily and weekly trunk run
-      Problem: MYSQL_BIN_LOG::reset_logs acquires mutexes in wrong order.
-      The correct order is first LOCK_thread_count and then LOCK_log. This function
-      does it the other way around. This leads to deadlock when run in parallel
-      with a thread that takes the two locks in correct order. For example, a thread
-      that disconnects will take the locks in the correct order.
-      Fix: change order of the locks in MYSQL_BIN_LOG::reset_logs:
-      first LOCK_thread_count and then LOCK_log.
-    ------------------------------------------------------------
-    revno: 3452.71.12
-    committer: Sergey Glukhov <sergey.glukhov@oracle.com>
-    branch nick: mysql-5.1
-    timestamp: Thu 2011-05-26 14:06:39 +0400
-    message:
-      Bug#12392636 ASSERTION FAILED: SCALE >= 0 && PRECISION > 0 && SCALE <= PRECISION
-      Assertion happens due to missing NULL value check in
-      Item_func_round::fix_length_and_dec() function.
-      The fix: added NULL value check for second parameter.
-    ------------------------------------------------------------
-    revno: 3452.71.11
-    committer: Anitha Gopi <anitha.gopi@oracle.com>
-    branch nick: mysql-5.1-mod
-    timestamp: Tue 2011-05-24 15:46:14 +0530
-    message:
-      BUG#12371924 # Bug is fixed. Move test out of experimental group
-    ------------------------------------------------------------
-    revno: 3452.71.10
-    committer: Anitha Gopi <anitha.gopi@oracle.com>
-    branch nick: mysql-5.1-mod
-    timestamp: Tue 2011-05-24 12:08:13 +0530
-    message:
-      Changed to Oracle bug numbers
-    ------------------------------------------------------------
-    revno: 3452.71.9
-    committer: Anitha Gopi <anitha.gopi@oracle.com>
-    branch nick: mysql-5.1-mod
-    timestamp: Tue 2011-05-24 10:22:00 +0530
-    message:
-      Bug#11756699: Move test from disabled to experimental group
-    ------------------------------------------------------------
-    revno: 3452.71.8
-    committer: Anitha Gopi <anitha.gopi@oracle.com>
-    branch nick: mysql-5.1-mod
-    timestamp: Tue 2011-05-24 09:56:24 +0530
-    message:
-      Bug#12584161 - Moved test from disabled to experimental group
-    ------------------------------------------------------------
-    revno: 3452.71.7 [merge]
-    committer: Vasil Dimov <vasil.dimov@oracle.com>
-    branch nick: mysql-5.1
-    timestamp: Sun 2011-05-22 23:11:02 +0300
-    message:
-      Merge mysql-5.1-innodb -> mysql-5.1
-        ------------------------------------------------------------
-        revno: 3351.14.367
-        committer: Vasil Dimov <vasil.dimov@oracle.com>
-        branch nick: mysql-5.1-innodb
-        timestamp: Tue 2011-05-10 15:43:30 +0300
-        message:
-          Increment InnoDB Plugin version from 1.0.16 to 1.0.17.
-          InnoDB Plugin 1.0.16 has been released with MySQL 5.1.57.
-        ------------------------------------------------------------
-        revno: 3351.14.366
-        committer: Jimmy Yang <jimmy.yang@oracle.com>
-        branch nick: mysql-5.1-innodb
-        timestamp: Wed 2011-05-04 03:06:21 -0700
-        message:
-          Fix bug #11796673 address backward compatibility on index with
-          large prefix (>=768). Table with such large prefix index will not
-          be loaded into memory (for its metadata), unless innodb_force_recovery
-          is on.
-          
-          rb://604 Approved by Marko
-        ------------------------------------------------------------
-        revno: 3351.14.365 [merge]
-        committer: Vasil Dimov <vasil.dimov@oracle.com>
-        branch nick: mysql-5.1-innodb
-        timestamp: Mon 2011-05-02 12:57:05 +0300
-        message:
-          Merge mysql-5.1 -> mysql-5.1-innodb
+      When printing information about a ROW_FORMAT=REDUNDANT record, pass
+      the correct flag to rec_get_next_offs().
+      
+      rb:821 approved by Jimmy Yang
+------------------------------------------------------------
+revno: 3620 [merge]
+committer: Mattias Jonsson <mattias.jonsson@oracle.com>
+branch nick: topush-5.1-sec
+timestamp: Wed 2011-12-14 14:41:40 +0100
+message:
+  merge
     ------------------------------------------------------------
-    revno: 3452.71.6 [merge]
-    committer: Guilhem Bichot <guilhem.bichot@oracle.com>
-    branch nick: 5.1-2
-    timestamp: Sat 2011-05-21 10:43:54 +0200
+    revno: 1810.3997.36 [merge]
+    committer: Mattias Jonsson <mattias.jonsson@oracle.com>
+    branch nick: topush-5.0-sec
+    timestamp: Wed 2011-12-14 14:05:22 +0100
     message:
-      merge from latest 5.1
+      merge
         ------------------------------------------------------------
-        revno: 3452.73.4
-        committer: Dmitry Shulga <Dmitry.Shulga@oracle.com>
-        branch nick: mysql-5.1-bug11749345
-        timestamp: Fri 2011-05-20 23:52:52 +0700
+        revno: 1810.4002.1
+        committer: Mattias Jonsson <mattias.jonsson@oracle.com>
+        branch nick: b12361113-50-sec
+        timestamp: Mon 2011-12-12 14:07:02 +0100
         message:
-          Fixed bug#11749345 (formerly bug#38813) - increasing memory consumption
-          when selecting from I_S and views exist, in SP.
-          
-          Symptoms: re-execution of prepared statement (or statement in a stored
-          routine) which read from one of I_S tables and which in order to fill
-          this I_S table had to open a view led to increasing memory consumption.
+          Bug#12361113: CRASH WHEN "LOAD INDEX INTO CACHE" WITH TOO
+          SMALL KEY CACHE
           
-          What happened in this situation was that during the process of view
-          opening for purpose of I_S filling view-related structures (like its
-          LEX) were allocated on persistent MEM_ROOT of prepared statement (or 
-          stored routine). Since this MEM_ROOT is not freed until prepared
-          statement deallocation (or expulsion of stored routine from the cache)
-          and code responsible for filling I_S is not able to re-use results of
-          view opening from previous executions this allocation ended up in
-          memory hogging.
+          The server crashed on division by zero because the key cache was not
+          initialized and the block length was 0 which was used in a division.
           
-          This patch solves the problem by ensuring that when a view opened
-          for the purpose of I_S filling all its structures are allocated on
-          non-persistent runtime MEM_ROOT. This is achieved by activating a
-          temporary Query_arena bound to this MEM_ROOT.
-          Since this step makes impossible linking of view structures into
-          LEX of our prepared statement (or stored routine statement) this
-          patch also changes code filling I_S table to install a proxy LEX
-          before trying to open a view or a table. Consequently some code
-          which was responsible for backing-up/restoring parts of LEX when
-          view/table was opened during filling of I_S table became redundant
-          and was removed.
+          The fix was to not allow CACHE INDEX if the key cache was not initiallized.
+          Thus never try LOAD INDEX INTO CACHE for an uninitialized key cache.
           
-          This patch doesn't contain test case for this bug as it is hard
-          to test memory hogging in our test suite.
-        ------------------------------------------------------------
-        revno: 3452.73.3 [merge]
-        committer: Luis Soares <luis.soares@oracle.com>
-        branch nick: mysql-5.1
-        timestamp: Thu 2011-05-19 16:46:26 +0100
-        message:
-          BUG#11746302
-          
-          Automerge mysql-5.1-gca into latest mysql-5.1.
-            ------------------------------------------------------------
-            revno: 3452.74.1
-            committer: Luis Soares <luis.soares@oracle.com>
-            branch nick: mysql-5.1-gca
-            timestamp: Thu 2011-05-19 16:45:45 +0100
-            message:
-              BUG#11746302: 25228: RPL_RELAYSPACE.TEST FAILS ON POWERMACG5, 
-                            VM-WIN2003-32-A, SLES10-IA64-A 
-                    
-              The test case waits for master_pos_wait not to timeout, which
-              means that the deadlock between SQL and IO threads was 
-              succesfully and automatically dealt with.
-                    
-              However, very rarely, master_pos_wait reports a timeout. This
-              happens because the time set for master_pos_wait to wait was
-              too small (6 seconds). On slow test env this could be a 
-              problem.
-                    
-              We fix this by setting the timeout inline with the one used
-              in sync_slave_with_master (300 seconds). In addition we 
-              refactored the test case and refined some comments.
-        ------------------------------------------------------------
-        revno: 3452.73.2
-        committer: Mayank Prasad <mayank.prasad@oracle.com
-        branch nick: 5.1_11764633_3
-        timestamp: Wed 2011-05-18 20:10:01 +0530
-        message:
-          Bug#11764633 : 57491: THD->MAIN_DA.IS_OK() ASSERT IN EMBEDDED
-          
-          Issue:
-          While running embedded server, if client issues TEE command (\T foo/bar) and
-          "foo/bar" directory doesn't exist, it is suppose to give error. But it was
-          aborting.  This was happening because wrong error handler was being called.
-          
-          Solution:
-          Modified calls to correct error handler. In embedded server case, there are 
-          two error handler (client and server) which are supposed to be called based 
-          on which context code is in. If it is in client context, client error handler
-          should be called otherwise server.
-          
-          Test case:
-          Test case automation is not possible as current (following) code doesn't 
-          allow '\T' to be executed from command line (OR command read from a file):
-          [client/mysql.cc]
-          ...
-           static int
-           com_tee(String *buffer __attribute__((unused)),
-                   char *line __attribute__((unused)))
-           {
-             char file_name[FN_REFLEN], *end, *param;
-          
-             if (status.batch) << THIS IS TRUE WHILE EXECUTING FROM COMMAND LINE.
-                return 0;
-           ...
-          So, not adding test case in GA. WIll add a test case in mysql-trunk after 
-          removing above code so that this could be properly tested before GA.
-        ------------------------------------------------------------
-        revno: 3452.73.1
-        committer: Sergey Glukhov <sergey.glukhov@oracle.com>
-        branch nick: mysql-5.1
-        timestamp: Wed 2011-05-18 10:47:43 +0400
-        message:
-          Bug#12403504 AFTER FIX FOR #11889186 : ASSERTION FAILED: DELSUM+(INT) Y/4-TEMP > 0
-          There are two problems:
-          1. There is a missing check for 'year' parameter(year can not be greater than 9999) in
-             makedate function. fix: added check that year can not be greater than 9999.
-          2. There is a missing check for zero date in from_days() function.
-             fix: added zero date check into Item_func_from_days::get_date()
-             function.
-    ------------------------------------------------------------
-    revno: 3452.71.5
-    committer: Guilhem Bichot <guilhem.bichot@oracle.com>
-    branch nick: 5.1-2
-    timestamp: Mon 2011-05-16 22:04:01 +0200
-    message:
-      Fix for BUG#11755168 '46895: test "outfile_loaddata" fails (reproducible)'.
-      In sql_class.cc, 'row_count', of type 'ha_rows', was used as last argument for
-      ER_TRUNCATED_WRONG_VALUE_FOR_FIELD which is
-      "Incorrect %-.32s value: '%-.128s' for column '%.192s' at row %ld".
-      So 'ha_rows' was used as 'long'.
-      On SPARC32 Solaris builds, 'long' is 4 bytes and 'ha_rows' is 'longlong' i.e. 8 bytes.
-      So the printf-like code was reading only the first 4 bytes.
-      Because the CPU is big-endian, 1LL is 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01
-      so the first four bytes yield 0. So the warning message had "row 0" instead of
-      "row 1" in test outfile_loaddata.test:
-      -Warning	1366	Incorrect string value: '\xE1\xE2\xF7' for column 'b' at row 1
-      +Warning	1366	Incorrect string value: '\xE1\xE2\xF7' for column 'b' at row 0
-      
-      All error-messaging functions which internally invoke some printf-life function
-      are potential candidate for such mistakes.
-      One apparently easy way to catch such mistakes is to use
-      ATTRIBUTE_FORMAT (from my_attribute.h).
-      But this works only when call site has both:
-      a) the format as a string literal
-      b) the types of arguments.
-      So:
-        func(ER(ER_BLAH), 10);
-      will silently not be checked, because ER(ER_BLAH) is not known at
-      compile time (it is known at run-time, and depends on the chosen
-      language).
-      And
-        func("%s", a va_list argument);
-      has the same problem, as the *real* type of arguments is not
-      known at this site at compile time (it's known in some caller).
-      Moreover,
-        func(ER(ER_BLAH));
-      though possibly correct (if ER(ER_BLAH) has no '%' markers), will not
-      compile (gcc says "error: format not a string literal and no format
-      arguments").
-      
-      Consequences:
-      1) ATTRIBUTE_FORMAT is here added only to functions which in practice
-      take "string literal" formats: "my_error_reporter" and "print_admin_msg".
-      2) it cannot be added to the other functions: my_error(),
-      push_warning_printf(), Table_check_intact::report_error(),
-      general_log_print().
-      
-      To do a one-time check of functions listed in (2), the following
-      "static code analysis" has been done:
-      1) replace
-        my_error(ER_xxx, arguments for substitution in format)
-      with the equivalent
-        my_printf_error(ER_xxx,ER(ER_xxx), arguments for substitution in
-      format),
-      so that we have ER(ER_xxx) and the arguments *in the same call site*
-      2) add ATTRIBUTE_FORMAT to push_warning_printf(),
-      Table_check_intact::report_error(), general_log_print()
-      3) replace ER(xxx) with the hard-coded English text found in
-      errmsg.txt (like: ER(ER_UNKNOWN_ERROR) is replaced with
-      "Unknown error"), so that a call site has the format as string literal
-      4) this way, ATTRIBUTE_FORMAT can effectively do its job
-      5) compile, fix errors detected by ATTRIBUTE_FORMAT
-      6) revert steps 1-2-3.
-      The present patch has no compiler error when submitted again to the
-      static code analysis above.
-      It cannot catch all problems though: see Field::set_warning(), in
-      which a call to push_warning_printf() has a variable error
-      (thus, not replacable by a string literal); I checked set_warning() calls
-      by hand though.
-      
-      See also WL 5883 for one proposal to avoid such bugs from appearing
-      again in the future.
-      
-      The issues fixed in the patch are:
-      a) mismatch in types (like 'int' passed to '%ld')
-      b) more arguments passed than specified in the format.
-      This patch resolves mismatches by changing the type/number of arguments,
-      not by changing error messages of sql/share/errmsg.txt. The latter would be wrong,
-      per the following old rule: errmsg.txt must be as stable as possible; no insertions
-      or deletions of messages, no changes of type or number of printf-like format specifiers,
-      are allowed, as long as the change impacts a message already released in a GA version.
-      If this rule is not followed:
-      - Connectors, which use error message numbers, will be confused (by insertions/deletions
-      of messages)
-      - using errmsg.sys of MySQL 5.1.n with mysqld of MySQL 5.1.(n+1)
-      could produce wrong messages or crash; such usage can easily happen if
-      installing 5.1.(n+1) while /etc/my.cnf still has --language=/path/to/5.1.n/xxx;
-      or if copying mysqld from 5.1.(n+1) into a 5.1.n installation.
-      When fixing b), I have verified that the superfluous arguments were not used in the format
-      in the first 5.1 GA (5.1.30 'bteam@astra04-20081114162938-z8mctjp6st27uobm').
-      Had they been used, then passing them today, even if the message doesn't use them
-      anymore, would have been necessary, as explained above.
+          Also added some windows files/directories to .bzrignore.
+------------------------------------------------------------
+revno: 3619 [merge]
+committer: Georgi Kodinov <Georgi.Kodinov@Oracle.com>
+branch nick: merge-5.1-security
+timestamp: Mon 2011-12-12 12:25:35 +0100
+message:
+  merge 5.1->5.1-security.
     ------------------------------------------------------------
-    revno: 3452.71.4
-    committer: Vinay Fisrekar <vinay.fisrekar@oracle.com>
-    branch nick: mysql-5.1
-    timestamp: Sat 2011-05-14 21:44:49 +0530
+    revno: 3560.6.69
+    committer: Tor Didriksen <tor.didriksen@oracle.com>
+    branch nick: 5.1-sighandler
+    timestamp: Wed 2011-11-30 17:11:13 +0100
     message:
-      Adding bug scenario for data types in main suite
-            
-      Impementing Test Review Comment.
-            
-      Bug test scenario:      
-      SELECT is not returning result set for "equal" (=) and "NULL safe equal
-      operator"  (<=>) on BIT data type. Extending this scenario for all data types
-    ------------------------------------------------------------
-    revno: 3452.71.3 [merge]
-    committer: Bjorn Munch <bjorn.munch@oracle.com>
-    branch nick: merge-51
-    timestamp: Fri 2011-05-13 13:04:01 +0200
+      Bug#11761576 54082: HANDLE_SEGFAULT MAKES USE OF UNSAFE FUNCTIONS
+      
+      Post-push fix: build break on windows/optimized
+    ------------------------------------------------------------
+    revno: 3560.6.68
+    committer: Tor Didriksen <tor.didriksen@oracle.com>
+    branch nick: 5.1-sighandler
+    timestamp: Wed 2011-11-30 15:39:29 +0100
     message:
-      merge from 5.1-mtr
-        ------------------------------------------------------------
-        revno: 2728.17.231 [merge]
-        committer: Bjorn Munch <bjorn.munch@oracle.com>
-        branch nick: merge-51
-        timestamp: Thu 2011-05-12 14:08:47 +0200
-        message:
-          merge from 5.1 main
-        ------------------------------------------------------------
-        revno: 2728.17.230
-        committer: Bjorn Munch <bjorn.munch@oracle.com>
-        branch nick: itf-51
-        timestamp: Tue 2011-05-03 16:08:25 +0200
-        message:
-          Bug #11752142 43247: SUITE/<SUITE NAME>/INCLUDE: NO SUCH FILE OR DIRECTORY
-          The originally reported dirs have been removed
-          But found suite/bugs, removed from mysql-test/Makefile.am
-    ------------------------------------------------------------
-    revno: 3452.71.2 [merge]
-    committer: Tatjana Azundris Nuernberg <tatjana.nuernberg@oracle.com>
-    branch nick: 51-11762799_
-    timestamp: Thu 2011-05-12 05:43:53 +0100
+      Bug#11761576 54082: HANDLE_SEGFAULT MAKES USE OF UNSAFE FUNCTIONS
+      
+      handle_segfault is the signal handler code of mysqld.  however, it makes
+      calls to potentially unsafe functions localtime_r, fprintf, fflush.
+    ------------------------------------------------------------
+    revno: 3560.6.67
+    committer: Tor Didriksen <tor.didriksen@oracle.com>
+    branch nick: 5.1
+    timestamp: Tue 2011-11-29 15:52:47 +0100
     message:
-      auto-merge
-        ------------------------------------------------------------
-        revno: 3452.72.2 [merge]
-        committer: Serge Kozlov <Serge.Kozlov@oracle.com>
-        branch nick: mysql-5.1
-        timestamp: Tue 2011-05-10 17:50:30 +0400
-        message:
-          automerge
-        ------------------------------------------------------------
-        revno: 3452.72.1
-        committer: Serge Kozlov <Serge.Kozlov@oracle.com>
-        branch nick: mysql-5.1
-        timestamp: Mon 2011-05-09 23:14:24 +0400
-        message:
-          WL#5867
-          Replaced the error code by error name
+      Build broken for gcc 4.5.1 in optimized mode.
+      
+      readline.cc: In function char* batch_readline(LINE_BUFFER*):
+      readline.cc:60:9: error: out_length may be used uninitialized in this function
+      log.cc: In function int find_uniq_filename(char*):
+      log.cc:1857:8: error: number may be used uninitialized in this function
+    ------------------------------------------------------------
+    revno: 3560.6.66
+    committer: Nirbhay Choubey <nirbhay.choubey@oracle.com>
+    branch nick: B11756764-5.1
+    timestamp: Tue 2011-11-29 17:59:35 +0530
+    message:
+      Bug#11756764 48726: MYSQLD KEEPS CRASHING WITH SIGSEGV
+                          WITH MYISAM_USE_MMAP ENABLED
+      
+      MySQL server can crash due to segmentation fault when
+      started with myisam_use_mmap.
+      
+      The reason behind this being, while making a request to
+      unmap (munmap) the previously mapped memory (mmap), the
+      size passed was 7 bytes larger than the size requested at
+      the time of mapping. This can eventually unmap the adjacent
+      memory mapped block, belonging to some other memory-map pool.
+      Hence the subsequent call to mmap can map a region which was
+      still a valid memory mapped area.
+      
+      Fixed by removing the extra 7-byte margin which was erroneously
+      added to the size, used for unmappping.
+    ------------------------------------------------------------
+    revno: 3560.6.65
+    committer: Ashish Agarwal<ashish.y.agarwal@oracle.com>
+    branch nick: bug_93_5.1
+    timestamp: Wed 2011-11-23 18:33:29 +0530
+    message:
+      BUG#11751793 - 42784: ARCHIVE TABLES CAUSE 100% CPU USAGE
+                            AND HANG IN SHOW TABLE STATUS.
+      
+      ISSUE: Table corruption due to concurrent queries.
+             Different threads running insert and check
+             query leads to table corruption. Not properly locked,
+             rows are inserted in between check query.
+      
+      SOLUTION: In check query mutex lock is acquired
+                for a longer time to handle concurrent
+                insert and check query.
+      
+      NOTE: Additionally we backported the fix for CHECKSUM
+            issue(bug#11758979).
+    ------------------------------------------------------------
+    revno: 3560.6.64
+    committer: Jon Olav Hauglid <jon.hauglid@oracle.com>
+    branch nick: mysql-5.1-test
+    timestamp: Tue 2011-11-22 14:16:13 +0100
+    message:
+      Disabling main.query_cache_28249.test since this test fails
+      sporadically on 5.1. See Bug#12584161.
+      
+      Test runs successfully on 5.5/trunk, so this changeset will
+      be null-merged.
     ------------------------------------------------------------
-    revno: 3452.71.1 [merge]
-    committer: Tatjana Azundris Nuernberg <tatjana.nuernberg@oracle.com>
-    branch nick: 51-11762799_
-    timestamp: Thu 2011-05-12 03:41:51 +0100
+    revno: 3560.6.63
+    committer: Inaam Rana <inaam.rana@oracle.com>
+    branch nick: mysql-5.1
+    timestamp: Fri 2011-11-18 10:59:10 -0500
     message:
-      auto-merge Bug#11762799/Bug#55436
-        ------------------------------------------------------------
-        revno: 3452.39.10 [merge]
-        committer: Tatiana Azundris Nurnberg <azundris@sun.com>
-        branch nick: 51-11762799
-        timestamp: Thu 2011-05-05 06:39:38 +0100
-        message:
-          auto-merge conservative fix for Bug#55436/Bug#11762799
-            ------------------------------------------------------------
-            revno: 3452.70.1
-            committer: Tatiana A. Nurnberg <azundris@mysql.com>
-            branch nick: 51-55436_
-            timestamp: Thu 2010-11-11 09:46:49 +0000
-            message:
-              Bug#55436: buffer overflow in debug binary of dbug_buff in Field_new_decimal::store_value
-              
-              There were some misunderstandings about parameters pertaining to buffer-size.
-              
-              Patches fixes the reported off by one and
-              clarifies the documentation.
-------------------------------------------------------------
-revno: 3582
-committer: Marko M?kel? <marko.makela@oracle.com>
-branch nick: mysql-5.1-security
-timestamp: Thu 2011-05-19 16:12:27 +0300
-message:
-  Bug#12429576 Assertion failure on purge of column prefix index
-------------------------------------------------------------
-revno: 3581 [merge]
-committer: Kristofer Pettersson <kristofer.pettersson@oracle.com>
-branch nick: mysql-5.1-security
-timestamp: Tue 2011-05-10 18:12:48 +0200
-message:
-  Automerge
+      Bug#13390506 - VALGRIND FAILURE AFTER THE FIX FOR 13371000
+        
+      rb://816
+      approved by: Marko Makela
+        
+      The title is misleading. This bug was actually introduced by
+      bug 12635227 and was unearthed by a later optimization.
+      We need to free buf_page_t structs that we are allocating using
+      malloc() at shutdown.
     ------------------------------------------------------------
-    revno: 3579.1.9 [merge]
-    committer: Georgi Kodinov <Georgi.Kodinov@Oracle.com>
-    branch nick: merge-5.1-security
-    timestamp: Tue 2011-05-10 17:12:13 +0300
+    revno: 3560.6.62
+    committer: Jorgen Loland <jorgen.loland@oracle.com>
+    branch nick: mysql-5.1
+    timestamp: Fri 2011-11-18 14:47:11 +0100
     message:
-      empty weave merge mysql-5.0-security->mysql-5.1-security 
-        ------------------------------------------------------------
-        revno: 1810.3997.25 [merge]
-        committer: Georgi Kodinov <Georgi.Kodinov@Oracle.com>
-        branch nick: merge-5.0-security
-        timestamp: Tue 2011-05-10 16:49:13 +0300
-        message:
-          weave merge of 5.0->5.0-security
+      Backmerge of BUG#12997905
     ------------------------------------------------------------
-    revno: 3579.1.8 [merge]
-    committer: Georgi Kodinov <Georgi.Kodinov@Oracle.com>
-    branch nick: merge-5.1-security
-    timestamp: Tue 2011-05-10 16:57:40 +0300
+    revno: 3560.6.61 [merge]
+    committer: Karen Langford <karen.langford@oracle.com>
+    branch nick: mysql-5.1
+    timestamp: Thu 2011-11-17 00:26:16 +0100
     message:
-      weave merge of mysql-5.1->mysql-5.1-security
-        ------------------------------------------------------------
-        revno: 3452.64.32 [merge]
-        committer: Georgi Kodinov <Georgi.Kodinov@Oracle.com>
-        branch nick: merge-5.1
-        timestamp: Tue 2011-05-10 16:21:44 +0300
-        message:
-          weave merge mysql-5.0->mysql-5.1
-            ------------------------------------------------------------
-            revno: 1810.3998.22 [merge]
-            committer: Sunanda Menon <sunanda.menon@oracle.com>
-            branch nick: mysql-5.0
-            timestamp: Fri 2011-05-06 10:36:30 +0200
-            message:
-              Merge from mysql-5.0.93-release
+      Merge from mysql-5.1.60-release
         ------------------------------------------------------------
-        revno: 3452.64.31 [merge]
+        revno: 3615.1.2
+        tags: mysql-5.1.60
         committer: Karen Langford <karen.langford@oracle.com>
-        branch nick: mysql-5.1
-        timestamp: Fri 2011-05-06 10:03:02 +0200
+        branch nick: mysql-5.1.60-release
+        timestamp: Sat 2011-10-29 20:08:40 +0200
         message:
-          Merge from mysql-5.1.57-release
-            ------------------------------------------------------------
-            revno: 3572.1.1
-            tags: mysql-5.1.57
-            author: karen.langford@oracle.com
-            committer: Karen Langford <karen.langford@oracle.com>
-            branch nick: mysql-5.1.57-release
-            timestamp: Tue 2011-04-12 01:36:38 +0200
-            message:
-              Bug#11867664: Fix server crashes on update with join on partitioned table.
+          Patch to fix stdint.h missing from pre Solaris 10 versions.
diff -pruN 5.1.58-1/client/client_priv.h 5.1.61-2/client/client_priv.h
--- 5.1.58-1/client/client_priv.h	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/client/client_priv.h	2011-12-16 19:06:02.000000000 +0000
@@ -1,4 +1,5 @@
-/* Copyright (C) 2001-2006 MySQL AB
+/*
+   Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -11,7 +12,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+*/
 
 /* Common defines for all clients */
 
diff -pruN 5.1.58-1/client/CMakeLists.txt 5.1.61-2/client/CMakeLists.txt
--- 5.1.58-1/client/CMakeLists.txt	2011-07-01 15:22:20.000000000 +0000
+++ 5.1.61-2/client/CMakeLists.txt	2011-12-16 19:06:02.000000000 +0000
@@ -1,4 +1,5 @@
-# Copyright (C) 2006 MySQL AB
+# Copyright (c) 2006-2008 MySQL AB, 2009 Sun Microsystems, Inc.
+# Use is subject to license terms.
 # 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff -pruN 5.1.58-1/client/Makefile.am 5.1.61-2/client/Makefile.am
--- 5.1.58-1/client/Makefile.am	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/client/Makefile.am	2011-12-16 19:06:02.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2000-2006 MySQL AB
+# Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -11,7 +11,7 @@
 #
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
 
 # This file is public domain and comes with NO WARRANTY of any kind
 
diff -pruN 5.1.58-1/client/Makefile.in 5.1.61-2/client/Makefile.in
--- 5.1.58-1/client/Makefile.in	2011-07-01 15:23:53.000000000 +0000
+++ 5.1.61-2/client/Makefile.in	2011-12-16 19:07:25.000000000 +0000
@@ -14,7 +14,7 @@
 
 @SET_MAKE@
 
-# Copyright (C) 2000-2006 MySQL AB
+# Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -27,7 +27,7 @@
 #
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
 
 # This file is public domain and comes with NO WARRANTY of any kind
 
diff -pruN 5.1.58-1/client/my_readline.h 5.1.61-2/client/my_readline.h
--- 5.1.58-1/client/my_readline.h	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/client/my_readline.h	2011-12-16 19:06:03.000000000 +0000
@@ -1,4 +1,5 @@
-/* Copyright (C) 2000 MySQL AB
+/*
+   Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -11,7 +12,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+*/
 
 /* readline for batch mode */
 
diff -pruN 5.1.58-1/client/mysqladmin.cc 5.1.61-2/client/mysqladmin.cc
--- 5.1.58-1/client/mysqladmin.cc	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/client/mysqladmin.cc	2011-12-16 19:06:03.000000000 +0000
@@ -1,4 +1,5 @@
-/* Copyright (C) 2000-2006 MySQL AB
+/*
+   Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -11,7 +12,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+*/
 
 /* maintaince of mysql databases */
 
@@ -23,6 +25,7 @@
 #include <sys/stat.h>
 #include <mysql.h>
 #include <sql_common.h>
+#include <welcome_copyright_notice.h>           /* ORACLE_WELCOME_COPYRIGHT_NOTICE */
 
 #define ADMIN_VERSION "8.42"
 #define MAX_MYSQL_VAR 512
@@ -690,8 +693,7 @@ static int execute_commands(MYSQL *mysql
     case ADMIN_VER:
       new_line=1;
       print_version();
-      puts("Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.");
-      puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license\n");
+      puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2011"));
       printf("Server version\t\t%s\n", mysql_get_server_info(mysql));
       printf("Protocol version\t%d\n", mysql_get_proto_info(mysql));
       printf("Connection\t\t%s\n",mysql_get_host_info(mysql));
@@ -1070,8 +1072,7 @@ static void print_version(void)
 static void usage(void)
 {
   print_version();
-  puts("Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.");
-  puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license\n");
+  puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2011"));
   puts("Administration program for the mysqld daemon.");
   printf("Usage: %s [OPTIONS] command command....\n", my_progname);
   my_print_help(my_long_options);
diff -pruN 5.1.58-1/client/mysqlbinlog.cc 5.1.61-2/client/mysqlbinlog.cc
--- 5.1.58-1/client/mysqlbinlog.cc	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/client/mysqlbinlog.cc	2011-12-16 19:06:03.000000000 +0000
@@ -1,4 +1,5 @@
-/* Copyright (C) 2001-2004 MySQL AB
+/*
+   Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -11,7 +12,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+*/
 
 /* 
 
@@ -34,6 +36,7 @@
 #include "mysql_priv.h" 
 #include "log_event.h"
 #include "sql_common.h"
+#include <welcome_copyright_notice.h> // ORACLE_WELCOME_COPYRIGHT_NOTICE
 
 #define BIN_LOG_HEADER_SIZE	4
 #define PROBE_HEADER_LEN	(EVENT_LEN_OFFSET+4)
@@ -1247,10 +1250,7 @@ static void print_version()
 static void usage()
 {
   print_version();
-  puts("By Monty and Sasha, for your professional use\n\
-This software comes with NO WARRANTY:  This is free software,\n\
-and you are welcome to modify and redistribute it under the GPL license.\n");
-
+  puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2011"));
   printf("\
 Dumps a MySQL binary log in a format usable for viewing or for piping to\n\
 the mysql command line client.\n\n");
diff -pruN 5.1.58-1/client/mysql.cc 5.1.61-2/client/mysql.cc
--- 5.1.58-1/client/mysql.cc	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/client/mysql.cc	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,5 @@
-/* Copyright 2000, 2010, Oracle and/or its affiliates. All rights reserved.
+/*
+   Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -11,12 +12,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
-
-#define COPYRIGHT_NOTICE "\
-Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.\n\
-This software comes with ABSOLUTELY NO WARRANTY. This is free software,\n\
-and you are welcome to modify and redistribute it under the GPL v2 license\n"
+   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+*/
 
 /* mysql command tool
  * Commands compatible with mSQL by David J. Hughes
@@ -118,6 +115,7 @@ extern "C" {
 #endif
 
 #include "completion_hash.h"
+#include <welcome_copyright_notice.h> // ORACLE_WELCOME_COPYRIGHT_NOTICE
 
 #define PROMPT_CHAR '\\'
 #define DEFAULT_DELIMITER ";"
@@ -1172,7 +1170,7 @@ int main(int argc,char *argv[])
 	  mysql_thread_id(&mysql), server_version_string(&mysql));
   put_info((char*) glob_buffer.ptr(),INFO_INFO);
 
-  put_info(COPYRIGHT_NOTICE, INFO_INFO);
+  put_info(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2011"), INFO_INFO);
 
 #ifdef HAVE_READLINE
   initialize_readline((char*) my_progname);
@@ -1591,7 +1589,7 @@ static void usage(int version)
 
   if (version)
     return;
-  printf("%s", COPYRIGHT_NOTICE);
+  puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2011"));
   printf("Usage: %s [OPTIONS] [database]\n", my_progname);
   my_print_help(my_long_options);
   print_defaults("my", load_default_groups);
@@ -4292,7 +4290,7 @@ sql_real_connect(char *host,char *databa
   {
     char init_command[100];
     sprintf(init_command,
-	    "SET SQL_SAFE_UPDATES=1,SQL_SELECT_LIMIT=%lu,SQL_MAX_JOIN_SIZE=%lu",
+	    "SET SQL_SAFE_UPDATES=1,SQL_SELECT_LIMIT=%lu,MAX_JOIN_SIZE=%lu",
 	    select_limit,max_join_size);
     mysql_options(&mysql, MYSQL_INIT_COMMAND, init_command);
   }
diff -pruN 5.1.58-1/client/mysqlcheck.c 5.1.61-2/client/mysqlcheck.c
--- 5.1.58-1/client/mysqlcheck.c	2011-07-01 15:22:22.000000000 +0000
+++ 5.1.61-2/client/mysqlcheck.c	2011-12-16 19:06:03.000000000 +0000
@@ -1,4 +1,5 @@
-/* Copyright (C) 2000 MySQL AB
+/*
+   Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -11,9 +12,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
-
-/* By Jani Tolonen, 2001-04-20, MySQL Development Team */
+   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+*/
 
 #define CHECK_VERSION "2.5.0"
 
@@ -22,6 +22,7 @@
 #include <mysql_version.h>
 #include <mysqld_error.h>
 #include <sslopt-vars.h>
+#include <welcome_copyright_notice.h> /* ORACLE_WELCOME_COPYRIGHT_NOTICE */
 
 /* Exit codes */
 
@@ -221,9 +222,7 @@ static void print_version(void)
 static void usage(void)
 {
   print_version();
-  puts("By Jani Tolonen, 2001-04-20, MySQL Development Team.\n");
-  puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\n");
-  puts("and you are welcome to modify and redistribute it under the GPL license.\n");
+  puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2011"));
   puts("This program can be used to CHECK (-c, -m, -C), REPAIR (-r), ANALYZE (-a),");
   puts("or OPTIMIZE (-o) tables. Some of the options (like -e or -q) can be");
   puts("used at the same time. Not all options are supported by all storage engines.");
diff -pruN 5.1.58-1/client/mysqldump.c 5.1.61-2/client/mysqldump.c
--- 5.1.58-1/client/mysqldump.c	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/client/mysqldump.c	2011-12-16 19:06:03.000000000 +0000
@@ -1,4 +1,5 @@
-/* Copyright 2000-2008 MySQL AB, 2008, 2009 Sun Microsystems, Inc.
+/*
+   Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -11,7 +12,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+*/
 
 /* mysqldump.c  - Dump a tables contents and format to an ASCII file
 **
@@ -52,6 +54,8 @@
 #include "mysqld_error.h"
 #include "../sql/ha_ndbcluster_tables.h"
 
+#include <welcome_copyright_notice.h> /* ORACLE_WELCOME_COPYRIGHT_NOTICE */
+
 /* Exit codes */
 
 #define EX_USAGE 1
@@ -567,8 +571,7 @@ static void short_usage_sub(void)
 static void usage(void)
 {
   print_version();
-  puts("By Igor Romanenko, Monty, Jani & Sinisa.");
-  puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license.\n");
+  puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2011"));
   puts("Dumping structure and contents of MySQL databases and tables.");
   short_usage_sub();
   print_defaults("my",load_default_groups);
diff -pruN 5.1.58-1/client/mysqlimport.c 5.1.61-2/client/mysqlimport.c
--- 5.1.58-1/client/mysqlimport.c	2011-07-01 15:22:22.000000000 +0000
+++ 5.1.61-2/client/mysqlimport.c	2011-12-16 19:06:03.000000000 +0000
@@ -1,4 +1,5 @@
-/* Copyright (C) 2000-2006 MySQL AB, 2009 Sun Microsystems, Inc.
+/*
+   Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -11,19 +12,14 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+*/
 
 /*
 **	   mysqlimport.c  - Imports all given files
 **			    into a table(s).
-**
-**			   *************************
-**			   *			   *
-**			   * AUTHOR: Monty & Jani  *
-**			   * DATE:   June 24, 1997 *
-**			   *			   *
-**			   *************************
 */
+
 #define IMPORT_VERSION "3.7"
 
 #include "client_priv.h"
@@ -40,6 +36,8 @@ pthread_mutex_t counter_mutex;
 pthread_cond_t count_threshhold;
 #endif
 
+#include <welcome_copyright_notice.h>   /* ORACLE_WELCOME_COPYRIGHT_NOTICE */
+
 static void db_error_with_table(MYSQL *mysql, char *table);
 static void db_error(MYSQL *mysql);
 static char *field_escape(char *to,const char *from,uint length);
@@ -198,8 +196,7 @@ static void print_version(void)
 static void usage(void)
 {
   print_version();
-  puts("Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.");
-  puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license.\n");
+  puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2011"));
   printf("\
 Loads tables from text files in various formats.  The base name of the\n\
 text file must be the name of the table that should be used.\n\
diff -pruN 5.1.58-1/client/mysqlshow.c 5.1.61-2/client/mysqlshow.c
--- 5.1.58-1/client/mysqlshow.c	2011-07-01 15:22:22.000000000 +0000
+++ 5.1.61-2/client/mysqlshow.c	2011-12-16 19:06:03.000000000 +0000
@@ -1,4 +1,5 @@
-/* Copyright (C) 2000-2006 MySQL AB
+/*
+   Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -11,7 +12,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+*/
 
 /* Show databases, tables or columns */
 
@@ -25,6 +27,7 @@
 #include <signal.h>
 #include <stdarg.h>
 #include <sslopt-vars.h>
+#include <welcome_copyright_notice.h>   /* ORACLE_WELCOME_COPYRIGHT_NOTICE */
 
 static char * host=0, *opt_password=0, *user=0;
 static my_bool opt_show_keys= 0, opt_compress= 0, opt_count=0, opt_status= 0;
@@ -253,8 +256,7 @@ static void print_version(void)
 static void usage(void)
 {
   print_version();
-  puts("Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.");
-  puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license.\n");
+  puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2011)"));
   puts("Shows the structure of a MySQL database (databases, tables, and columns).\n");
   printf("Usage: %s [OPTIONS] [database [table [column]]]\n",my_progname);
   puts("\n\
diff -pruN 5.1.58-1/client/mysqlslap.c 5.1.61-2/client/mysqlslap.c
--- 5.1.58-1/client/mysqlslap.c	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/client/mysqlslap.c	2011-12-16 19:06:03.000000000 +0000
@@ -1,4 +1,5 @@
-/* Copyright (C) 2005 MySQL AB, 2009 Sun Microsystems, Inc.
+/*
+   Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -11,7 +12,7 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
 
    original idea: Brian Aker via playing with ab for too many years
    coded by: Patrick Galbraith
diff -pruN 5.1.58-1/client/mysqltest.cc 5.1.61-2/client/mysqltest.cc
--- 5.1.58-1/client/mysqltest.cc	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/client/mysqltest.cc	2011-12-16 19:05:59.000000000 +0000
@@ -1,4 +1,5 @@
-/* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
+/*
+   Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -11,7 +12,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA */
+   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+*/
 
 /*
   mysqltest
@@ -22,13 +24,6 @@
   http://dev.mysql.com/doc/mysqltest/en/index.html
 
   Please keep the test framework tools identical in all versions!
-
-  Written by:
-  Sasha Pachev <sasha@mysql.com>
-  Matt Wagner  <matt@mysql.com>
-  Monty
-  Jani
-  Holyfoot
 */
 
 #define MTEST_VERSION "3.3"
@@ -51,6 +46,8 @@
 #include <signal.h>
 #include <my_stacktrace.h>
 
+#include <welcome_copyright_notice.h> // ORACLE_WELCOME_COPYRIGHT_NOTICE
+
 #ifdef __WIN__
 #include <crtdbg.h>
 #define SIGNAL_FMT "exception 0x%x"
@@ -454,6 +451,7 @@ TYPELIB command_typelib= {array_elements
 			  command_names, 0};
 
 DYNAMIC_STRING ds_res;
+struct st_command *curr_command= 0;
 
 char builtin_echo[FN_REFLEN];
 
@@ -2215,9 +2213,16 @@ void var_query_set(VAR *var, const char 
   init_dynamic_string(&ds_query, 0, (end - query) + 32, 256);
   do_eval(&ds_query, query, end, FALSE);
 
-  if (mysql_real_query(mysql, ds_query.str, ds_query.length))
-    die("Error running query '%s': %d %s", ds_query.str,
-	mysql_errno(mysql), mysql_error(mysql));
+  if (mysql_real_query(mysql, ds_query.str, ds_query.length)) 
+  {
+    handle_error (curr_command, mysql_errno(mysql), mysql_error(mysql),
+                  mysql_sqlstate(mysql), &ds_res);
+    /* If error was acceptable, return empty string */
+    dynstr_free(&ds_query);
+    eval_expr(var, "", 0);
+    DBUG_VOID_RETURN;
+  }
+  
   if (!(res= mysql_store_result(mysql)))
     die("Query '%s' didn't return a result set", ds_query.str);
   dynstr_free(&ds_query);
@@ -2318,8 +2323,15 @@ void var_set_query_get_value(struct st_c
 
   /* Run the query */
   if (mysql_real_query(mysql, ds_query.str, ds_query.length))
-    die("Error running query '%s': %d %s", ds_query.str,
-	mysql_errno(mysql), mysql_error(mysql));
+  {
+    handle_error (curr_command, mysql_errno(mysql), mysql_error(mysql),
+                  mysql_sqlstate(mysql), &ds_res);
+    /* If error was acceptable, return empty string */
+    dynstr_free(&ds_query);
+    eval_expr(var, "", 0);
+    DBUG_VOID_RETURN;
+  }
+
   if (!(res= mysql_store_result(mysql)))
     die("Query '%s' didn't return a result set", ds_query.str);
 
@@ -6123,8 +6135,7 @@ void print_version(void)
 void usage()
 {
   print_version();
-  printf("MySQL AB, by Sasha, Matt, Monty & Jani\n");
-  printf("This software comes with ABSOLUTELY NO WARRANTY\n\n");
+  puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2011"));
   printf("Runs a test against the mysql server and compares output with a results file.\n\n");
   printf("Usage: %s [OPTIONS] [database] < test_file\n", my_progname);
   my_print_help(my_long_options);
@@ -8151,6 +8162,8 @@ int main(int argc, char **argv)
     {
       command->last_argument= command->first_argument;
       processed = 1;
+      /* Need to remember this for handle_error() */
+      curr_command= command;
       switch (command->type) {
       case Q_CONNECT:
         do_connect(command);
diff -pruN 5.1.58-1/client/mysql_upgrade.c 5.1.61-2/client/mysql_upgrade.c
--- 5.1.58-1/client/mysql_upgrade.c	2011-07-01 15:22:22.000000000 +0000
+++ 5.1.61-2/client/mysql_upgrade.c	2011-12-16 19:06:03.000000000 +0000
@@ -1,4 +1,5 @@
-/* Copyright (C) 2000 MySQL AB
+/*
+   Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -11,12 +12,15 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+*/
 
 #include "client_priv.h"
 #include <sslopt-vars.h>
 #include "../scripts/mysql_fix_privilege_tables_sql.c"
 
+#include <welcome_copyright_notice.h> /* ORACLE_WELCOME_COPYRIGHT_NOTICE */
+
 #define VER "1.1"
 
 #ifdef HAVE_SYS_WAIT_H
@@ -226,6 +230,7 @@ get_one_option(int optid, const struct m
   switch (optid) {
 
   case '?':
+    puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2011"));
     printf("%s  Ver %s Distrib %s, for %s (%s)\n",
            my_progname, VER, MYSQL_SERVER_VERSION, SYSTEM_TYPE, MACHINE_TYPE);
     puts("MySQL utility for upgrading databases to new MySQL versions.\n");
diff -pruN 5.1.58-1/client/my_user.c 5.1.61-2/client/my_user.c
--- 5.1.58-1/client/my_user.c	2011-07-01 15:22:21.000000000 +0000
+++ 5.1.61-2/client/my_user.c	2011-12-16 19:06:03.000000000 +0000
@@ -1,4 +1,6 @@
-/* Copyright (C) 2005 MySQL AB
+/*
+   Copyright (c) 2006-2008 MySQL AB, 2009 Sun Microsystems, Inc.
+   Use is subject to license terms.
 
  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
@@ -11,7 +13,8 @@
 
  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+*/
 
 #include <my_user.h>
 #include <m_string.h>
diff -pruN 5.1.58-1/client/readline.cc 5.1.61-2/client/readline.cc
--- 5.1.58-1/client/readline.cc	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/client/readline.cc	2011-12-16 19:05:59.000000000 +0000
@@ -1,4 +1,5 @@
-/* Copyright (C) 2000 MySQL AB
+/*
+   Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -11,7 +12,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+*/
 
 /* readline for batch mode */
 
@@ -55,7 +57,7 @@ LINE_BUFFER *batch_readline_init(ulong m
 char *batch_readline(LINE_BUFFER *line_buff)
 {
   char *pos;
-  ulong out_length;
+  ulong out_length= 0;
 
   if (!(pos=intern_read_line(line_buff, &out_length)))
     return 0;
diff -pruN 5.1.58-1/client/sql_string.cc 5.1.61-2/client/sql_string.cc
--- 5.1.58-1/client/sql_string.cc	2011-07-01 15:22:23.000000000 +0000
+++ 5.1.61-2/client/sql_string.cc	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,5 @@
-/* Copyright (C) 2000 MySQL AB
+/*
+   Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -11,7 +12,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+*/
 
 /* This file is originally from the mysql distribution. Coded by monty */
 
@@ -116,7 +118,7 @@ bool String::set(ulonglong num, CHARSET_
 
 bool String::set(double num,uint decimals, CHARSET_INFO *cs)
 {
-  char buff[331];
+  char buff[FLOATING_POINT_BUFFER];
   uint dummy_errors;
 
   str_charset=cs;
@@ -186,7 +188,10 @@ end:
 #else
 #ifdef HAVE_SNPRINTF
   buff[sizeof(buff)-1]=0;			// Safety
-  snprintf(buff,sizeof(buff)-1, "%.*f",(int) decimals,num);
+  IF_DBUG(int num_chars= )
+    snprintf(buff, sizeof(buff)-1, "%.*f",(int) decimals, num);
+  DBUG_ASSERT(num_chars > 0);
+  DBUG_ASSERT(num_chars < (int) sizeof(buff));
 #else
   sprintf(buff,"%.*f",(int) decimals,num);
 #endif
diff -pruN 5.1.58-1/client/sql_string.h 5.1.61-2/client/sql_string.h
--- 5.1.58-1/client/sql_string.h	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/client/sql_string.h	2011-12-16 19:06:03.000000000 +0000
@@ -1,4 +1,5 @@
-/* Copyright (C) 2000 MySQL AB
+/*
+   Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -11,7 +12,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+*/
 
 /* This file is originally from the mysql distribution. Coded by monty */
 
diff -pruN 5.1.58-1/CMakeLists.txt 5.1.61-2/CMakeLists.txt
--- 5.1.58-1/CMakeLists.txt	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/CMakeLists.txt	2011-12-16 19:06:02.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2006 MySQL AB
+# Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
 # 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff -pruN 5.1.58-1/cmd-line-utils/libedit/chared.c 5.1.61-2/cmd-line-utils/libedit/chared.c
--- 5.1.58-1/cmd-line-utils/libedit/chared.c	2011-07-01 15:22:20.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/chared.c	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: chared.c,v 1.26 2009/02/06 12:45:25 sketch Exp $	*/
+/*	$NetBSD: chared.c,v 1.36 2011/10/23 17:37:55 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -59,13 +59,13 @@ cv_undo(EditLine *el)
 {
 	c_undo_t *vu = &el->el_chared.c_undo;
 	c_redo_t *r = &el->el_chared.c_redo;
-	unsigned int size;
+	size_t size;
 
 	/* Save entire line for undo */
-	size = el->el_line.lastchar - el->el_line.buffer;
-	vu->len = size;
-	vu->cursor = el->el_line.cursor - el->el_line.buffer;
-	memcpy(vu->buf, el->el_line.buffer, size);
+	size = (size_t)(el->el_line.lastchar - el->el_line.buffer);
+	vu->len = (ssize_t)size;
+	vu->cursor = (int)(el->el_line.cursor - el->el_line.buffer);
+	(void)memcpy(vu->buf, el->el_line.buffer, size * sizeof(*vu->buf));
 
 	/* save command info for redo */
 	r->count = el->el_state.doingarg ? el->el_state.argument : 0;
@@ -79,11 +79,11 @@ cv_undo(EditLine *el)
  *	Save yank/delete data for paste
  */
 protected void
-cv_yank(EditLine *el, const char *ptr, int size)
+cv_yank(EditLine *el, const Char *ptr, int size)
 {
 	c_kill_t *k = &el->el_chared.c_kill;
 
-	memcpy(k->buf, ptr, size +0u);
+	(void)memcpy(k->buf, ptr, (size_t)size * sizeof(*k->buf));
 	k->last = k->buf + size;
 }
 
@@ -94,10 +94,10 @@ cv_yank(EditLine *el, const char *ptr, i
 protected void
 c_insert(EditLine *el, int num)
 {
-	char *cp;
+	Char *cp;
 
 	if (el->el_line.lastchar + num >= el->el_line.limit) {
-		if (!ch_enlargebufs(el, num +0u))
+		if (!ch_enlargebufs(el, (size_t)num))
 			return;		/* can't go past end of buffer */
 	}
 
@@ -118,7 +118,7 @@ c_delafter(EditLine *el, int num)
 {
 
 	if (el->el_line.cursor + num > el->el_line.lastchar)
-		num = el->el_line.lastchar - el->el_line.cursor;
+		num = (int)(el->el_line.lastchar - el->el_line.cursor);
 
 	if (el->el_map.current != el->el_map.emacs) {
 		cv_undo(el);
@@ -126,7 +126,7 @@ c_delafter(EditLine *el, int num)
 	}
 
 	if (num > 0) {
-		char *cp;
+		Char *cp;
 
 		for (cp = el->el_line.cursor; cp <= el->el_line.lastchar; cp++)
 			*cp = cp[num];
@@ -142,7 +142,7 @@ c_delafter(EditLine *el, int num)
 protected void
 c_delafter1(EditLine *el)
 {
-	char *cp;
+	Char *cp;
 
 	for (cp = el->el_line.cursor; cp <= el->el_line.lastchar; cp++)
 		*cp = cp[1];
@@ -159,7 +159,7 @@ c_delbefore(EditLine *el, int num)
 {
 
 	if (el->el_line.cursor - num < el->el_line.buffer)
-		num = el->el_line.cursor - el->el_line.buffer;
+		num = (int)(el->el_line.cursor - el->el_line.buffer);
 
 	if (el->el_map.current != el->el_map.emacs) {
 		cv_undo(el);
@@ -167,7 +167,7 @@ c_delbefore(EditLine *el, int num)
 	}
 
 	if (num > 0) {
-		char *cp;
+		Char *cp;
 
 		for (cp = el->el_line.cursor - num;
 		    cp <= el->el_line.lastchar;
@@ -185,7 +185,7 @@ c_delbefore(EditLine *el, int num)
 protected void
 c_delbefore1(EditLine *el)
 {
-	char *cp;
+	Char *cp;
 
 	for (cp = el->el_line.cursor - 1; cp <= el->el_line.lastchar; cp++)
 		*cp = cp[1];
@@ -198,9 +198,9 @@ c_delbefore1(EditLine *el)
  *	Return if p is part of a word according to emacs
  */
 protected int
-ce__isword(int p)
+ce__isword(Int p)
 {
-	return (isalnum(p) || strchr("*?_-.[]~=", p) != NULL);
+        return Isalnum(p) || Strchr(STR("*?_-.[]~="), p) != NULL;
 }
 
 
@@ -208,11 +208,11 @@ ce__isword(int p)
  *	Return if p is part of a word according to vi
  */
 protected int
-cv__isword(int p)
+cv__isword(Int p)
 {
-	if (isalnum(p) || p == '_')
+	if (Isalnum(p) || p == '_')
 		return 1;
-	if (isgraph(p))
+	if (Isgraph(p))
 		return 2;
 	return 0;
 }
@@ -222,24 +222,24 @@ cv__isword(int p)
  *	Return if p is part of a big word according to vi
  */
 protected int
-cv__isWord(int p)
+cv__isWord(Int p)
 {
-	return (!isspace(p));
+	return !Isspace(p);
 }
 
 
 /* c__prev_word():
  *	Find the previous word
  */
-protected char *
-c__prev_word(char *p, char *low, int n, int (*wtest)(int))
+protected Char *
+c__prev_word(Char *p, Char *low, int n, int (*wtest)(Int))
 {
 	p--;
 
 	while (n--) {
-		while ((p >= low) && !(*wtest)((unsigned char) *p))
+		while ((p >= low) && !(*wtest)(*p))
 			p--;
-		while ((p >= low) && (*wtest)((unsigned char) *p))
+		while ((p >= low) && (*wtest)(*p))
 			p--;
 	}
 
@@ -248,117 +248,83 @@ c__prev_word(char *p, char *low, int n, 
 	if (p < low)
 		p = low;
 	/* cp now points where we want it */
-	return (p);
+	return p;
 }
 
 
 /* c__next_word():
  *	Find the next word
  */
-protected char *
-c__next_word(char *p, char *high, int n, int (*wtest)(int))
+protected Char *
+c__next_word(Char *p, Char *high, int n, int (*wtest)(Int))
 {
 	while (n--) {
-		while ((p < high) && !(*wtest)((unsigned char) *p))
+		while ((p < high) && !(*wtest)(*p))
 			p++;
-		while ((p < high) && (*wtest)((unsigned char) *p))
+		while ((p < high) && (*wtest)(*p))
 			p++;
 	}
 	if (p > high)
 		p = high;
 	/* p now points where we want it */
-	return (p);
+	return p;
 }
 
 /* cv_next_word():
  *	Find the next word vi style
  */
-protected char *
-cv_next_word(EditLine *el, char *p, char *high, int n, int (*wtest)(int))
+protected Char *
+cv_next_word(EditLine *el, Char *p, Char *high, int n, int (*wtest)(Int))
 {
 	int test;
 
 	while (n--) {
-		test = (*wtest)((unsigned char) *p);
-		while ((p < high) && (*wtest)((unsigned char) *p) == test)
+		test = (*wtest)(*p);
+		while ((p < high) && (*wtest)(*p) == test)
 			p++;
 		/*
 		 * vi historically deletes with cw only the word preserving the
 		 * trailing whitespace! This is not what 'w' does..
 		 */
 		if (n || el->el_chared.c_vcmd.action != (DELETE|INSERT))
-			while ((p < high) && isspace((unsigned char) *p))
+			while ((p < high) && Isspace(*p))
 				p++;
 	}
 
 	/* p now points where we want it */
 	if (p > high)
-		return (high);
+		return high;
 	else
-		return (p);
+		return p;
 }
 
 
 /* cv_prev_word():
  *	Find the previous word vi style
  */
-protected char *
-cv_prev_word(char *p, char *low, int n, int (*wtest)(int))
+protected Char *
+cv_prev_word(Char *p, Char *low, int n, int (*wtest)(Int))
 {
 	int test;
 
 	p--;
 	while (n--) {
-		while ((p > low) && isspace((unsigned char) *p))
+		while ((p > low) && Isspace(*p))
 			p--;
-		test = (*wtest)((unsigned char) *p);
-		while ((p >= low) && (*wtest)((unsigned char) *p) == test)
+		test = (*wtest)(*p);
+		while ((p >= low) && (*wtest)(*p) == test)
 			p--;
 	}
 	p++;
 
 	/* p now points where we want it */
 	if (p < low)
-		return (low);
+		return low;
 	else
-		return (p);
+		return p;
 }
 
 
-#ifdef notdef
-/* c__number():
- *	Ignore character p points to, return number appearing after that.
- * 	A '$' by itself means a big number; "$-" is for negative; '^' means 1.
- * 	Return p pointing to last char used.
- */
-protected char *
-c__number(
-    char *p,	/* character position */
-    int *num,	/* Return value	*/
-    int dval)	/* dval is the number to subtract from like $-3 */
-{
-	int i;
-	int sign = 1;
-
-	if (*++p == '^') {
-		*num = 1;
-		return (p);
-	}
-	if (*p == '$') {
-		if (*++p != '-') {
-			*num = 0x7fffffff;	/* Handle $ */
-			return (--p);
-		}
-		sign = -1;			/* Handle $- */
-		++p;
-	}
-	for (i = 0; isdigit((unsigned char) *p); i = 10 * i + *p++ - '0')
-		continue;
-	*num = (sign < 0 ? dval - i : i);
-	return (--p);
-}
-#endif
-
 /* cv_delfini():
  *	Finish vi delete action
  */
@@ -375,7 +341,7 @@ cv_delfini(EditLine *el)
 		/* sanity */
 		return;
 
-	size = el->el_line.cursor - el->el_chared.c_vcmd.pos;
+	size = (int)(el->el_line.cursor - el->el_chared.c_vcmd.pos);
 	if (size == 0)
 		size = 1;
 	el->el_line.cursor = el->el_chared.c_vcmd.pos;
@@ -397,48 +363,26 @@ cv_delfini(EditLine *el)
 }
 
 
-#ifdef notdef
-/* ce__endword():
- *	Go to the end of this word according to emacs
- */
-protected char *
-ce__endword(char *p, char *high, int n)
-{
-	p++;
-
-	while (n--) {
-		while ((p < high) && isspace((unsigned char) *p))
-			p++;
-		while ((p < high) && !isspace((unsigned char) *p))
-			p++;
-	}
-
-	p--;
-	return (p);
-}
-#endif
-
-
 /* cv__endword():
  *	Go to the end of this word according to vi
  */
-protected char *
-cv__endword(char *p, char *high, int n, int (*wtest)(int))
+protected Char *
+cv__endword(Char *p, Char *high, int n, int (*wtest)(Int))
 {
 	int test;
 
 	p++;
 
 	while (n--) {
-		while ((p < high) && isspace((unsigned char) *p))
+		while ((p < high) && Isspace(*p))
 			p++;
 
-		test = (*wtest)((unsigned char) *p);
-		while ((p < high) && (*wtest)((unsigned char) *p) == test)
+		test = (*wtest)(*p);
+		while ((p < high) && (*wtest)(*p) == test)
 			p++;
 	}
 	p--;
-	return (p);
+	return p;
 }
 
 /* ch_init():
@@ -449,24 +393,29 @@ ch_init(EditLine *el)
 {
 	c_macro_t *ma = &el->el_chared.c_macro;
 
-	el->el_line.buffer		= (char *) el_malloc(EL_BUFSIZ);
+	el->el_line.buffer		= el_malloc(EL_BUFSIZ *
+	    sizeof(*el->el_line.buffer));
 	if (el->el_line.buffer == NULL)
-		return (-1);
+		return -1;
 
-	(void) memset(el->el_line.buffer, 0, EL_BUFSIZ);
+	(void) memset(el->el_line.buffer, 0, EL_BUFSIZ *
+	    sizeof(*el->el_line.buffer));
 	el->el_line.cursor		= el->el_line.buffer;
 	el->el_line.lastchar		= el->el_line.buffer;
 	el->el_line.limit		= &el->el_line.buffer[EL_BUFSIZ - EL_LEAVE];
 
-	el->el_chared.c_undo.buf	= (char *) el_malloc(EL_BUFSIZ);
+	el->el_chared.c_undo.buf	= el_malloc(EL_BUFSIZ *
+	    sizeof(*el->el_chared.c_undo.buf));
 	if (el->el_chared.c_undo.buf == NULL)
-		return (-1);
-	(void) memset(el->el_chared.c_undo.buf, 0, EL_BUFSIZ);
+		return -1;
+	(void) memset(el->el_chared.c_undo.buf, 0, EL_BUFSIZ *
+	    sizeof(*el->el_chared.c_undo.buf));
 	el->el_chared.c_undo.len	= -1;
 	el->el_chared.c_undo.cursor	= 0;
-	el->el_chared.c_redo.buf	= (char *) el_malloc(EL_BUFSIZ);
+	el->el_chared.c_redo.buf	= el_malloc(EL_BUFSIZ *
+	    sizeof(*el->el_chared.c_redo.buf));
 	if (el->el_chared.c_redo.buf == NULL)
-		return (-1);
+		return -1;
 	el->el_chared.c_redo.pos	= el->el_chared.c_redo.buf;
 	el->el_chared.c_redo.lim	= el->el_chared.c_redo.buf + EL_BUFSIZ;
 	el->el_chared.c_redo.cmd	= ED_UNASSIGNED;
@@ -474,12 +423,16 @@ ch_init(EditLine *el)
 	el->el_chared.c_vcmd.action	= NOP;
 	el->el_chared.c_vcmd.pos	= el->el_line.buffer;
 
-	el->el_chared.c_kill.buf	= (char *) el_malloc(EL_BUFSIZ);
+	el->el_chared.c_kill.buf	= el_malloc(EL_BUFSIZ *
+	    sizeof(*el->el_chared.c_kill.buf));
 	if (el->el_chared.c_kill.buf == NULL)
-		return (-1);
-	(void) memset(el->el_chared.c_kill.buf, 0, EL_BUFSIZ);
+		return -1;
+	(void) memset(el->el_chared.c_kill.buf, 0, EL_BUFSIZ *
+	    sizeof(*el->el_chared.c_kill.buf));
 	el->el_chared.c_kill.mark	= el->el_line.buffer;
 	el->el_chared.c_kill.last	= el->el_chared.c_kill.buf;
+	el->el_chared.c_resizefun	= NULL;
+	el->el_chared.c_resizearg	= NULL;
 
 	el->el_map.current		= el->el_map.key;
 
@@ -491,10 +444,10 @@ ch_init(EditLine *el)
 
 	ma->level	= -1;
 	ma->offset	= 0;
-	ma->macro	= (char **) el_malloc(EL_MAXMACRO * sizeof(char *));
+	ma->macro	= el_malloc(EL_MAXMACRO * sizeof(*ma->macro));
 	if (ma->macro == NULL)
-		return (-1);
-	return (0);
+		return -1;
+	return 0;
 }
 
 /* ch_reset():
@@ -529,12 +482,11 @@ ch_reset(EditLine *el, int mclear)
 }
 
 private void
-ch__clearmacro(el)
-	EditLine *el;
+ch__clearmacro(EditLine *el)
 {
 	c_macro_t *ma = &el->el_chared.c_macro;
 	while (ma->level >= 0)
-		el_free((ptr_t)ma->macro[ma->level--]);
+		el_free(ma->macro[ma->level--]);
 }
 
 /* ch_enlargebufs():
@@ -542,14 +494,12 @@ ch__clearmacro(el)
  *	Returns 1 if successful, 0 if not.
  */
 protected int
-ch_enlargebufs(el, addlen)
-	EditLine *el;
-	size_t addlen;
+ch_enlargebufs(EditLine *el, size_t addlen)
 {
 	size_t sz, newsz;
-	char *newbuffer, *oldbuf, *oldkbuf;
+	Char *newbuffer, *oldbuf, *oldkbuf;
 
-	sz = el->el_line.limit - el->el_line.buffer + EL_LEAVE;
+	sz = (size_t)(el->el_line.limit - el->el_line.buffer + EL_LEAVE);
 	newsz = sz * 2;
 	/*
 	 * If newly required length is longer than current buffer, we need
@@ -563,12 +513,12 @@ ch_enlargebufs(el, addlen)
 	/*
 	 * Reallocate line buffer.
 	 */
-	newbuffer = el_realloc(el->el_line.buffer, newsz);
+	newbuffer = el_realloc(el->el_line.buffer, newsz * sizeof(*newbuffer));
 	if (!newbuffer)
 		return 0;
 
 	/* zero the newly added memory, leave old data in */
-	(void) memset(&newbuffer[sz], 0, newsz - sz);
+	(void) memset(&newbuffer[sz], 0, (newsz - sz) * sizeof(*newbuffer));
 	    
 	oldbuf = el->el_line.buffer;
 
@@ -581,12 +531,13 @@ ch_enlargebufs(el, addlen)
 	/*
 	 * Reallocate kill buffer.
 	 */
-	newbuffer = el_realloc(el->el_chared.c_kill.buf, newsz);
+	newbuffer = el_realloc(el->el_chared.c_kill.buf, newsz *
+	    sizeof(*newbuffer));
 	if (!newbuffer)
 		return 0;
 
 	/* zero the newly added memory, leave old data in */
-	(void) memset(&newbuffer[sz], 0, newsz - sz);
+	(void) memset(&newbuffer[sz], 0, (newsz - sz) * sizeof(*newbuffer));
 
 	oldkbuf = el->el_chared.c_kill.buf;
 
@@ -599,15 +550,17 @@ ch_enlargebufs(el, addlen)
 	/*
 	 * Reallocate undo buffer.
 	 */
-	newbuffer = el_realloc(el->el_chared.c_undo.buf, newsz);
+	newbuffer = el_realloc(el->el_chared.c_undo.buf,
+	    newsz * sizeof(*newbuffer));
 	if (!newbuffer)
 		return 0;
 
 	/* zero the newly added memory, leave old data in */
-	(void) memset(&newbuffer[sz], 0, newsz - sz);
+	(void) memset(&newbuffer[sz], 0, (newsz - sz) * sizeof(*newbuffer));
 	el->el_chared.c_undo.buf = newbuffer;
 
-	newbuffer = el_realloc(el->el_chared.c_redo.buf, newsz);
+	newbuffer = el_realloc(el->el_chared.c_redo.buf,
+	    newsz * sizeof(*newbuffer));
 	if (!newbuffer)
 		return 0;
 	el->el_chared.c_redo.pos = newbuffer +
@@ -621,6 +574,8 @@ ch_enlargebufs(el, addlen)
 
 	/* Safe to set enlarged buffer size */
 	el->el_line.limit  = &el->el_line.buffer[newsz - EL_LEAVE];
+	if (el->el_chared.c_resizefun)
+		(*el->el_chared.c_resizefun)(el, el->el_chared.c_resizearg);
 	return 1;
 }
 
@@ -630,20 +585,20 @@ ch_enlargebufs(el, addlen)
 protected void
 ch_end(EditLine *el)
 {
-	el_free((ptr_t) el->el_line.buffer);
+	el_free(el->el_line.buffer);
 	el->el_line.buffer = NULL;
 	el->el_line.limit = NULL;
-	el_free((ptr_t) el->el_chared.c_undo.buf);
+	el_free(el->el_chared.c_undo.buf);
 	el->el_chared.c_undo.buf = NULL;
-	el_free((ptr_t) el->el_chared.c_redo.buf);
+	el_free(el->el_chared.c_redo.buf);
 	el->el_chared.c_redo.buf = NULL;
 	el->el_chared.c_redo.pos = NULL;
 	el->el_chared.c_redo.lim = NULL;
 	el->el_chared.c_redo.cmd = ED_UNASSIGNED;
-	el_free((ptr_t) el->el_chared.c_kill.buf);
+	el_free(el->el_chared.c_kill.buf);
 	el->el_chared.c_kill.buf = NULL;
 	ch_reset(el, 1);
-	el_free((ptr_t) el->el_chared.c_macro.macro);
+	el_free(el->el_chared.c_macro.macro);
 	el->el_chared.c_macro.macro = NULL;
 }
 
@@ -652,21 +607,21 @@ ch_end(EditLine *el)
  *	Insert string at cursorI
  */
 public int
-el_insertstr(EditLine *el, const char *s)
+FUN(el,insertstr)(EditLine *el, const Char *s)
 {
 	size_t len;
 
-	if ((len = strlen(s)) == 0)
-		return (-1);
+	if ((len = Strlen(s)) == 0)
+		return -1;
 	if (el->el_line.lastchar + len >= el->el_line.limit) {
 		if (!ch_enlargebufs(el, len))
-			return (-1);
+			return -1;
 	}
 
 	c_insert(el, (int)len);
 	while (*s)
 		*el->el_line.cursor++ = *s++;
-	return (0);
+	return 0;
 }
 
 
@@ -692,15 +647,15 @@ el_deletestr(EditLine *el, int n)
  *	Get a string
  */
 protected int
-c_gets(EditLine *el, char *buf, const char *prompt)
+c_gets(EditLine *el, Char *buf, const Char *prompt)
 {
-	char ch;
-	int len;
-	char *cp = el->el_line.buffer;
+	Char ch;
+	ssize_t len;
+	Char *cp = el->el_line.buffer;
 
 	if (prompt) {
-		len = strlen(prompt);
-		memcpy(cp, prompt, len + 0u);
+		len = (ssize_t)Strlen(prompt);
+		(void)memcpy(cp, prompt, (size_t)len * sizeof(*cp));
 		cp += len;
 	}
 	len = 0;
@@ -711,7 +666,7 @@ c_gets(EditLine *el, char *buf, const ch
 		el->el_line.lastchar = cp + 1;
 		re_refresh(el);
 
-		if (el_getc(el, &ch) != 1) {
+		if (FUN(el,getc)(el, &ch) != 1) {
 			ed_end_of_file(el, 0);
 			len = -1;
 			break;
@@ -721,7 +676,7 @@ c_gets(EditLine *el, char *buf, const ch
 
 		case 0010:	/* Delete and backspace */
 		case 0177:
-			if (len <= 0) {
+			if (len == 0) {
 				len = -1;
 				break;
 			}
@@ -735,8 +690,8 @@ c_gets(EditLine *el, char *buf, const ch
 			break;
 
 		default:
-			if (len >= EL_BUFSIZ - 16)
-				term_beep(el);
+			if (len >= (ssize_t)(EL_BUFSIZ - 16))
+				terminal_beep(el);
 			else {
 				buf[len++] = ch;
 				*cp++ = ch;
@@ -749,7 +704,7 @@ c_gets(EditLine *el, char *buf, const ch
 	el->el_line.buffer[0] = '\0';
 	el->el_line.lastchar = el->el_line.buffer;
 	el->el_line.cursor = el->el_line.buffer;
-	return len;
+	return (int)len;
 }
 
 
@@ -759,18 +714,26 @@ c_gets(EditLine *el, char *buf, const ch
 protected int
 c_hpos(EditLine *el)
 {
-	char *ptr;
+	Char *ptr;
 
 	/*
 	 * Find how many characters till the beginning of this line.
 	 */
 	if (el->el_line.cursor == el->el_line.buffer)
-		return (0);
+		return 0;
 	else {
 		for (ptr = el->el_line.cursor - 1;
 		     ptr >= el->el_line.buffer && *ptr != '\n';
 		     ptr--)
 			continue;
-		return (el->el_line.cursor - ptr - 1);
+		return (int)(el->el_line.cursor - ptr - 1);
 	}
 }
+
+protected int
+ch_resizefun(EditLine *el, el_zfunc_t f, void *a)
+{
+	el->el_chared.c_resizefun = f;
+	el->el_chared.c_resizearg = a;
+	return 0;
+}
diff -pruN 5.1.58-1/cmd-line-utils/libedit/chared.h 5.1.61-2/cmd-line-utils/libedit/chared.h
--- 5.1.58-1/cmd-line-utils/libedit/chared.h	2011-07-01 15:22:20.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/chared.h	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: chared.h,v 1.17 2006/03/06 21:11:56 christos Exp $	*/
+/*	$NetBSD: chared.h,v 1.21 2010/08/28 15:44:59 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -63,25 +63,25 @@
 typedef struct c_macro_t {
 	int	  level;
 	int	  offset;
-	char	**macro;
+	Char	**macro;
 } c_macro_t;
 
 /*
  * Undo information for vi - no undo in emacs (yet)
  */
 typedef struct c_undo_t {
-	int	 len;			/* length of saved line */
+	ssize_t	 len;			/* length of saved line */
 	int	 cursor;		/* position of saved cursor */
-	char	*buf;			/* full saved text */
+	Char	*buf;			/* full saved text */
 } c_undo_t;
 
 /* redo for vi */
 typedef struct c_redo_t {
-	char	*buf;			/* redo insert key sequence */
-	char	*pos;
-	char	*lim;
+	Char	*buf;			/* redo insert key sequence */
+	Char	*pos;
+	Char	*lim;
 	el_action_t	cmd;		/* command to redo */
-	char	ch;			/* char that invoked it */
+	Char	ch;			/* char that invoked it */
 	int	count;
 	int	action;			/* from cv_action() */
 } c_redo_t;
@@ -91,18 +91,20 @@ typedef struct c_redo_t {
  */
 typedef struct c_vcmd_t {
 	int	 action;
-	char	*pos;
+	Char	*pos;
 } c_vcmd_t;
 
 /*
  * Kill buffer for emacs
  */
 typedef struct c_kill_t {
-	char	*buf;
-	char	*last;
-	char	*mark;
+	Char	*buf;
+	Char	*last;
+	Char	*mark;
 } c_kill_t;
 
+typedef void (*el_zfunc_t)(EditLine *, void *);
+
 /*
  * Note that we use both data structures because the user can bind
  * commands from both editors!
@@ -113,13 +115,14 @@ typedef struct el_chared_t {
 	c_redo_t	c_redo;
 	c_vcmd_t	c_vcmd;
 	c_macro_t	c_macro;
+	el_zfunc_t	c_resizefun;
+	void *		c_resizearg;
 } el_chared_t;
 
 
 #define	STRQQ		"\"\""
 
 #define	isglob(a)	(strchr("*[]?", (a)) != NULL)
-#define	isword(a)	(el_isprint(a))
 
 #define	NOP		0x00
 #define	DELETE		0x01
@@ -140,27 +143,28 @@ typedef struct el_chared_t {
 #include "fcns.h"
 
 
-protected int	 cv__isword(int);
-protected int	 cv__isWord(int);
+protected int	 cv__isword(Int);
+protected int	 cv__isWord(Int);
 protected void	 cv_delfini(EditLine *);
-protected char	*cv__endword(char *, char *, int, int (*)(int));
-protected int	 ce__isword(int);
+protected Char	*cv__endword(Char *, Char *, int, int (*)(Int));
+protected int	 ce__isword(Int);
 protected void	 cv_undo(EditLine *);
-protected void	 cv_yank(EditLine *, const char *, int);
-protected char	*cv_next_word(EditLine*, char *, char *, int, int (*)(int));
-protected char	*cv_prev_word(char *, char *, int, int (*)(int));
-protected char	*c__next_word(char *, char *, int, int (*)(int));
-protected char	*c__prev_word(char *, char *, int, int (*)(int));
+protected void	 cv_yank(EditLine *, const Char *, int);
+protected Char	*cv_next_word(EditLine*, Char *, Char *, int, int (*)(Int));
+protected Char	*cv_prev_word(Char *, Char *, int, int (*)(Int));
+protected Char	*c__next_word(Char *, Char *, int, int (*)(Int));
+protected Char	*c__prev_word(Char *, Char *, int, int (*)(Int));
 protected void	 c_insert(EditLine *, int);
 protected void	 c_delbefore(EditLine *, int);
 protected void	 c_delbefore1(EditLine *);
 protected void	 c_delafter(EditLine *, int);
 protected void	 c_delafter1(EditLine *);
-protected int	 c_gets(EditLine *, char *, const char *);
+protected int	 c_gets(EditLine *, Char *, const Char *);
 protected int	 c_hpos(EditLine *);
 
 protected int	 ch_init(EditLine *);
 protected void	 ch_reset(EditLine *, int);
+protected int	 ch_resizefun(EditLine *, el_zfunc_t, void *);
 protected int	 ch_enlargebufs(EditLine *, size_t);
 protected void	 ch_end(EditLine *);
 
diff -pruN 5.1.58-1/cmd-line-utils/libedit/chartype.c 5.1.61-2/cmd-line-utils/libedit/chartype.c
--- 5.1.58-1/cmd-line-utils/libedit/chartype.c	1970-01-01 00:00:00.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/chartype.c	2011-12-16 19:06:04.000000000 +0000
@@ -0,0 +1,361 @@
+/*	$NetBSD: chartype.c,v 1.10 2011/08/16 16:25:15 christos Exp $	*/
+
+/*-
+ * Copyright (c) 2009 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *        This product includes software developed by the NetBSD
+ *        Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * chartype.c: character classification and meta information
+ */
+#include "config.h"
+#if !defined(lint) && !defined(SCCSID)
+#endif /* not lint && not SCCSID */
+#include "el.h"
+#include <stdlib.h>
+
+#define CT_BUFSIZ ((size_t)1024)
+
+#ifdef WIDECHAR
+protected void
+ct_conv_buff_resize(ct_buffer_t *conv, size_t mincsize, size_t minwsize)
+{
+	void *p;
+	if (mincsize > conv->csize) {
+		conv->csize = mincsize;
+		p = el_realloc(conv->cbuff, conv->csize * sizeof(*conv->cbuff));
+		if (p == NULL) {
+			conv->csize = 0;
+			el_free(conv->cbuff);
+			conv->cbuff = NULL;
+		} else 
+			conv->cbuff = p;
+	}
+
+	if (minwsize > conv->wsize) {
+		conv->wsize = minwsize;
+		p = el_realloc(conv->wbuff, conv->wsize * sizeof(*conv->wbuff));
+		if (p == NULL) {
+			conv->wsize = 0;
+			el_free(conv->wbuff);
+			conv->wbuff = NULL;
+		} else
+			conv->wbuff = p;
+	}
+}
+
+
+public char *
+ct_encode_string(const Char *s, ct_buffer_t *conv)
+{
+	char *dst;
+	ssize_t used = 0;
+	mbstate_t state;
+
+	memset(&state, 0, sizeof(mbstate_t));
+
+	if (!s)
+		return NULL;
+	if (!conv->cbuff)
+		ct_conv_buff_resize(conv, CT_BUFSIZ, (size_t)0);
+	if (!conv->cbuff)
+		return NULL;
+
+	dst = conv->cbuff;
+	while (*s) {
+		used = (ssize_t)(conv->csize - (size_t)(dst - conv->cbuff));
+		if (used < 5) {
+			used = dst - conv->cbuff;
+			ct_conv_buff_resize(conv, conv->csize + CT_BUFSIZ,
+			    (size_t)0);
+			if (!conv->cbuff)
+				return NULL;
+			dst = conv->cbuff + used;
+		}
+		used = ct_encode_char(dst, (size_t)5, *s, &state);
+		if (used == -1) /* failed to encode, need more buffer space */
+			abort();
+		++s;
+		dst += used;
+	}
+	*dst = '\0';
+	return conv->cbuff;
+}
+
+public Char *
+ct_decode_string(const char *s, ct_buffer_t *conv)
+{
+	size_t len = 0;
+
+	if (!s)
+		return NULL;
+	if (!conv->wbuff)
+		ct_conv_buff_resize(conv, (size_t)0, CT_BUFSIZ);
+	if (!conv->wbuff)
+		return NULL;
+
+	len = ct_mbstowcs(NULL, s, (size_t)0);
+	if (len == (size_t)-1)
+		return NULL;
+	if (len > conv->wsize)
+		ct_conv_buff_resize(conv, (size_t)0, len + 1);
+	if (!conv->wbuff)
+		return NULL;
+	ct_mbstowcs(conv->wbuff, s, conv->wsize);
+	return conv->wbuff;
+}
+
+
+protected Char **
+ct_decode_argv(int argc, const char *argv[], ct_buffer_t *conv)
+{
+	size_t bufspace;
+	int i;
+	Char *p;
+	Char **wargv;
+	ssize_t bytes;
+	mbstate_t state;
+
+	/* Make sure we have enough space in the conversion buffer to store all
+	 * the argv strings. */
+	for (i = 0, bufspace = 0; i < argc; ++i)
+		bufspace += argv[i] ? strlen(argv[i]) + 1 : 0;
+	ct_conv_buff_resize(conv, (size_t)0, bufspace);
+	if (!conv->wsize)
+		return NULL;
+
+	wargv = el_malloc((size_t)argc * sizeof(*wargv));
+
+	for (i = 0, p = conv->wbuff; i < argc; ++i) {
+		if (!argv[i]) {   /* don't pass null pointers to mbsrtowcs */
+			wargv[i] = NULL;
+			continue;
+		} else {
+			wargv[i] = p;
+			memset(&state, 0, sizeof(mbstate_t));
+			bytes = (ssize_t)mbsrtowcs(p, argv + i, bufspace, &state);
+		}
+		if (bytes == -1) {
+			el_free(wargv);
+			return NULL;
+		} else
+			bytes++;  /* include '\0' in the count */
+		bufspace -= (size_t)bytes;
+		p += bytes;
+	}
+
+	return wargv;
+}
+
+
+protected size_t
+ct_enc_width(Char c)
+{
+	/* UTF-8 encoding specific values */
+	if (c < 0x80)
+		return 1;
+	else if (c < 0x0800)
+		return 2;
+	else if (c < 0x10000)
+		return 3;
+	else if (c < 0x110000)
+		return 4;
+	else
+		return 0; /* not a valid codepoint */
+}
+
+protected ssize_t
+ct_encode_char(char *dst, size_t len, Char c, mbstate_t *state)
+{
+	ssize_t l = 0;
+
+	if (len < ct_enc_width(c))
+		return -1;
+
+	l = wcrtomb(dst, c, state);
+
+	if (l < 0) {
+		memset (state, 0, sizeof (mbstate_t));
+		l = 0;
+	}
+	return l;
+}
+#endif
+
+protected const Char *
+ct_visual_string(const Char *s)
+{
+	static Char *buff = NULL;
+	static size_t buffsize = 0;
+	void *p;
+	Char *dst;
+	ssize_t used = 0;
+
+	if (!s)
+		return NULL;
+	if (!buff) {
+	    buffsize = CT_BUFSIZ;
+	    buff = el_malloc(buffsize * sizeof(*buff));
+	}
+	dst = buff;
+	while (*s) {
+		used = ct_visual_char(dst, buffsize - (size_t)(dst - buff), *s);
+		if (used == -1) { /* failed to encode, need more buffer space */
+			used = dst - buff;
+			buffsize += CT_BUFSIZ;
+			p = el_realloc(buff, buffsize * sizeof(*buff));
+			if (p == NULL)
+				goto out;
+			buff = p;
+			dst = buff + used;
+			/* don't increment s here - we want to retry it! */
+		}
+		else
+		    ++s;
+		dst += used;
+	}
+	if (dst >= (buff + buffsize)) { /* sigh */
+		buffsize += 1;
+		p = el_realloc(buff, buffsize * sizeof(*buff));
+		if (p == NULL)
+			goto out;
+		buff = p;
+		dst = buff + buffsize - 1;
+	}
+	*dst = 0;
+	return buff;
+out:
+	el_free(buff);
+	buffsize = 0;
+	return NULL;
+}
+
+
+protected int
+ct_visual_width(Char c)
+{
+	int t = ct_chr_class(c);
+	switch (t) {
+	case CHTYPE_ASCIICTL:
+		return 2; /* ^@ ^? etc. */
+	case CHTYPE_TAB:
+		return 1; /* Hmm, this really need to be handled outside! */
+	case CHTYPE_NL:
+		return 0; /* Should this be 1 instead? */
+#ifdef WIDECHAR
+	case CHTYPE_PRINT:
+		return wcwidth(c);
+	case CHTYPE_NONPRINT:
+		if (c > 0xffff) /* prefer standard 4-byte display over 5-byte */
+			return 8; /* \U+12345 */
+		else
+			return 7; /* \U+1234 */
+#else
+	case CHTYPE_PRINT:
+		return 1;
+	case CHTYPE_NONPRINT:
+		return 4; /* \123 */
+#endif
+	default:
+		return 0; /* should not happen */
+	}
+}
+
+
+protected ssize_t
+ct_visual_char(Char *dst, size_t len, Char c)
+{
+	int t = ct_chr_class(c);
+	switch (t) {
+	case CHTYPE_TAB:
+	case CHTYPE_NL:
+	case CHTYPE_ASCIICTL:
+		if (len < 2)
+			return -1;   /* insufficient space */
+		*dst++ = '^';
+		if (c == '\177')
+			*dst = '?'; /* DEL -> ^? */
+		else
+			*dst = c | 0100;    /* uncontrolify it */
+		return 2;
+	case CHTYPE_PRINT:
+		if (len < 1)
+			return -1;  /* insufficient space */
+		*dst = c;
+		return 1;
+	case CHTYPE_NONPRINT:
+		/* we only use single-width glyphs for display,
+		 * so this is right */
+		if ((ssize_t)len < ct_visual_width(c))
+			return -1;   /* insufficient space */
+#ifdef WIDECHAR
+		*dst++ = '\\';
+		*dst++ = 'U';
+		*dst++ = '+';
+#define tohexdigit(v) "0123456789ABCDEF"[v]
+		if (c > 0xffff) /* prefer standard 4-byte display over 5-byte */
+			*dst++ = tohexdigit(((unsigned int) c >> 16) & 0xf);
+		*dst++ = tohexdigit(((unsigned int) c >> 12) & 0xf);
+		*dst++ = tohexdigit(((unsigned int) c >>  8) & 0xf);
+		*dst++ = tohexdigit(((unsigned int) c >>  4) & 0xf);
+		*dst   = tohexdigit(((unsigned int) c      ) & 0xf);
+		return c > 0xffff ? 8 : 7;
+#else
+		*dst++ = '\\';
+#define tooctaldigit(v) ((v) + '0')
+		*dst++ = tooctaldigit(((unsigned int) c >> 6) & 0x7);
+		*dst++ = tooctaldigit(((unsigned int) c >> 3) & 0x7);
+		*dst++ = tooctaldigit(((unsigned int) c     ) & 0x7);
+#endif
+		/*FALLTHROUGH*/
+	/* these two should be handled outside this function */
+	default:            /* we should never hit the default */
+		return 0;
+	}
+}
+
+
+
+
+protected int
+ct_chr_class(Char c)
+{
+	if (c == '\t')
+		return CHTYPE_TAB;
+	else if (c == '\n')
+		return CHTYPE_NL;
+	else if (IsASCII(c) && Iscntrl(c))
+		return CHTYPE_ASCIICTL;
+	else if (Isprint(c))
+		return CHTYPE_PRINT;
+	else
+		return CHTYPE_NONPRINT;
+}
diff -pruN 5.1.58-1/cmd-line-utils/libedit/chartype.h 5.1.61-2/cmd-line-utils/libedit/chartype.h
--- 5.1.58-1/cmd-line-utils/libedit/chartype.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/chartype.h	2011-12-16 19:06:04.000000000 +0000
@@ -0,0 +1,252 @@
+/*	$NetBSD: chartype.h,v 1.8 2011/07/29 23:44:44 christos Exp $	*/
+
+/*-
+ * Copyright (c) 2009 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *        This product includes software developed by the NetBSD
+ *        Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _h_chartype_f
+#define _h_chartype_f
+
+
+
+#ifdef WIDECHAR
+
+/* Ideally we should also test the value of the define to see if it
+ * supports non-BMP code points without requiring UTF-16, but nothing
+ * seems to actually advertise this properly, despite Unicode 3.1 having
+ * been around since 2001... */
+
+/* XXXMYSQL : Added FreeBSD to bypass this check.
+  TODO : Verify if FreeBSD stores ISO 10646 in wchar_t. */
+#if !defined(__NetBSD__) && !defined(__sun) \
+  && !(defined(__APPLE__) && defined(__MACH__)) \
+  && !defined(__FreeBSD__)
+#ifndef __STDC_ISO_10646__
+/* In many places it is assumed that the first 127 code points are ASCII
+ * compatible, so ensure wchar_t indeed does ISO 10646 and not some other
+ * funky encoding that could break us in weird and wonderful ways. */
+	#error wchar_t must store ISO 10646 characters
+#endif
+#endif
+
+/* Oh for a <uchar.h> with char32_t and __STDC_UTF_32__ in it...
+ * ref: ISO/IEC DTR 19769
+ */
+#if WCHAR_MAX < INT32_MAX
+#warning Build environment does not support non-BMP characters
+#endif
+
+#ifndef HAVE_WCSDUP
+wchar_t *wcsdup(const wchar_t *s);
+#endif
+
+#define ct_wctomb            wctomb
+#define ct_wctomb_reset      wctomb(0,0)
+#define ct_wcstombs          wcstombs
+#define ct_mbstowcs          mbstowcs
+
+#define Char			wchar_t
+#define Int			wint_t
+#define FUN(prefix,rest)	prefix ## _w ## rest
+#define FUNW(type)		type ## _w
+#define TYPE(type)		type ## W
+#define FSTR			"%ls"
+#define STR(x) 			L ## x
+#define UC(c)			c
+#define Isalpha(x)  iswalpha(x)
+#define Isalnum(x)  iswalnum(x)
+#define Isgraph(x)  iswgraph(x)
+#define Isspace(x)  iswspace(x)
+#define Isdigit(x)  iswdigit(x)
+#define Iscntrl(x)  iswcntrl(x)
+#define Isprint(x)  iswprint(x)
+
+#define Isupper(x)  iswupper(x)
+#define Islower(x)  iswlower(x)
+#define Toupper(x)  towupper(x)
+#define Tolower(x)  towlower(x)
+
+#define IsASCII(x)  (x < 0x100)
+
+#define Strlen(x)       wcslen(x)
+#define Strchr(s,c)     wcschr(s,c)
+#define Strrchr(s,c)    wcsrchr(s,c)
+#define Strstr(s,v)     wcsstr(s,v)
+#define Strdup(x)       wcsdup(x)
+#define Strcpy(d,s)     wcscpy(d,s)
+#define Strncpy(d,s,n)  wcsncpy(d,s,n)
+#define Strncat(d,s,n)  wcsncat(d,s,n)
+
+#define Strcmp(s,v)     wcscmp(s,v)
+#define Strncmp(s,v,n)  wcsncmp(s,v,n)
+#define Strcspn(s,r)    wcscspn(s,r)
+
+#define Strtol(p,e,b)   wcstol(p,e,b)
+
+#define Width(c)	wcwidth(c)
+
+#else /* NARROW */
+
+#define ct_mbtowc            error
+#define ct_mbtowc_reset      
+#define ct_wctomb            error
+#define ct_wctomb_reset      
+#define ct_wcstombs(a, b, c)    (strncpy(a, b, c), strlen(a))
+#define ct_mbstowcs(a, b, c)    (strncpy(a, b, c), strlen(a))
+
+#define Char			char
+#define Int			int
+#define FUN(prefix,rest)	prefix ## _ ## rest
+#define FUNW(type)		type
+#define TYPE(type)		type
+#define FSTR			"%s"
+#define STR(x) 			x
+#define UC(c)			(unsigned char)(c)
+
+#define Isalpha(x)  isalpha((unsigned char)x)
+#define Isalnum(x)  isalnum((unsigned char)x)
+#define Isgraph(x)  isgraph((unsigned char)x)
+#define Isspace(x)  isspace((unsigned char)x)
+#define Isdigit(x)  isdigit((unsigned char)x)
+#define Iscntrl(x)  iscntrl((unsigned char)x)
+#define Isprint(x)  isprint((unsigned char)x)
+
+#define Isupper(x)  isupper((unsigned char)x)
+#define Islower(x)  islower((unsigned char)x)
+#define Toupper(x)  toupper((unsigned char)x)
+#define Tolower(x)  tolower((unsigned char)x)
+
+#define IsASCII(x)  isascii((unsigned char)x)
+
+#define Strlen(x)       strlen(x)
+#define Strchr(s,c)     strchr(s,c)
+#define Strrchr(s,c)    strrchr(s,c)
+#define Strstr(s,v)     strstr(s,v)
+#define Strdup(x)       strdup(x)
+#define Strcpy(d,s)     strcpy(d,s)
+#define Strncpy(d,s,n)  strncpy(d,s,n)
+#define Strncat(d,s,n)  strncat(d,s,n)
+
+#define Strcmp(s,v)     strcmp(s,v)
+#define Strncmp(s,v,n)  strncmp(s,v,n)
+#define Strcspn(s,r)    strcspn(s,r)
+
+#define Strtol(p,e,b)   strtol(p,e,b)
+
+#define Width(c)	1
+
+#endif
+
+
+#ifdef WIDECHAR
+/*
+ * Conversion buffer
+ */
+typedef struct ct_buffer_t {
+        char    *cbuff;
+        size_t  csize;
+        Char *wbuff;
+        size_t  wsize;
+} ct_buffer_t;
+
+#define ct_encode_string __ct_encode_string
+/* Encode a wide-character string and return the UTF-8 encoded result. */
+public char *ct_encode_string(const Char *, ct_buffer_t *);
+
+#define ct_decode_string __ct_decode_string
+/* Decode a (multi)?byte string and return the wide-character string result. */
+public Char *ct_decode_string(const char *, ct_buffer_t *);
+
+/* Decode a (multi)?byte argv string array.
+ * The pointer returned must be free()d when done. */
+protected Char **ct_decode_argv(int, const char *[],  ct_buffer_t *);
+
+/* Resizes the conversion buffer(s) if needed. */
+protected void ct_conv_buff_resize(ct_buffer_t *, size_t, size_t);
+protected ssize_t ct_encode_char(char *, size_t, Char, mbstate_t *);
+protected size_t ct_enc_width(Char);
+
+#define ct_free_argv(s)	el_free(s)
+
+#else
+#define	ct_encode_string(s, b)	(s)
+#define ct_decode_string(s, b)	(s)
+#define ct_decode_argv(l, s, b)	(s)
+#define ct_conv_buff_resize(b, os, ns)
+#define ct_encode_char(d, l, s, ps)	(*d = s, 1)
+#define ct_free_argv(s)
+#endif
+
+#ifndef NARROWCHAR
+/* Encode a characted into the destination buffer, provided there is sufficent
+ * buffer space available. Returns the number of bytes used up (zero if the
+ * character cannot be encoded, -1 if there was not enough space available). */
+
+/* The maximum buffer size to hold the most unwieldly visual representation,
+ * in this case \U+nnnnn. */
+#define VISUAL_WIDTH_MAX ((size_t)8)
+
+/* The terminal is thought of in terms of X columns by Y lines. In the cases
+ * where a wide character takes up more than one column, the adjacent 
+ * occupied column entries will contain this faux character. */
+#define MB_FILL_CHAR ((Char)-1)
+
+/* Visual width of character c, taking into account ^? , \0177 and \U+nnnnn
+ * style visual expansions. */
+protected int ct_visual_width(Char);
+
+/* Turn the given character into the appropriate visual format, matching
+ * the width given by ct_visual_width(). Returns the number of characters used
+ * up, or -1 if insufficient space. Buffer length is in count of Char's. */
+protected ssize_t ct_visual_char(Char *, size_t, Char);
+
+/* Convert the given string into visual format, using the ct_visual_char()
+ * function. Uses a static buffer, so not threadsafe. */
+protected const Char *ct_visual_string(const Char *);
+
+
+/* printable character, use ct_visual_width() to find out display width */
+#define CHTYPE_PRINT        ( 0)
+/* control character found inside the ASCII portion of the charset */
+#define CHTYPE_ASCIICTL     (-1)
+/* a \t */
+#define CHTYPE_TAB          (-2)
+/* a \n */
+#define CHTYPE_NL           (-3)
+/* non-printable character */
+#define CHTYPE_NONPRINT     (-4)
+/* classification of character c, as one of the above defines */
+protected int ct_chr_class(Char c);
+#endif
+
+
+#endif /* _chartype_f */
diff -pruN 5.1.58-1/cmd-line-utils/libedit/common.c 5.1.61-2/cmd-line-utils/libedit/common.c
--- 5.1.58-1/cmd-line-utils/libedit/common.c	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/common.c	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: common.c,v 1.21 2008/09/30 08:37:42 aymeric Exp $	*/
+/*	$NetBSD: common.c,v 1.28 2011/07/29 20:58:07 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -51,12 +51,12 @@ static char sccsid[] = "@(#)common.c	8.1
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_end_of_file(EditLine *el, int c __attribute__((__unused__)))
+ed_end_of_file(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	re_goto_bottom(el);
 	*el->el_line.lastchar = '\0';
-	return (CC_EOF);
+	return CC_EOF;
 }
 
 
@@ -65,12 +65,12 @@ ed_end_of_file(EditLine *el, int c __att
  *	Insert a character [bound to all insert keys]
  */
 protected el_action_t
-ed_insert(EditLine *el, int c)
+ed_insert(EditLine *el, Int c)
 {
 	int count = el->el_state.argument;
 
 	if (c == '\0')
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	if (el->el_line.lastchar + el->el_state.argument >=
 	    el->el_line.limit) {
@@ -98,7 +98,7 @@ ed_insert(EditLine *el, int c)
 	if (el->el_state.inputmode == MODE_REPLACE_1)
 		return vi_command_mode(el, 0);
 
-	return (CC_NORM);
+	return CC_NORM;
 }
 
 
@@ -108,12 +108,12 @@ ed_insert(EditLine *el, int c)
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_delete_prev_word(EditLine *el, int c __attribute__((__unused__)))
+ed_delete_prev_word(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *cp, *p, *kp;
+	Char *cp, *p, *kp;
 
 	if (el->el_line.cursor == el->el_line.buffer)
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	cp = c__prev_word(el->el_line.cursor, el->el_line.buffer,
 	    el->el_state.argument, ce__isword);
@@ -122,11 +122,11 @@ ed_delete_prev_word(EditLine *el, int c 
 		*kp++ = *p;
 	el->el_chared.c_kill.last = kp;
 
-	c_delbefore(el, el->el_line.cursor - cp);	/* delete before dot */
+	c_delbefore(el, (int)(el->el_line.cursor - cp));/* delete before dot */
 	el->el_line.cursor = cp;
 	if (el->el_line.cursor < el->el_line.buffer)
 		el->el_line.cursor = el->el_line.buffer; /* bounds check */
-	return (CC_REFRESH);
+	return CC_REFRESH;
 }
 
 
@@ -136,9 +136,9 @@ ed_delete_prev_word(EditLine *el, int c 
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_delete_next_char(EditLine *el, int c __attribute__((__unused__)))
+ed_delete_next_char(EditLine *el, Int c __attribute__((__unused__)))
 {
-#ifdef notdef			/* XXX */
+#ifdef DEBUG_EDIT
 #define	EL	el->el_line
 	(void) fprintf(el->el_errlfile,
 	    "\nD(b: %x(%s)  c: %x(%s) last: %x(%s) limit: %x(%s)\n",
@@ -151,24 +151,24 @@ ed_delete_next_char(EditLine *el, int c 
 			if (el->el_line.cursor == el->el_line.buffer) {
 				/* if I'm also at the beginning */
 #ifdef KSHVI
-				return (CC_ERROR);
+				return CC_ERROR;
 #else
 				/* then do an EOF */
-				term_writechar(el, c);
-				return (CC_EOF);
+				terminal_writec(el, c);
+				return CC_EOF;
 #endif
 			} else {
 #ifdef KSHVI
 				el->el_line.cursor--;
 #else
-				return (CC_ERROR);
+				return CC_ERROR;
 #endif
 			}
 		} else {
 			if (el->el_line.cursor != el->el_line.buffer)
 				el->el_line.cursor--;
 			else
-				return (CC_ERROR);
+				return CC_ERROR;
 		}
 	}
 	c_delafter(el, el->el_state.argument);	/* delete after dot */
@@ -176,7 +176,7 @@ ed_delete_next_char(EditLine *el, int c 
 	    el->el_line.cursor > el->el_line.buffer)
 			/* bounds check */
 		el->el_line.cursor = el->el_line.lastchar - 1;
-	return (CC_REFRESH);
+	return CC_REFRESH;
 }
 
 
@@ -186,9 +186,9 @@ ed_delete_next_char(EditLine *el, int c 
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_kill_line(EditLine *el, int c __attribute__((__unused__)))
+ed_kill_line(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *kp, *cp;
+	Char *kp, *cp;
 
 	cp = el->el_line.cursor;
 	kp = el->el_chared.c_kill.buf;
@@ -197,7 +197,7 @@ ed_kill_line(EditLine *el, int c __attri
 	el->el_chared.c_kill.last = kp;
 			/* zap! -- delete to end */
 	el->el_line.lastchar = el->el_line.cursor;
-	return (CC_REFRESH);
+	return CC_REFRESH;
 }
 
 
@@ -207,20 +207,20 @@ ed_kill_line(EditLine *el, int c __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_move_to_end(EditLine *el, int c __attribute__((__unused__)))
+ed_move_to_end(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	el->el_line.cursor = el->el_line.lastchar;
 	if (el->el_map.type == MAP_VI) {
 		if (el->el_chared.c_vcmd.action != NOP) {
 			cv_delfini(el);
-			return (CC_REFRESH);
+			return CC_REFRESH;
 		}
 #ifdef VI_MOVE
 		el->el_line.cursor--;
 #endif
 	}
-	return (CC_CURSOR);
+	return CC_CURSOR;
 }
 
 
@@ -230,21 +230,21 @@ ed_move_to_end(EditLine *el, int c __att
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_move_to_beg(EditLine *el, int c __attribute__((__unused__)))
+ed_move_to_beg(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	el->el_line.cursor = el->el_line.buffer;
 
 	if (el->el_map.type == MAP_VI) {
 			/* We want FIRST non space character */
-		while (isspace((unsigned char) *el->el_line.cursor))
+		while (Isspace(*el->el_line.cursor))
 			el->el_line.cursor++;
 		if (el->el_chared.c_vcmd.action != NOP) {
 			cv_delfini(el);
-			return (CC_REFRESH);
+			return CC_REFRESH;
 		}
 	}
-	return (CC_CURSOR);
+	return CC_CURSOR;
 }
 
 
@@ -253,12 +253,12 @@ ed_move_to_beg(EditLine *el, int c __att
  *	[^T] [^T]
  */
 protected el_action_t
-ed_transpose_chars(EditLine *el, int c)
+ed_transpose_chars(EditLine *el, Int c)
 {
 
 	if (el->el_line.cursor < el->el_line.lastchar) {
 		if (el->el_line.lastchar <= &el->el_line.buffer[1])
-			return (CC_ERROR);
+			return CC_ERROR;
 		else
 			el->el_line.cursor++;
 	}
@@ -267,9 +267,9 @@ ed_transpose_chars(EditLine *el, int c)
 		c = el->el_line.cursor[-2];
 		el->el_line.cursor[-2] = el->el_line.cursor[-1];
 		el->el_line.cursor[-1] = c;
-		return (CC_REFRESH);
+		return CC_REFRESH;
 	} else
-		return (CC_ERROR);
+		return CC_ERROR;
 }
 
 
@@ -279,15 +279,15 @@ ed_transpose_chars(EditLine *el, int c)
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_next_char(EditLine *el, int c __attribute__((__unused__)))
+ed_next_char(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *lim = el->el_line.lastchar;
+	Char *lim = el->el_line.lastchar;
 
 	if (el->el_line.cursor >= lim ||
 	    (el->el_line.cursor == lim - 1 &&
 	    el->el_map.type == MAP_VI &&
 	    el->el_chared.c_vcmd.action == NOP))
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	el->el_line.cursor += el->el_state.argument;
 	if (el->el_line.cursor > lim)
@@ -296,9 +296,9 @@ ed_next_char(EditLine *el, int c __attri
 	if (el->el_map.type == MAP_VI)
 		if (el->el_chared.c_vcmd.action != NOP) {
 			cv_delfini(el);
-			return (CC_REFRESH);
+			return CC_REFRESH;
 		}
-	return (CC_CURSOR);
+	return CC_CURSOR;
 }
 
 
@@ -308,11 +308,11 @@ ed_next_char(EditLine *el, int c __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_prev_word(EditLine *el, int c __attribute__((__unused__)))
+ed_prev_word(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	if (el->el_line.cursor == el->el_line.buffer)
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	el->el_line.cursor = c__prev_word(el->el_line.cursor,
 	    el->el_line.buffer,
@@ -322,9 +322,9 @@ ed_prev_word(EditLine *el, int c __attri
 	if (el->el_map.type == MAP_VI)
 		if (el->el_chared.c_vcmd.action != NOP) {
 			cv_delfini(el);
-			return (CC_REFRESH);
+			return CC_REFRESH;
 		}
-	return (CC_CURSOR);
+	return CC_CURSOR;
 }
 
 
@@ -334,7 +334,7 @@ ed_prev_word(EditLine *el, int c __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_prev_char(EditLine *el, int c __attribute__((__unused__)))
+ed_prev_char(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	if (el->el_line.cursor > el->el_line.buffer) {
@@ -345,11 +345,11 @@ ed_prev_char(EditLine *el, int c __attri
 		if (el->el_map.type == MAP_VI)
 			if (el->el_chared.c_vcmd.action != NOP) {
 				cv_delfini(el);
-				return (CC_REFRESH);
+				return CC_REFRESH;
 			}
-		return (CC_CURSOR);
+		return CC_CURSOR;
 	} else
-		return (CC_ERROR);
+		return CC_ERROR;
 }
 
 
@@ -358,19 +358,19 @@ ed_prev_char(EditLine *el, int c __attri
  *	[^V] [^V]
  */
 protected el_action_t
-ed_quoted_insert(EditLine *el, int c)
+ed_quoted_insert(EditLine *el, Int c)
 {
 	int num;
-	char tc;
+	Char tc;
 
 	tty_quotemode(el);
-	num = el_getc(el, &tc);
-	c = (unsigned char) tc;
+	num = FUN(el,getc)(el, &tc);
+	c = tc;
 	tty_noquotemode(el);
 	if (num == 1)
-		return (ed_insert(el, c));
+		return ed_insert(el, c);
 	else
-		return (ed_end_of_file(el, 0));
+		return ed_end_of_file(el, 0);
 }
 
 
@@ -378,11 +378,11 @@ ed_quoted_insert(EditLine *el, int c)
  *	Adds to argument or enters a digit
  */
 protected el_action_t
-ed_digit(EditLine *el, int c)
+ed_digit(EditLine *el, Int c)
 {
 
-	if (!isdigit(c))
-		return (CC_ERROR);
+	if (!Isdigit(c))
+		return CC_ERROR;
 
 	if (el->el_state.doingarg) {
 			/* if doing an arg, add this in... */
@@ -390,11 +390,11 @@ ed_digit(EditLine *el, int c)
 			el->el_state.argument = c - '0';
 		else {
 			if (el->el_state.argument > 1000000)
-				return (CC_ERROR);
+				return CC_ERROR;
 			el->el_state.argument =
 			    (el->el_state.argument * 10) + (c - '0');
 		}
-		return (CC_ARGHACK);
+		return CC_ARGHACK;
 	}
 
 	return ed_insert(el, c);
@@ -406,22 +406,22 @@ ed_digit(EditLine *el, int c)
  *	For ESC-n
  */
 protected el_action_t
-ed_argument_digit(EditLine *el, int c)
+ed_argument_digit(EditLine *el, Int c)
 {
 
-	if (!isdigit(c))
-		return (CC_ERROR);
+	if (!Isdigit(c))
+		return CC_ERROR;
 
 	if (el->el_state.doingarg) {
 		if (el->el_state.argument > 1000000)
-			return (CC_ERROR);
+			return CC_ERROR;
 		el->el_state.argument = (el->el_state.argument * 10) +
 		    (c - '0');
 	} else {		/* else starting an argument */
 		el->el_state.argument = c - '0';
 		el->el_state.doingarg = 1;
 	}
-	return (CC_ARGHACK);
+	return CC_ARGHACK;
 }
 
 
@@ -432,10 +432,10 @@ ed_argument_digit(EditLine *el, int c)
 protected el_action_t
 /*ARGSUSED*/
 ed_unassigned(EditLine *el __attribute__((__unused__)),
-	      int c __attribute__((__unused__)))
+    Int c __attribute__((__unused__)))
 {
 
-	return (CC_ERROR);
+	return CC_ERROR;
 }
 
 
@@ -450,10 +450,10 @@ ed_unassigned(EditLine *el __attribute__
 protected el_action_t
 /*ARGSUSED*/
 ed_tty_sigint(EditLine *el __attribute__((__unused__)), 
-	      int c __attribute__((__unused__)))
+	      Int c __attribute__((__unused__)))
 {
 
-	return (CC_NORM);
+	return CC_NORM;
 }
 
 
@@ -464,10 +464,10 @@ ed_tty_sigint(EditLine *el __attribute__
 protected el_action_t
 /*ARGSUSED*/
 ed_tty_dsusp(EditLine *el __attribute__((__unused__)), 
-	     int c __attribute__((__unused__)))
+	     Int c __attribute__((__unused__)))
 {
 
-	return (CC_NORM);
+	return CC_NORM;
 }
 
 
@@ -478,10 +478,10 @@ ed_tty_dsusp(EditLine *el __attribute__(
 protected el_action_t
 /*ARGSUSED*/
 ed_tty_flush_output(EditLine *el __attribute__((__unused__)), 
-		    int c __attribute__((__unused__)))
+		    Int c __attribute__((__unused__)))
 {
 
-	return (CC_NORM);
+	return CC_NORM;
 }
 
 
@@ -492,10 +492,10 @@ ed_tty_flush_output(EditLine *el __attri
 protected el_action_t
 /*ARGSUSED*/
 ed_tty_sigquit(EditLine *el __attribute__((__unused__)), 
-	       int c __attribute__((__unused__)))
+	       Int c __attribute__((__unused__)))
 {
 
-	return (CC_NORM);
+	return CC_NORM;
 }
 
 
@@ -506,10 +506,10 @@ ed_tty_sigquit(EditLine *el __attribute_
 protected el_action_t
 /*ARGSUSED*/
 ed_tty_sigtstp(EditLine *el __attribute__((__unused__)), 
-	       int c __attribute__((__unused__)))
+	       Int c __attribute__((__unused__)))
 {
 
-	return (CC_NORM);
+	return CC_NORM;
 }
 
 
@@ -520,10 +520,10 @@ ed_tty_sigtstp(EditLine *el __attribute_
 protected el_action_t
 /*ARGSUSED*/
 ed_tty_stop_output(EditLine *el __attribute__((__unused__)), 
-		   int c __attribute__((__unused__)))
+		   Int c __attribute__((__unused__)))
 {
 
-	return (CC_NORM);
+	return CC_NORM;
 }
 
 
@@ -534,10 +534,10 @@ ed_tty_stop_output(EditLine *el __attrib
 protected el_action_t
 /*ARGSUSED*/
 ed_tty_start_output(EditLine *el __attribute__((__unused__)), 
-		    int c __attribute__((__unused__)))
+		    Int c __attribute__((__unused__)))
 {
 
-	return (CC_NORM);
+	return CC_NORM;
 }
 
 
@@ -547,13 +547,13 @@ ed_tty_start_output(EditLine *el __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_newline(EditLine *el, int c __attribute__((__unused__)))
+ed_newline(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	re_goto_bottom(el);
 	*el->el_line.lastchar++ = '\n';
 	*el->el_line.lastchar = '\0';
-	return (CC_NEWLINE);
+	return CC_NEWLINE;
 }
 
 
@@ -563,17 +563,17 @@ ed_newline(EditLine *el, int c __attribu
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_delete_prev_char(EditLine *el, int c __attribute__((__unused__)))
+ed_delete_prev_char(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	if (el->el_line.cursor <= el->el_line.buffer)
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	c_delbefore(el, el->el_state.argument);
 	el->el_line.cursor -= el->el_state.argument;
 	if (el->el_line.cursor < el->el_line.buffer)
 		el->el_line.cursor = el->el_line.buffer;
-	return (CC_REFRESH);
+	return CC_REFRESH;
 }
 
 
@@ -583,12 +583,12 @@ ed_delete_prev_char(EditLine *el, int c 
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_clear_screen(EditLine *el, int c __attribute__((__unused__)))
+ed_clear_screen(EditLine *el, Int c __attribute__((__unused__)))
 {
 
-	term_clear_screen(el);	/* clear the whole real screen */
+	terminal_clear_screen(el);	/* clear the whole real screen */
 	re_clear_display(el);	/* reset everything */
-	return (CC_REFRESH);
+	return CC_REFRESH;
 }
 
 
@@ -599,10 +599,10 @@ ed_clear_screen(EditLine *el, int c __at
 protected el_action_t
 /*ARGSUSED*/
 ed_redisplay(EditLine *el __attribute__((__unused__)), 
-	     int c __attribute__((__unused__)))
+	     Int c __attribute__((__unused__)))
 {
 
-	return (CC_REDISPLAY);
+	return CC_REDISPLAY;
 }
 
 
@@ -612,11 +612,11 @@ ed_redisplay(EditLine *el __attribute__(
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_start_over(EditLine *el, int c __attribute__((__unused__)))
+ed_start_over(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	ch_reset(el, 0);
-	return (CC_REFRESH);
+	return CC_REFRESH;
 }
 
 
@@ -627,10 +627,10 @@ ed_start_over(EditLine *el, int c __attr
 protected el_action_t
 /*ARGSUSED*/
 ed_sequence_lead_in(EditLine *el __attribute__((__unused__)), 
-		    int c __attribute__((__unused__)))
+		    Int c __attribute__((__unused__)))
 {
 
-	return (CC_NORM);
+	return CC_NORM;
 }
 
 
@@ -640,7 +640,7 @@ ed_sequence_lead_in(EditLine *el __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_prev_history(EditLine *el, int c __attribute__((__unused__)))
+ed_prev_history(EditLine *el, Int c __attribute__((__unused__)))
 {
 	char beep = 0;
 	int sv_event = el->el_history.eventno;
@@ -650,7 +650,7 @@ ed_prev_history(EditLine *el, int c __at
 
 	if (el->el_history.eventno == 0) {	/* save the current buffer
 						 * away */
-		(void) strncpy(el->el_history.buf, el->el_line.buffer,
+		(void) Strncpy(el->el_history.buf, el->el_line.buffer,
 		    EL_BUFSIZ);
 		el->el_history.last = el->el_history.buf +
 		    (el->el_line.lastchar - el->el_line.buffer);
@@ -660,7 +660,7 @@ ed_prev_history(EditLine *el, int c __at
 	if (hist_get(el) == CC_ERROR) {
 		if (el->el_map.type == MAP_VI) {
 			el->el_history.eventno = sv_event;
-			return CC_ERROR;
+			
 		}
 		beep = 1;
 		/* el->el_history.eventno was fixed by first call */
@@ -678,7 +678,7 @@ ed_prev_history(EditLine *el, int c __at
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_next_history(EditLine *el, int c __attribute__((__unused__)))
+ed_next_history(EditLine *el, Int c __attribute__((__unused__)))
 {
 	el_action_t beep = CC_REFRESH, rval;
 
@@ -705,9 +705,9 @@ ed_next_history(EditLine *el, int c __at
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_search_prev_history(EditLine *el, int c __attribute__((__unused__)))
+ed_search_prev_history(EditLine *el, Int c __attribute__((__unused__)))
 {
-	const char *hp;
+	const Char *hp;
 	int h;
 	bool_t found = 0;
 
@@ -720,20 +720,20 @@ ed_search_prev_history(EditLine *el, int
 		    "e_prev_search_hist(): eventno < 0;\n");
 #endif
 		el->el_history.eventno = 0;
-		return (CC_ERROR);
+		return CC_ERROR;
 	}
 	if (el->el_history.eventno == 0) {
-		(void) strncpy(el->el_history.buf, el->el_line.buffer,
+		(void) Strncpy(el->el_history.buf, el->el_line.buffer,
 		    EL_BUFSIZ);
 		el->el_history.last = el->el_history.buf +
 		    (el->el_line.lastchar - el->el_line.buffer);
 	}
 	if (el->el_history.ref == NULL)
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	hp = HIST_FIRST(el);
 	if (hp == NULL)
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	c_setpat(el);		/* Set search pattern !! */
 
@@ -744,7 +744,7 @@ ed_search_prev_history(EditLine *el, int
 #ifdef SDEBUG
 		(void) fprintf(el->el_errfile, "Comparing with \"%s\"\n", hp);
 #endif
-		if ((strncmp(hp, el->el_line.buffer, (size_t)
+		if ((Strncmp(hp, el->el_line.buffer, (size_t)
 			    (el->el_line.lastchar - el->el_line.buffer)) ||
 			hp[el->el_line.lastchar - el->el_line.buffer]) &&
 		    c_hmatch(el, hp)) {
@@ -759,11 +759,11 @@ ed_search_prev_history(EditLine *el, int
 #ifdef SDEBUG
 		(void) fprintf(el->el_errfile, "not found\n");
 #endif
-		return (CC_ERROR);
+		return CC_ERROR;
 	}
 	el->el_history.eventno = h;
 
-	return (hist_get(el));
+	return hist_get(el);
 }
 
 
@@ -773,9 +773,9 @@ ed_search_prev_history(EditLine *el, int
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_search_next_history(EditLine *el, int c __attribute__((__unused__)))
+ed_search_next_history(EditLine *el, Int c __attribute__((__unused__)))
 {
-	const char *hp;
+	const Char *hp;
 	int h;
 	bool_t found = 0;
 
@@ -784,14 +784,14 @@ ed_search_next_history(EditLine *el, int
 	*el->el_line.lastchar = '\0';	/* just in case */
 
 	if (el->el_history.eventno == 0)
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	if (el->el_history.ref == NULL)
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	hp = HIST_FIRST(el);
 	if (hp == NULL)
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	c_setpat(el);		/* Set search pattern !! */
 
@@ -799,7 +799,7 @@ ed_search_next_history(EditLine *el, int
 #ifdef SDEBUG
 		(void) fprintf(el->el_errfile, "Comparing with \"%s\"\n", hp);
 #endif
-		if ((strncmp(hp, el->el_line.buffer, (size_t)
+		if ((Strncmp(hp, el->el_line.buffer, (size_t)
 			    (el->el_line.lastchar - el->el_line.buffer)) ||
 			hp[el->el_line.lastchar - el->el_line.buffer]) &&
 		    c_hmatch(el, hp))
@@ -812,12 +812,12 @@ ed_search_next_history(EditLine *el, int
 #ifdef SDEBUG
 			(void) fprintf(el->el_errfile, "not found\n");
 #endif
-			return (CC_ERROR);
+			return CC_ERROR;
 		}
 	}
 	el->el_history.eventno = found;
 
-	return (hist_get(el));
+	return hist_get(el);
 }
 
 
@@ -827,9 +827,9 @@ ed_search_next_history(EditLine *el, int
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_prev_line(EditLine *el, int c __attribute__((__unused__)))
+ed_prev_line(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *ptr;
+	Char *ptr;
 	int nchars = c_hpos(el);
 
 	/*
@@ -843,7 +843,7 @@ ed_prev_line(EditLine *el, int c __attri
 			break;
 
 	if (el->el_state.argument > 0)
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	/*
          * Move to the beginning of the line
@@ -860,7 +860,7 @@ ed_prev_line(EditLine *el, int c __attri
 		continue;
 
 	el->el_line.cursor = ptr;
-	return (CC_CURSOR);
+	return CC_CURSOR;
 }
 
 
@@ -870,9 +870,9 @@ ed_prev_line(EditLine *el, int c __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_next_line(EditLine *el, int c __attribute__((__unused__)))
+ed_next_line(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *ptr;
+	Char *ptr;
 	int nchars = c_hpos(el);
 
 	/*
@@ -883,7 +883,7 @@ ed_next_line(EditLine *el, int c __attri
 			break;
 
 	if (el->el_state.argument > 0)
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	/*
          * Move to the character requested
@@ -894,7 +894,7 @@ ed_next_line(EditLine *el, int c __attri
 		continue;
 
 	el->el_line.cursor = ptr;
-	return (CC_CURSOR);
+	return CC_CURSOR;
 }
 
 
@@ -904,16 +904,16 @@ ed_next_line(EditLine *el, int c __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_command(EditLine *el, int c __attribute__((__unused__)))
+ed_command(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char tmpbuf[EL_BUFSIZ];
+	Char tmpbuf[EL_BUFSIZ];
 	int tmplen;
 
-	tmplen = c_gets(el, tmpbuf, "\n: ");
-	term__putc(el, '\n');
+	tmplen = c_gets(el, tmpbuf, STR("\n: "));
+	terminal__putc(el, '\n');
 
 	if (tmplen < 0 || (tmpbuf[tmplen] = 0, parse_line(el, tmpbuf)) == -1)
-		term_beep(el);
+		terminal_beep(el);
 
 	el->el_map.current = el->el_map.key;
 	re_clear_display(el);
diff -pruN 5.1.58-1/cmd-line-utils/libedit/config.h 5.1.61-2/cmd-line-utils/libedit/config.h
--- 5.1.58-1/cmd-line-utils/libedit/config.h	2011-07-01 15:22:20.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/config.h	2011-12-16 19:06:04.000000000 +0000
@@ -1,2 +1,5 @@
 #include "my_config.h"
 #include "sys.h"
+#ifndef NARROW_WRAPPER
+#define WIDECHAR
+#endif
diff -pruN 5.1.58-1/cmd-line-utils/libedit/el.c 5.1.61-2/cmd-line-utils/libedit/el.c
--- 5.1.58-1/cmd-line-utils/libedit/el.c	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/el.c	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: el.c,v 1.47 2009/01/18 12:17:24 lukem Exp $	*/
+/*	$NetBSD: el.c,v 1.68 2011/07/29 15:16:33 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -48,6 +48,9 @@ static char sccsid[] = "@(#)el.c	8.2 (Be
 #include <string.h>
 #include <stdlib.h>
 #include <stdarg.h>
+#include <ctype.h>
+#include <locale.h>
+#include <langinfo.h>
 #include "el.h"
 
 /* el_init():
@@ -56,11 +59,10 @@ static char sccsid[] = "@(#)el.c	8.2 (Be
 public EditLine *
 el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr)
 {
-
-	EditLine *el = (EditLine *) el_malloc(sizeof(EditLine));
+	EditLine *el = el_malloc(sizeof(*el));
 
 	if (el == NULL)
-		return (NULL);
+		return NULL;
 
 	memset(el, 0, sizeof(EditLine));
 
@@ -69,8 +71,11 @@ el_init(const char *prog, FILE *fin, FIL
 	el->el_errfile = ferr;
 
 	el->el_infd = fileno(fin);
+	el->el_outfd = fileno(fout);
+	el->el_errfd = fileno(ferr);
 
-	if ((el->el_prog = el_strdup(prog)) == NULL) {
+	el->el_prog = Strdup(ct_decode_string(prog, &el->el_scratch));
+	if (el->el_prog == NULL) {
 		el_free(el);
 		return NULL;
 	}
@@ -79,13 +84,18 @@ el_init(const char *prog, FILE *fin, FIL
          * Initialize all the modules. Order is important!!!
          */
 	el->el_flags = 0;
+#ifdef WIDECHAR
+	setlocale(LC_CTYPE, NULL);
+        if (MB_CUR_MAX > 1)
+		el->el_flags |= CHARSET_IS_MULTIBYTE;
+#endif
 
-	if (term_init(el) == -1) {
+	if (terminal_init(el) == -1) {
 		el_free(el->el_prog);
 		el_free(el);
 		return NULL;
 	}
-	(void) key_init(el);
+	(void) keymacro_init(el);
 	(void) map_init(el);
 	if (tty_init(el) == -1)
 		el->el_flags |= NO_TTY;
@@ -96,7 +106,7 @@ el_init(const char *prog, FILE *fin, FIL
 	(void) sig_init(el);
 	(void) read_init(el);
 
-	return (el);
+	return el;
 }
 
 
@@ -112,8 +122,8 @@ el_end(EditLine *el)
 
 	el_reset(el);
 
-	term_end(el);
-	key_end(el);
+	terminal_end(el);
+	keymacro_end(el);
 	map_end(el);
 	tty_end(el);
 	ch_end(el);
@@ -122,8 +132,14 @@ el_end(EditLine *el)
 	prompt_end(el);
 	sig_end(el);
 
-	el_free((ptr_t) el->el_prog);
-	el_free((ptr_t) el);
+	el_free(el->el_prog);
+#ifdef WIDECHAR
+	el_free(el->el_scratch.cbuff);
+	el_free(el->el_scratch.wbuff);
+	el_free(el->el_lgcyconv.cbuff);
+	el_free(el->el_lgcyconv.wbuff);
+#endif
+	el_free(el);
 }
 
 
@@ -143,27 +159,46 @@ el_reset(EditLine *el)
  *	set the editline parameters
  */
 public int
-el_set(EditLine *el, int op, ...)
+FUN(el,set)(EditLine *el, int op, ...)
 {
 	va_list ap;
 	int rv = 0;
 
 	if (el == NULL)
-		return (-1);
+		return -1;
 	va_start(ap, op);
 
 	switch (op) {
 	case EL_PROMPT:
-	case EL_RPROMPT:
-		rv = prompt_set(el, va_arg(ap, el_pfunc_t), op);
+	case EL_RPROMPT: {
+		el_pfunc_t p = va_arg(ap, el_pfunc_t);
+
+		rv = prompt_set(el, p, 0, op, 1);
+		break;
+	}
+
+	case EL_RESIZE: {
+		el_zfunc_t p = va_arg(ap, el_zfunc_t);
+		void *arg = va_arg(ap, void *);
+		rv = ch_resizefun(el, p, arg);
+		break;
+	}
+
+	case EL_PROMPT_ESC:
+	case EL_RPROMPT_ESC: {
+		el_pfunc_t p = va_arg(ap, el_pfunc_t);
+		int c = va_arg(ap, int);
+
+		rv = prompt_set(el, p, c, op, 1);
 		break;
+	}
 
 	case EL_TERMINAL:
-		rv = term_set(el, va_arg(ap, char *));
+		rv = terminal_set(el, va_arg(ap, char *));
 		break;
 
 	case EL_EDITOR:
-		rv = map_set_editor(el, va_arg(ap, char *));
+		rv = map_set_editor(el, va_arg(ap, Char *));
 		break;
 
 	case EL_SIGNAL:
@@ -176,40 +211,39 @@ el_set(EditLine *el, int op, ...)
 	case EL_BIND:
 	case EL_TELLTC:
 	case EL_SETTC:
-	case EL_GETTC:
 	case EL_ECHOTC:
 	case EL_SETTY:
 	{
-		const char *argv[20];
+		const Char *argv[20];
 		int i;
 
 		for (i = 1; i < 20; i++)
-			if ((argv[i] = va_arg(ap, char *)) == NULL)
+			if ((argv[i] = va_arg(ap, Char *)) == NULL)
 				break;
 
 		switch (op) {
 		case EL_BIND:
-			argv[0] = "bind";
+			argv[0] = STR("bind");
 			rv = map_bind(el, i, argv);
 			break;
 
 		case EL_TELLTC:
-			argv[0] = "telltc";
-			rv = term_telltc(el, i, argv);
+			argv[0] = STR("telltc");
+			rv = terminal_telltc(el, i, argv);
 			break;
 
 		case EL_SETTC:
-			argv[0] = "settc";
-			rv = term_settc(el, i, argv);
+			argv[0] = STR("settc");
+			rv = terminal_settc(el, i, argv);
 			break;
 
 		case EL_ECHOTC:
-			argv[0] = "echotc";
-			rv = term_echotc(el, i, argv);
+			argv[0] = STR("echotc");
+			rv = terminal_echotc(el, i, argv);
 			break;
 
 		case EL_SETTY:
-			argv[0] = "setty";
+			argv[0] = STR("setty");
 			rv = tty_stty(el, i, argv);
 			break;
 
@@ -223,8 +257,8 @@ el_set(EditLine *el, int op, ...)
 
 	case EL_ADDFN:
 	{
-		char *name = va_arg(ap, char *);
-		char *help = va_arg(ap, char *);
+		Char *name = va_arg(ap, Char *);
+		Char *help = va_arg(ap, Char *);
 		el_func_t func = va_arg(ap, el_func_t);
 
 		rv = map_addfunc(el, name, help, func);
@@ -234,9 +268,11 @@ el_set(EditLine *el, int op, ...)
 	case EL_HIST:
 	{
 		hist_fun_t func = va_arg(ap, hist_fun_t);
-		ptr_t ptr = va_arg(ap, char *);
+		void *ptr = va_arg(ap, void *);
 
 		rv = hist_set(el, func, ptr);
+		if (!(el->el_flags & CHARSET_IS_MULTIBYTE))
+			el->el_flags &= ~NARROW_HISTORY;
 		break;
 	}
 
@@ -252,6 +288,7 @@ el_set(EditLine *el, int op, ...)
 	{
 		el_rfunc_t rc = va_arg(ap, el_rfunc_t);
 		rv = el_read_setfn(el, rc);
+		el->el_flags &= ~NARROW_READ;
 		break;
 	}
 
@@ -296,9 +333,11 @@ el_set(EditLine *el, int op, ...)
 			break;
 		case 1:
 			el->el_outfile = fp;
+			el->el_outfd = fileno(fp);
 			break;
 		case 2:
 			el->el_errfile = fp;
+			el->el_errfd = fileno(fp);
 			break;
 		default:
 			rv = -1;
@@ -310,7 +349,7 @@ el_set(EditLine *el, int op, ...)
 	case EL_REFRESH:
 		re_clear_display(el);
 		re_refresh(el);
-		term__flush(el);
+		terminal__flush(el);
 		break;
 
 	default:
@@ -319,7 +358,7 @@ el_set(EditLine *el, int op, ...)
 	}
 
 	va_end(ap);
-	return (rv);
+	return rv;
 }
 
 
@@ -327,7 +366,7 @@ el_set(EditLine *el, int op, ...)
  *	retrieve the editline parameters
  */
 public int
-el_get(EditLine *el, int op, ...)
+FUN(el,get)(EditLine *el, int op, ...)
 {
 	va_list ap;
 	int rv;
@@ -339,12 +378,22 @@ el_get(EditLine *el, int op, ...)
 
 	switch (op) {
 	case EL_PROMPT:
-	case EL_RPROMPT:
-		rv = prompt_get(el, va_arg(ap, el_pfunc_t *), op);
+	case EL_RPROMPT: {
+		el_pfunc_t *p = va_arg(ap, el_pfunc_t *);
+		rv = prompt_get(el, p, 0, op);
 		break;
+	}
+	case EL_PROMPT_ESC:
+	case EL_RPROMPT_ESC: {
+		el_pfunc_t *p = va_arg(ap, el_pfunc_t *);
+		Char *c = va_arg(ap, Char *);
+
+		rv = prompt_get(el, p, c, op);
+		break;
+	}
 
 	case EL_EDITOR:
-		rv = map_get_editor(el, va_arg(ap, const char **));
+		rv = map_get_editor(el, va_arg(ap, const Char **));
 		break;
 
 	case EL_SIGNAL:
@@ -358,7 +407,7 @@ el_get(EditLine *el, int op, ...)
 		break;
 
 	case EL_TERMINAL:
-		term_get(el, va_arg(ap, const char **));
+		terminal_get(el, va_arg(ap, const char **));
 		rv = 0;
 		break;
 
@@ -375,7 +424,7 @@ el_get(EditLine *el, int op, ...)
 		switch (op) {
 		case EL_GETTC:
 			argv[0] = name;
-			rv = term_gettc(el, i, argv);
+			rv = terminal_gettc(el, i, argv);
 			break;
 
 		default:
@@ -386,26 +435,6 @@ el_get(EditLine *el, int op, ...)
 		break;
 	}
 
-#if 0 /* XXX */
-	case EL_ADDFN:
-	{
-		char *name = va_arg(ap, char *);
-		char *help = va_arg(ap, char *);
-		el_func_t func = va_arg(ap, el_func_t);
-
-		rv = map_addfunc(el, name, help, func);
-		break;
-	}
-
-	case EL_HIST:
-		{
-			hist_fun_t func = va_arg(ap, hist_fun_t);
-			ptr_t ptr = va_arg(ap, char *);
-			rv = hist_set(el, func, ptr);
-		}
-		break;
-#endif /* XXX */
-
 	case EL_GETCFN:
 		*va_arg(ap, el_rfunc_t *) = el_read_getfn(el);
 		rv = 0;
@@ -451,18 +480,18 @@ el_get(EditLine *el, int op, ...)
 	}
 	va_end(ap);
 
-	return (rv);
+	return rv;
 }
 
 
 /* el_line():
  *	Return editing info
  */
-public const LineInfo *
-el_line(EditLine *el)
+public const TYPE(LineInfo) *
+FUN(el,line)(EditLine *el)
 {
 
-	return (const LineInfo *) (void *) &el->el_line;
+	return (const TYPE(LineInfo) *)(void *)&el->el_line;
 }
 
 
@@ -475,6 +504,9 @@ el_source(EditLine *el, const char *fnam
 	FILE *fp;
 	size_t len;
 	char *ptr;
+	char *path = NULL;
+	const Char *dptr;
+	int error = 0;
 
 	fp = NULL;
 	if (fname == NULL) {
@@ -486,25 +518,21 @@ el_source(EditLine *el, const char *fnam
 
 #if (defined(HAVE_ISSETUGID) || defined(HAVE_IDENTITY_FUNCS))
 		static const char elpath[] = "/.editrc";
+		size_t plen = sizeof(elpath);
 /* XXXMYSQL: Portability fix (for which platforms?) */
-#ifdef MAXPATHLEN
-		char path[MAXPATHLEN];
-#else
-		char path[4096];
-#endif
 #ifdef HAVE_ISSETUGID
 		if (issetugid())
-			return (-1);
+			return -1;
 #elif defined(HAVE_IDENTITY_FUNCS)
                 if (getuid() != geteuid() || getgid() != getegid())
                   return (-1);
 #endif
 		if ((ptr = getenv("HOME")) == NULL)
-			return (-1);
-		if (strlcpy(path, ptr, sizeof(path)) >= sizeof(path))
-			return (-1);
-		if (strlcat(path, elpath, sizeof(path)) >= sizeof(path))
-			return (-1);
+			return -1;
+		plen += strlen(ptr);
+		if ((path = el_malloc(plen * sizeof(*path))) == NULL)
+			return -1;
+		(void)snprintf(path, plen, "%s%s", ptr, elpath);
 		fname = path;
 #else
 		/*
@@ -513,26 +541,37 @@ el_source(EditLine *el, const char *fnam
 		 * to keep from inadvertently opening up the user to a
 		 * security hole.
 		 */
-		return (-1);
+		return -1;
 #endif
 	}
 	if (fp == NULL)
 		fp = fopen(fname, "r");
-	if (fp == NULL)
-		return (-1);
+	if (fp == NULL) {
+		el_free(path);
+		return -1;
+	}
 
 	while ((ptr = fgetln(fp, &len)) != NULL) {
-		if (len > 0 && ptr[len - 1] == '\n')
+		if (*ptr == '\n')
+			continue;	/* Empty line. */
+		dptr = ct_decode_string(ptr, &el->el_scratch);
+		if (!dptr)
+			continue;
+		if (len > 0 && dptr[len - 1] == '\n')
 			--len;
-		ptr[len] = '\0';
-		if (parse_line(el, ptr) == -1) {
-			(void) fclose(fp);
-			return (-1);
-		}
+
+		/* loop until first non-space char or EOL */
+		while (*dptr != '\0' && Isspace(*dptr))
+			dptr++;
+		if (*dptr == '#')
+			continue;   /* ignore, this is a comment line */
+		if ((error = parse_line(el, dptr)) == -1)
+			break;
 	}
 
+	el_free(path);
 	(void) fclose(fp);
-	return (0);
+	return error;
 }
 
 
@@ -550,8 +589,8 @@ el_resize(EditLine *el)
 	(void) sigprocmask(SIG_BLOCK, &nset, &oset);
 
 	/* get the correct window size */
-	if (term_get_size(el, &lins, &cols))
-		term_change_size(el, lins, cols);
+	if (terminal_get_size(el, &lins, &cols))
+		terminal_change_size(el, lins, cols);
 
 	(void) sigprocmask(SIG_SETMASK, &oset, NULL);
 }
@@ -564,7 +603,7 @@ public void
 el_beep(EditLine *el)
 {
 
-	term_beep(el);
+	terminal_beep(el);
 }
 
 
@@ -573,24 +612,25 @@ el_beep(EditLine *el)
  */
 protected int
 /*ARGSUSED*/
-el_editmode(EditLine *el, int argc, const char **argv)
+el_editmode(EditLine *el, int argc, const Char **argv)
 {
-	const char *how;
+	const Char *how;
 
 	if (argv == NULL || argc != 2 || argv[1] == NULL)
-		return (-1);
+		return -1;
 
 	how = argv[1];
-	if (strcmp(how, "on") == 0) {
+	if (Strcmp(how, STR("on")) == 0) {
 		el->el_flags &= ~EDIT_DISABLED;
 		tty_rawmode(el);
-	} else if (strcmp(how, "off") == 0) {
+	} else if (Strcmp(how, STR("off")) == 0) {
 		tty_cookedmode(el);
 		el->el_flags |= EDIT_DISABLED;
 	}
 	else {
-		(void) fprintf(el->el_errfile, "edit: Bad value `%s'.\n", how);
-		return (-1);
+		(void) fprintf(el->el_errfile, "edit: Bad value `" FSTR "'.\n",
+		    how);
+		return -1;
 	}
-	return (0);
+	return 0;
 }
diff -pruN 5.1.58-1/cmd-line-utils/libedit/el.h 5.1.61-2/cmd-line-utils/libedit/el.h
--- 5.1.58-1/cmd-line-utils/libedit/el.h	2011-07-01 15:22:21.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/el.h	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: el.h,v 1.17 2006/12/15 22:13:33 christos Exp $	*/
+/*	$NetBSD: el.h,v 1.25 2011/07/29 23:44:44 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -46,15 +46,21 @@
 #define	VIDEFAULT
 #define	ANCHOR
 
+#include "histedit.h"
+#include "chartype.h"
 #include <stdio.h>
 #include <sys/types.h>
 
-#define	EL_BUFSIZ	1024		/* Maximum line size		*/
+#define	EL_BUFSIZ	((size_t)4096)	/* Maximum line size		*/
 
-#define	HANDLE_SIGNALS	0x01
-#define	NO_TTY		0x02
-#define	EDIT_DISABLED	0x04
-#define	UNBUFFERED	0x08
+#define	HANDLE_SIGNALS       0x01
+#define	NO_TTY               0x02
+#define	EDIT_DISABLED        0x04
+#define	UNBUFFERED           0x08
+#define	CHARSET_IS_MULTIBYTE 0x10
+#define	IGNORE_EXTCHARS      0x20            /* Ignore characters read > 0xff */
+#define	NARROW_HISTORY       0x40
+#define	NARROW_READ          0x80
 
 typedef int bool_t;			/* True or not			*/
 
@@ -66,10 +72,10 @@ typedef struct coord_t {		/* Position on
 } coord_t;
 
 typedef struct el_line_t {
-	char	*buffer;		/* Input line			*/
-	char	*cursor;		/* Cursor position		*/
-	char	*lastchar;		/* Last character		*/
-	const char	*limit;		/* Max position			*/
+	Char 		*buffer;	/* Input line			*/
+	Char	        *cursor;	/* Cursor position		*/
+	Char	        *lastchar;	/* Last character		*/
+	const Char	*limit;		/* Max position			*/
 } el_line_t;
 
 /*
@@ -82,21 +88,20 @@ typedef struct el_state_t {
 	int		metanext;	/* Is the next char a meta char */
 	el_action_t	lastcmd;	/* Previous command		*/
 	el_action_t	thiscmd;	/* this command 		*/
-	char		thisch;		/* char that generated it	*/
+	Char		thisch;		/* char that generated it	*/
 } el_state_t;
 
 /*
  * Until we come up with something better...
  */
-#define	el_strdup(a)	strdup(a)
 #define	el_malloc(a)	malloc(a)
 #define	el_realloc(a,b)	realloc(a, b)
 #define	el_free(a)	free(a)
 
 #include "tty.h"
 #include "prompt.h"
-#include "key.h"
-#include "el_term.h"
+#include "keymacro.h"
+#include "el_terminal.h"
 #include "refresh.h"
 #include "chared.h"
 #include "common.h"
@@ -109,33 +114,41 @@ typedef struct el_state_t {
 #include "read.h"
 
 struct editline {
-	char		 *el_prog;	/* the program name		*/
+	Char		 *el_prog;	/* the program name		*/
 	FILE		 *el_infile;	/* Stdio stuff			*/
 	FILE		 *el_outfile;	/* Stdio stuff			*/
 	FILE		 *el_errfile;	/* Stdio stuff			*/
 	int		  el_infd;	/* Input file descriptor	*/
+	int		  el_outfd;	/* Output file descriptor	*/
+	int		  el_errfd;	/* Error file descriptor	*/
 	int		  el_flags;	/* Various flags.		*/
+	int		  el_errno;	/* Local copy of errno		*/
 	coord_t		  el_cursor;	/* Cursor location		*/
-	char		**el_display;	/* Real screen image = what is there */
-	char		**el_vdisplay;	/* Virtual screen image = what we see */
+	Char		**el_display;	/* Real screen image = what is there */
+	Char		**el_vdisplay;	/* Virtual screen image = what we see */
 	void		 *el_data;	/* Client data			*/
 	el_line_t	  el_line;	/* The current line information	*/
 	el_state_t	  el_state;	/* Current editor state		*/
-	el_term_t	  el_term;	/* Terminal dependent stuff	*/
+	el_terminal_t	  el_terminal;	/* Terminal dependent stuff	*/
 	el_tty_t	  el_tty;	/* Tty dependent stuff		*/
 	el_refresh_t	  el_refresh;	/* Refresh stuff		*/
 	el_prompt_t	  el_prompt;	/* Prompt stuff			*/
 	el_prompt_t	  el_rprompt;	/* Prompt stuff			*/
 	el_chared_t	  el_chared;	/* Characted editor stuff	*/
 	el_map_t	  el_map;	/* Key mapping stuff		*/
-	el_key_t	  el_key;	/* Key binding stuff		*/
+	el_keymacro_t	  el_keymacro;	/* Key binding stuff		*/
 	el_history_t	  el_history;	/* History stuff		*/
 	el_search_t	  el_search;	/* Search stuff			*/
 	el_signal_t	  el_signal;	/* Signal handling stuff	*/
 	el_read_t	  el_read;	/* Character reading stuff	*/
+#ifdef WIDECHAR
+	ct_buffer_t       el_scratch;   /* Scratch conversion buffer    */
+	ct_buffer_t       el_lgcyconv;  /* Buffer for legacy wrappers   */
+	LineInfo          el_lgcylinfo; /* Legacy LineInfo buffer       */
+#endif
 };
 
-protected int	el_editmode(EditLine *, int, const char **);
+protected int	el_editmode(EditLine *, int, const Char **);
 
 /* XXXMYSQL: Bug#23097 mysql can't insert korean on mysql prompt. */
 #define el_isprint(x)	((unsigned char) (x) < 0x80 ? isprint(x) : 1)
diff -pruN 5.1.58-1/cmd-line-utils/libedit/eln.c 5.1.61-2/cmd-line-utils/libedit/eln.c
--- 5.1.58-1/cmd-line-utils/libedit/eln.c	1970-01-01 00:00:00.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/eln.c	2011-12-16 19:06:04.000000000 +0000
@@ -0,0 +1,364 @@
+/*	$NetBSD: eln.c,v 1.13 2011/08/16 16:25:15 christos Exp $	*/
+
+/*-
+ * Copyright (c) 2009 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *        This product includes software developed by the NetBSD
+ *        Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "config.h"
+#if !defined(lint) && !defined(SCCSID)
+#endif /* not lint && not SCCSID */
+
+#include "histedit.h"
+#include "el.h"
+#include "read.h"
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+public int
+el_getc(EditLine *el, char *cp)
+{
+	int num_read;
+	wchar_t wc = 0;
+
+	num_read = el_wgetc (el, &wc);
+
+	if (num_read > 0)
+		*cp = (char)wc;
+	return num_read;
+}
+
+
+public void
+el_push(EditLine *el, const char *str)
+{
+	/* Using multibyte->wide string decoding works fine under single-byte
+	 * character sets too, and Does The Right Thing. */
+	el_wpush(el, ct_decode_string(str, &el->el_lgcyconv));
+}
+
+
+public const char *
+el_gets(EditLine *el, int *nread)
+{
+	const wchar_t *tmp;
+
+	tmp = el_wgets(el, nread);
+	return ct_encode_string(tmp, &el->el_lgcyconv);
+}
+
+
+public int
+el_parse(EditLine *el, int argc, const char *argv[])
+{
+	int ret;
+	const wchar_t **wargv;
+
+	wargv = (const wchar_t **)
+	    ct_decode_argv(argc, argv, &el->el_lgcyconv);
+	if (!wargv)
+		return -1;
+	ret = el_wparse(el, argc, wargv);
+	ct_free_argv(wargv);
+
+	return ret;
+}
+
+
+public int
+el_set(EditLine *el, int op, ...)
+{
+	va_list ap;
+	int ret;
+
+	if (!el)
+		return -1;
+	va_start(ap, op);
+
+	switch (op) {
+	case EL_PROMPT:         /* el_pfunc_t */
+	case EL_RPROMPT: {
+		el_pfunc_t p = va_arg(ap, el_pfunc_t);
+		ret = prompt_set(el, p, 0, op, 0);
+		break;
+	}
+
+	case EL_RESIZE: {
+		el_zfunc_t p = va_arg(ap, el_zfunc_t);
+		void *arg = va_arg(ap, void *);
+		ret = ch_resizefun(el, p, arg);
+		break;
+	}
+
+	case EL_TERMINAL:       /* const char * */
+		ret = el_wset(el, op, va_arg(ap, char *));
+		break;
+
+	case EL_EDITOR:		/* const wchar_t * */
+		ret = el_wset(el, op, ct_decode_string(va_arg(ap, char *),
+		    &el->el_lgcyconv));
+		break;
+
+	case EL_SIGNAL:         /* int */
+	case EL_EDITMODE:
+	case EL_UNBUFFERED:
+	case EL_PREP_TERM:
+		ret = el_wset(el, op, va_arg(ap, int));
+		break;
+
+	case EL_BIND:   /* const char * list -> const wchar_t * list */
+	case EL_TELLTC:
+	case EL_SETTC:
+	case EL_ECHOTC:
+	case EL_SETTY: {
+		const char *argv[20];
+		int i;
+		const wchar_t **wargv;
+		for (i = 1; i < (int)__arraycount(argv); ++i)
+			if ((argv[i] = va_arg(ap, char *)) == NULL)
+			    break;
+		argv[0] = NULL;
+		wargv = (const wchar_t **)
+		    ct_decode_argv(i, argv, &el->el_lgcyconv);
+		if (!wargv) {
+		    ret = -1;
+		    goto out;
+		}
+		/*
+		 * AFAIK we can't portably pass through our new wargv to
+		 * el_wset(), so we have to reimplement the body of
+		 * el_wset() for these ops.
+		 */
+		switch (op) {
+		case EL_BIND:
+			wargv[0] = STR("bind");
+			ret = map_bind(el, i, wargv);
+			break;
+		case EL_TELLTC:
+			wargv[0] = STR("telltc");
+			ret = terminal_telltc(el, i, wargv);
+			break;
+		case EL_SETTC:
+			wargv[0] = STR("settc");
+			ret = terminal_settc(el, i, wargv);
+			break;
+		case EL_ECHOTC:
+			wargv[0] = STR("echotc");
+			ret = terminal_echotc(el, i, wargv);
+			break;
+		case EL_SETTY:
+			wargv[0] = STR("setty");
+			ret = tty_stty(el, i, wargv);
+			break;
+		default:
+			ret = -1;
+		}
+		ct_free_argv(wargv);
+		break;
+	}
+
+	/* XXX: do we need to change el_func_t too? */
+	case EL_ADDFN: {          /* const char *, const char *, el_func_t */
+		const char *args[2];
+		el_func_t func;
+		wchar_t **wargv;
+
+		args[0] = va_arg(ap, const char *);
+		args[1] = va_arg(ap, const char *);
+		func = va_arg(ap, el_func_t);
+
+		wargv = ct_decode_argv(2, args, &el->el_lgcyconv);
+		if (!wargv) {
+		    ret = -1;
+		    goto out;
+		}
+		// XXX: The two strdup's leak
+		ret = map_addfunc(el, Strdup(wargv[0]), Strdup(wargv[1]),
+		    func);
+		ct_free_argv(wargv);
+		break;
+	}
+	case EL_HIST: {           /* hist_fun_t, const char * */
+		hist_fun_t fun = va_arg(ap, hist_fun_t);
+		void *ptr = va_arg(ap, void *);
+		ret = hist_set(el, fun, ptr);
+		el->el_flags |= NARROW_HISTORY;
+		break;
+	}
+	/* XXX: do we need to change el_rfunc_t? */
+	case EL_GETCFN:         /* el_rfunc_t */
+		ret = el_wset(el, op, va_arg(ap, el_rfunc_t));
+		el->el_flags |= NARROW_READ;
+		break;
+	case EL_CLIENTDATA:     /* void * */
+		ret = el_wset(el, op, va_arg(ap, void *));
+		break;
+	case EL_SETFP: {          /* int, FILE * */
+		int what = va_arg(ap, int);
+		FILE *fp = va_arg(ap, FILE *);
+		ret = el_wset(el, op, what, fp);
+		break;
+	}
+	case EL_PROMPT_ESC: /* el_pfunc_t, char */
+	case EL_RPROMPT_ESC: {
+		el_pfunc_t p = va_arg(ap, el_pfunc_t);
+		char c = (char)va_arg(ap, int);
+		ret = prompt_set(el, p, c, op, 0);
+		break;
+	}
+	default:
+		ret = -1;
+		break;
+	}
+
+out:
+	va_end(ap);
+	return ret;
+}
+
+
+public int
+el_get(EditLine *el, int op, ...)
+{
+	va_list ap;
+	int ret;
+
+	if (!el)
+		return -1;
+
+	va_start(ap, op);
+
+	switch (op) {
+	case EL_PROMPT:         /* el_pfunc_t * */
+	case EL_RPROMPT: {
+		el_pfunc_t *p = va_arg(ap, el_pfunc_t *);
+		ret = prompt_get(el, p, 0, op);
+		break;
+	}
+
+	case EL_PROMPT_ESC: /* el_pfunc_t *, char **/
+	case EL_RPROMPT_ESC: {
+		el_pfunc_t *p = va_arg(ap, el_pfunc_t *);
+		char *c = va_arg(ap, char *);
+		wchar_t wc = 0;
+		ret = prompt_get(el, p, &wc, op);
+		*c = (char)wc;
+		break;
+	}
+
+	case EL_EDITOR: {
+		const char **p = va_arg(ap, const char **);
+		const wchar_t *pw;
+		ret = el_wget(el, op, &pw);
+		*p = ct_encode_string(pw, &el->el_lgcyconv);
+		if (!el->el_lgcyconv.csize)
+			ret = -1;
+		break;
+	}
+
+	case EL_TERMINAL:       /* const char ** */
+		ret = el_wget(el, op, va_arg(ap, const char **));
+		break;
+
+	case EL_SIGNAL:         /* int * */
+	case EL_EDITMODE:
+	case EL_UNBUFFERED:
+	case EL_PREP_TERM:
+		ret = el_wget(el, op, va_arg(ap, int *));
+		break;
+
+	case EL_GETTC: {
+		char *argv[20];
+		static char gettc[] = "gettc";
+		int i;
+		for (i = 1; i < (int)__arraycount(argv); ++i)
+			if ((argv[i] = va_arg(ap, char *)) == NULL)
+				break;
+		argv[0] = gettc;
+		ret = terminal_gettc(el, i, argv);
+		break;
+	}
+
+	/* XXX: do we need to change el_rfunc_t? */
+	case EL_GETCFN:         /* el_rfunc_t */
+		ret = el_wget(el, op, va_arg(ap, el_rfunc_t *));
+		break;
+
+	case EL_CLIENTDATA:     /* void ** */
+		ret = el_wget(el, op, va_arg(ap, void **));
+		break;
+
+	case EL_GETFP: {          /* int, FILE ** */
+		int what = va_arg(ap, int);
+		FILE **fpp = va_arg(ap, FILE **);
+		ret = el_wget(el, op, what, fpp);
+		break;
+	}
+
+	default:
+		ret = -1;
+		break;
+	}
+
+	va_end(ap);
+	return ret;
+}
+
+
+const LineInfo *
+el_line(EditLine *el)
+{
+	const LineInfoW *winfo = el_wline(el);
+	LineInfo *info = &el->el_lgcylinfo;
+	size_t offset;
+	const Char *p;
+
+	info->buffer   = ct_encode_string(winfo->buffer, &el->el_lgcyconv);
+
+	offset = 0;
+	for (p = winfo->buffer; p < winfo->cursor; p++)
+		offset += ct_enc_width(*p);
+	info->cursor = info->buffer + offset;
+
+	offset = 0;
+	for (p = winfo->buffer; p < winfo->lastchar; p++)
+		offset += ct_enc_width(*p);
+	info->lastchar = info->buffer + offset;
+
+	return info;
+}
+
+
+int
+el_insertstr(EditLine *el, const char *str)
+{
+	return el_winsertstr(el, ct_decode_string(str, &el->el_lgcyconv));
+}
diff -pruN 5.1.58-1/cmd-line-utils/libedit/el_term.h 5.1.61-2/cmd-line-utils/libedit/el_term.h
--- 5.1.58-1/cmd-line-utils/libedit/el_term.h	2011-07-01 15:22:21.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/el_term.h	1970-01-01 00:00:00.000000000 +0000
@@ -1,125 +0,0 @@
-/*	$NetBSD: term.h,v 1.19 2008/09/10 15:45:37 christos Exp $	*/
-
-/*-
- * Copyright (c) 1992, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Christos Zoulas of Cornell University.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)term.h	8.1 (Berkeley) 6/4/93
- */
-
-/*
- * el.term.h: Termcap header
- */
-#ifndef _h_el_term
-#define	_h_el_term
-
-#include "histedit.h"
-
-typedef struct {		/* Symbolic function key bindings	*/
-	const char	*name;	/* name of the key			*/
-	int		 key;	/* Index in termcap table		*/
-	key_value_t	 fun;	/* Function bound to it			*/
-	int		 type;	/* Type of function			*/
-} fkey_t;
-
-typedef struct {
-	const char *t_name;		/* the terminal name	*/
-	coord_t	  t_size;		/* # lines and cols	*/
-	int	  t_flags;
-#define	TERM_CAN_INSERT		0x001	/* Has insert cap	*/
-#define	TERM_CAN_DELETE		0x002	/* Has delete cap	*/
-#define	TERM_CAN_CEOL		0x004	/* Has CEOL cap		*/
-#define	TERM_CAN_TAB		0x008	/* Can use tabs		*/
-#define	TERM_CAN_ME		0x010	/* Can turn all attrs.	*/
-#define	TERM_CAN_UP		0x020	/* Can move up		*/
-#define	TERM_HAS_META		0x040	/* Has a meta key	*/
-#define	TERM_HAS_AUTO_MARGINS	0x080	/* Has auto margins	*/
-#define	TERM_HAS_MAGIC_MARGINS	0x100	/* Has magic margins	*/
-	char	 *t_buf;		/* Termcap buffer	*/
-	int	  t_loc;		/* location used	*/
-	char	**t_str;		/* termcap strings	*/
-	int	 *t_val;		/* termcap values	*/
-	char	 *t_cap;		/* Termcap buffer	*/
-	fkey_t	 *t_fkey;		/* Array of keys	*/
-} el_term_t;
-
-/*
- * fKey indexes
- */
-#define	A_K_DN		0
-#define	A_K_UP		1
-#define	A_K_LT		2
-#define	A_K_RT		3
-#define	A_K_HO		4
-#define	A_K_EN		5
-#define	A_K_NKEYS	6
-
-protected void	term_move_to_line(EditLine *, int);
-protected void	term_move_to_char(EditLine *, int);
-protected void	term_clear_EOL(EditLine *, int);
-protected void	term_overwrite(EditLine *, const char *, int);
-protected void	term_insertwrite(EditLine *, char *, int);
-protected void	term_deletechars(EditLine *, int);
-protected void	term_clear_screen(EditLine *);
-protected void	term_beep(EditLine *);
-protected int	term_change_size(EditLine *, int, int);
-protected int	term_get_size(EditLine *, int *, int *);
-protected int	term_init(EditLine *);
-protected void	term_bind_arrow(EditLine *);
-protected void	term_print_arrow(EditLine *, const char *);
-protected int	term_clear_arrow(EditLine *, const char *);
-protected int	term_set_arrow(EditLine *, const char *, key_value_t *, int);
-protected void	term_end(EditLine *);
-protected void	term_get(EditLine *, const char **);
-protected int	term_set(EditLine *, const char *);
-protected int	term_settc(EditLine *, int, const char **);
-protected int	term_gettc(EditLine *, int, char **);
-protected int	term_telltc(EditLine *, int, const char **);
-protected int	term_echotc(EditLine *, int, const char **);
-protected void	term_writec(EditLine *, int);
-protected int	term__putc(EditLine *, int);
-protected void	term__flush(EditLine *);
-
-/*
- * Easy access macros
- */
-#define	EL_FLAGS	(el)->el_term.t_flags
-
-#define	EL_CAN_INSERT		(EL_FLAGS & TERM_CAN_INSERT)
-#define	EL_CAN_DELETE		(EL_FLAGS & TERM_CAN_DELETE)
-#define	EL_CAN_CEOL		(EL_FLAGS & TERM_CAN_CEOL)
-#define	EL_CAN_TAB		(EL_FLAGS & TERM_CAN_TAB)
-#define	EL_CAN_ME		(EL_FLAGS & TERM_CAN_ME)
-#define EL_CAN_UP		(EL_FLAGS & TERM_CAN_UP)
-#define	EL_HAS_META		(EL_FLAGS & TERM_HAS_META)
-#define	EL_HAS_AUTO_MARGINS	(EL_FLAGS & TERM_HAS_AUTO_MARGINS)
-#define	EL_HAS_MAGIC_MARGINS	(EL_FLAGS & TERM_HAS_MAGIC_MARGINS)
-
-#endif /* _h_el_term */
diff -pruN 5.1.58-1/cmd-line-utils/libedit/el_terminal.h 5.1.61-2/cmd-line-utils/libedit/el_terminal.h
--- 5.1.58-1/cmd-line-utils/libedit/el_terminal.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/el_terminal.h	2011-12-16 19:06:04.000000000 +0000
@@ -0,0 +1,125 @@
+/*	$NetBSD: terminal.h,v 1.3 2011/07/29 23:44:45 christos Exp $	*/
+
+/*-
+ * Copyright (c) 1992, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Christos Zoulas of Cornell University.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *	@(#)term.h	8.1 (Berkeley) 6/4/93
+ */
+
+/*
+ * el.term.h: Termcap header
+ */
+#ifndef _h_el_terminal
+#define	_h_el_terminal
+
+#include "histedit.h"
+
+typedef struct {		/* Symbolic function key bindings	*/
+	const Char	*name;	/* name of the key			*/
+	int		 key;	/* Index in termcap table		*/
+	keymacro_value_t	 fun;	/* Function bound to it			*/
+	int		 type;	/* Type of function			*/
+} funckey_t;
+
+typedef struct {
+	const char *t_name;		/* the terminal name	*/
+	coord_t	  t_size;		/* # lines and cols	*/
+	int	  t_flags;
+#define	TERM_CAN_INSERT		0x001	/* Has insert cap	*/
+#define	TERM_CAN_DELETE		0x002	/* Has delete cap	*/
+#define	TERM_CAN_CEOL		0x004	/* Has CEOL cap		*/
+#define	TERM_CAN_TAB		0x008	/* Can use tabs		*/
+#define	TERM_CAN_ME		0x010	/* Can turn all attrs.	*/
+#define	TERM_CAN_UP		0x020	/* Can move up		*/
+#define	TERM_HAS_META		0x040	/* Has a meta key	*/
+#define	TERM_HAS_AUTO_MARGINS	0x080	/* Has auto margins	*/
+#define	TERM_HAS_MAGIC_MARGINS	0x100	/* Has magic margins	*/
+	char	 *t_buf;		/* Termcap buffer	*/
+	size_t	  t_loc;		/* location used	*/
+	char	**t_str;		/* termcap strings	*/
+	int	 *t_val;		/* termcap values	*/
+	char	 *t_cap;		/* Termcap buffer	*/
+	funckey_t	 *t_fkey;		/* Array of keys	*/
+} el_terminal_t;
+
+/*
+ * fKey indexes
+ */
+#define	A_K_DN		0
+#define	A_K_UP		1
+#define	A_K_LT		2
+#define	A_K_RT		3
+#define	A_K_HO		4
+#define	A_K_EN		5
+#define	A_K_NKEYS	6
+
+protected void	terminal_move_to_line(EditLine *, int);
+protected void	terminal_move_to_char(EditLine *, int);
+protected void	terminal_clear_EOL(EditLine *, int);
+protected void	terminal_overwrite(EditLine *, const Char *, size_t);
+protected void	terminal_insertwrite(EditLine *, Char *, int);
+protected void	terminal_deletechars(EditLine *, int);
+protected void	terminal_clear_screen(EditLine *);
+protected void	terminal_beep(EditLine *);
+protected int	terminal_change_size(EditLine *, int, int);
+protected int	terminal_get_size(EditLine *, int *, int *);
+protected int	terminal_init(EditLine *);
+protected void	terminal_bind_arrow(EditLine *);
+protected void	terminal_print_arrow(EditLine *, const Char *);
+protected int	terminal_clear_arrow(EditLine *, const Char *);
+protected int	terminal_set_arrow(EditLine *, const Char *, keymacro_value_t *, int);
+protected void	terminal_end(EditLine *);
+protected void	terminal_get(EditLine *, const char **);
+protected int	terminal_set(EditLine *, const char *);
+protected int	terminal_settc(EditLine *, int, const Char **);
+protected int	terminal_gettc(EditLine *, int, char **);
+protected int	terminal_telltc(EditLine *, int, const Char **);
+protected int	terminal_echotc(EditLine *, int, const Char **);
+protected void	terminal_writec(EditLine *, Int);
+protected int	terminal__putc(EditLine *, Int);
+protected void	terminal__flush(EditLine *);
+
+/*
+ * Easy access macros
+ */
+#define	EL_FLAGS	(el)->el_terminal.t_flags
+
+#define	EL_CAN_INSERT		(EL_FLAGS & TERM_CAN_INSERT)
+#define	EL_CAN_DELETE		(EL_FLAGS & TERM_CAN_DELETE)
+#define	EL_CAN_CEOL		(EL_FLAGS & TERM_CAN_CEOL)
+#define	EL_CAN_TAB		(EL_FLAGS & TERM_CAN_TAB)
+#define	EL_CAN_ME		(EL_FLAGS & TERM_CAN_ME)
+#define EL_CAN_UP		(EL_FLAGS & TERM_CAN_UP)
+#define	EL_HAS_META		(EL_FLAGS & TERM_HAS_META)
+#define	EL_HAS_AUTO_MARGINS	(EL_FLAGS & TERM_HAS_AUTO_MARGINS)
+#define	EL_HAS_MAGIC_MARGINS	(EL_FLAGS & TERM_HAS_MAGIC_MARGINS)
+
+#endif /* _h_el_terminal */
diff -pruN 5.1.58-1/cmd-line-utils/libedit/emacs.c 5.1.61-2/cmd-line-utils/libedit/emacs.c
--- 5.1.58-1/cmd-line-utils/libedit/emacs.c	2011-07-01 15:22:21.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/emacs.c	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: emacs.c,v 1.21 2006/03/06 21:11:56 christos Exp $	*/
+/*	$NetBSD: emacs.c,v 1.25 2011/07/29 15:16:33 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -51,22 +51,22 @@ static char sccsid[] = "@(#)emacs.c	8.1 
  */
 protected el_action_t
 /*ARGSUSED*/
-em_delete_or_list(EditLine *el, int c)
+em_delete_or_list(EditLine *el, Int c)
 {
 
 	if (el->el_line.cursor == el->el_line.lastchar) {
 					/* if I'm at the end */
 		if (el->el_line.cursor == el->el_line.buffer) {
 					/* and the beginning */
-			term_writec(el, c);	/* then do an EOF */
-			return (CC_EOF);
+			terminal_writec(el, c);	/* then do an EOF */
+			return CC_EOF;
 		} else {
 			/*
 			 * Here we could list completions, but it is an
 			 * error right now
 			 */
-			term_beep(el);
-			return (CC_ERROR);
+			terminal_beep(el);
+			return CC_ERROR;
 		}
 	} else {
 		if (el->el_state.doingarg)
@@ -76,7 +76,7 @@ em_delete_or_list(EditLine *el, int c)
 		if (el->el_line.cursor > el->el_line.lastchar)
 			el->el_line.cursor = el->el_line.lastchar;
 				/* bounds check */
-		return (CC_REFRESH);
+		return CC_REFRESH;
 	}
 }
 
@@ -87,12 +87,12 @@ em_delete_or_list(EditLine *el, int c)
  */
 protected el_action_t
 /*ARGSUSED*/
-em_delete_next_word(EditLine *el, int c __attribute__((__unused__)))
+em_delete_next_word(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *cp, *p, *kp;
+	Char *cp, *p, *kp;
 
 	if (el->el_line.cursor == el->el_line.lastchar)
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	cp = c__next_word(el->el_line.cursor, el->el_line.lastchar,
 	    el->el_state.argument, ce__isword);
@@ -102,11 +102,11 @@ em_delete_next_word(EditLine *el, int c 
 		*kp++ = *p;
 	el->el_chared.c_kill.last = kp;
 
-	c_delafter(el, cp - el->el_line.cursor);	/* delete after dot */
+	c_delafter(el, (int)(cp - el->el_line.cursor));	/* delete after dot */
 	if (el->el_line.cursor > el->el_line.lastchar)
 		el->el_line.cursor = el->el_line.lastchar;
 				/* bounds check */
-	return (CC_REFRESH);
+	return CC_REFRESH;
 }
 
 
@@ -116,23 +116,24 @@ em_delete_next_word(EditLine *el, int c 
  */
 protected el_action_t
 /*ARGSUSED*/
-em_yank(EditLine *el, int c __attribute__((__unused__)))
+em_yank(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *kp, *cp;
+	Char *kp, *cp;
 
 	if (el->el_chared.c_kill.last == el->el_chared.c_kill.buf)
-		return (CC_NORM);
+		return CC_NORM;
 
 	if (el->el_line.lastchar +
 	    (el->el_chared.c_kill.last - el->el_chared.c_kill.buf) >=
 	    el->el_line.limit)
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	el->el_chared.c_kill.mark = el->el_line.cursor;
 	cp = el->el_line.cursor;
 
 	/* open the space, */
-	c_insert(el, el->el_chared.c_kill.last - el->el_chared.c_kill.buf);
+	c_insert(el,
+	    (int)(el->el_chared.c_kill.last - el->el_chared.c_kill.buf));
 	/* copy the chars */
 	for (kp = el->el_chared.c_kill.buf; kp < el->el_chared.c_kill.last; kp++)
 		*cp++ = *kp;
@@ -141,7 +142,7 @@ em_yank(EditLine *el, int c __attribute_
 	if (el->el_state.argument == 1)
 		el->el_line.cursor = cp;
 
-	return (CC_REFRESH);
+	return CC_REFRESH;
 }
 
 
@@ -151,9 +152,9 @@ em_yank(EditLine *el, int c __attribute_
  */
 protected el_action_t
 /*ARGSUSED*/
-em_kill_line(EditLine *el, int c __attribute__((__unused__)))
+em_kill_line(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *kp, *cp;
+	Char *kp, *cp;
 
 	cp = el->el_line.buffer;
 	kp = el->el_chared.c_kill.buf;
@@ -163,7 +164,7 @@ em_kill_line(EditLine *el, int c __attri
 				/* zap! -- delete all of it */
 	el->el_line.lastchar = el->el_line.buffer;
 	el->el_line.cursor = el->el_line.buffer;
-	return (CC_REFRESH);
+	return CC_REFRESH;
 }
 
 
@@ -173,12 +174,12 @@ em_kill_line(EditLine *el, int c __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-em_kill_region(EditLine *el, int c __attribute__((__unused__)))
+em_kill_region(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *kp, *cp;
+	Char *kp, *cp;
 
 	if (!el->el_chared.c_kill.mark)
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	if (el->el_chared.c_kill.mark > el->el_line.cursor) {
 		cp = el->el_line.cursor;
@@ -186,17 +187,17 @@ em_kill_region(EditLine *el, int c __att
 		while (cp < el->el_chared.c_kill.mark)
 			*kp++ = *cp++;	/* copy it */
 		el->el_chared.c_kill.last = kp;
-		c_delafter(el, cp - el->el_line.cursor);
+		c_delafter(el, (int)(cp - el->el_line.cursor));
 	} else {		/* mark is before cursor */
 		cp = el->el_chared.c_kill.mark;
 		kp = el->el_chared.c_kill.buf;
 		while (cp < el->el_line.cursor)
 			*kp++ = *cp++;	/* copy it */
 		el->el_chared.c_kill.last = kp;
-		c_delbefore(el, cp - el->el_chared.c_kill.mark);
+		c_delbefore(el, (int)(cp - el->el_chared.c_kill.mark));
 		el->el_line.cursor = el->el_chared.c_kill.mark;
 	}
-	return (CC_REFRESH);
+	return CC_REFRESH;
 }
 
 
@@ -206,12 +207,12 @@ em_kill_region(EditLine *el, int c __att
  */
 protected el_action_t
 /*ARGSUSED*/
-em_copy_region(EditLine *el, int c __attribute__((__unused__)))
+em_copy_region(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *kp, *cp;
+	Char *kp, *cp;
 
 	if (!el->el_chared.c_kill.mark)
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	if (el->el_chared.c_kill.mark > el->el_line.cursor) {
 		cp = el->el_line.cursor;
@@ -226,7 +227,7 @@ em_copy_region(EditLine *el, int c __att
 			*kp++ = *cp++;	/* copy it */
 		el->el_chared.c_kill.last = kp;
 	}
-	return (CC_NORM);
+	return CC_NORM;
 }
 
 
@@ -235,7 +236,7 @@ em_copy_region(EditLine *el, int c __att
  *	Gosling emacs transpose chars [^T]
  */
 protected el_action_t
-em_gosmacs_transpose(EditLine *el, int c)
+em_gosmacs_transpose(EditLine *el, Int c)
 {
 
 	if (el->el_line.cursor > &el->el_line.buffer[1]) {
@@ -243,9 +244,9 @@ em_gosmacs_transpose(EditLine *el, int c
 		c = el->el_line.cursor[-2];
 		el->el_line.cursor[-2] = el->el_line.cursor[-1];
 		el->el_line.cursor[-1] = c;
-		return (CC_REFRESH);
+		return CC_REFRESH;
 	} else
-		return (CC_ERROR);
+		return CC_ERROR;
 }
 
 
@@ -255,10 +256,10 @@ em_gosmacs_transpose(EditLine *el, int c
  */
 protected el_action_t
 /*ARGSUSED*/
-em_next_word(EditLine *el, int c __attribute__((__unused__)))
+em_next_word(EditLine *el, Int c __attribute__((__unused__)))
 {
 	if (el->el_line.cursor == el->el_line.lastchar)
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	el->el_line.cursor = c__next_word(el->el_line.cursor,
 	    el->el_line.lastchar,
@@ -268,9 +269,9 @@ em_next_word(EditLine *el, int c __attri
 	if (el->el_map.type == MAP_VI)
 		if (el->el_chared.c_vcmd.action != NOP) {
 			cv_delfini(el);
-			return (CC_REFRESH);
+			return CC_REFRESH;
 		}
-	return (CC_CURSOR);
+	return CC_CURSOR;
 }
 
 
@@ -280,21 +281,21 @@ em_next_word(EditLine *el, int c __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-em_upper_case(EditLine *el, int c __attribute__((__unused__)))
+em_upper_case(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *cp, *ep;
+	Char *cp, *ep;
 
 	ep = c__next_word(el->el_line.cursor, el->el_line.lastchar,
 	    el->el_state.argument, ce__isword);
 
 	for (cp = el->el_line.cursor; cp < ep; cp++)
-		if (islower((unsigned char)*cp))
-			*cp = toupper((unsigned char)*cp);
+		if (Islower(*cp))
+			*cp = Toupper(*cp);
 
 	el->el_line.cursor = ep;
 	if (el->el_line.cursor > el->el_line.lastchar)
 		el->el_line.cursor = el->el_line.lastchar;
-	return (CC_REFRESH);
+	return CC_REFRESH;
 }
 
 
@@ -304,29 +305,29 @@ em_upper_case(EditLine *el, int c __attr
  */
 protected el_action_t
 /*ARGSUSED*/
-em_capitol_case(EditLine *el, int c __attribute__((__unused__)))
+em_capitol_case(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *cp, *ep;
+	Char *cp, *ep;
 
 	ep = c__next_word(el->el_line.cursor, el->el_line.lastchar,
 	    el->el_state.argument, ce__isword);
 
 	for (cp = el->el_line.cursor; cp < ep; cp++) {
-		if (isalpha((unsigned char)*cp)) {
-			if (islower((unsigned char)*cp))
-				*cp = toupper((unsigned char)*cp);
+		if (Isalpha(*cp)) {
+			if (Islower(*cp))
+				*cp = Toupper(*cp);
 			cp++;
 			break;
 		}
 	}
 	for (; cp < ep; cp++)
-		if (isupper((unsigned char)*cp))
-			*cp = tolower((unsigned char)*cp);
+		if (Isupper(*cp))
+			*cp = Tolower(*cp);
 
 	el->el_line.cursor = ep;
 	if (el->el_line.cursor > el->el_line.lastchar)
 		el->el_line.cursor = el->el_line.lastchar;
-	return (CC_REFRESH);
+	return CC_REFRESH;
 }
 
 
@@ -336,21 +337,21 @@ em_capitol_case(EditLine *el, int c __at
  */
 protected el_action_t
 /*ARGSUSED*/
-em_lower_case(EditLine *el, int c __attribute__((__unused__)))
+em_lower_case(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *cp, *ep;
+	Char *cp, *ep;
 
 	ep = c__next_word(el->el_line.cursor, el->el_line.lastchar,
 	    el->el_state.argument, ce__isword);
 
 	for (cp = el->el_line.cursor; cp < ep; cp++)
-		if (isupper((unsigned char)*cp))
-			*cp = tolower((unsigned char)*cp);
+		if (Isupper(*cp))
+			*cp = Tolower(*cp);
 
 	el->el_line.cursor = ep;
 	if (el->el_line.cursor > el->el_line.lastchar)
 		el->el_line.cursor = el->el_line.lastchar;
-	return (CC_REFRESH);
+	return CC_REFRESH;
 }
 
 
@@ -360,11 +361,11 @@ em_lower_case(EditLine *el, int c __attr
  */
 protected el_action_t
 /*ARGSUSED*/
-em_set_mark(EditLine *el, int c __attribute__((__unused__)))
+em_set_mark(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	el->el_chared.c_kill.mark = el->el_line.cursor;
-	return (CC_NORM);
+	return CC_NORM;
 }
 
 
@@ -374,14 +375,14 @@ em_set_mark(EditLine *el, int c __attrib
  */
 protected el_action_t
 /*ARGSUSED*/
-em_exchange_mark(EditLine *el, int c __attribute__((__unused__)))
+em_exchange_mark(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *cp;
+	Char *cp;
 
 	cp = el->el_line.cursor;
 	el->el_line.cursor = el->el_chared.c_kill.mark;
 	el->el_chared.c_kill.mark = cp;
-	return (CC_CURSOR);
+	return CC_CURSOR;
 }
 
 
@@ -391,14 +392,14 @@ em_exchange_mark(EditLine *el, int c __a
  */
 protected el_action_t
 /*ARGSUSED*/
-em_universal_argument(EditLine *el, int c __attribute__((__unused__)))
+em_universal_argument(EditLine *el, Int c __attribute__((__unused__)))
 {				/* multiply current argument by 4 */
 
 	if (el->el_state.argument > 1000000)
-		return (CC_ERROR);
+		return CC_ERROR;
 	el->el_state.doingarg = 1;
 	el->el_state.argument *= 4;
-	return (CC_ARGHACK);
+	return CC_ARGHACK;
 }
 
 
@@ -408,11 +409,11 @@ em_universal_argument(EditLine *el, int 
  */
 protected el_action_t
 /*ARGSUSED*/
-em_meta_next(EditLine *el, int c __attribute__((__unused__)))
+em_meta_next(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	el->el_state.metanext = 1;
-	return (CC_ARGHACK);
+	return CC_ARGHACK;
 }
 
 
@@ -421,12 +422,12 @@ em_meta_next(EditLine *el, int c __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-em_toggle_overwrite(EditLine *el, int c __attribute__((__unused__)))
+em_toggle_overwrite(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	el->el_state.inputmode = (el->el_state.inputmode == MODE_INSERT) ?
 	    MODE_REPLACE : MODE_INSERT;
-	return (CC_NORM);
+	return CC_NORM;
 }
 
 
@@ -435,25 +436,25 @@ em_toggle_overwrite(EditLine *el, int c 
  */
 protected el_action_t
 /*ARGSUSED*/
-em_copy_prev_word(EditLine *el, int c __attribute__((__unused__)))
+em_copy_prev_word(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *cp, *oldc, *dp;
+	Char *cp, *oldc, *dp;
 
 	if (el->el_line.cursor == el->el_line.buffer)
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	oldc = el->el_line.cursor;
 	/* does a bounds check */
 	cp = c__prev_word(el->el_line.cursor, el->el_line.buffer,
 	    el->el_state.argument, ce__isword);
 
-	c_insert(el, oldc - cp);
+	c_insert(el, (int)(oldc - cp));
 	for (dp = oldc; cp < oldc && dp < el->el_line.lastchar; cp++)
 		*dp++ = *cp;
 
 	el->el_line.cursor = dp;/* put cursor at end */
 
-	return (CC_REFRESH);
+	return CC_REFRESH;
 }
 
 
@@ -462,11 +463,11 @@ em_copy_prev_word(EditLine *el, int c __
  */
 protected el_action_t
 /*ARGSUSED*/
-em_inc_search_next(EditLine *el, int c __attribute__((__unused__)))
+em_inc_search_next(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	el->el_search.patlen = 0;
-	return (ce_inc_search(el, ED_SEARCH_NEXT_HISTORY));
+	return ce_inc_search(el, ED_SEARCH_NEXT_HISTORY);
 }
 
 
@@ -475,11 +476,11 @@ em_inc_search_next(EditLine *el, int c _
  */
 protected el_action_t
 /*ARGSUSED*/
-em_inc_search_prev(EditLine *el, int c __attribute__((__unused__)))
+em_inc_search_prev(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	el->el_search.patlen = 0;
-	return (ce_inc_search(el, ED_SEARCH_PREV_HISTORY));
+	return ce_inc_search(el, ED_SEARCH_PREV_HISTORY);
 }
 
 
@@ -489,11 +490,11 @@ em_inc_search_prev(EditLine *el, int c _
  */
 protected el_action_t
 /*ARGSUSED*/
-em_delete_prev_char(EditLine *el, int c __attribute__((__unused__)))
+em_delete_prev_char(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	if (el->el_line.cursor <= el->el_line.buffer)
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	if (el->el_state.doingarg)
 		c_delbefore(el, el->el_state.argument);
@@ -502,5 +503,5 @@ em_delete_prev_char(EditLine *el, int c 
 	el->el_line.cursor -= el->el_state.argument;
 	if (el->el_line.cursor < el->el_line.buffer)
 		el->el_line.cursor = el->el_line.buffer;
-	return (CC_REFRESH);
+	return CC_REFRESH;
 }
diff -pruN 5.1.58-1/cmd-line-utils/libedit/filecomplete.c 5.1.61-2/cmd-line-utils/libedit/filecomplete.c
--- 5.1.58-1/cmd-line-utils/libedit/filecomplete.c	2011-07-01 15:22:17.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/filecomplete.c	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: filecomplete.c,v 1.13 2009/01/26 17:32:41 apb Exp $	*/
+/*	$NetBSD: filecomplete.c,v 1.31 2011/09/16 16:13:16 plunky Exp $	*/
 
 /*-
  * Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -78,8 +78,8 @@ extern char *alloca ();
 #include "histedit.h"
 #include "filecomplete.h"
 
-static char break_chars[] = { ' ', '\t', '\n', '"', '\\', '\'', '`', '@', '$',
-    '>', '<', '=', ';', '|', '&', '{', '(', '\0' };
+static const Char break_chars[] = { ' ', '\t', '\n', '"', '\\', '\'', '`', '@',
+    '$', '>', '<', '=', ';', '|', '&', '{', '(', '\0' };
 
 
 /********************************/
@@ -95,12 +95,16 @@ static char break_chars[] = { ' ', '\t',
 char *
 fn_tilde_expand(const char *txt)
 {
+#if defined(HAVE_GETPW_R_POSIX) || defined(HAVE_GETPW_R_DRAFT)
+	struct passwd pwres;
+	char pwbuf[1024];
+#endif
 	struct passwd *pass;
 	char *temp;
 	size_t len = 0;
 
 	if (txt[0] != '~')
-		return (strdup(txt));
+		return strdup(txt);
 
 	temp = strchr(txt + 1, '/');
 	if (temp == NULL) {
@@ -108,33 +112,49 @@ fn_tilde_expand(const char *txt)
 		if (temp == NULL)
 			return NULL;
 	} else {
-		len = temp - txt + 1;	/* text until string after slash */
-		temp = malloc(len);
+		/* text until string after slash */
+		len = (size_t)(temp - txt + 1);
+		temp = el_malloc(len * sizeof(*temp));
 		if (temp == NULL)
 			return NULL;
 		(void)strncpy(temp, txt + 1, len - 2);
 		temp[len - 2] = '\0';
 	}
-	/* XXXMYSQL: use non-_r functions for now */
 	if (temp[0] == 0) {
+#ifdef HAVE_GETPW_R_POSIX
+ 		if (getpwuid_r(getuid(), &pwres, pwbuf, sizeof(pwbuf),
+		    &pass) != 0)
+ 			pass = NULL;
+#elif HAVE_GETPW_R_DRAFT
+		pass = getpwuid_r(getuid(), &pwres, pwbuf, sizeof(pwbuf));
+#else
 		pass = getpwuid(getuid());
+#endif
 	} else {
+#ifdef HAVE_GETPW_R_POSIX
+		if (getpwnam_r(temp, &pwres, pwbuf, sizeof(pwbuf), &pass) != 0)
+			pass = NULL;
+#elif HAVE_GETPW_R_DRAFT
+		pass = getpwnam_r(temp, &pwres, pwbuf, sizeof(pwbuf));
+#else
 		pass = getpwnam(temp);
+#endif
 	}
-	free(temp);		/* value no more needed */
+	el_free(temp);		/* value no more needed */
 	if (pass == NULL)
-		return (strdup(txt));
+		return strdup(txt);
 
 	/* update pointer txt to point at string immedially following */
 	/* first slash */
 	txt += len;
 
-	temp = malloc(strlen(pass->pw_dir) + 1 + strlen(txt) + 1);
+	len = strlen(pass->pw_dir) + 1 + strlen(txt) + 1;
+	temp = el_malloc(len * sizeof(*temp));
 	if (temp == NULL)
 		return NULL;
-	(void)sprintf(temp, "%s/%s", pass->pw_dir, txt);
+	(void)snprintf(temp, len, "%s/%s", pass->pw_dir, txt);
 
-	return (temp);
+	return temp;
 }
 
 
@@ -160,23 +180,29 @@ fn_filename_completion_function(const ch
 		if (temp) {
 			char *nptr;
 			temp++;
-			nptr = realloc(filename, strlen(temp) + 1);
+			nptr = el_realloc(filename, (strlen(temp) + 1) *
+			    sizeof(*nptr));
 			if (nptr == NULL) {
-				free(filename);
+				el_free(filename);
+				filename = NULL;
 				return NULL;
 			}
 			filename = nptr;
 			(void)strcpy(filename, temp);
-			len = temp - text;	/* including last slash */
-			nptr = realloc(dirname, len + 1);
+			len = (size_t)(temp - text);	/* including last slash */
+
+			nptr = el_realloc(dirname, (len + 1) *
+			    sizeof(*nptr));
 			if (nptr == NULL) {
-				free(filename);
+				el_free(dirname);
+				dirname = NULL;
 				return NULL;
 			}
 			dirname = nptr;
 			(void)strncpy(dirname, text, len);
 			dirname[len] = '\0';
 		} else {
+			el_free(filename);
 			if (*text == 0)
 				filename = NULL;
 			else {
@@ -184,6 +210,7 @@ fn_filename_completion_function(const ch
 				if (filename == NULL)
 					return NULL;
 			}
+			el_free(dirname);
 			dirname = NULL;
 		}
 
@@ -193,12 +220,14 @@ fn_filename_completion_function(const ch
 		}
 
 		/* support for ``~user'' syntax */
-		free(dirpath);
 
-		if (dirname == NULL && (dirname = strdup("./")) == NULL)
-			return NULL;
-
-		if (*dirname == '~')
+		el_free(dirpath);
+		dirpath = NULL;
+		if (dirname == NULL) {
+			if ((dirname = strdup("")) == NULL)
+				return NULL;
+			dirpath = strdup("./");
+		} else if (*dirname == '~')
 			dirpath = fn_tilde_expand(dirname);
 		else
 			dirpath = strdup(dirname);
@@ -208,7 +237,7 @@ fn_filename_completion_function(const ch
 
 		dir = opendir(dirpath);
 		if (!dir)
-			return (NULL);	/* cannot open the directory */
+			return NULL;	/* cannot open the directory */
 
 		/* will be used in cycle */
 		filename_len = filename ? strlen(filename) : 0;
@@ -243,17 +272,18 @@ fn_filename_completion_function(const ch
 		len = strlen(entry->d_name);
 #endif
 
-		temp = malloc(strlen(dirname) + len + 1);
+		len = strlen(dirname) + len + 1;
+		temp = el_malloc(len * sizeof(*temp));
 		if (temp == NULL)
 			return NULL;
-		(void)sprintf(temp, "%s%s", dirname, entry->d_name);
+		(void)snprintf(temp, len, "%s%s", dirname, entry->d_name);
 	} else {
 		(void)closedir(dir);
 		dir = NULL;
 		temp = NULL;
 	}
 
-	return (temp);
+	return temp;
 }
 
 
@@ -270,7 +300,7 @@ append_char_function(const char *name)
 		rs = "/";
 out:
 	if (expname)
-		free(expname);
+		el_free(expname);
 	return rs;
 }
 /*
@@ -293,10 +323,10 @@ completion_matches(const char *text, cha
 			char **nmatch_list;
 			while (matches + 3 >= match_list_len)
 				match_list_len <<= 1;
-			nmatch_list = realloc(match_list,
-			    match_list_len * sizeof(char *));
+			nmatch_list = el_realloc(match_list,
+			    match_list_len * sizeof(*nmatch_list));
 			if (nmatch_list == NULL) {
-				free(match_list);
+				el_free(match_list);
 				return NULL;
 			}
 			match_list = nmatch_list;
@@ -319,9 +349,9 @@ completion_matches(const char *text, cha
 		max_equal = i;
 	}
 
-	retstr = malloc(max_equal + 1);
+	retstr = el_malloc((max_equal + 1) * sizeof(*retstr));
 	if (retstr == NULL) {
-		free(match_list);
+		el_free(match_list);
 		return NULL;
 	}
 	(void)strncpy(retstr, match_list[1], max_equal);
@@ -329,9 +359,9 @@ completion_matches(const char *text, cha
 	match_list[0] = retstr;
 
 	/* add NULL as last pointer to the array */
-	match_list[matches + 1] = (char *) NULL;
+	match_list[matches + 1] = NULL;
 
-	return (match_list);
+	return match_list;
 }
 
 /*
@@ -348,37 +378,47 @@ _fn_qsort_string_compare(const void *i1,
 
 /*
  * Display list of strings in columnar format on readline's output stream.
- * 'matches' is list of strings, 'len' is number of strings in 'matches',
- * 'max' is maximum length of string in 'matches'.
+ * 'matches' is list of strings, 'num' is number of strings in 'matches',
+ * 'width' is maximum length of string in 'matches'.
+ *
+ * matches[0] is not one of the match strings, but it is counted in
+ * num, so the strings are matches[1] *through* matches[num-1].
  */
 void
-fn_display_match_list (EditLine *el, char **matches, int len, int max)
+fn_display_match_list (EditLine *el, char **matches, size_t num, size_t width)
 {
-	int i, idx, limit, count;
-	int screenwidth = el->el_term.t_size.h;
+	size_t line, lines, col, cols, thisguy;
+	int screenwidth = el->el_terminal.t_size.h;
+
+	/* Ignore matches[0]. Avoid 1-based array logic below. */
+	matches++;
+	num--;
 
 	/*
-	 * Find out how many entries can be put on one line, count
-	 * with two spaces between strings.
+	 * Find out how many entries can be put on one line; count
+	 * with one space between strings the same way it's printed.
 	 */
-	limit = screenwidth / (max + 2);
-	if (limit == 0)
-		limit = 1;
-
-	/* how many lines of output */
-	count = len / limit;
-	if (count * limit < len)
-		count++;
-
-	/* Sort the items if they are not already sorted. */
-	qsort(&matches[1], (size_t)(len - 1), sizeof(char *),
-	    _fn_qsort_string_compare);
-
-	idx = 1;
-	for(; count > 0; count--) {
-		for(i = 0; i < limit && matches[idx]; i++, idx++)
-			(void)fprintf(el->el_outfile, "%-*s  ", max,
-			    matches[idx]);
+	cols = (size_t)screenwidth / (width + 1);
+	if (cols == 0)
+		cols = 1;
+
+	/* how many lines of output, rounded up */
+	lines = (num + cols - 1) / cols;
+
+	/* Sort the items. */
+	qsort(matches, num, sizeof(char *), _fn_qsort_string_compare);
+
+	/*
+	 * On the ith line print elements i, i+lines, i+lines*2, etc.
+	 */
+	for (line = 0; line < lines; line++) {
+		for (col = 0; col < cols; col++) {
+			thisguy = line + col * lines;
+			if (thisguy >= num)
+				break;
+			(void)fprintf(el->el_outfile, "%s%-*s",
+			    col == 0 ? "" : " ", (int)width, matches[thisguy]);
+		}
 		(void)fprintf(el->el_outfile, "\n");
 	}
 }
@@ -399,13 +439,14 @@ int
 fn_complete(EditLine *el,
 	char *(*complet_func)(const char *, int),
 	char **(*attempted_completion_function)(const char *, int, int),
-	const char *word_break, const char *special_prefixes,
-	const char *(*app_func)(const char *), int query_items,
+	const Char *word_break, const Char *special_prefixes,
+	const char *(*app_func)(const char *), size_t query_items,
 	int *completion_type, int *over, int *point, int *end)
 {
-	const LineInfo *li;
-	char *temp, **matches;
-	const char *ctemp;
+	const TYPE(LineInfo) *li;
+	Char *temp;
+        char **matches;
+	const Char *ctemp;
 	size_t len;
 	int what_to_do = '\t';
 	int retval = CC_NORM;
@@ -423,45 +464,47 @@ fn_complete(EditLine *el,
 		app_func = append_char_function;
 
 	/* We now look backwards for the start of a filename/variable word */
-	li = el_line(el);
-	ctemp = (const char *) li->cursor;
+	li = FUN(el,line)(el);
+	ctemp = li->cursor;
 	while (ctemp > li->buffer
-	    && !strchr(word_break, ctemp[-1])
-	    && (!special_prefixes || !strchr(special_prefixes, ctemp[-1]) ) )
+	    && !Strchr(word_break, ctemp[-1])
+	    && (!special_prefixes || !Strchr(special_prefixes, ctemp[-1]) ) )
 		ctemp--;
 
-	len = li->cursor - ctemp;
+	len = (size_t)(li->cursor - ctemp);
 #if defined(__SSP__) || defined(__SSP_ALL__)
-	temp = malloc(len + 1);
+	temp = el_malloc((len + 1) * sizeof(*temp));
 #else
-	temp = alloca(len + 1);
+	temp = alloca((len + 1) * sizeof(*temp));
 #endif
-	(void)strncpy(temp, ctemp, len);
+	(void)Strncpy(temp, ctemp, len);
 	temp[len] = '\0';
 
 	/* these can be used by function called in completion_matches() */
 	/* or (*attempted_completion_function)() */
 	if (point != 0)
-		*point = li->cursor - li->buffer;
+		*point = (int)(li->cursor - li->buffer);
 	if (end != NULL)
-		*end = li->lastchar - li->buffer;
+		*end = (int)(li->lastchar - li->buffer);
 
 	if (attempted_completion_function) {
-		int cur_off = li->cursor - li->buffer;
-		matches = (*attempted_completion_function) (temp,
-		    (int)(cur_off - len), cur_off);
+		int cur_off = (int)(li->cursor - li->buffer);
+		matches = (*attempted_completion_function)(
+		    ct_encode_string(temp, &el->el_scratch),
+		    cur_off - (int)len, cur_off);
 	} else
 		matches = 0;
 	if (!attempted_completion_function || 
 	    (over != NULL && !*over && !matches))
-		matches = completion_matches(temp, complet_func);
+		matches = completion_matches(
+		    ct_encode_string(temp, &el->el_scratch), complet_func);
 
 	if (over != NULL)
 		*over = 0;
 
 	if (matches) {
 		int i;
-		int matches_num, maxlen, match_len, match_display=1;
+		size_t matches_num, maxlen, match_len, match_display=1;
 
 		retval = CC_REFRESH;
 		/*
@@ -470,7 +513,8 @@ fn_complete(EditLine *el,
 		 */
 		if (matches[0][0] != '\0') {
 			el_deletestr(el, (int) len);
-			el_insertstr(el, matches[0]);
+			FUN(el,insertstr)(el,
+			    ct_decode_string(matches[0], &el->el_scratch));
 		}
 
 		if (what_to_do == '?')
@@ -482,7 +526,9 @@ fn_complete(EditLine *el,
 			 * it, unless we do filename completion and the
 			 * object is a directory.
 			 */
-			el_insertstr(el, (*app_func)(matches[0])); 
+			FUN(el,insertstr)(el,
+			    ct_decode_string((*app_func)(matches[0]),
+			    &el->el_scratch));
 		} else if (what_to_do == '!') {
     display_matches:
 			/*
@@ -490,12 +536,13 @@ fn_complete(EditLine *el,
 			 * matches.
 			 */
 
-			for(i=1, maxlen=0; matches[i]; i++) {
+			for(i = 1, maxlen = 0; matches[i]; i++) {
 				match_len = strlen(matches[i]);
 				if (match_len > maxlen)
 					maxlen = match_len;
 			}
-			matches_num = i - 1;
+			/* matches[1] through matches[i-1] are available */
+			matches_num = (size_t)(i - 1);
 				
 			/* newline to get on next line from command line */
 			(void)fprintf(el->el_outfile, "\n");
@@ -506,7 +553,7 @@ fn_complete(EditLine *el,
 			 */
 			if (matches_num > query_items) {
 				(void)fprintf(el->el_outfile,
-				    "Display all %d possibilities? (y or n) ",
+				    "Display all %zu possibilities? (y or n) ",
 				    matches_num);
 				(void)fflush(el->el_outfile);
 				if (getc(stdin) != 'y')
@@ -514,9 +561,17 @@ fn_complete(EditLine *el,
 				(void)fprintf(el->el_outfile, "\n");
 			}
 
-			if (match_display)
-				fn_display_match_list(el, matches, matches_num,
-					maxlen);
+			if (match_display) {
+				/*
+				 * Interface of this function requires the
+				 * strings be matches[1..num-1] for compat.
+				 * We have matches_num strings not counting
+				 * the prefix in matches[0], so we need to
+				 * add 1 to matches_num for the call.
+				 */
+				fn_display_match_list(el, matches,
+				    matches_num+1, maxlen);
+			}
 			retval = CC_REDISPLAY;
 		} else if (matches[0][0]) {
 			/*
@@ -534,12 +589,12 @@ fn_complete(EditLine *el,
 
 		/* free elements of array and the array itself */
 		for (i = 0; matches[i]; i++)
-			free(matches[i]);
-		free(matches);
+			el_free(matches[i]);
+		el_free(matches);
 		matches = NULL;
 	}
 #if defined(__SSP__) || defined(__SSP_ALL__)
-	free(temp);
+	el_free(temp);
 #endif
 	return retval;
 }
@@ -552,6 +607,6 @@ unsigned char
 _el_fn_complete(EditLine *el, int ch __attribute__((__unused__)))
 {
 	return (unsigned char)fn_complete(el, NULL, NULL,
-	    break_chars, NULL, NULL, 100,
+	    break_chars, NULL, NULL, (size_t)100,
 	    NULL, NULL, NULL, NULL);
 }
diff -pruN 5.1.58-1/cmd-line-utils/libedit/filecomplete.h 5.1.61-2/cmd-line-utils/libedit/filecomplete.h
--- 5.1.58-1/cmd-line-utils/libedit/filecomplete.h	2011-07-01 15:22:19.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/filecomplete.h	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: filecomplete.h,v 1.6 2008/04/29 06:53:01 martin Exp $	*/
+/*	$NetBSD: filecomplete.h,v 1.9 2009/12/30 22:37:40 christos Exp $	*/
 
 /*-
  * Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -34,10 +34,10 @@
 int fn_complete(EditLine *,
     char *(*)(const char *, int),
     char **(*)(const char *, int, int),
-    const char *, const char *, const char *(*)(const char *), int,
+    const Char *, const Char *, const char *(*)(const char *), size_t,
     int *, int *, int *, int *);
 
-void fn_display_match_list(EditLine *, char **, int, int);
+void fn_display_match_list(EditLine *, char **, size_t, size_t);
 char *fn_tilde_expand(const char *);
 char *fn_filename_completion_function(const char *, int);
 
diff -pruN 5.1.58-1/cmd-line-utils/libedit/help.c 5.1.61-2/cmd-line-utils/libedit/help.c
--- 5.1.58-1/cmd-line-utils/libedit/help.c	2011-07-01 15:26:41.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/help.c	2011-12-16 19:09:20.000000000 +0000
@@ -1,211 +1,212 @@
 /* Automatically generated file, do not edit */
 #include "config.h"
 #include "el.h"
+#include "chartype.h"
 private const struct el_bindings_t el_func_help[] = {
-    { "vi-paste-next",               VI_PASTE_NEXT,                
-      "Vi paste previous deletion to the right of the cursor" },
-    { "vi-paste-prev",               VI_PASTE_PREV,                
-      "Vi paste previous deletion to the left of the cursor" },
-    { "vi-prev-big-word",            VI_PREV_BIG_WORD,             
-      "Vi move to the previous space delimited word" },
-    { "vi-prev-word",                VI_PREV_WORD,                 
-      "Vi move to the previous word" },
-    { "vi-next-big-word",            VI_NEXT_BIG_WORD,             
-      "Vi move to the next space delimited word" },
-    { "vi-next-word",                VI_NEXT_WORD,                 
-      "Vi move to the next word" },
-    { "vi-change-case",              VI_CHANGE_CASE,               
-      "Vi change case of character under the cursor and advance one character" },
-    { "vi-change-meta",              VI_CHANGE_META,               
-      "Vi change prefix command" },
-    { "vi-insert-at-bol",            VI_INSERT_AT_BOL,             
-      "Vi enter insert mode at the beginning of line" },
-    { "vi-replace-char",             VI_REPLACE_CHAR,              
-      "Vi replace character under the cursor with the next character typed" },
-    { "vi-replace-mode",             VI_REPLACE_MODE,              
-      "Vi enter replace mode" },
-    { "vi-substitute-char",          VI_SUBSTITUTE_CHAR,           
-      "Vi replace character under the cursor and enter insert mode" },
-    { "vi-substitute-line",          VI_SUBSTITUTE_LINE,           
-      "Vi substitute entire line" },
-    { "vi-change-to-eol",            VI_CHANGE_TO_EOL,             
-      "Vi change to end of line" },
-    { "vi-insert",                   VI_INSERT,                    
-      "Vi enter insert mode" },
-    { "vi-add",                      VI_ADD,                       
-      "Vi enter insert mode after the cursor" },
-    { "vi-add-at-eol",               VI_ADD_AT_EOL,                
-      "Vi enter insert mode at end of line" },
-    { "vi-delete-meta",              VI_DELETE_META,               
-      "Vi delete prefix command" },
-    { "vi-end-big-word",             VI_END_BIG_WORD,              
-      "Vi move to the end of the current space delimited word" },
-    { "vi-end-word",                 VI_END_WORD,                  
-      "Vi move to the end of the current word" },
-    { "vi-undo",                     VI_UNDO,                      
-      "Vi undo last change" },
-    { "vi-command-mode",             VI_COMMAND_MODE,              
-      "Vi enter command mode (use alternative key bindings)" },
-    { "vi-zero",                     VI_ZERO,                      
-      "Vi move to the beginning of line" },
-    { "vi-delete-prev-char",         VI_DELETE_PREV_CHAR,          
-      "Vi move to previous character (backspace)" },
-    { "vi-list-or-eof",              VI_LIST_OR_EOF,               
-      "Vi list choices for completion or indicate end of file if empty line" },
-    { "vi-kill-line-prev",           VI_KILL_LINE_PREV,            
-      "Vi cut from beginning of line to cursor" },
-    { "vi-search-prev",              VI_SEARCH_PREV,               
-      "Vi search history previous" },
-    { "vi-search-next",              VI_SEARCH_NEXT,               
-      "Vi search history next" },
-    { "vi-repeat-search-next",       VI_REPEAT_SEARCH_NEXT,        
-      "Vi repeat current search in the same search direction" },
-    { "vi-repeat-search-prev",       VI_REPEAT_SEARCH_PREV,        
-      "Vi repeat current search in the opposite search direction" },
-    { "vi-next-char",                VI_NEXT_CHAR,                 
-      "Vi move to the character specified next" },
-    { "vi-prev-char",                VI_PREV_CHAR,                 
-      "Vi move to the character specified previous" },
-    { "vi-to-next-char",             VI_TO_NEXT_CHAR,              
-      "Vi move up to the character specified next" },
-    { "vi-to-prev-char",             VI_TO_PREV_CHAR,              
-      "Vi move up to the character specified previous" },
-    { "vi-repeat-next-char",         VI_REPEAT_NEXT_CHAR,          
-      "Vi repeat current character search in the same search direction" },
-    { "vi-repeat-prev-char",         VI_REPEAT_PREV_CHAR,          
-      "Vi repeat current character search in the opposite search direction" },
-    { "vi-match",                    VI_MATCH,                     
-      "Vi go to matching () {} or []" },
-    { "vi-undo-line",                VI_UNDO_LINE,                 
-      "Vi undo all changes to line" },
-    { "vi-to-column",                VI_TO_COLUMN,                 
-      "Vi go to specified column" },
-    { "vi-yank-end",                 VI_YANK_END,                  
-      "Vi yank to end of line" },
-    { "vi-yank",                     VI_YANK,                      
-      "Vi yank" },
-    { "vi-comment-out",              VI_COMMENT_OUT,               
-      "Vi comment out current command" },
-    { "vi-alias",                    VI_ALIAS,                     
-      "Vi include shell alias" },
-    { "vi-to-history-line",          VI_TO_HISTORY_LINE,           
-      "Vi go to specified history file line." },
-    { "vi-histedit",                 VI_HISTEDIT,                  
-      "Vi edit history line with vi" },
-    { "vi-history-word",             VI_HISTORY_WORD,              
-      "Vi append word from previous input line" },
-    { "vi-redo",                     VI_REDO,                      
-      "Vi redo last non-motion command" },
-    { "em-delete-or-list",           EM_DELETE_OR_LIST,            
-      "Delete character under cursor or list completions if at end of line" },
-    { "em-delete-next-word",         EM_DELETE_NEXT_WORD,          
-      "Cut from cursor to end of current word" },
-    { "em-yank",                     EM_YANK,                      
-      "Paste cut buffer at cursor position" },
-    { "em-kill-line",                EM_KILL_LINE,                 
-      "Cut the entire line and save in cut buffer" },
-    { "em-kill-region",              EM_KILL_REGION,               
-      "Cut area between mark and cursor and save in cut buffer" },
-    { "em-copy-region",              EM_COPY_REGION,               
-      "Copy area between mark and cursor to cut buffer" },
-    { "em-gosmacs-transpose",        EM_GOSMACS_TRANSPOSE,         
-      "Exchange the two characters before the cursor" },
-    { "em-next-word",                EM_NEXT_WORD,                 
-      "Move next to end of current word" },
-    { "em-upper-case",               EM_UPPER_CASE,                
-      "Uppercase the characters from cursor to end of current word" },
-    { "em-capitol-case",             EM_CAPITOL_CASE,              
-      "Capitalize the characters from cursor to end of current word" },
-    { "em-lower-case",               EM_LOWER_CASE,                
-      "Lowercase the characters from cursor to end of current word" },
-    { "em-set-mark",                 EM_SET_MARK,                  
-      "Set the mark at cursor" },
-    { "em-exchange-mark",            EM_EXCHANGE_MARK,             
-      "Exchange the cursor and mark" },
-    { "em-universal-argument",       EM_UNIVERSAL_ARGUMENT,        
-      "Universal argument (argument times 4)" },
-    { "em-meta-next",                EM_META_NEXT,                 
-      "Add 8th bit to next character typed" },
-    { "em-toggle-overwrite",         EM_TOGGLE_OVERWRITE,          
-      "Switch from insert to overwrite mode or vice versa" },
-    { "em-copy-prev-word",           EM_COPY_PREV_WORD,            
-      "Copy current word to cursor" },
-    { "em-inc-search-next",          EM_INC_SEARCH_NEXT,           
-      "Emacs incremental next search" },
-    { "em-inc-search-prev",          EM_INC_SEARCH_PREV,           
-      "Emacs incremental reverse search" },
-    { "em-delete-prev-char",         EM_DELETE_PREV_CHAR,          
-      "Delete the character to the left of the cursor" },
-    { "ed-end-of-file",              ED_END_OF_FILE,               
-      "Indicate end of file" },
-    { "ed-insert",                   ED_INSERT,                    
-      "Add character to the line" },
-    { "ed-delete-prev-word",         ED_DELETE_PREV_WORD,          
-      "Delete from beginning of current word to cursor" },
-    { "ed-delete-next-char",         ED_DELETE_NEXT_CHAR,          
-      "Delete character under cursor" },
-    { "ed-kill-line",                ED_KILL_LINE,                 
-      "Cut to the end of line" },
-    { "ed-move-to-end",              ED_MOVE_TO_END,               
-      "Move cursor to the end of line" },
-    { "ed-move-to-beg",              ED_MOVE_TO_BEG,               
-      "Move cursor to the beginning of line" },
-    { "ed-transpose-chars",          ED_TRANSPOSE_CHARS,           
-      "Exchange the character to the left of the cursor with the one under it" },
-    { "ed-next-char",                ED_NEXT_CHAR,                 
-      "Move to the right one character" },
-    { "ed-prev-word",                ED_PREV_WORD,                 
-      "Move to the beginning of the current word" },
-    { "ed-prev-char",                ED_PREV_CHAR,                 
-      "Move to the left one character" },
-    { "ed-quoted-insert",            ED_QUOTED_INSERT,             
-      "Add the next character typed verbatim" },
-    { "ed-digit",                    ED_DIGIT,                     
-      "Adds to argument or enters a digit" },
-    { "ed-argument-digit",           ED_ARGUMENT_DIGIT,            
-      "Digit that starts argument" },
-    { "ed-unassigned",               ED_UNASSIGNED,                
-      "Indicates unbound character" },
-    { "ed-tty-sigint",               ED_TTY_SIGINT,                
-      "Tty interrupt character" },
-    { "ed-tty-dsusp",                ED_TTY_DSUSP,                 
-      "Tty delayed suspend character" },
-    { "ed-tty-flush-output",         ED_TTY_FLUSH_OUTPUT,          
-      "Tty flush output characters" },
-    { "ed-tty-sigquit",              ED_TTY_SIGQUIT,               
-      "Tty quit character" },
-    { "ed-tty-sigtstp",              ED_TTY_SIGTSTP,               
-      "Tty suspend character" },
-    { "ed-tty-stop-output",          ED_TTY_STOP_OUTPUT,           
-      "Tty disallow output characters" },
-    { "ed-tty-start-output",         ED_TTY_START_OUTPUT,          
-      "Tty allow output characters" },
-    { "ed-newline",                  ED_NEWLINE,                   
-      "Execute command" },
-    { "ed-delete-prev-char",         ED_DELETE_PREV_CHAR,          
-      "Delete the character to the left of the cursor" },
-    { "ed-clear-screen",             ED_CLEAR_SCREEN,              
-      "Clear screen leaving current line at the top" },
-    { "ed-redisplay",                ED_REDISPLAY,                 
-      "Redisplay everything" },
-    { "ed-start-over",               ED_START_OVER,                
-      "Erase current line and start from scratch" },
-    { "ed-sequence-lead-in",         ED_SEQUENCE_LEAD_IN,          
-      "First character in a bound sequence" },
-    { "ed-prev-history",             ED_PREV_HISTORY,              
-      "Move to the previous history line" },
-    { "ed-next-history",             ED_NEXT_HISTORY,              
-      "Move to the next history line" },
-    { "ed-search-prev-history",      ED_SEARCH_PREV_HISTORY,       
-      "Search previous in history for a line matching the current" },
-    { "ed-search-next-history",      ED_SEARCH_NEXT_HISTORY,       
-      "Search next in history for a line matching the current" },
-    { "ed-prev-line",                ED_PREV_LINE,                 
-      "Move up one line" },
-    { "ed-next-line",                ED_NEXT_LINE,                 
-      "Move down one line" },
-    { "ed-command",                  ED_COMMAND,                   
-      "Editline extended command" },
+    { STR("vi-paste-next"),          VI_PASTE_NEXT,                
+      STR("Vi paste previous deletion to the right of the cursor") },
+    { STR("vi-paste-prev"),          VI_PASTE_PREV,                
+      STR("Vi paste previous deletion to the left of the cursor") },
+    { STR("vi-prev-big-word"),       VI_PREV_BIG_WORD,             
+      STR("Vi move to the previous space delimited word") },
+    { STR("vi-prev-word"),           VI_PREV_WORD,                 
+      STR("Vi move to the previous word") },
+    { STR("vi-next-big-word"),       VI_NEXT_BIG_WORD,             
+      STR("Vi move to the next space delimited word") },
+    { STR("vi-next-word"),           VI_NEXT_WORD,                 
+      STR("Vi move to the next word") },
+    { STR("vi-change-case"),         VI_CHANGE_CASE,               
+      STR("Vi change case of character under the cursor and advance one character") },
+    { STR("vi-change-meta"),         VI_CHANGE_META,               
+      STR("Vi change prefix command") },
+    { STR("vi-insert-at-bol"),       VI_INSERT_AT_BOL,             
+      STR("Vi enter insert mode at the beginning of line") },
+    { STR("vi-replace-char"),        VI_REPLACE_CHAR,              
+      STR("Vi replace character under the cursor with the next character typed") },
+    { STR("vi-replace-mode"),        VI_REPLACE_MODE,              
+      STR("Vi enter replace mode") },
+    { STR("vi-substitute-char"),     VI_SUBSTITUTE_CHAR,           
+      STR("Vi replace character under the cursor and enter insert mode") },
+    { STR("vi-substitute-line"),     VI_SUBSTITUTE_LINE,           
+      STR("Vi substitute entire line") },
+    { STR("vi-change-to-eol"),       VI_CHANGE_TO_EOL,             
+      STR("Vi change to end of line") },
+    { STR("vi-insert"),              VI_INSERT,                    
+      STR("Vi enter insert mode") },
+    { STR("vi-add"),                 VI_ADD,                       
+      STR("Vi enter insert mode after the cursor") },
+    { STR("vi-add-at-eol"),          VI_ADD_AT_EOL,                
+      STR("Vi enter insert mode at end of line") },
+    { STR("vi-delete-meta"),         VI_DELETE_META,               
+      STR("Vi delete prefix command") },
+    { STR("vi-end-big-word"),        VI_END_BIG_WORD,              
+      STR("Vi move to the end of the current space delimited word") },
+    { STR("vi-end-word"),            VI_END_WORD,                  
+      STR("Vi move to the end of the current word") },
+    { STR("vi-undo"),                VI_UNDO,                      
+      STR("Vi undo last change") },
+    { STR("vi-command-mode"),        VI_COMMAND_MODE,              
+      STR("Vi enter command mode (use alternative key bindings)") },
+    { STR("vi-zero"),                VI_ZERO,                      
+      STR("Vi move to the beginning of line") },
+    { STR("vi-delete-prev-char"),    VI_DELETE_PREV_CHAR,          
+      STR("Vi move to previous character (backspace)") },
+    { STR("vi-list-or-eof"),         VI_LIST_OR_EOF,               
+      STR("Vi list choices for completion or indicate end of file if empty line") },
+    { STR("vi-kill-line-prev"),      VI_KILL_LINE_PREV,            
+      STR("Vi cut from beginning of line to cursor") },
+    { STR("vi-search-prev"),         VI_SEARCH_PREV,               
+      STR("Vi search history previous") },
+    { STR("vi-search-next"),         VI_SEARCH_NEXT,               
+      STR("Vi search history next") },
+    { STR("vi-repeat-search-next"),  VI_REPEAT_SEARCH_NEXT,        
+      STR("Vi repeat current search in the same search direction") },
+    { STR("vi-repeat-search-prev"),  VI_REPEAT_SEARCH_PREV,        
+      STR("Vi repeat current search in the opposite search direction") },
+    { STR("vi-next-char"),           VI_NEXT_CHAR,                 
+      STR("Vi move to the character specified next") },
+    { STR("vi-prev-char"),           VI_PREV_CHAR,                 
+      STR("Vi move to the character specified previous") },
+    { STR("vi-to-next-char"),        VI_TO_NEXT_CHAR,              
+      STR("Vi move up to the character specified next") },
+    { STR("vi-to-prev-char"),        VI_TO_PREV_CHAR,              
+      STR("Vi move up to the character specified previous") },
+    { STR("vi-repeat-next-char"),    VI_REPEAT_NEXT_CHAR,          
+      STR("Vi repeat current character search in the same search direction") },
+    { STR("vi-repeat-prev-char"),    VI_REPEAT_PREV_CHAR,          
+      STR("Vi repeat current character search in the opposite search direction") },
+    { STR("vi-match"),               VI_MATCH,                     
+      STR("Vi go to matching () {} or []") },
+    { STR("vi-undo-line"),           VI_UNDO_LINE,                 
+      STR("Vi undo all changes to line") },
+    { STR("vi-to-column"),           VI_TO_COLUMN,                 
+      STR("Vi go to specified column") },
+    { STR("vi-yank-end"),            VI_YANK_END,                  
+      STR("Vi yank to end of line") },
+    { STR("vi-yank"),                VI_YANK,                      
+      STR("Vi yank") },
+    { STR("vi-comment-out"),         VI_COMMENT_OUT,               
+      STR("Vi comment out current command") },
+    { STR("vi-alias"),               VI_ALIAS,                     
+      STR("Vi include shell alias") },
+    { STR("vi-to-history-line"),     VI_TO_HISTORY_LINE,           
+      STR("Vi go to specified history file line.") },
+    { STR("vi-histedit"),            VI_HISTEDIT,                  
+      STR("Vi edit history line with vi") },
+    { STR("vi-history-word"),        VI_HISTORY_WORD,              
+      STR("Vi append word from previous input line") },
+    { STR("vi-redo"),                VI_REDO,                      
+      STR("Vi redo last non-motion command") },
+    { STR("em-delete-or-list"),      EM_DELETE_OR_LIST,            
+      STR("Delete character under cursor or list completions if at end of line") },
+    { STR("em-delete-next-word"),    EM_DELETE_NEXT_WORD,          
+      STR("Cut from cursor to end of current word") },
+    { STR("em-yank"),                EM_YANK,                      
+      STR("Paste cut buffer at cursor position") },
+    { STR("em-kill-line"),           EM_KILL_LINE,                 
+      STR("Cut the entire line and save in cut buffer") },
+    { STR("em-kill-region"),         EM_KILL_REGION,               
+      STR("Cut area between mark and cursor and save in cut buffer") },
+    { STR("em-copy-region"),         EM_COPY_REGION,               
+      STR("Copy area between mark and cursor to cut buffer") },
+    { STR("em-gosmacs-transpose"),   EM_GOSMACS_TRANSPOSE,         
+      STR("Exchange the two characters before the cursor") },
+    { STR("em-next-word"),           EM_NEXT_WORD,                 
+      STR("Move next to end of current word") },
+    { STR("em-upper-case"),          EM_UPPER_CASE,                
+      STR("Uppercase the characters from cursor to end of current word") },
+    { STR("em-capitol-case"),        EM_CAPITOL_CASE,              
+      STR("Capitalize the characters from cursor to end of current word") },
+    { STR("em-lower-case"),          EM_LOWER_CASE,                
+      STR("Lowercase the characters from cursor to end of current word") },
+    { STR("em-set-mark"),            EM_SET_MARK,                  
+      STR("Set the mark at cursor") },
+    { STR("em-exchange-mark"),       EM_EXCHANGE_MARK,             
+      STR("Exchange the cursor and mark") },
+    { STR("em-universal-argument"),  EM_UNIVERSAL_ARGUMENT,        
+      STR("Universal argument (argument times 4)") },
+    { STR("em-meta-next"),           EM_META_NEXT,                 
+      STR("Add 8th bit to next character typed") },
+    { STR("em-toggle-overwrite"),    EM_TOGGLE_OVERWRITE,          
+      STR("Switch from insert to overwrite mode or vice versa") },
+    { STR("em-copy-prev-word"),      EM_COPY_PREV_WORD,            
+      STR("Copy current word to cursor") },
+    { STR("em-inc-search-next"),     EM_INC_SEARCH_NEXT,           
+      STR("Emacs incremental next search") },
+    { STR("em-inc-search-prev"),     EM_INC_SEARCH_PREV,           
+      STR("Emacs incremental reverse search") },
+    { STR("em-delete-prev-char"),    EM_DELETE_PREV_CHAR,          
+      STR("Delete the character to the left of the cursor") },
+    { STR("ed-end-of-file"),         ED_END_OF_FILE,               
+      STR("Indicate end of file") },
+    { STR("ed-insert"),              ED_INSERT,                    
+      STR("Add character to the line") },
+    { STR("ed-delete-prev-word"),    ED_DELETE_PREV_WORD,          
+      STR("Delete from beginning of current word to cursor") },
+    { STR("ed-delete-next-char"),    ED_DELETE_NEXT_CHAR,          
+      STR("Delete character under cursor") },
+    { STR("ed-kill-line"),           ED_KILL_LINE,                 
+      STR("Cut to the end of line") },
+    { STR("ed-move-to-end"),         ED_MOVE_TO_END,               
+      STR("Move cursor to the end of line") },
+    { STR("ed-move-to-beg"),         ED_MOVE_TO_BEG,               
+      STR("Move cursor to the beginning of line") },
+    { STR("ed-transpose-chars"),     ED_TRANSPOSE_CHARS,           
+      STR("Exchange the character to the left of the cursor with the one under it") },
+    { STR("ed-next-char"),           ED_NEXT_CHAR,                 
+      STR("Move to the right one character") },
+    { STR("ed-prev-word"),           ED_PREV_WORD,                 
+      STR("Move to the beginning of the current word") },
+    { STR("ed-prev-char"),           ED_PREV_CHAR,                 
+      STR("Move to the left one character") },
+    { STR("ed-quoted-insert"),       ED_QUOTED_INSERT,             
+      STR("Add the next character typed verbatim") },
+    { STR("ed-digit"),               ED_DIGIT,                     
+      STR("Adds to argument or enters a digit") },
+    { STR("ed-argument-digit"),      ED_ARGUMENT_DIGIT,            
+      STR("Digit that starts argument") },
+    { STR("ed-unassigned"),          ED_UNASSIGNED,                
+      STR("Indicates unbound character") },
+    { STR("ed-tty-sigint"),          ED_TTY_SIGINT,                
+      STR("Tty interrupt character") },
+    { STR("ed-tty-dsusp"),           ED_TTY_DSUSP,                 
+      STR("Tty delayed suspend character") },
+    { STR("ed-tty-flush-output"),    ED_TTY_FLUSH_OUTPUT,          
+      STR("Tty flush output characters") },
+    { STR("ed-tty-sigquit"),         ED_TTY_SIGQUIT,               
+      STR("Tty quit character") },
+    { STR("ed-tty-sigtstp"),         ED_TTY_SIGTSTP,               
+      STR("Tty suspend character") },
+    { STR("ed-tty-stop-output"),     ED_TTY_STOP_OUTPUT,           
+      STR("Tty disallow output characters") },
+    { STR("ed-tty-start-output"),    ED_TTY_START_OUTPUT,          
+      STR("Tty allow output characters") },
+    { STR("ed-newline"),             ED_NEWLINE,                   
+      STR("Execute command") },
+    { STR("ed-delete-prev-char"),    ED_DELETE_PREV_CHAR,          
+      STR("Delete the character to the left of the cursor") },
+    { STR("ed-clear-screen"),        ED_CLEAR_SCREEN,              
+      STR("Clear screen leaving current line at the top") },
+    { STR("ed-redisplay"),           ED_REDISPLAY,                 
+      STR("Redisplay everything") },
+    { STR("ed-start-over"),          ED_START_OVER,                
+      STR("Erase current line and start from scratch") },
+    { STR("ed-sequence-lead-in"),    ED_SEQUENCE_LEAD_IN,          
+      STR("First character in a bound sequence") },
+    { STR("ed-prev-history"),        ED_PREV_HISTORY,              
+      STR("Move to the previous history line") },
+    { STR("ed-next-history"),        ED_NEXT_HISTORY,              
+      STR("Move to the next history line") },
+    { STR("ed-search-prev-history"), ED_SEARCH_PREV_HISTORY,       
+      STR("Search previous in history for a line matching the current") },
+    { STR("ed-search-next-history"), ED_SEARCH_NEXT_HISTORY,       
+      STR("Search next in history for a line matching the current") },
+    { STR("ed-prev-line"),           ED_PREV_LINE,                 
+      STR("Move up one line") },
+    { STR("ed-next-line"),           ED_NEXT_LINE,                 
+      STR("Move down one line") },
+    { STR("ed-command"),             ED_COMMAND,                   
+      STR("Editline extended command") },
 };
 
 protected const el_bindings_t* help__get(){ return el_func_help; }
diff -pruN 5.1.58-1/cmd-line-utils/libedit/hist.c 5.1.61-2/cmd-line-utils/libedit/hist.c
--- 5.1.58-1/cmd-line-utils/libedit/hist.c	2011-07-01 15:22:21.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/hist.c	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: hist.c,v 1.15 2003/11/01 23:36:39 christos Exp $	*/
+/*	$NetBSD: hist.c,v 1.20 2011/07/29 15:16:33 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -55,12 +55,12 @@ hist_init(EditLine *el)
 
 	el->el_history.fun = NULL;
 	el->el_history.ref = NULL;
-	el->el_history.buf = (char *) el_malloc(EL_BUFSIZ);
+	el->el_history.buf = el_malloc(EL_BUFSIZ * sizeof(*el->el_history.buf));
 	el->el_history.sz  = EL_BUFSIZ;
 	if (el->el_history.buf == NULL)
-		return (-1);
+		return -1;
 	el->el_history.last = el->el_history.buf;
-	return (0);
+	return 0;
 }
 
 
@@ -71,7 +71,7 @@ protected void
 hist_end(EditLine *el)
 {
 
-	el_free((ptr_t) el->el_history.buf);
+	el_free(el->el_history.buf);
 	el->el_history.buf = NULL;
 }
 
@@ -80,12 +80,12 @@ hist_end(EditLine *el)
  *	Set new history interface
  */
 protected int
-hist_set(EditLine *el, hist_fun_t fun, ptr_t ptr)
+hist_set(EditLine *el, hist_fun_t fun, void *ptr)
 {
 
 	el->el_history.ref = ptr;
 	el->el_history.fun = fun;
-	return (0);
+	return 0;
 }
 
 
@@ -96,11 +96,11 @@ hist_set(EditLine *el, hist_fun_t fun, p
 protected el_action_t
 hist_get(EditLine *el)
 {
-	const char *hp;
+	const Char *hp;
 	int h;
 
 	if (el->el_history.eventno == 0) {	/* if really the current line */
-		(void) strncpy(el->el_line.buffer, el->el_history.buf,
+		(void) Strncpy(el->el_line.buffer, el->el_history.buf,
 		    el->el_history.sz);
 		el->el_line.lastchar = el->el_line.buffer +
 		    (el->el_history.last - el->el_history.buf);
@@ -112,24 +112,25 @@ hist_get(EditLine *el)
 #endif /* KSHVI */
 			el->el_line.cursor = el->el_line.lastchar;
 
-		return (CC_REFRESH);
+		return CC_REFRESH;
 	}
 	if (el->el_history.ref == NULL)
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	hp = HIST_FIRST(el);
 
 	if (hp == NULL)
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	for (h = 1; h < el->el_history.eventno; h++)
 		if ((hp = HIST_NEXT(el)) == NULL) {
 			el->el_history.eventno = h;
-			return (CC_ERROR);
+			return CC_ERROR;
 		}
-	(void) strlcpy(el->el_line.buffer, hp,
+	(void) Strncpy(el->el_line.buffer, hp,
 			(size_t)(el->el_line.limit - el->el_line.buffer));
-	el->el_line.lastchar = el->el_line.buffer + strlen(el->el_line.buffer);
+	el->el_line.buffer[el->el_line.limit - el->el_line.buffer - 1] = '\0';
+	el->el_line.lastchar = el->el_line.buffer + Strlen(el->el_line.buffer);
 
 	if (el->el_line.lastchar > el->el_line.buffer
 	    && el->el_line.lastchar[-1] == '\n')
@@ -144,7 +145,7 @@ hist_get(EditLine *el)
 #endif /* KSHVI */
 		el->el_line.cursor = el->el_line.lastchar;
 
-	return (CC_REFRESH);
+	return CC_REFRESH;
 }
 
 
@@ -152,34 +153,34 @@ hist_get(EditLine *el)
  *	process a history command
  */
 protected int
-hist_command(EditLine *el, int argc, const char **argv)
+hist_command(EditLine *el, int argc, const Char **argv)
 {
-	const char *str;
+	const Char *str;
 	int num;
-	HistEvent ev;
+	TYPE(HistEvent) ev;
 
 	if (el->el_history.ref == NULL)
-		return (-1);
+		return -1;
 
-	if (argc == 1 || strcmp(argv[1], "list") == 0) {
+	if (argc == 1 || Strcmp(argv[1], STR("list")) == 0) {
 		 /* List history entries */
 
 		for (str = HIST_LAST(el); str != NULL; str = HIST_PREV(el))
 			(void) fprintf(el->el_outfile, "%d %s",
-			    el->el_history.ev.num, str);
-		return (0);
+			    el->el_history.ev.num, ct_encode_string(str, &el->el_scratch));
+		return 0;
 	}
 
 	if (argc != 3)
-		return (-1);
+		return -1;
 
-	num = (int)strtol(argv[2], NULL, 0);
+	num = (int)Strtol(argv[2], NULL, 0);
 
-	if (strcmp(argv[1], "size") == 0)
-		return history(el->el_history.ref, &ev, H_SETSIZE, num);
+	if (Strcmp(argv[1], STR("size")) == 0)
+		return FUNW(history)(el->el_history.ref, &ev, H_SETSIZE, num);
 
-	if (strcmp(argv[1], "unique") == 0)
-		return history(el->el_history.ref, &ev, H_SETUNIQUE, num);
+	if (Strcmp(argv[1], STR("unique")) == 0)
+		return FUNW(history)(el->el_history.ref, &ev, H_SETUNIQUE, num);
 
 	return -1;
 }
@@ -192,13 +193,13 @@ protected int
 /*ARGSUSED*/
 hist_enlargebuf(EditLine *el, size_t oldsz, size_t newsz)
 {
-	char *newbuf;
+	Char *newbuf;
 
-	newbuf = realloc(el->el_history.buf, newsz);
+	newbuf = el_realloc(el->el_history.buf, newsz * sizeof(*newbuf));
 	if (!newbuf)
 		return 0;
 
-	(void) memset(&newbuf[oldsz], '\0', newsz - oldsz);
+	(void) memset(&newbuf[oldsz], '\0', (newsz - oldsz) * sizeof(*newbuf));
 
 	el->el_history.last = newbuf +
 				(el->el_history.last - el->el_history.buf);
@@ -207,3 +208,15 @@ hist_enlargebuf(EditLine *el, size_t old
 
 	return 1;
 }
+
+#ifdef WIDECHAR
+protected wchar_t *
+hist_convert(EditLine *el, int fn, void *arg)
+{
+	HistEventW ev;
+	if ((*(el)->el_history.fun)((el)->el_history.ref, &ev, fn, arg) == -1)
+		return NULL;
+	return ct_decode_string((const char *)(const void *)ev.str,
+	    &el->el_scratch);
+}
+#endif
diff -pruN 5.1.58-1/cmd-line-utils/libedit/histedit.h 5.1.61-2/cmd-line-utils/libedit/histedit.h
--- 5.1.58-1/cmd-line-utils/libedit/histedit.h	2011-07-01 15:22:21.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/histedit.h	2011-12-16 19:06:09.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: histedit.h,v 1.35 2009/02/05 19:15:44 christos Exp $	*/
+/*	$NetBSD: histedit.h,v 1.48 2011/07/28 20:50:55 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -43,6 +43,13 @@
 #define	LIBEDIT_MAJOR 2
 #define	LIBEDIT_MINOR 11
 
+/* XXXMYSQL : stdint.h might not be available on older Solaris platforms. */
+#if defined(__sun) || defined(__sun__)
+#include <sys/inttypes.h>
+#else
+#include <stdint.h>
+#endif
+
 #include <sys/types.h>
 #include <stdio.h>
 
@@ -114,29 +121,46 @@ unsigned char	_el_fn_complete(EditLine *
 
 /*
  * el_set/el_get parameters
- */
-#define	EL_PROMPT	0	/* , el_pfunc_t);		*/
-#define	EL_TERMINAL	1	/* , const char *);		*/
-#define	EL_EDITOR	2	/* , const char *);		*/
-#define	EL_SIGNAL	3	/* , int);			*/
-#define	EL_BIND		4	/* , const char *, ..., NULL);	*/
-#define	EL_TELLTC	5	/* , const char *, ..., NULL);	*/
-#define	EL_SETTC	6	/* , const char *, ..., NULL);	*/
-#define	EL_ECHOTC	7	/* , const char *, ..., NULL);	*/
-#define	EL_SETTY	8	/* , const char *, ..., NULL);	*/
-#define	EL_ADDFN	9	/* , const char *, const char *	*/
-				/* , el_func_t);		*/
-#define	EL_HIST		10	/* , hist_fun_t, const char *);	*/
-#define	EL_EDITMODE	11	/* , int);			*/
-#define	EL_RPROMPT	12	/* , el_pfunc_t);		*/
-#define	EL_GETCFN	13	/* , el_rfunc_t);		*/
-#define	EL_CLIENTDATA	14	/* , void *);			*/
-#define	EL_UNBUFFERED	15	/* , int);			*/
-#define	EL_PREP_TERM    16      /* , int);                      */
-#define	EL_GETTC	17	/* , const char *, ..., NULL);	*/
-#define	EL_GETFP	18	/* , int, FILE **);		*/
-#define	EL_SETFP	19	/* , int, FILE *);		*/
-#define EL_REFRESH	20	/* , void);			*/
+ *
+ * When using el_wset/el_wget (as opposed to el_set/el_get):
+ *   Char is wchar_t, otherwise it is char.
+ *   prompt_func is el_wpfunc_t, otherwise it is el_pfunc_t .
+
+ * Prompt function prototypes are:
+ *   typedef char    *(*el_pfunct_t)  (EditLine *);
+ *   typedef wchar_t *(*el_wpfunct_t) (EditLine *);
+ *
+ * For operations that support set or set/get, the argument types listed are for
+ * the "set" operation. For "get", each listed type must be a pointer.
+ * E.g. EL_EDITMODE takes an int when set, but an int* when get.
+ * 
+ * Operations that only support "get" have the correct argument types listed.
+ */
+#define	EL_PROMPT	0	/* , prompt_func);		      set/get */
+#define	EL_TERMINAL	1	/* , const char *);		      set/get */
+#define	EL_EDITOR	2	/* , const Char *);		      set/get */
+#define	EL_SIGNAL	3	/* , int);			      set/get */
+#define	EL_BIND		4	/* , const Char *, ..., NULL);	      set     */
+#define	EL_TELLTC	5	/* , const Char *, ..., NULL);	      set     */
+#define	EL_SETTC	6	/* , const Char *, ..., NULL);	      set     */
+#define	EL_ECHOTC	7	/* , const Char *, ..., NULL);        set     */
+#define	EL_SETTY	8	/* , const Char *, ..., NULL);        set     */
+#define	EL_ADDFN	9	/* , const Char *, const Char,        set     */
+				/*   el_func_t);		 	      */
+#define	EL_HIST		10	/* , hist_fun_t, const void *);	      set     */
+#define	EL_EDITMODE	11	/* , int);			      set/get */
+#define	EL_RPROMPT	12	/* , prompt_func);		      set/get */
+#define	EL_GETCFN	13	/* , el_rfunc_t);		      set/get */
+#define	EL_CLIENTDATA	14	/* , void *);			      set/get */
+#define	EL_UNBUFFERED	15	/* , int);			      set/get */
+#define	EL_PREP_TERM	16	/* , int);			      set     */
+#define	EL_GETTC	17	/* , const Char *, ..., NULL);		  get */
+#define	EL_GETFP	18	/* , int, FILE **);		          get */
+#define	EL_SETFP	19	/* , int, FILE *);		      set     */
+#define	EL_REFRESH	20	/* , void);			      set     */
+#define	EL_PROMPT_ESC	21	/* , prompt_func, Char);	      set/get */
+#define	EL_RPROMPT_ESC	22	/* , prompt_func, Char);	      set/get */
+#define	EL_RESIZE	23	/* , el_zfunc_t, void *);	      set     */
 
 #define	EL_BUILTIN_GETCFN	(NULL)
 
@@ -188,12 +212,12 @@ int		history(History *, HistEvent *, int
 #define	H_NEXT		 6	/* , void);		*/
 #define	H_CURR		 8	/* , const int);	*/
 #define	H_SET		 7	/* , int);		*/
-#define	H_ADD		 9	/* , const char *);	*/
-#define	H_ENTER		10	/* , const char *);	*/
-#define	H_APPEND	11	/* , const char *);	*/
+#define	H_ADD		 9	/* , const wchar_t *);	*/
+#define	H_ENTER		10	/* , const wchar_t *);	*/
+#define	H_APPEND	11	/* , const wchar_t *);	*/
 #define	H_END		12	/* , void);		*/
-#define	H_NEXT_STR	13	/* , const char *);	*/
-#define	H_PREV_STR	14	/* , const char *);	*/
+#define	H_NEXT_STR	13	/* , const wchar_t *);	*/
+#define	H_PREV_STR	14	/* , const wchar_t *);	*/
 #define	H_NEXT_EVENT	15	/* , const int);	*/
 #define	H_PREV_EVENT	16	/* , const int);	*/
 #define	H_LOAD		17	/* , const char *);	*/
@@ -202,6 +226,10 @@ int		history(History *, HistEvent *, int
 #define	H_SETUNIQUE	20	/* , int);		*/
 #define	H_GETUNIQUE	21	/* , void);		*/
 #define	H_DEL		22	/* , int);		*/
+#define	H_NEXT_EVDATA	23	/* , const int, histdata_t *);	*/
+#define	H_DELDATA	24	/* , int, histdata_t *);*/
+#define	H_REPLACE	25	/* , const char *, histdata_t);	*/
+
 
 
 /*
@@ -221,6 +249,65 @@ int		 tok_line(Tokenizer *, const LineIn
 int		 tok_str(Tokenizer *, const char *,
 		    int *, const char ***);
 
+/*
+ * Begin Wide Character Support
+ */
+
+/*
+ * Wide character versions
+ */
+
+/*
+ * ==== Editing ====
+ */
+typedef struct lineinfow {
+	const wchar_t	*buffer;
+	const wchar_t	*cursor;
+	const wchar_t	*lastchar;
+} LineInfoW;
+
+const wchar_t	*el_wgets(EditLine *, int *);
+int		 el_wgetc(EditLine *, wchar_t *);
+void		 el_wpush(EditLine *, const wchar_t *);
+
+int		 el_wparse(EditLine *, int, const wchar_t **);
+
+int		 el_wset(EditLine *, int, ...);
+int		 el_wget(EditLine *, int, ...);
+
+const LineInfoW	*el_wline(EditLine *);
+int		 el_winsertstr(EditLine *, const wchar_t *);
+#define          el_wdeletestr  el_deletestr
+
+/*
+ * ==== History ====
+ */
+typedef struct histeventW {
+	int		 num;
+	const wchar_t	*str;
+} HistEventW;
+
+typedef struct historyW HistoryW;
+
+HistoryW *	history_winit(void);
+void		history_wend(HistoryW *);
+
+int		history_w(HistoryW *, HistEventW *, int, ...);
+
+/*
+ * ==== Tokenization ====
+ */
+typedef struct tokenizerW TokenizerW;
+
+/* Wide character tokenizer support */
+TokenizerW	*tok_winit(const wchar_t *);
+void		 tok_wend(TokenizerW *);
+void		 tok_wreset(TokenizerW *);
+int		 tok_wline(TokenizerW *, const LineInfoW *,
+		    int *, const wchar_t ***, int *, int *);
+int		 tok_wstr(TokenizerW *, const wchar_t *,
+		    int *, const wchar_t ***);
+
 #ifdef __cplusplus
 }
 #endif
diff -pruN 5.1.58-1/cmd-line-utils/libedit/hist.h 5.1.61-2/cmd-line-utils/libedit/hist.h
--- 5.1.58-1/cmd-line-utils/libedit/hist.h	2011-07-01 15:22:21.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/hist.h	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: hist.h,v 1.10 2003/08/07 16:44:31 agc Exp $	*/
+/*	$NetBSD: hist.h,v 1.13 2011/07/28 20:50:55 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -42,21 +42,29 @@
 
 #include "histedit.h"
 
-typedef int (*hist_fun_t)(ptr_t, HistEvent *, int, ...);
+typedef int (*hist_fun_t)(void *, TYPE(HistEvent) *, int, ...);
 
 typedef struct el_history_t {
-	char		*buf;		/* The history buffer		*/
+	Char		*buf;		/* The history buffer		*/
 	size_t		sz;		/* Size of history buffer	*/
-	char		*last;		/* The last character		*/
+	Char		*last;		/* The last character		*/
 	int		 eventno;	/* Event we are looking for	*/
-	ptr_t		 ref;		/* Argument for history fcns	*/
+	void *		 ref;		/* Argument for history fcns	*/
 	hist_fun_t	 fun;		/* Event access			*/
-	HistEvent	 ev;		/* Event cookie			*/
+	TYPE(HistEvent)	 ev;		/* Event cookie			*/
 } el_history_t;
 
-#define	HIST_FUN(el, fn, arg)	\
+#define	HIST_FUN_INTERNAL(el, fn, arg)	\
     ((((*(el)->el_history.fun) ((el)->el_history.ref, &(el)->el_history.ev, \
 	fn, arg)) == -1) ? NULL : (el)->el_history.ev.str)
+#ifdef WIDECHAR
+#define HIST_FUN(el, fn, arg) \
+    (((el)->el_flags & NARROW_HISTORY) ? hist_convert(el, fn, arg) : \
+	HIST_FUN_INTERNAL(el, fn, arg))
+#else
+#define HIST_FUN(el, fn, arg) HIST_FUN_INTERNAL(el, fn, arg)
+#endif
+
 
 #define	HIST_NEXT(el)		HIST_FUN(el, H_NEXT, NULL)
 #define	HIST_FIRST(el)		HIST_FUN(el, H_FIRST, NULL)
@@ -69,8 +77,11 @@ typedef struct el_history_t {
 protected int		hist_init(EditLine *);
 protected void		hist_end(EditLine *);
 protected el_action_t	hist_get(EditLine *);
-protected int		hist_set(EditLine *, hist_fun_t, ptr_t);
-protected int		hist_command(EditLine *, int, const char **);
+protected int		hist_set(EditLine *, hist_fun_t, void *);
+protected int		hist_command(EditLine *, int, const Char **);
 protected int		hist_enlargebuf(EditLine *, size_t, size_t);
+#ifdef WIDECHAR
+protected wchar_t 	*hist_convert(EditLine *, int, void *);
+#endif
 
 #endif /* _h_el_hist */
diff -pruN 5.1.58-1/cmd-line-utils/libedit/history.c 5.1.61-2/cmd-line-utils/libedit/history.c
--- 5.1.58-1/cmd-line-utils/libedit/history.c	2011-07-01 15:22:21.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/history.c	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: history.c,v 1.33 2009/02/06 14:40:32 sketch Exp $	*/
+/*	$NetBSD: history.c,v 1.45 2011/07/29 23:44:44 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -41,7 +41,7 @@ static char sccsid[] = "@(#)history.c	8.
 #endif /* not lint && not SCCSID */
 
 /*
- * hist.c: History access functions
+ * hist.c: TYPE(History) access functions
  */
 #include <string.h>
 #include <stdlib.h>
@@ -56,14 +56,15 @@ static char sccsid[] = "@(#)history.c	8.
 static const char hist_cookie[] = "_HiStOrY_V2_\n";
 
 #include "histedit.h"
+#include "chartype.h"
 
-typedef int (*history_gfun_t)(ptr_t, HistEvent *);
-typedef int (*history_efun_t)(ptr_t, HistEvent *, const char *);
-typedef void (*history_vfun_t)(ptr_t, HistEvent *);
-typedef int (*history_sfun_t)(ptr_t, HistEvent *, const int);
+typedef int (*history_gfun_t)(void *, TYPE(HistEvent) *);
+typedef int (*history_efun_t)(void *, TYPE(HistEvent) *, const Char *);
+typedef void (*history_vfun_t)(void *, TYPE(HistEvent) *);
+typedef int (*history_sfun_t)(void *, TYPE(HistEvent) *, const int);
 
-struct history {
-	ptr_t h_ref;		/* Argument for history fcns	 */
+struct TYPE(history) {
+	void *h_ref;		/* Argument for history fcns	 */
 	int h_ent;		/* Last entry point for history	 */
 	history_gfun_t h_first;	/* Get the first element	 */
 	history_gfun_t h_next;	/* Get the next element		 */
@@ -88,29 +89,29 @@ struct history {
 #define	HADD(h, ev, str)	(*(h)->h_add)((h)->h_ref, ev, str)
 #define	HDEL(h, ev, n)		(*(h)->h_del)((h)->h_ref, ev, n)
 
-#define	h_strdup(a)	strdup(a)
+#define	h_strdup(a)	Strdup(a)
 #define	h_malloc(a)	malloc(a)
 #define	h_realloc(a, b)	realloc((a), (b))
 #define	h_free(a)	free(a)
 
 typedef struct {
     int		num;
-    char	*str;
+    Char	*str;
 } HistEventPrivate;
 
 
 
-private int history_setsize(History *, HistEvent *, int);
-private int history_getsize(History *, HistEvent *);
-private int history_setunique(History *, HistEvent *, int);
-private int history_getunique(History *, HistEvent *);
-private int history_set_fun(History *, History *);
-private int history_load(History *, const char *);
-private int history_save(History *, const char *);
-private int history_prev_event(History *, HistEvent *, int);
-private int history_next_event(History *, HistEvent *, int);
-private int history_next_string(History *, HistEvent *, const char *);
-private int history_prev_string(History *, HistEvent *, const char *);
+private int history_setsize(TYPE(History) *, TYPE(HistEvent) *, int);
+private int history_getsize(TYPE(History) *, TYPE(HistEvent) *);
+private int history_setunique(TYPE(History) *, TYPE(HistEvent) *, int);
+private int history_getunique(TYPE(History) *, TYPE(HistEvent) *);
+private int history_set_fun(TYPE(History) *, TYPE(History) *);
+private int history_load(TYPE(History) *, const char *);
+private int history_save(TYPE(History) *, const char *);
+private int history_prev_event(TYPE(History) *, TYPE(HistEvent) *, int);
+private int history_next_event(TYPE(History) *, TYPE(HistEvent) *, int);
+private int history_next_string(TYPE(History) *, TYPE(HistEvent) *, const Char *);
+private int history_prev_string(TYPE(History) *, TYPE(HistEvent) *, const Char *);
 
 
 /***********************************************************************/
@@ -119,7 +120,8 @@ private int history_prev_string(History 
  * Builtin- history implementation
  */
 typedef struct hentry_t {
-	HistEvent ev;		/* What we return		 */
+	TYPE(HistEvent) ev;		/* What we return		 */
+	void *data;		/* data				 */
 	struct hentry_t *next;	/* Next entry			 */
 	struct hentry_t *prev;	/* Previous entry		 */
 } hentry_t;
@@ -130,24 +132,27 @@ typedef struct history_t {
 	int max;		/* Maximum number of events	*/
 	int cur;		/* Current number of events	*/
 	int eventid;		/* For generation of unique event id	 */
-	int flags;		/* History flags		*/
+	int flags;		/* TYPE(History) flags		*/
 #define H_UNIQUE	1	/* Store only unique elements	*/
 } history_t;
 
-private int history_def_next(ptr_t, HistEvent *);
-private int history_def_first(ptr_t, HistEvent *);
-private int history_def_prev(ptr_t, HistEvent *);
-private int history_def_last(ptr_t, HistEvent *);
-private int history_def_curr(ptr_t, HistEvent *);
-private int history_def_set(ptr_t, HistEvent *, const int);
-private void history_def_clear(ptr_t, HistEvent *);
-private int history_def_enter(ptr_t, HistEvent *, const char *);
-private int history_def_add(ptr_t, HistEvent *, const char *);
-private int history_def_del(ptr_t, HistEvent *, const int);
-
-private int history_def_init(ptr_t *, HistEvent *, int);
-private int history_def_insert(history_t *, HistEvent *, const char *);
-private void history_def_delete(history_t *, HistEvent *, hentry_t *);
+private int history_def_next(void *, TYPE(HistEvent) *);
+private int history_def_first(void *, TYPE(HistEvent) *);
+private int history_def_prev(void *, TYPE(HistEvent) *);
+private int history_def_last(void *, TYPE(HistEvent) *);
+private int history_def_curr(void *, TYPE(HistEvent) *);
+private int history_def_set(void *, TYPE(HistEvent) *, const int);
+private void history_def_clear(void *, TYPE(HistEvent) *);
+private int history_def_enter(void *, TYPE(HistEvent) *, const Char *);
+private int history_def_add(void *, TYPE(HistEvent) *, const Char *);
+private int history_def_del(void *, TYPE(HistEvent) *, const int);
+
+private int history_def_init(void **, TYPE(HistEvent) *, int);
+private int history_def_insert(history_t *, TYPE(HistEvent) *, const Char *);
+private void history_def_delete(history_t *, TYPE(HistEvent) *, hentry_t *);
+
+private int history_deldata_nth(history_t *, TYPE(HistEvent) *, int, void **);
+private int history_set_nth(void *, TYPE(HistEvent) *, int);
 
 #define	history_def_setsize(p, num)(void) (((history_t *)p)->max = (num))
 #define	history_def_getsize(p)  (((history_t *)p)->cur)
@@ -165,23 +170,23 @@ private void history_def_delete(history_
 				}
 
 /* error messages */
-static const char *const he_errlist[] = {
-	"OK",
-	"unknown error",
-	"malloc() failed",
-	"first event not found",
-	"last event not found",
-	"empty list",
-	"no next event",
-	"no previous event",
-	"current event is invalid",
-	"event not found",
-	"can't read history from file",
-	"can't write history",
-	"required parameter(s) not supplied",
-	"history size negative",
-	"function not allowed with other history-functions-set the default",
-	"bad parameters"
+static const Char *const he_errlist[] = {
+	STR("OK"),
+	STR("unknown error"),
+	STR("malloc() failed"),
+	STR("first event not found"),
+	STR("last event not found"),
+	STR("empty list"),
+	STR("no next event"),
+	STR("no previous event"),
+	STR("current event is invalid"),
+	STR("event not found"),
+	STR("can't read history from file"),
+	STR("can't write history"),
+	STR("required parameter(s) not supplied"),
+	STR("history size negative"),
+	STR("function not allowed with other history-functions-set the default"),
+	STR("bad parameters")
 };
 /* error codes */
 #define	_HE_OK                   0
@@ -205,7 +210,7 @@ static const char *const he_errlist[] = 
  *	Default function to return the first event in the history.
  */
 private int
-history_def_first(ptr_t p, HistEvent *ev)
+history_def_first(void *p, TYPE(HistEvent) *ev)
 {
 	history_t *h = (history_t *) p;
 
@@ -214,10 +219,10 @@ history_def_first(ptr_t p, HistEvent *ev
 		*ev = h->cursor->ev;
 	else {
 		he_seterrev(ev, _HE_FIRST_NOTFOUND);
-		return (-1);
+		return -1;
 	}
 
-	return (0);
+	return 0;
 }
 
 
@@ -225,7 +230,7 @@ history_def_first(ptr_t p, HistEvent *ev
  *	Default function to return the last event in the history.
  */
 private int
-history_def_last(ptr_t p, HistEvent *ev)
+history_def_last(void *p, TYPE(HistEvent) *ev)
 {
 	history_t *h = (history_t *) p;
 
@@ -234,10 +239,10 @@ history_def_last(ptr_t p, HistEvent *ev)
 		*ev = h->cursor->ev;
 	else {
 		he_seterrev(ev, _HE_LAST_NOTFOUND);
-		return (-1);
+		return -1;
 	}
 
-	return (0);
+	return 0;
 }
 
 
@@ -245,24 +250,24 @@ history_def_last(ptr_t p, HistEvent *ev)
  *	Default function to return the next event in the history.
  */
 private int
-history_def_next(ptr_t p, HistEvent *ev)
+history_def_next(void *p, TYPE(HistEvent) *ev)
 {
 	history_t *h = (history_t *) p;
 
 	if (h->cursor == &h->list) {
 		he_seterrev(ev, _HE_EMPTY_LIST);
-		return (-1);
+		return -1;
 	}
 
 	if (h->cursor->next == &h->list) {
 		he_seterrev(ev, _HE_END_REACHED);
-		return (-1);
+		return -1;
 	}
 
         h->cursor = h->cursor->next;
         *ev = h->cursor->ev;
 
-	return (0);
+	return 0;
 }
 
 
@@ -270,25 +275,25 @@ history_def_next(ptr_t p, HistEvent *ev)
  *	Default function to return the previous event in the history.
  */
 private int
-history_def_prev(ptr_t p, HistEvent *ev)
+history_def_prev(void *p, TYPE(HistEvent) *ev)
 {
 	history_t *h = (history_t *) p;
 
 	if (h->cursor == &h->list) {
 		he_seterrev(ev,
 		    (h->cur > 0) ? _HE_END_REACHED : _HE_EMPTY_LIST);
-		return (-1);
+		return -1;
 	}
 
 	if (h->cursor->prev == &h->list) {
 		he_seterrev(ev, _HE_START_REACHED);
-		return (-1);
+		return -1;
 	}
 
         h->cursor = h->cursor->prev;
         *ev = h->cursor->ev;
 
-	return (0);
+	return 0;
 }
 
 
@@ -296,7 +301,7 @@ history_def_prev(ptr_t p, HistEvent *ev)
  *	Default function to return the current event in the history.
  */
 private int
-history_def_curr(ptr_t p, HistEvent *ev)
+history_def_curr(void *p, TYPE(HistEvent) *ev)
 {
 	history_t *h = (history_t *) p;
 
@@ -305,10 +310,10 @@ history_def_curr(ptr_t p, HistEvent *ev)
 	else {
 		he_seterrev(ev,
 		    (h->cur > 0) ? _HE_CURR_INVALID : _HE_EMPTY_LIST);
-		return (-1);
+		return -1;
 	}
 
-	return (0);
+	return 0;
 }
 
 
@@ -317,13 +322,13 @@ history_def_curr(ptr_t p, HistEvent *ev)
  *	given one.
  */
 private int
-history_def_set(ptr_t p, HistEvent *ev, const int n)
+history_def_set(void *p, TYPE(HistEvent) *ev, const int n)
 {
 	history_t *h = (history_t *) p;
 
 	if (h->cur == 0) {
 		he_seterrev(ev, _HE_EMPTY_LIST);
-		return (-1);
+		return -1;
 	}
 	if (h->cursor == &h->list || h->cursor->ev.num != n) {
 		for (h->cursor = h->list.next; h->cursor != &h->list;
@@ -333,9 +338,34 @@ history_def_set(ptr_t p, HistEvent *ev, 
 	}
 	if (h->cursor == &h->list) {
 		he_seterrev(ev, _HE_NOT_FOUND);
-		return (-1);
+		return -1;
 	}
-	return (0);
+	return 0;
+}
+
+
+/* history_set_nth():
+ *	Default function to set the current event in the history to the
+ *	n-th one.
+ */
+private int
+history_set_nth(void *p, TYPE(HistEvent) *ev, int n)
+{
+	history_t *h = (history_t *) p;
+
+	if (h->cur == 0) {
+		he_seterrev(ev, _HE_EMPTY_LIST);
+		return -1;
+	}
+	for (h->cursor = h->list.prev; h->cursor != &h->list;
+	    h->cursor = h->cursor->prev)
+		if (n-- <= 0)
+			break;
+	if (h->cursor == &h->list) {
+		he_seterrev(ev, _HE_NOT_FOUND);
+		return -1;
+	}
+	return 0;
 }
 
 
@@ -343,27 +373,46 @@ history_def_set(ptr_t p, HistEvent *ev, 
  *	Append string to element
  */
 private int
-history_def_add(ptr_t p, HistEvent *ev, const char *str)
+history_def_add(void *p, TYPE(HistEvent) *ev, const Char *str)
 {
 	history_t *h = (history_t *) p;
 	size_t len;
-	char *s;
+	Char *s;
 	HistEventPrivate *evp = (void *)&h->cursor->ev;
 
 	if (h->cursor == &h->list)
-		return (history_def_enter(p, ev, str));
-	len = strlen(evp->str) + strlen(str) + 1;
-	s = (char *) h_malloc(len);
+		return history_def_enter(p, ev, str);
+	len = Strlen(evp->str) + Strlen(str) + 1;
+	s = h_malloc(len * sizeof(*s));
 	if (s == NULL) {
 		he_seterrev(ev, _HE_MALLOC_FAILED);
-		return (-1);
+		return -1;
 	}
-	(void) strlcpy(s, h->cursor->ev.str, len);
-	(void) strlcat(s, str, len);
-	h_free((ptr_t)evp->str);
+	(void) Strncpy(s, h->cursor->ev.str, len);
+        s[len - 1] = '\0';
+	(void) Strncat(s, str, len - Strlen(s) - 1);
+	h_free(evp->str);
 	evp->str = s;
 	*ev = h->cursor->ev;
-	return (0);
+	return 0;
+}
+
+
+private int
+history_deldata_nth(history_t *h, TYPE(HistEvent) *ev,
+    int num, void **data)
+{
+	if (history_set_nth(h, ev, num) != 0)
+		return -1;
+	/* magic value to skip delete (just set to n-th history) */
+	if (data == (void **)-1)
+		return 0;
+	ev->str = Strdup(h->cursor->ev.str);
+	ev->num = h->cursor->ev.num;
+	if (data)
+		*data = h->cursor->data;
+	history_def_delete(h, ev, h->cursor);
+	return 0;
 }
 
 
@@ -372,16 +421,16 @@ history_def_add(ptr_t p, HistEvent *ev, 
  */
 /* ARGSUSED */
 private int
-history_def_del(ptr_t p, HistEvent *ev __attribute__((__unused__)),
+history_def_del(void *p, TYPE(HistEvent) *ev __attribute__((__unused__)),
     const int num)
 {
 	history_t *h = (history_t *) p;
 	if (history_def_set(h, ev, num) != 0)
-		return (-1);
-	ev->str = strdup(h->cursor->ev.str);
+		return -1;
+	ev->str = Strdup(h->cursor->ev.str);
 	ev->num = h->cursor->ev.num;
 	history_def_delete(h, ev, h->cursor);
-	return (0);
+	return 0;
 }
 
 
@@ -391,16 +440,19 @@ history_def_del(ptr_t p, HistEvent *ev _
 /* ARGSUSED */
 private void
 history_def_delete(history_t *h, 
-		   HistEvent *ev __attribute__((__unused__)), hentry_t *hp)
+		   TYPE(HistEvent) *ev __attribute__((__unused__)), hentry_t *hp)
 {
 	HistEventPrivate *evp = (void *)&hp->ev;
 	if (hp == &h->list)
 		abort();
-	if (h->cursor == hp)
+	if (h->cursor == hp) {
 		h->cursor = hp->prev;
+		if (h->cursor == &h->list)
+			h->cursor = hp->next;
+	}
 	hp->prev->next = hp->next;
 	hp->next->prev = hp->prev;
-	h_free((ptr_t) evp->str);
+	h_free(evp->str);
 	h_free(hp);
 	h->cur--;
 }
@@ -410,28 +462,31 @@ history_def_delete(history_t *h, 
  *	Insert element with string str in the h list
  */
 private int
-history_def_insert(history_t *h, HistEvent *ev, const char *str)
+history_def_insert(history_t *h, TYPE(HistEvent) *ev, const Char *str)
 {
+	hentry_t *c;
 
-	h->cursor = (hentry_t *) h_malloc(sizeof(hentry_t));
-	if (h->cursor == NULL)
+	c = h_malloc(sizeof(*c));
+	if (c == NULL)
 		goto oomem;
-	if ((h->cursor->ev.str = h_strdup(str)) == NULL) {
-		h_free((ptr_t)h->cursor);
+	if ((c->ev.str = h_strdup(str)) == NULL) {
+		h_free(c);
 		goto oomem;
 	}
-	h->cursor->ev.num = ++h->eventid;
-	h->cursor->next = h->list.next;
-	h->cursor->prev = &h->list;
-	h->list.next->prev = h->cursor;
-	h->list.next = h->cursor;
+	c->data = NULL;
+	c->ev.num = ++h->eventid;
+	c->next = h->list.next;
+	c->prev = &h->list;
+	h->list.next->prev = c;
+	h->list.next = c;
 	h->cur++;
+	h->cursor = c;
 
-	*ev = h->cursor->ev;
-	return (0);
+	*ev = c->ev;
+	return 0;
 oomem:
 	he_seterrev(ev, _HE_MALLOC_FAILED);
-	return (-1);
+	return -1;
 }
 
 
@@ -439,16 +494,16 @@ oomem:
  *	Default function to enter an item in the history
  */
 private int
-history_def_enter(ptr_t p, HistEvent *ev, const char *str)
+history_def_enter(void *p, TYPE(HistEvent) *ev, const Char *str)
 {
 	history_t *h = (history_t *) p;
 
 	if ((h->flags & H_UNIQUE) != 0 && h->list.next != &h->list &&
-	    strcmp(h->list.next->ev.str, str) == 0)
-	    return (0); 
+	    Strcmp(h->list.next->ev.str, str) == 0)
+	    return 0;
 
 	if (history_def_insert(h, ev, str) == -1)
-		return (-1);	/* error, keep error message */
+		return -1;	/* error, keep error message */
 
 	/*
          * Always keep at least one entry.
@@ -457,7 +512,7 @@ history_def_enter(ptr_t p, HistEvent *ev
 	while (h->cur > h->max && h->cur > 0)
 		history_def_delete(h, ev, h->list.prev);
 
-	return (1);
+	return 1;
 }
 
 
@@ -466,9 +521,9 @@ history_def_enter(ptr_t p, HistEvent *ev
  */
 /* ARGSUSED */
 private int
-history_def_init(ptr_t *p, HistEvent *ev __attribute__((__unused__)), int n)
+history_def_init(void **p, TYPE(HistEvent) *ev __attribute__((__unused__)), int n)
 {
-	history_t *h = (history_t *) h_malloc(sizeof(history_t));
+	history_t *h = (history_t *) h_malloc(sizeof(*h));
 	if (h == NULL)
 		return -1;
 
@@ -482,7 +537,7 @@ history_def_init(ptr_t *p, HistEvent *ev
 	h->list.ev.num = 0;
 	h->cursor = &h->list;
 	h->flags = 0;
-	*p = (ptr_t) h;
+	*p = h;
 	return 0;
 }
 
@@ -491,12 +546,13 @@ history_def_init(ptr_t *p, HistEvent *ev
  *	Default history cleanup function
  */
 private void
-history_def_clear(ptr_t p, HistEvent *ev)
+history_def_clear(void *p, TYPE(HistEvent) *ev)
 {
 	history_t *h = (history_t *) p;
 
 	while (h->list.prev != &h->list)
 		history_def_delete(h, ev, h->list.prev);
+	h->cursor = &h->list;
 	h->eventid = 0;
 	h->cur = 0;
 }
@@ -509,16 +565,16 @@ history_def_clear(ptr_t p, HistEvent *ev
 /* history_init():
  *	Initialization function.
  */
-public History *
-history_init(void)
+public TYPE(History) *
+FUN(history,init)(void)
 {
-	HistEvent ev;
-	History *h = (History *) h_malloc(sizeof(History));
+	TYPE(HistEvent) ev;
+	TYPE(History) *h = (TYPE(History) *) h_malloc(sizeof(*h));
 	if (h == NULL)
 		return NULL;
 
 	if (history_def_init(&h->h_ref, &ev, 0) == -1) {
-		h_free((ptr_t)h);
+		h_free(h);
 		return NULL;
 	}
 	h->h_ent = -1;
@@ -533,7 +589,7 @@ history_init(void)
 	h->h_add = history_def_add;
 	h->h_del = history_def_del;
 
-	return (h);
+	return h;
 }
 
 
@@ -541,9 +597,9 @@ history_init(void)
  *	clean up history;
  */
 public void
-history_end(History *h)
+FUN(history,end)(TYPE(History) *h)
 {
-	HistEvent ev;
+	TYPE(HistEvent) ev;
 
 	if (h->h_next == history_def_next)
 		history_def_clear(h->h_ref, &ev);
@@ -557,19 +613,19 @@ history_end(History *h)
  *	Set history number of events
  */
 private int
-history_setsize(History *h, HistEvent *ev, int num)
+history_setsize(TYPE(History) *h, TYPE(HistEvent) *ev, int num)
 {
 
 	if (h->h_next != history_def_next) {
 		he_seterrev(ev, _HE_NOT_ALLOWED);
-		return (-1);
+		return -1;
 	}
 	if (num < 0) {
 		he_seterrev(ev, _HE_BAD_PARAM);
-		return (-1);
+		return -1;
 	}
 	history_def_setsize(h->h_ref, num);
-	return (0);
+	return 0;
 }
 
 
@@ -577,18 +633,18 @@ history_setsize(History *h, HistEvent *e
  *      Get number of events currently in history
  */
 private int
-history_getsize(History *h, HistEvent *ev)
+history_getsize(TYPE(History) *h, TYPE(HistEvent) *ev)
 {
 	if (h->h_next != history_def_next) {
 		he_seterrev(ev, _HE_NOT_ALLOWED);
-		return (-1);
+		return -1;
 	}
 	ev->num = history_def_getsize(h->h_ref);
 	if (ev->num < -1) {
 		he_seterrev(ev, _HE_SIZE_NEGATIVE);
-		return (-1);
+		return -1;
 	}
-	return (0);
+	return 0;
 }
 
 
@@ -596,15 +652,15 @@ history_getsize(History *h, HistEvent *e
  *	Set if adjacent equal events should not be entered in history.
  */
 private int
-history_setunique(History *h, HistEvent *ev, int uni)
+history_setunique(TYPE(History) *h, TYPE(HistEvent) *ev, int uni)
 {
 
 	if (h->h_next != history_def_next) {
 		he_seterrev(ev, _HE_NOT_ALLOWED);
-		return (-1);
+		return -1;
 	}
 	history_def_setunique(h->h_ref, uni);
-	return (0);
+	return 0;
 }
 
 
@@ -612,14 +668,14 @@ history_setunique(History *h, HistEvent 
  *	Get if adjacent equal events should not be entered in history.
  */
 private int
-history_getunique(History *h, HistEvent *ev)
+history_getunique(TYPE(History) *h, TYPE(HistEvent) *ev)
 {
 	if (h->h_next != history_def_next) {
 		he_seterrev(ev, _HE_NOT_ALLOWED);
-		return (-1);
+		return -1;
 	}
 	ev->num = history_def_getunique(h->h_ref);
-	return (0);
+	return 0;
 }
 
 
@@ -627,9 +683,9 @@ history_getunique(History *h, HistEvent 
  *	Set history functions
  */
 private int
-history_set_fun(History *h, History *nh)
+history_set_fun(TYPE(History) *h, TYPE(History) *nh)
 {
-	HistEvent ev;
+	TYPE(HistEvent) ev;
 
 	if (nh->h_first == NULL || nh->h_next == NULL || nh->h_last == NULL ||
 	    nh->h_prev == NULL || nh->h_curr == NULL || nh->h_set == NULL ||
@@ -648,7 +704,7 @@ history_set_fun(History *h, History *nh)
 			h->h_add = history_def_add;
 			h->h_del = history_def_del;
 		}
-		return (-1);
+		return -1;
 	}
 	if (h->h_next == history_def_next)
 		history_def_clear(h->h_ref, &ev);
@@ -665,25 +721,28 @@ history_set_fun(History *h, History *nh)
 	h->h_add = nh->h_add;
 	h->h_del = nh->h_del;
 
-	return (0);
+	return 0;
 }
 
 
 /* history_load():
- *	History load function
+ *	TYPE(History) load function
  */
 private int
-history_load(History *h, const char *fname)
+history_load(TYPE(History) *h, const char *fname)
 {
 	FILE *fp;
 	char *line;
 	size_t sz, max_size;
 	char *ptr;
 	int i = -1;
-	HistEvent ev;
+	TYPE(HistEvent) ev;
+#ifdef WIDECHAR
+	static ct_buffer_t conv;
+#endif
 
 	if ((fp = fopen(fname, "r")) == NULL)
-		return (i);
+		return i;
 
 	if ((line = fgetln(fp, &sz)) == NULL)
 		goto done;
@@ -691,7 +750,7 @@ history_load(History *h, const char *fna
 	if (strncmp(line, hist_cookie, sz) != 0)
 		goto done;
 
-	ptr = h_malloc(max_size = 1024);
+	ptr = h_malloc((max_size = 1024) * sizeof(*ptr));
 	if (ptr == NULL)
 		goto done;
 	for (i = 0; (line = fgetln(fp, &sz)) != NULL; i++) {
@@ -704,8 +763,8 @@ history_load(History *h, const char *fna
 
 		if (max_size < sz) {
 			char *nptr;
-			max_size = (sz + 1024) & ~1023;
-			nptr = h_realloc(ptr, max_size);
+			max_size = (sz + 1024) & (size_t)~1023;
+			nptr = h_realloc(ptr, max_size * sizeof(*ptr));
 			if (nptr == NULL) {
 				i = -1;
 				goto oomem;
@@ -714,63 +773,68 @@ history_load(History *h, const char *fna
 		}
 		(void) strunvis(ptr, line);
 		line[sz] = c;
-		if (HENTER(h, &ev, ptr) == -1) {
+		if (HENTER(h, &ev, ct_decode_string(ptr, &conv)) == -1) {
 			i = -1;
 			goto oomem;
 		}
 	}
 oomem:
-	h_free((ptr_t)ptr);
+	h_free(ptr);
 done:
 	(void) fclose(fp);
-	return (i);
+	return i;
 }
 
 
 /* history_save():
- *	History save function
+ *	TYPE(History) save function
  */
 private int
-history_save(History *h, const char *fname)
+history_save(TYPE(History) *h, const char *fname)
 {
 	FILE *fp;
-	HistEvent ev;
+	TYPE(HistEvent) ev;
 	int i = -1, retval;
 	size_t len, max_size;
 	char *ptr;
+	const char *str;
+#ifdef WIDECHAR
+	static ct_buffer_t conv;
+#endif
 
 	if ((fp = fopen(fname, "w")) == NULL)
-		return (-1);
+		return -1;
 
 	if (fchmod(fileno(fp), S_IRUSR|S_IWUSR) == -1)
 		goto done;
 	if (fputs(hist_cookie, fp) == EOF)
 		goto done;
-	ptr = h_malloc(max_size = 1024);
+	ptr = h_malloc((max_size = 1024) * sizeof(*ptr));
 	if (ptr == NULL)
 		goto done;
 	for (i = 0, retval = HLAST(h, &ev);
 	    retval != -1;
 	    retval = HPREV(h, &ev), i++) {
-		len = strlen(ev.str) * 4;
+		str = ct_encode_string(ev.str, &conv);
+		len = strlen(str) * 4;
 		if (len >= max_size) {
 			char *nptr;
-			max_size = (len + 1024) & ~1023;
-			nptr = h_realloc(ptr, max_size);
+			max_size = (len + 1024) & (size_t)~1023;
+			nptr = h_realloc(ptr, max_size * sizeof(*ptr));
 			if (nptr == NULL) {
 				i = -1;
 				goto oomem;
 			}
 			ptr = nptr;
 		}
-		(void) strvis(ptr, ev.str, VIS_WHITE);
+		(void) strvis(ptr, str, VIS_WHITE);
 		(void) fprintf(fp, "%s\n", ptr);
 	}
 oomem:
-	h_free((ptr_t)ptr);
+	h_free(ptr);
 done:
 	(void) fclose(fp);
-	return (i);
+	return i;
 }
 
 
@@ -778,16 +842,33 @@ done:
  *	Find the previous event, with number given
  */
 private int
-history_prev_event(History *h, HistEvent *ev, int num)
+history_prev_event(TYPE(History) *h, TYPE(HistEvent) *ev, int num)
 {
 	int retval;
 
 	for (retval = HCURR(h, ev); retval != -1; retval = HPREV(h, ev))
 		if (ev->num == num)
-			return (0);
+			return 0;
+
+	he_seterrev(ev, _HE_NOT_FOUND);
+	return -1;
+}
+
+
+private int
+history_next_evdata(TYPE(History) *h, TYPE(HistEvent) *ev, int num, void **d)
+{
+	int retval;
+
+	for (retval = HCURR(h, ev); retval != -1; retval = HPREV(h, ev))
+		if (ev->num == num) {
+			if (d)
+				*d = ((history_t *)h->h_ref)->cursor->data;
+			return 0;
+		}
 
 	he_seterrev(ev, _HE_NOT_FOUND);
-	return (-1);
+	return -1;
 }
 
 
@@ -795,16 +876,16 @@ history_prev_event(History *h, HistEvent
  *	Find the next event, with number given
  */
 private int
-history_next_event(History *h, HistEvent *ev, int num)
+history_next_event(TYPE(History) *h, TYPE(HistEvent) *ev, int num)
 {
 	int retval;
 
 	for (retval = HCURR(h, ev); retval != -1; retval = HNEXT(h, ev))
 		if (ev->num == num)
-			return (0);
+			return 0;
 
 	he_seterrev(ev, _HE_NOT_FOUND);
-	return (-1);
+	return -1;
 }
 
 
@@ -812,17 +893,17 @@ history_next_event(History *h, HistEvent
  *	Find the previous event beginning with string
  */
 private int
-history_prev_string(History *h, HistEvent *ev, const char *str)
+history_prev_string(TYPE(History) *h, TYPE(HistEvent) *ev, const Char *str)
 {
-	size_t len = strlen(str);
+	size_t len = Strlen(str);
 	int retval;
 
 	for (retval = HCURR(h, ev); retval != -1; retval = HNEXT(h, ev))
-		if (strncmp(str, ev->str, len) == 0)
-			return (0);
+		if (Strncmp(str, ev->str, len) == 0)
+			return 0;
 
 	he_seterrev(ev, _HE_NOT_FOUND);
-	return (-1);
+	return -1;
 }
 
 
@@ -830,17 +911,17 @@ history_prev_string(History *h, HistEven
  *	Find the next event beginning with string
  */
 private int
-history_next_string(History *h, HistEvent *ev, const char *str)
+history_next_string(TYPE(History) *h, TYPE(HistEvent) *ev, const Char *str)
 {
-	size_t len = strlen(str);
+	size_t len = Strlen(str);
 	int retval;
 
 	for (retval = HCURR(h, ev); retval != -1; retval = HPREV(h, ev))
-		if (strncmp(str, ev->str, len) == 0)
-			return (0);
+		if (Strncmp(str, ev->str, len) == 0)
+			return 0;
 
 	he_seterrev(ev, _HE_NOT_FOUND);
-	return (-1);
+	return -1;
 }
 
 
@@ -848,10 +929,10 @@ history_next_string(History *h, HistEven
  *	User interface to history functions.
  */
 int
-history(History *h, HistEvent *ev, int fun, ...)
+FUNW(history)(TYPE(History) *h, TYPE(HistEvent) *ev, int fun, ...)
 {
 	va_list va;
-	const char *str;
+	const Char *str;
 	int retval;
 
 	va_start(va, fun);
@@ -876,7 +957,7 @@ history(History *h, HistEvent *ev, int f
 		break;
 
 	case H_ADD:
-		str = va_arg(va, const char *);
+		str = va_arg(va, const Char *);
 		retval = HADD(h, ev, str);
 		break;
 
@@ -885,13 +966,13 @@ history(History *h, HistEvent *ev, int f
 		break;
 
 	case H_ENTER:
-		str = va_arg(va, const char *);
+		str = va_arg(va, const Char *);
 		if ((retval = HENTER(h, ev, str)) != -1)
 			h->h_ent = ev->num;
 		break;
 
 	case H_APPEND:
-		str = va_arg(va, const char *);
+		str = va_arg(va, const Char *);
 		if ((retval = HSET(h, ev, h->h_ent)) != -1)
 			retval = HADD(h, ev, str);
 		break;
@@ -946,18 +1027,18 @@ history(History *h, HistEvent *ev, int f
 		break;
 
 	case H_PREV_STR:
-		retval = history_prev_string(h, ev, va_arg(va, const char *));
+		retval = history_prev_string(h, ev, va_arg(va, const Char *));
 		break;
 
 	case H_NEXT_STR:
-		retval = history_next_string(h, ev, va_arg(va, const char *));
+		retval = history_next_string(h, ev, va_arg(va, const Char *));
 		break;
 
 	case H_FUNC:
 	{
-		History hf;
+		TYPE(History) hf;
 
-		hf.h_ref = va_arg(va, ptr_t);
+		hf.h_ref = va_arg(va, void *);
 		h->h_ent = -1;
 		hf.h_first = va_arg(va, history_gfun_t);
 		hf.h_next = va_arg(va, history_gfun_t);
@@ -976,15 +1057,46 @@ history(History *h, HistEvent *ev, int f
 	}
 
 	case H_END:
-		history_end(h);
+		FUN(history,end)(h);
 		retval = 0;
 		break;
 
+	case H_NEXT_EVDATA:
+	{
+		int num = va_arg(va, int);
+		void **d = va_arg(va, void **);
+		retval = history_next_evdata(h, ev, num, d);
+		break;
+	}
+
+	case H_DELDATA:
+	{
+		int num = va_arg(va, int);
+		void **d = va_arg(va, void **);
+		retval = history_deldata_nth((history_t *)h->h_ref, ev, num, d);
+		break;
+	}
+
+	case H_REPLACE: /* only use after H_NEXT_EVDATA */
+	{
+		const Char *line = va_arg(va, const Char *);
+		void *d = va_arg(va, void *);
+		const Char *s;
+		if(!line || !(s = Strdup(line))) {
+			retval = -1;
+			break;
+		}
+		((history_t *)h->h_ref)->cursor->ev.str = s;
+		((history_t *)h->h_ref)->cursor->data = d;
+		retval = 0;
+		break;
+	}
+
 	default:
 		retval = -1;
 		he_seterrev(ev, _HE_UNKNOWN);
 		break;
 	}
 	va_end(va);
-	return (retval);
+	return retval;
 }
diff -pruN 5.1.58-1/cmd-line-utils/libedit/historyn.c 5.1.61-2/cmd-line-utils/libedit/historyn.c
--- 5.1.58-1/cmd-line-utils/libedit/historyn.c	1970-01-01 00:00:00.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/historyn.c	2011-12-16 19:06:04.000000000 +0000
@@ -0,0 +1,5 @@
+#define NARROW_WRAPPER
+#include "config.h"
+#undef WIDECHAR
+#define NARROWCHAR
+#include "./history.c"
diff -pruN 5.1.58-1/cmd-line-utils/libedit/key.c 5.1.61-2/cmd-line-utils/libedit/key.c
--- 5.1.58-1/cmd-line-utils/libedit/key.c	2011-07-01 15:22:21.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/key.c	1970-01-01 00:00:00.000000000 +0000
@@ -1,705 +0,0 @@
-/*	$NetBSD: key.c,v 1.19 2006/03/23 20:22:51 christos Exp $	*/
-
-/*-
- * Copyright (c) 1992, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Christos Zoulas of Cornell University.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-#if !defined(lint) && !defined(SCCSID)
-#if 0
-static char sccsid[] = "@(#)key.c	8.1 (Berkeley) 6/4/93";
-#else
-#endif
-#endif /* not lint && not SCCSID */
-
-/*
- * key.c: This module contains the procedures for maintaining
- *	  the extended-key map.
- *
- *      An extended-key (key) is a sequence of keystrokes introduced
- *	with a sequence introducer and consisting of an arbitrary
- *	number of characters.  This module maintains a map (the el->el_key.map)
- *	to convert these extended-key sequences into input strs
- *	(XK_STR), editor functions (XK_CMD), or unix commands (XK_EXE).
- *
- *      Warning:
- *	  If key is a substr of some other keys, then the longer
- *	  keys are lost!!  That is, if the keys "abcd" and "abcef"
- *	  are in el->el_key.map, adding the key "abc" will cause the first two
- *	  definitions to be lost.
- *
- *      Restrictions:
- *      -------------
- *      1) It is not possible to have one key that is a
- *	   substr of another.
- */
-#include <string.h>
-#include <stdlib.h>
-
-#include "el.h"
-
-/*
- * The Nodes of the el->el_key.map.  The el->el_key.map is a linked list
- * of these node elements
- */
-struct key_node_t {
-	char		ch;		/* single character of key 	 */
-	int		type;		/* node type			 */
-	key_value_t	val;		/* command code or pointer to str,  */
-					/* if this is a leaf 		 */
-	struct key_node_t *next;	/* ptr to next char of this key  */
-	struct key_node_t *sibling;	/* ptr to another key with same prefix*/
-};
-
-private int		 node_trav(EditLine *, key_node_t *, char *,
-    key_value_t *);
-private int		 node__try(EditLine *, key_node_t *, const char *,
-    key_value_t *, int);
-private key_node_t	*node__get(int);
-private void		 node__free(key_node_t *);
-private void		 node__put(EditLine *, key_node_t *);
-private int		 node__delete(EditLine *, key_node_t **, const char *);
-private int		 node_lookup(EditLine *, const char *, key_node_t *,
-    int);
-private int		 node_enum(EditLine *, key_node_t *, int);
-
-#define	KEY_BUFSIZ	EL_BUFSIZ
-
-
-/* key_init():
- *	Initialize the key maps
- */
-protected int
-key_init(EditLine *el)
-{
-
-	el->el_key.buf = (char *) el_malloc(KEY_BUFSIZ);
-	if (el->el_key.buf == NULL)
-		return (-1);
-	el->el_key.map = NULL;
-	key_reset(el);
-	return (0);
-}
-
-/* key_end():
- *	Free the key maps
- */
-protected void
-key_end(EditLine *el)
-{
-
-	el_free((ptr_t) el->el_key.buf);
-	el->el_key.buf = NULL;
-	node__free(el->el_key.map);
-}
-
-
-/* key_map_cmd():
- *	Associate cmd with a key value
- */
-protected key_value_t *
-key_map_cmd(EditLine *el, int cmd)
-{
-
-	el->el_key.val.cmd = (el_action_t) cmd;
-	return (&el->el_key.val);
-}
-
-
-/* key_map_str():
- *	Associate str with a key value
- */
-protected key_value_t *
-key_map_str(EditLine *el, char *str)
-{
-
-	el->el_key.val.str = str;
-	return (&el->el_key.val);
-}
-
-
-/* key_reset():
- *	Takes all nodes on el->el_key.map and puts them on free list.  Then
- *	initializes el->el_key.map with arrow keys
- *	[Always bind the ansi arrow keys?]
- */
-protected void
-key_reset(EditLine *el)
-{
-
-	node__put(el, el->el_key.map);
-	el->el_key.map = NULL;
-	return;
-}
-
-
-/* key_get():
- *	Calls the recursive function with entry point el->el_key.map
- *      Looks up *ch in map and then reads characters until a
- *      complete match is found or a mismatch occurs. Returns the
- *      type of the match found (XK_STR, XK_CMD, or XK_EXE).
- *      Returns NULL in val.str and XK_STR for no match.
- *      The last character read is returned in *ch.
- */
-protected int
-key_get(EditLine *el, char *ch, key_value_t *val)
-{
-
-	return (node_trav(el, el->el_key.map, ch, val));
-}
-
-
-/* key_add():
- *      Adds key to the el->el_key.map and associates the value in val with it.
- *      If key is already is in el->el_key.map, the new code is applied to the
- *      existing key. Ntype specifies if code is a command, an
- *      out str or a unix command.
- */
-protected void
-key_add(EditLine *el, const char *key, key_value_t *val, int ntype)
-{
-
-	if (key[0] == '\0') {
-		(void) fprintf(el->el_errfile,
-		    "key_add: Null extended-key not allowed.\n");
-		return;
-	}
-	if (ntype == XK_CMD && val->cmd == ED_SEQUENCE_LEAD_IN) {
-		(void) fprintf(el->el_errfile,
-		    "key_add: sequence-lead-in command not allowed\n");
-		return;
-	}
-	if (el->el_key.map == NULL)
-		/* tree is initially empty.  Set up new node to match key[0] */
-		el->el_key.map = node__get(key[0]);
-			/* it is properly initialized */
-
-	/* Now recurse through el->el_key.map */
-	(void) node__try(el, el->el_key.map, key, val, ntype);
-	return;
-}
-
-
-/* key_clear():
- *
- */
-protected void
-key_clear(EditLine *el, el_action_t *map, const char *in)
-{
-
-	if ((map[(unsigned char)*in] == ED_SEQUENCE_LEAD_IN) &&
-	    ((map == el->el_map.key &&
-	    el->el_map.alt[(unsigned char)*in] != ED_SEQUENCE_LEAD_IN) ||
-	    (map == el->el_map.alt &&
-	    el->el_map.key[(unsigned char)*in] != ED_SEQUENCE_LEAD_IN)))
-		(void) key_delete(el, in);
-}
-
-
-/* key_delete():
- *      Delete the key and all longer keys staring with key, if
- *      they exists.
- */
-protected int
-key_delete(EditLine *el, const char *key)
-{
-
-	if (key[0] == '\0') {
-		(void) fprintf(el->el_errfile,
-		    "key_delete: Null extended-key not allowed.\n");
-		return (-1);
-	}
-	if (el->el_key.map == NULL)
-		return (0);
-
-	(void) node__delete(el, &el->el_key.map, key);
-	return (0);
-}
-
-
-/* key_print():
- *	Print the binding associated with key key.
- *	Print entire el->el_key.map if null
- */
-protected void
-key_print(EditLine *el, const char *key)
-{
-
-	/* do nothing if el->el_key.map is empty and null key specified */
-	if (el->el_key.map == NULL && *key == 0)
-		return;
-
-	el->el_key.buf[0] = '"';
-	if (node_lookup(el, key, el->el_key.map, 1) <= -1)
-		/* key is not bound */
-		(void) fprintf(el->el_errfile, "Unbound extended key \"%s\"\n",
-		    key);
-	return;
-}
-
-
-/* node_trav():
- *	recursively traverses node in tree until match or mismatch is
- * 	found.  May read in more characters.
- */
-private int
-node_trav(EditLine *el, key_node_t *ptr, char *ch, key_value_t *val)
-{
-
-	if (ptr->ch == *ch) {
-		/* match found */
-		if (ptr->next) {
-			/* key not complete so get next char */
-			if (el_getc(el, ch) != 1) {	/* if EOF or error */
-				val->cmd = ED_END_OF_FILE;
-				return (XK_CMD);
-				/* PWP: Pretend we just read an end-of-file */
-			}
-			return (node_trav(el, ptr->next, ch, val));
-		} else {
-			*val = ptr->val;
-			if (ptr->type != XK_CMD)
-				*ch = '\0';
-			return (ptr->type);
-		}
-	} else {
-		/* no match found here */
-		if (ptr->sibling) {
-			/* try next sibling */
-			return (node_trav(el, ptr->sibling, ch, val));
-		} else {
-			/* no next sibling -- mismatch */
-			val->str = NULL;
-			return (XK_STR);
-		}
-	}
-}
-
-
-/* node__try():
- * 	Find a node that matches *str or allocate a new one
- */
-private int
-node__try(EditLine *el, key_node_t *ptr, const char *str, key_value_t *val, int ntype)
-{
-
-	if (ptr->ch != *str) {
-		key_node_t *xm;
-
-		for (xm = ptr; xm->sibling != NULL; xm = xm->sibling)
-			if (xm->sibling->ch == *str)
-				break;
-		if (xm->sibling == NULL)
-			xm->sibling = node__get(*str);	/* setup new node */
-		ptr = xm->sibling;
-	}
-	if (*++str == '\0') {
-		/* we're there */
-		if (ptr->next != NULL) {
-			node__put(el, ptr->next);
-				/* lose longer keys with this prefix */
-			ptr->next = NULL;
-		}
-		switch (ptr->type) {
-		case XK_CMD:
-		case XK_NOD:
-			break;
-		case XK_STR:
-		case XK_EXE:
-			if (ptr->val.str)
-				el_free((ptr_t) ptr->val.str);
-			break;
-		default:
-			EL_ABORT((el->el_errfile, "Bad XK_ type %d\n",
-			    ptr->type));
-			break;
-		}
-
-		switch (ptr->type = ntype) {
-		case XK_CMD:
-			ptr->val = *val;
-			break;
-		case XK_STR:
-		case XK_EXE:
-			if ((ptr->val.str = el_strdup(val->str)) == NULL)
-				return -1;
-			break;
-		default:
-			EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype));
-			break;
-		}
-	} else {
-		/* still more chars to go */
-		if (ptr->next == NULL)
-			ptr->next = node__get(*str);	/* setup new node */
-		(void) node__try(el, ptr->next, str, val, ntype);
-	}
-	return (0);
-}
-
-
-/* node__delete():
- *	Delete node that matches str
- */
-private int
-node__delete(EditLine *el, key_node_t **inptr, const char *str)
-{
-	key_node_t *ptr;
-	key_node_t *prev_ptr = NULL;
-
-	ptr = *inptr;
-
-	if (ptr->ch != *str) {
-		key_node_t *xm;
-
-		for (xm = ptr; xm->sibling != NULL; xm = xm->sibling)
-			if (xm->sibling->ch == *str)
-				break;
-		if (xm->sibling == NULL)
-			return (0);
-		prev_ptr = xm;
-		ptr = xm->sibling;
-	}
-	if (*++str == '\0') {
-		/* we're there */
-		if (prev_ptr == NULL)
-			*inptr = ptr->sibling;
-		else
-			prev_ptr->sibling = ptr->sibling;
-		ptr->sibling = NULL;
-		node__put(el, ptr);
-		return (1);
-	} else if (ptr->next != NULL &&
-	    node__delete(el, &ptr->next, str) == 1) {
-		if (ptr->next != NULL)
-			return (0);
-		if (prev_ptr == NULL)
-			*inptr = ptr->sibling;
-		else
-			prev_ptr->sibling = ptr->sibling;
-		ptr->sibling = NULL;
-		node__put(el, ptr);
-		return (1);
-	} else {
-		return (0);
-	}
-}
-
-
-/* node__put():
- *	Puts a tree of nodes onto free list using free(3).
- */
-private void
-node__put(EditLine *el, key_node_t *ptr)
-{
-	if (ptr == NULL)
-		return;
-
-	if (ptr->next != NULL) {
-		node__put(el, ptr->next);
-		ptr->next = NULL;
-	}
-	node__put(el, ptr->sibling);
-
-	switch (ptr->type) {
-	case XK_CMD:
-	case XK_NOD:
-		break;
-	case XK_EXE:
-	case XK_STR:
-		if (ptr->val.str != NULL)
-			el_free((ptr_t) ptr->val.str);
-		break;
-	default:
-		EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ptr->type));
-		break;
-	}
-	el_free((ptr_t) ptr);
-}
-
-
-/* node__get():
- *	Returns pointer to a key_node_t for ch.
- */
-private key_node_t *
-node__get(int ch)
-{
-	key_node_t *ptr;
-
-	ptr = (key_node_t *) el_malloc((size_t) sizeof(key_node_t));
-	if (ptr == NULL)
-		return NULL;
-	ptr->ch = ch;
-	ptr->type = XK_NOD;
-	ptr->val.str = NULL;
-	ptr->next = NULL;
-	ptr->sibling = NULL;
-	return (ptr);
-}
-
-private void
-node__free(key_node_t *k)
-{
-	if (k == NULL)
-		return;
-	node__free(k->sibling);
-	node__free(k->next);
-	el_free((ptr_t) k);
-}
-
-/* node_lookup():
- *	look for the str starting at node ptr.
- *	Print if last node
- */
-private int
-node_lookup(EditLine *el, const char *str, key_node_t *ptr, int cnt)
-{
-	int ncnt;
-
-	if (ptr == NULL)
-		return (-1);	/* cannot have null ptr */
-
-	if (*str == 0) {
-		/* no more chars in str.  node_enum from here. */
-		(void) node_enum(el, ptr, cnt);
-		return (0);
-	} else {
-		/* If match put this char into el->el_key.buf.  Recurse */
-		if (ptr->ch == *str) {
-			/* match found */
-			ncnt = key__decode_char(el->el_key.buf, KEY_BUFSIZ, cnt,
-			    (unsigned char) ptr->ch);
-			if (ptr->next != NULL)
-				/* not yet at leaf */
-				return (node_lookup(el, str + 1, ptr->next,
-				    ncnt + 1));
-			else {
-			    /* next node is null so key should be complete */
-				if (str[1] == 0) {
-					el->el_key.buf[ncnt + 1] = '"';
-					el->el_key.buf[ncnt + 2] = '\0';
-					key_kprint(el, el->el_key.buf,
-					    &ptr->val, ptr->type);
-					return (0);
-				} else
-					return (-1);
-					/* mismatch -- str still has chars */
-			}
-		} else {
-			/* no match found try sibling */
-			if (ptr->sibling)
-				return (node_lookup(el, str, ptr->sibling,
-				    cnt));
-			else
-				return (-1);
-		}
-	}
-}
-
-
-/* node_enum():
- *	Traverse the node printing the characters it is bound in buffer
- */
-private int
-node_enum(EditLine *el, key_node_t *ptr, int cnt)
-{
-	int ncnt;
-
-	if (cnt >= KEY_BUFSIZ - 5) {	/* buffer too small */
-		el->el_key.buf[++cnt] = '"';
-		el->el_key.buf[++cnt] = '\0';
-		(void) fprintf(el->el_errfile,
-		    "Some extended keys too long for internal print buffer");
-		(void) fprintf(el->el_errfile, " \"%s...\"\n", el->el_key.buf);
-		return (0);
-	}
-	if (ptr == NULL) {
-#ifdef DEBUG_EDIT
-		(void) fprintf(el->el_errfile,
-		    "node_enum: BUG!! Null ptr passed\n!");
-#endif
-		return (-1);
-	}
-	/* put this char at end of str */
-	ncnt = key__decode_char(el->el_key.buf, KEY_BUFSIZ, cnt,
-	    (unsigned char)ptr->ch);
-	if (ptr->next == NULL) {
-		/* print this key and function */
-		el->el_key.buf[ncnt + 1] = '"';
-		el->el_key.buf[ncnt + 2] = '\0';
-		key_kprint(el, el->el_key.buf, &ptr->val, ptr->type);
-	} else
-		(void) node_enum(el, ptr->next, ncnt + 1);
-
-	/* go to sibling if there is one */
-	if (ptr->sibling)
-		(void) node_enum(el, ptr->sibling, cnt);
-	return (0);
-}
-
-
-/* key_kprint():
- *	Print the specified key and its associated
- *	function specified by val
- */
-protected void
-key_kprint(EditLine *el, const char *key, key_value_t *val, int ntype)
-{
-	el_bindings_t *fp;
-	char unparsbuf[EL_BUFSIZ];
-	static const char fmt[] = "%-15s->  %s\n";
-
-	if (val != NULL)
-		switch (ntype) {
-		case XK_STR:
-		case XK_EXE:
-			(void) key__decode_str(val->str, unparsbuf,
-			    sizeof(unparsbuf), 
-			    ntype == XK_STR ? "\"\"" : "[]");
-			(void) fprintf(el->el_outfile, fmt, key, unparsbuf);
-			break;
-		case XK_CMD:
-			for (fp = el->el_map.help; fp->name; fp++)
-				if (val->cmd == fp->func) {
-					(void) fprintf(el->el_outfile, fmt,
-					    key, fp->name);
-					break;
-				}
-#ifdef DEBUG_KEY
-			if (fp->name == NULL)
-				(void) fprintf(el->el_outfile,
-				    "BUG! Command not found.\n");
-#endif
-
-			break;
-		default:
-			EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype));
-			break;
-		}
-	else
-		(void) fprintf(el->el_outfile, fmt, key, "no input");
-}
-
-
-#define ADDC(c) \
-	if (b < eb) \
-		*b++ = c; \
-	else \
-		b++
-/* key__decode_char():
- *	Put a printable form of char in buf.
- */
-protected int
-key__decode_char(char *buf, int cnt, int off, int ch)
-{
-	char *sb = buf + off;
-	char *eb = buf + cnt;
-	char *b = sb;
-	if (ch == 0) {
-		ADDC('^');
-		ADDC('@');
-		return b - sb;
-	}
-	if (iscntrl(ch)) {
-		ADDC('^');
-		if (ch == '\177')
-			ADDC('?');
-		else
-			ADDC(ch | 0100);
-	} else if (ch == '^') {
-		ADDC('\\');
-		ADDC('^');
-	} else if (ch == '\\') {
-		ADDC('\\');
-		ADDC('\\');
-	} else if (ch == ' ' || (el_isprint(ch) && !isspace(ch))) {
-		ADDC(ch);
-	} else {
-		ADDC('\\');
-		ADDC((((unsigned int) ch >> 6) & 7) + '0');
-		ADDC((((unsigned int) ch >> 3) & 7) + '0');
-		ADDC((ch & 7) + '0');
-	}
-	return b - sb;
-}
-
-
-/* key__decode_str():
- *	Make a printable version of the ey
- */
-protected int
-key__decode_str(const char *str, char *buf, int len, const char *sep)
-{
-	char *b = buf, *eb = b + len;
-	const char *p;
-
-	b = buf;
-	if (sep[0] != '\0') {
-		ADDC(sep[0]);
-	}
-	if (*str == '\0') {
-		ADDC('^');
-		ADDC('@');
-		if (sep[0] != '\0' && sep[1] != '\0') {
-			ADDC(sep[1]);
-		}
-		goto done;
-	}
-	for (p = str; *p != 0; p++) {
-		if (iscntrl((unsigned char) *p)) {
-			ADDC('^');
-			if (*p == '\177') {
-				ADDC('?');
-			} else {
-				ADDC(*p | 0100);
-			}
-		} else if (*p == '^' || *p == '\\') {
-			ADDC('\\');
-			ADDC(*p);
-		} else if (*p == ' ' || (el_isprint((unsigned char) *p) &&
-			!isspace((unsigned char) *p))) {
-			ADDC(*p);
-		} else {
-			ADDC('\\');
-			ADDC((((unsigned int) *p >> 6) & 7) + '0');
-			ADDC((((unsigned int) *p >> 3) & 7) + '0');
-			ADDC((*p & 7) + '0');
-		}
-	}
-	if (sep[0] != '\0' && sep[1] != '\0') {
-		ADDC(sep[1]);
-	}
-done:
-	ADDC('\0');
-	if (b - buf >= len)
-	    buf[len - 1] = '\0';
-	return b - buf;
-}
diff -pruN 5.1.58-1/cmd-line-utils/libedit/key.h 5.1.61-2/cmd-line-utils/libedit/key.h
--- 5.1.58-1/cmd-line-utils/libedit/key.h	2011-07-01 15:22:21.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/key.h	1970-01-01 00:00:00.000000000 +0000
@@ -1,81 +0,0 @@
-/*	$NetBSD: key.h,v 1.10 2006/03/23 20:22:51 christos Exp $	*/
-
-/*-
- * Copyright (c) 1992, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Christos Zoulas of Cornell University.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)key.h	8.1 (Berkeley) 6/4/93
- */
-
-/*
- * el.key.h: Key macro header
- */
-#ifndef _h_el_key
-#define	_h_el_key
-
-typedef union key_value_t {
-	el_action_t	 cmd;	/* If it is a command the #	*/
-	char		*str;	/* If it is a string...		*/
-} key_value_t;
-
-typedef struct key_node_t key_node_t;
-
-typedef struct el_key_t {
-	char		*buf;	/* Key print buffer		*/
-	key_node_t	*map;	/* Key map			*/
-	key_value_t	 val;	/* Local conversion buffer	*/
-} el_key_t;
-
-#define	XK_CMD	0
-#define	XK_STR	1
-#define	XK_NOD	2
-#define	XK_EXE	3
-
-#undef key_end
-#undef key_clear
-#undef key_print
-
-protected int		 key_init(EditLine *);
-protected void		 key_end(EditLine *);
-protected key_value_t	*key_map_cmd(EditLine *, int);
-protected key_value_t	*key_map_str(EditLine *, char *);
-protected void		 key_reset(EditLine *);
-protected int		 key_get(EditLine *, char *, key_value_t *);
-protected void		 key_add(EditLine *, const char *, key_value_t *, int);
-protected void		 key_clear(EditLine *, el_action_t *, const char *);
-protected int		 key_delete(EditLine *, const char *);
-protected void		 key_print(EditLine *, const char *);
-protected void	         key_kprint(EditLine *, const char *, key_value_t *,
-    int);
-protected int		 key__decode_str(const char *, char *, int,
-    const char *);
-protected int		 key__decode_char(char *, int, int, int);
-
-#endif /* _h_el_key */
diff -pruN 5.1.58-1/cmd-line-utils/libedit/keymacro.c 5.1.61-2/cmd-line-utils/libedit/keymacro.c
--- 5.1.58-1/cmd-line-utils/libedit/keymacro.c	1970-01-01 00:00:00.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/keymacro.c	2011-12-16 19:06:04.000000000 +0000
@@ -0,0 +1,677 @@
+/*	$NetBSD: keymacro.c,v 1.7 2011/08/16 16:25:15 christos Exp $	*/
+
+/*-
+ * Copyright (c) 1992, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Christos Zoulas of Cornell University.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "config.h"
+#if !defined(lint) && !defined(SCCSID)
+#if 0
+static char sccsid[] = "@(#)key.c	8.1 (Berkeley) 6/4/93";
+#else
+#endif
+#endif /* not lint && not SCCSID */
+
+/*
+ * keymacro.c: This module contains the procedures for maintaining
+ *	       the extended-key map.
+ *
+ *      An extended-key (key) is a sequence of keystrokes introduced
+ *	with a sequence introducer and consisting of an arbitrary
+ *	number of characters.  This module maintains a map (the
+ *	el->el_keymacro.map)
+ *	to convert these extended-key sequences into input strs
+ *	(XK_STR), editor functions (XK_CMD), or unix commands (XK_EXE).
+ *
+ *      Warning:
+ *	  If key is a substr of some other keys, then the longer
+ *	  keys are lost!!  That is, if the keys "abcd" and "abcef"
+ *	  are in el->el_keymacro.map, adding the key "abc" will cause
+ *	  the first two definitions to be lost.
+ *
+ *      Restrictions:
+ *      -------------
+ *      1) It is not possible to have one key that is a
+ *	   substr of another.
+ */
+#include <string.h>
+#include <stdlib.h>
+
+#include "el.h"
+
+/*
+ * The Nodes of the el->el_keymacro.map.  The el->el_keymacro.map is a
+ * linked list of these node elements
+ */
+struct keymacro_node_t {
+	Char		 ch;		/* single character of key 	 */
+	int		 type;		/* node type			 */
+	keymacro_value_t val;		/* command code or pointer to str,  */
+					/* if this is a leaf 		 */
+	struct keymacro_node_t *next;	/* ptr to next char of this key  */
+	struct keymacro_node_t *sibling;/* ptr to another key with same prefix*/
+};
+
+private int		 node_trav(EditLine *, keymacro_node_t *, Char *,
+    keymacro_value_t *);
+private int		 node__try(EditLine *, keymacro_node_t *, const Char *,
+    keymacro_value_t *, int);
+private keymacro_node_t	*node__get(Int);
+private void		 node__free(keymacro_node_t *);
+private void		 node__put(EditLine *, keymacro_node_t *);
+private int		 node__delete(EditLine *, keymacro_node_t **,
+    const Char *);
+private int		 node_lookup(EditLine *, const Char *,
+    keymacro_node_t *, size_t);
+private int		 node_enum(EditLine *, keymacro_node_t *, size_t);
+
+#define	KEY_BUFSIZ	EL_BUFSIZ
+
+
+/* keymacro_init():
+ *	Initialize the key maps
+ */
+protected int
+keymacro_init(EditLine *el)
+{
+
+	el->el_keymacro.buf = el_malloc(KEY_BUFSIZ *
+	    sizeof(*el->el_keymacro.buf));
+	if (el->el_keymacro.buf == NULL)
+		return -1;
+	el->el_keymacro.map = NULL;
+	keymacro_reset(el);
+	return 0;
+}
+
+/* keymacro_end():
+ *	Free the key maps
+ */
+protected void
+keymacro_end(EditLine *el)
+{
+
+	el_free(el->el_keymacro.buf);
+	el->el_keymacro.buf = NULL;
+	node__free(el->el_keymacro.map);
+}
+
+
+/* keymacro_map_cmd():
+ *	Associate cmd with a key value
+ */
+protected keymacro_value_t *
+keymacro_map_cmd(EditLine *el, int cmd)
+{
+
+	el->el_keymacro.val.cmd = (el_action_t) cmd;
+	return &el->el_keymacro.val;
+}
+
+
+/* keymacro_map_str():
+ *	Associate str with a key value
+ */
+protected keymacro_value_t *
+keymacro_map_str(EditLine *el, Char *str)
+{
+
+	el->el_keymacro.val.str = str;
+	return &el->el_keymacro.val;
+}
+
+
+/* keymacro_reset():
+ *	Takes all nodes on el->el_keymacro.map and puts them on free list.
+ *	Then initializes el->el_keymacro.map with arrow keys
+ *	[Always bind the ansi arrow keys?]
+ */
+protected void
+keymacro_reset(EditLine *el)
+{
+
+	node__put(el, el->el_keymacro.map);
+	el->el_keymacro.map = NULL;
+	return;
+}
+
+
+/* keymacro_get():
+ *	Calls the recursive function with entry point el->el_keymacro.map
+ *      Looks up *ch in map and then reads characters until a
+ *      complete match is found or a mismatch occurs. Returns the
+ *      type of the match found (XK_STR, XK_CMD, or XK_EXE).
+ *      Returns NULL in val.str and XK_STR for no match.
+ *      The last character read is returned in *ch.
+ */
+protected int
+keymacro_get(EditLine *el, Char *ch, keymacro_value_t *val)
+{
+
+	return node_trav(el, el->el_keymacro.map, ch, val);
+}
+
+
+/* keymacro_add():
+ *      Adds key to the el->el_keymacro.map and associates the value in
+ *	val with it. If key is already is in el->el_keymacro.map, the new
+ *	code is applied to the existing key. Ntype specifies if code is a
+ *	command, an out str or a unix command.
+ */
+protected void
+keymacro_add(EditLine *el, const Char *key, keymacro_value_t *val, int ntype)
+{
+
+	if (key[0] == '\0') {
+		(void) fprintf(el->el_errfile,
+		    "keymacro_add: Null extended-key not allowed.\n");
+		return;
+	}
+	if (ntype == XK_CMD && val->cmd == ED_SEQUENCE_LEAD_IN) {
+		(void) fprintf(el->el_errfile,
+		    "keymacro_add: sequence-lead-in command not allowed\n");
+		return;
+	}
+	if (el->el_keymacro.map == NULL)
+		/* tree is initially empty.  Set up new node to match key[0] */
+		el->el_keymacro.map = node__get(key[0]);
+			/* it is properly initialized */
+
+	/* Now recurse through el->el_keymacro.map */
+	(void) node__try(el, el->el_keymacro.map, key, val, ntype);
+	return;
+}
+
+
+/* keymacro_clear():
+ *
+ */
+protected void
+keymacro_clear(EditLine *el, el_action_t *map, const Char *in)
+{
+#ifdef WIDECHAR
+        if (*in > N_KEYS) /* can't be in the map */
+                return;
+#endif
+	if ((map[(unsigned char)*in] == ED_SEQUENCE_LEAD_IN) &&
+	    ((map == el->el_map.key &&
+	    el->el_map.alt[(unsigned char)*in] != ED_SEQUENCE_LEAD_IN) ||
+	    (map == el->el_map.alt &&
+	    el->el_map.key[(unsigned char)*in] != ED_SEQUENCE_LEAD_IN)))
+		(void) keymacro_delete(el, in);
+}
+
+
+/* keymacro_delete():
+ *      Delete the key and all longer keys staring with key, if
+ *      they exists.
+ */
+protected int
+keymacro_delete(EditLine *el, const Char *key)
+{
+
+	if (key[0] == '\0') {
+		(void) fprintf(el->el_errfile,
+		    "keymacro_delete: Null extended-key not allowed.\n");
+		return -1;
+	}
+	if (el->el_keymacro.map == NULL)
+		return 0;
+
+	(void) node__delete(el, &el->el_keymacro.map, key);
+	return 0;
+}
+
+
+/* keymacro_print():
+ *	Print the binding associated with key key.
+ *	Print entire el->el_keymacro.map if null
+ */
+protected void
+keymacro_print(EditLine *el, const Char *key)
+{
+
+	/* do nothing if el->el_keymacro.map is empty and null key specified */
+	if (el->el_keymacro.map == NULL && *key == 0)
+		return;
+
+	el->el_keymacro.buf[0] = '"';
+	if (node_lookup(el, key, el->el_keymacro.map, (size_t)1) <= -1)
+		/* key is not bound */
+		(void) fprintf(el->el_errfile, "Unbound extended key \"" FSTR
+		    "\"\n", key);
+	return;
+}
+
+
+/* node_trav():
+ *	recursively traverses node in tree until match or mismatch is
+ * 	found.  May read in more characters.
+ */
+private int
+node_trav(EditLine *el, keymacro_node_t *ptr, Char *ch, keymacro_value_t *val)
+{
+
+	if (ptr->ch == *ch) {
+		/* match found */
+		if (ptr->next) {
+			/* key not complete so get next char */
+			if (FUN(el,getc)(el, ch) != 1) {/* if EOF or error */
+				val->cmd = ED_END_OF_FILE;
+				return XK_CMD;
+				/* PWP: Pretend we just read an end-of-file */
+			}
+			return node_trav(el, ptr->next, ch, val);
+		} else {
+			*val = ptr->val;
+			if (ptr->type != XK_CMD)
+				*ch = '\0';
+			return ptr->type;
+		}
+	} else {
+		/* no match found here */
+		if (ptr->sibling) {
+			/* try next sibling */
+			return node_trav(el, ptr->sibling, ch, val);
+		} else {
+			/* no next sibling -- mismatch */
+			val->str = NULL;
+			return XK_STR;
+		}
+	}
+}
+
+
+/* node__try():
+ * 	Find a node that matches *str or allocate a new one
+ */
+private int
+node__try(EditLine *el, keymacro_node_t *ptr, const Char *str,
+    keymacro_value_t *val, int ntype)
+{
+
+	if (ptr->ch != *str) {
+		keymacro_node_t *xm;
+
+		for (xm = ptr; xm->sibling != NULL; xm = xm->sibling)
+			if (xm->sibling->ch == *str)
+				break;
+		if (xm->sibling == NULL)
+			xm->sibling = node__get(*str);	/* setup new node */
+		ptr = xm->sibling;
+	}
+	if (*++str == '\0') {
+		/* we're there */
+		if (ptr->next != NULL) {
+			node__put(el, ptr->next);
+				/* lose longer keys with this prefix */
+			ptr->next = NULL;
+		}
+		switch (ptr->type) {
+		case XK_CMD:
+		case XK_NOD:
+			break;
+		case XK_STR:
+		case XK_EXE:
+			if (ptr->val.str)
+				el_free(ptr->val.str);
+			break;
+		default:
+			EL_ABORT((el->el_errfile, "Bad XK_ type %d\n",
+			    ptr->type));
+			break;
+		}
+
+		switch (ptr->type = ntype) {
+		case XK_CMD:
+			ptr->val = *val;
+			break;
+		case XK_STR:
+		case XK_EXE:
+			if ((ptr->val.str = Strdup(val->str)) == NULL)
+				return -1;
+			break;
+		default:
+			EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype));
+			break;
+		}
+	} else {
+		/* still more chars to go */
+		if (ptr->next == NULL)
+			ptr->next = node__get(*str);	/* setup new node */
+		(void) node__try(el, ptr->next, str, val, ntype);
+	}
+	return 0;
+}
+
+
+/* node__delete():
+ *	Delete node that matches str
+ */
+private int
+node__delete(EditLine *el, keymacro_node_t **inptr, const Char *str)
+{
+	keymacro_node_t *ptr;
+	keymacro_node_t *prev_ptr = NULL;
+
+	ptr = *inptr;
+
+	if (ptr->ch != *str) {
+		keymacro_node_t *xm;
+
+		for (xm = ptr; xm->sibling != NULL; xm = xm->sibling)
+			if (xm->sibling->ch == *str)
+				break;
+		if (xm->sibling == NULL)
+			return 0;
+		prev_ptr = xm;
+		ptr = xm->sibling;
+	}
+	if (*++str == '\0') {
+		/* we're there */
+		if (prev_ptr == NULL)
+			*inptr = ptr->sibling;
+		else
+			prev_ptr->sibling = ptr->sibling;
+		ptr->sibling = NULL;
+		node__put(el, ptr);
+		return 1;
+	} else if (ptr->next != NULL &&
+	    node__delete(el, &ptr->next, str) == 1) {
+		if (ptr->next != NULL)
+			return 0;
+		if (prev_ptr == NULL)
+			*inptr = ptr->sibling;
+		else
+			prev_ptr->sibling = ptr->sibling;
+		ptr->sibling = NULL;
+		node__put(el, ptr);
+		return 1;
+	} else {
+		return 0;
+	}
+}
+
+
+/* node__put():
+ *	Puts a tree of nodes onto free list using free(3).
+ */
+private void
+node__put(EditLine *el, keymacro_node_t *ptr)
+{
+	if (ptr == NULL)
+		return;
+
+	if (ptr->next != NULL) {
+		node__put(el, ptr->next);
+		ptr->next = NULL;
+	}
+	node__put(el, ptr->sibling);
+
+	switch (ptr->type) {
+	case XK_CMD:
+	case XK_NOD:
+		break;
+	case XK_EXE:
+	case XK_STR:
+		if (ptr->val.str != NULL)
+			el_free(ptr->val.str);
+		break;
+	default:
+		EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ptr->type));
+		break;
+	}
+	el_free(ptr);
+}
+
+
+/* node__get():
+ *	Returns pointer to a keymacro_node_t for ch.
+ */
+private keymacro_node_t *
+node__get(Int ch)
+{
+	keymacro_node_t *ptr;
+
+	ptr = el_malloc(sizeof(*ptr));
+	if (ptr == NULL)
+		return NULL;
+	ptr->ch = ch;
+	ptr->type = XK_NOD;
+	ptr->val.str = NULL;
+	ptr->next = NULL;
+	ptr->sibling = NULL;
+	return ptr;
+}
+
+private void
+node__free(keymacro_node_t *k)
+{
+	if (k == NULL)
+		return;
+	node__free(k->sibling);
+	node__free(k->next);
+	el_free(k);
+}
+
+/* node_lookup():
+ *	look for the str starting at node ptr.
+ *	Print if last node
+ */
+private int
+node_lookup(EditLine *el, const Char *str, keymacro_node_t *ptr, size_t cnt)
+{
+	ssize_t used;
+
+	if (ptr == NULL)
+		return -1;	/* cannot have null ptr */
+
+	if (!str || *str == 0) {
+		/* no more chars in str.  node_enum from here. */
+		(void) node_enum(el, ptr, cnt);
+		return 0;
+	} else {
+		/* If match put this char into el->el_keymacro.buf.  Recurse */
+		if (ptr->ch == *str) {
+			/* match found */
+			used = ct_visual_char(el->el_keymacro.buf + cnt,
+			    KEY_BUFSIZ - cnt, ptr->ch);
+			if (used == -1)
+				return -1; /* ran out of buffer space */
+			if (ptr->next != NULL)
+				/* not yet at leaf */
+				return (node_lookup(el, str + 1, ptr->next,
+				    (size_t)used + cnt));
+			else {
+			    /* next node is null so key should be complete */
+				if (str[1] == 0) {
+					size_t px = cnt + (size_t)used;
+					el->el_keymacro.buf[px] = '"';
+					el->el_keymacro.buf[px + 1] = '\0';
+					keymacro_kprint(el, el->el_keymacro.buf,
+					    &ptr->val, ptr->type);
+					return 0;
+				} else
+					return -1;
+					/* mismatch -- str still has chars */
+			}
+		} else {
+			/* no match found try sibling */
+			if (ptr->sibling)
+				return (node_lookup(el, str, ptr->sibling,
+				    cnt));
+			else
+				return -1;
+		}
+	}
+}
+
+
+/* node_enum():
+ *	Traverse the node printing the characters it is bound in buffer
+ */
+private int
+node_enum(EditLine *el, keymacro_node_t *ptr, size_t cnt)
+{
+        ssize_t used;
+
+	if (cnt >= KEY_BUFSIZ - 5) {	/* buffer too small */
+		el->el_keymacro.buf[++cnt] = '"';
+		el->el_keymacro.buf[++cnt] = '\0';
+		(void) fprintf(el->el_errfile,
+		    "Some extended keys too long for internal print buffer");
+		(void) fprintf(el->el_errfile, " \"" FSTR "...\"\n",
+		    el->el_keymacro.buf);
+		return 0;
+	}
+	if (ptr == NULL) {
+#ifdef DEBUG_EDIT
+		(void) fprintf(el->el_errfile,
+		    "node_enum: BUG!! Null ptr passed\n!");
+#endif
+		return -1;
+	}
+	/* put this char at end of str */
+        used = ct_visual_char(el->el_keymacro.buf + cnt, KEY_BUFSIZ - cnt,
+	    ptr->ch);
+	if (ptr->next == NULL) {
+		/* print this key and function */
+		el->el_keymacro.buf[cnt + (size_t)used   ] = '"';
+		el->el_keymacro.buf[cnt + (size_t)used + 1] = '\0';
+		keymacro_kprint(el, el->el_keymacro.buf, &ptr->val, ptr->type);
+	} else
+		(void) node_enum(el, ptr->next, cnt + (size_t)used);
+
+	/* go to sibling if there is one */
+	if (ptr->sibling)
+		(void) node_enum(el, ptr->sibling, cnt);
+	return 0;
+}
+
+
+/* keymacro_kprint():
+ *	Print the specified key and its associated
+ *	function specified by val
+ */
+protected void
+keymacro_kprint(EditLine *el, const Char *key, keymacro_value_t *val, int ntype)
+{
+	el_bindings_t *fp;
+	char unparsbuf[EL_BUFSIZ];
+	static const char fmt[] = "%-15s->  %s\n";
+	mbstate_t state;
+
+	memset(&state, 0, sizeof(mbstate_t));
+	if (val != NULL)
+		switch (ntype) {
+		case XK_STR:
+		case XK_EXE:
+			(void) keymacro__decode_str(val->str, unparsbuf,
+			    sizeof(unparsbuf), 
+			    ntype == XK_STR ? "\"\"" : "[]");
+			(void) fprintf(el->el_outfile, fmt,
+			    ct_encode_string(key, &el->el_scratch), unparsbuf);
+			break;
+		case XK_CMD:
+			for (fp = el->el_map.help; fp->name; fp++)
+				if (val->cmd == fp->func) {
+                    memset(&state, 0, sizeof(mbstate_t));
+                    wcsrtombs(unparsbuf, (const wchar_t **) &fp->name,
+                              sizeof(unparsbuf), &state);
+                    unparsbuf[sizeof(unparsbuf) -1] = '\0';
+					(void) fprintf(el->el_outfile, fmt,
+                        ct_encode_string(key, &el->el_scratch), unparsbuf);
+					break;
+				}
+#ifdef DEBUG_KEY
+			if (fp->name == NULL)
+				(void) fprintf(el->el_outfile,
+				    "BUG! Command not found.\n");
+#endif
+
+			break;
+		default:
+			EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype));
+			break;
+		}
+	else
+		(void) fprintf(el->el_outfile, fmt, ct_encode_string(key,
+		    &el->el_scratch), "no input");
+}
+
+
+#define ADDC(c) \
+	if (b < eb) \
+		*b++ = c; \
+	else \
+		b++
+/* keymacro__decode_str():
+ *	Make a printable version of the ey
+ */
+protected size_t
+keymacro__decode_str(const Char *str, char *buf, size_t len, const char *sep)
+{
+	char *b = buf, *eb = b + len;
+	const Char *p;
+	mbstate_t state;
+
+	memset(&state, 0, sizeof(mbstate_t));
+	b = buf;
+	if (sep[0] != '\0') {
+		ADDC(sep[0]);
+	}
+	if (*str == '\0') {
+		ADDC('^');
+		ADDC('@');
+		goto add_endsep;
+	}
+	for (p = str; *p != 0; p++) {
+		Char dbuf[VISUAL_WIDTH_MAX];
+		Char *p2 = dbuf;
+		ssize_t l = ct_visual_char(dbuf, VISUAL_WIDTH_MAX, *p);
+		while (l-- > 0) {
+			ssize_t n = ct_encode_char(b, (size_t)(eb - b), *p2++,
+                                                   &state);
+			if (n == -1) /* ran out of space */
+				goto add_endsep;
+			else
+				b += n;
+		}
+	}
+add_endsep:
+	if (sep[0] != '\0' && sep[1] != '\0') {
+		ADDC(sep[1]);
+	}
+	ADDC('\0');
+	if ((size_t)(b - buf) >= len)
+	    buf[len - 1] = '\0';
+	return (size_t)(b - buf);
+}
diff -pruN 5.1.58-1/cmd-line-utils/libedit/keymacro.h 5.1.61-2/cmd-line-utils/libedit/keymacro.h
--- 5.1.58-1/cmd-line-utils/libedit/keymacro.h	1970-01-01 00:00:00.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/keymacro.h	2011-12-16 19:06:04.000000000 +0000
@@ -0,0 +1,76 @@
+/*	$NetBSD: keymacro.h,v 1.2 2011/07/28 03:44:36 christos Exp $	*/
+
+/*-
+ * Copyright (c) 1992, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Christos Zoulas of Cornell University.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *	@(#)key.h	8.1 (Berkeley) 6/4/93
+ */
+
+/*
+ * el.keymacro.h: Key macro header
+ */
+#ifndef _h_el_keymacro
+#define	_h_el_keymacro
+
+typedef union keymacro_value_t {
+	el_action_t	 cmd;	/* If it is a command the #	*/
+	Char		*str;	/* If it is a string...		*/
+} keymacro_value_t;
+
+typedef struct keymacro_node_t keymacro_node_t;
+
+typedef struct el_keymacromacro_t {
+	Char		*buf;	/* Key print buffer		*/
+	keymacro_node_t	*map;	/* Key map			*/
+	keymacro_value_t val;	/* Local conversion buffer	*/
+} el_keymacro_t;
+
+#define	XK_CMD	0
+#define	XK_STR	1
+#define	XK_NOD	2
+#define	XK_EXE	3
+
+protected int keymacro_init(EditLine *);
+protected void keymacro_end(EditLine *);
+protected keymacro_value_t *keymacro_map_cmd(EditLine *, int);
+protected keymacro_value_t *keymacro_map_str(EditLine *, Char *);
+protected void keymacro_reset(EditLine *);
+protected int keymacro_get(EditLine *, Char *, keymacro_value_t *);
+protected void keymacro_add(EditLine *, const Char *, keymacro_value_t *, int);
+protected void keymacro_clear(EditLine *, el_action_t *, const Char *);
+protected int keymacro_delete(EditLine *, const Char *);
+protected void keymacro_print(EditLine *, const Char *);
+protected void keymacro_kprint(EditLine *, const Char *, keymacro_value_t *,
+    int);
+protected size_t keymacro__decode_str(const Char *, char *, size_t,
+    const char *);
+
+#endif /* _h_el_keymacro */
diff -pruN 5.1.58-1/cmd-line-utils/libedit/Makefile.am 5.1.61-2/cmd-line-utils/libedit/Makefile.am
--- 5.1.58-1/cmd-line-utils/libedit/Makefile.am	2011-07-01 15:22:21.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/Makefile.am	2011-12-16 19:06:04.000000000 +0000
@@ -7,20 +7,20 @@ INCLUDES =		-I$(top_builddir)/include -I
 
 noinst_LIBRARIES =	libedit.a
 
-libedit_a_SOURCES =	chared.c el.c history.c map.c prompt.c readline.c \
-			search.c tokenizer.c vi.c common.c emacs.c \
-			hist.c key.c parse.c read.c refresh.c sig.c term.c \
+libedit_a_SOURCES =	chared.c el.c eln.c history.c historyn.c map.c prompt.c chartype.c \
+			readline.c search.c tokenizer.c tokenizern.c vi.c common.c emacs.c \
+			hist.c keymacro.c parse.c read.c refresh.c sig.c terminal.c \
 			tty.c help.c fcns.c filecomplete.c \
 			np/unvis.c np/strlcpy.c np/vis.c np/strlcat.c \
-			np/fgetln.c
+			np/fgetln.c np/wcsdup.c
 
 libedit_a_LIBADD = 		@LIBEDIT_LOBJECTS@
 libedit_a_DEPENDENCIES 	= 	@LIBEDIT_LOBJECTS@
 
 pkginclude_HEADERS =	readline/readline.h
 
-noinst_HEADERS =	chared.h el.h el_term.h histedit.h key.h parse.h refresh.h sig.h \
-			sys.h config.h hist.h map.h prompt.h read.h \
+noinst_HEADERS =	chared.h chartype.h el.h el_terminal.h histedit.h keymacro.h parse.h \
+			refresh.h sig.h sys.h config.h hist.h map.h prompt.h read.h \
 			search.h tty.h filecomplete.h np/vis.h
 
 EXTRA_DIST = makelist.sh
@@ -70,22 +70,26 @@ fcns.c: ${AHDR} fcns.h makelist
 
 chared.o: vi.h emacs.h common.h help.h fcns.h
 el.o: vi.h emacs.h common.h help.h fcns.h
+eln.o: vi.h emacs.h common.h help.h fcns.h
 history.o: vi.h emacs.h common.h help.h fcns.h 
+historyn.o: vi.h emacs.h common.h help.h fcns.h 
 map.o: vi.h emacs.h common.h help.h fcns.h
+chartype.o: vi.h emacs.h common.h help.h fcns.h
 prompt.o: vi.h emacs.h common.h help.h fcns.h
 readline.o: vi.h emacs.h common.h help.h fcns.h
 search.o: vi.h emacs.h common.h help.h fcns.h
 tokenizer.o: vi.h emacs.h common.h help.h fcns.h
+tokenizern.o: vi.h emacs.h common.h help.h fcns.h
 vi.o: vi.h emacs.h common.h help.h fcns.h
 common.o: vi.h emacs.h common.h help.h fcns.h
 emacs.o: vi.h emacs.h common.h help.h fcns.h 
 hist.o: vi.h emacs.h common.h help.h fcns.h 
-key.o: vi.h emacs.h common.h help.h fcns.h 
+keymacro.o: vi.h emacs.h common.h help.h fcns.h 
 parse.o: vi.h emacs.h common.h help.h fcns.h
 read.o: vi.h emacs.h common.h help.h fcns.h
 refresh.o: vi.h emacs.h common.h help.h fcns.h
 sig.o: vi.h emacs.h common.h help.h fcns.h
-term.o: vi.h emacs.h common.h help.h fcns.h
+terminal.o: vi.h emacs.h common.h help.h fcns.h
 tty.o: vi.h emacs.h common.h help.h fcns.h 
 help.o: vi.h emacs.h common.h help.h fcns.h
 fcns.o: vi.h emacs.h common.h help.h fcns.h
diff -pruN 5.1.58-1/cmd-line-utils/libedit/Makefile.in 5.1.61-2/cmd-line-utils/libedit/Makefile.in
--- 5.1.58-1/cmd-line-utils/libedit/Makefile.in	2011-07-01 15:23:54.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/Makefile.in	2011-12-16 19:07:25.000000000 +0000
@@ -58,14 +58,17 @@ CONFIG_HEADER = $(top_builddir)/include/
 CONFIG_CLEAN_FILES =
 LIBRARIES = $(noinst_LIBRARIES)
 libedit_a_AR = $(AR) $(ARFLAGS)
-am_libedit_a_OBJECTS = chared.$(OBJEXT) el.$(OBJEXT) history.$(OBJEXT) \
-	map.$(OBJEXT) prompt.$(OBJEXT) readline.$(OBJEXT) \
-	search.$(OBJEXT) tokenizer.$(OBJEXT) vi.$(OBJEXT) \
-	common.$(OBJEXT) emacs.$(OBJEXT) hist.$(OBJEXT) key.$(OBJEXT) \
-	parse.$(OBJEXT) read.$(OBJEXT) refresh.$(OBJEXT) sig.$(OBJEXT) \
-	term.$(OBJEXT) tty.$(OBJEXT) help.$(OBJEXT) fcns.$(OBJEXT) \
+am_libedit_a_OBJECTS = chared.$(OBJEXT) el.$(OBJEXT) eln.$(OBJEXT) \
+	history.$(OBJEXT) historyn.$(OBJEXT) map.$(OBJEXT) \
+	prompt.$(OBJEXT) chartype.$(OBJEXT) readline.$(OBJEXT) \
+	search.$(OBJEXT) tokenizer.$(OBJEXT) tokenizern.$(OBJEXT) \
+	vi.$(OBJEXT) common.$(OBJEXT) emacs.$(OBJEXT) hist.$(OBJEXT) \
+	keymacro.$(OBJEXT) parse.$(OBJEXT) read.$(OBJEXT) \
+	refresh.$(OBJEXT) sig.$(OBJEXT) terminal.$(OBJEXT) \
+	tty.$(OBJEXT) help.$(OBJEXT) fcns.$(OBJEXT) \
 	filecomplete.$(OBJEXT) unvis.$(OBJEXT) strlcpy.$(OBJEXT) \
-	vis.$(OBJEXT) strlcat.$(OBJEXT) fgetln.$(OBJEXT)
+	vis.$(OBJEXT) strlcat.$(OBJEXT) fgetln.$(OBJEXT) \
+	wcsdup.$(OBJEXT)
 libedit_a_OBJECTS = $(am_libedit_a_OBJECTS)
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include
 depcomp = $(SHELL) $(top_srcdir)/depcomp
@@ -399,18 +402,18 @@ ASRC = $(srcdir)/vi.c $(srcdir)/emacs.c 
 AHDR = vi.h emacs.h common.h
 INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include
 noinst_LIBRARIES = libedit.a
-libedit_a_SOURCES = chared.c el.c history.c map.c prompt.c readline.c \
-			search.c tokenizer.c vi.c common.c emacs.c \
-			hist.c key.c parse.c read.c refresh.c sig.c term.c \
+libedit_a_SOURCES = chared.c el.c eln.c history.c historyn.c map.c prompt.c chartype.c \
+			readline.c search.c tokenizer.c tokenizern.c vi.c common.c emacs.c \
+			hist.c keymacro.c parse.c read.c refresh.c sig.c terminal.c \
 			tty.c help.c fcns.c filecomplete.c \
 			np/unvis.c np/strlcpy.c np/vis.c np/strlcat.c \
-			np/fgetln.c
+			np/fgetln.c np/wcsdup.c
 
 libedit_a_LIBADD = @LIBEDIT_LOBJECTS@
 libedit_a_DEPENDENCIES = @LIBEDIT_LOBJECTS@
 pkginclude_HEADERS = readline/readline.h
-noinst_HEADERS = chared.h el.h el_term.h histedit.h key.h parse.h refresh.h sig.h \
-			sys.h config.h hist.h map.h prompt.h read.h \
+noinst_HEADERS = chared.h chartype.h el.h el_terminal.h histedit.h keymacro.h parse.h \
+			refresh.h sig.h sys.h config.h hist.h map.h prompt.h read.h \
 			search.h tty.h filecomplete.h np/vis.h
 
 EXTRA_DIST = makelist.sh
@@ -464,8 +467,10 @@ distclean-compile:
 	-rm -f *.tab.c
 
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chared.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chartype.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/el.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eln.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/emacs.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fcns.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fgetln.Po@am__quote@
@@ -473,7 +478,8 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/help.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hist.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/history.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/key.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/historyn.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keymacro.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/map.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prompt.Po@am__quote@
@@ -484,12 +490,14 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sig.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strlcat.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strlcpy.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/term.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/terminal.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tokenizer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tokenizern.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tty.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unvis.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vi.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vis.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wcsdup.Po@am__quote@
 
 .c.o:
 @am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -582,6 +590,20 @@ fgetln.obj: np/fgetln.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fgetln.obj `if test -f 'np/fgetln.c'; then $(CYGPATH_W) 'np/fgetln.c'; else $(CYGPATH_W) '$(srcdir)/np/fgetln.c'; fi`
 
+wcsdup.o: np/wcsdup.c
+@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wcsdup.o -MD -MP -MF $(DEPDIR)/wcsdup.Tpo -c -o wcsdup.o `test -f 'np/wcsdup.c' || echo '$(srcdir)/'`np/wcsdup.c
+@am__fastdepCC_TRUE@	mv -f $(DEPDIR)/wcsdup.Tpo $(DEPDIR)/wcsdup.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='np/wcsdup.c' object='wcsdup.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wcsdup.o `test -f 'np/wcsdup.c' || echo '$(srcdir)/'`np/wcsdup.c
+
+wcsdup.obj: np/wcsdup.c
+@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wcsdup.obj -MD -MP -MF $(DEPDIR)/wcsdup.Tpo -c -o wcsdup.obj `if test -f 'np/wcsdup.c'; then $(CYGPATH_W) 'np/wcsdup.c'; else $(CYGPATH_W) '$(srcdir)/np/wcsdup.c'; fi`
+@am__fastdepCC_TRUE@	mv -f $(DEPDIR)/wcsdup.Tpo $(DEPDIR)/wcsdup.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='np/wcsdup.c' object='wcsdup.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wcsdup.obj `if test -f 'np/wcsdup.c'; then $(CYGPATH_W) 'np/wcsdup.c'; else $(CYGPATH_W) '$(srcdir)/np/wcsdup.c'; fi`
+
 mostlyclean-libtool:
 	-rm -f *.lo
 
@@ -827,22 +849,26 @@ fcns.c: ${AHDR} fcns.h makelist
 
 chared.o: vi.h emacs.h common.h help.h fcns.h
 el.o: vi.h emacs.h common.h help.h fcns.h
+eln.o: vi.h emacs.h common.h help.h fcns.h
 history.o: vi.h emacs.h common.h help.h fcns.h 
+historyn.o: vi.h emacs.h common.h help.h fcns.h 
 map.o: vi.h emacs.h common.h help.h fcns.h
+chartype.o: vi.h emacs.h common.h help.h fcns.h
 prompt.o: vi.h emacs.h common.h help.h fcns.h
 readline.o: vi.h emacs.h common.h help.h fcns.h
 search.o: vi.h emacs.h common.h help.h fcns.h
 tokenizer.o: vi.h emacs.h common.h help.h fcns.h
+tokenizern.o: vi.h emacs.h common.h help.h fcns.h
 vi.o: vi.h emacs.h common.h help.h fcns.h
 common.o: vi.h emacs.h common.h help.h fcns.h
 emacs.o: vi.h emacs.h common.h help.h fcns.h 
 hist.o: vi.h emacs.h common.h help.h fcns.h 
-key.o: vi.h emacs.h common.h help.h fcns.h 
+keymacro.o: vi.h emacs.h common.h help.h fcns.h 
 parse.o: vi.h emacs.h common.h help.h fcns.h
 read.o: vi.h emacs.h common.h help.h fcns.h
 refresh.o: vi.h emacs.h common.h help.h fcns.h
 sig.o: vi.h emacs.h common.h help.h fcns.h
-term.o: vi.h emacs.h common.h help.h fcns.h
+terminal.o: vi.h emacs.h common.h help.h fcns.h
 tty.o: vi.h emacs.h common.h help.h fcns.h 
 help.o: vi.h emacs.h common.h help.h fcns.h
 fcns.o: vi.h emacs.h common.h help.h fcns.h
diff -pruN 5.1.58-1/cmd-line-utils/libedit/makelist.sh 5.1.61-2/cmd-line-utils/libedit/makelist.sh
--- 5.1.58-1/cmd-line-utils/libedit/makelist.sh	2011-07-01 15:22:21.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/makelist.sh	2011-12-16 19:06:04.000000000 +0000
@@ -1,5 +1,5 @@
 #!/bin/sh -
-#	$NetBSD: makelist,v 1.11 2005/10/22 16:45:03 christos Exp $
+#	$NetBSD: makelist,v 1.16 2010/04/18 21:17:05 christos Exp $
 #
 # Copyright (c) 1992, 1993
 #	The Regents of the University of California.  All rights reserved.
@@ -36,7 +36,7 @@
 # makelist.sh: Automatically generate header files...
 
 AWK=@AWK@
-USAGE="Usage: $0 -h|-e|-fc|-fh|-bc|-bh|-m <filenames>"
+USAGE="Usage: $0 -n|-h|-e|-fc|-fh|-bc|-bh|-m <filenames>"
 
 if [ "x$1" = "x" ]
 then
@@ -53,6 +53,14 @@ case $FLAG in
 
 #	generate foo.h file from foo.c
 #
+-n)
+    cat << _EOF
+#undef WIDECHAR
+#define NARROWCHAR
+#include "${FILES}"
+_EOF
+    ;;
+    
 -h)
     set - `echo $FILES | sed -e 's/\\./_/g'`
     hdr="_h_`basename $1`"
@@ -70,7 +78,7 @@ case $FLAG in
 # XXX:	need a space between name and prototype so that -fc and -fh
 #	parsing is much easier
 #
-		printf("protected el_action_t\t%s (EditLine *, int);\n", name);
+		printf("protected el_action_t\t%s (EditLine *, Int);\n", name);
 	    }
 	}
 	END {
@@ -85,6 +93,7 @@ case $FLAG in
 	BEGIN {
 	    printf("/* Automatically generated file, do not edit */\n");
 	    printf("#include \"config.h\"\n#include \"el.h\"\n");
+	    printf("#include \"chartype.h\"\n");
 	    printf("private const struct el_bindings_t el_func_help[] = {\n");
 	    low = "abcdefghijklmnopqrstuvwxyz_";
 	    high = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_";
@@ -106,18 +115,18 @@ case $FLAG in
 		    fname = fname s;
 		}
 
-		printf("    { %-30.30s %-30.30s\n","\"" fname "\",", uname ",");
+		printf("    { %-30.30s %-30.30s\n","STR(\"" fname "\"),", uname ",");
 		ok = 1;
 	    }
 	}
 	/^ \*/ {
 	    if (ok) {
-		printf("      \"");
+		printf("      STR(\"");
 		for (i = 2; i < NF; i++)
 		    printf("%s ", $i);
-		# XXXMYSQL: support CRLF
+        # XXXMYSQL: support CRLF
 		sub("\r", "", $i);
-		printf("%s\" },\n", $i);
+		printf("%s\") },\n", $i);
 		ok = 0;
 	    }
 	}
@@ -157,7 +166,7 @@ case $FLAG in
 	END {
 	    printf("#define\t%-30.30s\t%3d\n", "EL_NUM_FCNS", count);
 
-	    printf("typedef el_action_t (*el_func_t)(EditLine *, int);");
+	    printf("typedef el_action_t (*el_func_t)(EditLine *, Int);");
 	    printf("\nprotected const el_func_t* func__get(void);\n");
 	    printf("#endif /* _h_fcns_c */\n");
 	}'
diff -pruN 5.1.58-1/cmd-line-utils/libedit/map.c 5.1.61-2/cmd-line-utils/libedit/map.c
--- 5.1.58-1/cmd-line-utils/libedit/map.c	2011-07-01 15:22:21.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/map.c	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: map.c,v 1.24 2006/04/09 01:36:51 christos Exp $	*/
+/*	$NetBSD: map.c,v 1.30 2011/08/16 16:25:15 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -46,10 +46,8 @@ static char sccsid[] = "@(#)map.c	8.1 (B
 #include <stdlib.h>
 #include "el.h"
 
-#define	N_KEYS 256
-
-private void	map_print_key(EditLine *, el_action_t *, const char *);
-private void	map_print_some_keys(EditLine *, el_action_t *, int, int);
+private void	map_print_key(EditLine *, el_action_t *, const Char *);
+private void	map_print_some_keys(EditLine *, el_action_t *, Int, Int);
 private void	map_print_all_keys(EditLine *);
 private void	map_init_nls(EditLine *);
 private void	map_init_meta(EditLine *);
@@ -904,26 +902,25 @@ map_init(EditLine *el)
 		EL_ABORT((el->errfile, "Vi insert map incorrect\n"));
 #endif
 
-	el->el_map.alt = (el_action_t *)el_malloc(sizeof(el_action_t) * N_KEYS);
+	el->el_map.alt = el_malloc(sizeof(*el->el_map.alt) * N_KEYS);
 	if (el->el_map.alt == NULL)
-		return (-1);
-	el->el_map.key = (el_action_t *)el_malloc(sizeof(el_action_t) * N_KEYS);
+		return -1;
+	el->el_map.key = el_malloc(sizeof(*el->el_map.key) * N_KEYS);
 	if (el->el_map.key == NULL)
-		return (-1);
+		return -1;
 	el->el_map.emacs = el_map_emacs;
 	el->el_map.vic = el_map_vi_command;
 	el->el_map.vii = el_map_vi_insert;
-	el->el_map.help = (el_bindings_t *) el_malloc(sizeof(el_bindings_t) *
-	    EL_NUM_FCNS);
+	el->el_map.help = el_malloc(sizeof(*el->el_map.help) * EL_NUM_FCNS);
 	if (el->el_map.help == NULL)
-		return (-1);
+		return -1;
 	(void) memcpy(el->el_map.help, help__get(),
-	    sizeof(el_bindings_t) * EL_NUM_FCNS);
-	el->el_map.func = (el_func_t *)el_malloc(sizeof(el_func_t) *
-	    EL_NUM_FCNS);
+	    sizeof(*el->el_map.help) * EL_NUM_FCNS);
+	el->el_map.func = el_malloc(sizeof(*el->el_map.func) * EL_NUM_FCNS);
 	if (el->el_map.func == NULL)
-		return (-1);
-	memcpy(el->el_map.func, func__get(), sizeof(el_func_t) * EL_NUM_FCNS);
+		return -1;
+	memcpy(el->el_map.func, func__get(), sizeof(*el->el_map.func)
+	    * EL_NUM_FCNS);
 	el->el_map.nfunc = EL_NUM_FCNS;
 
 #ifdef VIDEFAULT
@@ -931,7 +928,7 @@ map_init(EditLine *el)
 #else
 	map_init_emacs(el);
 #endif /* VIDEFAULT */
-	return (0);
+	return 0;
 }
 
 
@@ -942,16 +939,16 @@ protected void
 map_end(EditLine *el)
 {
 
-	el_free((ptr_t) el->el_map.alt);
+	el_free(el->el_map.alt);
 	el->el_map.alt = NULL;
-	el_free((ptr_t) el->el_map.key);
+	el_free(el->el_map.key);
 	el->el_map.key = NULL;
 	el->el_map.emacs = NULL;
 	el->el_map.vic = NULL;
 	el->el_map.vii = NULL;
-	el_free((ptr_t) el->el_map.help);
+	el_free(el->el_map.help);
 	el->el_map.help = NULL;
-	el_free((ptr_t) el->el_map.func);
+	el_free(el->el_map.func);
 	el->el_map.func = NULL;
 }
 
@@ -967,7 +964,7 @@ map_init_nls(EditLine *el)
 	el_action_t *map = el->el_map.key;
 
 	for (i = 0200; i <= 0377; i++)
-		if (el_isprint(i))
+		if (Isprint(i))
 			map[i] = ED_INSERT;
 }
 
@@ -978,7 +975,7 @@ map_init_nls(EditLine *el)
 private void
 map_init_meta(EditLine *el)
 {
-	char buf[3];
+	Char buf[3];
 	int i;
 	el_action_t *map = el->el_map.key;
 	el_action_t *alt = el->el_map.alt;
@@ -996,7 +993,7 @@ map_init_meta(EditLine *el)
 		} else
 			map = alt;
 	}
-	buf[0] = (char) i;
+	buf[0] = (Char) i;
 	buf[2] = 0;
 	for (i = 0200; i <= 0377; i++)
 		switch (map[i]) {
@@ -1006,7 +1003,7 @@ map_init_meta(EditLine *el)
 			break;
 		default:
 			buf[1] = i & 0177;
-			key_add(el, buf, key_map_cmd(el, (int) map[i]), XK_CMD);
+			keymacro_add(el, buf, keymacro_map_cmd(el, (int) map[i]), XK_CMD);
 			break;
 		}
 	map[(int) buf[0]] = ED_SEQUENCE_LEAD_IN;
@@ -1028,7 +1025,7 @@ map_init_vi(EditLine *el)
 	el->el_map.type = MAP_VI;
 	el->el_map.current = el->el_map.key;
 
-	key_reset(el);
+	keymacro_reset(el);
 
 	for (i = 0; i < N_KEYS; i++) {
 		key[i] = vii[i];
@@ -1039,7 +1036,7 @@ map_init_vi(EditLine *el)
 	map_init_nls(el);
 
 	tty_bind_char(el, 1);
-	term_bind_arrow(el);
+	terminal_bind_arrow(el);
 }
 
 
@@ -1050,14 +1047,14 @@ protected void
 map_init_emacs(EditLine *el)
 {
 	int i;
-	char buf[3];
+	Char buf[3];
 	el_action_t *key = el->el_map.key;
 	el_action_t *alt = el->el_map.alt;
 	const el_action_t *emacs = el->el_map.emacs;
 
 	el->el_map.type = MAP_EMACS;
 	el->el_map.current = el->el_map.key;
-	key_reset(el);
+	keymacro_reset(el);
 
 	for (i = 0; i < N_KEYS; i++) {
 		key[i] = emacs[i];
@@ -1070,10 +1067,10 @@ map_init_emacs(EditLine *el)
 	buf[0] = CONTROL('X');
 	buf[1] = CONTROL('X');
 	buf[2] = 0;
-	key_add(el, buf, key_map_cmd(el, EM_EXCHANGE_MARK), XK_CMD);
+	keymacro_add(el, buf, keymacro_map_cmd(el, EM_EXCHANGE_MARK), XK_CMD);
 
 	tty_bind_char(el, 1);
-	term_bind_arrow(el);
+	terminal_bind_arrow(el);
 }
 
 
@@ -1081,18 +1078,18 @@ map_init_emacs(EditLine *el)
  *	Set the editor
  */
 protected int
-map_set_editor(EditLine *el, char *editor)
+map_set_editor(EditLine *el, Char *editor)
 {
 
-	if (strcmp(editor, "emacs") == 0) {
+	if (Strcmp(editor, STR("emacs")) == 0) {
 		map_init_emacs(el);
-		return (0);
+		return 0;
 	}
-	if (strcmp(editor, "vi") == 0) {
+	if (Strcmp(editor, STR("vi")) == 0) {
 		map_init_vi(el);
-		return (0);
+		return 0;
 	}
-	return (-1);
+	return -1;
 }
 
 
@@ -1100,20 +1097,20 @@ map_set_editor(EditLine *el, char *edito
  *	Retrieve the editor
  */
 protected int
-map_get_editor(EditLine *el, const char **editor)
+map_get_editor(EditLine *el, const Char **editor)
 {
 
 	if (editor == NULL)
-		return (-1);
+		return -1;
 	switch (el->el_map.type) {
 	case MAP_EMACS:
-		*editor = "emacs";
-		return (0);
+		*editor = STR("emacs");
+		return 0;
 	case MAP_VI:
-		*editor = "vi";
-		return (0);
+		*editor = STR("vi");
+		return 0;
 	}
-	return (-1);
+	return -1;
 }
 
 
@@ -1121,22 +1118,22 @@ map_get_editor(EditLine *el, const char 
  *	Print the function description for 1 key
  */
 private void
-map_print_key(EditLine *el, el_action_t *map, const char *in)
+map_print_key(EditLine *el, el_action_t *map, const Char *in)
 {
 	char outbuf[EL_BUFSIZ];
 	el_bindings_t *bp, *ep;
 
 	if (in[0] == '\0' || in[1] == '\0') {
-		(void) key__decode_str(in, outbuf, sizeof(outbuf), "");
+		(void) keymacro__decode_str(in, outbuf, sizeof(outbuf), "");
 		ep = &el->el_map.help[el->el_map.nfunc];
 		for (bp = el->el_map.help; bp < ep; bp++)
 			if (bp->func == map[(unsigned char) *in]) {
 				(void) fprintf(el->el_outfile,
-				    "%s\t->\t%s\n", outbuf, bp->name);
+				    "%s\t->\t" FSTR "\n", outbuf, bp->name);
 				return;
 			}
 	} else
-		key_print(el, in);
+		keymacro_print(el, in);
 }
 
 
@@ -1144,10 +1141,10 @@ map_print_key(EditLine *el, el_action_t 
  *	Print keys from first to last
  */
 private void
-map_print_some_keys(EditLine *el, el_action_t *map, int first, int last)
+map_print_some_keys(EditLine *el, el_action_t *map, Int first, Int last)
 {
 	el_bindings_t *bp, *ep;
-	char firstbuf[2], lastbuf[2];
+	Char firstbuf[2], lastbuf[2];
 	char unparsbuf[EL_BUFSIZ], extrabuf[EL_BUFSIZ];
 
 	firstbuf[0] = first;
@@ -1156,7 +1153,7 @@ map_print_some_keys(EditLine *el, el_act
 	lastbuf[1] = 0;
 	if (map[first] == ED_UNASSIGNED) {
 		if (first == last) {
-			(void) key__decode_str(firstbuf, unparsbuf, 
+			(void) keymacro__decode_str(firstbuf, unparsbuf, 
 			    sizeof(unparsbuf), STRQQ);
 			(void) fprintf(el->el_outfile,
 			    "%-15s->  is undefined\n", unparsbuf);
@@ -1167,17 +1164,17 @@ map_print_some_keys(EditLine *el, el_act
 	for (bp = el->el_map.help; bp < ep; bp++) {
 		if (bp->func == map[first]) {
 			if (first == last) {
-				(void) key__decode_str(firstbuf, unparsbuf, 
+				(void) keymacro__decode_str(firstbuf, unparsbuf, 
 				    sizeof(unparsbuf), STRQQ);
-				(void) fprintf(el->el_outfile, "%-15s->  %s\n",
+				(void) fprintf(el->el_outfile, "%-15s->  " FSTR "\n",
 				    unparsbuf, bp->name);
 			} else {
-				(void) key__decode_str(firstbuf, unparsbuf, 
+				(void) keymacro__decode_str(firstbuf, unparsbuf, 
 				    sizeof(unparsbuf), STRQQ);
-				(void) key__decode_str(lastbuf, extrabuf, 
+				(void) keymacro__decode_str(lastbuf, extrabuf, 
 				    sizeof(extrabuf), STRQQ);
 				(void) fprintf(el->el_outfile,
-				    "%-4s to %-7s->  %s\n",
+				    "%-4s to %-7s->  " FSTR "\n",
 				    unparsbuf, extrabuf, bp->name);
 			}
 			return;
@@ -1185,14 +1182,14 @@ map_print_some_keys(EditLine *el, el_act
 	}
 #ifdef MAP_DEBUG
 	if (map == el->el_map.key) {
-		(void) key__decode_str(firstbuf, unparsbuf, 
+		(void) keymacro__decode_str(firstbuf, unparsbuf, 
 		    sizeof(unparsbuf), STRQQ);
 		(void) fprintf(el->el_outfile,
 		    "BUG!!! %s isn't bound to anything.\n", unparsbuf);
 		(void) fprintf(el->el_outfile, "el->el_map.key[%d] == %d\n",
 		    first, el->el_map.key[first]);
 	} else {
-		(void) key__decode_str(firstbuf, unparsbuf, 
+		(void) keymacro__decode_str(firstbuf, unparsbuf, 
 		    sizeof(unparsbuf), STRQQ);
 		(void) fprintf(el->el_outfile,
 		    "BUG!!! %s isn't bound to anything.\n", unparsbuf);
@@ -1233,9 +1230,9 @@ map_print_all_keys(EditLine *el)
 	map_print_some_keys(el, el->el_map.alt, prev, i - 1);
 
 	(void) fprintf(el->el_outfile, "Multi-character bindings\n");
-	key_print(el, "");
+	keymacro_print(el, STR(""));
 	(void) fprintf(el->el_outfile, "Arrow key bindings\n");
-	term_print_arrow(el, "");
+	terminal_print_arrow(el, STR(""));
 }
 
 
@@ -1243,21 +1240,21 @@ map_print_all_keys(EditLine *el)
  *	Add/remove/change bindings
  */
 protected int
-map_bind(EditLine *el, int argc, const char **argv)
+map_bind(EditLine *el, int argc, const Char **argv)
 {
 	el_action_t *map;
 	int ntype, rem;
-	const char *p;
-	char inbuf[EL_BUFSIZ];
-	char outbuf[EL_BUFSIZ];
-	const char *in = NULL;
-	char *out = NULL;
+	const Char *p;
+	Char inbuf[EL_BUFSIZ];
+	Char outbuf[EL_BUFSIZ];
+	const Char *in = NULL;
+	Char *out = NULL;
 	el_bindings_t *bp, *ep;
 	int cmd;
 	int key;
 
 	if (argv == NULL)
-		return (-1);
+		return -1;
 
 	map = el->el_map.key;
 	ntype = XK_CMD;
@@ -1287,22 +1284,22 @@ map_bind(EditLine *el, int argc, const c
 
 			case 'v':
 				map_init_vi(el);
-				return (0);
+				return 0;
 
 			case 'e':
 				map_init_emacs(el);
-				return (0);
+				return 0;
 
 			case 'l':
 				ep = &el->el_map.help[el->el_map.nfunc];
 				for (bp = el->el_map.help; bp < ep; bp++)
 					(void) fprintf(el->el_outfile,
-					    "%s\n\t%s\n",
+					    "" FSTR "\n\t" FSTR "\n",
 					    bp->name, bp->description);
-				return (0);
+				return 0;
 			default:
 				(void) fprintf(el->el_errfile,
-				    "%s: Invalid switch `%c'.\n",
+				    "" FSTR ": Invalid switch `%c'.\n",
 				    argv[0], p[1]);
 			}
 		else
@@ -1310,40 +1307,40 @@ map_bind(EditLine *el, int argc, const c
 
 	if (argv[argc] == NULL) {
 		map_print_all_keys(el);
-		return (0);
+		return 0;
 	}
 	if (key)
 		in = argv[argc++];
 	else if ((in = parse__string(inbuf, argv[argc++])) == NULL) {
 		(void) fprintf(el->el_errfile,
-		    "%s: Invalid \\ or ^ in instring.\n",
+		    "" FSTR ": Invalid \\ or ^ in instring.\n",
 		    argv[0]);
-		return (-1);
+		return -1;
 	}
 	if (rem) {
 		if (key) {
-			(void) term_clear_arrow(el, in);
-			return (-1);
+			(void) terminal_clear_arrow(el, in);
+			return -1;
 		}
 		if (in[1])
-			(void) key_delete(el, in);
+			(void) keymacro_delete(el, in);
 		else if (map[(unsigned char) *in] == ED_SEQUENCE_LEAD_IN)
-			(void) key_delete(el, in);
+			(void) keymacro_delete(el, in);
 		else
 			map[(unsigned char) *in] = ED_UNASSIGNED;
-		return (0);
+		return 0;
 	}
 	if (argv[argc] == NULL) {
 		if (key)
-			term_print_arrow(el, in);
+			terminal_print_arrow(el, in);
 		else
 			map_print_key(el, map, in);
-		return (0);
+		return 0;
 	}
 #ifdef notyet
 	if (argv[argc + 1] != NULL) {
-		bindkey_usage();
-		return (-1);
+		bindkeymacro_usage();
+		return -1;
 	}
 #endif
 
@@ -1352,31 +1349,32 @@ map_bind(EditLine *el, int argc, const c
 	case XK_EXE:
 		if ((out = parse__string(outbuf, argv[argc])) == NULL) {
 			(void) fprintf(el->el_errfile,
-			    "%s: Invalid \\ or ^ in outstring.\n", argv[0]);
-			return (-1);
+			    "" FSTR ": Invalid \\ or ^ in outstring.\n", argv[0]);
+			return -1;
 		}
 		if (key)
-			term_set_arrow(el, in, key_map_str(el, out), ntype);
+			terminal_set_arrow(el, in, keymacro_map_str(el, out), ntype);
 		else
-			key_add(el, in, key_map_str(el, out), ntype);
+			keymacro_add(el, in, keymacro_map_str(el, out), ntype);
 		map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN;
 		break;
 
 	case XK_CMD:
 		if ((cmd = parse_cmd(el, argv[argc])) == -1) {
 			(void) fprintf(el->el_errfile,
-			    "%s: Invalid command `%s'.\n", argv[0], argv[argc]);
-			return (-1);
+			    "" FSTR ": Invalid command `" FSTR "'.\n",
+			    argv[0], argv[argc]);
+			return -1;
 		}
 		if (key)
-			term_set_arrow(el, in, key_map_str(el, out), ntype);
+			terminal_set_arrow(el, in, keymacro_map_str(el, out), ntype);
 		else {
 			if (in[1]) {
-				key_add(el, in, key_map_cmd(el, cmd), ntype);
+				keymacro_add(el, in, keymacro_map_cmd(el, cmd), ntype);
 				map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN;
 			} else {
-				key_clear(el, map, in);
-				map[(unsigned char) *in] = cmd;
+				keymacro_clear(el, map, in);
+				map[(unsigned char) *in] = (el_action_t)cmd;
 			}
 		}
 		break;
@@ -1385,7 +1383,7 @@ map_bind(EditLine *el, int argc, const c
 		EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype));
 		break;
 	}
-	return (0);
+	return 0;
 }
 
 
@@ -1393,29 +1391,30 @@ map_bind(EditLine *el, int argc, const c
  *	add a user defined function
  */
 protected int
-map_addfunc(EditLine *el, const char *name, const char *help, el_func_t func)
+map_addfunc(EditLine *el, const Char *name, const Char *help, el_func_t func)
 {
 	void *p;
-	int nf = el->el_map.nfunc + 1;
+	size_t nf = (size_t)el->el_map.nfunc + 1;
 
 	if (name == NULL || help == NULL || func == NULL)
-		return (-1);
+		return -1;
 
-	if ((p = el_realloc(el->el_map.func, nf * sizeof(el_func_t))) == NULL)
-		return (-1);
-	el->el_map.func = (el_func_t *) p;
-	if ((p = el_realloc(el->el_map.help, nf * sizeof(el_bindings_t)))
+	if ((p = el_realloc(el->el_map.func, nf *
+	    sizeof(*el->el_map.func))) == NULL)
+		return -1;
+	el->el_map.func = p;
+	if ((p = el_realloc(el->el_map.help, nf * sizeof(*el->el_map.help)))
 	    == NULL)
-		return (-1);
-	el->el_map.help = (el_bindings_t *) p;
+		return -1;
+	el->el_map.help = p;
 
-	nf = el->el_map.nfunc;
+	nf = (size_t)el->el_map.nfunc;
 	el->el_map.func[nf] = func;
 
 	el->el_map.help[nf].name = name;
-	el->el_map.help[nf].func = nf;
+	el->el_map.help[nf].func = (int)nf;
 	el->el_map.help[nf].description = help;
 	el->el_map.nfunc++;
 
-	return (0);
+	return 0;
 }
diff -pruN 5.1.58-1/cmd-line-utils/libedit/map.h 5.1.61-2/cmd-line-utils/libedit/map.h
--- 5.1.58-1/cmd-line-utils/libedit/map.h	2011-07-01 15:22:21.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/map.h	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: map.h,v 1.8 2003/08/07 16:44:32 agc Exp $	*/
+/*	$NetBSD: map.h,v 1.9 2009/12/30 22:37:40 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -41,9 +41,9 @@
 #define	_h_el_map
 
 typedef struct el_bindings_t {	/* for the "bind" shell command */
-	const char	*name;		/* function name for bind command */
+	const Char	*name;		/* function name for bind command */
 	int		 func;		/* function numeric value */
-	const char	*description;	/* description of function */
+	const Char	*description;	/* description of function */
 } el_bindings_t;
 
 
@@ -63,13 +63,15 @@ typedef struct el_map_t {
 #define	MAP_EMACS	0
 #define	MAP_VI		1
 
-protected int	map_bind(EditLine *, int, const char **);
+#define N_KEYS      256
+
+protected int	map_bind(EditLine *, int, const Char **);
 protected int	map_init(EditLine *);
 protected void	map_end(EditLine *);
 protected void	map_init_vi(EditLine *);
 protected void	map_init_emacs(EditLine *);
-protected int	map_set_editor(EditLine *, char *);
-protected int	map_get_editor(EditLine *, const char **);
-protected int	map_addfunc(EditLine *, const char *, const char *, el_func_t);
+protected int	map_set_editor(EditLine *, Char *);
+protected int	map_get_editor(EditLine *, const Char **);
+protected int	map_addfunc(EditLine *, const Char *, const Char *, el_func_t);
 
 #endif /* _h_el_map */
diff -pruN 5.1.58-1/cmd-line-utils/libedit/np/strlcpy.c 5.1.61-2/cmd-line-utils/libedit/np/strlcpy.c
--- 5.1.58-1/cmd-line-utils/libedit/np/strlcpy.c	2011-07-01 15:22:23.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/np/strlcpy.c	2011-12-16 19:06:04.000000000 +0000
@@ -23,6 +23,7 @@
 #else
 #include "config.h"
 #endif
+
 #if defined(LIBC_SCCS) && !defined(lint)
 #endif /* LIBC_SCCS and not lint */
 
diff -pruN 5.1.58-1/cmd-line-utils/libedit/np/unvis.c 5.1.61-2/cmd-line-utils/libedit/np/unvis.c
--- 5.1.58-1/cmd-line-utils/libedit/np/unvis.c	2011-07-01 15:22:23.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/np/unvis.c	2011-12-16 19:06:10.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: unvis.c,v 1.28 2005/09/13 01:44:09 christos Exp $	*/
+/*	$NetBSD: unvis.c,v 1.36 2011/03/18 09:07:20 martin Exp $	*/
 
 /*-
  * Copyright (c) 1989, 1993
@@ -38,19 +38,33 @@ static char sccsid[] = "@(#)unvis.c	8.1 
 #endif
 #endif /* LIBC_SCCS and not lint */
 
+/* XXXMYSQL : Make compiler happy. */
+#ifdef _LIBC
+#include "namespace.h"
+#endif
+
 #include <sys/types.h>
 
 #include <assert.h>
 #include <ctype.h>
-#include <stdio.h>
-#ifdef HAVE_VIS_H
-#include <vis.h>
+
+/* XXXMYSQL : stdint.h might not be available on older Solaris platforms. */
+#if defined(__sun) || defined(__sun__)
+#include <sys/inttypes.h>
 #else
-#include "np/vis.h"
+#include <stdint.h>
 #endif
 
+#include <stdio.h>
+#include <errno.h>
+/*
+  XXXMYSQL : Due to different versions of vis.h available,
+             use the one bundled with libedit.
+*/
+#include "np/vis.h"
+
 #ifdef __weak_alias
-__weak_alias(strunvis,_strunvis)
+__weak_alias(strnunvisx,_strnunvisx)
 #endif
 
 #if !HAVE_VIS
@@ -64,143 +78,276 @@ __weak_alias(strunvis,_strunvis)
 #define	S_CTRL		4	/* control char started (^) */
 #define	S_OCTAL2	5	/* octal digit 2 */
 #define	S_OCTAL3	6	/* octal digit 3 */
-#define	S_HEX1		7	/* hex digit */
-#define	S_HEX2		8	/* hex digit 2 */
+#define	S_HEX1		7	/* http hex digit */
+#define	S_HEX2		8	/* http hex digit 2 */
+#define S_MIME1		9	/* mime hex digit 1 */
+#define S_MIME2		10	/* mime hex digit 2 */
+#define S_EATCRNL	11	/* mime eating CRNL */
+#define S_AMP		12	/* seen & */
+#define S_NUMBER	13	/* collecting number */
+#define S_STRING	14	/* collecting string */
 
 #define	isoctal(c)	(((u_char)(c)) >= '0' && ((u_char)(c)) <= '7')
 #define xtod(c)		(isdigit(c) ? (c - '0') : ((tolower(c) - 'a') + 10))
+#define XTOD(c)		(isdigit(c) ? (c - '0') : ((c - 'A') + 10))
+
+/*
+ * RFC 1866
+ */
+static const struct nv {
+	const char *name;
+	uint8_t value;
+} nv[] = {
+	{ "AElig",	198 }, /* capital AE diphthong (ligature)  */
+	{ "Aacute",	193 }, /* capital A, acute accent  */
+	{ "Acirc",	194 }, /* capital A, circumflex accent  */
+	{ "Agrave",	192 }, /* capital A, grave accent  */
+	{ "Aring",	197 }, /* capital A, ring  */
+	{ "Atilde",	195 }, /* capital A, tilde  */
+	{ "Auml",	196 }, /* capital A, dieresis or umlaut mark  */
+	{ "Ccedil",	199 }, /* capital C, cedilla  */
+	{ "ETH",	208 }, /* capital Eth, Icelandic  */
+	{ "Eacute",	201 }, /* capital E, acute accent  */
+	{ "Ecirc",	202 }, /* capital E, circumflex accent  */
+	{ "Egrave",	200 }, /* capital E, grave accent  */
+	{ "Euml",	203 }, /* capital E, dieresis or umlaut mark  */
+	{ "Iacute",	205 }, /* capital I, acute accent  */
+	{ "Icirc",	206 }, /* capital I, circumflex accent  */
+	{ "Igrave",	204 }, /* capital I, grave accent  */
+	{ "Iuml",	207 }, /* capital I, dieresis or umlaut mark  */
+	{ "Ntilde",	209 }, /* capital N, tilde  */
+	{ "Oacute",	211 }, /* capital O, acute accent  */
+	{ "Ocirc",	212 }, /* capital O, circumflex accent  */
+	{ "Ograve",	210 }, /* capital O, grave accent  */
+	{ "Oslash",	216 }, /* capital O, slash  */
+	{ "Otilde",	213 }, /* capital O, tilde  */
+	{ "Ouml",	214 }, /* capital O, dieresis or umlaut mark  */
+	{ "THORN",	222 }, /* capital THORN, Icelandic  */
+	{ "Uacute",	218 }, /* capital U, acute accent  */
+	{ "Ucirc",	219 }, /* capital U, circumflex accent  */
+	{ "Ugrave",	217 }, /* capital U, grave accent  */
+	{ "Uuml",	220 }, /* capital U, dieresis or umlaut mark  */
+	{ "Yacute",	221 }, /* capital Y, acute accent  */
+	{ "aacute",	225 }, /* small a, acute accent  */
+	{ "acirc",	226 }, /* small a, circumflex accent  */
+	{ "acute",	180 }, /* acute accent  */
+	{ "aelig",	230 }, /* small ae diphthong (ligature)  */
+	{ "agrave",	224 }, /* small a, grave accent  */
+	{ "amp",	 38 }, /* ampersand  */
+	{ "aring",	229 }, /* small a, ring  */
+	{ "atilde",	227 }, /* small a, tilde  */
+	{ "auml",	228 }, /* small a, dieresis or umlaut mark  */
+	{ "brvbar",	166 }, /* broken (vertical) bar  */
+	{ "ccedil",	231 }, /* small c, cedilla  */
+	{ "cedil",	184 }, /* cedilla  */
+	{ "cent",	162 }, /* cent sign  */
+	{ "copy",	169 }, /* copyright sign  */
+	{ "curren",	164 }, /* general currency sign  */
+	{ "deg",	176 }, /* degree sign  */
+	{ "divide",	247 }, /* divide sign  */
+	{ "eacute",	233 }, /* small e, acute accent  */
+	{ "ecirc",	234 }, /* small e, circumflex accent  */
+	{ "egrave",	232 }, /* small e, grave accent  */
+	{ "eth",	240 }, /* small eth, Icelandic  */
+	{ "euml",	235 }, /* small e, dieresis or umlaut mark  */
+	{ "frac12",	189 }, /* fraction one-half  */
+	{ "frac14",	188 }, /* fraction one-quarter  */
+	{ "frac34",	190 }, /* fraction three-quarters  */
+	{ "gt",		 62 }, /* greater than  */
+	{ "iacute",	237 }, /* small i, acute accent  */
+	{ "icirc",	238 }, /* small i, circumflex accent  */
+	{ "iexcl",	161 }, /* inverted exclamation mark  */
+	{ "igrave",	236 }, /* small i, grave accent  */
+	{ "iquest",	191 }, /* inverted question mark  */
+	{ "iuml",	239 }, /* small i, dieresis or umlaut mark  */
+	{ "laquo",	171 }, /* angle quotation mark, left  */
+	{ "lt",		 60 }, /* less than  */
+	{ "macr",	175 }, /* macron  */
+	{ "micro",	181 }, /* micro sign  */
+	{ "middot",	183 }, /* middle dot  */
+	{ "nbsp",	160 }, /* no-break space  */
+	{ "not",	172 }, /* not sign  */
+	{ "ntilde",	241 }, /* small n, tilde  */
+	{ "oacute",	243 }, /* small o, acute accent  */
+	{ "ocirc",	244 }, /* small o, circumflex accent  */
+	{ "ograve",	242 }, /* small o, grave accent  */
+	{ "ordf",	170 }, /* ordinal indicator, feminine  */
+	{ "ordm",	186 }, /* ordinal indicator, masculine  */
+	{ "oslash",	248 }, /* small o, slash  */
+	{ "otilde",	245 }, /* small o, tilde  */
+	{ "ouml",	246 }, /* small o, dieresis or umlaut mark  */
+	{ "para",	182 }, /* pilcrow (paragraph sign)  */
+	{ "plusmn",	177 }, /* plus-or-minus sign  */
+	{ "pound",	163 }, /* pound sterling sign  */
+	{ "quot",	 34 }, /* double quote  */
+	{ "raquo",	187 }, /* angle quotation mark, right  */
+	{ "reg",	174 }, /* registered sign  */
+	{ "sect",	167 }, /* section sign  */
+	{ "shy",	173 }, /* soft hyphen  */
+	{ "sup1",	185 }, /* superscript one  */
+	{ "sup2",	178 }, /* superscript two  */
+	{ "sup3",	179 }, /* superscript three  */
+	{ "szlig",	223 }, /* small sharp s, German (sz ligature)  */
+	{ "thorn",	254 }, /* small thorn, Icelandic  */
+	{ "times",	215 }, /* multiply sign  */
+	{ "uacute",	250 }, /* small u, acute accent  */
+	{ "ucirc",	251 }, /* small u, circumflex accent  */
+	{ "ugrave",	249 }, /* small u, grave accent  */
+	{ "uml",	168 }, /* umlaut (dieresis)  */
+	{ "uuml",	252 }, /* small u, dieresis or umlaut mark  */
+	{ "yacute",	253 }, /* small y, acute accent  */
+	{ "yen",	165 }, /* yen sign  */
+	{ "yuml",	255 }, /* small y, dieresis or umlaut mark  */
+};
 
 /*
  * unvis - decode characters previously encoded by vis
  */
 int
-unvis(cp, c, astate, flag)
-	char *cp;
-	int c;
-	int *astate, flag;
+unvis(char *cp, int c, int *astate, int flag)
 {
 	unsigned char uc = (unsigned char)c;
+	unsigned char st, ia, is, lc;
+
+/*
+ * Bottom 8 bits of astate hold the state machine state.
+ * Top 8 bits hold the current character in the http 1866 nv string decoding
+ */
+#define GS(a)		((a) & 0xff)
+#define SS(a, b)	(((uint32_t)(a) << 24) | (b))
+#define GI(a)		((uint32_t)(a) >> 24)
 
 	_DIAGASSERT(cp != NULL);
 	_DIAGASSERT(astate != NULL);
+	st = GS(*astate);
 
 	if (flag & UNVIS_END) {
-		if (*astate == S_OCTAL2 || *astate == S_OCTAL3
-		    || *astate == S_HEX2) {
-			*astate = S_GROUND;
-			return (UNVIS_VALID);
+		switch (st) {
+		case S_OCTAL2:
+		case S_OCTAL3:
+		case S_HEX2:
+			*astate = SS(0, S_GROUND);
+			return UNVIS_VALID;
+		case S_GROUND:
+			return UNVIS_NOCHAR;
+		default:
+			return UNVIS_SYNBAD;
 		}
-		return (*astate == S_GROUND ? UNVIS_NOCHAR : UNVIS_SYNBAD);
 	}
 
-	switch (*astate) {
+	switch (st) {
 
 	case S_GROUND:
 		*cp = 0;
-		if (c == '\\') {
-			*astate = S_START;
-			return (0);
-		}
-		if ((flag & VIS_HTTPSTYLE) && c == '%') {
-			*astate = S_HEX1;
-			return (0);
+		if ((flag & VIS_NOESCAPE) == 0 && c == '\\') {
+			*astate = SS(0, S_START);
+			return UNVIS_NOCHAR;
+		}
+		if ((flag & VIS_HTTP1808) && c == '%') {
+			*astate = SS(0, S_HEX1);
+			return UNVIS_NOCHAR;
+		}
+		if ((flag & VIS_HTTP1866) && c == '&') {
+			*astate = SS(0, S_AMP);
+			return UNVIS_NOCHAR;
+		}
+		if ((flag & VIS_MIMESTYLE) && c == '=') {
+			*astate = SS(0, S_MIME1);
+			return UNVIS_NOCHAR;
 		}
 		*cp = c;
-		return (UNVIS_VALID);
+		return UNVIS_VALID;
 
 	case S_START:
 		switch(c) {
 		case '\\':
 			*cp = c;
-			*astate = S_GROUND;
-			return (UNVIS_VALID);
+			*astate = SS(0, S_GROUND);
+			return UNVIS_VALID;
 		case '0': case '1': case '2': case '3':
 		case '4': case '5': case '6': case '7':
 			*cp = (c - '0');
-			*astate = S_OCTAL2;
-			return (0);
+			*astate = SS(0, S_OCTAL2);
+			return UNVIS_NOCHAR;
 		case 'M':
 			*cp = (char)0200;
-			*astate = S_META;
-			return (0);
+			*astate = SS(0, S_META);
+			return UNVIS_NOCHAR;
 		case '^':
-			*astate = S_CTRL;
-			return (0);
+			*astate = SS(0, S_CTRL);
+			return UNVIS_NOCHAR;
 		case 'n':
 			*cp = '\n';
-			*astate = S_GROUND;
-			return (UNVIS_VALID);
+			*astate = SS(0, S_GROUND);
+			return UNVIS_VALID;
 		case 'r':
 			*cp = '\r';
-			*astate = S_GROUND;
-			return (UNVIS_VALID);
+			*astate = SS(0, S_GROUND);
+			return UNVIS_VALID;
 		case 'b':
 			*cp = '\b';
-			*astate = S_GROUND;
-			return (UNVIS_VALID);
+			*astate = SS(0, S_GROUND);
+			return UNVIS_VALID;
 		case 'a':
 			*cp = '\007';
-			*astate = S_GROUND;
-			return (UNVIS_VALID);
+			*astate = SS(0, S_GROUND);
+			return UNVIS_VALID;
 		case 'v':
 			*cp = '\v';
-			*astate = S_GROUND;
-			return (UNVIS_VALID);
+			*astate = SS(0, S_GROUND);
+			return UNVIS_VALID;
 		case 't':
 			*cp = '\t';
-			*astate = S_GROUND;
-			return (UNVIS_VALID);
+			*astate = SS(0, S_GROUND);
+			return UNVIS_VALID;
 		case 'f':
 			*cp = '\f';
-			*astate = S_GROUND;
-			return (UNVIS_VALID);
+			*astate = SS(0, S_GROUND);
+			return UNVIS_VALID;
 		case 's':
 			*cp = ' ';
-			*astate = S_GROUND;
-			return (UNVIS_VALID);
+			*astate = SS(0, S_GROUND);
+			return UNVIS_VALID;
 		case 'E':
 			*cp = '\033';
-			*astate = S_GROUND;
-			return (UNVIS_VALID);
+			*astate = SS(0, S_GROUND);
+			return UNVIS_VALID;
 		case '\n':
 			/*
 			 * hidden newline
 			 */
-			*astate = S_GROUND;
-			return (UNVIS_NOCHAR);
+			*astate = SS(0, S_GROUND);
+			return UNVIS_NOCHAR;
 		case '$':
 			/*
 			 * hidden marker
 			 */
-			*astate = S_GROUND;
-			return (UNVIS_NOCHAR);
+			*astate = SS(0, S_GROUND);
+			return UNVIS_NOCHAR;
 		}
-		*astate = S_GROUND;
-		return (UNVIS_SYNBAD);
+		goto bad;
 
 	case S_META:
 		if (c == '-')
-			*astate = S_META1;
+			*astate = SS(0, S_META1);
 		else if (c == '^')
-			*astate = S_CTRL;
-		else {
-			*astate = S_GROUND;
-			return (UNVIS_SYNBAD);
-		}
-		return (0);
+			*astate = SS(0, S_CTRL);
+		else 
+			goto bad;
+		return UNVIS_NOCHAR;
 
 	case S_META1:
-		*astate = S_GROUND;
+		*astate = SS(0, S_GROUND);
 		*cp |= c;
-		return (UNVIS_VALID);
+		return UNVIS_VALID;
 
 	case S_CTRL:
 		if (c == '?')
 			*cp |= 0177;
 		else
 			*cp |= c & 037;
-		*astate = S_GROUND;
-		return (UNVIS_VALID);
+		*astate = SS(0, S_GROUND);
+		return UNVIS_VALID;
 
 	case S_OCTAL2:	/* second possible octal digit */
 		if (isoctal(uc)) {
@@ -208,102 +355,206 @@ unvis(cp, c, astate, flag)
 			 * yes - and maybe a third
 			 */
 			*cp = (*cp << 3) + (c - '0');
-			*astate = S_OCTAL3;
-			return (0);
+			*astate = SS(0, S_OCTAL3);
+			return UNVIS_NOCHAR;
 		}
 		/*
 		 * no - done with current sequence, push back passed char
 		 */
-		*astate = S_GROUND;
-		return (UNVIS_VALIDPUSH);
+		*astate = SS(0, S_GROUND);
+		return UNVIS_VALIDPUSH;
 
 	case S_OCTAL3:	/* third possible octal digit */
-		*astate = S_GROUND;
+		*astate = SS(0, S_GROUND);
 		if (isoctal(uc)) {
 			*cp = (*cp << 3) + (c - '0');
-			return (UNVIS_VALID);
+			return UNVIS_VALID;
 		}
 		/*
 		 * we were done, push back passed char
 		 */
-		return (UNVIS_VALIDPUSH);
+		return UNVIS_VALIDPUSH;
 
 	case S_HEX1:
 		if (isxdigit(uc)) {
 			*cp = xtod(uc);
-			*astate = S_HEX2;
-			return (0);
+			*astate = SS(0, S_HEX2);
+			return UNVIS_NOCHAR;
 		}
 		/*
 		 * no - done with current sequence, push back passed char
 		 */
-		*astate = S_GROUND;
-		return (UNVIS_VALIDPUSH);
+		*astate = SS(0, S_GROUND);
+		return UNVIS_VALIDPUSH;
 
 	case S_HEX2:
 		*astate = S_GROUND;
 		if (isxdigit(uc)) {
 			*cp = xtod(uc) | (*cp << 4);
-			return (UNVIS_VALID);
+			return UNVIS_VALID;
+		}
+		return UNVIS_VALIDPUSH;
+
+	case S_MIME1:
+		if (uc == '\n' || uc == '\r') {
+			*astate = SS(0, S_EATCRNL);
+			return UNVIS_NOCHAR;
+		}
+		if (isxdigit(uc) && (isdigit(uc) || isupper(uc))) {
+			*cp = XTOD(uc);
+			*astate = SS(0, S_MIME2);
+			return UNVIS_NOCHAR;
+		}
+		goto bad;
+
+	case S_MIME2:
+		if (isxdigit(uc) && (isdigit(uc) || isupper(uc))) {
+			*astate = SS(0, S_GROUND);
+			*cp = XTOD(uc) | (*cp << 4);
+			return UNVIS_VALID;
+		}
+		goto bad;
+
+	case S_EATCRNL:
+		switch (uc) {
+		case '\r':
+		case '\n':
+			return UNVIS_NOCHAR;
+		case '=':
+			*astate = SS(0, S_MIME1);
+			return UNVIS_NOCHAR;
+		default:
+			*cp = uc;
+			*astate = SS(0, S_GROUND);
+			return UNVIS_VALID;
+		}
+
+	case S_AMP:
+		*cp = 0;
+		if (uc == '#') {
+			*astate = SS(0, S_NUMBER);
+			return UNVIS_NOCHAR;
 		}
-		return (UNVIS_VALIDPUSH);
+		*astate = SS(0, S_STRING);
+		/*FALLTHROUGH*/
+
+	case S_STRING:
+		ia = *cp;		/* index in the array */
+		is = GI(*astate);	/* index in the string */
+		lc = is == 0 ? 0 : nv[ia].name[is - 1];	/* last character */
+
+		if (uc == ';')
+			uc = '\0';
+
+		for (; ia < __arraycount(nv); ia++) {
+			if (is != 0 && nv[ia].name[is - 1] != lc)
+				goto bad;
+			if (nv[ia].name[is] == uc)
+				break;
+		}
+
+		if (ia == __arraycount(nv))
+			goto bad;
+
+		if (uc != 0) {
+			*cp = ia;
+			*astate = SS(is + 1, S_STRING);
+			return UNVIS_NOCHAR;
+		}
+
+		*cp = nv[ia].value;
+		*astate = SS(0, S_GROUND);
+		return UNVIS_VALID;
+
+	case S_NUMBER:
+		if (uc == ';')
+			return UNVIS_VALID;
+		if (!isdigit(uc))
+			goto bad;
+		*cp += (*cp * 10) + uc - '0';
+		return UNVIS_NOCHAR;
 
 	default:
+	bad:
 		/*
 		 * decoder in unknown state - (probably uninitialized)
 		 */
-		*astate = S_GROUND;
-		return (UNVIS_SYNBAD);
+		*astate = SS(0, S_GROUND);
+		return UNVIS_SYNBAD;
 	}
 }
 
 /*
- * strunvis - decode src into dst
+ * strnunvisx - decode src into dst
  *
  *	Number of chars decoded into dst is returned, -1 on error.
  *	Dst is null terminated.
  */
 
 int
-strunvisx(dst, src, flag)
-	char *dst;
-	const char *src;
-	int flag;
+strnunvisx(char *dst, size_t dlen, const char *src, int flag)
 {
 	char c;
-	char *start = dst;
+	char t, *start = dst;
 	int state = 0;
 
 	_DIAGASSERT(src != NULL);
 	_DIAGASSERT(dst != NULL);
+#define CHECKSPACE() \
+	do { \
+		if (dlen-- == 0) { \
+			errno = ENOSPC; \
+			return -1; \
+		} \
+	} while (/*CONSTCOND*/0)
 
 	while ((c = *src++) != '\0') {
  again:
-		switch (unvis(dst, c, &state, flag)) {
+		switch (unvis(&t, c, &state, flag)) {
 		case UNVIS_VALID:
-			dst++;
+			CHECKSPACE();
+			*dst++ = t;
 			break;
 		case UNVIS_VALIDPUSH:
-			dst++;
+			CHECKSPACE();
+			*dst++ = t;
 			goto again;
 		case 0:
 		case UNVIS_NOCHAR:
 			break;
+		case UNVIS_SYNBAD:
+			errno = EINVAL;
+			return -1;
 		default:
-			return (-1);
+			_DIAGASSERT(0);
+			errno = EINVAL;
+			return -1;
 		}
 	}
-	if (unvis(dst, c, &state, UNVIS_END) == UNVIS_VALID)
-		dst++;
+	if (unvis(&t, c, &state, UNVIS_END) == UNVIS_VALID) {
+		CHECKSPACE();
+		*dst++ = t;
+	}
+	CHECKSPACE();
 	*dst = '\0';
-	return (dst - start);
+	return (int)(dst - start);
+}
+
+int
+strunvisx(char *dst, const char *src, int flag)
+{
+	return strnunvisx(dst, (size_t)~0, src, flag);
+}
+
+int
+strunvis(char *dst, const char *src)
+{
+	return strnunvisx(dst, (size_t)~0, src, 0);
 }
 
 int
-strunvis(dst, src)
-	char *dst;
-	const char *src;
+strnunvis(char *dst, size_t dlen, const char *src)
 {
-	return strunvisx(dst, src, 0);
+	return strnunvisx(dst, dlen, src, 0);
 }
 #endif
diff -pruN 5.1.58-1/cmd-line-utils/libedit/np/vis.c 5.1.61-2/cmd-line-utils/libedit/np/vis.c
--- 5.1.58-1/cmd-line-utils/libedit/np/vis.c	2011-07-01 15:22:23.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/np/vis.c	2011-12-16 19:06:10.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: vis.c,v 1.38 2008/09/04 09:41:44 lukem Exp $	*/
+/*	$NetBSD: vis.c,v 1.44 2011/03/12 19:52:48 christos Exp $	*/
 
 /*-
  * Copyright (c) 1989, 1993
@@ -60,23 +60,24 @@
 #if defined(LIBC_SCCS) && !defined(lint)
 #endif /* LIBC_SCCS and not lint */
 
+/* XXXMYSQL : Make compiler happy. */
+#ifdef _LIBC
+#include "namespace.h"
+#endif
+
 #include <sys/types.h>
 
 #include <assert.h>
-#ifdef HAVE_VIS_H
-#include <vis.h>
-#else
+/*
+  XXXMYSQL : Due to different versions of vis.h available,
+             use the one bundled with libedit.
+*/
 #include "np/vis.h"
-#endif
+#include <errno.h>
 #include <stdlib.h>
 
 #ifdef __weak_alias
-__weak_alias(strsvis,_strsvis)
-__weak_alias(strsvisx,_strsvisx)
-__weak_alias(strvis,_strvis)
 __weak_alias(strvisx,_strvisx)
-__weak_alias(svis,_svis)
-__weak_alias(vis,_vis)
 #endif
 
 #if !HAVE_VIS || !HAVE_SVIS
@@ -85,7 +86,7 @@ __weak_alias(vis,_vis)
 #include <stdio.h>
 #include <string.h>
 
-static char *do_svis(char *, int, int, int, const char *);
+static char *do_svis(char *, size_t *, int, int, int, const char *);
 
 #undef BELL
 #define BELL '\a'
@@ -94,6 +95,7 @@ static char *do_svis(char *, int, int, i
 #define iswhite(c)	(c == ' ' || c == '\t' || c == '\n')
 #define issafe(c)	(c == '\b' || c == BELL || c == '\r')
 #define xtoa(c)		"0123456789abcdef"[c]
+#define XTOA(c)		"0123456789ABCDEF"[c]
 
 #define MAXEXTRAS	5
 
@@ -120,14 +122,54 @@ do {									      \
  * This is do_hvis, for HTTP style (RFC 1808)
  */
 static char *
-do_hvis(char *dst, int c, int flag, int nextc, const char *extra)
+do_hvis(char *dst, size_t *dlen, int c, int flag, int nextc, const char *extra)
 {
-	if (!isascii(c) || !isalnum(c) || strchr("$-_.+!*'(),", c) != NULL) {
+
+	if ((isascii(c) && isalnum(c))
+	    /* safe */
+	    || c == '$' || c == '-' || c == '_' || c == '.' || c == '+'
+	    /* extra */
+	    || c == '!' || c == '*' || c == '\'' || c == '(' || c == ')'
+	    || c == ',') {
+		dst = do_svis(dst, dlen, c, flag, nextc, extra);
+	} else {
+		if (dlen) {
+			if (*dlen < 3)
+				return NULL;
+			*dlen -= 3;
+		}
 		*dst++ = '%';
 		*dst++ = xtoa(((unsigned int)c >> 4) & 0xf);
 		*dst++ = xtoa((unsigned int)c & 0xf);
+	}
+
+	return dst;
+}
+
+/*
+ * This is do_mvis, for Quoted-Printable MIME (RFC 2045)
+ * NB: No handling of long lines or CRLF.
+ */
+static char *
+do_mvis(char *dst, size_t *dlen, int c, int flag, int nextc, const char *extra)
+{
+	if ((c != '\n') &&
+	    /* Space at the end of the line */
+	    ((isspace(c) && (nextc == '\r' || nextc == '\n')) ||
+	    /* Out of range */
+	    (!isspace(c) && (c < 33 || (c > 60 && c < 62) || c > 126)) ||
+	    /* Specific char to be escaped */ 
+	    strchr("#$@[\\]^`{|}~", c) != NULL)) {
+		if (dlen) {
+			if (*dlen < 3)
+				return NULL;
+			*dlen -= 3;
+		}
+		*dst++ = '=';
+		*dst++ = XTOA(((unsigned int)c >> 4) & 0xf);
+		*dst++ = XTOA((unsigned int)c & 0xf);
 	} else {
-		dst = do_svis(dst, c, flag, nextc, extra);
+		dst = do_svis(dst, dlen, c, flag, nextc, extra);
 	}
 	return dst;
 }
@@ -142,16 +184,28 @@ do_hvis(char *dst, int c, int flag, int 
  *	      backslash-protected.
  */
 static char *
-do_svis(char *dst, int c, int flag, int nextc, const char *extra)
+do_svis(char *dst, size_t *dlen, int c, int flag, int nextc, const char *extra)
 {
 	int isextra;
+	size_t odlen = dlen ? *dlen : 0;
+
 	isextra = strchr(extra, c) != NULL;
+#define HAVE(x) \
+	do { \
+		if (dlen) { \
+			if (*dlen < (x)) \
+				goto out; \
+			*dlen -= (x); \
+		} \
+	} while (/*CONSTCOND*/0)
 	if (!isextra && isascii(c) && (isgraph(c) || iswhite(c) ||
 	    ((flag & VIS_SAFE) && issafe(c)))) {
+		HAVE(1);
 		*dst++ = c;
 		return dst;
 	}
 	if (flag & VIS_CSTYLE) {
+		HAVE(2);
 		switch (c) {
 		case '\n':
 			*dst++ = '\\'; *dst++ = 'n';
@@ -180,6 +234,7 @@ do_svis(char *dst, int c, int flag, int 
 		case '\0':
 			*dst++ = '\\'; *dst++ = '0';
 			if (isoctal(nextc)) {
+				HAVE(2);
 				*dst++ = '0';
 				*dst++ = '0';
 			}
@@ -189,57 +244,104 @@ do_svis(char *dst, int c, int flag, int 
 				*dst++ = '\\'; *dst++ = c;
 				return dst;
 			}
+			if (dlen)
+				*dlen = odlen;
 		}
 	}
 	if (isextra || ((c & 0177) == ' ') || (flag & VIS_OCTAL)) {
+		HAVE(4);
 		*dst++ = '\\';
 		*dst++ = (u_char)(((u_int32_t)(u_char)c >> 6) & 03) + '0';
 		*dst++ = (u_char)(((u_int32_t)(u_char)c >> 3) & 07) + '0';
 		*dst++ =			     (c	      & 07) + '0';
 	} else {
-		if ((flag & VIS_NOSLASH) == 0) *dst++ = '\\';
+		if ((flag & VIS_NOSLASH) == 0) {
+			HAVE(1);
+			*dst++ = '\\';
+		}
+
 		if (c & 0200) {
+			HAVE(1);
 			c &= 0177; *dst++ = 'M';
 		}
+
 		if (iscntrl(c)) {
+			HAVE(2);
 			*dst++ = '^';
 			if (c == 0177)
 				*dst++ = '?';
 			else
 				*dst++ = c + '@';
 		} else {
+			HAVE(2);
 			*dst++ = '-'; *dst++ = c;
 		}
 	}
 	return dst;
+out:
+	*dlen = odlen;
+	return NULL;
 }
 
+typedef char *(*visfun_t)(char *, size_t *, int, int, int, const char *);
+
+/*
+ * Return the appropriate encoding function depending on the flags given.
+ */
+static visfun_t
+getvisfun(int flag)
+{
+	if (flag & VIS_HTTPSTYLE)
+		return do_hvis;
+	if (flag & VIS_MIMESTYLE)
+		return do_mvis;
+	return do_svis;
+}
 
 /*
- * svis - visually encode characters, also encoding the characters
+ * isnvis - visually encode characters, also encoding the characters
  *	  pointed to by `extra'
  */
-char *
-svis(char *dst, int c, int flag, int nextc, const char *extra)
+static char *
+isnvis(char *dst, size_t *dlen, int c, int flag, int nextc, const char *extra)
 {
 	char *nextra = NULL;
+	visfun_t f;
 
 	_DIAGASSERT(dst != NULL);
 	_DIAGASSERT(extra != NULL);
 	MAKEEXTRALIST(flag, nextra, extra);
 	if (!nextra) {
+		if (dlen && *dlen == 0) {
+			errno = ENOSPC;
+			return NULL;
+		}
 		*dst = '\0';		/* can't create nextra, return "" */
 		return dst;
 	}
-	if (flag & VIS_HTTPSTYLE)
-		dst = do_hvis(dst, c, flag, nextc, nextra);
-	else
-		dst = do_svis(dst, c, flag, nextc, nextra);
+	f = getvisfun(flag);
+	dst = (*f)(dst, dlen, c, flag, nextc, nextra);
 	free(nextra);
+	if (dst == NULL || (dlen && *dlen == 0)) {
+		errno = ENOSPC;
+		return NULL;
+	}
 	*dst = '\0';
 	return dst;
 }
 
+char *
+svis(char *dst, int c, int flag, int nextc, const char *extra)
+{
+	return isnvis(dst, NULL, c, flag, nextc, extra);
+}
+
+char *
+snvis(char *dst, size_t dlen, int c, int flag, int nextc, const char *extra)
+{
+	return isnvis(dst, &dlen, c, flag, nextc, extra);
+}
+
 
 /*
  * strsvis, strsvisx - visually encode characters from src into dst
@@ -256,13 +358,14 @@ svis(char *dst, int c, int flag, int nex
  *	Strsvisx encodes exactly len bytes from src into dst.
  *	This is useful for encoding a block of data.
  */
-int
-strsvis(char *dst, const char *csrc, int flag, const char *extra)
+static int
+istrsnvis(char *dst, size_t *dlen, const char *csrc, int flag, const char *extra)
 {
 	int c;
 	char *start;
 	char *nextra = NULL;
 	const unsigned char *src = (const unsigned char *)csrc;
+	visfun_t f;
 
 	_DIAGASSERT(dst != NULL);
 	_DIAGASSERT(src != NULL);
@@ -272,52 +375,87 @@ strsvis(char *dst, const char *csrc, int
 		*dst = '\0';		/* can't create nextra, return "" */
 		return 0;
 	}
-	if (flag & VIS_HTTPSTYLE) {
-		for (start = dst; (c = *src++) != '\0'; /* empty */)
-			dst = do_hvis(dst, c, flag, *src, nextra);
-	} else {
-		for (start = dst; (c = *src++) != '\0'; /* empty */)
-			dst = do_svis(dst, c, flag, *src, nextra);
+	f = getvisfun(flag);
+	for (start = dst; (c = *src++) != '\0'; /* empty */) {
+		dst = (*f)(dst, dlen, c, flag, *src, nextra);
+		if (dst == NULL) {
+			errno = ENOSPC;
+			return -1;
+		}
 	}
 	free(nextra);
+	if (dlen && *dlen == 0) {
+		errno = ENOSPC;
+		return -1;
+	}
 	*dst = '\0';
-	return (dst - start);
+	return (int)(dst - start);
 }
 
+int
+strsvis(char *dst, const char *csrc, int flag, const char *extra)
+{
+	return istrsnvis(dst, NULL, csrc, flag, extra);
+}
 
 int
-strsvisx(char *dst, const char *csrc, size_t len, int flag, const char *extra)
+strsnvis(char *dst, size_t dlen, const char *csrc, int flag, const char *extra)
+{
+	return istrsnvis(dst, &dlen, csrc, flag, extra);
+}
+
+static int
+istrsnvisx(char *dst, size_t *dlen, const char *csrc, size_t len, int flag,
+    const char *extra)
 {
 	unsigned char c;
 	char *start;
 	char *nextra = NULL;
 	const unsigned char *src = (const unsigned char *)csrc;
+	visfun_t f;
 
 	_DIAGASSERT(dst != NULL);
 	_DIAGASSERT(src != NULL);
 	_DIAGASSERT(extra != NULL);
 	MAKEEXTRALIST(flag, nextra, extra);
 	if (! nextra) {
+		if (dlen && *dlen == 0) {
+			errno = ENOSPC;
+			return -1;
+		}
 		*dst = '\0';		/* can't create nextra, return "" */
 		return 0;
 	}
 
-	if (flag & VIS_HTTPSTYLE) {
-		for (start = dst; len > 0; len--) {
-			c = *src++;
-			dst = do_hvis(dst, c, flag,
-			    len > 1 ? *src : '\0', nextra);
-		}
-	} else {
-		for (start = dst; len > 0; len--) {
-			c = *src++;
-			dst = do_svis(dst, c, flag,
-			    len > 1 ? *src : '\0', nextra);
+	f = getvisfun(flag);
+	for (start = dst; len > 0; len--) {
+		c = *src++;
+		dst = (*f)(dst, dlen, c, flag, len > 1 ? *src : '\0', nextra);
+		if (dst == NULL) {
+			errno = ENOSPC;
+			return -1;
 		}
 	}
 	free(nextra);
+	if (dlen && *dlen == 0) {
+		errno = ENOSPC;
+		return -1;
+	}
 	*dst = '\0';
-	return (dst - start);
+	return (int)(dst - start);
+}
+
+int
+strsvisx(char *dst, const char *csrc, size_t len, int flag, const char *extra)
+{
+	return istrsnvisx(dst, NULL, csrc, len, flag, extra);
+}
+
+int
+strsnvisx(char *dst, size_t dlen, const char *csrc, size_t len, int flag,
+    const char *extra)
+{
+	return istrsnvisx(dst, &dlen, csrc, len, flag, extra);
 }
 #endif
 
@@ -325,28 +463,47 @@ strsvisx(char *dst, const char *csrc, si
 /*
  * vis - visually encode characters
  */
-char *
-vis(char *dst, int c, int flag, int nextc)
+static char *
+invis(char *dst, size_t *dlen, int c, int flag, int nextc)
 {
 	char *extra = NULL;
 	unsigned char uc = (unsigned char)c;
+	visfun_t f;
 
 	_DIAGASSERT(dst != NULL);
 
 	MAKEEXTRALIST(flag, extra, "");
 	if (! extra) {
+		if (dlen && *dlen == 0) {
+			errno = ENOSPC;
+			return NULL;
+		}
 		*dst = '\0';		/* can't create extra, return "" */
 		return dst;
 	}
-	if (flag & VIS_HTTPSTYLE)
-		dst = do_hvis(dst, uc, flag, nextc, extra);
-	else
-		dst = do_svis(dst, uc, flag, nextc, extra);
+	f = getvisfun(flag);
+	dst = (*f)(dst, dlen, uc, flag, nextc, extra);
 	free(extra);
+	if (dst == NULL || (dlen && *dlen == 0)) {
+		errno = ENOSPC;
+		return NULL;
+	}
 	*dst = '\0';
 	return dst;
 }
 
+char *
+vis(char *dst, int c, int flag, int nextc)
+{
+	return invis(dst, NULL, c, flag, nextc);
+}
+
+char *
+nvis(char *dst, size_t dlen, int c, int flag, int nextc)
+{
+	return invis(dst, &dlen, c, flag, nextc);
+}
+
 
 /*
  * strvis, strvisx - visually encode characters from src into dst
@@ -358,36 +515,68 @@ vis(char *dst, int c, int flag, int next
  *	Strvisx encodes exactly len bytes from src into dst.
  *	This is useful for encoding a block of data.
  */
-int
-strvis(char *dst, const char *src, int flag)
+static int
+istrnvis(char *dst, size_t *dlen, const char *src, int flag)
 {
 	char *extra = NULL;
 	int rv;
 
 	MAKEEXTRALIST(flag, extra, "");
 	if (!extra) {
+		if (dlen && *dlen == 0) {
+			errno = ENOSPC;
+			return -1;
+		}
 		*dst = '\0';		/* can't create extra, return "" */
 		return 0;
 	}
-	rv = strsvis(dst, src, flag, extra);
+	rv = istrsnvis(dst, dlen, src, flag, extra);
 	free(extra);
 	return rv;
 }
 
+int
+strvis(char *dst, const char *src, int flag)
+{
+	return istrnvis(dst, NULL, src, flag);
+}
 
 int
-strvisx(char *dst, const char *src, size_t len, int flag)
+strnvis(char *dst, size_t dlen, const char *src, int flag)
+{
+	return istrnvis(dst, &dlen, src, flag);
+}
+
+static int
+istrnvisx(char *dst, size_t *dlen, const char *src, size_t len, int flag)
 {
 	char *extra = NULL;
 	int rv;
 
 	MAKEEXTRALIST(flag, extra, "");
 	if (!extra) {
+		if (dlen && *dlen == 0) {
+			errno = ENOSPC;
+			return -1;
+		}
 		*dst = '\0';		/* can't create extra, return "" */
 		return 0;
 	}
-	rv = strsvisx(dst, src, len, flag, extra);
+	rv = istrsnvisx(dst, dlen, src, len, flag, extra);
 	free(extra);
 	return rv;
 }
+
+int
+strvisx(char *dst, const char *src, size_t len, int flag)
+{
+	return istrnvisx(dst, NULL, src, len, flag);
+}
+
+int
+strnvisx(char *dst, size_t dlen, const char *src, size_t len, int flag)
+{
+	return istrnvisx(dst, &dlen, src, len, flag);
+}
+
 #endif
diff -pruN 5.1.58-1/cmd-line-utils/libedit/np/vis.h 5.1.61-2/cmd-line-utils/libedit/np/vis.h
--- 5.1.58-1/cmd-line-utils/libedit/np/vis.h	2011-07-01 15:22:23.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/np/vis.h	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: vis.h,v 1.16 2005/09/13 01:44:32 christos Exp $	*/
+/*	$NetBSD: vis.h,v 1.19 2011/03/12 19:52:45 christos Exp $	*/
 
 /*-
  * Copyright (c) 1990, 1993
@@ -39,24 +39,29 @@
 /*
  * to select alternate encoding format
  */
-#define	VIS_OCTAL	0x01	/* use octal \ddd format */
-#define	VIS_CSTYLE	0x02	/* use \[nrft0..] where appropiate */
+#define	VIS_OCTAL	0x001	/* use octal \ddd format */
+#define	VIS_CSTYLE	0x002	/* use \[nrft0..] where appropiate */
 
 /*
  * to alter set of characters encoded (default is to encode all
  * non-graphic except space, tab, and newline).
  */
-#define	VIS_SP		0x04	/* also encode space */
-#define	VIS_TAB		0x08	/* also encode tab */
-#define	VIS_NL		0x10	/* also encode newline */
+#define	VIS_SP		0x004	/* also encode space */
+#define	VIS_TAB		0x008	/* also encode tab */
+#define	VIS_NL		0x010	/* also encode newline */
 #define	VIS_WHITE	(VIS_SP | VIS_TAB | VIS_NL)
-#define	VIS_SAFE	0x20	/* only encode "unsafe" characters */
+#define	VIS_SAFE	0x020	/* only encode "unsafe" characters */
 
 /*
  * other
  */
-#define	VIS_NOSLASH	0x40	/* inhibit printing '\' */
-#define	VIS_HTTPSTYLE	0x80	/* http-style escape % HEX HEX */
+#define	VIS_NOSLASH	0x040	/* inhibit printing '\' */
+#define	VIS_HTTP1808	0x080	/* http-style escape % hex hex */
+#define	VIS_HTTPSTYLE	0x080	/* http-style escape % hex hex */
+#define	VIS_MIMESTYLE	0x100	/* mime-style escape = HEX HEX */
+#define	VIS_HTTP1866	0x200	/* http-style &#num; or &string; */
+#define	VIS_NOESCAPE	0x400	/* don't decode `\' */
+#define	_VIS_END	0x800	/* for unvis */
 
 /*
  * unvis return codes
@@ -70,18 +75,40 @@
 /*
  * unvis flags
  */
-#define	UNVIS_END	1	/* no more characters */
+#define	UNVIS_END	_VIS_END	/* no more characters */
+/* XXXMYSQL */
+#ifndef __RENAME
+#define __RENAME(x)
+#endif
 
 __BEGIN_DECLS
 char	*vis(char *, int, int, int);
+char	*nvis(char *, size_t, int, int, int);
+
 char	*svis(char *, int, int, int, const char *);
+char	*snvis(char *, size_t, int, int, int, const char *);
+
 int	strvis(char *, const char *, int);
+int	strnvis(char *, size_t, const char *, int);
+
 int	strsvis(char *, const char *, int, const char *);
+int	strsnvis(char *, size_t, const char *, int, const char *);
+
 int	strvisx(char *, const char *, size_t, int);
+int	strnvisx(char *, size_t, const char *, size_t, int);
+
 int	strsvisx(char *, const char *, size_t, int, const char *);
+int	strsnvisx(char *, size_t, const char *, size_t, int, const char *);
+
 int	strunvis(char *, const char *);
+int	strnunvis(char *, size_t, const char *);
+
 int	strunvisx(char *, const char *, int);
-int	unvis(char *, int, int *, int);
+int	strnunvisx(char *, size_t, const char *, int);
+
+#ifndef __LIBC12_SOURCE__
+int	unvis(char *, int, int *, int) __RENAME(__unvis50);
+#endif
 __END_DECLS
 
 #endif /* !_VIS_H_ */
diff -pruN 5.1.58-1/cmd-line-utils/libedit/np/wcsdup.c 5.1.61-2/cmd-line-utils/libedit/np/wcsdup.c
--- 5.1.58-1/cmd-line-utils/libedit/np/wcsdup.c	1970-01-01 00:00:00.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/np/wcsdup.c	2011-12-16 19:06:04.000000000 +0000
@@ -0,0 +1,43 @@
+/*	$NetBSD: wcsdup.c,v 1.3 2008/05/26 13:17:48 haad Exp $	*/
+
+/*
+ * Copyright (C) 2006 Aleksey Cheusov
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee. Permission to modify the code and to distribute modified
+ * code is also granted without any restrictions.
+ */
+
+#ifndef HAVE_WCSDUP
+
+#include "config.h"
+
+#if defined(LIBC_SCCS) && !defined(lint) 
+__RCSID("$NetBSD: wcsdup.c,v 1.3 2008/05/26 13:17:48 haad Exp $"); 
+#endif /* LIBC_SCCS and not lint */ 
+
+#include <stdlib.h>
+#include <assert.h>
+#include <wchar.h>
+
+wchar_t *
+wcsdup(const wchar_t *str)
+{
+	wchar_t *copy;
+	size_t len;
+
+	_DIAGASSERT(str != NULL);
+
+	len = wcslen(str) + 1;
+	copy = malloc(len * sizeof (wchar_t));
+
+	if (!copy)
+		return NULL;
+
+	return wmemcpy(copy, str, len);
+}
+
+#endif
diff -pruN 5.1.58-1/cmd-line-utils/libedit/parse.c 5.1.61-2/cmd-line-utils/libedit/parse.c
--- 5.1.58-1/cmd-line-utils/libedit/parse.c	2011-07-01 15:22:22.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/parse.c	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: parse.c,v 1.22 2005/05/29 04:58:15 lukem Exp $	*/
+/*	$NetBSD: parse.c,v 1.26 2011/08/16 16:25:15 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -57,17 +57,17 @@ static char sccsid[] = "@(#)parse.c	8.1 
 #include <stdlib.h>
 
 private const struct {
-	const char *name;
-	int (*func)(EditLine *, int, const char **);
+	const Char *name;
+	int (*func)(EditLine *, int, const Char **);
 } cmds[] = {
-	{ "bind",	map_bind	},
-	{ "echotc",	term_echotc	},
-	{ "edit",	el_editmode	},
-	{ "history",	hist_command	},
-	{ "telltc",	term_telltc	},
-	{ "settc",	term_settc	},
-	{ "setty",	tty_stty	},
-	{ NULL,		NULL		}
+	{ STR("bind"),  	map_bind	},
+	{ STR("echotc"),	terminal_echotc	},
+	{ STR("edit"),  	el_editmode	},
+	{ STR("history"),	hist_command	},
+	{ STR("telltc"),	terminal_telltc	},
+	{ STR("settc"),	        terminal_settc	},
+	{ STR("setty"),	        tty_stty	},
+	{ NULL,		        NULL		}
 };
 
 
@@ -75,17 +75,17 @@ private const struct {
  *	Parse a line and dispatch it
  */
 protected int
-parse_line(EditLine *el, const char *line)
+parse_line(EditLine *el, const Char *line)
 {
-	const char **argv;
+	const Char **argv;
 	int argc;
-	Tokenizer *tok;
+	TYPE(Tokenizer) *tok;
 
-	tok = tok_init(NULL);
-	tok_str(tok, line, &argc, &argv);
-	argc = el_parse(el, argc, argv);
-	tok_end(tok);
-	return (argc);
+	tok = FUN(tok,init)(NULL);
+	FUN(tok,str)(tok, line, &argc, &argv);
+	argc = FUN(el,parse)(el, argc, argv);
+	FUN(tok,end)(tok);
+	return argc;
 }
 
 
@@ -93,57 +93,57 @@ parse_line(EditLine *el, const char *lin
  *	Command dispatcher
  */
 public int
-el_parse(EditLine *el, int argc, const char *argv[])
+FUN(el,parse)(EditLine *el, int argc, const Char *argv[])
 {
-	const char *ptr;
+	const Char *ptr;
 	int i;
 
 	if (argc < 1)
-		return (-1);
-	ptr = strchr(argv[0], ':');
+		return -1;
+	ptr = Strchr(argv[0], ':');
 	if (ptr != NULL) {
-		char *tprog;
+		Char *tprog;
 		size_t l;
 
 		if (ptr == argv[0])
-			return (0);
-		l = ptr - argv[0] - 1;
-		tprog = (char *) el_malloc(l + 1);
+			return 0;
+		l = (size_t)(ptr - argv[0] - 1);
+		tprog = el_malloc((l + 1) * sizeof(*tprog));
 		if (tprog == NULL)
-			return (0);
-		(void) strncpy(tprog, argv[0], l);
+			return 0;
+		(void) Strncpy(tprog, argv[0], l);
 		tprog[l] = '\0';
 		ptr++;
-		l = el_match(el->el_prog, tprog);
+		l = (size_t)el_match(el->el_prog, tprog);
 		el_free(tprog);
 		if (!l)
-			return (0);
+			return 0;
 	} else
 		ptr = argv[0];
 
 	for (i = 0; cmds[i].name != NULL; i++)
-		if (strcmp(cmds[i].name, ptr) == 0) {
+		if (Strcmp(cmds[i].name, ptr) == 0) {
 			i = (*cmds[i].func) (el, argc, argv);
-			return (-i);
+			return -i;
 		}
-	return (-1);
+	return -1;
 }
 
 
 /* parse__escape():
- *	Parse a string of the form ^<char> \<odigit> \<char> and return
+ *	Parse a string of the form ^<char> \<odigit> \<char> \U+xxxx and return
  *	the appropriate character or -1 if the escape is not valid
  */
 protected int
-parse__escape(const char **ptr)
+parse__escape(const Char **ptr)
 {
-	const char *p;
-	int c;
+	const Char *p;
+	Int c;
 
 	p = *ptr;
 
 	if (p[1] == 0)
-		return (-1);
+		return -1;
 
 	if (*p == '\\') {
 		p++;
@@ -172,6 +172,28 @@ parse__escape(const char **ptr)
 		case 'e':
 			c = '\033';	/* Escape */
 			break;
+                case 'U':               /* Unicode \U+xxxx or \U+xxxxx format */
+                {
+                        int i;
+                        const Char hex[] = STR("0123456789ABCDEF");
+                        const Char *h;
+                        ++p;
+                        if (*p++ != '+')
+                                return -1;
+			c = 0;
+                        for (i = 0; i < 5; ++i) {
+                                h = Strchr(hex, *p++);
+                                if (!h && i < 4)
+                                        return -1;
+                                else if (h)
+                                        c = (c << 4) | ((int)(h - hex));
+                                else
+                                        --p;
+                        }
+                        if (c > 0x10FFFF) /* outside valid character range */
+                                return -1;
+                        break;
+                }
 		case '0':
 		case '1':
 		case '2':
@@ -191,8 +213,8 @@ parse__escape(const char **ptr)
 				}
 				c = (c << 3) | (ch - '0');
 			}
-			if ((c & 0xffffff00) != 0)
-				return (-1);
+			if ((c & (wint_t)0xffffff00) != (wint_t)0)
+				return -1;
 			--p;
 			break;
 		}
@@ -206,28 +228,28 @@ parse__escape(const char **ptr)
 	} else
 		c = *p;
 	*ptr = ++p;
-	return (c);
+	return c;
 }
 
 /* parse__string():
  *	Parse the escapes from in and put the raw string out
  */
-protected char *
-parse__string(char *out, const char *in)
+protected Char *
+parse__string(Char *out, const Char *in)
 {
-	char *rv = out;
+	Char *rv = out;
 	int n;
 
 	for (;;)
 		switch (*in) {
 		case '\0':
 			*out = '\0';
-			return (rv);
+			return rv;
 
 		case '\\':
 		case '^':
 			if ((n = parse__escape(&in)) == -1)
-				return (NULL);
+				return NULL;
 			*out++ = n;
 			break;
 
@@ -251,12 +273,12 @@ parse__string(char *out, const char *in)
  *	or -1 if one is not found
  */
 protected int
-parse_cmd(EditLine *el, const char *cmd)
+parse_cmd(EditLine *el, const Char *cmd)
 {
 	el_bindings_t *b;
 
 	for (b = el->el_map.help; b->name != NULL; b++)
-		if (strcmp(b->name, cmd) == 0)
-			return (b->func);
-	return (-1);
+		if (Strcmp(b->name, cmd) == 0)
+			return b->func;
+	return -1;
 }
diff -pruN 5.1.58-1/cmd-line-utils/libedit/parse.h 5.1.61-2/cmd-line-utils/libedit/parse.h
--- 5.1.58-1/cmd-line-utils/libedit/parse.h	2011-07-01 15:22:22.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/parse.h	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: parse.h,v 1.6 2005/05/29 04:58:15 lukem Exp $	*/
+/*	$NetBSD: parse.h,v 1.7 2009/12/30 22:37:40 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -40,9 +40,9 @@
 #ifndef _h_el_parse
 #define	_h_el_parse
 
-protected int	 parse_line(EditLine *, const char *);
-protected int	 parse__escape(const char **);
-protected char	*parse__string(char *, const char *);
-protected int	 parse_cmd(EditLine *, const char *);
+protected int	 parse_line(EditLine *, const Char *);
+protected int	 parse__escape(const Char **);
+protected Char	*parse__string(Char *, const Char *);
+protected int	 parse_cmd(EditLine *, const Char *);
 
 #endif /* _h_el_parse */
diff -pruN 5.1.58-1/cmd-line-utils/libedit/prompt.c 5.1.61-2/cmd-line-utils/libedit/prompt.c
--- 5.1.58-1/cmd-line-utils/libedit/prompt.c	2011-07-01 15:22:22.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/prompt.c	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: prompt.c,v 1.11 2003/08/07 16:44:32 agc Exp $	*/
+/*	$NetBSD: prompt.c,v 1.20 2011/07/29 15:16:33 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -46,54 +46,66 @@ static char sccsid[] = "@(#)prompt.c	8.1
 #include <stdio.h>
 #include "el.h"
 
-private char	*prompt_default(EditLine *);
-private char	*prompt_default_r(EditLine *);
+private Char	*prompt_default(EditLine *);
+private Char	*prompt_default_r(EditLine *);
 
 /* prompt_default():
  *	Just a default prompt, in case the user did not provide one
  */
-private char *
+private Char *
 /*ARGSUSED*/
 prompt_default(EditLine *el __attribute__((__unused__)))
 {
-	static char a[3] = {'?', ' ', '\0'};
+	static Char a[3] = {'?', ' ', '\0'};
 
-	return (a);
+	return a;
 }
 
 
 /* prompt_default_r():
  *	Just a default rprompt, in case the user did not provide one
  */
-private char *
+private Char *
 /*ARGSUSED*/
 prompt_default_r(EditLine *el __attribute__((__unused__)))
 {
-	static char a[1] = {'\0'};
+	static Char a[1] = {'\0'};
 
-	return (a);
+	return a;
 }
 
 
 /* prompt_print():
  *	Print the prompt and update the prompt position.
- *	We use an array of integers in case we want to pass
- * 	literal escape sequences in the prompt and we want a
- *	bit to flag them
  */
 protected void
 prompt_print(EditLine *el, int op)
 {
 	el_prompt_t *elp;
-	char *p;
+	Char *p;
+	int ignore = 0;
 
 	if (op == EL_PROMPT)
 		elp = &el->el_prompt;
 	else
 		elp = &el->el_rprompt;
-	p = (elp->p_func) (el);
-	while (*p)
-		re_putc(el, *p++, 1);
+
+	if (elp->p_wide)
+		p = (*elp->p_func)(el);
+	else
+		p = ct_decode_string((char *)(void *)(*elp->p_func)(el),
+		    &el->el_scratch);
+
+	for (; *p; p++) {
+		if (elp->p_ignore == *p) {
+			ignore = !ignore;
+			continue;
+		}
+		if (ignore)
+			terminal__putc(el, *p);
+		else
+			re_putc(el, *p, 1);
+	}
 
 	elp->p_pos.v = el->el_refresh.r_cursor.v;
 	elp->p_pos.h = el->el_refresh.r_cursor.h;
@@ -110,10 +122,12 @@ prompt_init(EditLine *el)
 	el->el_prompt.p_func = prompt_default;
 	el->el_prompt.p_pos.v = 0;
 	el->el_prompt.p_pos.h = 0;
+	el->el_prompt.p_ignore = '\0';
 	el->el_rprompt.p_func = prompt_default_r;
 	el->el_rprompt.p_pos.v = 0;
 	el->el_rprompt.p_pos.h = 0;
-	return (0);
+	el->el_rprompt.p_ignore = '\0';
+	return 0;
 }
 
 
@@ -131,24 +145,31 @@ prompt_end(EditLine *el __attribute__((_
  *	Install a prompt printing function
  */
 protected int
-prompt_set(EditLine *el, el_pfunc_t prf, int op)
+prompt_set(EditLine *el, el_pfunc_t prf, Char c, int op, int wide)
 {
 	el_prompt_t *p;
 
-	if (op == EL_PROMPT)
+	if (op == EL_PROMPT || op == EL_PROMPT_ESC)
 		p = &el->el_prompt;
 	else
 		p = &el->el_rprompt;
+
 	if (prf == NULL) {
-		if (op == EL_PROMPT)
+		if (op == EL_PROMPT || op == EL_PROMPT_ESC)
 			p->p_func = prompt_default;
 		else
 			p->p_func = prompt_default_r;
-	} else
+	} else {
 		p->p_func = prf;
+	}
+
+	p->p_ignore = c;
+
 	p->p_pos.v = 0;
 	p->p_pos.h = 0;
-	return (0);
+	p->p_wide = wide;
+
+	return 0;
 }
 
 
@@ -156,14 +177,22 @@ prompt_set(EditLine *el, el_pfunc_t prf,
  *	Retrieve the prompt printing function
  */
 protected int
-prompt_get(EditLine *el, el_pfunc_t *prf, int op)
+prompt_get(EditLine *el, el_pfunc_t *prf, Char *c, int op)
 {
+	el_prompt_t *p;
 
 	if (prf == NULL)
-		return (-1);
+		return -1;
+
 	if (op == EL_PROMPT)
-		*prf = el->el_prompt.p_func;
+		p = &el->el_prompt;
 	else
-		*prf = el->el_rprompt.p_func;
-	return (0);
+		p = &el->el_rprompt;
+
+	if (prf)
+		*prf = p->p_func;
+	if (c)
+		*c = p->p_ignore;
+
+	return 0;
 }
diff -pruN 5.1.58-1/cmd-line-utils/libedit/prompt.h 5.1.61-2/cmd-line-utils/libedit/prompt.h
--- 5.1.58-1/cmd-line-utils/libedit/prompt.h	2011-07-01 15:22:22.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/prompt.h	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: prompt.h,v 1.6 2003/08/07 16:44:32 agc Exp $	*/
+/*	$NetBSD: prompt.h,v 1.10 2009/12/30 22:37:40 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -42,16 +42,18 @@
 
 #include "histedit.h"
 
-typedef char * (*el_pfunc_t)(EditLine*);
+typedef Char    *(*el_pfunc_t)(EditLine *);
 
 typedef struct el_prompt_t {
-	el_pfunc_t	p_func;	/* Function to return the prompt	*/
-	coord_t		p_pos;	/* position in the line after prompt	*/
+	el_pfunc_t	p_func;		/* Function to return the prompt */
+	coord_t		p_pos;		/* position in the line after prompt */
+	Char		p_ignore;	/* character to start/end literal */
+	int		p_wide;	
 } el_prompt_t;
 
 protected void	prompt_print(EditLine *, int);
-protected int	prompt_set(EditLine *, el_pfunc_t, int);
-protected int	prompt_get(EditLine *, el_pfunc_t *, int);
+protected int	prompt_set(EditLine *, el_pfunc_t, Char, int, int);
+protected int	prompt_get(EditLine *, el_pfunc_t *, Char *, int);
 protected int	prompt_init(EditLine *);
 protected void	prompt_end(EditLine *);
 
diff -pruN 5.1.58-1/cmd-line-utils/libedit/read.c 5.1.61-2/cmd-line-utils/libedit/read.c
--- 5.1.58-1/cmd-line-utils/libedit/read.c	2011-07-01 15:22:22.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/read.c	2011-12-16 19:06:10.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: read.c,v 1.43 2009/02/05 19:15:44 christos Exp $	*/
+/*	$NetBSD: read.c,v 1.67 2011/08/16 16:25:15 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -48,14 +48,15 @@ static char sccsid[] = "@(#)read.c	8.1 (
 #include <fcntl.h>
 #include <unistd.h>
 #include <stdlib.h>
+#include <limits.h>
 #include "el.h"
 
-#define	OKCMD	-1
+#define OKCMD	-1	/* must be -1! */
 
 private int	read__fixio(int, int);
 private int	read_preread(EditLine *);
-private int	read_char(EditLine *, char *);
-private int	read_getcmd(EditLine *, el_action_t *, char *);
+private int	read_char(EditLine *, Char *);
+private int	read_getcmd(EditLine *, el_action_t *, Char *);
 private void	read_pop(c_macro_t *);
 
 /* read_init():
@@ -89,7 +90,7 @@ el_read_setfn(EditLine *el, el_rfunc_t r
 protected el_rfunc_t
 el_read_getfn(EditLine *el)
 {
-       return (el->el_read.read_char == read_char) ?
+       return el->el_read.read_char == read_char ?
 	    EL_BUILTIN_GETCFN : el->el_read.read_char;
 }
 
@@ -131,7 +132,7 @@ read__fixio(int fd __attribute__((__unus
 #ifdef EWOULDBLOCK
 	case EWOULDBLOCK:
 #ifndef TRY_AGAIN
-#define	TRY_AGAIN
+#define TRY_AGAIN
 #endif
 #endif /* EWOULDBLOCK */
 
@@ -139,7 +140,7 @@ read__fixio(int fd __attribute__((__unus
 #if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
 	case EAGAIN:
 #ifndef TRY_AGAIN
-#define	TRY_AGAIN
+#define TRY_AGAIN
 #endif
 #endif /* EWOULDBLOCK && EWOULDBLOCK != EAGAIN */
 #endif /* POSIX && EAGAIN */
@@ -148,10 +149,10 @@ read__fixio(int fd __attribute__((__unus
 #ifdef TRY_AGAIN
 #if defined(F_SETFL) && defined(O_NDELAY)
 		if ((e = fcntl(fd, F_GETFL, 0)) == -1)
-			return (-1);
+			return -1;
 
 		if (fcntl(fd, F_SETFL, e & ~O_NDELAY) == -1)
-			return (-1);
+			return -1;
 		else
 			e = 1;
 #endif /* F_SETFL && O_NDELAY */
@@ -160,21 +161,21 @@ read__fixio(int fd __attribute__((__unus
 		{
 			int zero = 0;
 
-			if (ioctl(fd, FIONBIO, (ioctl_t) & zero) == -1)
-				return (-1);
+			if (ioctl(fd, FIONBIO, &zero) == -1)
+				return -1;
 			else
 				e = 1;
 		}
 #endif /* FIONBIO */
 
 #endif /* TRY_AGAIN */
-		return (e ? 0 : -1);
+		return e ? 0 : -1;
 
 	case EINTR:
-		return (0);
+		return 0;
 
 	default:
-		return (-1);
+		return -1;
 	}
 }
 
@@ -188,10 +189,13 @@ read_preread(EditLine *el)
 	int chrs = 0;
 
 	if (el->el_tty.t_mode == ED_IO)
-		return (0);
+		return 0;
 
+#ifndef WIDECHAR
+/* FIONREAD attempts to buffer up multiple bytes, and to make that work
+ * properly with partial wide/UTF-8 characters would need some careful work. */
 #ifdef FIONREAD
-	(void) ioctl(el->el_infd, FIONREAD, (ioctl_t) & chrs);
+	(void) ioctl(el->el_infd, FIONREAD, &chrs);
 	if (chrs > 0) {
 		char buf[EL_BUFSIZ];
 
@@ -203,8 +207,8 @@ read_preread(EditLine *el)
 		}
 	}
 #endif /* FIONREAD */
-
-	return (chrs > 0);
+#endif
+	return chrs > 0;
 }
 
 
@@ -212,33 +216,37 @@ read_preread(EditLine *el)
  *	Push a macro
  */
 public void
-el_push(EditLine *el, const char *str)
+FUN(el,push)(EditLine *el, const Char *str)
 {
 	c_macro_t *ma = &el->el_chared.c_macro;
 
 	if (str != NULL && ma->level + 1 < EL_MAXMACRO) {
 		ma->level++;
-		if ((ma->macro[ma->level] = el_strdup(str)) != NULL)
+		if ((ma->macro[ma->level] = Strdup(str)) != NULL)
 			return;
 		ma->level--;
 	}
-	term_beep(el);
-	term__flush(el);
+	terminal_beep(el);
+	terminal__flush(el);
 }
 
 
 /* read_getcmd():
  *	Return next command from the input stream.
+ *	Character values > 255 are not looked up in the map, but inserted.
  */
 private int
-read_getcmd(EditLine *el, el_action_t *cmdnum, char *ch)
+read_getcmd(EditLine *el, el_action_t *cmdnum, Char *ch)
 {
 	el_action_t cmd;
 	int num;
 
+	el->el_errno = 0;
 	do {
-		if ((num = el_getc(el, ch)) != 1)	/* if EOF or error */
-			return (num);
+		if ((num = FUN(el,getc)(el, ch)) != 1) {/* if EOF or error */
+			el->el_errno = num == 0 ? 0 : errno;
+			return num;
+		}
 
 #ifdef	KANJI
 		if ((*ch & 0200)) {
@@ -252,15 +260,20 @@ read_getcmd(EditLine *el, el_action_t *c
 			el->el_state.metanext = 0;
 			*ch |= 0200;
 		}
-		cmd = el->el_map.current[(unsigned char) *ch];
+#ifdef WIDECHAR
+		if (*ch >= N_KEYS)
+			cmd = ED_INSERT;
+		else
+#endif
+			cmd = el->el_map.current[(unsigned char) *ch];
 		if (cmd == ED_SEQUENCE_LEAD_IN) {
-			key_value_t val;
-			switch (key_get(el, ch, &val)) {
+			keymacro_value_t val;
+			switch (keymacro_get(el, ch, &val)) {
 			case XK_CMD:
 				cmd = val.cmd;
 				break;
 			case XK_STR:
-				el_push(el, val.str);
+				FUN(el,push)(el, val.str);
 				break;
 #ifdef notyet
 			case XK_EXE:
@@ -277,28 +290,82 @@ read_getcmd(EditLine *el, el_action_t *c
 			el->el_map.current = el->el_map.key;
 	} while (cmd == ED_SEQUENCE_LEAD_IN);
 	*cmdnum = cmd;
-	return (OKCMD);
+	return OKCMD;
 }
 
-
 /* read_char():
  *	Read a character from the tty.
  */
 private int
-read_char(EditLine *el, char *cp)
+read_char(EditLine *el, Char *cp)
 {
-	int num_read;
+	ssize_t num_read;
 	int tried = 0;
+        char cbuf[MB_LEN_MAX];
+        size_t cbp = 0;
+        int bytes = 0;
+
+#ifdef WIDECHAR
+static mbstate_t state, temp_state;
+memset(&state, 0, sizeof(mbstate_t));
+#endif
 
-	while ((num_read = read(el->el_infd, cp, 1)) == -1)
+ again:
+	el->el_signal->sig_no = 0;
+	while ((num_read = read(el->el_infd, cbuf + cbp, (size_t)1)) == -1) {
+		switch (el->el_signal->sig_no) {
+		case SIGCONT:
+			FUN(el,set)(el, EL_REFRESH);
+			/*FALLTHROUGH*/
+		case SIGWINCH:
+			sig_set(el);
+			goto again;
+		default:
+			break;
+		}
 		if (!tried && read__fixio(el->el_infd, errno) == 0)
 			tried = 1;
 		else {
 			*cp = '\0';
-			return (-1);
+			return -1;
 		}
+	}
+
+#ifdef WIDECHAR
+        ++cbp;
+        if (cbp > (size_t) MB_CUR_MAX) { /* "shouldn't happen" */
+          *cp = '\0';
+          return (-1);
+        }
+
+        temp_state= state;
+
+        if ((bytes = mbrtowc(cp, cbuf, cbp, &state)) == -2)
+        {
+          /* Incomplete sequence, restore the state and scan more bytes. */
+          state= temp_state;
+          goto again;
+        }
+        else if (bytes == -1)
+        {
+          /* Invalid sequence, reset the state and continue. */
+          cbp= 0;
+          memset(&state, 0, sizeof(mbstate_t));
+          goto again;
+        }
+        /* We successfully read one single or multi-byte character */
+#else
+        *cp = (unsigned char)cbuf[0];
+#endif
 
-	return (num_read);
+#if 0
+	if ((el->el_flags & IGNORE_EXTCHARS) && bytes > 1) {
+		cbp = 0; /* skip this character */
+		goto again;
+	}
+#endif
+
+	return (int)num_read;
 }
 
 /* read_pop():
@@ -310,8 +377,9 @@ read_pop(c_macro_t *ma)
 	int i;
 
 	el_free(ma->macro[0]);
-	for (i = ma->level--; i > 0; i--)
-		ma->macro[i - 1] = ma->macro[i];
+	for (i = 0; i < ma->level; i++)
+		ma->macro[i] = ma->macro[i + 1];
+	ma->level--;
 	ma->offset = 0;
 }
 
@@ -319,12 +387,12 @@ read_pop(c_macro_t *ma)
  *	Read a character
  */
 public int
-el_getc(EditLine *el, char *cp)
+FUN(el,getc)(EditLine *el, Char *cp)
 {
 	int num_read;
 	c_macro_t *ma = &el->el_chared.c_macro;
 
-	term__flush(el);
+	terminal__flush(el);
 	for (;;) {
 		if (ma->level < 0) {
 			if (!read_preread(el))
@@ -339,30 +407,34 @@ el_getc(EditLine *el, char *cp)
 			continue;
 		}
 
-		*cp = ma->macro[0][ma->offset++] & 0377;
+		*cp = ma->macro[0][ma->offset++];
 
 		if (ma->macro[0][ma->offset] == '\0') {
 			/* Needed for QuoteMode On */
 			read_pop(ma);
 		}
 
-		return (1);
+		return 1;
 	}
 
 #ifdef DEBUG_READ
 	(void) fprintf(el->el_errfile, "Turning raw mode on\n");
 #endif /* DEBUG_READ */
 	if (tty_rawmode(el) < 0)/* make sure the tty is set up correctly */
-		return (0);
+		return 0;
 
 #ifdef DEBUG_READ
 	(void) fprintf(el->el_errfile, "Reading a character\n");
 #endif /* DEBUG_READ */
 	num_read = (*el->el_read.read_char)(el, cp);
+#ifdef WIDECHAR
+	if (el->el_flags & NARROW_READ)
+		*cp = *(char *)(void *)cp;
+#endif
 #ifdef DEBUG_READ
 	(void) fprintf(el->el_errfile, "Got it %c\n", *cp);
 #endif /* DEBUG_READ */
-	return (num_read);
+	return num_read;
 }
 
 protected void
@@ -383,7 +455,7 @@ read_prepare(EditLine *el)
 	re_refresh(el);		/* print the prompt */
 
 	if (el->el_flags & UNBUFFERED)
-		term__flush(el);
+		terminal__flush(el);
 }
 
 protected void
@@ -395,27 +467,32 @@ read_finish(EditLine *el)
 		sig_clr(el);
 }
 
-public const char *
-el_gets(EditLine *el, int *nread)
+public const Char *
+FUN(el,gets)(EditLine *el, int *nread)
 {
 	int retval;
 	el_action_t cmdnum = 0;
 	int num;		/* how many chars we have read at NL */
-	char ch;
+	Char ch, *cp;
 	int crlf = 0;
+	int nrb;
 #ifdef FIONREAD
 	c_macro_t *ma = &el->el_chared.c_macro;
 #endif /* FIONREAD */
 
+	if (nread == NULL)
+		nread = &nrb;
+	*nread = 0;
+
 	if (el->el_flags & NO_TTY) {
-		char *cp = el->el_line.buffer;
 		size_t idx;
 
-		while ((*el->el_read.read_char)(el, cp) == 1) {
+		cp = el->el_line.buffer;
+		while ((num = (*el->el_read.read_char)(el, cp)) == 1) {
 			/* make sure there is space for next character */
 			if (cp + 1 >= el->el_line.limit) {
-				idx = (cp - el->el_line.buffer);
-				if (!ch_enlargebufs(el, 2))
+				idx = (size_t)(cp - el->el_line.buffer);
+				if (!ch_enlargebufs(el, (size_t)2))
 					break;
 				cp = &el->el_line.buffer[idx];
 			}
@@ -425,12 +502,13 @@ el_gets(EditLine *el, int *nread)
 			if (cp[-1] == '\r' || cp[-1] == '\n')
 				break;
 		}
+		if (num == -1) {
+			if (errno == EINTR)
+				cp = el->el_line.buffer;
+			el->el_errno = errno;
+		}
 
-		el->el_line.cursor = el->el_line.lastchar = cp;
-		*cp = '\0';
-		if (nread)
-			*nread = el->el_line.cursor - el->el_line.buffer;
-		return (el->el_line.buffer);
+		goto noedit;
 	}
 
 
@@ -438,12 +516,12 @@ el_gets(EditLine *el, int *nread)
 	if (el->el_tty.t_mode == EX_IO && ma->level < 0) {
 		long chrs = 0;
 
-		(void) ioctl(el->el_infd, FIONREAD, (ioctl_t) & chrs);
+		(void) ioctl(el->el_infd, FIONREAD, &chrs);
 		if (chrs == 0) {
 			if (tty_rawmode(el) < 0) {
-				if (nread)
-					*nread = 0;
-				return (NULL);
+				errno = 0;
+				*nread = 0;
+				return NULL;
 			}
 		}
 	}
@@ -453,25 +531,23 @@ el_gets(EditLine *el, int *nread)
 		read_prepare(el);
 
 	if (el->el_flags & EDIT_DISABLED) {
-		char *cp;
 		size_t idx;
+
 		if ((el->el_flags & UNBUFFERED) == 0)
 			cp = el->el_line.buffer;
 		else
 			cp = el->el_line.lastchar;
 
-		term__flush(el);
+		terminal__flush(el);
 
-		while ((*el->el_read.read_char)(el, cp) == 1) {
+		while ((num = (*el->el_read.read_char)(el, cp)) == 1) {
 			/* make sure there is space next character */
 			if (cp + 1 >= el->el_line.limit) {
-				idx = (cp - el->el_line.buffer);
-				if (!ch_enlargebufs(el, 2))
+				idx = (size_t)(cp - el->el_line.buffer);
+				if (!ch_enlargebufs(el, (size_t)2))
 					break;
 				cp = &el->el_line.buffer[idx];
 			}
-			if (*cp == 4)	/* ought to be stty eof */
-				break;
 			cp++;
 			crlf = cp[-1] == '\r' || cp[-1] == '\n';
 			if (el->el_flags & UNBUFFERED)
@@ -480,11 +556,13 @@ el_gets(EditLine *el, int *nread)
 				break;
 		}
 
-		el->el_line.cursor = el->el_line.lastchar = cp;
-		*cp = '\0';
-		if (nread)
-			*nread = el->el_line.cursor - el->el_line.buffer;
-		return (el->el_line.buffer);
+		if (num == -1) {
+			if (errno == EINTR)
+				cp = el->el_line.buffer;
+			el->el_errno = errno;
+		}
+
+		goto noedit;
 	}
 
 	for (num = OKCMD; num == OKCMD;) {	/* while still editing this
@@ -500,6 +578,12 @@ el_gets(EditLine *el, int *nread)
 #endif /* DEBUG_READ */
 			break;
 		}
+		if (el->el_errno == EINTR) {
+			el->el_line.buffer[0] = '\0';
+			el->el_line.lastchar =
+			    el->el_line.cursor = el->el_line.buffer;
+			break;
+		}
 		if ((unsigned int)cmdnum >= (unsigned int)el->el_map.nfunc) {	/* BUG CHECK command */
 #ifdef DEBUG_EDIT
 			(void) fprintf(el->el_errfile,
@@ -530,7 +614,7 @@ el_gets(EditLine *el, int *nread)
 		    el->el_chared.c_redo.pos < el->el_chared.c_redo.lim) {
 			if (cmdnum == VI_DELETE_PREV_CHAR &&
 			    el->el_chared.c_redo.pos != el->el_chared.c_redo.buf
-			    && el_isprint((unsigned char)el->el_chared.c_redo.pos[-1]))
+			    && Isprint(el->el_chared.c_redo.pos[-1]))
 				el->el_chared.c_redo.pos--;
 			else
 				*el->el_chared.c_redo.pos++ = ch;
@@ -561,7 +645,7 @@ el_gets(EditLine *el, int *nread)
 
 		case CC_REFRESH_BEEP:
 			re_refresh(el);
-			term_beep(el);
+			terminal_beep(el);
 			break;
 
 		case CC_NORM:	/* normal char */
@@ -582,7 +666,7 @@ el_gets(EditLine *el, int *nread)
 			break;
 
 		case CC_NEWLINE:	/* normal end of line */
-			num = el->el_line.lastchar - el->el_line.buffer;
+			num = (int)(el->el_line.lastchar - el->el_line.buffer);
 			break;
 
 		case CC_FATAL:	/* fatal error, reset to known state */
@@ -593,7 +677,7 @@ el_gets(EditLine *el, int *nread)
 			/* put (real) cursor in a known place */
 			re_clear_display(el);	/* reset the display stuff */
 			ch_reset(el, 1);	/* reset the input pointers */
-			re_refresh(el);	/* print the prompt again */
+			re_refresh(el); /* print the prompt again */
 			break;
 
 		case CC_ERROR:
@@ -602,8 +686,8 @@ el_gets(EditLine *el, int *nread)
 			(void) fprintf(el->el_errfile,
 			    "*** editor ERROR ***\r\n\n");
 #endif /* DEBUG_READ */
-			term_beep(el);
-			term__flush(el);
+			terminal_beep(el);
+			terminal__flush(el);
 			break;
 		}
 		el->el_state.argument = 1;
@@ -613,15 +697,26 @@ el_gets(EditLine *el, int *nread)
 			break;
 	}
 
-	term__flush(el);		/* flush any buffered output */
+	terminal__flush(el);		/* flush any buffered output */
 	/* make sure the tty is set up correctly */
 	if ((el->el_flags & UNBUFFERED) == 0) {
 		read_finish(el);
-		if (nread)
-			*nread = num;
+		*nread = num != -1 ? num : 0;
 	} else {
-		if (nread)
-			*nread = el->el_line.lastchar - el->el_line.buffer;
+		*nread = (int)(el->el_line.lastchar - el->el_line.buffer);
 	}
-	return (num ? el->el_line.buffer : NULL);
+	goto done;
+noedit:
+	el->el_line.cursor = el->el_line.lastchar = cp;
+	*cp = '\0';
+	*nread = (int)(el->el_line.cursor - el->el_line.buffer);
+done:
+	if (*nread == 0) {
+		if (num == -1) {
+			*nread = -1;
+			errno = el->el_errno;
+		}
+		return NULL;
+	} else
+		return el->el_line.buffer;
 }
diff -pruN 5.1.58-1/cmd-line-utils/libedit/read.h 5.1.61-2/cmd-line-utils/libedit/read.h
--- 5.1.58-1/cmd-line-utils/libedit/read.h	2011-07-01 15:22:22.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/read.h	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: read.h,v 1.6 2008/04/29 06:53:01 martin Exp $	*/
+/*	$NetBSD: read.h,v 1.7 2009/12/30 22:37:40 christos Exp $	*/
 
 /*-
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
 #ifndef	_h_el_read
 #define	_h_el_read
 
-typedef int (*el_rfunc_t)(EditLine *, char *);
+typedef int (*el_rfunc_t)(EditLine *, Char *);
 
 typedef struct el_read_t {
 	el_rfunc_t	read_char;	/* Function to read a character */
diff -pruN 5.1.58-1/cmd-line-utils/libedit/readline/readline.h 5.1.61-2/cmd-line-utils/libedit/readline/readline.h
--- 5.1.58-1/cmd-line-utils/libedit/readline/readline.h	2011-07-01 15:22:22.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/readline/readline.h	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: readline.h,v 1.24 2009/02/05 19:15:26 christos Exp $	*/
+/*	$NetBSD: readline.h,v 1.32 2010/09/16 20:08:52 christos Exp $	*/
 
 /*-
  * Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -32,6 +32,7 @@
 #define _READLINE_H_
 
 #include <sys/types.h>
+#include <stdio.h>
 
 /* list of readline stuff supported by editline library's readline wrapper */
 
@@ -42,10 +43,18 @@ typedef void	  VCPFunction(char *);
 typedef char	 *CPFunction(const char *, int);
 typedef char	**CPPFunction(const char *, int, int);
 typedef char     *rl_compentry_func_t(const char *, int);
+typedef int	  rl_command_func_t(int, int);
+
+/* only supports length */
+typedef struct {
+	int length;
+} HISTORY_STATE;
+
+typedef void *histdata_t;
 
 typedef struct _hist_entry {
 	const char	*line;
-	const char	*data;
+	histdata_t 	 data;
 } HIST_ENTRY;
 
 typedef struct _keymap_entry {
@@ -79,12 +88,16 @@ typedef KEYMAP_ENTRY *Keymap;
 
 #define RUBOUT		0x7f
 #define ABORT_CHAR	CTRL('G')
+#define RL_READLINE_VERSION 	0x0402
+#define RL_PROMPT_START_IGNORE	'\1'
+#define RL_PROMPT_END_IGNORE	'\2'
 
 /* global variables used by readline enabled applications */
 #ifdef __cplusplus
 extern "C" {
 #endif
 extern const char	*rl_library_version;
+extern int 		rl_readline_version; 
 extern char		*rl_readline_name;
 extern FILE		*rl_instream;
 extern FILE		*rl_outstream;
@@ -138,6 +151,7 @@ int		 where_history(void);
 HIST_ENTRY	*current_history(void);
 HIST_ENTRY	*history_get(int);
 HIST_ENTRY	*remove_history(int);
+HIST_ENTRY	*replace_history_entry(int, const char *, histdata_t);
 int		 history_total_bytes(void);
 int		 history_set_pos(int);
 HIST_ENTRY	*previous_history(void);
@@ -147,6 +161,7 @@ int		 history_search_prefix(const char *
 int		 history_search_pos(const char *, int, int);
 int		 read_history(const char *);
 int		 write_history(const char *);
+int		 history_truncate_file (const char *, int);
 int		 history_expand(char *, char **);
 char	       **history_tokenize(const char *);
 const char	*get_history_event(const char *, int *, int);
@@ -161,8 +176,9 @@ char	       **completion_matches(const c
 void		 rl_display_match_list(char **, int, int);
 
 int		 rl_insert(int, int);
+int		 rl_insert_text(const char *);
 void		 rl_reset_terminal(const char *);
-int		 rl_bind_key(int, int (*)(int, int));
+int		 rl_bind_key(int, rl_command_func_t *);
 int		 rl_newline(int, int);
 void		 rl_callback_read_char(void);
 void		 rl_callback_handler_install(const char *, VCPFunction *);
@@ -176,6 +192,7 @@ int		 rl_parse_and_bind(const char *);
 int		 rl_variable_bind(const char *, const char *);
 void		 rl_stuff_char(int);
 int		 rl_add_defun(const char *, Function *, int);
+HISTORY_STATE	*history_get_history_state(void);
 void		 rl_get_screen_size(int *, int *);
 void		 rl_set_screen_size(int, int);
 char 		*rl_filename_completion_function (const char *, int);
@@ -184,6 +201,7 @@ int		 _rl_qsort_string_compare(char **, 
 char 	       **rl_completion_matches(const char *, rl_compentry_func_t *);
 void		 rl_forced_update_display(void);
 int		 rl_set_prompt(const char *);
+int		 rl_on_new_line(void);
 
 /*
  * The following are not implemented
@@ -193,7 +211,9 @@ Keymap		 rl_get_keymap(void);
 void		 rl_set_keymap(Keymap);
 Keymap		 rl_make_bare_keymap(void);
 int		 rl_generic_bind(int, const char *, const char *, Keymap);
-int		 rl_bind_key_in_map(int, Function *, Keymap);
+int		 rl_bind_key_in_map(int, rl_command_func_t *, Keymap);
+void		 rl_cleanup_after_signal(void);
+void		 rl_free_line_state(void);
 #ifdef __cplusplus
 }
 #endif
diff -pruN 5.1.58-1/cmd-line-utils/libedit/readline.c 5.1.61-2/cmd-line-utils/libedit/readline.c
--- 5.1.58-1/cmd-line-utils/libedit/readline.c	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/readline.c	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: readline.c,v 1.78 2009/02/05 19:15:26 christos Exp $	*/
+/*	$NetBSD: readline.c,v 1.99 2011/08/16 16:25:15 christos Exp $	*/
 
 /*-
  * Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -69,6 +69,7 @@ void rl_deprep_terminal(void);
 /* readline compatibility stuff - look at readline sources/documentation */
 /* to see what these variables mean */
 const char *rl_library_version = "EditLine wrapper";
+int rl_readline_version = RL_READLINE_VERSION;
 static char empty[] = { '\0' };
 static char expand_chars[] = { ' ', '\t', '\n', '=', '(', '\0' };
 static char break_chars[] = { ' ', '\t', '\n', '"', '\\', '\'', '`', '@', '$',
@@ -117,6 +118,7 @@ Function *rl_startup_hook = NULL;
 VFunction *rl_completion_display_matches_hook = NULL;
 VFunction *rl_prep_term_function = (VFunction *)rl_prep_terminal;
 VFunction *rl_deprep_term_function = (VFunction *)rl_deprep_terminal;
+KEYMAP_ENTRY_ARRAY emacs_meta_keymap;
 
 /*
  * The current prompt string.
@@ -174,7 +176,7 @@ static char *
 _get_prompt(EditLine *el __attribute__((__unused__)))
 {
 	rl_already_prompted = 1;
-	return (rl_prompt);
+	return rl_prompt;
 }
 
 
@@ -188,12 +190,12 @@ _move_history(int op)
 	static HIST_ENTRY rl_he;
 
 	if (history(h, &ev, op) != 0)
-		return (HIST_ENTRY *) NULL;
+		return NULL;
 
 	rl_he.line = ev.str;
 	rl_he.data = NULL;
 
-	return (&rl_he);
+	return &rl_he;
 }
 
 
@@ -209,10 +211,34 @@ _getc_function(EditLine *el __attribute_
 	i = (*rl_getc_function)(NULL);
 	if (i == -1)
 		return 0;
-	*c = i;
+	*c = (char)i;
 	return 1;
 }
 
+static void
+_resize_fun(EditLine *el, void *a)
+{
+	const LineInfo *li;
+	char **ap = a;
+
+	li = el_line(el);
+	/* a cheesy way to get rid of const cast. */
+	*ap = memchr(li->buffer, *li->buffer, (size_t)1);
+}
+
+static const char *
+_default_history_file(void)
+{
+	struct passwd *p;
+	static char path[PATH_MAX];
+
+	if (*path)
+		return path;
+	if ((p = getpwuid(getuid())) == NULL)
+		return NULL;
+	(void)snprintf(path, sizeof(path), "%s/.history", p->pw_dir);
+	return path;
+}
 
 /*
  * READLINE compatibility stuff
@@ -224,14 +250,22 @@ _getc_function(EditLine *el __attribute_
 int
 rl_set_prompt(const char *prompt)
 {
+	char *p;
+
 	if (!prompt)
 		prompt = "";
 	if (rl_prompt != NULL && strcmp(rl_prompt, prompt) == 0) 
 		return 0;
 	if (rl_prompt)
-		free(rl_prompt);
+		el_free(rl_prompt);
 	rl_prompt = strdup(prompt);
-	return rl_prompt == NULL ? -1 : 0;
+	if (rl_prompt == NULL)
+		return -1;
+
+	while ((p = strchr(rl_prompt, RL_PROMPT_END_IGNORE)) != NULL)
+		*p = RL_PROMPT_START_IGNORE;
+
+	return 0;
 }
 
 /*
@@ -241,7 +275,6 @@ int
 rl_initialize(void)
 {
 	HistEvent ev;
-	const LineInfo *li;
 	int editmode = 1;
 	struct termios t;
 
@@ -268,13 +301,16 @@ rl_initialize(void)
 
 	h = history_init();
 	if (!e || !h)
-		return (-1);
+		return -1;
 
 	history(h, &ev, H_SETSIZE, INT_MAX);	/* unlimited */
 	history_length = 0;
 	max_input_history = INT_MAX;
 	el_set(e, EL_HIST, history, h);
 
+	/* Setup resize function */
+	el_set(e, EL_RESIZE, _resize_fun, &rl_line_buffer);
+
 	/* setup getc function if valid */
 	if (rl_getc_function)
 		el_set(e, EL_GETCFN, _getc_function);
@@ -285,7 +321,7 @@ rl_initialize(void)
 		el_end(e);
 		return -1;
 	}
-	el_set(e, EL_PROMPT, _get_prompt);
+	el_set(e, EL_PROMPT, _get_prompt, RL_PROMPT_START_IGNORE);
 	el_set(e, EL_SIGNAL, rl_catch_signals);
 
 	/* set default mode to "emacs"-style and read setting afterwards */
@@ -312,7 +348,38 @@ rl_initialize(void)
 	    "ReadLine compatible suspend function",
 	    _el_rl_tstp);
 	el_set(e, EL_BIND, "^Z", "rl_tstp", NULL);
-		
+
+        /*
+         * Set some readline compatible key-bindings.
+         */
+        el_set(e, EL_BIND, "^R", "em-inc-search-prev", NULL);
+
+        /*
+         * Allow the use of Home/End keys.
+         */
+        el_set(e, EL_BIND, "\\e[1~", "ed-move-to-beg", NULL);
+        el_set(e, EL_BIND, "\\e[4~", "ed-move-to-end", NULL);
+        el_set(e, EL_BIND, "\\e[7~", "ed-move-to-beg", NULL);
+        el_set(e, EL_BIND, "\\e[8~", "ed-move-to-end", NULL);
+        el_set(e, EL_BIND, "\\e[H", "ed-move-to-beg", NULL);
+        el_set(e, EL_BIND, "\\e[F", "ed-move-to-end", NULL);
+
+        /*
+         * Allow the use of the Delete/Insert keys.
+         */
+        el_set(e, EL_BIND, "\\e[3~", "ed-delete-next-char", NULL);
+        el_set(e, EL_BIND, "\\e[2~", "ed-quoted-insert", NULL);
+
+        /*
+         * Ctrl-left-arrow and Ctrl-right-arrow for word moving.
+         */
+        el_set(e, EL_BIND, "\\e[1;5C", "em-next-word", NULL);
+        el_set(e, EL_BIND, "\\e[1;5D", "ed-prev-word", NULL);
+        el_set(e, EL_BIND, "\\e[5C", "em-next-word", NULL);
+        el_set(e, EL_BIND, "\\e[5D", "ed-prev-word", NULL);
+        el_set(e, EL_BIND, "\\e\\e[C", "em-next-word", NULL);
+        el_set(e, EL_BIND, "\\e\\e[D", "ed-prev-word", NULL);
+
 	/* read settings from configuration file */
 	el_source(e, NULL);
 
@@ -320,15 +387,13 @@ rl_initialize(void)
 	 * Unfortunately, some applications really do use rl_point
 	 * and rl_line_buffer directly.
 	 */
-	li = el_line(e);
-	/* a cheesy way to get rid of const cast. */
-	rl_line_buffer = memchr(li->buffer, *li->buffer, 1);
+	_resize_fun(e, &rl_line_buffer);
 	_rl_update_pos();
 
 	if (rl_startup_hook)
 		(*rl_startup_hook)(NULL, 0);
 
-	return (0);
+	return 0;
 }
 
 
@@ -437,7 +502,7 @@ _rl_compat_sub(const char *str, const ch
 		} else
 			s++;
 	}
-	r = result = malloc(len + 1);
+	r = result = el_malloc((len + 1) * sizeof(*r));
 	if (result == NULL)
 		return NULL;
 	s = str;
@@ -448,13 +513,13 @@ _rl_compat_sub(const char *str, const ch
 			s += what_len;
 			if (!globally) {
 				(void)strcpy(r, s);
-				return(result);
+				return result;
 			}
 		} else
 			*r++ = *s++;
 	}
 	*r = '\0';
-	return(result);
+	return result;
 }
 
 static	char	*last_search_pat;	/* last !?pat[?] search pattern */
@@ -471,14 +536,14 @@ get_history_event(const char *cmd, int *
 
 	idx = *cindex;
 	if (cmd[idx++] != history_expansion_char)
-		return(NULL);
+		return NULL;
 
 	/* find out which event to take */
 	if (cmd[idx] == history_expansion_char || cmd[idx] == '\0') {
 		if (history(h, &ev, H_FIRST) != 0)
-			return(NULL);
+			return NULL;
 		*cindex = cmd[idx]? (idx + 1):idx;
-		return(ev.str);
+		return ev.str;
 	}
 	sign = 0;
 	if (cmd[idx] == '-') {
@@ -498,10 +563,10 @@ get_history_event(const char *cmd, int *
 			num = history_length - num + 1;
 
 		if (!(rl_he = history_get(num)))
-			return(NULL);
+			return NULL;
 
 		*cindex = idx;
-		return(rl_he->line);
+		return rl_he->line;
 	}
 	sub = 0;
 	if (cmd[idx] == '?') {
@@ -519,15 +584,15 @@ get_history_event(const char *cmd, int *
 			break;
 		idx++;
 	}
-	len = idx - begin;
+	len = (size_t)idx - (size_t)begin;
 	if (sub && cmd[idx] == '?')
 		idx++;
 	if (sub && len == 0 && last_search_pat && *last_search_pat)
 		pat = last_search_pat;
 	else if (len == 0)
-		return(NULL);
+		return NULL;
 	else {
-		if ((pat = malloc(len + 1)) == NULL)
+		if ((pat = el_malloc((len + 1) * sizeof(*pat))) == NULL)
 			return NULL;
 		(void)strncpy(pat, cmd + begin, len);
 		pat[len] = '\0';
@@ -535,15 +600,15 @@ get_history_event(const char *cmd, int *
 
 	if (history(h, &ev, H_CURR) != 0) {
 		if (pat != last_search_pat)
-			free(pat);
-		return (NULL);
+			el_free(pat);
+		return NULL;
 	}
 	num = ev.num;
 
 	if (sub) {
 		if (pat != last_search_pat) {
 			if (last_search_pat)
-				free(last_search_pat);
+				el_free(last_search_pat);
 			last_search_pat = pat;
 		}
 		ret = history_search(pat, -1);
@@ -555,21 +620,21 @@ get_history_event(const char *cmd, int *
 		history(h, &ev, H_FIRST);
 		(void)fprintf(rl_outstream, "%s: Event not found\n", pat);
 		if (pat != last_search_pat)
-			free(pat);
-		return(NULL);
+			el_free(pat);
+		return NULL;
 	}
 
 	if (sub && len) {
 		if (last_search_match && last_search_match != pat)
-			free(last_search_match);
+			el_free(last_search_match);
 		last_search_match = pat;
 	}
 
 	if (pat != last_search_pat)
-		free(pat);
+		el_free(pat);
 
 	if (history(h, &ev, H_CURR) != 0)
-		return(NULL);
+		return NULL;
 	*cindex = idx;
 	rptr = ev.str;
 
@@ -621,7 +686,8 @@ _history_expand_command(const char *comm
 	} else {
 		if (command[offs + 1] == '#') {
 			/* use command so far */
-			if ((aptr = malloc(offs + 1)) == NULL)
+			if ((aptr = el_malloc((offs + 1) * sizeof(*aptr)))
+			    == NULL)
 				return -1;
 			(void)strncpy(aptr, command, offs);
 			aptr[offs] = '\0';
@@ -632,17 +698,19 @@ _history_expand_command(const char *comm
 			qchar = (offs > 0 && command[offs - 1] == '"')? '"':0;
 			ptr = get_history_event(command + offs, &idx, qchar);
 		}
-		has_mods = command[offs + idx] == ':';
+		has_mods = command[offs + (size_t)idx] == ':';
 	}
 
 	if (ptr == NULL && aptr == NULL)
-		return(-1);
+		return -1;
 
 	if (!has_mods) {
-		*result = strdup(aptr? aptr : ptr);
+		*result = strdup(aptr ? aptr : ptr);
 		if (aptr)
-			free(aptr);
-		return(1);
+			el_free(aptr);
+		if (*result == NULL)
+			return -1;
+		return 1;
 	}
 
 	cmd = command + offs + idx + 1;
@@ -687,18 +755,18 @@ _history_expand_command(const char *comm
 			(void)fprintf(rl_outstream, "%s: Bad word specifier",
 			    command + offs + idx);
 			if (aptr)
-				free(aptr);
-			return(-1);
+				el_free(aptr);
+			return -1;
 		}
 	} else
 		tmp = strdup(aptr? aptr:ptr);
 
 	if (aptr)
-		free(aptr);
+		el_free(aptr);
 
 	if (*cmd == '\0' || ((size_t)(cmd - (command + offs)) >= cmdlen)) {
 		*result = tmp;
-		return(1);
+		return 1;
 	}
 
 	for (; *cmd; cmd++) {
@@ -710,7 +778,7 @@ _history_expand_command(const char *comm
 		} else if (*cmd == 't') {	/* remove leading path */
 			if ((aptr = strrchr(tmp, '/')) != NULL) {
 				aptr = strdup(aptr + 1);
-				free(tmp);
+				el_free(tmp);
 				tmp = aptr;
 			}
 		} else if (*cmd == 'r') {	/* remove trailing suffix */
@@ -719,7 +787,7 @@ _history_expand_command(const char *comm
 		} else if (*cmd == 'e') {	/* remove all but suffix */
 			if ((aptr = strrchr(tmp, '.')) != NULL) {
 				aptr = strdup(aptr);
-				free(tmp);
+				el_free(tmp);
 				tmp = aptr;
 			}
 		} else if (*cmd == 'p')		/* print only */
@@ -736,10 +804,10 @@ _history_expand_command(const char *comm
 			else if (*cmd == 's') {
 				delim = *(++cmd), cmd++;
 				size = 16;
-				what = realloc(from, size);
+				what = el_realloc(from, size * sizeof(*what));
 				if (what == NULL) {
-					free(from);
-					free(tmp);
+					el_free(from);
+					el_free(tmp);
 					return 0;
 				}
 				len = 0;
@@ -748,11 +816,12 @@ _history_expand_command(const char *comm
 						cmd++;
 					if (len >= size) {
 						char *nwhat;
-						nwhat = realloc(what,
-								(size <<= 1));
+						nwhat = el_realloc(what,
+						    (size <<= 1) *
+						    sizeof(*nwhat));
 						if (nwhat == NULL) {
-							free(what);
-							free(tmp);
+							el_free(what);
+							el_free(tmp);
 							return 0;
 						}
 						what = nwhat;
@@ -762,17 +831,17 @@ _history_expand_command(const char *comm
 				what[len] = '\0';
 				from = what;
 				if (*what == '\0') {
-					free(what);
+					el_free(what);
 					if (search) {
 						from = strdup(search);
 						if (from == NULL) {
-							free(tmp);
+							el_free(tmp);
 							return 0;
 						}
 					} else {
 						from = NULL;
-						free(tmp);
-						return (-1);
+						el_free(tmp);
+						return -1;
 					}
 				}
 				cmd++;	/* shift after delim */
@@ -780,10 +849,10 @@ _history_expand_command(const char *comm
 					continue;
 
 				size = 16;
-				with = realloc(to, size);
+				with = el_realloc(to, size * sizeof(*with));
 				if (with == NULL) {
-					free(to);
-					free(tmp);
+					el_free(to);
+					el_free(tmp);
 					return -1;
 				}
 				len = 0;
@@ -792,10 +861,11 @@ _history_expand_command(const char *comm
 					if (len + from_len + 1 >= size) {
 						char *nwith;
 						size += from_len + 1;
-						nwith = realloc(with, size);
+						nwith = el_realloc(with,
+						    size * sizeof(*nwith));
 						if (nwith == NULL) {
-							free(with);
-							free(tmp);
+							el_free(with);
+							el_free(tmp);
 							return -1;
 						}
 						with = nwith;
@@ -818,14 +888,14 @@ _history_expand_command(const char *comm
 
 			aptr = _rl_compat_sub(tmp, from, to, g_on);
 			if (aptr) {
-				free(tmp);
+				el_free(tmp);
 				tmp = aptr;
 			}
 			g_on = 0;
 		}
 	}
 	*result = tmp;
-	return (p_on? 2:1);
+	return p_on? 2:1;
 }
 
 
@@ -844,13 +914,13 @@ history_expand(char *str, char **output)
 
 	if (history_expansion_char == 0) {
 		*output = strdup(str);
-		return(0);
+		return 0;
 	}
 
 	*output = NULL;
 	if (str[0] == history_subst_char) {
 		/* ^foo^foo2^ is equivalent to !!:s^foo^foo2^ */
-		*output = malloc(strlen(str) + 4 + 1);
+		*output = el_malloc((strlen(str) + 4 + 1) * sizeof(*output));
 		if (*output == NULL)
 			return 0;
 		(*output)[0] = (*output)[1] = history_expansion_char;
@@ -867,11 +937,12 @@ history_expand(char *str, char **output)
 #define ADD_STRING(what, len, fr)					\
 	{								\
 		if (idx + len + 1 > size) {				\
-			char *nresult = realloc(result, (size += len + 1));\
+			char *nresult = el_realloc(result,		\
+			    (size += len + 1) * sizeof(*nresult));	\
 			if (nresult == NULL) {				\
-				free(*output);				\
+				el_free(*output);			\
 				if (/*CONSTCOND*/fr)			\
-					free(tmp);			\
+					el_free(tmp);			\
 				return 0;				\
 			}						\
 			result = nresult;				\
@@ -938,7 +1009,7 @@ loop:
 			ADD_STRING(tmp, len, 1);
 		}
 		if (tmp) {
-			free(tmp);
+			el_free(tmp);
 			tmp = NULL;
 		}
 		i = j;
@@ -955,10 +1026,10 @@ loop:
 		ret = -1;
 #endif
 	}
-	free(*output);
+	el_free(*output);
 	*output = result;
 
-	return (ret);
+	return ret;
 }
 
 /*
@@ -968,40 +1039,39 @@ char *
 history_arg_extract(int start, int end, const char *str)
 {
 	size_t  i, len, max;
-	char	**arr, *result;
+	char	**arr, *result = NULL;
 
 	arr = history_tokenize(str);
 	if (!arr)
-		return(NULL);
-	if (arr && *arr == NULL) {
-		free(arr);
-		return(NULL);
-	}
+		return NULL;
+	if (arr && *arr == NULL)
+		goto out;
 
 	for (max = 0; arr[max]; max++)
 		continue;
 	max--;
 
 	if (start == '$')
-		start = max;
+		start = (int)max;
 	if (end == '$')
-		end = max;
+		end = (int)max;
 	if (end < 0)
-		end = max + end + 1;
+		end = (int)max + end + 1;
 	if (start < 0)
 		start = end;
 
-	if (start < 0 || end < 0 || (size_t)start > max || (size_t)end > max || start > end)
-		return(NULL);
+	if (start < 0 || end < 0 || (size_t)start > max ||
+	    (size_t)end > max || start > end)
+		goto out;
 
-	for (i = start, len = 0; i <= (size_t)end; i++)
+	for (i = (size_t)start, len = 0; i <= (size_t)end; i++)
 		len += strlen(arr[i]) + 1;
 	len++;
-	result = malloc(len);
+	result = el_malloc(len * sizeof(*result));
 	if (result == NULL)
-		return NULL;
+		goto out;
 
-	for (i = start, len = 0; i <= (size_t)end; i++) {
+	for (i = (size_t)start, len = 0; i <= (size_t)end; i++) {
 		(void)strcpy(result + len, arr[i]);
 		len += strlen(arr[i]);
 		if (i < (size_t)end)
@@ -1009,11 +1079,12 @@ history_arg_extract(int start, int end, 
 	}
 	result[len] = '\0';
 
+out:
 	for (i = 0; arr[i]; i++)
-		free(arr[i]);
-	free(arr);
+		el_free(arr[i]);
+	el_free(arr);
 
-	return(result);
+	return result;
 }
 
 /*
@@ -1050,19 +1121,19 @@ history_tokenize(const char *str)
 		if (idx + 2 >= size) {
 			char **nresult;
 			size <<= 1;
-			nresult = realloc(result, size * sizeof(char *));
+			nresult = el_realloc(result, (size_t)size * sizeof(*nresult));
 			if (nresult == NULL) {
-				free(result);
+				el_free(result);
 				return NULL;
 			}
 			result = nresult;
 		}
-		len = i - start;
-		temp = malloc(len + 1);
+		len = (size_t)i - (size_t)start;
+		temp = el_malloc((size_t)(len + 1) * sizeof(*temp));
 		if (temp == NULL) {
 			for (i = 0; i < idx; i++)
-				free(result[i]);
-			free(result);
+				el_free(result[i]);
+			el_free(result);
 			return NULL;
 		}
 		(void)strncpy(temp, &str[start], len);
@@ -1072,7 +1143,7 @@ history_tokenize(const char *str)
 		if (str[i])
 			i++;
 	}
-	return (result);
+	return result;
 }
 
 
@@ -1104,7 +1175,7 @@ unstifle_history(void)
 	history(h, &ev, H_SETSIZE, INT_MAX);
 	omax = max_input_history;
 	max_input_history = INT_MAX;
-	return (omax);		/* some value _must_ be returned */
+	return omax;		/* some value _must_ be returned */
 }
 
 
@@ -1113,7 +1184,146 @@ history_is_stifled(void)
 {
 
 	/* cannot return true answer */
-	return (max_input_history != INT_MAX);
+	return max_input_history != INT_MAX;
+}
+
+static const char _history_tmp_template[] = "/tmp/.historyXXXXXX";
+
+int
+history_truncate_file (const char *filename, int nlines)
+{
+	int ret = 0;
+	FILE *fp, *tp;
+	char template[sizeof(_history_tmp_template)];
+	char buf[4096];
+	int fd;
+	char *cp;
+	off_t off;
+	int count = 0;
+	ssize_t left = 0;
+
+	if (filename == NULL && (filename = _default_history_file()) == NULL)
+		return errno;
+	if ((fp = fopen(filename, "r+")) == NULL)
+		return errno;
+	strcpy(template, _history_tmp_template);
+	if ((fd = mkstemp(template)) == -1) {
+		ret = errno;
+		goto out1;
+	}
+
+	if ((tp = fdopen(fd, "r+")) == NULL) {
+		close(fd);
+		ret = errno;
+		goto out2;
+	}
+
+	for(;;) {
+		if (fread(buf, sizeof(buf), (size_t)1, fp) != 1) {
+			if (ferror(fp)) {
+				ret = errno;
+				break;
+			}
+			if (fseeko(fp, (off_t)sizeof(buf) * count, SEEK_SET) ==
+			    (off_t)-1) {
+				ret = errno;
+				break;
+			}
+			left = (ssize_t)fread(buf, (size_t)1, sizeof(buf), fp);
+			if (ferror(fp)) {
+				ret = errno;
+				break;
+			}
+			if (left == 0) {
+				count--;
+				left = sizeof(buf);
+			} else if (fwrite(buf, (size_t)left, (size_t)1, tp)
+			    != 1) {
+				ret = errno;
+				break;
+			}
+			fflush(tp);
+			break;
+		}
+		if (fwrite(buf, sizeof(buf), (size_t)1, tp) != 1) {
+			ret = errno;
+			break;
+		}
+		count++;
+	}
+	if (ret)
+		goto out3;
+	cp = buf + left - 1;
+	if(*cp != '\n')
+		cp++;
+	for(;;) {
+		while (--cp >= buf) {
+			if (*cp == '\n') {
+				if (--nlines == 0) {
+					if (++cp >= buf + sizeof(buf)) {
+						count++;
+						cp = buf;
+					}
+					break;
+				}
+			}
+		}
+		if (nlines <= 0 || count == 0)
+			break;
+		count--;
+		if (fseeko(tp, (off_t)sizeof(buf) * count, SEEK_SET) < 0) {
+			ret = errno;
+			break;
+		}
+		if (fread(buf, sizeof(buf), (size_t)1, tp) != 1) {
+			if (ferror(tp)) {
+				ret = errno;
+				break;
+			}
+			ret = EAGAIN;
+			break;
+		}
+		cp = buf + sizeof(buf);
+	}
+
+	if (ret || nlines > 0)
+		goto out3;
+
+	if (fseeko(fp, (off_t)0, SEEK_SET) == (off_t)-1) {
+		ret = errno;
+		goto out3;
+	}
+
+	if (fseeko(tp, (off_t)sizeof(buf) * count + (cp - buf), SEEK_SET) ==
+	    (off_t)-1) {
+		ret = errno;
+		goto out3;
+	}
+
+	for(;;) {
+		if ((left = (ssize_t)fread(buf, (size_t)1, sizeof(buf), tp)) == 0) {
+			if (ferror(fp))
+				ret = errno;
+			break;
+		}
+		if (fwrite(buf, (size_t)left, (size_t)1, fp) != 1) {
+			ret = errno;
+			break;
+		}
+	}
+	fflush(fp);
+	if((off = ftello(fp)) > 0) {
+		if (ftruncate(fileno(fp), off) == -1)
+                  ret = errno;
+        }
+out3:
+	fclose(tp);
+out2:
+	unlink(template);
+out1:
+	fclose(fp);
+
+	return ret;
 }
 
 
@@ -1127,7 +1337,10 @@ read_history(const char *filename)
 
 	if (h == NULL || e == NULL)
 		rl_initialize();
-	return (history(h, &ev, H_LOAD, filename) == -1);
+	if (filename == NULL && (filename = _default_history_file()) == NULL)
+		return errno;
+	return history(h, &ev, H_LOAD, filename) == -1 ?
+	    (errno ? errno : EINVAL) : 0;
 }
 
 
@@ -1141,7 +1354,10 @@ write_history(const char *filename)
 
 	if (h == NULL || e == NULL)
 		rl_initialize();
-	return (history(h, &ev, H_SAVE, filename) == -1);
+	if (filename == NULL && (filename = _default_history_file()) == NULL)
+		return errno;
+	return history(h, &ev, H_SAVE, filename) == -1 ?
+	    (errno ? errno : EINVAL) : 0;
 }
 
 
@@ -1162,24 +1378,23 @@ history_get(int num)
 
 	/* save current position */
 	if (history(h, &ev, H_CURR) != 0)
-		return (NULL);
+		return NULL;
 	curr_num = ev.num;
 
-	/* start from most recent */
-	if (history(h, &ev, H_FIRST) != 0)
-		return (NULL);	/* error */
-
-	/* look backwards for event matching specified offset */
-	if (history(h, &ev, H_NEXT_EVENT, num + 1))
-		return (NULL);
+	/* start from the oldest */
+	if (history(h, &ev, H_LAST) != 0)
+		return NULL;	/* error */
+
+	/* look forwards for event matching specified offset */
+	if (history(h, &ev, H_NEXT_EVDATA, num, &she.data))
+		return NULL;
 
 	she.line = ev.str;
-	she.data = NULL;
 
 	/* restore pointer to where it was */
 	(void)history(h, &ev, H_SET, curr_num);
 
-	return (&she);
+	return &she;
 }
 
 
@@ -1198,7 +1413,7 @@ add_history(const char *line)
 	if (history(h, &ev, H_GETSIZE) == 0)
 		history_length = ev.num;
 
-	return (!(history_length > 0)); /* return 0 if all is okay */
+	return !(history_length > 0); /* return 0 if all is okay */
 }
 
 
@@ -1208,26 +1423,75 @@ add_history(const char *line)
 HIST_ENTRY *
 remove_history(int num)
 {
-	HIST_ENTRY *she;
+	HIST_ENTRY *he;
 	HistEvent ev;
 
 	if (h == NULL || e == NULL)
 		rl_initialize();
 
-	if (history(h, &ev, H_DEL, num) != 0)
+	if ((he = el_malloc(sizeof(*he))) == NULL)
 		return NULL;
 
-	if ((she = malloc(sizeof(*she))) == NULL)
+	if (history(h, &ev, H_DELDATA, num, &he->data) != 0) {
+		el_free(he);
 		return NULL;
+	}
 
-	she->line = ev.str;
-	she->data = NULL;
+	he->line = ev.str;
+	if (history(h, &ev, H_GETSIZE) == 0)
+		history_length = ev.num;
 
-	return she;
+	return he;
 }
 
 
 /*
+ * replace the line and data of the num-th entry
+ */
+HIST_ENTRY *
+replace_history_entry(int num, const char *line, histdata_t data)
+{
+	HIST_ENTRY *he;
+	HistEvent ev;
+	int curr_num;
+
+	if (h == NULL || e == NULL)
+		rl_initialize();
+
+	/* save current position */
+	if (history(h, &ev, H_CURR) != 0)
+		return NULL;
+	curr_num = ev.num;
+
+	/* start from the oldest */
+	if (history(h, &ev, H_LAST) != 0)
+		return NULL;	/* error */
+
+	if ((he = el_malloc(sizeof(*he))) == NULL)
+		return NULL;
+
+	/* look forwards for event matching specified offset */
+	if (history(h, &ev, H_NEXT_EVDATA, num, &he->data))
+		goto out;
+
+	he->line = strdup(ev.str);
+	if (he->line == NULL)
+		goto out;
+
+	if (history(h, &ev, H_REPLACE, line, data))
+		goto out;
+
+	/* restore pointer to where it was */
+	if (history(h, &ev, H_SET, curr_num))
+		goto out;
+
+	return he;
+out:
+	el_free(he);
+	return NULL;
+}
+
+/*
  * clear the history list - delete all entries
  */
 void
@@ -1235,7 +1499,8 @@ clear_history(void)
 {
 	HistEvent ev;
 
-	history(h, &ev, H_CLEAR);
+	(void)history(h, &ev, H_CLEAR);
+	history_length = 0;
 }
 
 
@@ -1249,15 +1514,15 @@ where_history(void)
 	int curr_num, off;
 
 	if (history(h, &ev, H_CURR) != 0)
-		return (0);
+		return 0;
 	curr_num = ev.num;
 
-	history(h, &ev, H_FIRST);
+	(void)history(h, &ev, H_FIRST);
 	off = 1;
 	while (ev.num != curr_num && history(h, &ev, H_NEXT) == 0)
 		off++;
 
-	return (off);
+	return off;
 }
 
 
@@ -1268,7 +1533,7 @@ HIST_ENTRY *
 current_history(void)
 {
 
-	return (_move_history(H_CURR));
+	return _move_history(H_CURR);
 }
 
 
@@ -1279,22 +1544,23 @@ int
 history_total_bytes(void)
 {
 	HistEvent ev;
-	int curr_num, size;
+	int curr_num;
+	size_t size;
 
 	if (history(h, &ev, H_CURR) != 0)
-		return (-1);
+		return -1;
 	curr_num = ev.num;
 
-	history(h, &ev, H_FIRST);
+	(void)history(h, &ev, H_FIRST);
 	size = 0;
 	do
-		size += strlen(ev.str);
+		size += strlen(ev.str) * sizeof(*ev.str);
 	while (history(h, &ev, H_NEXT) == 0);
 
 	/* get to the same position as before */
 	history(h, &ev, H_PREV_EVENT, curr_num);
 
-	return (size);
+	return (int)size;
 }
 
 
@@ -1307,17 +1573,21 @@ history_set_pos(int pos)
 	HistEvent ev;
 	int curr_num;
 
-	if (pos > history_length || pos < 0)
-		return (-1);
+	if (pos >= history_length || pos < 0)
+		return -1;
 
-	history(h, &ev, H_CURR);
+	(void)history(h, &ev, H_CURR);
 	curr_num = ev.num;
 
-	if (history(h, &ev, H_SET, pos)) {
-		history(h, &ev, H_SET, curr_num);
-		return(-1);
+	/*
+	 * use H_DELDATA to set to nth history (without delete) by passing
+	 * (void **)-1
+	 */
+	if (history(h, &ev, H_DELDATA, pos, (void **)-1)) {
+		(void)history(h, &ev, H_SET, curr_num);
+		return -1;
 	}
-	return (0);
+	return 0;
 }
 
 
@@ -1328,7 +1598,7 @@ HIST_ENTRY *
 previous_history(void)
 {
 
-	return (_move_history(H_PREV));
+	return _move_history(H_PREV);
 }
 
 
@@ -1339,7 +1609,7 @@ HIST_ENTRY *
 next_history(void)
 {
 
-	return (_move_history(H_NEXT));
+	return _move_history(H_NEXT);
 }
 
 
@@ -1354,17 +1624,17 @@ history_search(const char *str, int dire
 	int curr_num;
 
 	if (history(h, &ev, H_CURR) != 0)
-		return (-1);
+		return -1;
 	curr_num = ev.num;
 
 	for (;;) {
 		if ((strp = strstr(ev.str, str)) != NULL)
-			return (int) (strp - ev.str);
+			return (int)(strp - ev.str);
 		if (history(h, &ev, direction < 0 ? H_NEXT:H_PREV) != 0)
 			break;
 	}
-	history(h, &ev, H_SET, curr_num);
-	return (-1);
+	(void)history(h, &ev, H_SET, curr_num);
+	return -1;
 }
 
 
@@ -1376,7 +1646,8 @@ history_search_prefix(const char *str, i
 {
 	HistEvent ev;
 
-	return (history(h, &ev, direction < 0? H_PREV_STR:H_NEXT_STR, str));
+	return (history(h, &ev, direction < 0 ?
+	    H_PREV_STR : H_NEXT_STR, str));
 }
 
 
@@ -1396,24 +1667,24 @@ history_search_pos(const char *str,
 	pos = (pos > 0) ? 1 : -1;
 
 	if (history(h, &ev, H_CURR) != 0)
-		return (-1);
+		return -1;
 	curr_num = ev.num;
 
 	if (history_set_pos(off) != 0 || history(h, &ev, H_CURR) != 0)
-		return (-1);
-
+		return -1;
 
 	for (;;) {
 		if (strstr(ev.str, str))
-			return (off);
+			return off;
 		if (history(h, &ev, (pos < 0) ? H_PREV : H_NEXT) != 0)
 			break;
 	}
 
 	/* set "current" pointer back to previous state */
-	history(h, &ev, (pos < 0) ? H_NEXT_EVENT : H_PREV_EVENT, curr_num);
+	(void)history(h, &ev,
+	    pos < 0 ? H_NEXT_EVENT : H_PREV_EVENT, curr_num);
 
-	return (-1);
+	return -1;
 }
 
 
@@ -1436,16 +1707,20 @@ filename_completion_function(const char 
  * a completion generator for usernames; returns _first_ username
  * which starts with supplied text
  * text contains a partial username preceded by random character
- * (usually '~'); state is ignored
+ * (usually '~'); state resets search from start (??? should we do that anyway)
  * it's callers responsibility to free returned value
  */
 char *
 username_completion_function(const char *text, int state)
 {
-	struct passwd *pwd;
+#if defined(HAVE_GETPW_R_POSIX) || defined(HAVE_GETPW_R_DRAFT)
+	struct passwd pwres;
+	char pwbuf[1024];
+#endif
+	struct passwd *pass = NULL;
 
 	if (text[0] == '\0')
-		return (NULL);
+		return NULL;
 
 	if (*text == '~')
 		text++;
@@ -1453,15 +1728,21 @@ username_completion_function(const char 
 	if (state == 0)
 		setpwent();
 
-	/* XXXMYSQL: just use non-_r functions for now */
-	while ((pwd = getpwent()) && text[0] == pwd->pw_name[0]
-	    && strcmp(text, pwd->pw_name) == 0);
+	while (
+#if defined(HAVE_GETPW_R_POSIX) || defined(HAVE_GETPW_R_DRAFT)
+	    getpwent_r(&pwres, pwbuf, sizeof(pwbuf), &pass) == 0 && pass != NULL
+#else
+	    (pass = getpwent()) != NULL
+#endif
+	    && text[0] == pass->pw_name[0]
+	    && strcmp(text, pass->pw_name) == 0)
+		continue;
 
-	if (pwd == NULL) {
+	if (pass == NULL) {
 		endpwent();
-		return (NULL);
+		return NULL;
 	}
-	return (strdup(pwd->pw_name));
+	return strdup(pass->pw_name);
 }
 
 
@@ -1485,7 +1766,7 @@ void
 rl_display_match_list(char **matches, int len, int max)
 {
 
-	fn_display_match_list(e, matches, len, max);
+	fn_display_match_list(e, matches, (size_t)len, (size_t)max);
 }
 
 static const char *
@@ -1494,7 +1775,7 @@ _rl_completion_append_character_function
     __attribute__((__unused__)))
 {
 	static char buf[2];
-	buf[0] = rl_completion_append_character;
+	buf[0] = (char)rl_completion_append_character;
 	buf[1] = '\0';
 	return buf;
 }
@@ -1507,6 +1788,10 @@ _rl_completion_append_character_function
 int
 rl_complete(int ignore __attribute__((__unused__)), int invoking_key)
 {
+#ifdef WIDECHAR
+	static ct_buffer_t wbreak_conv, sprefix_conv;
+#endif
+
 	if (h == NULL || e == NULL)
 		rl_initialize();
 
@@ -1515,17 +1800,21 @@ rl_complete(int ignore __attribute__((__
 		arr[0] = (char)invoking_key;
 		arr[1] = '\0';
 		el_insertstr(e, arr);
-		return (CC_REFRESH);
+		return CC_REFRESH;
 	}
 
 	/* Just look at how many global variables modify this operation! */
 	return fn_complete(e,
 	    (CPFunction *)rl_completion_entry_function,
 	    rl_attempted_completion_function,
-	    rl_basic_word_break_characters, rl_special_prefixes,
-	    _rl_completion_append_character_function, rl_completion_query_items,
+	    ct_decode_string(rl_basic_word_break_characters, &wbreak_conv),
+	    ct_decode_string(rl_special_prefixes, &sprefix_conv),
+	    _rl_completion_append_character_function,
+	    (size_t)rl_completion_query_items,
 	    &rl_completion_type, &rl_attempted_completion_over,
 	    &rl_point, &rl_end);
+
+
 }
 
 
@@ -1544,7 +1833,7 @@ _el_rl_complete(EditLine *el __attribute
  * bind key c to readline-type function func
  */
 int
-rl_bind_key(int c, int func(int, int))
+rl_bind_key(int c, rl_command_func_t *func)
 {
 	int retval = -1;
 
@@ -1556,7 +1845,7 @@ rl_bind_key(int c, int func(int, int))
 		e->el_map.key[c] = ED_INSERT;
 		retval = 0;
 	}
-	return (retval);
+	return retval;
 }
 
 
@@ -1572,7 +1861,7 @@ rl_read_key(void)
 	if (e == NULL || h == NULL)
 		rl_initialize();
 
-	return (el_getc(e, fooarr));
+	return el_getc(e, fooarr);
 }
 
 
@@ -1602,19 +1891,33 @@ rl_insert(int count, int c)
 		rl_initialize();
 
 	/* XXX - int -> char conversion can lose on multichars */
-	arr[0] = c;
+	arr[0] = (char)c;
 	arr[1] = '\0';
 
 	for (; count > 0; count--)
 		el_push(e, arr);
 
-	return (0);
+	return 0;
+}
+
+int
+rl_insert_text(const char *text)
+{
+	if (!text || *text == 0)
+		return 0;
+
+	if (h == NULL || e == NULL)
+		rl_initialize();
+
+	if (el_insertstr(e, text) < 0)
+		return 0;
+	return (int)strlen(text);
 }
 
 /*ARGSUSED*/
 int
 rl_newline(int count __attribute__((__unused__)),
-	   int c __attribute__((__unused__)))
+    int c __attribute__((__unused__)))
 {
 	/*
 	 * Readline-4.0 appears to ignore the args.
@@ -1675,7 +1978,7 @@ rl_callback_read_char()
 		} else
 			wbuf = NULL;
 		(*(void (*)(const char *))rl_linefunc)(wbuf);
-		el_set(e, EL_UNBUFFERED, 1);
+		//el_set(e, EL_UNBUFFERED, 1);
 	}
 }
 
@@ -1701,7 +2004,7 @@ void
 rl_redisplay(void)
 {
 	char a[2];
-	a[0] = e->el_tty.t_c[TS_IO][C_REPRINT];
+	a[0] = (char)e->el_tty.t_c[TS_IO][C_REPRINT];
 	a[1] = '\0';
 	el_push(e, a);
 }
@@ -1710,7 +2013,7 @@ int
 rl_get_previous_history(int count, int key)
 {
 	char a[2];
-	a[0] = key;
+	a[0] = (char)key;
 	a[1] = '\0';
 	while (count--)
 		el_push(e, a);
@@ -1733,7 +2036,7 @@ rl_deprep_terminal(void)
 int
 rl_read_init_file(const char *s)
 {
-	return(el_source(e, s));
+	return el_source(e, s);
 }
 
 int
@@ -1747,7 +2050,7 @@ rl_parse_and_bind(const char *line)
 	tok_str(tok, line, &argc, &argv);
 	argc = el_parse(e, argc, argv);
 	tok_end(tok);
-	return (argc ? 1 : 0);
+	return argc ? 1 : 0;
 }
 
 int
@@ -1757,7 +2060,7 @@ rl_variable_bind(const char *var, const 
 	 * The proper return value is undocument, but this is what the
 	 * readline source seems to do.
 	 */
-	return ((el_set(e, EL_BIND, "", var, value) == -1) ? 1 : 0);
+	return el_set(e, EL_BIND, "", var, value) == -1 ? 1 : 0;
 }
 
 void
@@ -1765,7 +2068,7 @@ rl_stuff_char(int c)
 {
 	char buf[2];
 
-	buf[0] = c;
+	buf[0] = (char)c;
 	buf[1] = '\0';
 	el_insertstr(e, buf);
 }
@@ -1773,7 +2076,8 @@ rl_stuff_char(int c)
 static int
 _rl_event_read_char(EditLine *el, char *cp)
 {
-	int	n, num_read = 0;
+	int	n;
+	ssize_t num_read = 0;
 
 	*cp = '\0';
 	while (rl_event_hook) {
@@ -1782,23 +2086,23 @@ _rl_event_read_char(EditLine *el, char *
 
 #if defined(FIONREAD)
 		if (ioctl(el->el_infd, FIONREAD, &n) < 0)
-			return(-1);
+			return -1;
 		if (n)
-			num_read = read(el->el_infd, cp, 1);
+			num_read = read(el->el_infd, cp, (size_t)1);
 		else
 			num_read = 0;
 #elif defined(F_SETFL) && defined(O_NDELAY)
 		if ((n = fcntl(el->el_infd, F_GETFL, 0)) < 0)
-			return(-1);
+			return -1;
 		if (fcntl(el->el_infd, F_SETFL, n|O_NDELAY) < 0)
-			return(-1);
+			return -1;
 		num_read = read(el->el_infd, cp, 1);
 		if (fcntl(el->el_infd, F_SETFL, n))
-			return(-1);
+			return -1;
 #else
 		/* not non-blocking, but what you gonna do? */
 		num_read = read(el->el_infd, cp, 1);
-		return(-1);
+		return -1;
 #endif
 
 		if (num_read < 0 && errno == EAGAIN)
@@ -1809,7 +2113,7 @@ _rl_event_read_char(EditLine *el, char *
 	}
 	if (!rl_event_hook)
 		el_set(el, EL_GETCFN, EL_BUILTIN_GETCFN);
-	return(num_read);
+	return (int)num_read;
 }
 
 static void
@@ -1817,8 +2121,8 @@ _rl_update_pos(void)
 {
 	const LineInfo *li = el_line(e);
 
-	rl_point = li->cursor - li->buffer;
-	rl_end = li->lastchar - li->buffer;
+	rl_point = (int)(li->cursor - li->buffer);
+	rl_end = (int)(li->lastchar - li->buffer);
 }
 
 void
@@ -1848,18 +2152,18 @@ rl_completion_matches(const char *str, r
 
 	len = 1;
 	max = 10;
-	if ((list = malloc(max * sizeof(*list))) == NULL)
+	if ((list = el_malloc(max * sizeof(*list))) == NULL)
 		return NULL;
 
 	while ((match = (*fun)(str, (int)(len - 1))) != NULL) {
+		list[len++] = match;
 		if (len == max) {
 			char **nl;
 			max += 10;
-			if ((nl = realloc(list, max * sizeof(*nl))) == NULL)
+			if ((nl = el_realloc(list, max * sizeof(*nl))) == NULL)
 				goto out;
 			list = nl;
 		}
-		list[len++] = match;
 	}
 	if (len == 1)
 		goto out;
@@ -1883,7 +2187,7 @@ rl_completion_matches(const char *str, r
 		if ((list[0] = strdup(str)) == NULL)
 			goto out;
 	} else {
-		if ((list[0] = malloc(min + 1)) == NULL)
+		if ((list[0] = el_malloc((min + 1) * sizeof(*list[0]))) == NULL)
 			goto out;
 		(void)memcpy(list[0], list[1], min);
 		list[0][min] = '\0';
@@ -1891,7 +2195,7 @@ rl_completion_matches(const char *str, r
 	return list;
 		
 out:
-	free(list);
+	el_free(list);
 	return NULL;
 }
 
@@ -1921,10 +2225,21 @@ _rl_qsort_string_compare(char **s1, char
 	return strcoll(*s1, *s2);
 }
 
+HISTORY_STATE *
+history_get_history_state(void)
+{
+	HISTORY_STATE *hs;
+
+	if ((hs = el_malloc(sizeof(*hs))) == NULL)
+		return NULL;
+	hs->length = history_length;
+	return hs;
+}
+
 int
 /*ARGSUSED*/
 rl_kill_text(int from __attribute__((__unused__)),
-	     int to __attribute__((__unused__)))
+    int to __attribute__((__unused__)))
 {
 	return 0;
 }
@@ -1950,9 +2265,9 @@ rl_set_keymap(Keymap k __attribute__((__
 int
 /*ARGSUSED*/
 rl_generic_bind(int type __attribute__((__unused__)),
-		const char * keyseq __attribute__((__unused__)),
-		const char * data __attribute__((__unused__)),
-		Keymap k __attribute__((__unused__)))
+    const char * keyseq __attribute__((__unused__)),
+    const char * data __attribute__((__unused__)),
+    Keymap k __attribute__((__unused__)))
 {
 	return 0;
 }
@@ -1960,8 +2275,20 @@ rl_generic_bind(int type __attribute__((
 int
 /*ARGSUSED*/
 rl_bind_key_in_map(int key __attribute__((__unused__)),
-		   Function *fun __attribute__((__unused__)),
-		   Keymap k __attribute__((__unused__)))
+    rl_command_func_t *fun __attribute__((__unused__)),
+    Keymap k __attribute__((__unused__)))
+{
+	return 0;
+}
+
+/* unsupported, but needed by python */
+void
+rl_cleanup_after_signal(void)
+{
+}
+
+int
+rl_on_new_line(void)
 {
 	return 0;
 }
diff -pruN 5.1.58-1/cmd-line-utils/libedit/README 5.1.61-2/cmd-line-utils/libedit/README
--- 5.1.58-1/cmd-line-utils/libedit/README	2011-07-01 15:22:20.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/README	2011-12-16 19:06:04.000000000 +0000
@@ -2,7 +2,7 @@ An approximate method to merge from upst
 
 	# Fetch latest from upstream (we also include some compat stuff)
 	$ CVS_RSH=ssh; export CVS_RSH
-	$ CVSROOT="anoncvs@stripped:/cvsroot"
+	$ CVSROOT="anoncvs@anoncvs.netbsd.org:/cvsroot"
 	$ cvs co -d libedit -P src/lib/libedit
 	$ mkdir libedit/np
 	$ for f in src/common/lib/libc/string/strlcat.c \
@@ -24,13 +24,13 @@ An approximate method to merge from upst
 
 	# Rename files to match our naming
 	$ mv makelist makelist.sh
-	$ mv term.h el_term.h
+	$ mv terminal.h el_terminal.h
 
 	# Remove NetBSD-specific bits
 	$ for file in $(find . -type f)
 	> do
 	>   cp ${file} ${file}.orig
-	>   sed -e 's/#include "term.h"/#include "el_term.h"/g' \
+	>   sed -e 's/#include "terminal.h"/#include "el_terminal.h"/g' \
 	>       -e 's/sig_handler/el_sig_handler/g' \
 	>       -e 's/isprint/el_isprint/g' \
 	>       -e '/^__RCSID/d' \
@@ -42,9 +42,9 @@ then merge remaining bits by hand.  All 
 marked with XXXMYSQL to make them easier to identify and merge.  To generate
 a 'clean' diff against upstream you can use the above commands but use
 
-	cvs co -D "2009/02/06 20:09:00" [..]
+	cvs co -D "2011/10/23 17:37:55" [..]
 
 to fetch the baseline of most recent merge.
 
-Please feed any fixes to Jonathan Perkin <jperkin@stripped> who will endeavour
-to merge them upstream and keep diffs minimal.
+Please feed any fixes to Jonathan Perkin <jonathan.perkin@oracle.com> who will
+endeavour to merge them upstream and keep diffs minimal.
diff -pruN 5.1.58-1/cmd-line-utils/libedit/refresh.c 5.1.61-2/cmd-line-utils/libedit/refresh.c
--- 5.1.58-1/cmd-line-utils/libedit/refresh.c	2011-07-01 15:22:22.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/refresh.c	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: refresh.c,v 1.28 2008/09/10 15:45:37 christos Exp $	*/
+/*	$NetBSD: refresh.c,v 1.37 2011/07/29 23:44:45 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -50,14 +50,15 @@ static char sccsid[] = "@(#)refresh.c	8.
 
 #include "el.h"
 
-private void	re_addc(EditLine *, int);
-private void	re_update_line(EditLine *, char *, char *, int);
-private void	re_insert (EditLine *, char *, int, int, char *, int);
-private void	re_delete(EditLine *, char *, int, int, int);
-private void	re_fastputc(EditLine *, int);
+private void	re_nextline(EditLine *);
+private void	re_addc(EditLine *, Int);
+private void	re_update_line(EditLine *, Char *, Char *, int);
+private void	re_insert (EditLine *, Char *, int, int, Char *, int);
+private void	re_delete(EditLine *, Char *, int, int, int);
+private void	re_fastputc(EditLine *, Int);
 private void	re_clear_eol(EditLine *, int, int, int);
-private void	re__strncopy(char *, char *, size_t);
-private void	re__copy_and_pad(char *, const char *, size_t);
+private void	re__strncopy(Char *, Char *, size_t);
+private void	re__copy_and_pad(Char *, const Char *, size_t);
 
 #ifdef DEBUG_REFRESH
 private void	re_printstr(EditLine *, const char *, char *, char *);
@@ -87,45 +88,70 @@ re_printstr(EditLine *el, const char *st
 #define	ELRE_DEBUG(a, b)
 #endif
 
+/* re_nextline():
+ *	Move to the next line or scroll
+ */
+private void
+re_nextline(EditLine *el)
+{
+	el->el_refresh.r_cursor.h = 0;	/* reset it. */
+
+	/*
+	 * If we would overflow (input is longer than terminal size),
+	 * emulate scroll by dropping first line and shuffling the rest.
+	 * We do this via pointer shuffling - it's safe in this case
+	 * and we avoid memcpy().
+	 */
+	if (el->el_refresh.r_cursor.v + 1 >= el->el_terminal.t_size.v) {
+		int i, lins = el->el_terminal.t_size.v;
+		Char *firstline = el->el_vdisplay[0];
+
+		for(i = 1; i < lins; i++)
+			el->el_vdisplay[i - 1] = el->el_vdisplay[i];
+
+		firstline[0] = '\0';		/* empty the string */	
+		el->el_vdisplay[i - 1] = firstline;
+	} else
+		el->el_refresh.r_cursor.v++;
+
+	ELRE_ASSERT(el->el_refresh.r_cursor.v >= el->el_terminal.t_size.v,
+	    (__F, "\r\nre_putc: overflow! r_cursor.v == %d > %d\r\n",
+	    el->el_refresh.r_cursor.v, el->el_terminal.t_size.v),
+	    abort());
+}
 
 /* re_addc():
  *	Draw c, expanding tabs, control chars etc.
  */
 private void
-re_addc(EditLine *el, int c)
+re_addc(EditLine *el, Int c)
 {
-
-	if (el_isprint(c)) {
-		re_putc(el, c, 1);
-		return;
-	}
-	if (c == '\n') {				/* expand the newline */
-		int oldv = el->el_refresh.r_cursor.v;
-		re_putc(el, '\0', 0);			/* assure end of line */
-		if (oldv == el->el_refresh.r_cursor.v) { /* XXX */
-			el->el_refresh.r_cursor.h = 0;	/* reset cursor pos */
-			el->el_refresh.r_cursor.v++;
-		}
-		return;
-	}
-	if (c == '\t') {				/* expand the tab */
+	switch (ct_chr_class((Char)c)) {
+	case CHTYPE_TAB:        /* expand the tab */
 		for (;;) {
 			re_putc(el, ' ', 1);
 			if ((el->el_refresh.r_cursor.h & 07) == 0)
 				break;			/* go until tab stop */
 		}
-	} else if (iscntrl(c)) {
-		re_putc(el, '^', 1);
-		if (c == '\177')
-			re_putc(el, '?', 1);
-		else
-		    /* uncontrolify it; works only for iso8859-1 like sets */
-			re_putc(el, (c | 0100), 1);
-	} else {
-		re_putc(el, '\\', 1);
-		re_putc(el, (int) ((((unsigned int) c >> 6) & 07) + '0'), 1);
-		re_putc(el, (int) ((((unsigned int) c >> 3) & 07) + '0'), 1);
-		re_putc(el, (c & 07) + '0', 1);
+		break;
+	case CHTYPE_NL: {
+		int oldv = el->el_refresh.r_cursor.v;
+		re_putc(el, '\0', 0);			/* assure end of line */
+		if (oldv == el->el_refresh.r_cursor.v)	/* XXX */
+			re_nextline(el);
+		break;
+	}
+	case CHTYPE_PRINT:
+		re_putc(el, c, 1);
+		break;
+	default: {
+		Char visbuf[VISUAL_WIDTH_MAX];
+		ssize_t i, n =
+		    ct_visual_char(visbuf, VISUAL_WIDTH_MAX, (Char)c);
+		for (i = 0; n-- > 0; ++i)
+		    re_putc(el, visbuf[i], 1);
+		break;
+	}
 	}
 }
 
@@ -134,43 +160,31 @@ re_addc(EditLine *el, int c)
  *	Draw the character given
  */
 protected void
-re_putc(EditLine *el, int c, int shift)
+re_putc(EditLine *el, Int c, int shift)
 {
+	int i, w = Width(c);
+	ELRE_DEBUG(1, (__F, "printing %5x '%c'\r\n", c, c));
 
-	ELRE_DEBUG(1, (__F, "printing %3.3o '%c'\r\n", c, c));
+	while (shift && (el->el_refresh.r_cursor.h + w > el->el_terminal.t_size.h))
+	    re_putc(el, ' ', 1);
+
+	el->el_vdisplay[el->el_refresh.r_cursor.v]
+	    [el->el_refresh.r_cursor.h] = c;
+	/* assumes !shift is only used for single-column chars */
+	i = w;
+	while (--i > 0)
+		el->el_vdisplay[el->el_refresh.r_cursor.v]
+		    [el->el_refresh.r_cursor.h + i] = MB_FILL_CHAR;
 
-	el->el_vdisplay[el->el_refresh.r_cursor.v][el->el_refresh.r_cursor.h] = c;
 	if (!shift)
 		return;
 
-	el->el_refresh.r_cursor.h++;	/* advance to next place */
-	if (el->el_refresh.r_cursor.h >= el->el_term.t_size.h) {
-		el->el_vdisplay[el->el_refresh.r_cursor.v][el->el_term.t_size.h] = '\0';
+	el->el_refresh.r_cursor.h += w;	/* advance to next place */
+	if (el->el_refresh.r_cursor.h >= el->el_terminal.t_size.h) {
 		/* assure end of line */
-		el->el_refresh.r_cursor.h = 0;	/* reset it. */
-
-		/*
-		 * If we would overflow (input is longer than terminal size),
-		 * emulate scroll by dropping first line and shuffling the rest.
-		 * We do this via pointer shuffling - it's safe in this case
-		 * and we avoid memcpy().
-		 */
-		if (el->el_refresh.r_cursor.v + 1 >= el->el_term.t_size.v) {
-			int i, lins = el->el_term.t_size.v;
-			char *firstline = el->el_vdisplay[0];
-
-			for(i=1; i < lins; i++)
-				el->el_vdisplay[i-1] = el->el_vdisplay[i];
-
-			firstline[0] = '\0';		/* empty the string */	
-			el->el_vdisplay[i-1] = firstline;
-		} else
-			el->el_refresh.r_cursor.v++;
-
-		ELRE_ASSERT(el->el_refresh.r_cursor.v >= el->el_term.t_size.v,
-		    (__F, "\r\nre_putc: overflow! r_cursor.v == %d > %d\r\n",
-		    el->el_refresh.r_cursor.v, el->el_term.t_size.v),
-		    abort());
+		el->el_vdisplay[el->el_refresh.r_cursor.v][el->el_terminal.t_size.h]
+		    = '\0';
+		re_nextline(el);
 	}
 }
 
@@ -185,7 +199,7 @@ protected void
 re_refresh(EditLine *el)
 {
 	int i, rhdiff;
-	char *cp, *st;
+	Char *cp, *st;
 	coord_t cur;
 #ifdef notyet
 	size_t termsz;
@@ -220,7 +234,7 @@ re_refresh(EditLine *el)
 
 	/* draw the current input buffer */
 #if notyet
-	termsz = el->el_term.t_size.h * el->el_term.t_size.v;
+	termsz = el->el_terminal.t_size.h * el->el_terminal.t_size.v;
 	if (el->el_line.lastchar - el->el_line.buffer > termsz) {
 		/*
 		 * If line is longer than terminal, process only part
@@ -229,26 +243,33 @@ re_refresh(EditLine *el)
 		size_t rem = (el->el_line.lastchar-el->el_line.buffer)%termsz;
 
 		st = el->el_line.lastchar - rem
-			- (termsz - (((rem / el->el_term.t_size.v) - 1)
-					* el->el_term.t_size.v));
+			- (termsz - (((rem / el->el_terminal.t_size.v) - 1)
+					* el->el_terminal.t_size.v));
 	} else
 #endif
 		st = el->el_line.buffer;
 
 	for (cp = st; cp < el->el_line.lastchar; cp++) {
 		if (cp == el->el_line.cursor) {
+                        int w = Width(*cp);
 			/* save for later */
 			cur.h = el->el_refresh.r_cursor.h;
 			cur.v = el->el_refresh.r_cursor.v;
+                        /* handle being at a linebroken doublewidth char */
+                        if (w > 1 && el->el_refresh.r_cursor.h + w >
+			    el->el_terminal.t_size.h) {
+				cur.h = 0;
+				cur.v++;
+                        }
 		}
-		re_addc(el, (unsigned char) *cp);
+		re_addc(el, *cp);
 	}
 
 	if (cur.h == -1) {	/* if I haven't been set yet, I'm at the end */
 		cur.h = el->el_refresh.r_cursor.h;
 		cur.v = el->el_refresh.r_cursor.v;
 	}
-	rhdiff = el->el_term.t_size.h - el->el_refresh.r_cursor.h -
+	rhdiff = el->el_terminal.t_size.h - el->el_refresh.r_cursor.h -
 	    el->el_rprompt.p_pos.h;
 	if (el->el_rprompt.p_pos.h && !el->el_rprompt.p_pos.v &&
 	    !el->el_refresh.r_cursor.v && rhdiff > 1) {
@@ -271,8 +292,8 @@ re_refresh(EditLine *el)
 
 	ELRE_DEBUG(1, (__F,
 		"term.h=%d vcur.h=%d vcur.v=%d vdisplay[0]=\r\n:%80.80s:\r\n",
-		el->el_term.t_size.h, el->el_refresh.r_cursor.h,
-		el->el_refresh.r_cursor.v, el->el_vdisplay[0]));
+		el->el_terminal.t_size.h, el->el_refresh.r_cursor.h,
+		el->el_refresh.r_cursor.v, ct_encode_string(el->el_vdisplay[0])));
 
 	ELRE_DEBUG(1, (__F, "updating %d lines.\r\n", el->el_refresh.r_newcv));
 	for (i = 0; i <= el->el_refresh.r_newcv; i++) {
@@ -287,7 +308,7 @@ re_refresh(EditLine *el)
 		 * leftover stuff.
 		 */
 		re__copy_and_pad(el->el_display[i], el->el_vdisplay[i],
-		    (size_t) el->el_term.t_size.h);
+		    (size_t) el->el_terminal.t_size.h);
 	}
 	ELRE_DEBUG(1, (__F,
 	"\r\nel->el_refresh.r_cursor.v=%d,el->el_refresh.r_oldcv=%d i=%d\r\n",
@@ -295,11 +316,12 @@ re_refresh(EditLine *el)
 
 	if (el->el_refresh.r_oldcv > el->el_refresh.r_newcv)
 		for (; i <= el->el_refresh.r_oldcv; i++) {
-			term_move_to_line(el, i);
-			term_move_to_char(el, 0);
-			term_clear_EOL(el, (int) strlen(el->el_display[i]));
+			terminal_move_to_line(el, i);
+			terminal_move_to_char(el, 0);
+                        /* This Strlen should be safe even with MB_FILL_CHARs */
+			terminal_clear_EOL(el, (int) Strlen(el->el_display[i]));
 #ifdef DEBUG_REFRESH
-			term_overwrite(el, "C\b", 2);
+			terminal_overwrite(el, "C\b", (size_t)2);
 #endif /* DEBUG_REFRESH */
 			el->el_display[i][0] = '\0';
 		}
@@ -309,8 +331,8 @@ re_refresh(EditLine *el)
 	    "\r\ncursor.h = %d, cursor.v = %d, cur.h = %d, cur.v = %d\r\n",
 	    el->el_refresh.r_cursor.h, el->el_refresh.r_cursor.v,
 	    cur.h, cur.v));
-	term_move_to_line(el, cur.v);	/* go to where the cursor is */
-	term_move_to_char(el, cur.h);
+	terminal_move_to_line(el, cur.v);	/* go to where the cursor is */
+	terminal_move_to_char(el, cur.h);
 }
 
 
@@ -321,10 +343,10 @@ protected void
 re_goto_bottom(EditLine *el)
 {
 
-	term_move_to_line(el, el->el_refresh.r_oldcv);
-	term__putc(el, '\n');
+	terminal_move_to_line(el, el->el_refresh.r_oldcv);
+	terminal__putc(el, '\n');
 	re_clear_display(el);
-	term__flush(el);
+	terminal__flush(el);
 }
 
 
@@ -335,9 +357,9 @@ re_goto_bottom(EditLine *el)
 private void
 /*ARGSUSED*/
 re_insert(EditLine *el __attribute__((__unused__)),
-    char *d, int dat, int dlen, char *s, int num)
+    Char *d, int dat, int dlen, Char *s, int num)
 {
-	char *a, *b;
+	Char *a, *b;
 
 	if (num <= 0)
 		return;
@@ -346,8 +368,8 @@ re_insert(EditLine *el __attribute__((__
 
 	ELRE_DEBUG(1,
 	    (__F, "re_insert() starting: %d at %d max %d, d == \"%s\"\n",
-	    num, dat, dlen, d));
-	ELRE_DEBUG(1, (__F, "s == \"%s\"\n", s));
+	    num, dat, dlen, ct_encode_string(d)));
+	ELRE_DEBUG(1, (__F, "s == \"%s\"\n", ct_encode_string(s)));
 
 	/* open up the space for num chars */
 	if (num > 0) {
@@ -357,19 +379,24 @@ re_insert(EditLine *el __attribute__((__
 			*b-- = *a--;
 		d[dlen] = '\0';	/* just in case */
 	}
+
 	ELRE_DEBUG(1, (__F,
 		"re_insert() after insert: %d at %d max %d, d == \"%s\"\n",
-		num, dat, dlen, d));
-	ELRE_DEBUG(1, (__F, "s == \"%s\"\n", s));
+		num, dat, dlen, ct_encode_string(d)));
+	ELRE_DEBUG(1, (__F, "s == \"%s\"\n", ct_encode_string(s)));
 
 	/* copy the characters */
 	for (a = d + dat; (a < d + dlen) && (num > 0); num--)
 		*a++ = *s++;
 
+#ifdef notyet
+        /* ct_encode_string() uses a static buffer, so we can't conveniently
+         * encode both d & s here */
 	ELRE_DEBUG(1,
 	    (__F, "re_insert() after copy: %d at %d max %d, %s == \"%s\"\n",
 	    num, dat, dlen, d, s));
 	ELRE_DEBUG(1, (__F, "s == \"%s\"\n", s));
+#endif
 }
 
 
@@ -379,9 +406,9 @@ re_insert(EditLine *el __attribute__((__
 private void
 /*ARGSUSED*/
 re_delete(EditLine *el __attribute__((__unused__)),
-    char *d, int dat, int dlen, int num)
+    Char *d, int dat, int dlen, int num)
 {
-	char *a, *b;
+	Char *a, *b;
 
 	if (num <= 0)
 		return;
@@ -391,7 +418,7 @@ re_delete(EditLine *el __attribute__((__
 	}
 	ELRE_DEBUG(1,
 	    (__F, "re_delete() starting: %d at %d max %d, d == \"%s\"\n",
-	    num, dat, dlen, d));
+	    num, dat, dlen, ct_encode_string(d)));
 
 	/* open up the space for num chars */
 	if (num > 0) {
@@ -403,7 +430,7 @@ re_delete(EditLine *el __attribute__((__
 	}
 	ELRE_DEBUG(1,
 	    (__F, "re_delete() after delete: %d at %d max %d, d == \"%s\"\n",
-	    num, dat, dlen, d));
+	    num, dat, dlen, ct_encode_string(d)));
 }
 
 
@@ -411,7 +438,7 @@ re_delete(EditLine *el __attribute__((__
  *	Like strncpy without padding.
  */
 private void
-re__strncopy(char *a, char *b, size_t n)
+re__strncopy(Char *a, Char *b, size_t n)
 {
 
 	while (n-- && *b)
@@ -422,7 +449,7 @@ re__strncopy(char *a, char *b, size_t n)
  *	Find the number of characters we need to clear till the end of line
  *	in order to make sure that we have cleared the previous contents of
  *	the line. fx and sx is the number of characters inserted or deleted
- *	int the first or second diff, diff is the difference between the
+ *	in the first or second diff, diff is the difference between the
  * 	number of characters between the new and old line.
  */
 private void
@@ -442,7 +469,7 @@ re_clear_eol(EditLine *el, int fx, int s
 		diff = sx;
 
 	ELRE_DEBUG(1, (__F, "re_clear_eol %d\n", diff));
-	term_clear_EOL(el, diff);
+	terminal_clear_EOL(el, diff);
 }
 
 /*****************************************************************
@@ -470,12 +497,13 @@ new:	eddie> Oh, my little buggy says to 
 #define	MIN_END_KEEP	4
 
 private void
-re_update_line(EditLine *el, char *old, char *new, int i)
+re_update_line(EditLine *el, Char *old, Char *new, int i)
 {
-	char *o, *n, *p, c;
-	char *ofd, *ols, *oe, *nfd, *nls, *ne;
-	char *osb, *ose, *nsb, *nse;
+	Char *o, *n, *p, c;
+	Char *ofd, *ols, *oe, *nfd, *nls, *ne;
+	Char *osb, *ose, *nsb, *nse;
 	int fx, sx;
+	size_t len;
 
 	/*
          * find first diff
@@ -602,12 +630,12 @@ re_update_line(EditLine *el, char *old, 
          * fx is the number of characters we need to insert/delete: in the
          * beginning to bring the two same begins together
          */
-	fx = (nsb - nfd) - (osb - ofd);
+	fx = (int)((nsb - nfd) - (osb - ofd));
 	/*
          * sx is the number of characters we need to insert/delete: in the
          * end to bring the two same last parts together
          */
-	sx = (nls - nse) - (ols - ose);
+	sx = (int)((nls - nse) - (ols - ose));
 
 	if (!EL_CAN_INSERT) {
 		if (fx > 0) {
@@ -656,8 +684,8 @@ re_update_line(EditLine *el, char *old, 
 	/*
          * Now that we are done with pragmatics we recompute fx, sx
          */
-	fx = (nsb - nfd) - (osb - ofd);
-	sx = (nls - nse) - (ols - ose);
+	fx = (int)((nsb - nfd) - (osb - ofd));
+	sx = (int)((nls - nse) - (ols - ose));
 
 	ELRE_DEBUG(1, (__F, "fx %d, sx %d\n", fx, sx));
 	ELRE_DEBUG(1, (__F, "ofd %d, osb %d, ose %d, ols %d, oe %d\n",
@@ -688,7 +716,7 @@ re_update_line(EditLine *el, char *old, 
          * don't have to change the line, we don't move to it. el_cursor.h to
          * first diff char
          */
-	term_move_to_line(el, i);
+	terminal_move_to_line(el, i);
 
 	/*
          * at this point we have something like this:
@@ -712,7 +740,7 @@ re_update_line(EditLine *el, char *old, 
          * if we have a net insert on the first difference, AND inserting the
          * net amount ((nsb-nfd) - (osb-ofd)) won't push the last useful
          * character (which is ne if nls != ne, otherwise is nse) off the edge
-	 * of the screen (el->el_term.t_size.h) else we do the deletes first
+	 * of the screen (el->el_terminal.t_size.h) else we do the deletes first
 	 * so that we keep everything we need to.
          */
 
@@ -734,13 +762,13 @@ re_update_line(EditLine *el, char *old, 
 	 *	No insert or delete
          */
 	if ((nsb != nfd) && fx > 0 &&
-	    ((p - old) + fx <= el->el_term.t_size.h)) {
+	    ((p - old) + fx <= el->el_terminal.t_size.h)) {
 		ELRE_DEBUG(1,
 		    (__F, "first diff insert at %d...\r\n", nfd - new));
 		/*
 		 * Move to the first char to insert, where the first diff is.
 		 */
-		term_move_to_char(el, nfd - new);
+		terminal_move_to_char(el, (int)(nfd - new));
 		/*
 		 * Check if we have stuff to keep at end
 		 */
@@ -752,21 +780,22 @@ re_update_line(EditLine *el, char *old, 
 			if (fx > 0) {
 				ELRE_DEBUG(!EL_CAN_INSERT, (__F,
 				"ERROR: cannot insert in early first diff\n"));
-				term_insertwrite(el, nfd, fx);
-				re_insert(el, old, ofd - old,
-				    el->el_term.t_size.h, nfd, fx);
+				terminal_insertwrite(el, nfd, fx);
+				re_insert(el, old, (int)(ofd - old),
+				    el->el_terminal.t_size.h, nfd, fx);
 			}
 			/*
 		         * write (nsb-nfd) - fx chars of new starting at
 		         * (nfd + fx)
 			 */
-			term_overwrite(el, nfd + fx, (nsb - nfd) - fx);
-			re__strncopy(ofd + fx, nfd + fx,
-			    (size_t) ((nsb - nfd) - fx));
+			len = (size_t) ((nsb - nfd) - fx);
+			terminal_overwrite(el, (nfd + fx), len);
+			re__strncopy(ofd + fx, nfd + fx, len);
 		} else {
 			ELRE_DEBUG(1, (__F, "without anything to save\r\n"));
-			term_overwrite(el, nfd, (nsb - nfd));
-			re__strncopy(ofd, nfd, (size_t) (nsb - nfd));
+			len = (size_t)(nsb - nfd);
+			terminal_overwrite(el, nfd, len);
+			re__strncopy(ofd, nfd, len);
 			/*
 		         * Done
 		         */
@@ -778,7 +807,7 @@ re_update_line(EditLine *el, char *old, 
 		/*
 		 * move to the first char to delete where the first diff is
 		 */
-		term_move_to_char(el, ofd - old);
+		terminal_move_to_char(el, (int)(ofd - old));
 		/*
 		 * Check if we have stuff to save
 		 */
@@ -791,15 +820,16 @@ re_update_line(EditLine *el, char *old, 
 			if (fx < 0) {
 				ELRE_DEBUG(!EL_CAN_DELETE, (__F,
 				    "ERROR: cannot delete in first diff\n"));
-				term_deletechars(el, -fx);
-				re_delete(el, old, ofd - old,
-				    el->el_term.t_size.h, -fx);
+				terminal_deletechars(el, -fx);
+				re_delete(el, old, (int)(ofd - old),
+				    el->el_terminal.t_size.h, -fx);
 			}
 			/*
 		         * write (nsb-nfd) chars of new starting at nfd
 		         */
-			term_overwrite(el, nfd, (nsb - nfd));
-			re__strncopy(ofd, nfd, (size_t) (nsb - nfd));
+			len = (size_t) (nsb - nfd);
+			terminal_overwrite(el, nfd, len);
+			re__strncopy(ofd, nfd, len);
 
 		} else {
 			ELRE_DEBUG(1, (__F,
@@ -807,8 +837,9 @@ re_update_line(EditLine *el, char *old, 
 			/*
 		         * write (nsb-nfd) chars of new starting at nfd
 		         */
-			term_overwrite(el, nfd, (nsb - nfd));
-			re_clear_eol(el, fx, sx, (oe - old) - (ne - new));
+			terminal_overwrite(el, nfd, (size_t)(nsb - nfd));
+			re_clear_eol(el, fx, sx,
+			    (int)((oe - old) - (ne - new)));
 			/*
 		         * Done
 		         */
@@ -817,7 +848,7 @@ re_update_line(EditLine *el, char *old, 
 	} else
 		fx = 0;
 
-	if (sx < 0 && (ose - old) + fx < el->el_term.t_size.h) {
+	if (sx < 0 && (ose - old) + fx < el->el_terminal.t_size.h) {
 		ELRE_DEBUG(1, (__F,
 		    "second diff delete at %d...\r\n", (ose - old) + fx));
 		/*
@@ -827,7 +858,7 @@ re_update_line(EditLine *el, char *old, 
 		 * fx is the number of characters inserted (+) or deleted (-)
 		 */
 
-		term_move_to_char(el, (ose - old) + fx);
+		terminal_move_to_char(el, (int)((ose - old) + fx));
 		/*
 		 * Check if we have stuff to save
 		 */
@@ -839,17 +870,18 @@ re_update_line(EditLine *el, char *old, 
 			if (sx < 0) {
 				ELRE_DEBUG(!EL_CAN_DELETE, (__F,
 				    "ERROR: cannot delete in second diff\n"));
-				term_deletechars(el, -sx);
+				terminal_deletechars(el, -sx);
 			}
 			/*
 		         * write (nls-nse) chars of new starting at nse
 		         */
-			term_overwrite(el, nse, (nls - nse));
+			terminal_overwrite(el, nse, (size_t)(nls - nse));
 		} else {
 			ELRE_DEBUG(1, (__F,
 			    "but with nothing left to save\r\n"));
-			term_overwrite(el, nse, (nls - nse));
-			re_clear_eol(el, fx, sx, (oe - old) - (ne - new));
+			terminal_overwrite(el, nse, (size_t)(nls - nse));
+			re_clear_eol(el, fx, sx,
+			    (int)((oe - old) - (ne - new)));
 		}
 	}
 	/*
@@ -859,7 +891,7 @@ re_update_line(EditLine *el, char *old, 
 		ELRE_DEBUG(1, (__F, "late first diff insert at %d...\r\n",
 		    nfd - new));
 
-		term_move_to_char(el, nfd - new);
+		terminal_move_to_char(el, (int)(nfd - new));
 		/*
 		 * Check if we have stuff to keep at the end
 		 */
@@ -870,28 +902,29 @@ re_update_line(EditLine *el, char *old, 
 		         * to zero above as a flag saying that we hadn't done
 		         * an early first insert.
 		         */
-			fx = (nsb - nfd) - (osb - ofd);
+			fx = (int)((nsb - nfd) - (osb - ofd));
 			if (fx > 0) {
 				/*
 				 * insert fx chars of new starting at nfd
 				 */
 				ELRE_DEBUG(!EL_CAN_INSERT, (__F,
 				 "ERROR: cannot insert in late first diff\n"));
-				term_insertwrite(el, nfd, fx);
-				re_insert(el, old, ofd - old,
-				    el->el_term.t_size.h, nfd, fx);
+				terminal_insertwrite(el, nfd, fx);
+				re_insert(el, old, (int)(ofd - old),
+				    el->el_terminal.t_size.h, nfd, fx);
 			}
 			/*
 		         * write (nsb-nfd) - fx chars of new starting at
 		         * (nfd + fx)
 			 */
-			term_overwrite(el, nfd + fx, (nsb - nfd) - fx);
-			re__strncopy(ofd + fx, nfd + fx,
-			    (size_t) ((nsb - nfd) - fx));
+			len = (size_t) ((nsb - nfd) - fx);
+			terminal_overwrite(el, (nfd + fx), len);
+			re__strncopy(ofd + fx, nfd + fx, len);
 		} else {
 			ELRE_DEBUG(1, (__F, "without anything to save\r\n"));
-			term_overwrite(el, nfd, (nsb - nfd));
-			re__strncopy(ofd, nfd, (size_t) (nsb - nfd));
+			len = (size_t) (nsb - nfd);
+			terminal_overwrite(el, nfd, len);
+			re__strncopy(ofd, nfd, len);
 		}
 	}
 	/*
@@ -899,24 +932,25 @@ re_update_line(EditLine *el, char *old, 
          */
 	if (sx >= 0) {
 		ELRE_DEBUG(1, (__F,
-		    "second diff insert at %d...\r\n", nse - new));
-		term_move_to_char(el, nse - new);
+		    "second diff insert at %d...\r\n", (int)(nse - new)));
+		terminal_move_to_char(el, (int)(nse - new));
 		if (ols != oe) {
 			ELRE_DEBUG(1, (__F, "with stuff to keep at end\r\n"));
 			if (sx > 0) {
 				/* insert sx chars of new starting at nse */
 				ELRE_DEBUG(!EL_CAN_INSERT, (__F,
 				    "ERROR: cannot insert in second diff\n"));
-				term_insertwrite(el, nse, sx);
+				terminal_insertwrite(el, nse, sx);
 			}
 			/*
 		         * write (nls-nse) - sx chars of new starting at
 			 * (nse + sx)
 		         */
-			term_overwrite(el, nse + sx, (nls - nse) - sx);
+			terminal_overwrite(el, (nse + sx),
+			    (size_t)((nls - nse) - sx));
 		} else {
 			ELRE_DEBUG(1, (__F, "without anything to save\r\n"));
-			term_overwrite(el, nse, (nls - nse));
+			terminal_overwrite(el, nse, (size_t)(nls - nse));
 
 			/*
 	                 * No need to do a clear-to-end here because we were
@@ -933,7 +967,7 @@ re_update_line(EditLine *el, char *old, 
  *	Copy string and pad with spaces
  */
 private void
-re__copy_and_pad(char *dst, const char *src, size_t width)
+re__copy_and_pad(Char *dst, const Char *src, size_t width)
 {
 	size_t i;
 
@@ -956,8 +990,8 @@ re__copy_and_pad(char *dst, const char *
 protected void
 re_refresh_cursor(EditLine *el)
 {
-	char *cp, c;
-	int h, v, th;
+	Char *cp;
+	int h, v, th, w;
 
 	if (el->el_line.cursor >= el->el_line.lastchar) {
 		if (el->el_map.current == el->el_map.alt
@@ -970,47 +1004,46 @@ re_refresh_cursor(EditLine *el)
 	/* first we must find where the cursor is... */
 	h = el->el_prompt.p_pos.h;
 	v = el->el_prompt.p_pos.v;
-	th = el->el_term.t_size.h;	/* optimize for speed */
+	th = el->el_terminal.t_size.h;	/* optimize for speed */
 
 	/* do input buffer to el->el_line.cursor */
 	for (cp = el->el_line.buffer; cp < el->el_line.cursor; cp++) {
-		c = *cp;
-		h++;		/* all chars at least this long */
-
-		if (c == '\n') {/* handle newline in data part too */
+                switch (ct_chr_class(*cp)) {
+		case CHTYPE_NL:  /* handle newline in data part too */
 			h = 0;
 			v++;
-		} else {
-			if (c == '\t') {	/* if a tab, to next tab stop */
-				while (h & 07) {
-					h++;
-				}
-			} else if (iscntrl((unsigned char) c)) {
-						/* if control char */
-				h++;
-				if (h > th) {	/* if overflow, compensate */
-					h = 1;
-					v++;
-				}
-			} else if (!el_isprint((unsigned char) c)) {
-				h += 3;
-				if (h > th) {	/* if overflow, compensate */
-					h = h - th;
-					v++;
-				}
+			break;
+		case CHTYPE_TAB: /* if a tab, to next tab stop */
+			while (++h & 07)
+				continue;
+			break;
+		default:
+			w = Width(*cp);
+			if (w > 1 && h + w > th) { /* won't fit on line */
+				h = 0;
+				v++;
 			}
-		}
+			h += ct_visual_width(*cp);
+			break;
+                }
 
 		if (h >= th) {	/* check, extra long tabs picked up here also */
-			h = 0;
+			h -= th;
 			v++;
 		}
 	}
+        /* if we have a next character, and it's a doublewidth one, we need to
+         * check whether we need to linebreak for it to fit */
+        if (cp < el->el_line.lastchar && (w = Width(*cp)) > 1)
+                if (h + w > th) {
+                    h = 0;
+                    v++;
+                }
 
 	/* now go there */
-	term_move_to_line(el, v);
-	term_move_to_char(el, h);
-	term__flush(el);
+	terminal_move_to_line(el, v);
+	terminal_move_to_char(el, h);
+	terminal__flush(el);
 }
 
 
@@ -1018,12 +1051,19 @@ re_refresh_cursor(EditLine *el)
  *	Add a character fast.
  */
 private void
-re_fastputc(EditLine *el, int c)
+re_fastputc(EditLine *el, Int c)
 {
+	int w = Width((Char)c);
+	while (w > 1 && el->el_cursor.h + w > el->el_terminal.t_size.h)
+	    re_fastputc(el, ' ');
 
-	term__putc(el, c);
+	terminal__putc(el, c);
 	el->el_display[el->el_cursor.v][el->el_cursor.h++] = c;
-	if (el->el_cursor.h >= el->el_term.t_size.h) {
+	while (--w > 0)
+		el->el_display[el->el_cursor.v][el->el_cursor.h++]
+			= MB_FILL_CHAR;
+
+	if (el->el_cursor.h >= el->el_terminal.t_size.h) {
 		/* if we must overflow */
 		el->el_cursor.h = 0;
 
@@ -1033,27 +1073,27 @@ re_fastputc(EditLine *el, int c)
 		 * We do this via pointer shuffling - it's safe in this case
 		 * and we avoid memcpy().
 		 */
-		if (el->el_cursor.v + 1 >= el->el_term.t_size.v) {
-			int i, lins = el->el_term.t_size.v;
-			char *firstline = el->el_display[0];
+		if (el->el_cursor.v + 1 >= el->el_terminal.t_size.v) {
+			int i, lins = el->el_terminal.t_size.v;
+			Char *firstline = el->el_display[0];
 	
-			for(i=1; i < lins; i++)
-				el->el_display[i-1] = el->el_display[i];
+			for(i = 1; i < lins; i++)
+				el->el_display[i - 1] = el->el_display[i];
 
-			re__copy_and_pad(firstline, "", 0);
-			el->el_display[i-1] = firstline;
+			re__copy_and_pad(firstline, STR(""), (size_t)0);
+			el->el_display[i - 1] = firstline;
 		} else {
 			el->el_cursor.v++;
 			el->el_refresh.r_oldcv++;
 		}
 		if (EL_HAS_AUTO_MARGINS) {
 			if (EL_HAS_MAGIC_MARGINS) {
-				term__putc(el, ' ');
-				term__putc(el, '\b');
+				terminal__putc(el, ' ');
+				terminal__putc(el, '\b');
 			}
 		} else {
-			term__putc(el, '\r');
-			term__putc(el, '\n');
+			terminal__putc(el, '\r');
+			terminal__putc(el, '\n');
 		}
 	}
 }
@@ -1066,7 +1106,7 @@ re_fastputc(EditLine *el, int c)
 protected void
 re_fastaddc(EditLine *el)
 {
-	char c;
+	Char c;
 	int rhdiff;
 
 	c = el->el_line.cursor[-1];
@@ -1075,25 +1115,30 @@ re_fastaddc(EditLine *el)
 		re_refresh(el);	/* too hard to handle */
 		return;
 	}
-	rhdiff = el->el_term.t_size.h - el->el_cursor.h -
+	rhdiff = el->el_terminal.t_size.h - el->el_cursor.h -
 	    el->el_rprompt.p_pos.h;
 	if (el->el_rprompt.p_pos.h && rhdiff < 3) {
 		re_refresh(el);	/* clear out rprompt if less than 1 char gap */
 		return;
 	}			/* else (only do at end of line, no TAB) */
-	if (iscntrl((unsigned char) c)) {	/* if control char, do caret */
-		char mc = (c == '\177') ? '?' : (c | 0100);
-		re_fastputc(el, '^');
-		re_fastputc(el, mc);
-	} else if (el_isprint((unsigned char) c)) {	/* normal char */
+	switch (ct_chr_class(c)) {
+	case CHTYPE_TAB: /* already handled, should never happen here */
+		break;
+	case CHTYPE_NL:
+	case CHTYPE_PRINT:
 		re_fastputc(el, c);
-	} else {
-		re_fastputc(el, '\\');
-		re_fastputc(el, (int)(((((unsigned int)c) >> 6) & 3) + '0'));
-		re_fastputc(el, (int)(((((unsigned int)c) >> 3) & 7) + '0'));
-		re_fastputc(el, (c & 7) + '0');
+		break;
+	case CHTYPE_ASCIICTL:
+	case CHTYPE_NONPRINT: {
+		Char visbuf[VISUAL_WIDTH_MAX];
+		ssize_t i, n =
+		    ct_visual_char(visbuf, VISUAL_WIDTH_MAX, (Char)c);
+		for (i = 0; n-- > 0; ++i)
+			re_fastputc(el, visbuf[i]);
+		break;
+	}
 	}
-	term__flush(el);
+	terminal__flush(el);
 }
 
 
@@ -1107,7 +1152,7 @@ re_clear_display(EditLine *el)
 
 	el->el_cursor.v = 0;
 	el->el_cursor.h = 0;
-	for (i = 0; i < el->el_term.t_size.v; i++)
+	for (i = 0; i < el->el_terminal.t_size.v; i++)
 		el->el_display[i][0] = '\0';
 	el->el_refresh.r_oldcv = 0;
 }
@@ -1122,17 +1167,16 @@ re_clear_lines(EditLine *el)
 
 	if (EL_CAN_CEOL) {
 		int i;
-		term_move_to_char(el, 0);
-		for (i = 0; i <= el->el_refresh.r_oldcv; i++) {
+		for (i = el->el_refresh.r_oldcv; i >= 0; i--) {
 			/* for each line on the screen */
-			term_move_to_line(el, i);
-			term_clear_EOL(el, el->el_term.t_size.h);
+			terminal_move_to_line(el, i);
+			terminal_move_to_char(el, 0);
+			terminal_clear_EOL(el, el->el_terminal.t_size.h);
 		}
-		term_move_to_line(el, 0);
 	} else {
-		term_move_to_line(el, el->el_refresh.r_oldcv);
+		terminal_move_to_line(el, el->el_refresh.r_oldcv);
 					/* go to last line */
-		term__putc(el, '\r');	/* go to BOL */
-		term__putc(el, '\n');	/* go to new line */
+		terminal__putc(el, '\r');	/* go to BOL */
+		terminal__putc(el, '\n');	/* go to new line */
 	}
 }
diff -pruN 5.1.58-1/cmd-line-utils/libedit/refresh.h 5.1.61-2/cmd-line-utils/libedit/refresh.h
--- 5.1.58-1/cmd-line-utils/libedit/refresh.h	2011-07-01 15:22:22.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/refresh.h	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: refresh.h,v 1.5 2003/08/07 16:44:33 agc Exp $	*/
+/*	$NetBSD: refresh.h,v 1.6 2009/12/30 22:37:40 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -48,7 +48,7 @@ typedef struct {
 	int	r_newcv;
 } el_refresh_t;
 
-protected void	re_putc(EditLine *, int, int);
+protected void	re_putc(EditLine *, Int, int);
 protected void	re_clear_lines(EditLine *);
 protected void	re_clear_display(EditLine *);
 protected void	re_refresh(EditLine *);
diff -pruN 5.1.58-1/cmd-line-utils/libedit/search.c 5.1.61-2/cmd-line-utils/libedit/search.c
--- 5.1.58-1/cmd-line-utils/libedit/search.c	2011-07-01 15:22:22.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/search.c	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: search.c,v 1.20 2004/11/04 01:16:03 christos Exp $	*/
+/*	$NetBSD: search.c,v 1.30 2011/10/04 15:27:04 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -65,15 +65,16 @@ protected int
 search_init(EditLine *el)
 {
 
-	el->el_search.patbuf = (char *) el_malloc(EL_BUFSIZ);
+	el->el_search.patbuf = el_malloc(EL_BUFSIZ *
+	    sizeof(*el->el_search.patbuf));
 	if (el->el_search.patbuf == NULL)
-		return (-1);
+		return -1;
 	el->el_search.patlen = 0;
 	el->el_search.patdir = -1;
 	el->el_search.chacha = '\0';
 	el->el_search.chadir = CHAR_FWD;
 	el->el_search.chatflg = 0;
-	return (0);
+	return 0;
 }
 
 
@@ -84,7 +85,7 @@ protected void
 search_end(EditLine *el)
 {
 
-	el_free((ptr_t) el->el_search.patbuf);
+	el_free(el->el_search.patbuf);
 	el->el_search.patbuf = NULL;
 }
 
@@ -105,8 +106,11 @@ regerror(const char *msg)
  *	Return if string matches pattern
  */
 protected int
-el_match(const char *str, const char *pat)
+el_match(const Char *str, const Char *pat)
 {
+#ifdef WIDECHAR
+	static ct_buffer_t conv;
+#endif
 #if defined (REGEX)
 	regex_t re;
 	int rv;
@@ -118,30 +122,31 @@ el_match(const char *str, const char *pa
 	extern int	 re_exec(const char *);
 #endif
 
-	if (strstr(str, pat) != NULL)
-		return (1);
+	if (Strstr(str, pat) != 0)
+		return 1;
 
 #if defined(REGEX)
-	if (regcomp(&re, pat, 0) == 0) {
-		rv = regexec(&re, str, 0, NULL, 0) == 0;
+	if (regcomp(&re, ct_encode_string(pat, &conv), 0) == 0) {
+		rv = regexec(&re, ct_encode_string(str, &conv), (size_t)0, NULL,
+		    0) == 0;
 		regfree(&re);
 	} else {
 		rv = 0;
 	}
-	return (rv);
+	return rv;
 #elif defined(REGEXP)
-	if ((re = regcomp(pat)) != NULL) {
-		rv = regexec(re, str);
-		free((ptr_t) re);
+	if ((re = regcomp(ct_encode_string(pat, &conv))) != NULL) {
+		rv = regexec(re, ct_encode_string(str, &conv));
+		el_free(re);
 	} else {
 		rv = 0;
 	}
-	return (rv);
+	return rv;
 #else
-	if (re_comp(pat) != NULL)
-		return (0);
+	if (re_comp(ct_encode_string(pat, &conv)) != NULL)
+		return 0;
 	else
-		return (re_exec(str) == 1);
+		return re_exec(ct_encode_string(str, &conv) == 1);
 #endif
 }
 
@@ -150,14 +155,14 @@ el_match(const char *str, const char *pa
  *	 return True if the pattern matches the prefix
  */
 protected int
-c_hmatch(EditLine *el, const char *str)
+c_hmatch(EditLine *el, const Char *str)
 {
 #ifdef SDEBUG
 	(void) fprintf(el->el_errfile, "match `%s' with `%s'\n",
 	    el->el_search.patbuf, str);
 #endif /* SDEBUG */
 
-	return (el_match(str, el->el_search.patbuf));
+	return el_match(str, el->el_search.patbuf);
 }
 
 
@@ -169,15 +174,16 @@ c_setpat(EditLine *el)
 {
 	if (el->el_state.lastcmd != ED_SEARCH_PREV_HISTORY &&
 	    el->el_state.lastcmd != ED_SEARCH_NEXT_HISTORY) {
-		el->el_search.patlen = EL_CURSOR(el) - el->el_line.buffer;
+		el->el_search.patlen =
+		    (size_t)(EL_CURSOR(el) - el->el_line.buffer);
 		if (el->el_search.patlen >= EL_BUFSIZ)
 			el->el_search.patlen = EL_BUFSIZ - 1;
 		if (el->el_search.patlen != 0) {
-			(void) strncpy(el->el_search.patbuf, el->el_line.buffer,
+			(void) Strncpy(el->el_search.patbuf, el->el_line.buffer,
 			    el->el_search.patlen);
 			el->el_search.patbuf[el->el_search.patlen] = '\0';
 		} else
-			el->el_search.patlen = strlen(el->el_search.patbuf);
+			el->el_search.patlen = Strlen(el->el_search.patbuf);
 	}
 #ifdef SDEBUG
 	(void) fprintf(el->el_errfile, "\neventno = %d\n",
@@ -198,23 +204,24 @@ c_setpat(EditLine *el)
 protected el_action_t
 ce_inc_search(EditLine *el, int dir)
 {
-	static const char STRfwd[] = {'f', 'w', 'd', '\0'},
+	static const Char STRfwd[] = {'f', 'w', 'd', '\0'},
 	     STRbck[] = {'b', 'c', 'k', '\0'};
-	static char pchar = ':';/* ':' = normal, '?' = failed */
-	static char endcmd[2] = {'\0', '\0'};
-	char ch, *ocursor = el->el_line.cursor, oldpchar = pchar;
-	const char *cp;
+	static Char pchar = ':';/* ':' = normal, '?' = failed */
+	static Char endcmd[2] = {'\0', '\0'};
+	Char ch, *ocursor = el->el_line.cursor, oldpchar = pchar;
+	const Char *cp;
 
 	el_action_t ret = CC_NORM;
 
 	int ohisteventno = el->el_history.eventno;
-	int oldpatlen = el->el_search.patlen;
+	size_t oldpatlen = el->el_search.patlen;
 	int newdir = dir;
 	int done, redo;
 
-	if (el->el_line.lastchar + sizeof(STRfwd) / sizeof(char) + 2 +
+	if (el->el_line.lastchar + sizeof(STRfwd) /
+	    sizeof(*el->el_line.lastchar) + 2 +
 	    el->el_search.patlen >= el->el_line.limit)
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	for (;;) {
 
@@ -241,14 +248,14 @@ ce_inc_search(EditLine *el, int dir)
 		*el->el_line.lastchar = '\0';
 		re_refresh(el);
 
-		if (el_getc(el, &ch) != 1)
-			return (ed_end_of_file(el, 0));
+		if (FUN(el,getc)(el, &ch) != 1)
+			return ed_end_of_file(el, 0);
 
 		switch (el->el_map.current[(unsigned char) ch]) {
 		case ED_INSERT:
 		case ED_DIGIT:
 			if (el->el_search.patlen >= EL_BUFSIZ - LEN)
-				term_beep(el);
+				terminal_beep(el);
 			else {
 				el->el_search.patbuf[el->el_search.patlen++] =
 				    ch;
@@ -273,7 +280,7 @@ ce_inc_search(EditLine *el, int dir)
 			if (el->el_search.patlen > LEN)
 				done++;
 			else
-				term_beep(el);
+				terminal_beep(el);
 			break;
 
 		default:
@@ -297,7 +304,7 @@ ce_inc_search(EditLine *el, int dir)
 					    *el->el_line.cursor != '\n') {
 						if (el->el_search.patlen >=
 						    EL_BUFSIZ - LEN) {
-							term_beep(el);
+							terminal_beep(el);
 							break;
 						}
 						el->el_search.patbuf[el->el_search.patlen++] =
@@ -310,14 +317,14 @@ ce_inc_search(EditLine *el, int dir)
 					re_refresh(el);
 					break;
 				    } else if (isglob(*cp)) {
-					    term_beep(el);
+					    terminal_beep(el);
 					    break;
 				    }
 				break;
 
 			default:	/* Terminate and execute cmd */
 				endcmd[0] = ch;
-				el_push(el, endcmd);
+				FUN(el,push)(el, endcmd);
 				/* FALLTHROUGH */
 
 			case 0033:	/* ESC: Terminate */
@@ -379,9 +386,10 @@ ce_inc_search(EditLine *el, int dir)
 					/* avoid c_setpat */
 					el->el_state.lastcmd =
 					    (el_action_t) newdir;
-					ret = newdir == ED_SEARCH_PREV_HISTORY ?
+					ret = (el_action_t)
+					    (newdir == ED_SEARCH_PREV_HISTORY ?
 					    ed_search_prev_history(el, 0) :
-					    ed_search_next_history(el, 0);
+					    ed_search_next_history(el, 0));
 					if (ret != CC_ERROR) {
 						el->el_line.cursor = newdir ==
 						    ED_SEARCH_PREV_HISTORY ?
@@ -395,13 +403,13 @@ ce_inc_search(EditLine *el, int dir)
 				el->el_search.patbuf[el->el_search.patlen] =
 				    '\0';
 				if (ret == CC_ERROR) {
-					term_beep(el);
+					terminal_beep(el);
 					if (el->el_history.eventno !=
 					    ohisteventno) {
 						el->el_history.eventno =
 						    ohisteventno;
 						if (hist_get(el) == CC_ERROR)
-							return (CC_ERROR);
+							return CC_ERROR;
 					}
 					el->el_line.cursor = ocursor;
 					pchar = '?';
@@ -426,14 +434,14 @@ ce_inc_search(EditLine *el, int dir)
 			if (el->el_history.eventno != ohisteventno) {
 				el->el_history.eventno = ohisteventno;
 				if (hist_get(el) == CC_ERROR)
-					return (CC_ERROR);
+					return CC_ERROR;
 			}
 			el->el_line.cursor = ocursor;
 			if (ret == CC_ERROR)
 				re_refresh(el);
 		}
 		if (done || ret != CC_NORM)
-			return (ret);
+			return ret;
 	}
 }
 
@@ -444,9 +452,9 @@ ce_inc_search(EditLine *el, int dir)
 protected el_action_t
 cv_search(EditLine *el, int dir)
 {
-	char ch;
-	char tmpbuf[EL_BUFSIZ];
-	int tmplen;
+	Char ch;
+	Char tmpbuf[EL_BUFSIZ];
+	ssize_t tmplen;
 
 #ifdef ANCHOR
 	tmpbuf[0] = '.';
@@ -457,7 +465,7 @@ cv_search(EditLine *el, int dir)
 	el->el_search.patdir = dir;
 
 	tmplen = c_gets(el, &tmpbuf[LEN],
-		dir == ED_SEARCH_PREV_HISTORY ? "\n/" : "\n?" );
+		dir == ED_SEARCH_PREV_HISTORY ? STR("\n/") : STR("\n?") );
 	if (tmplen == -1)
 		return CC_REFRESH;
 
@@ -471,16 +479,16 @@ cv_search(EditLine *el, int dir)
 		 */
 		if (el->el_search.patlen == 0) {
 			re_refresh(el);
-			return (CC_ERROR);
+			return CC_ERROR;
 		}
 #ifdef ANCHOR
 		if (el->el_search.patbuf[0] != '.' &&
 		    el->el_search.patbuf[0] != '*') {
-			(void) strncpy(tmpbuf, el->el_search.patbuf,
-			    sizeof(tmpbuf) - 1);
+			(void) Strncpy(tmpbuf, el->el_search.patbuf,
+			    sizeof(tmpbuf) / sizeof(*tmpbuf) - 1);
 			el->el_search.patbuf[0] = '.';
 			el->el_search.patbuf[1] = '*';
-			(void) strncpy(&el->el_search.patbuf[2], tmpbuf,
+			(void) Strncpy(&el->el_search.patbuf[2], tmpbuf,
 			    EL_BUFSIZ - 3);
 			el->el_search.patlen++;
 			el->el_search.patbuf[el->el_search.patlen++] = '.';
@@ -494,21 +502,21 @@ cv_search(EditLine *el, int dir)
 		tmpbuf[tmplen++] = '*';
 #endif
 		tmpbuf[tmplen] = '\0';
-		(void) strncpy(el->el_search.patbuf, tmpbuf, EL_BUFSIZ - 1);
-		el->el_search.patlen = tmplen;
+		(void) Strncpy(el->el_search.patbuf, tmpbuf, EL_BUFSIZ - 1);
+		el->el_search.patlen = (size_t)tmplen;
 	}
 	el->el_state.lastcmd = (el_action_t) dir;	/* avoid c_setpat */
 	el->el_line.cursor = el->el_line.lastchar = el->el_line.buffer;
 	if ((dir == ED_SEARCH_PREV_HISTORY ? ed_search_prev_history(el, 0) :
 	    ed_search_next_history(el, 0)) == CC_ERROR) {
 		re_refresh(el);
-		return (CC_ERROR);
+		return CC_ERROR;
 	}
 	if (ch == 0033) {
 		re_refresh(el);
 		return ed_newline(el, 0);
 	}
-	return (CC_REFRESH);
+	return CC_REFRESH;
 }
 
 
@@ -518,9 +526,9 @@ cv_search(EditLine *el, int dir)
 protected el_action_t
 ce_search_line(EditLine *el, int dir)
 {
-	char *cp = el->el_line.cursor;
-	char *pattern = el->el_search.patbuf;
-	char oc, *ocp;
+	Char *cp = el->el_line.cursor;
+	Char *pattern = el->el_search.patbuf;
+	Char oc, *ocp;
 #ifdef ANCHOR
 	ocp = &pattern[1];
 	oc = *ocp;
@@ -535,21 +543,21 @@ ce_search_line(EditLine *el, int dir)
 			if (el_match(cp, ocp)) {
 				*ocp = oc;
 				el->el_line.cursor = cp;
-				return (CC_NORM);
+				return CC_NORM;
 			}
 		}
 		*ocp = oc;
-		return (CC_ERROR);
+		return CC_ERROR;
 	} else {
 		for (; *cp != '\0' && cp < el->el_line.limit; cp++) {
 			if (el_match(cp, ocp)) {
 				*ocp = oc;
 				el->el_line.cursor = cp;
-				return (CC_NORM);
+				return CC_NORM;
 			}
 		}
 		*ocp = oc;
-		return (CC_ERROR);
+		return CC_ERROR;
 	}
 }
 
@@ -558,12 +566,12 @@ ce_search_line(EditLine *el, int dir)
  *	Vi repeat search
  */
 protected el_action_t
-cv_repeat_srch(EditLine *el, int c)
+cv_repeat_srch(EditLine *el, Int c)
 {
 
 #ifdef SDEBUG
 	(void) fprintf(el->el_errfile, "dir %d patlen %d patbuf %s\n",
-	    c, el->el_search.patlen, el->el_search.patbuf);
+	    c, el->el_search.patlen, ct_encode_string(el->el_search.patbuf));
 #endif
 
 	el->el_state.lastcmd = (el_action_t) c;	/* Hack to stop c_setpat */
@@ -571,11 +579,11 @@ cv_repeat_srch(EditLine *el, int c)
 
 	switch (c) {
 	case ED_SEARCH_NEXT_HISTORY:
-		return (ed_search_next_history(el, 0));
+		return ed_search_next_history(el, 0);
 	case ED_SEARCH_PREV_HISTORY:
-		return (ed_search_prev_history(el, 0));
+		return ed_search_prev_history(el, 0);
 	default:
-		return (CC_ERROR);
+		return CC_ERROR;
 	}
 }
 
@@ -584,16 +592,16 @@ cv_repeat_srch(EditLine *el, int c)
  *	Vi character search
  */
 protected el_action_t
-cv_csearch(EditLine *el, int direction, int ch, int count, int tflag)
+cv_csearch(EditLine *el, int direction, Int ch, int count, int tflag)
 {
-	char *cp;
+	Char *cp;
 
 	if (ch == 0)
 		return CC_ERROR;
 
-	if (ch == -1) {
-		char c;
-		if (el_getc(el, &c) != 1)
+	if (ch == (Int)-1) {
+		Char c;
+		if (FUN(el,getc)(el, &c) != 1)
 			return ed_end_of_file(el, 0);
 		ch = c;
 	}
@@ -601,18 +609,18 @@ cv_csearch(EditLine *el, int direction, 
 	/* Save for ';' and ',' commands */
 	el->el_search.chacha = ch;
 	el->el_search.chadir = direction;
-	el->el_search.chatflg = tflag;
+	el->el_search.chatflg = (char)tflag;
 
 	cp = el->el_line.cursor;
 	while (count--) {
-		if (*cp == ch)
+		if ((Int)*cp == ch)
 			cp += direction;
 		for (;;cp += direction) {
 			if (cp >= el->el_line.lastchar)
 				return CC_ERROR;
 			if (cp < el->el_line.buffer)
 				return CC_ERROR;
-			if (*cp == ch)
+			if ((Int)*cp == ch)
 				break;
 		}
 	}
diff -pruN 5.1.58-1/cmd-line-utils/libedit/search.h 5.1.61-2/cmd-line-utils/libedit/search.h
--- 5.1.58-1/cmd-line-utils/libedit/search.h	2011-07-01 15:22:22.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/search.h	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: search.h,v 1.8 2003/10/18 23:27:36 christos Exp $	*/
+/*	$NetBSD: search.h,v 1.9 2009/12/30 22:37:40 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -43,24 +43,24 @@
 #include "histedit.h"
 
 typedef struct el_search_t {
-	char	*patbuf;		/* The pattern buffer		*/
+	Char	*patbuf;		/* The pattern buffer		*/
 	size_t	 patlen;		/* Length of the pattern buffer	*/
 	int	 patdir;		/* Direction of the last search	*/
 	int	 chadir;		/* Character search direction	*/
-	char	 chacha;		/* Character we are looking for	*/
+	Char	 chacha;		/* Character we are looking for	*/
 	char	 chatflg;		/* 0 if f, 1 if t */
 } el_search_t;
 
 
-protected int		el_match(const char *, const char *);
+protected int		el_match(const Char *, const Char *);
 protected int		search_init(EditLine *);
 protected void		search_end(EditLine *);
-protected int		c_hmatch(EditLine *, const char *);
+protected int		c_hmatch(EditLine *, const Char *);
 protected void		c_setpat(EditLine *);
 protected el_action_t	ce_inc_search(EditLine *, int);
 protected el_action_t	cv_search(EditLine *, int);
 protected el_action_t	ce_search_line(EditLine *, int);
-protected el_action_t	cv_repeat_srch(EditLine *, int);
-protected el_action_t	cv_csearch(EditLine *, int, int, int, int);
+protected el_action_t	cv_repeat_srch(EditLine *, Int);
+protected el_action_t	cv_csearch(EditLine *, int, Int, int, int);
 
 #endif /* _h_el_search */
diff -pruN 5.1.58-1/cmd-line-utils/libedit/sig.c 5.1.61-2/cmd-line-utils/libedit/sig.c
--- 5.1.58-1/cmd-line-utils/libedit/sig.c	2011-07-01 15:22:22.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/sig.c	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: sig.c,v 1.12 2008/09/10 15:45:37 christos Exp $	*/
+/*	$NetBSD: sig.c,v 1.17 2011/07/28 20:50:55 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -57,15 +57,15 @@ private const int sighdl[] = {
 	- 1
 };
 
-private void el_sig_handler(int);
+private void sig_handler(int);
 
-/* el_sig_handler():
+/* sig_handler():
  *	This is the handler called for all signals
  *	XXX: we cannot pass any data so we just store the old editline
  *	state in a private variable
  */
 private void
-el_sig_handler(int signo)
+sig_handler(int signo)
 {
 	int i;
 	sigset_t nset, oset;
@@ -74,12 +74,14 @@ el_sig_handler(int signo)
 	(void) sigaddset(&nset, signo);
 	(void) sigprocmask(SIG_BLOCK, &nset, &oset);
 
+	sel->el_signal->sig_no = signo;
+
 	switch (signo) {
 	case SIGCONT:
 		tty_rawmode(sel);
 		if (ed_redisplay(sel, 0) == CC_REFRESH)
 			re_refresh(sel);
-		term__flush(sel);
+		terminal__flush(sel);
 		break;
 
 	case SIGWINCH:
@@ -95,7 +97,10 @@ el_sig_handler(int signo)
 		if (signo == sighdl[i])
 			break;
 
-	(void) signal(signo, sel->el_signal[i]);
+	(void) sigaction(signo, &sel->el_signal->sig_action[i], NULL);
+	sel->el_signal->sig_action[i].sa_handler = SIG_ERR;
+	sel->el_signal->sig_action[i].sa_flags = 0;
+	sigemptyset(&sel->el_signal->sig_action[i].sa_mask);
 	(void) sigprocmask(SIG_SETMASK, &oset, NULL);
 	(void) kill(0, signo);
 }
@@ -107,26 +112,29 @@ el_sig_handler(int signo)
 protected int
 sig_init(EditLine *el)
 {
-	int i;
-	sigset_t nset, oset;
+	size_t i;
+	sigset_t *nset, oset;
 
-	(void) sigemptyset(&nset);
-#define	_DO(a) (void) sigaddset(&nset, a);
+	el->el_signal = el_malloc(sizeof(*el->el_signal));
+	if (el->el_signal == NULL)
+		return -1;
+
+	nset = &el->el_signal->sig_set;
+	(void) sigemptyset(nset);
+#define	_DO(a) (void) sigaddset(nset, a);
 	ALLSIGS
 #undef	_DO
-	    (void) sigprocmask(SIG_BLOCK, &nset, &oset);
+	(void) sigprocmask(SIG_BLOCK, nset, &oset);
 
-#define	SIGSIZE (sizeof(sighdl) / sizeof(sighdl[0]) * sizeof(el_signalhandler_t))
-
-	el->el_signal = (el_signalhandler_t *) el_malloc(SIGSIZE);
-	if (el->el_signal == NULL)
-		return (-1);
-	for (i = 0; sighdl[i] != -1; i++)
-		el->el_signal[i] = SIG_ERR;
+	for (i = 0; sighdl[i] != -1; i++) {
+		el->el_signal->sig_action[i].sa_handler = SIG_ERR;
+		el->el_signal->sig_action[i].sa_flags = 0;
+		sigemptyset(&el->el_signal->sig_action[i].sa_mask);
+	}
 
 	(void) sigprocmask(SIG_SETMASK, &oset, NULL);
 
-	return (0);
+	return 0;
 }
 
 
@@ -137,7 +145,7 @@ protected void
 sig_end(EditLine *el)
 {
 
-	el_free((ptr_t) el->el_signal);
+	el_free(el->el_signal);
 	el->el_signal = NULL;
 }
 
@@ -148,20 +156,21 @@ sig_end(EditLine *el)
 protected void
 sig_set(EditLine *el)
 {
-	int i;
-	sigset_t nset, oset;
+	size_t i;
+	sigset_t oset;
+	struct sigaction osa, nsa;
+
+	nsa.sa_handler = sig_handler;
+	nsa.sa_flags = 0;
+	sigemptyset(&nsa.sa_mask);
 
-	(void) sigemptyset(&nset);
-#define	_DO(a) (void) sigaddset(&nset, a);
-	ALLSIGS
-#undef	_DO
-	    (void) sigprocmask(SIG_BLOCK, &nset, &oset);
+	(void) sigprocmask(SIG_BLOCK, &el->el_signal->sig_set, &oset);
 
 	for (i = 0; sighdl[i] != -1; i++) {
-		el_signalhandler_t s;
 		/* This could happen if we get interrupted */
-		if ((s = signal(sighdl[i], el_sig_handler)) != el_sig_handler)
-			el->el_signal[i] = s;
+		if (sigaction(sighdl[i], &nsa, &osa) != -1 &&
+		    osa.sa_handler != sig_handler)
+			el->el_signal->sig_action[i] = osa;
 	}
 	sel = el;
 	(void) sigprocmask(SIG_SETMASK, &oset, NULL);
@@ -174,20 +183,17 @@ sig_set(EditLine *el)
 protected void
 sig_clr(EditLine *el)
 {
-	int i;
-	sigset_t nset, oset;
+	size_t i;
+	sigset_t oset;
 
-	(void) sigemptyset(&nset);
-#define	_DO(a) (void) sigaddset(&nset, a);
-	ALLSIGS
-#undef	_DO
-	    (void) sigprocmask(SIG_BLOCK, &nset, &oset);
+	(void) sigprocmask(SIG_BLOCK, &el->el_signal->sig_set, &oset);
 
 	for (i = 0; sighdl[i] != -1; i++)
-		if (el->el_signal[i] != SIG_ERR)
-			(void) signal(sighdl[i], el->el_signal[i]);
+		if (el->el_signal->sig_action[i].sa_handler != SIG_ERR)
+			(void)sigaction(sighdl[i],
+			    &el->el_signal->sig_action[i], NULL);
 
 	sel = NULL;		/* we are going to die if the handler is
 				 * called */
-	(void) sigprocmask(SIG_SETMASK, &oset, NULL);
+	(void)sigprocmask(SIG_SETMASK, &oset, NULL);
 }
diff -pruN 5.1.58-1/cmd-line-utils/libedit/sig.h 5.1.61-2/cmd-line-utils/libedit/sig.h
--- 5.1.58-1/cmd-line-utils/libedit/sig.h	2011-07-01 15:22:22.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/sig.h	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: sig.h,v 1.6 2008/07/12 15:27:14 christos Exp $	*/
+/*	$NetBSD: sig.h,v 1.8 2009/02/19 15:20:22 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -56,9 +56,13 @@
 	_DO(SIGTERM)	\
 	_DO(SIGCONT)	\
 	_DO(SIGWINCH)
+#define ALLSIGSNO	7
 
-typedef void (*el_signalhandler_t)(int);
-typedef el_signalhandler_t *el_signal_t;
+typedef struct {
+	struct sigaction sig_action[ALLSIGSNO];
+	sigset_t sig_set;
+	volatile sig_atomic_t sig_no;
+} *el_signal_t;
 
 protected void	sig_end(EditLine*);
 protected int	sig_init(EditLine*);
diff -pruN 5.1.58-1/cmd-line-utils/libedit/sys.h 5.1.61-2/cmd-line-utils/libedit/sys.h
--- 5.1.58-1/cmd-line-utils/libedit/sys.h	2011-07-01 15:22:23.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/sys.h	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: sys.h,v 1.9 2004/01/17 17:57:40 christos Exp $	*/
+/*	$NetBSD: sys.h,v 1.17 2011/09/28 14:08:04 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -48,14 +48,6 @@
 # define __attribute__(A)
 #endif
 
-#ifndef _DIAGASSERT
-# define _DIAGASSERT(x)
-#endif
-
-#ifndef SIZE_T_MAX
-# define SIZE_T_MAX UINT_MAX
-#endif
-
 #ifndef __BEGIN_DECLS
 # ifdef  __cplusplus
 #  define __BEGIN_DECLS  extern "C" {
@@ -79,18 +71,8 @@
 			/* When we want to hide everything	*/
 #endif
 
-#ifndef HAVE_U_INT32_T
-typedef unsigned int  u_int32_t;
-#endif
-
-#ifndef _PTR_T
-# define _PTR_T
-typedef void	*ptr_t;
-#endif
-
-#ifndef _IOCTL_T
-# define _IOCTL_T
-typedef void	*ioctl_t;
+#ifndef __arraycount
+# define __arraycount(a) (sizeof(a) / sizeof(*(a)))
 #endif
 
 #include <stdio.h>
@@ -110,10 +92,44 @@ size_t	strlcpy(char *dst, const char *sr
 char	*fgetln(FILE *fp, size_t *len);
 #endif
 
+#ifdef __linux__
+/* Apparently we need _GNU_SOURCE defined to get access to wcsdup on Linux */
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+#endif
+
+#ifndef __USE_XOPEN
+#define __USE_XOPEN
+#endif
+
+#include <wchar.h>
+#include <wctype.h>
+
+#ifndef HAVE_WCSDUP
+wchar_t *wcsdup(const wchar_t *);
+#endif
+
+#ifndef _DIAGASSERT
+#define _DIAGASSERT(x)
+#endif
+
+#ifndef __RCSID
+#define __RCSID(x)
+#endif
+
+#ifndef HAVE_U_INT32_T
+typedef unsigned int	u_int32_t;
+#endif
+
+#ifndef SIZE_T_MAX
+#define SIZE_T_MAX	((size_t)-1)
+#endif
+
 #define	REGEX		/* Use POSIX.2 regular expression functions */
 #undef	REGEXP		/* Use UNIX V8 regular expression functions */
 
-#ifdef __SunOS
+#if defined(__sun)
 extern int tgetent(char *, const char *);
 extern int tgetflag(char *);
 extern int tgetnum(char *);
@@ -162,8 +178,8 @@ extern void	perror(const char *);
 #  define strerror(e)	sys_errlist[e]
 # endif
 # ifdef SABER
-extern ptr_t    memcpy(ptr_t, const ptr_t, size_t);
-extern ptr_t    memset(ptr_t, int, size_t);
+extern void *   memcpy(void *, const void *, size_t);
+extern void *   memset(void *, int, size_t);
 # endif
 extern char    *fgetline(FILE *, int *);
 #endif
diff -pruN 5.1.58-1/cmd-line-utils/libedit/term.c 5.1.61-2/cmd-line-utils/libedit/term.c
--- 5.1.58-1/cmd-line-utils/libedit/term.c	2011-07-01 15:22:23.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/term.c	1970-01-01 00:00:00.000000000 +0000
@@ -1,1700 +0,0 @@
-/*	$NetBSD: term.c,v 1.48 2009/02/06 20:08:13 sketch Exp $	*/
-
-/*-
- * Copyright (c) 1992, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Christos Zoulas of Cornell University.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-#if !defined(lint) && !defined(SCCSID)
-#if 0
-static char sccsid[] = "@(#)term.c	8.2 (Berkeley) 4/30/95";
-#else
-#endif
-#endif /* not lint && not SCCSID */
-
-/*
- * term.c: Editor/termcap-curses interface
- *	   We have to declare a static variable here, since the
- *	   termcap putchar routine does not take an argument!
- */
-#include <stdio.h>
-#include <signal.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#if 0 /* TODO: do we need this */
-#ifdef HAVE_TERMCAP_H
-#include <termcap.h>
-#endif
-#endif
-#ifdef HAVE_CURSES_H
-#include <curses.h>
-#endif
-#ifdef HAVE_NCURSES_H
-#include <ncurses.h>
-#endif
-/* Don't use Solaris's term.h. */
-#if (defined(HAVE_TERM_H) && !defined(__SunOS))
-#include <term.h>
-#endif
-#include <sys/types.h>
-#include <sys/ioctl.h>
-
-#ifdef _REENTRANT
-#include <pthread.h>
-#endif
-
-#include "el.h"
-
-/*
- * IMPORTANT NOTE: these routines are allowed to look at the current screen
- * and the current possition assuming that it is correct.  If this is not
- * true, then the update will be WRONG!  This is (should be) a valid
- * assumption...
- */
-
-#define	TC_BUFSIZE	2048
-
-#define	GoodStr(a)	(el->el_term.t_str[a] != NULL && \
-			    el->el_term.t_str[a][0] != '\0')
-#define	Str(a)		el->el_term.t_str[a]
-#define	Val(a)		el->el_term.t_val[a]
-
-#ifdef notdef
-private const struct {
-	const char *b_name;
-	int b_rate;
-} baud_rate[] = {
-#ifdef B0
-	{ "0", B0 },
-#endif
-#ifdef B50
-	{ "50", B50 },
-#endif
-#ifdef B75
-	{ "75", B75 },
-#endif
-#ifdef B110
-	{ "110", B110 },
-#endif
-#ifdef B134
-	{ "134", B134 },
-#endif
-#ifdef B150
-	{ "150", B150 },
-#endif
-#ifdef B200
-	{ "200", B200 },
-#endif
-#ifdef B300
-	{ "300", B300 },
-#endif
-#ifdef B600
-	{ "600", B600 },
-#endif
-#ifdef B900
-	{ "900", B900 },
-#endif
-#ifdef B1200
-	{ "1200", B1200 },
-#endif
-#ifdef B1800
-	{ "1800", B1800 },
-#endif
-#ifdef B2400
-	{ "2400", B2400 },
-#endif
-#ifdef B3600
-	{ "3600", B3600 },
-#endif
-#ifdef B4800
-	{ "4800", B4800 },
-#endif
-#ifdef B7200
-	{ "7200", B7200 },
-#endif
-#ifdef B9600
-	{ "9600", B9600 },
-#endif
-#ifdef EXTA
-	{ "19200", EXTA },
-#endif
-#ifdef B19200
-	{ "19200", B19200 },
-#endif
-#ifdef EXTB
-	{ "38400", EXTB },
-#endif
-#ifdef B38400
-	{ "38400", B38400 },
-#endif
-	{ NULL, 0 }
-};
-#endif
-
-private const struct termcapstr {
-	const char *name;
-	const char *long_name;
-} tstr[] = {
-#define	T_al	0
-	{ "al", "add new blank line" },
-#define	T_bl	1
-	{ "bl", "audible bell" },
-#define	T_cd	2
-	{ "cd", "clear to bottom" },
-#define	T_ce	3
-	{ "ce", "clear to end of line" },
-#define	T_ch	4
-	{ "ch", "cursor to horiz pos" },
-#define	T_cl	5
-	{ "cl", "clear screen" },
-#define	T_dc	6
-	{ "dc", "delete a character" },
-#define	T_dl	7
-	{ "dl", "delete a line" },
-#define	T_dm	8
-	{ "dm", "start delete mode" },
-#define	T_ed	9
-	{ "ed", "end delete mode" },
-#define	T_ei	10
-	{ "ei", "end insert mode" },
-#define	T_fs	11
-	{ "fs", "cursor from status line" },
-#define	T_ho	12
-	{ "ho", "home cursor" },
-#define	T_ic	13
-	{ "ic", "insert character" },
-#define	T_im	14
-	{ "im", "start insert mode" },
-#define	T_ip	15
-	{ "ip", "insert padding" },
-#define	T_kd	16
-	{ "kd", "sends cursor down" },
-#define	T_kl	17
-	{ "kl", "sends cursor left" },
-#define	T_kr	18
-	{ "kr", "sends cursor right" },
-#define	T_ku	19
-	{ "ku", "sends cursor up" },
-#define	T_md	20
-	{ "md", "begin bold" },
-#define	T_me	21
-	{ "me", "end attributes" },
-#define	T_nd	22
-	{ "nd", "non destructive space" },
-#define	T_se	23
-	{ "se", "end standout" },
-#define	T_so	24
-	{ "so", "begin standout" },
-#define	T_ts	25
-	{ "ts", "cursor to status line" },
-#define	T_up	26
-	{ "up", "cursor up one" },
-#define	T_us	27
-	{ "us", "begin underline" },
-#define	T_ue	28
-	{ "ue", "end underline" },
-#define	T_vb	29
-	{ "vb", "visible bell" },
-#define	T_DC	30
-	{ "DC", "delete multiple chars" },
-#define	T_DO	31
-	{ "DO", "cursor down multiple" },
-#define	T_IC	32
-	{ "IC", "insert multiple chars" },
-#define	T_LE	33
-	{ "LE", "cursor left multiple" },
-#define	T_RI	34
-	{ "RI", "cursor right multiple" },
-#define	T_UP	35
-	{ "UP", "cursor up multiple" },
-#define	T_kh	36
-	{ "kh", "send cursor home" },
-#define	T_at7	37
-	{ "@7", "send cursor end" },
-#define	T_str	38
-	{ NULL, NULL }
-};
-
-private const struct termcapval {
-	const char *name;
-	const char *long_name;
-} tval[] = {
-#define	T_am	0
-	{ "am", "has automatic margins" },
-#define	T_pt	1
-	{ "pt", "has physical tabs" },
-#define	T_li	2
-	{ "li", "Number of lines" },
-#define	T_co	3
-	{ "co", "Number of columns" },
-#define	T_km	4
-	{ "km", "Has meta key" },
-#define	T_xt	5
-	{ "xt", "Tab chars destructive" },
-#define	T_xn	6
-	{ "xn", "newline ignored at right margin" },
-#define	T_MT	7
-	{ "MT", "Has meta key" },			/* XXX? */
-#define	T_val	8
-	{ NULL, NULL, }
-};
-/* do two or more of the attributes use me */
-
-private void	term_setflags(EditLine *);
-private int	term_rebuffer_display(EditLine *);
-private void	term_free_display(EditLine *);
-private int	term_alloc_display(EditLine *);
-private void	term_alloc(EditLine *, const struct termcapstr *, const char *);
-private void	term_init_arrow(EditLine *);
-private void	term_reset_arrow(EditLine *);
-private int	term_putc(int);
-private void	term_tputs(EditLine *, const char *, int);
-
-#ifdef _REENTRANT
-private pthread_mutex_t term_mutex = PTHREAD_MUTEX_INITIALIZER;
-#endif
-private FILE *term_outfile = NULL;
-
-
-/* term_setflags():
- *	Set the terminal capability flags
- */
-private void
-term_setflags(EditLine *el)
-{
-	EL_FLAGS = 0;
-	if (el->el_tty.t_tabs)
-		EL_FLAGS |= (Val(T_pt) && !Val(T_xt)) ? TERM_CAN_TAB : 0;
-
-	EL_FLAGS |= (Val(T_km) || Val(T_MT)) ? TERM_HAS_META : 0;
-	EL_FLAGS |= GoodStr(T_ce) ? TERM_CAN_CEOL : 0;
-	EL_FLAGS |= (GoodStr(T_dc) || GoodStr(T_DC)) ? TERM_CAN_DELETE : 0;
-	EL_FLAGS |= (GoodStr(T_im) || GoodStr(T_ic) || GoodStr(T_IC)) ?
-	    TERM_CAN_INSERT : 0;
-	EL_FLAGS |= (GoodStr(T_up) || GoodStr(T_UP)) ? TERM_CAN_UP : 0;
-	EL_FLAGS |= Val(T_am) ? TERM_HAS_AUTO_MARGINS : 0;
-	EL_FLAGS |= Val(T_xn) ? TERM_HAS_MAGIC_MARGINS : 0;
-
-	if (GoodStr(T_me) && GoodStr(T_ue))
-		EL_FLAGS |= (strcmp(Str(T_me), Str(T_ue)) == 0) ?
-		    TERM_CAN_ME : 0;
-	else
-		EL_FLAGS &= ~TERM_CAN_ME;
-	if (GoodStr(T_me) && GoodStr(T_se))
-		EL_FLAGS |= (strcmp(Str(T_me), Str(T_se)) == 0) ?
-		    TERM_CAN_ME : 0;
-
-
-#ifdef DEBUG_SCREEN
-	if (!EL_CAN_UP) {
-		(void) fprintf(el->el_errfile,
-		    "WARNING: Your terminal cannot move up.\n");
-		(void) fprintf(el->el_errfile,
-		    "Editing may be odd for long lines.\n");
-	}
-	if (!EL_CAN_CEOL)
-		(void) fprintf(el->el_errfile, "no clear EOL capability.\n");
-	if (!EL_CAN_DELETE)
-		(void) fprintf(el->el_errfile, "no delete char capability.\n");
-	if (!EL_CAN_INSERT)
-		(void) fprintf(el->el_errfile, "no insert char capability.\n");
-#endif /* DEBUG_SCREEN */
-}
-
-/* term_init():
- *	Initialize the terminal stuff
- */
-protected int
-term_init(EditLine *el)
-{
-
-	el->el_term.t_buf = (char *) el_malloc(TC_BUFSIZE);
-	if (el->el_term.t_buf == NULL)
-		return (-1);
-	el->el_term.t_cap = (char *) el_malloc(TC_BUFSIZE);
-	if (el->el_term.t_cap == NULL)
-		return (-1);
-	el->el_term.t_fkey = (fkey_t *) el_malloc(A_K_NKEYS * sizeof(fkey_t));
-	if (el->el_term.t_fkey == NULL)
-		return (-1);
-	el->el_term.t_loc = 0;
-	el->el_term.t_str = (char **) el_malloc(T_str * sizeof(char *));
-	if (el->el_term.t_str == NULL)
-		return (-1);
-	(void) memset(el->el_term.t_str, 0, T_str * sizeof(char *));
-	el->el_term.t_val = (int *) el_malloc(T_val * sizeof(int));
-	if (el->el_term.t_val == NULL)
-		return (-1);
-	(void) memset(el->el_term.t_val, 0, T_val * sizeof(int));
-	(void) term_set(el, NULL);
-	term_init_arrow(el);
-	return (0);
-}
-
-/* term_end():
- *	Clean up the terminal stuff
- */
-protected void
-term_end(EditLine *el)
-{
-
-	el_free((ptr_t) el->el_term.t_buf);
-	el->el_term.t_buf = NULL;
-	el_free((ptr_t) el->el_term.t_cap);
-	el->el_term.t_cap = NULL;
-	el->el_term.t_loc = 0;
-	el_free((ptr_t) el->el_term.t_str);
-	el->el_term.t_str = NULL;
-	el_free((ptr_t) el->el_term.t_val);
-	el->el_term.t_val = NULL;
-	el_free((ptr_t) el->el_term.t_fkey);
-	el->el_term.t_fkey = NULL;
-	term_free_display(el);
-}
-
-
-/* term_alloc():
- *	Maintain a string pool for termcap strings
- */
-private void
-term_alloc(EditLine *el, const struct termcapstr *t, const char *cap)
-{
-	char termbuf[TC_BUFSIZE];
-	int tlen, clen;
-	char **tlist = el->el_term.t_str;
-	char **tmp, **str = &tlist[t - tstr];
-
-	if (cap == NULL || *cap == '\0') {
-		*str = NULL;
-		return;
-	} else
-		clen = strlen(cap);
-
-	tlen = *str == NULL ? 0 : strlen(*str);
-
-	/*
-         * New string is shorter; no need to allocate space
-         */
-	if (clen <= tlen) {
-		if (*str)
-			(void) strcpy(*str, cap);	/* XXX strcpy is safe */
-		return;
-	}
-	/*
-         * New string is longer; see if we have enough space to append
-         */
-	if (el->el_term.t_loc + 3 < TC_BUFSIZE) {
-						/* XXX strcpy is safe */
-		(void) strcpy(*str = &el->el_term.t_buf[el->el_term.t_loc],
-		    cap);
-		el->el_term.t_loc += clen + 1;	/* one for \0 */
-		return;
-	}
-	/*
-         * Compact our buffer; no need to check compaction, cause we know it
-         * fits...
-         */
-	tlen = 0;
-	for (tmp = tlist; tmp < &tlist[T_str]; tmp++)
-		if (*tmp != NULL && *tmp != '\0' && *tmp != *str) {
-			char *ptr;
-
-			for (ptr = *tmp; *ptr != '\0'; termbuf[tlen++] = *ptr++)
-				continue;
-			termbuf[tlen++] = '\0';
-		}
-	memcpy(el->el_term.t_buf, termbuf, TC_BUFSIZE);
-	el->el_term.t_loc = tlen;
-	if (el->el_term.t_loc + 3 >= TC_BUFSIZE) {
-		(void) fprintf(el->el_errfile,
-		    "Out of termcap string space.\n");
-		return;
-	}
-					/* XXX strcpy is safe */
-	(void) strcpy(*str = &el->el_term.t_buf[el->el_term.t_loc], cap);
-	el->el_term.t_loc += clen + 1;	/* one for \0 */
-	return;
-}
-
-
-/* term_rebuffer_display():
- *	Rebuffer the display after the screen changed size
- */
-private int
-term_rebuffer_display(EditLine *el)
-{
-	coord_t *c = &el->el_term.t_size;
-
-	term_free_display(el);
-
-	c->h = Val(T_co);
-	c->v = Val(T_li);
-
-	if (term_alloc_display(el) == -1)
-		return (-1);
-	return (0);
-}
-
-
-/* term_alloc_display():
- *	Allocate a new display.
- */
-private int
-term_alloc_display(EditLine *el)
-{
-	int i;
-	char **b;
-	coord_t *c = &el->el_term.t_size;
-
-	b = (char **) el_malloc((size_t) (sizeof(char *) * (c->v + 1)));
-	if (b == NULL)
-		return (-1);
-	for (i = 0; i < c->v; i++) {
-		b[i] = (char *) el_malloc((size_t) (sizeof(char) * (c->h + 1)));
-		if (b[i] == NULL) {
-			while (--i >= 0)
-				el_free((ptr_t) b[i]);
-			el_free((ptr_t) b);
-			return (-1);
-		}
-	}
-	b[c->v] = NULL;
-	el->el_display = b;
-
-	b = (char **) el_malloc((size_t) (sizeof(char *) * (c->v + 1)));
-	if (b == NULL)
-		return (-1);
-	for (i = 0; i < c->v; i++) {
-		b[i] = (char *) el_malloc((size_t) (sizeof(char) * (c->h + 1)));
-		if (b[i] == NULL) {
-			while (--i >= 0)
-				el_free((ptr_t) b[i]);
-			el_free((ptr_t) b);
-			return (-1);
-		}
-	}
-	b[c->v] = NULL;
-	el->el_vdisplay = b;
-	return (0);
-}
-
-
-/* term_free_display():
- *	Free the display buffers
- */
-private void
-term_free_display(EditLine *el)
-{
-	char **b;
-	char **bufp;
-
-	b = el->el_display;
-	el->el_display = NULL;
-	if (b != NULL) {
-		for (bufp = b; *bufp != NULL; bufp++)
-			el_free((ptr_t) * bufp);
-		el_free((ptr_t) b);
-	}
-	b = el->el_vdisplay;
-	el->el_vdisplay = NULL;
-	if (b != NULL) {
-		for (bufp = b; *bufp != NULL; bufp++)
-			el_free((ptr_t) * bufp);
-		el_free((ptr_t) b);
-	}
-}
-
-
-/* term_move_to_line():
- *	move to line <where> (first line == 0)
- * 	as efficiently as possible
- */
-protected void
-term_move_to_line(EditLine *el, int where)
-{
-	int del;
-
-	if (where == el->el_cursor.v)
-		return;
-
-	if (where > el->el_term.t_size.v) {
-#ifdef DEBUG_SCREEN
-		(void) fprintf(el->el_errfile,
-		    "term_move_to_line: where is ridiculous: %d\r\n", where);
-#endif /* DEBUG_SCREEN */
-		return;
-	}
-	if ((del = where - el->el_cursor.v) > 0) {
-		while (del > 0) {
-			if (EL_HAS_AUTO_MARGINS &&
-			    el->el_display[el->el_cursor.v][0] != '\0') {
-				/* move without newline */
-				term_move_to_char(el, el->el_term.t_size.h - 1);
-				term_overwrite(el,
-				    &el->el_display[el->el_cursor.v][el->el_cursor.h],
-				    1);
-				/* updates Cursor */
-				del--;
-			} else {
-				if ((del > 1) && GoodStr(T_DO)) {
-					term_tputs(el, tgoto(Str(T_DO), del,
-					    del), del);
-					del = 0;
-				} else {
-					for (; del > 0; del--)
-						term__putc(el, '\n');
-					/* because the \n will become \r\n */
-					el->el_cursor.h = 0;
-				}
-			}
-		}
-	} else {		/* del < 0 */
-		if (GoodStr(T_UP) && (-del > 1 || !GoodStr(T_up)))
-			term_tputs(el, tgoto(Str(T_UP), -del, -del), -del);
-		else {
-			if (GoodStr(T_up))
-				for (; del < 0; del++)
-					term_tputs(el, Str(T_up), 1);
-		}
-	}
-	el->el_cursor.v = where;/* now where is here */
-}
-
-
-/* term_move_to_char():
- *	Move to the character position specified
- */
-protected void
-term_move_to_char(EditLine *el, int where)
-{
-	int del, i;
-
-mc_again:
-	if (where == el->el_cursor.h)
-		return;
-
-	if (where > el->el_term.t_size.h) {
-#ifdef DEBUG_SCREEN
-		(void) fprintf(el->el_errfile,
-		    "term_move_to_char: where is riduculous: %d\r\n", where);
-#endif /* DEBUG_SCREEN */
-		return;
-	}
-	if (!where) {		/* if where is first column */
-		term__putc(el, '\r');	/* do a CR */
-		el->el_cursor.h = 0;
-		return;
-	}
-	del = where - el->el_cursor.h;
-
-	if ((del < -4 || del > 4) && GoodStr(T_ch))
-		/* go there directly */
-		term_tputs(el, tgoto(Str(T_ch), where, where), where);
-	else {
-		if (del > 0) {	/* moving forward */
-			if ((del > 4) && GoodStr(T_RI))
-				term_tputs(el, tgoto(Str(T_RI), del, del), del);
-			else {
-					/* if I can do tabs, use them */
-				if (EL_CAN_TAB) {
-					if ((el->el_cursor.h & 0370) !=
-					    (where & 0370)) {
-						/* if not within tab stop */
-						for (i =
-						    (el->el_cursor.h & 0370);
-						    i < (where & 0370);
-						    i += 8)
-							term__putc(el, '\t');	
-							/* then tab over */
-						el->el_cursor.h = where & 0370;
-					}
-				}
-				/*
-				 * it's usually cheaper to just write the
-				 * chars, so we do.
-				 */
-				/*
-				 * NOTE THAT term_overwrite() WILL CHANGE
-				 * el->el_cursor.h!!!
-				 */
-				term_overwrite(el,
-				    &el->el_display[el->el_cursor.v][el->el_cursor.h],
-				    where - el->el_cursor.h);
-
-			}
-		} else {	/* del < 0 := moving backward */
-			if ((-del > 4) && GoodStr(T_LE))
-				term_tputs(el, tgoto(Str(T_LE), -del, -del),
-				    -del);
-			else {	/* can't go directly there */
-				/*
-				 * if the "cost" is greater than the "cost"
-				 * from col 0
-				 */
-				if (EL_CAN_TAB ?
-				    ((unsigned int)-del >
-				    (((unsigned int) where >> 3) +
-				     (where & 07)))
-				    : (-del > where)) {
-					term__putc(el, '\r');	/* do a CR */
-					el->el_cursor.h = 0;
-					goto mc_again;	/* and try again */
-				}
-				for (i = 0; i < -del; i++)
-					term__putc(el, '\b');
-			}
-		}
-	}
-	el->el_cursor.h = where;		/* now where is here */
-}
-
-
-/* term_overwrite():
- *	Overstrike num characters
- */
-protected void
-term_overwrite(EditLine *el, const char *cp, int n)
-{
-	if (n <= 0)
-		return;		/* catch bugs */
-
-	if (n > el->el_term.t_size.h) {
-#ifdef DEBUG_SCREEN
-		(void) fprintf(el->el_errfile,
-		    "term_overwrite: n is riduculous: %d\r\n", n);
-#endif /* DEBUG_SCREEN */
-		return;
-	}
-	do {
-		term__putc(el, *cp++);
-		el->el_cursor.h++;
-	} while (--n);
-
-	if (el->el_cursor.h >= el->el_term.t_size.h) {	/* wrap? */
-		if (EL_HAS_AUTO_MARGINS) {	/* yes */
-			el->el_cursor.h = 0;
-			el->el_cursor.v++;
-			if (EL_HAS_MAGIC_MARGINS) {
-				/* force the wrap to avoid the "magic"
-				 * situation */
-				char c;
-				if ((c = el->el_display[el->el_cursor.v][el->el_cursor.h])
-				    != '\0')
-					term_overwrite(el, &c, 1);
-				else
-					term__putc(el, ' ');
-				el->el_cursor.h = 1;
-			}
-		} else		/* no wrap, but cursor stays on screen */
-			el->el_cursor.h = el->el_term.t_size.h;
-	}
-}
-
-
-/* term_deletechars():
- *	Delete num characters
- */
-protected void
-term_deletechars(EditLine *el, int num)
-{
-	if (num <= 0)
-		return;
-
-	if (!EL_CAN_DELETE) {
-#ifdef DEBUG_EDIT
-		(void) fprintf(el->el_errfile, "   ERROR: cannot delete   \n");
-#endif /* DEBUG_EDIT */
-		return;
-	}
-	if (num > el->el_term.t_size.h) {
-#ifdef DEBUG_SCREEN
-		(void) fprintf(el->el_errfile,
-		    "term_deletechars: num is riduculous: %d\r\n", num);
-#endif /* DEBUG_SCREEN */
-		return;
-	}
-	if (GoodStr(T_DC))	/* if I have multiple delete */
-		if ((num > 1) || !GoodStr(T_dc)) {	/* if dc would be more
-							 * expen. */
-			term_tputs(el, tgoto(Str(T_DC), num, num), num);
-			return;
-		}
-	if (GoodStr(T_dm))	/* if I have delete mode */
-		term_tputs(el, Str(T_dm), 1);
-
-	if (GoodStr(T_dc))	/* else do one at a time */
-		while (num--)
-			term_tputs(el, Str(T_dc), 1);
-
-	if (GoodStr(T_ed))	/* if I have delete mode */
-		term_tputs(el, Str(T_ed), 1);
-}
-
-
-/* term_insertwrite():
- *	Puts terminal in insert character mode or inserts num
- *	characters in the line
- */
-protected void
-term_insertwrite(EditLine *el, char *cp, int num)
-{
-	if (num <= 0)
-		return;
-	if (!EL_CAN_INSERT) {
-#ifdef DEBUG_EDIT
-		(void) fprintf(el->el_errfile, "   ERROR: cannot insert   \n");
-#endif /* DEBUG_EDIT */
-		return;
-	}
-	if (num > el->el_term.t_size.h) {
-#ifdef DEBUG_SCREEN
-		(void) fprintf(el->el_errfile,
-		    "StartInsert: num is riduculous: %d\r\n", num);
-#endif /* DEBUG_SCREEN */
-		return;
-	}
-	if (GoodStr(T_IC))	/* if I have multiple insert */
-		if ((num > 1) || !GoodStr(T_ic)) {
-				/* if ic would be more expensive */
-			term_tputs(el, tgoto(Str(T_IC), num, num), num);
-			term_overwrite(el, cp, num);
-				/* this updates el_cursor.h */
-			return;
-		}
-	if (GoodStr(T_im) && GoodStr(T_ei)) {	/* if I have insert mode */
-		term_tputs(el, Str(T_im), 1);
-
-		el->el_cursor.h += num;
-		do
-			term__putc(el, *cp++);
-		while (--num);
-
-		if (GoodStr(T_ip))	/* have to make num chars insert */
-			term_tputs(el, Str(T_ip), 1);
-
-		term_tputs(el, Str(T_ei), 1);
-		return;
-	}
-	do {
-		if (GoodStr(T_ic))	/* have to make num chars insert */
-			term_tputs(el, Str(T_ic), 1);
-
-		term__putc(el, *cp++);
-
-		el->el_cursor.h++;
-
-		if (GoodStr(T_ip))	/* have to make num chars insert */
-			term_tputs(el, Str(T_ip), 1);
-					/* pad the inserted char */
-
-	} while (--num);
-}
-
-
-/* term_clear_EOL():
- *	clear to end of line.  There are num characters to clear
- */
-protected void
-term_clear_EOL(EditLine *el, int num)
-{
-	int i;
-
-	if (EL_CAN_CEOL && GoodStr(T_ce))
-		term_tputs(el, Str(T_ce), 1);
-	else {
-		for (i = 0; i < num; i++)
-			term__putc(el, ' ');
-		el->el_cursor.h += num;	/* have written num spaces */
-	}
-}
-
-
-/* term_clear_screen():
- *	Clear the screen
- */
-protected void
-term_clear_screen(EditLine *el)
-{				/* clear the whole screen and home */
-
-	if (GoodStr(T_cl))
-		/* send the clear screen code */
-		term_tputs(el, Str(T_cl), Val(T_li));
-	else if (GoodStr(T_ho) && GoodStr(T_cd)) {
-		term_tputs(el, Str(T_ho), Val(T_li));	/* home */
-		/* clear to bottom of screen */
-		term_tputs(el, Str(T_cd), Val(T_li));
-	} else {
-		term__putc(el, '\r');
-		term__putc(el, '\n');
-	}
-}
-
-
-/* term_beep():
- *	Beep the way the terminal wants us
- */
-protected void
-term_beep(EditLine *el)
-{
-	if (GoodStr(T_bl))
-		/* what termcap says we should use */
-		term_tputs(el, Str(T_bl), 1);
-	else
-		term__putc(el, '\007');	/* an ASCII bell; ^G */
-}
-
-
-#ifdef notdef
-/* term_clear_to_bottom():
- *	Clear to the bottom of the screen
- */
-protected void
-term_clear_to_bottom(EditLine *el)
-{
-	if (GoodStr(T_cd))
-		term_tputs(el, Str(T_cd), Val(T_li));
-	else if (GoodStr(T_ce))
-		term_tputs(el, Str(T_ce), Val(T_li));
-}
-#endif
-
-protected void
-term_get(EditLine *el, const char **term)
-{
-	*term = el->el_term.t_name;
-}
-
-
-/* term_set():
- *	Read in the terminal capabilities from the requested terminal
- */
-protected int
-term_set(EditLine *el, const char *term)
-{
-	int i;
-	char buf[TC_BUFSIZE];
-	char *area;
-	const struct termcapstr *t;
-	sigset_t oset, nset;
-	int lins, cols;
-
-	(void) sigemptyset(&nset);
-	(void) sigaddset(&nset, SIGWINCH);
-	(void) sigprocmask(SIG_BLOCK, &nset, &oset);
-
-	area = buf;
-
-
-	if (term == NULL)
-		term = getenv("TERM");
-
-	if (!term || !term[0])
-		term = "dumb";
-
-	if (strcmp(term, "emacs") == 0)
-		el->el_flags |= EDIT_DISABLED;
-
-	memset(el->el_term.t_cap, 0, TC_BUFSIZE);
-
-	i = tgetent(el->el_term.t_cap, term);
-
-	if (i <= 0) {
-		if (i == -1)
-			(void) fprintf(el->el_errfile,
-			    "Cannot read termcap database;\n");
-		else if (i == 0)
-			(void) fprintf(el->el_errfile,
-			    "No entry for terminal type \"%s\";\n", term);
-		(void) fprintf(el->el_errfile,
-		    "using dumb terminal settings.\n");
-		Val(T_co) = 80;	/* do a dumb terminal */
-		Val(T_pt) = Val(T_km) = Val(T_li) = 0;
-		Val(T_xt) = Val(T_MT);
-		for (t = tstr; t->name != NULL; t++)
-			term_alloc(el, t, NULL);
-	} else {
-		/* auto/magic margins */
-		Val(T_am) = tgetflag("am");
-		Val(T_xn) = tgetflag("xn");
-		/* Can we tab */
-		Val(T_pt) = tgetflag("pt");
-		Val(T_xt) = tgetflag("xt");
-		/* do we have a meta? */
-		Val(T_km) = tgetflag("km");
-		Val(T_MT) = tgetflag("MT");
-		/* Get the size */
-		Val(T_co) = tgetnum("co");
-		Val(T_li) = tgetnum("li");
-		for (t = tstr; t->name != NULL; t++) {
-			/* XXX: some systems' tgetstr needs non const */
-			term_alloc(el, t, tgetstr(strchr(t->name, *t->name),
-			    &area));
-		}
-	}
-
-	if (Val(T_co) < 2)
-		Val(T_co) = 80;	/* just in case */
-	if (Val(T_li) < 1)
-		Val(T_li) = 24;
-
-	el->el_term.t_size.v = Val(T_co);
-	el->el_term.t_size.h = Val(T_li);
-
-	term_setflags(el);
-
-				/* get the correct window size */
-	(void) term_get_size(el, &lins, &cols);
-	if (term_change_size(el, lins, cols) == -1)
-		return (-1);
-	(void) sigprocmask(SIG_SETMASK, &oset, NULL);
-	term_bind_arrow(el);
-	el->el_term.t_name = term;
-	return (i <= 0 ? -1 : 0);
-}
-
-
-/* term_get_size():
- *	Return the new window size in lines and cols, and
- *	true if the size was changed.
- */
-protected int
-term_get_size(EditLine *el, int *lins, int *cols)
-{
-
-	*cols = Val(T_co);
-	*lins = Val(T_li);
-
-#ifdef TIOCGWINSZ
-	{
-		struct winsize ws;
-		if (ioctl(el->el_infd, TIOCGWINSZ, (ioctl_t) & ws) != -1) {
-			if (ws.ws_col)
-				*cols = ws.ws_col;
-			if (ws.ws_row)
-				*lins = ws.ws_row;
-		}
-	}
-#endif
-#ifdef TIOCGSIZE
-	{
-		struct ttysize ts;
-		if (ioctl(el->el_infd, TIOCGSIZE, (ioctl_t) & ts) != -1) {
-			if (ts.ts_cols)
-				*cols = ts.ts_cols;
-			if (ts.ts_lines)
-				*lins = ts.ts_lines;
-		}
-	}
-#endif
-	return (Val(T_co) != *cols || Val(T_li) != *lins);
-}
-
-
-/* term_change_size():
- *	Change the size of the terminal
- */
-protected int
-term_change_size(EditLine *el, int lins, int cols)
-{
-	/*
-         * Just in case
-         */
-	Val(T_co) = (cols < 2) ? 80 : cols;
-	Val(T_li) = (lins < 1) ? 24 : lins;
-
-	/* re-make display buffers */
-	if (term_rebuffer_display(el) == -1)
-		return (-1);
-	re_clear_display(el);
-	return (0);
-}
-
-
-/* term_init_arrow():
- *	Initialize the arrow key bindings from termcap
- */
-private void
-term_init_arrow(EditLine *el)
-{
-	fkey_t *arrow = el->el_term.t_fkey;
-
-	arrow[A_K_DN].name = "down";
-	arrow[A_K_DN].key = T_kd;
-	arrow[A_K_DN].fun.cmd = ED_NEXT_HISTORY;
-	arrow[A_K_DN].type = XK_CMD;
-
-	arrow[A_K_UP].name = "up";
-	arrow[A_K_UP].key = T_ku;
-	arrow[A_K_UP].fun.cmd = ED_PREV_HISTORY;
-	arrow[A_K_UP].type = XK_CMD;
-
-	arrow[A_K_LT].name = "left";
-	arrow[A_K_LT].key = T_kl;
-	arrow[A_K_LT].fun.cmd = ED_PREV_CHAR;
-	arrow[A_K_LT].type = XK_CMD;
-
-	arrow[A_K_RT].name = "right";
-	arrow[A_K_RT].key = T_kr;
-	arrow[A_K_RT].fun.cmd = ED_NEXT_CHAR;
-	arrow[A_K_RT].type = XK_CMD;
-
-	arrow[A_K_HO].name = "home";
-	arrow[A_K_HO].key = T_kh;
-	arrow[A_K_HO].fun.cmd = ED_MOVE_TO_BEG;
-	arrow[A_K_HO].type = XK_CMD;
-
-	arrow[A_K_EN].name = "end";
-	arrow[A_K_EN].key = T_at7;
-	arrow[A_K_EN].fun.cmd = ED_MOVE_TO_END;
-	arrow[A_K_EN].type = XK_CMD;
-}
-
-
-/* term_reset_arrow():
- *	Reset arrow key bindings
- */
-private void
-term_reset_arrow(EditLine *el)
-{
-	fkey_t *arrow = el->el_term.t_fkey;
-	static const char strA[] = {033, '[', 'A', '\0'};
-	static const char strB[] = {033, '[', 'B', '\0'};
-	static const char strC[] = {033, '[', 'C', '\0'};
-	static const char strD[] = {033, '[', 'D', '\0'};
-	static const char strH[] = {033, '[', 'H', '\0'};
-	static const char strF[] = {033, '[', 'F', '\0'};
-	static const char stOA[] = {033, 'O', 'A', '\0'};
-	static const char stOB[] = {033, 'O', 'B', '\0'};
-	static const char stOC[] = {033, 'O', 'C', '\0'};
-	static const char stOD[] = {033, 'O', 'D', '\0'};
-	static const char stOH[] = {033, 'O', 'H', '\0'};
-	static const char stOF[] = {033, 'O', 'F', '\0'};
-
-	key_add(el, strA, &arrow[A_K_UP].fun, arrow[A_K_UP].type);
-	key_add(el, strB, &arrow[A_K_DN].fun, arrow[A_K_DN].type);
-	key_add(el, strC, &arrow[A_K_RT].fun, arrow[A_K_RT].type);
-	key_add(el, strD, &arrow[A_K_LT].fun, arrow[A_K_LT].type);
-	key_add(el, strH, &arrow[A_K_HO].fun, arrow[A_K_HO].type);
-	key_add(el, strF, &arrow[A_K_EN].fun, arrow[A_K_EN].type);
-	key_add(el, stOA, &arrow[A_K_UP].fun, arrow[A_K_UP].type);
-	key_add(el, stOB, &arrow[A_K_DN].fun, arrow[A_K_DN].type);
-	key_add(el, stOC, &arrow[A_K_RT].fun, arrow[A_K_RT].type);
-	key_add(el, stOD, &arrow[A_K_LT].fun, arrow[A_K_LT].type);
-	key_add(el, stOH, &arrow[A_K_HO].fun, arrow[A_K_HO].type);
-	key_add(el, stOF, &arrow[A_K_EN].fun, arrow[A_K_EN].type);
-
-	if (el->el_map.type == MAP_VI) {
-		key_add(el, &strA[1], &arrow[A_K_UP].fun, arrow[A_K_UP].type);
-		key_add(el, &strB[1], &arrow[A_K_DN].fun, arrow[A_K_DN].type);
-		key_add(el, &strC[1], &arrow[A_K_RT].fun, arrow[A_K_RT].type);
-		key_add(el, &strD[1], &arrow[A_K_LT].fun, arrow[A_K_LT].type);
-		key_add(el, &strH[1], &arrow[A_K_HO].fun, arrow[A_K_HO].type);
-		key_add(el, &strF[1], &arrow[A_K_EN].fun, arrow[A_K_EN].type);
-		key_add(el, &stOA[1], &arrow[A_K_UP].fun, arrow[A_K_UP].type);
-		key_add(el, &stOB[1], &arrow[A_K_DN].fun, arrow[A_K_DN].type);
-		key_add(el, &stOC[1], &arrow[A_K_RT].fun, arrow[A_K_RT].type);
-		key_add(el, &stOD[1], &arrow[A_K_LT].fun, arrow[A_K_LT].type);
-		key_add(el, &stOH[1], &arrow[A_K_HO].fun, arrow[A_K_HO].type);
-		key_add(el, &stOF[1], &arrow[A_K_EN].fun, arrow[A_K_EN].type);
-	}
-}
-
-
-/* term_set_arrow():
- *	Set an arrow key binding
- */
-protected int
-term_set_arrow(EditLine *el, const char *name, key_value_t *fun, int type)
-{
-	fkey_t *arrow = el->el_term.t_fkey;
-	int i;
-
-	for (i = 0; i < A_K_NKEYS; i++)
-		if (strcmp(name, arrow[i].name) == 0) {
-			arrow[i].fun = *fun;
-			arrow[i].type = type;
-			return (0);
-		}
-	return (-1);
-}
-
-
-/* term_clear_arrow():
- *	Clear an arrow key binding
- */
-protected int
-term_clear_arrow(EditLine *el, const char *name)
-{
-	fkey_t *arrow = el->el_term.t_fkey;
-	int i;
-
-	for (i = 0; i < A_K_NKEYS; i++)
-		if (strcmp(name, arrow[i].name) == 0) {
-			arrow[i].type = XK_NOD;
-			return (0);
-		}
-	return (-1);
-}
-
-
-/* term_print_arrow():
- *	Print the arrow key bindings
- */
-protected void
-term_print_arrow(EditLine *el, const char *name)
-{
-	int i;
-	fkey_t *arrow = el->el_term.t_fkey;
-
-	for (i = 0; i < A_K_NKEYS; i++)
-		if (*name == '\0' || strcmp(name, arrow[i].name) == 0)
-			if (arrow[i].type != XK_NOD)
-				key_kprint(el, arrow[i].name, &arrow[i].fun,
-				    arrow[i].type);
-}
-
-
-/* term_bind_arrow():
- *	Bind the arrow keys
- */
-protected void
-term_bind_arrow(EditLine *el)
-{
-	el_action_t *map;
-	const el_action_t *dmap;
-	int i, j;
-	char *p;
-	fkey_t *arrow = el->el_term.t_fkey;
-
-	/* Check if the components needed are initialized */
-	if (el->el_term.t_buf == NULL || el->el_map.key == NULL)
-		return;
-
-	map = el->el_map.type == MAP_VI ? el->el_map.alt : el->el_map.key;
-	dmap = el->el_map.type == MAP_VI ? el->el_map.vic : el->el_map.emacs;
-
-	term_reset_arrow(el);
-
-	for (i = 0; i < A_K_NKEYS; i++) {
-		p = el->el_term.t_str[arrow[i].key];
-		if (p && *p) {
-			j = (unsigned char) *p;
-			/*
-		         * Assign the arrow keys only if:
-		         *
-		         * 1. They are multi-character arrow keys and the user
-		         *    has not re-assigned the leading character, or
-		         *    has re-assigned the leading character to be
-		         *	  ED_SEQUENCE_LEAD_IN
-		         * 2. They are single arrow keys pointing to an
-			 *    unassigned key.
-		         */
-			if (arrow[i].type == XK_NOD)
-				key_clear(el, map, p);
-			else {
-				if (p[1] && (dmap[j] == map[j] ||
-					map[j] == ED_SEQUENCE_LEAD_IN)) {
-					key_add(el, p, &arrow[i].fun,
-					    arrow[i].type);
-					map[j] = ED_SEQUENCE_LEAD_IN;
-				} else if (map[j] == ED_UNASSIGNED) {
-					key_clear(el, map, p);
-					if (arrow[i].type == XK_CMD)
-						map[j] = arrow[i].fun.cmd;
-					else
-						key_add(el, p, &arrow[i].fun,
-						    arrow[i].type);
-				}
-			}
-		}
-	}
-}
-
-/* term_putc():
- *	Add a character
- */
-private int
-term_putc(int c)
-{
-
-	if (term_outfile == NULL)
-		return -1;
-	return fputc(c, term_outfile);
-}
-
-private void
-term_tputs(EditLine *el, const char *cap, int affcnt)
-{
-#ifdef _REENTRANT
-	pthread_mutex_lock(&term_mutex);
-#endif
-	term_outfile = el->el_outfile;
-	(void)tputs(cap, affcnt, term_putc);
-#ifdef _REENTRANT
-	pthread_mutex_unlock(&term_mutex);
-#endif
-}
-
-/* term__putc():
- *	Add a character
- */
-protected int
-term__putc(EditLine *el, int c)
-{
-
-	return fputc(c, el->el_outfile);
-}
-
-/* term__flush():
- *	Flush output
- */
-protected void
-term__flush(EditLine *el)
-{
-
-	(void) fflush(el->el_outfile);
-}
-
-/* term_writec():
- *	Write the given character out, in a human readable form
- */
-protected void
-term_writec(EditLine *el, int c)
-{
-	char buf[8];
-	int cnt = key__decode_char(buf, sizeof(buf), 0, c);
-	buf[cnt] = '\0';
-	term_overwrite(el, buf, cnt);
-	term__flush(el);
-}
-
-
-/* term_telltc():
- *	Print the current termcap characteristics
- */
-protected int
-/*ARGSUSED*/
-term_telltc(EditLine *el, int argc __attribute__((__unused__)), 
-    const char **argv __attribute__((__unused__)))
-{
-	const struct termcapstr *t;
-	char **ts;
-	char upbuf[EL_BUFSIZ];
-
-	(void) fprintf(el->el_outfile, "\n\tYour terminal has the\n");
-	(void) fprintf(el->el_outfile, "\tfollowing characteristics:\n\n");
-	(void) fprintf(el->el_outfile, "\tIt has %d columns and %d lines\n",
-	    Val(T_co), Val(T_li));
-	(void) fprintf(el->el_outfile,
-	    "\tIt has %s meta key\n", EL_HAS_META ? "a" : "no");
-	(void) fprintf(el->el_outfile,
-	    "\tIt can%suse tabs\n", EL_CAN_TAB ? " " : "not ");
-	(void) fprintf(el->el_outfile, "\tIt %s automatic margins\n",
-	    EL_HAS_AUTO_MARGINS ? "has" : "does not have");
-	if (EL_HAS_AUTO_MARGINS)
-		(void) fprintf(el->el_outfile, "\tIt %s magic margins\n",
-		    EL_HAS_MAGIC_MARGINS ? "has" : "does not have");
-
-	for (t = tstr, ts = el->el_term.t_str; t->name != NULL; t++, ts++) {
-		const char *ub;
-		if (*ts && **ts) {
-		    (void) key__decode_str(*ts, upbuf, sizeof(upbuf), "");
-		    ub = upbuf;
-		} else {
-		    ub = "(empty)";
-		}
-		(void) fprintf(el->el_outfile, "\t%25s (%s) == %s\n",
-		    t->long_name, t->name, ub);
-	}
-	(void) fputc('\n', el->el_outfile);
-	return (0);
-}
-
-
-/* term_settc():
- *	Change the current terminal characteristics
- */
-protected int
-/*ARGSUSED*/
-term_settc(EditLine *el, int argc __attribute__((__unused__)),
-    const char **argv)
-{
-	const struct termcapstr *ts;
-	const struct termcapval *tv;
-	const char *what, *how;
-
-	if (argv == NULL || argv[1] == NULL || argv[2] == NULL)
-		return -1;
-
-	what = argv[1];
-	how = argv[2];
-
-	/*
-         * Do the strings first
-         */
-	for (ts = tstr; ts->name != NULL; ts++)
-		if (strcmp(ts->name, what) == 0)
-			break;
-
-	if (ts->name != NULL) {
-		term_alloc(el, ts, how);
-		term_setflags(el);
-		return 0;
-	}
-	/*
-         * Do the numeric ones second
-         */
-	for (tv = tval; tv->name != NULL; tv++)
-		if (strcmp(tv->name, what) == 0)
-			break;
-
-	if (tv->name != NULL)
-		return -1;
-
-	if (tv == &tval[T_pt] || tv == &tval[T_km] ||
-	    tv == &tval[T_am] || tv == &tval[T_xn]) {
-		if (strcmp(how, "yes") == 0)
-			el->el_term.t_val[tv - tval] = 1;
-		else if (strcmp(how, "no") == 0)
-			el->el_term.t_val[tv - tval] = 0;
-		else {
-			(void) fprintf(el->el_errfile,
-			    "%s: Bad value `%s'.\n", argv[0], how);
-			return -1;
-		}
-		term_setflags(el);
-		if (term_change_size(el, Val(T_li), Val(T_co)) == -1)
-			return -1;
-		return 0;
-	} else {
-		long i;
-		char *ep;
-
-		i = strtol(how, &ep, 10);
-		if (*ep != '\0') {
-			(void) fprintf(el->el_errfile,
-			    "%s: Bad value `%s'.\n", argv[0], how);
-			return -1;
-		}
-		el->el_term.t_val[tv - tval] = (int) i;
-		el->el_term.t_size.v = Val(T_co);
-		el->el_term.t_size.h = Val(T_li);
-		if (tv == &tval[T_co] || tv == &tval[T_li])
-			if (term_change_size(el, Val(T_li), Val(T_co))
-			    == -1)
-				return -1;
-		return 0;
-	}
-}
-
-
-/* term_gettc():
- *	Get the current terminal characteristics
- */
-protected int
-/*ARGSUSED*/
-term_gettc(EditLine *el, int argc __attribute__((__unused__)), char **argv)
-{
-	const struct termcapstr *ts;
-	const struct termcapval *tv;
-	char *what;
-	void *how;
-
-	if (argv == NULL || argv[1] == NULL || argv[2] == NULL)
-		return (-1);
-
-	what = argv[1];
-	how = argv[2];
-
-	/*
-         * Do the strings first
-         */
-	for (ts = tstr; ts->name != NULL; ts++)
-		if (strcmp(ts->name, what) == 0)
-			break;
-
-	if (ts->name != NULL) {
-		*(char **)how = el->el_term.t_str[ts - tstr];
-		return 0;
-	}
-	/*
-         * Do the numeric ones second
-         */
-	for (tv = tval; tv->name != NULL; tv++)
-		if (strcmp(tv->name, what) == 0)
-			break;
-
-	if (tv->name == NULL)
-		return -1;
-
-	if (tv == &tval[T_pt] || tv == &tval[T_km] ||
-	    tv == &tval[T_am] || tv == &tval[T_xn]) {
-		static char yes[] = "yes";
-		static char no[] = "no";
-		if (el->el_term.t_val[tv - tval])
-			*(char **)how = yes;
-		else
-			*(char **)how = no;
-		return 0;
-	} else {
-		*(int *)how = el->el_term.t_val[tv - tval];
-		return 0;
-	}
-}
-
-/* term_echotc():
- *	Print the termcap string out with variable substitution
- */
-protected int
-/*ARGSUSED*/
-term_echotc(EditLine *el, int argc __attribute__((__unused__)),
-    const char **argv)
-{
-	char *cap, *scap, *ep;
-	int arg_need, arg_cols, arg_rows;
-	int verbose = 0, silent = 0;
-	char *area;
-	static const char fmts[] = "%s\n", fmtd[] = "%d\n";
-	const struct termcapstr *t;
-	char buf[TC_BUFSIZE];
-	long i;
-
-	area = buf;
-
-	if (argv == NULL || argv[1] == NULL)
-		return (-1);
-	argv++;
-
-	if (argv[0][0] == '-') {
-		switch (argv[0][1]) {
-		case 'v':
-			verbose = 1;
-			break;
-		case 's':
-			silent = 1;
-			break;
-		default:
-			/* stderror(ERR_NAME | ERR_TCUSAGE); */
-			break;
-		}
-		argv++;
-	}
-	if (!*argv || *argv[0] == '\0')
-		return (0);
-	if (strcmp(*argv, "tabs") == 0) {
-		(void) fprintf(el->el_outfile, fmts, EL_CAN_TAB ? "yes" : "no");
-		return (0);
-	} else if (strcmp(*argv, "meta") == 0) {
-		(void) fprintf(el->el_outfile, fmts, Val(T_km) ? "yes" : "no");
-		return (0);
-	} else if (strcmp(*argv, "xn") == 0) {
-		(void) fprintf(el->el_outfile, fmts, EL_HAS_MAGIC_MARGINS ?
-		    "yes" : "no");
-		return (0);
-	} else if (strcmp(*argv, "am") == 0) {
-		(void) fprintf(el->el_outfile, fmts, EL_HAS_AUTO_MARGINS ?
-		    "yes" : "no");
-		return (0);
-	} else if (strcmp(*argv, "baud") == 0) {
-#ifdef notdef
-		int i;
-
-		for (i = 0; baud_rate[i].b_name != NULL; i++)
-			if (el->el_tty.t_speed == baud_rate[i].b_rate) {
-				(void) fprintf(el->el_outfile, fmts,
-				    baud_rate[i].b_name);
-				return (0);
-			}
-		(void) fprintf(el->el_outfile, fmtd, 0);
-#else
-		(void) fprintf(el->el_outfile, fmtd, (int)el->el_tty.t_speed);
-#endif
-		return (0);
-	} else if (strcmp(*argv, "rows") == 0 || strcmp(*argv, "lines") == 0) {
-		(void) fprintf(el->el_outfile, fmtd, Val(T_li));
-		return (0);
-	} else if (strcmp(*argv, "cols") == 0) {
-		(void) fprintf(el->el_outfile, fmtd, Val(T_co));
-		return (0);
-	}
-	/*
-         * Try to use our local definition first
-         */
-	scap = NULL;
-	for (t = tstr; t->name != NULL; t++)
-		if (strcmp(t->name, *argv) == 0) {
-			scap = el->el_term.t_str[t - tstr];
-			break;
-		}
-	if (t->name == NULL) {
-		/* XXX: some systems' tgetstr needs non const */
-		scap = tgetstr(strchr(*argv, **argv), &area);
-	}
-	if (!scap || scap[0] == '\0') {
-		if (!silent)
-			(void) fprintf(el->el_errfile,
-			    "echotc: Termcap parameter `%s' not found.\n",
-			    *argv);
-		return (-1);
-	}
-	/*
-         * Count home many values we need for this capability.
-         */
-	for (cap = scap, arg_need = 0; *cap; cap++)
-		if (*cap == '%')
-			switch (*++cap) {
-			case 'd':
-			case '2':
-			case '3':
-			case '.':
-			case '+':
-				arg_need++;
-				break;
-			case '%':
-			case '>':
-			case 'i':
-			case 'r':
-			case 'n':
-			case 'B':
-			case 'D':
-				break;
-			default:
-				/*
-				 * hpux has lot's of them...
-				 */
-				if (verbose)
-					(void) fprintf(el->el_errfile,
-				"echotc: Warning: unknown termcap %% `%c'.\n",
-					    *cap);
-				/* This is bad, but I won't complain */
-				break;
-			}
-
-	switch (arg_need) {
-	case 0:
-		argv++;
-		if (*argv && *argv[0]) {
-			if (!silent)
-				(void) fprintf(el->el_errfile,
-				    "echotc: Warning: Extra argument `%s'.\n",
-				    *argv);
-			return (-1);
-		}
-		term_tputs(el, scap, 1);
-		break;
-	case 1:
-		argv++;
-		if (!*argv || *argv[0] == '\0') {
-			if (!silent)
-				(void) fprintf(el->el_errfile,
-				    "echotc: Warning: Missing argument.\n");
-			return (-1);
-		}
-		arg_cols = 0;
-		i = strtol(*argv, &ep, 10);
-		if (*ep != '\0' || i < 0) {
-			if (!silent)
-				(void) fprintf(el->el_errfile,
-				    "echotc: Bad value `%s' for rows.\n",
-				    *argv);
-			return (-1);
-		}
-		arg_rows = (int) i;
-		argv++;
-		if (*argv && *argv[0]) {
-			if (!silent)
-				(void) fprintf(el->el_errfile,
-				    "echotc: Warning: Extra argument `%s'.\n",
-				    *argv);
-			return (-1);
-		}
-		term_tputs(el, tgoto(scap, arg_cols, arg_rows), 1);
-		break;
-	default:
-		/* This is wrong, but I will ignore it... */
-		if (verbose)
-			(void) fprintf(el->el_errfile,
-			 "echotc: Warning: Too many required arguments (%d).\n",
-			    arg_need);
-		/* FALLTHROUGH */
-	case 2:
-		argv++;
-		if (!*argv || *argv[0] == '\0') {
-			if (!silent)
-				(void) fprintf(el->el_errfile,
-				    "echotc: Warning: Missing argument.\n");
-			return (-1);
-		}
-		i = strtol(*argv, &ep, 10);
-		if (*ep != '\0' || i < 0) {
-			if (!silent)
-				(void) fprintf(el->el_errfile,
-				    "echotc: Bad value `%s' for cols.\n",
-				    *argv);
-			return (-1);
-		}
-		arg_cols = (int) i;
-		argv++;
-		if (!*argv || *argv[0] == '\0') {
-			if (!silent)
-				(void) fprintf(el->el_errfile,
-				    "echotc: Warning: Missing argument.\n");
-			return (-1);
-		}
-		i = strtol(*argv, &ep, 10);
-		if (*ep != '\0' || i < 0) {
-			if (!silent)
-				(void) fprintf(el->el_errfile,
-				    "echotc: Bad value `%s' for rows.\n",
-				    *argv);
-			return (-1);
-		}
-		arg_rows = (int) i;
-		if (*ep != '\0') {
-			if (!silent)
-				(void) fprintf(el->el_errfile,
-				    "echotc: Bad value `%s'.\n", *argv);
-			return (-1);
-		}
-		argv++;
-		if (*argv && *argv[0]) {
-			if (!silent)
-				(void) fprintf(el->el_errfile,
-				    "echotc: Warning: Extra argument `%s'.\n",
-				    *argv);
-			return (-1);
-		}
-		term_tputs(el, tgoto(scap, arg_cols, arg_rows), arg_rows);
-		break;
-	}
-	return (0);
-}
diff -pruN 5.1.58-1/cmd-line-utils/libedit/terminal.c 5.1.61-2/cmd-line-utils/libedit/terminal.c
--- 5.1.58-1/cmd-line-utils/libedit/terminal.c	1970-01-01 00:00:00.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/terminal.c	2011-12-16 19:06:04.000000000 +0000
@@ -0,0 +1,1677 @@
+/*	$NetBSD: terminal.c,v 1.10 2011/10/04 15:27:04 christos Exp $	*/
+
+/*-
+ * Copyright (c) 1992, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Christos Zoulas of Cornell University.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "config.h"
+#if !defined(lint) && !defined(SCCSID)
+#if 0
+static char sccsid[] = "@(#)term.c	8.2 (Berkeley) 4/30/95";
+#else
+#endif
+#endif /* not lint && not SCCSID */
+
+/*
+ * terminal.c: Editor/termcap-curses interface
+ *	       We have to declare a static variable here, since the
+ *	       termcap putchar routine does not take an argument!
+ */
+#include <stdio.h>
+#include <signal.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <limits.h>
+#if 0 /* TODO: do we need this */
+#ifdef HAVE_TERMCAP_H
+#include <termcap.h>
+#endif
+#endif
+#ifdef HAVE_CURSES_H
+#include <curses.h>
+#elif HAVE_NCURSES_H
+#include <ncurses.h>
+#endif
+
+/* Solaris's term.h does horrid things. */
+#if defined(HAVE_TERM_H) && !defined(__sun)
+#include <term.h>
+#endif
+ 
+#include <sys/types.h>
+#include <sys/ioctl.h>
+
+#ifdef _REENTRANT
+#include <pthread.h>
+#endif
+
+#include "el.h"
+
+/*
+ * IMPORTANT NOTE: these routines are allowed to look at the current screen
+ * and the current position assuming that it is correct.  If this is not
+ * true, then the update will be WRONG!  This is (should be) a valid
+ * assumption...
+ */
+
+#define	TC_BUFSIZE	((size_t)2048)
+
+#define	GoodStr(a)	(el->el_terminal.t_str[a] != NULL && \
+			    el->el_terminal.t_str[a][0] != '\0')
+#define	Str(a)		el->el_terminal.t_str[a]
+#define	Val(a)		el->el_terminal.t_val[a]
+
+private const struct termcapstr {
+	const char *name;
+	const char *long_name;
+} tstr[] = {
+#define	T_al	0
+	{ "al", "add new blank line" },
+#define	T_bl	1
+	{ "bl", "audible bell" },
+#define	T_cd	2
+	{ "cd", "clear to bottom" },
+#define	T_ce	3
+	{ "ce", "clear to end of line" },
+#define	T_ch	4
+	{ "ch", "cursor to horiz pos" },
+#define	T_cl	5
+	{ "cl", "clear screen" },
+#define	T_dc	6
+	{ "dc", "delete a character" },
+#define	T_dl	7
+	{ "dl", "delete a line" },
+#define	T_dm	8
+	{ "dm", "start delete mode" },
+#define	T_ed	9
+	{ "ed", "end delete mode" },
+#define	T_ei	10
+	{ "ei", "end insert mode" },
+#define	T_fs	11
+	{ "fs", "cursor from status line" },
+#define	T_ho	12
+	{ "ho", "home cursor" },
+#define	T_ic	13
+	{ "ic", "insert character" },
+#define	T_im	14
+	{ "im", "start insert mode" },
+#define	T_ip	15
+	{ "ip", "insert padding" },
+#define	T_kd	16
+	{ "kd", "sends cursor down" },
+#define	T_kl	17
+	{ "kl", "sends cursor left" },
+#define	T_kr	18
+	{ "kr", "sends cursor right" },
+#define	T_ku	19
+	{ "ku", "sends cursor up" },
+#define	T_md	20
+	{ "md", "begin bold" },
+#define	T_me	21
+	{ "me", "end attributes" },
+#define	T_nd	22
+	{ "nd", "non destructive space" },
+#define	T_se	23
+	{ "se", "end standout" },
+#define	T_so	24
+	{ "so", "begin standout" },
+#define	T_ts	25
+	{ "ts", "cursor to status line" },
+#define	T_up	26
+	{ "up", "cursor up one" },
+#define	T_us	27
+	{ "us", "begin underline" },
+#define	T_ue	28
+	{ "ue", "end underline" },
+#define	T_vb	29
+	{ "vb", "visible bell" },
+#define	T_DC	30
+	{ "DC", "delete multiple chars" },
+#define	T_DO	31
+	{ "DO", "cursor down multiple" },
+#define	T_IC	32
+	{ "IC", "insert multiple chars" },
+#define	T_LE	33
+	{ "LE", "cursor left multiple" },
+#define	T_RI	34
+	{ "RI", "cursor right multiple" },
+#define	T_UP	35
+	{ "UP", "cursor up multiple" },
+#define	T_kh	36
+	{ "kh", "send cursor home" },
+#define	T_at7	37
+	{ "@7", "send cursor end" },
+#define	T_str	38
+	{ NULL, NULL }
+};
+
+private const struct termcapval {
+	const char *name;
+	const char *long_name;
+} tval[] = {
+#define	T_am	0
+	{ "am", "has automatic margins" },
+#define	T_pt	1
+	{ "pt", "has physical tabs" },
+#define	T_li	2
+	{ "li", "Number of lines" },
+#define	T_co	3
+	{ "co", "Number of columns" },
+#define	T_km	4
+	{ "km", "Has meta key" },
+#define	T_xt	5
+	{ "xt", "Tab chars destructive" },
+#define	T_xn	6
+	{ "xn", "newline ignored at right margin" },
+#define	T_MT	7
+	{ "MT", "Has meta key" },			/* XXX? */
+#define	T_val	8
+	{ NULL, NULL, }
+};
+/* do two or more of the attributes use me */
+
+private void	terminal_setflags(EditLine *);
+private int	terminal_rebuffer_display(EditLine *);
+private void	terminal_free_display(EditLine *);
+private int	terminal_alloc_display(EditLine *);
+private void	terminal_alloc(EditLine *, const struct termcapstr *,
+    const char *);
+private void	terminal_init_arrow(EditLine *);
+private void	terminal_reset_arrow(EditLine *);
+private int	terminal_putc(int);
+private void	terminal_tputs(EditLine *, const char *, int);
+
+#ifdef _REENTRANT
+private pthread_mutex_t terminal_mutex = PTHREAD_MUTEX_INITIALIZER;
+#endif
+private FILE *terminal_outfile = NULL;
+
+
+/* terminal_setflags():
+ *	Set the terminal capability flags
+ */
+private void
+terminal_setflags(EditLine *el)
+{
+	EL_FLAGS = 0;
+	if (el->el_tty.t_tabs)
+		EL_FLAGS |= (Val(T_pt) && !Val(T_xt)) ? TERM_CAN_TAB : 0;
+
+	EL_FLAGS |= (Val(T_km) || Val(T_MT)) ? TERM_HAS_META : 0;
+	EL_FLAGS |= GoodStr(T_ce) ? TERM_CAN_CEOL : 0;
+	EL_FLAGS |= (GoodStr(T_dc) || GoodStr(T_DC)) ? TERM_CAN_DELETE : 0;
+	EL_FLAGS |= (GoodStr(T_im) || GoodStr(T_ic) || GoodStr(T_IC)) ?
+	    TERM_CAN_INSERT : 0;
+	EL_FLAGS |= (GoodStr(T_up) || GoodStr(T_UP)) ? TERM_CAN_UP : 0;
+	EL_FLAGS |= Val(T_am) ? TERM_HAS_AUTO_MARGINS : 0;
+	EL_FLAGS |= Val(T_xn) ? TERM_HAS_MAGIC_MARGINS : 0;
+
+	if (GoodStr(T_me) && GoodStr(T_ue))
+		EL_FLAGS |= (strcmp(Str(T_me), Str(T_ue)) == 0) ?
+		    TERM_CAN_ME : 0;
+	else
+		EL_FLAGS &= ~TERM_CAN_ME;
+	if (GoodStr(T_me) && GoodStr(T_se))
+		EL_FLAGS |= (strcmp(Str(T_me), Str(T_se)) == 0) ?
+		    TERM_CAN_ME : 0;
+
+
+#ifdef DEBUG_SCREEN
+	if (!EL_CAN_UP) {
+		(void) fprintf(el->el_errfile,
+		    "WARNING: Your terminal cannot move up.\n");
+		(void) fprintf(el->el_errfile,
+		    "Editing may be odd for long lines.\n");
+	}
+	if (!EL_CAN_CEOL)
+		(void) fprintf(el->el_errfile, "no clear EOL capability.\n");
+	if (!EL_CAN_DELETE)
+		(void) fprintf(el->el_errfile, "no delete char capability.\n");
+	if (!EL_CAN_INSERT)
+		(void) fprintf(el->el_errfile, "no insert char capability.\n");
+#endif /* DEBUG_SCREEN */
+}
+
+/* terminal_init():
+ *	Initialize the terminal stuff
+ */
+protected int
+terminal_init(EditLine *el)
+{
+
+	el->el_terminal.t_buf = el_malloc(TC_BUFSIZE *
+	    sizeof(*el->el_terminal.t_buf));
+	if (el->el_terminal.t_buf == NULL)
+		return -1;
+	el->el_terminal.t_cap = el_malloc(TC_BUFSIZE *
+	    sizeof(*el->el_terminal.t_cap));
+	if (el->el_terminal.t_cap == NULL)
+		return -1;
+	el->el_terminal.t_fkey = el_malloc(A_K_NKEYS *
+	    sizeof(*el->el_terminal.t_fkey));
+	if (el->el_terminal.t_fkey == NULL)
+		return -1;
+	el->el_terminal.t_loc = 0;
+	el->el_terminal.t_str = el_malloc(T_str *
+	    sizeof(*el->el_terminal.t_str));
+	if (el->el_terminal.t_str == NULL)
+		return -1;
+	(void) memset(el->el_terminal.t_str, 0, T_str *
+	    sizeof(*el->el_terminal.t_str));
+	el->el_terminal.t_val = el_malloc(T_val *
+	    sizeof(*el->el_terminal.t_val));
+	if (el->el_terminal.t_val == NULL)
+		return -1;
+	(void) memset(el->el_terminal.t_val, 0, T_val *
+	    sizeof(*el->el_terminal.t_val));
+	(void) terminal_set(el, NULL);
+	terminal_init_arrow(el);
+	return 0;
+}
+
+/* terminal_end():
+ *	Clean up the terminal stuff
+ */
+protected void
+terminal_end(EditLine *el)
+{
+
+	el_free(el->el_terminal.t_buf);
+	el->el_terminal.t_buf = NULL;
+	el_free(el->el_terminal.t_cap);
+	el->el_terminal.t_cap = NULL;
+	el->el_terminal.t_loc = 0;
+	el_free(el->el_terminal.t_str);
+	el->el_terminal.t_str = NULL;
+	el_free(el->el_terminal.t_val);
+	el->el_terminal.t_val = NULL;
+	el_free(el->el_terminal.t_fkey);
+	el->el_terminal.t_fkey = NULL;
+	terminal_free_display(el);
+}
+
+
+/* terminal_alloc():
+ *	Maintain a string pool for termcap strings
+ */
+private void
+terminal_alloc(EditLine *el, const struct termcapstr *t, const char *cap)
+{
+	char termbuf[TC_BUFSIZE];
+	size_t tlen, clen;
+	char **tlist = el->el_terminal.t_str;
+	char **tmp, **str = &tlist[t - tstr];
+
+	if (cap == NULL || *cap == '\0') {
+		*str = NULL;
+		return;
+	} else
+		clen = strlen(cap);
+
+	tlen = *str == NULL ? 0 : strlen(*str);
+
+	/*
+         * New string is shorter; no need to allocate space
+         */
+	if (clen <= tlen) {
+		if (*str)
+			(void) strcpy(*str, cap);	/* XXX strcpy is safe */
+		return;
+	}
+	/*
+         * New string is longer; see if we have enough space to append
+         */
+	if (el->el_terminal.t_loc + 3 < TC_BUFSIZE) {
+						/* XXX strcpy is safe */
+		(void) strcpy(*str = &el->el_terminal.t_buf[
+		    el->el_terminal.t_loc], cap);
+		el->el_terminal.t_loc += clen + 1;	/* one for \0 */
+		return;
+	}
+	/*
+         * Compact our buffer; no need to check compaction, cause we know it
+         * fits...
+         */
+	tlen = 0;
+	for (tmp = tlist; tmp < &tlist[T_str]; tmp++)
+		if (*tmp != NULL && *tmp != '\0' && *tmp != *str) {
+			char *ptr;
+
+			for (ptr = *tmp; *ptr != '\0'; termbuf[tlen++] = *ptr++)
+				continue;
+			termbuf[tlen++] = '\0';
+		}
+	memcpy(el->el_terminal.t_buf, termbuf, TC_BUFSIZE);
+	el->el_terminal.t_loc = tlen;
+	if (el->el_terminal.t_loc + 3 >= TC_BUFSIZE) {
+		(void) fprintf(el->el_errfile,
+		    "Out of termcap string space.\n");
+		return;
+	}
+					/* XXX strcpy is safe */
+	(void) strcpy(*str = &el->el_terminal.t_buf[el->el_terminal.t_loc],
+	    cap);
+	el->el_terminal.t_loc += (size_t)clen + 1;	/* one for \0 */
+	return;
+}
+
+
+/* terminal_rebuffer_display():
+ *	Rebuffer the display after the screen changed size
+ */
+private int
+terminal_rebuffer_display(EditLine *el)
+{
+	coord_t *c = &el->el_terminal.t_size;
+
+	terminal_free_display(el);
+
+	c->h = Val(T_co);
+	c->v = Val(T_li);
+
+	if (terminal_alloc_display(el) == -1)
+		return -1;
+	return 0;
+}
+
+
+/* terminal_alloc_display():
+ *	Allocate a new display.
+ */
+private int
+terminal_alloc_display(EditLine *el)
+{
+	int i;
+	Char **b;
+	coord_t *c = &el->el_terminal.t_size;
+
+	b =  el_malloc(sizeof(*b) * (size_t)(c->v + 1));
+	if (b == NULL)
+		return -1;
+	for (i = 0; i < c->v; i++) {
+		b[i] = el_malloc(sizeof(**b) * (size_t)(c->h + 1));
+		if (b[i] == NULL) {
+			while (--i >= 0)
+				el_free(b[i]);
+			el_free(b);
+			return -1;
+		}
+	}
+	b[c->v] = NULL;
+	el->el_display = b;
+
+	b = el_malloc(sizeof(*b) * (size_t)(c->v + 1));
+	if (b == NULL)
+		return -1;
+	for (i = 0; i < c->v; i++) {
+		b[i] = el_malloc(sizeof(**b) * (size_t)(c->h + 1));
+		if (b[i] == NULL) {
+			while (--i >= 0)
+				el_free(b[i]);
+			el_free(b);
+			return -1;
+		}
+	}
+	b[c->v] = NULL;
+	el->el_vdisplay = b;
+	return 0;
+}
+
+
+/* terminal_free_display():
+ *	Free the display buffers
+ */
+private void
+terminal_free_display(EditLine *el)
+{
+	Char **b;
+	Char **bufp;
+
+	b = el->el_display;
+	el->el_display = NULL;
+	if (b != NULL) {
+		for (bufp = b; *bufp != NULL; bufp++)
+			el_free(*bufp);
+		el_free(b);
+	}
+	b = el->el_vdisplay;
+	el->el_vdisplay = NULL;
+	if (b != NULL) {
+		for (bufp = b; *bufp != NULL; bufp++)
+			el_free(*bufp);
+		el_free(b);
+	}
+}
+
+
+/* terminal_move_to_line():
+ *	move to line <where> (first line == 0)
+ * 	as efficiently as possible
+ */
+protected void
+terminal_move_to_line(EditLine *el, int where)
+{
+	int del;
+
+	if (where == el->el_cursor.v)
+		return;
+
+	if (where > el->el_terminal.t_size.v) {
+#ifdef DEBUG_SCREEN
+		(void) fprintf(el->el_errfile,
+		    "terminal_move_to_line: where is ridiculous: %d\r\n",
+		    where);
+#endif /* DEBUG_SCREEN */
+		return;
+	}
+	if ((del = where - el->el_cursor.v) > 0) {
+		while (del > 0) {
+			if (EL_HAS_AUTO_MARGINS &&
+			    el->el_display[el->el_cursor.v][0] != '\0') {
+                                size_t h = (size_t)
+				    (el->el_terminal.t_size.h - 1);
+#ifdef WIDECHAR
+                                for (; h > 0 &&
+                                         el->el_display[el->el_cursor.v][h] ==
+                                                 MB_FILL_CHAR;
+                                         h--)
+                                                continue;
+#endif
+				/* move without newline */
+				terminal_move_to_char(el, (int)h);
+				terminal_overwrite(el, &el->el_display
+				    [el->el_cursor.v][el->el_cursor.h],
+				    (size_t)(el->el_terminal.t_size.h -
+				    el->el_cursor.h));
+				/* updates Cursor */
+				del--;
+			} else {
+				if ((del > 1) && GoodStr(T_DO)) {
+					terminal_tputs(el, tgoto(Str(T_DO), del,
+					    del), del);
+					del = 0;
+				} else {
+					for (; del > 0; del--)
+						terminal__putc(el, '\n');
+					/* because the \n will become \r\n */
+					el->el_cursor.h = 0;
+				}
+			}
+		}
+	} else {		/* del < 0 */
+		if (GoodStr(T_UP) && (-del > 1 || !GoodStr(T_up)))
+			terminal_tputs(el, tgoto(Str(T_UP), -del, -del), -del);
+		else {
+			if (GoodStr(T_up))
+				for (; del < 0; del++)
+					terminal_tputs(el, Str(T_up), 1);
+		}
+	}
+	el->el_cursor.v = where;/* now where is here */
+}
+
+
+/* terminal_move_to_char():
+ *	Move to the character position specified
+ */
+protected void
+terminal_move_to_char(EditLine *el, int where)
+{
+	int del, i;
+
+mc_again:
+	if (where == el->el_cursor.h)
+		return;
+
+	if (where > el->el_terminal.t_size.h) {
+#ifdef DEBUG_SCREEN
+		(void) fprintf(el->el_errfile,
+		    "terminal_move_to_char: where is riduculous: %d\r\n",
+		    where);
+#endif /* DEBUG_SCREEN */
+		return;
+	}
+	if (!where) {		/* if where is first column */
+		terminal__putc(el, '\r');	/* do a CR */
+		el->el_cursor.h = 0;
+		return;
+	}
+	del = where - el->el_cursor.h;
+
+	if ((del < -4 || del > 4) && GoodStr(T_ch))
+		/* go there directly */
+		terminal_tputs(el, tgoto(Str(T_ch), where, where), where);
+	else {
+		if (del > 0) {	/* moving forward */
+			if ((del > 4) && GoodStr(T_RI))
+				terminal_tputs(el, tgoto(Str(T_RI), del, del),
+				    del);
+			else {
+					/* if I can do tabs, use them */
+				if (EL_CAN_TAB) {
+					if ((el->el_cursor.h & 0370) !=
+					    (where & ~0x7)
+#ifdef WIDECHAR
+					    && (el->el_display[
+					    el->el_cursor.v][where & 0370] !=
+					    MB_FILL_CHAR)
+#endif
+					    ) {
+						/* if not within tab stop */
+						for (i =
+						    (el->el_cursor.h & 0370);
+						    i < (where & ~0x7);
+						    i += 8)
+							terminal__putc(el,
+							    '\t');	
+							/* then tab over */
+						el->el_cursor.h = where & ~0x7;
+					}
+				}
+				/*
+				 * it's usually cheaper to just write the
+				 * chars, so we do.
+				 */
+				/*
+				 * NOTE THAT terminal_overwrite() WILL CHANGE
+				 * el->el_cursor.h!!!
+				 */
+				terminal_overwrite(el, &el->el_display[
+				    el->el_cursor.v][el->el_cursor.h],
+				    (size_t)(where - el->el_cursor.h));
+
+			}
+		} else {	/* del < 0 := moving backward */
+			if ((-del > 4) && GoodStr(T_LE))
+				terminal_tputs(el, tgoto(Str(T_LE), -del, -del),
+				    -del);
+			else {	/* can't go directly there */
+				/*
+				 * if the "cost" is greater than the "cost"
+				 * from col 0
+				 */
+				if (EL_CAN_TAB ?
+				    ((unsigned int)-del >
+				    (((unsigned int) where >> 3) +
+				     (where & 07)))
+				    : (-del > where)) {
+					terminal__putc(el, '\r');/* do a CR */
+					el->el_cursor.h = 0;
+					goto mc_again;	/* and try again */
+				}
+				for (i = 0; i < -del; i++)
+					terminal__putc(el, '\b');
+			}
+		}
+	}
+	el->el_cursor.h = where;		/* now where is here */
+}
+
+
+/* terminal_overwrite():
+ *	Overstrike num characters
+ *	Assumes MB_FILL_CHARs are present to keep the column count correct
+ */
+protected void
+terminal_overwrite(EditLine *el, const Char *cp, size_t n)
+{
+#ifdef WIDECHAR
+	int width;
+#endif
+
+	if (n == 0)
+		return;
+
+	if (n > (size_t)el->el_terminal.t_size.h) {
+#ifdef DEBUG_SCREEN
+		(void) fprintf(el->el_errfile,
+		    "terminal_overwrite: n is riduculous: %d\r\n", n);
+#endif /* DEBUG_SCREEN */
+		return;
+	}
+
+        do {
+#ifdef WIDECHAR
+                width = wcwidth(*cp);    /* Returns -1 for faux character. */
+                if (width != -1)
+                  el->el_cursor.h += width;
+#else
+                el->el_cursor.h++;
+#endif
+                /* terminal__putc() ignores any MB_FILL_CHARs */
+                terminal__putc(el, *cp++);
+        } while (--n);
+
+	if (el->el_cursor.h >= el->el_terminal.t_size.h) {	/* wrap? */
+		if (EL_HAS_AUTO_MARGINS) {	/* yes */
+			el->el_cursor.h = 0;
+			el->el_cursor.v++;
+			if (EL_HAS_MAGIC_MARGINS) {
+				/* force the wrap to avoid the "magic"
+				 * situation */
+				Char c;
+				if ((c = el->el_display[el->el_cursor.v]
+				    [el->el_cursor.h]) != '\0') {
+					terminal_overwrite(el, &c, (size_t)1);
+#ifdef WIDECHAR
+					while (el->el_display[el->el_cursor.v]
+					    [el->el_cursor.h] == MB_FILL_CHAR)
+						el->el_cursor.h++;
+#endif
+				} else {
+					terminal__putc(el, ' ');
+					el->el_cursor.h = 1;
+				}
+			}
+		} else		/* no wrap, but cursor stays on screen */
+			el->el_cursor.h = el->el_terminal.t_size.h - 1;
+	}
+}
+
+
+/* terminal_deletechars():
+ *	Delete num characters
+ */
+protected void
+terminal_deletechars(EditLine *el, int num)
+{
+	if (num <= 0)
+		return;
+
+	if (!EL_CAN_DELETE) {
+#ifdef DEBUG_EDIT
+		(void) fprintf(el->el_errfile, "   ERROR: cannot delete   \n");
+#endif /* DEBUG_EDIT */
+		return;
+	}
+	if (num > el->el_terminal.t_size.h) {
+#ifdef DEBUG_SCREEN
+		(void) fprintf(el->el_errfile,
+		    "terminal_deletechars: num is riduculous: %d\r\n", num);
+#endif /* DEBUG_SCREEN */
+		return;
+	}
+	if (GoodStr(T_DC))	/* if I have multiple delete */
+		if ((num > 1) || !GoodStr(T_dc)) {	/* if dc would be more
+							 * expen. */
+			terminal_tputs(el, tgoto(Str(T_DC), num, num), num);
+			return;
+		}
+	if (GoodStr(T_dm))	/* if I have delete mode */
+		terminal_tputs(el, Str(T_dm), 1);
+
+	if (GoodStr(T_dc))	/* else do one at a time */
+		while (num--)
+			terminal_tputs(el, Str(T_dc), 1);
+
+	if (GoodStr(T_ed))	/* if I have delete mode */
+		terminal_tputs(el, Str(T_ed), 1);
+}
+
+
+/* terminal_insertwrite():
+ *	Puts terminal in insert character mode or inserts num
+ *	characters in the line
+ *      Assumes MB_FILL_CHARs are present to keep column count correct
+ */
+protected void
+terminal_insertwrite(EditLine *el, Char *cp, int num)
+{
+	if (num <= 0)
+		return;
+	if (!EL_CAN_INSERT) {
+#ifdef DEBUG_EDIT
+		(void) fprintf(el->el_errfile, "   ERROR: cannot insert   \n");
+#endif /* DEBUG_EDIT */
+		return;
+	}
+	if (num > el->el_terminal.t_size.h) {
+#ifdef DEBUG_SCREEN
+		(void) fprintf(el->el_errfile,
+		    "StartInsert: num is riduculous: %d\r\n", num);
+#endif /* DEBUG_SCREEN */
+		return;
+	}
+	if (GoodStr(T_IC))	/* if I have multiple insert */
+		if ((num > 1) || !GoodStr(T_ic)) {
+				/* if ic would be more expensive */
+			terminal_tputs(el, tgoto(Str(T_IC), num, num), num);
+			terminal_overwrite(el, cp, (size_t)num);
+				/* this updates el_cursor.h */
+			return;
+		}
+	if (GoodStr(T_im) && GoodStr(T_ei)) {	/* if I have insert mode */
+		terminal_tputs(el, Str(T_im), 1);
+
+		el->el_cursor.h += num;
+		do
+			terminal__putc(el, *cp++);
+		while (--num);
+
+		if (GoodStr(T_ip))	/* have to make num chars insert */
+			terminal_tputs(el, Str(T_ip), 1);
+
+		terminal_tputs(el, Str(T_ei), 1);
+		return;
+	}
+	do {
+		if (GoodStr(T_ic))	/* have to make num chars insert */
+			terminal_tputs(el, Str(T_ic), 1);
+
+		terminal__putc(el, *cp++);
+
+		el->el_cursor.h++;
+
+		if (GoodStr(T_ip))	/* have to make num chars insert */
+			terminal_tputs(el, Str(T_ip), 1);
+					/* pad the inserted char */
+
+	} while (--num);
+}
+
+
+/* terminal_clear_EOL():
+ *	clear to end of line.  There are num characters to clear
+ */
+protected void
+terminal_clear_EOL(EditLine *el, int num)
+{
+	int i;
+
+	if (EL_CAN_CEOL && GoodStr(T_ce))
+		terminal_tputs(el, Str(T_ce), 1);
+	else {
+		for (i = 0; i < num; i++)
+			terminal__putc(el, ' ');
+		el->el_cursor.h += num;	/* have written num spaces */
+	}
+}
+
+
+/* terminal_clear_screen():
+ *	Clear the screen
+ */
+protected void
+terminal_clear_screen(EditLine *el)
+{				/* clear the whole screen and home */
+
+	if (GoodStr(T_cl))
+		/* send the clear screen code */
+		terminal_tputs(el, Str(T_cl), Val(T_li));
+	else if (GoodStr(T_ho) && GoodStr(T_cd)) {
+		terminal_tputs(el, Str(T_ho), Val(T_li));	/* home */
+		/* clear to bottom of screen */
+		terminal_tputs(el, Str(T_cd), Val(T_li));
+	} else {
+		terminal__putc(el, '\r');
+		terminal__putc(el, '\n');
+	}
+}
+
+
+/* terminal_beep():
+ *	Beep the way the terminal wants us
+ */
+protected void
+terminal_beep(EditLine *el)
+{
+	if (GoodStr(T_bl))
+		/* what termcap says we should use */
+		terminal_tputs(el, Str(T_bl), 1);
+	else
+		terminal__putc(el, '\007');	/* an ASCII bell; ^G */
+}
+
+
+protected void
+terminal_get(EditLine *el, const char **term)
+{
+	*term = el->el_terminal.t_name;
+}
+
+
+/* terminal_set():
+ *	Read in the terminal capabilities from the requested terminal
+ */
+protected int
+terminal_set(EditLine *el, const char *term)
+{
+	int i;
+	char buf[TC_BUFSIZE];
+	char *area;
+	const struct termcapstr *t;
+	sigset_t oset, nset;
+	int lins, cols;
+
+	(void) sigemptyset(&nset);
+	(void) sigaddset(&nset, SIGWINCH);
+	(void) sigprocmask(SIG_BLOCK, &nset, &oset);
+
+	area = buf;
+
+
+	if (term == NULL)
+		term = getenv("TERM");
+
+	if (!term || !term[0])
+		term = "dumb";
+
+	if (strcmp(term, "emacs") == 0)
+		el->el_flags |= EDIT_DISABLED;
+
+	memset(el->el_terminal.t_cap, 0, TC_BUFSIZE);
+
+	i = tgetent(el->el_terminal.t_cap, term);
+
+	if (i <= 0) {
+		if (i == -1)
+			(void) fprintf(el->el_errfile,
+			    "Cannot read termcap database;\n");
+		else if (i == 0)
+			(void) fprintf(el->el_errfile,
+			    "No entry for terminal type \"%s\";\n", term);
+		(void) fprintf(el->el_errfile,
+		    "using dumb terminal settings.\n");
+		Val(T_co) = 80;	/* do a dumb terminal */
+		Val(T_pt) = Val(T_km) = Val(T_li) = 0;
+		Val(T_xt) = Val(T_MT);
+		for (t = tstr; t->name != NULL; t++)
+			terminal_alloc(el, t, NULL);
+	} else {
+		/* auto/magic margins */
+		Val(T_am) = tgetflag("am");
+		Val(T_xn) = tgetflag("xn");
+		/* Can we tab */
+		Val(T_pt) = tgetflag("pt");
+		Val(T_xt) = tgetflag("xt");
+		/* do we have a meta? */
+		Val(T_km) = tgetflag("km");
+		Val(T_MT) = tgetflag("MT");
+		/* Get the size */
+		Val(T_co) = tgetnum("co");
+		Val(T_li) = tgetnum("li");
+		for (t = tstr; t->name != NULL; t++) {
+			/* XXX: some systems' tgetstr needs non const */
+			terminal_alloc(el, t, tgetstr(strchr(t->name, *t->name),
+			    &area));
+		}
+	}
+
+	if (Val(T_co) < 2)
+		Val(T_co) = 80;	/* just in case */
+	if (Val(T_li) < 1)
+		Val(T_li) = 24;
+
+	el->el_terminal.t_size.v = Val(T_co);
+	el->el_terminal.t_size.h = Val(T_li);
+
+	terminal_setflags(el);
+
+				/* get the correct window size */
+	(void) terminal_get_size(el, &lins, &cols);
+	if (terminal_change_size(el, lins, cols) == -1)
+		return -1;
+	(void) sigprocmask(SIG_SETMASK, &oset, NULL);
+	terminal_bind_arrow(el);
+	el->el_terminal.t_name = term;
+	return i <= 0 ? -1 : 0;
+}
+
+
+/* terminal_get_size():
+ *	Return the new window size in lines and cols, and
+ *	true if the size was changed.
+ */
+protected int
+terminal_get_size(EditLine *el, int *lins, int *cols)
+{
+
+	*cols = Val(T_co);
+	*lins = Val(T_li);
+
+#ifdef TIOCGWINSZ
+	{
+		struct winsize ws;
+		if (ioctl(el->el_infd, TIOCGWINSZ, &ws) != -1) {
+			if (ws.ws_col)
+				*cols = ws.ws_col;
+			if (ws.ws_row)
+				*lins = ws.ws_row;
+		}
+	}
+#endif
+#ifdef TIOCGSIZE
+	{
+		struct ttysize ts;
+		if (ioctl(el->el_infd, TIOCGSIZE, &ts) != -1) {
+			if (ts.ts_cols)
+				*cols = ts.ts_cols;
+			if (ts.ts_lines)
+				*lins = ts.ts_lines;
+		}
+	}
+#endif
+	return Val(T_co) != *cols || Val(T_li) != *lins;
+}
+
+
+/* terminal_change_size():
+ *	Change the size of the terminal
+ */
+protected int
+terminal_change_size(EditLine *el, int lins, int cols)
+{
+	/*
+         * Just in case
+         */
+	Val(T_co) = (cols < 2) ? 80 : cols;
+	Val(T_li) = (lins < 1) ? 24 : lins;
+
+	/* re-make display buffers */
+	if (terminal_rebuffer_display(el) == -1)
+		return -1;
+	re_clear_display(el);
+	return 0;
+}
+
+
+/* terminal_init_arrow():
+ *	Initialize the arrow key bindings from termcap
+ */
+private void
+terminal_init_arrow(EditLine *el)
+{
+	funckey_t *arrow = el->el_terminal.t_fkey;
+
+	arrow[A_K_DN].name = STR("down");
+	arrow[A_K_DN].key = T_kd;
+	arrow[A_K_DN].fun.cmd = ED_NEXT_HISTORY;
+	arrow[A_K_DN].type = XK_CMD;
+
+	arrow[A_K_UP].name = STR("up");
+	arrow[A_K_UP].key = T_ku;
+	arrow[A_K_UP].fun.cmd = ED_PREV_HISTORY;
+	arrow[A_K_UP].type = XK_CMD;
+
+	arrow[A_K_LT].name = STR("left");
+	arrow[A_K_LT].key = T_kl;
+	arrow[A_K_LT].fun.cmd = ED_PREV_CHAR;
+	arrow[A_K_LT].type = XK_CMD;
+
+	arrow[A_K_RT].name = STR("right");
+	arrow[A_K_RT].key = T_kr;
+	arrow[A_K_RT].fun.cmd = ED_NEXT_CHAR;
+	arrow[A_K_RT].type = XK_CMD;
+
+	arrow[A_K_HO].name = STR("home");
+	arrow[A_K_HO].key = T_kh;
+	arrow[A_K_HO].fun.cmd = ED_MOVE_TO_BEG;
+	arrow[A_K_HO].type = XK_CMD;
+
+	arrow[A_K_EN].name = STR("end");
+	arrow[A_K_EN].key = T_at7;
+	arrow[A_K_EN].fun.cmd = ED_MOVE_TO_END;
+	arrow[A_K_EN].type = XK_CMD;
+}
+
+
+/* terminal_reset_arrow():
+ *	Reset arrow key bindings
+ */
+private void
+terminal_reset_arrow(EditLine *el)
+{
+	funckey_t *arrow = el->el_terminal.t_fkey;
+	static const Char strA[] = {033, '[', 'A', '\0'};
+	static const Char strB[] = {033, '[', 'B', '\0'};
+	static const Char strC[] = {033, '[', 'C', '\0'};
+	static const Char strD[] = {033, '[', 'D', '\0'};
+	static const Char strH[] = {033, '[', 'H', '\0'};
+	static const Char strF[] = {033, '[', 'F', '\0'};
+	static const Char stOA[] = {033, 'O', 'A', '\0'};
+	static const Char stOB[] = {033, 'O', 'B', '\0'};
+	static const Char stOC[] = {033, 'O', 'C', '\0'};
+	static const Char stOD[] = {033, 'O', 'D', '\0'};
+	static const Char stOH[] = {033, 'O', 'H', '\0'};
+	static const Char stOF[] = {033, 'O', 'F', '\0'};
+
+	keymacro_add(el, strA, &arrow[A_K_UP].fun, arrow[A_K_UP].type);
+	keymacro_add(el, strB, &arrow[A_K_DN].fun, arrow[A_K_DN].type);
+	keymacro_add(el, strC, &arrow[A_K_RT].fun, arrow[A_K_RT].type);
+	keymacro_add(el, strD, &arrow[A_K_LT].fun, arrow[A_K_LT].type);
+	keymacro_add(el, strH, &arrow[A_K_HO].fun, arrow[A_K_HO].type);
+	keymacro_add(el, strF, &arrow[A_K_EN].fun, arrow[A_K_EN].type);
+	keymacro_add(el, stOA, &arrow[A_K_UP].fun, arrow[A_K_UP].type);
+	keymacro_add(el, stOB, &arrow[A_K_DN].fun, arrow[A_K_DN].type);
+	keymacro_add(el, stOC, &arrow[A_K_RT].fun, arrow[A_K_RT].type);
+	keymacro_add(el, stOD, &arrow[A_K_LT].fun, arrow[A_K_LT].type);
+	keymacro_add(el, stOH, &arrow[A_K_HO].fun, arrow[A_K_HO].type);
+	keymacro_add(el, stOF, &arrow[A_K_EN].fun, arrow[A_K_EN].type);
+
+	if (el->el_map.type != MAP_VI)
+		return;
+	keymacro_add(el, &strA[1], &arrow[A_K_UP].fun, arrow[A_K_UP].type);
+	keymacro_add(el, &strB[1], &arrow[A_K_DN].fun, arrow[A_K_DN].type);
+	keymacro_add(el, &strC[1], &arrow[A_K_RT].fun, arrow[A_K_RT].type);
+	keymacro_add(el, &strD[1], &arrow[A_K_LT].fun, arrow[A_K_LT].type);
+	keymacro_add(el, &strH[1], &arrow[A_K_HO].fun, arrow[A_K_HO].type);
+	keymacro_add(el, &strF[1], &arrow[A_K_EN].fun, arrow[A_K_EN].type);
+	keymacro_add(el, &stOA[1], &arrow[A_K_UP].fun, arrow[A_K_UP].type);
+	keymacro_add(el, &stOB[1], &arrow[A_K_DN].fun, arrow[A_K_DN].type);
+	keymacro_add(el, &stOC[1], &arrow[A_K_RT].fun, arrow[A_K_RT].type);
+	keymacro_add(el, &stOD[1], &arrow[A_K_LT].fun, arrow[A_K_LT].type);
+	keymacro_add(el, &stOH[1], &arrow[A_K_HO].fun, arrow[A_K_HO].type);
+	keymacro_add(el, &stOF[1], &arrow[A_K_EN].fun, arrow[A_K_EN].type);
+}
+
+
+/* terminal_set_arrow():
+ *	Set an arrow key binding
+ */
+protected int
+terminal_set_arrow(EditLine *el, const Char *name, keymacro_value_t *fun,
+    int type)
+{
+	funckey_t *arrow = el->el_terminal.t_fkey;
+	int i;
+
+	for (i = 0; i < A_K_NKEYS; i++)
+		if (Strcmp(name, arrow[i].name) == 0) {
+			arrow[i].fun = *fun;
+			arrow[i].type = type;
+			return 0;
+		}
+	return -1;
+}
+
+
+/* terminal_clear_arrow():
+ *	Clear an arrow key binding
+ */
+protected int
+terminal_clear_arrow(EditLine *el, const Char *name)
+{
+	funckey_t *arrow = el->el_terminal.t_fkey;
+	int i;
+
+	for (i = 0; i < A_K_NKEYS; i++)
+		if (Strcmp(name, arrow[i].name) == 0) {
+			arrow[i].type = XK_NOD;
+			return 0;
+		}
+	return -1;
+}
+
+
+/* terminal_print_arrow():
+ *	Print the arrow key bindings
+ */
+protected void
+terminal_print_arrow(EditLine *el, const Char *name)
+{
+	int i;
+	funckey_t *arrow = el->el_terminal.t_fkey;
+
+	for (i = 0; i < A_K_NKEYS; i++)
+		if (*name == '\0' || Strcmp(name, arrow[i].name) == 0)
+			if (arrow[i].type != XK_NOD)
+				keymacro_kprint(el, arrow[i].name,
+				    &arrow[i].fun, arrow[i].type);
+}
+
+
+/* terminal_bind_arrow():
+ *	Bind the arrow keys
+ */
+protected void
+terminal_bind_arrow(EditLine *el)
+{
+	el_action_t *map;
+	const el_action_t *dmap;
+	int i, j;
+	char *p;
+	funckey_t *arrow = el->el_terminal.t_fkey;
+
+	/* Check if the components needed are initialized */
+	if (el->el_terminal.t_buf == NULL || el->el_map.key == NULL)
+		return;
+
+	map = el->el_map.type == MAP_VI ? el->el_map.alt : el->el_map.key;
+	dmap = el->el_map.type == MAP_VI ? el->el_map.vic : el->el_map.emacs;
+
+	terminal_reset_arrow(el);
+
+	for (i = 0; i < A_K_NKEYS; i++) {
+		Char wt_str[VISUAL_WIDTH_MAX];
+		Char *px;
+		size_t n;
+
+		p = el->el_terminal.t_str[arrow[i].key];
+		if (!p || !*p)
+			continue;
+		for (n = 0; n < VISUAL_WIDTH_MAX && p[n]; ++n)
+			wt_str[n] = p[n];
+		while (n < VISUAL_WIDTH_MAX)
+			wt_str[n++] = '\0';
+		px = wt_str;
+		j = (unsigned char) *p;
+		/*
+		 * Assign the arrow keys only if:
+		 *
+		 * 1. They are multi-character arrow keys and the user
+		 *    has not re-assigned the leading character, or
+		 *    has re-assigned the leading character to be
+		 *	  ED_SEQUENCE_LEAD_IN
+		 * 2. They are single arrow keys pointing to an
+		 *    unassigned key.
+		 */
+		if (arrow[i].type == XK_NOD)
+			keymacro_clear(el, map, px);
+		else {
+			if (p[1] && (dmap[j] == map[j] ||
+				map[j] == ED_SEQUENCE_LEAD_IN)) {
+				keymacro_add(el, px, &arrow[i].fun,
+				    arrow[i].type);
+				map[j] = ED_SEQUENCE_LEAD_IN;
+			} else if (map[j] == ED_UNASSIGNED) {
+				keymacro_clear(el, map, px);
+				if (arrow[i].type == XK_CMD)
+					map[j] = arrow[i].fun.cmd;
+				else
+					keymacro_add(el, px, &arrow[i].fun,
+					    arrow[i].type);
+			}
+		}
+	}
+}
+
+/* terminal_putc():
+ *	Add a character
+ */
+private int
+terminal_putc(int c)
+{
+	if (terminal_outfile == NULL)
+		return -1;
+	return fputc(c, terminal_outfile);
+}
+
+private void
+terminal_tputs(EditLine *el, const char *cap, int affcnt)
+{
+#ifdef _REENTRANT
+	pthread_mutex_lock(&terminal_mutex);
+#endif
+	terminal_outfile = el->el_outfile;
+	(void)tputs(cap, affcnt, terminal_putc);
+#ifdef _REENTRANT
+	pthread_mutex_unlock(&terminal_mutex);
+#endif
+}
+
+/* terminal__putc():
+ *	Add a character
+ */
+protected int
+terminal__putc(EditLine *el, Int c)
+{
+	char buf[MB_LEN_MAX +1];
+	ssize_t i;
+	mbstate_t state;
+
+	memset(&state, 0, sizeof(mbstate_t));
+	if (c == (Int)MB_FILL_CHAR)
+		return 0;
+	i = ct_encode_char(buf, (size_t)MB_CUR_MAX, c, &state);
+	if (i <= 0)
+		return (int)i;
+	buf[i] = '\0';
+	return fputs(buf, el->el_outfile);
+}
+
+/* terminal__flush():
+ *	Flush output
+ */
+protected void
+terminal__flush(EditLine *el)
+{
+
+	(void) fflush(el->el_outfile);
+}
+
+/* terminal_writec():
+ *	Write the given character out, in a human readable form
+ */
+protected void
+terminal_writec(EditLine *el, Int c)
+{
+	Char visbuf[VISUAL_WIDTH_MAX +1];
+	ssize_t vcnt = ct_visual_char(visbuf, VISUAL_WIDTH_MAX, c);
+	visbuf[vcnt] = '\0';
+	terminal_overwrite(el, visbuf, (size_t)vcnt);
+	terminal__flush(el);
+}
+
+
+/* terminal_telltc():
+ *	Print the current termcap characteristics
+ */
+protected int
+/*ARGSUSED*/
+terminal_telltc(EditLine *el, int argc __attribute__((__unused__)), 
+    const Char **argv __attribute__((__unused__)))
+{
+	const struct termcapstr *t;
+	char **ts;
+
+	(void) fprintf(el->el_outfile, "\n\tYour terminal has the\n");
+	(void) fprintf(el->el_outfile, "\tfollowing characteristics:\n\n");
+	(void) fprintf(el->el_outfile, "\tIt has %d columns and %d lines\n",
+	    Val(T_co), Val(T_li));
+	(void) fprintf(el->el_outfile,
+	    "\tIt has %s meta key\n", EL_HAS_META ? "a" : "no");
+	(void) fprintf(el->el_outfile,
+	    "\tIt can%suse tabs\n", EL_CAN_TAB ? " " : "not ");
+	(void) fprintf(el->el_outfile, "\tIt %s automatic margins\n",
+	    EL_HAS_AUTO_MARGINS ? "has" : "does not have");
+	if (EL_HAS_AUTO_MARGINS)
+		(void) fprintf(el->el_outfile, "\tIt %s magic margins\n",
+		    EL_HAS_MAGIC_MARGINS ? "has" : "does not have");
+
+	for (t = tstr, ts = el->el_terminal.t_str; t->name != NULL; t++, ts++) {
+		const char *ub;
+		if (*ts && **ts) {
+			ub = ct_encode_string(ct_visual_string(
+			    ct_decode_string(*ts, &el->el_scratch)),
+			    &el->el_scratch);
+		} else {
+			ub = "(empty)";
+		}
+		(void) fprintf(el->el_outfile, "\t%25s (%s) == %s\n",
+		    t->long_name, t->name, ub);
+	}
+	(void) fputc('\n', el->el_outfile);
+	return 0;
+}
+
+
+/* terminal_settc():
+ *	Change the current terminal characteristics
+ */
+protected int
+/*ARGSUSED*/
+terminal_settc(EditLine *el, int argc __attribute__((__unused__)),
+    const Char **argv)
+{
+	const struct termcapstr *ts;
+	const struct termcapval *tv;
+	char what[8], how[8];
+
+	if (argv == NULL || argv[1] == NULL || argv[2] == NULL)
+		return -1;
+
+	strncpy(what, ct_encode_string(argv[1], &el->el_scratch), sizeof(what));
+	what[sizeof(what) - 1] = '\0';
+	strncpy(how,  ct_encode_string(argv[2], &el->el_scratch), sizeof(how));
+	how[sizeof(how) - 1] = '\0';
+
+	/*
+         * Do the strings first
+         */
+	for (ts = tstr; ts->name != NULL; ts++)
+		if (strcmp(ts->name, what) == 0)
+			break;
+
+	if (ts->name != NULL) {
+		terminal_alloc(el, ts, how);
+		terminal_setflags(el);
+		return 0;
+	}
+	/*
+         * Do the numeric ones second
+         */
+	for (tv = tval; tv->name != NULL; tv++)
+		if (strcmp(tv->name, what) == 0)
+			break;
+
+	if (tv->name != NULL)
+		return -1;
+
+	if (tv == &tval[T_pt] || tv == &tval[T_km] ||
+	    tv == &tval[T_am] || tv == &tval[T_xn]) {
+		if (strcmp(how, "yes") == 0)
+			el->el_terminal.t_val[tv - tval] = 1;
+		else if (strcmp(how, "no") == 0)
+			el->el_terminal.t_val[tv - tval] = 0;
+		else {
+			(void) fprintf(el->el_errfile,
+			    "" FSTR ": Bad value `%s'.\n", argv[0], how);
+			return -1;
+		}
+		terminal_setflags(el);
+		if (terminal_change_size(el, Val(T_li), Val(T_co)) == -1)
+			return -1;
+		return 0;
+	} else {
+		long i;
+		char *ep;
+
+		i = strtol(how, &ep, 10);
+		if (*ep != '\0') {
+			(void) fprintf(el->el_errfile,
+			    "" FSTR ": Bad value `%s'.\n", argv[0], how);
+			return -1;
+		}
+		el->el_terminal.t_val[tv - tval] = (int) i;
+		el->el_terminal.t_size.v = Val(T_co);
+		el->el_terminal.t_size.h = Val(T_li);
+		if (tv == &tval[T_co] || tv == &tval[T_li])
+			if (terminal_change_size(el, Val(T_li), Val(T_co))
+			    == -1)
+				return -1;
+		return 0;
+	}
+}
+
+
+/* terminal_gettc():
+ *	Get the current terminal characteristics
+ */
+protected int
+/*ARGSUSED*/
+terminal_gettc(EditLine *el, int argc __attribute__((__unused__)), char **argv)
+{
+	const struct termcapstr *ts;
+	const struct termcapval *tv;
+	char *what;
+	void *how;
+
+	if (argv == NULL || argv[1] == NULL || argv[2] == NULL)
+		return -1;
+
+	what = argv[1];
+	how = argv[2];
+
+	/*
+         * Do the strings first
+         */
+	for (ts = tstr; ts->name != NULL; ts++)
+		if (strcmp(ts->name, what) == 0)
+			break;
+
+	if (ts->name != NULL) {
+		*(char **)how = el->el_terminal.t_str[ts - tstr];
+		return 0;
+	}
+	/*
+         * Do the numeric ones second
+         */
+	for (tv = tval; tv->name != NULL; tv++)
+		if (strcmp(tv->name, what) == 0)
+			break;
+
+	if (tv->name == NULL)
+		return -1;
+
+	if (tv == &tval[T_pt] || tv == &tval[T_km] ||
+	    tv == &tval[T_am] || tv == &tval[T_xn]) {
+		static char yes[] = "yes";
+		static char no[] = "no";
+		if (el->el_terminal.t_val[tv - tval])
+			*(char **)how = yes;
+		else
+			*(char **)how = no;
+		return 0;
+	} else {
+		*(int *)how = el->el_terminal.t_val[tv - tval];
+		return 0;
+	}
+}
+
+/* terminal_echotc():
+ *	Print the termcap string out with variable substitution
+ */
+protected int
+/*ARGSUSED*/
+terminal_echotc(EditLine *el, int argc __attribute__((__unused__)),
+    const Char **argv)
+{
+	char *cap, *scap;
+	Char *ep;
+	int arg_need, arg_cols, arg_rows;
+	int verbose = 0, silent = 0;
+	char *area;
+	static const char fmts[] = "%s\n", fmtd[] = "%d\n";
+	const struct termcapstr *t;
+	char buf[TC_BUFSIZE];
+	long i;
+
+	area = buf;
+
+	if (argv == NULL || argv[1] == NULL)
+		return -1;
+	argv++;
+
+	if (argv[0][0] == '-') {
+		switch (argv[0][1]) {
+		case 'v':
+			verbose = 1;
+			break;
+		case 's':
+			silent = 1;
+			break;
+		default:
+			/* stderror(ERR_NAME | ERR_TCUSAGE); */
+			break;
+		}
+		argv++;
+	}
+	if (!*argv || *argv[0] == '\0')
+		return 0;
+	if (Strcmp(*argv, STR("tabs")) == 0) {
+		(void) fprintf(el->el_outfile, fmts, EL_CAN_TAB ? "yes" : "no");
+		return 0;
+	} else if (Strcmp(*argv, STR("meta")) == 0) {
+		(void) fprintf(el->el_outfile, fmts, Val(T_km) ? "yes" : "no");
+		return 0;
+	} else if (Strcmp(*argv, STR("xn")) == 0) {
+		(void) fprintf(el->el_outfile, fmts, EL_HAS_MAGIC_MARGINS ?
+		    "yes" : "no");
+		return 0;
+	} else if (Strcmp(*argv, STR("am")) == 0) {
+		(void) fprintf(el->el_outfile, fmts, EL_HAS_AUTO_MARGINS ?
+		    "yes" : "no");
+		return 0;
+	} else if (Strcmp(*argv, STR("baud")) == 0) {
+		(void) fprintf(el->el_outfile, fmtd, (int)el->el_tty.t_speed);
+		return 0;
+	} else if (Strcmp(*argv, STR("rows")) == 0 ||
+                   Strcmp(*argv, STR("lines")) == 0) {
+		(void) fprintf(el->el_outfile, fmtd, Val(T_li));
+		return 0;
+	} else if (Strcmp(*argv, STR("cols")) == 0) {
+		(void) fprintf(el->el_outfile, fmtd, Val(T_co));
+		return 0;
+	}
+	/*
+         * Try to use our local definition first
+         */
+	scap = NULL;
+	for (t = tstr; t->name != NULL; t++)
+		if (strcmp(t->name,
+		    ct_encode_string(*argv, &el->el_scratch)) == 0) {
+			scap = el->el_terminal.t_str[t - tstr];
+			break;
+		}
+	if (t->name == NULL) {
+		/* XXX: some systems' tgetstr needs non const */
+                scap = tgetstr(ct_encode_string(*argv, &el->el_scratch), &area);
+	}
+	if (!scap || scap[0] == '\0') {
+		if (!silent)
+			(void) fprintf(el->el_errfile,
+			    "echotc: Termcap parameter `" FSTR "' not found.\n",
+			    *argv);
+		return -1;
+	}
+	/*
+         * Count home many values we need for this capability.
+         */
+	for (cap = scap, arg_need = 0; *cap; cap++)
+		if (*cap == '%')
+			switch (*++cap) {
+			case 'd':
+			case '2':
+			case '3':
+			case '.':
+			case '+':
+				arg_need++;
+				break;
+			case '%':
+			case '>':
+			case 'i':
+			case 'r':
+			case 'n':
+			case 'B':
+			case 'D':
+				break;
+			default:
+				/*
+				 * hpux has lot's of them...
+				 */
+				if (verbose)
+					(void) fprintf(el->el_errfile,
+				"echotc: Warning: unknown termcap %% `%c'.\n",
+					    *cap);
+				/* This is bad, but I won't complain */
+				break;
+			}
+
+	switch (arg_need) {
+	case 0:
+		argv++;
+		if (*argv && *argv[0]) {
+			if (!silent)
+				(void) fprintf(el->el_errfile,
+				    "echotc: Warning: Extra argument `" FSTR "'.\n",
+				    *argv);
+			return -1;
+		}
+		terminal_tputs(el, scap, 1);
+		break;
+	case 1:
+		argv++;
+		if (!*argv || *argv[0] == '\0') {
+			if (!silent)
+				(void) fprintf(el->el_errfile,
+				    "echotc: Warning: Missing argument.\n");
+			return -1;
+		}
+		arg_cols = 0;
+		i = Strtol(*argv, &ep, 10);
+		if (*ep != '\0' || i < 0) {
+			if (!silent)
+				(void) fprintf(el->el_errfile,
+				    "echotc: Bad value `" FSTR "' for rows.\n",
+				    *argv);
+			return -1;
+		}
+		arg_rows = (int) i;
+		argv++;
+		if (*argv && *argv[0]) {
+			if (!silent)
+				(void) fprintf(el->el_errfile,
+				    "echotc: Warning: Extra argument `" FSTR
+				    "'.\n", *argv);
+			return -1;
+		}
+		terminal_tputs(el, tgoto(scap, arg_cols, arg_rows), 1);
+		break;
+	default:
+		/* This is wrong, but I will ignore it... */
+		if (verbose)
+			(void) fprintf(el->el_errfile,
+			 "echotc: Warning: Too many required arguments (%d).\n",
+			    arg_need);
+		/* FALLTHROUGH */
+	case 2:
+		argv++;
+		if (!*argv || *argv[0] == '\0') {
+			if (!silent)
+				(void) fprintf(el->el_errfile,
+				    "echotc: Warning: Missing argument.\n");
+			return -1;
+		}
+		i = Strtol(*argv, &ep, 10);
+		if (*ep != '\0' || i < 0) {
+			if (!silent)
+				(void) fprintf(el->el_errfile,
+				    "echotc: Bad value `" FSTR "' for cols.\n",
+				    *argv);
+			return -1;
+		}
+		arg_cols = (int) i;
+		argv++;
+		if (!*argv || *argv[0] == '\0') {
+			if (!silent)
+				(void) fprintf(el->el_errfile,
+				    "echotc: Warning: Missing argument.\n");
+			return -1;
+		}
+		i = Strtol(*argv, &ep, 10);
+		if (*ep != '\0' || i < 0) {
+			if (!silent)
+				(void) fprintf(el->el_errfile,
+				    "echotc: Bad value `" FSTR "' for rows.\n",
+				    *argv);
+			return -1;
+		}
+		arg_rows = (int) i;
+		if (*ep != '\0') {
+			if (!silent)
+				(void) fprintf(el->el_errfile,
+				    "echotc: Bad value `" FSTR "'.\n", *argv);
+			return -1;
+		}
+		argv++;
+		if (*argv && *argv[0]) {
+			if (!silent)
+				(void) fprintf(el->el_errfile,
+				    "echotc: Warning: Extra argument `" FSTR
+				    "'.\n", *argv);
+			return -1;
+		}
+		terminal_tputs(el, tgoto(scap, arg_cols, arg_rows), arg_rows);
+		break;
+	}
+	return 0;
+}
diff -pruN 5.1.58-1/cmd-line-utils/libedit/tokenizer.c 5.1.61-2/cmd-line-utils/libedit/tokenizer.c
--- 5.1.58-1/cmd-line-utils/libedit/tokenizer.c	2011-07-01 15:22:23.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/tokenizer.c	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: tokenizer.c,v 1.14 2003/12/05 13:37:48 lukem Exp $	*/
+/*	$NetBSD: tokenizer.c,v 1.19 2011/07/28 20:50:55 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -40,51 +40,53 @@ static char sccsid[] = "@(#)tokenizer.c	
 #endif
 #endif /* not lint && not SCCSID */
 
+/* We build this file twice, once as NARROW, once as WIDE. */
 /*
  * tokenize.c: Bourne shell like tokenizer
  */
 #include <string.h>
 #include <stdlib.h>
 #include "histedit.h"
+#include "chartype.h"
 
 typedef enum {
 	Q_none, Q_single, Q_double, Q_one, Q_doubleone
 } quote_t;
 
-#define	IFS		"\t \n"
-
 #define	TOK_KEEP	1
 #define	TOK_EAT		2
 
 #define	WINCR		20
 #define	AINCR		10
 
-#define	tok_strdup(a)		strdup(a)
+#define	IFS		STR("\t \n")
+
 #define	tok_malloc(a)		malloc(a)
 #define	tok_free(a)		free(a)
 #define	tok_realloc(a, b)	realloc(a, b)
+#define	tok_strdup(a)		Strdup(a)
 
 
-struct tokenizer {
-	char	*ifs;		/* In field separator			 */
+struct TYPE(tokenizer) {
+	Char	*ifs;		/* In field separator			 */
 	int	 argc, amax;	/* Current and maximum number of args	 */
-	char   **argv;		/* Argument list			 */
-	char	*wptr, *wmax;	/* Space and limit on the word buffer	 */
-	char	*wstart;	/* Beginning of next word		 */
-	char	*wspace;	/* Space of word buffer			 */
+	Char   **argv;		/* Argument list			 */
+	Char	*wptr, *wmax;	/* Space and limit on the word buffer	 */
+	Char	*wstart;	/* Beginning of next word		 */
+	Char	*wspace;	/* Space of word buffer			 */
 	quote_t	 quote;		/* Quoting state			 */
 	int	 flags;		/* flags;				 */
 };
 
 
-private void tok_finish(Tokenizer *);
+private void FUN(tok,finish)(TYPE(Tokenizer) *);
 
 
-/* tok_finish():
+/* FUN(tok,finish)():
  *	Finish a word in the tokenizer.
  */
 private void
-tok_finish(Tokenizer *tok)
+FUN(tok,finish)(TYPE(Tokenizer) *tok)
 {
 
 	*tok->wptr = '\0';
@@ -97,35 +99,35 @@ tok_finish(Tokenizer *tok)
 }
 
 
-/* tok_init():
+/* FUN(tok,init)():
  *	Initialize the tokenizer
  */
-public Tokenizer *
-tok_init(const char *ifs)
+public TYPE(Tokenizer) *
+FUN(tok,init)(const Char *ifs)
 {
-	Tokenizer *tok = (Tokenizer *) tok_malloc(sizeof(Tokenizer));
+	TYPE(Tokenizer) *tok = tok_malloc(sizeof(*tok));
 
 	if (tok == NULL)
 		return NULL;
 	tok->ifs = tok_strdup(ifs ? ifs : IFS);
 	if (tok->ifs == NULL) {
-		tok_free((ptr_t)tok);
+		tok_free(tok);
 		return NULL;
 	}
 	tok->argc = 0;
 	tok->amax = AINCR;
-	tok->argv = (char **) tok_malloc(sizeof(char *) * tok->amax);
+	tok->argv = tok_malloc(sizeof(*tok->argv) * tok->amax);
 	if (tok->argv == NULL) {
-		tok_free((ptr_t)tok->ifs);
-		tok_free((ptr_t)tok);
+		tok_free(tok->ifs);
+		tok_free(tok);
 		return NULL;
 	}
 	tok->argv[0] = NULL;
-	tok->wspace = (char *) tok_malloc(WINCR);
+	tok->wspace = tok_malloc(WINCR * sizeof(*tok->wspace));
 	if (tok->wspace == NULL) {
-		tok_free((ptr_t)tok->argv);
-		tok_free((ptr_t)tok->ifs);
-		tok_free((ptr_t)tok);
+		tok_free(tok->argv);
+		tok_free(tok->ifs);
+		tok_free(tok);
 		return NULL;
 	}
 	tok->wmax = tok->wspace + WINCR;
@@ -138,11 +140,11 @@ tok_init(const char *ifs)
 }
 
 
-/* tok_reset():
+/* FUN(tok,reset)():
  *	Reset the tokenizer
  */
 public void
-tok_reset(Tokenizer *tok)
+FUN(tok,reset)(TYPE(Tokenizer) *tok)
 {
 
 	tok->argc = 0;
@@ -153,25 +155,25 @@ tok_reset(Tokenizer *tok)
 }
 
 
-/* tok_end():
+/* FUN(tok,end)():
  *	Clean up
  */
 public void
-tok_end(Tokenizer *tok)
+FUN(tok,end)(TYPE(Tokenizer) *tok)
 {
 
-	tok_free((ptr_t) tok->ifs);
-	tok_free((ptr_t) tok->wspace);
-	tok_free((ptr_t) tok->argv);
-	tok_free((ptr_t) tok);
+	tok_free(tok->ifs);
+	tok_free(tok->wspace);
+	tok_free(tok->argv);
+	tok_free(tok);
 }
 
 
 
-/* tok_line():
+/* FUN(tok,line)():
  *	Bourne shell (sh(1)) like tokenizing
  *	Arguments:
- *		tok	current tokenizer state (setup with tok_init())
+ *		tok	current tokenizer state (setup with FUN(tok,init)())
  *		line	line to parse
  *	Returns:
  *		-1	Internal error
@@ -186,20 +188,20 @@ tok_end(Tokenizer *tok)
  *		cursorv	if !NULL, offset in argv[cursorc] of cursor
  */
 public int
-tok_line(Tokenizer *tok, const LineInfo *line,
-    int *argc, const char ***argv, int *cursorc, int *cursoro)
+FUN(tok,line)(TYPE(Tokenizer) *tok, const TYPE(LineInfo) *line,
+    int *argc, const Char ***argv, int *cursorc, int *cursoro)
 {
-	const char *ptr;
+	const Char *ptr;
 	int cc, co;
 
 	cc = co = -1;
 	ptr = line->buffer;
 	for (ptr = line->buffer; ;ptr++) {
 		if (ptr >= line->lastchar)
-			ptr = "";
+			ptr = STR("");
 		if (ptr == line->cursor) {
 			cc = tok->argc;
-			co = tok->wptr - tok->wstart;
+			co = (int)(tok->wptr - tok->wstart);
 		}
 		switch (*ptr) {
 		case '\'':
@@ -357,8 +359,8 @@ tok_line(Tokenizer *tok, const LineInfo 
 			tok->flags &= ~TOK_EAT;
 			switch (tok->quote) {
 			case Q_none:
-				if (strchr(tok->ifs, *ptr) != NULL)
-					tok_finish(tok);
+				if (Strchr(tok->ifs, *ptr) != NULL)
+					FUN(tok,finish)(tok);
 				else
 					*tok->wptr++ = *ptr;
 				break;
@@ -389,7 +391,8 @@ tok_line(Tokenizer *tok, const LineInfo 
 
 		if (tok->wptr >= tok->wmax - 4) {
 			size_t size = tok->wmax - tok->wspace + WINCR;
-			char *s = (char *) tok_realloc(tok->wspace, size);
+			Char *s = tok_realloc(tok->wspace,
+			    size * sizeof(*s));
 			if (s == NULL)
 				return (-1);
 
@@ -406,10 +409,9 @@ tok_line(Tokenizer *tok, const LineInfo 
 			tok->wmax = s + size;
 		}
 		if (tok->argc >= tok->amax - 4) {
-			char **p;
+			Char **p;
 			tok->amax += AINCR;
-			p = (char **) tok_realloc(tok->argv,
-			    tok->amax * sizeof(char *));
+			p = tok_realloc(tok->argv, tok->amax * sizeof(*p));
 			if (p == NULL)
 				return (-1);
 			tok->argv = p;
@@ -418,29 +420,30 @@ tok_line(Tokenizer *tok, const LineInfo 
  tok_line_outok:
 	if (cc == -1 && co == -1) {
 		cc = tok->argc;
-		co = tok->wptr - tok->wstart;
+		co = (int)(tok->wptr - tok->wstart);
 	}
 	if (cursorc != NULL)
 		*cursorc = cc;
 	if (cursoro != NULL)
 		*cursoro = co;
-	tok_finish(tok);
-	*argv = (const char **)tok->argv;
+	FUN(tok,finish)(tok);
+	*argv = (const Char **)tok->argv;
 	*argc = tok->argc;
 	return (0);
 }
 
-/* tok_str():
+/* FUN(tok,str)():
  *	Simpler version of tok_line, taking a NUL terminated line
  *	and splitting into words, ignoring cursor state.
  */
 public int
-tok_str(Tokenizer *tok, const char *line, int *argc, const char ***argv)
+FUN(tok,str)(TYPE(Tokenizer) *tok, const Char *line, int *argc,
+    const Char ***argv)
 {
-	LineInfo li;
+	TYPE(LineInfo) li;
 
 	memset(&li, 0, sizeof(li));
 	li.buffer = line;
-	li.cursor = li.lastchar = strchr(line, '\0');
-	return (tok_line(tok, &li, argc, argv, NULL, NULL));
+	li.cursor = li.lastchar = Strchr(line, '\0');
+	return (FUN(tok,line)(tok, &li, argc, argv, NULL, NULL));
 }
diff -pruN 5.1.58-1/cmd-line-utils/libedit/tokenizern.c 5.1.61-2/cmd-line-utils/libedit/tokenizern.c
--- 5.1.58-1/cmd-line-utils/libedit/tokenizern.c	1970-01-01 00:00:00.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/tokenizern.c	2011-12-16 19:06:04.000000000 +0000
@@ -0,0 +1,5 @@
+#define NARROW_WRAPPER
+#include "config.h"
+#undef WIDECHAR
+#define NARROWCHAR
+#include "./tokenizer.c"
diff -pruN 5.1.58-1/cmd-line-utils/libedit/tty.c 5.1.61-2/cmd-line-utils/libedit/tty.c
--- 5.1.58-1/cmd-line-utils/libedit/tty.c	2011-07-01 15:22:23.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/tty.c	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: tty.c,v 1.28 2009/02/06 19:53:23 sketch Exp $	*/
+/*	$NetBSD: tty.c,v 1.41 2011/10/04 15:27:04 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -45,8 +45,10 @@ static char sccsid[] = "@(#)tty.c	8.1 (B
  */
 #include <assert.h>
 #include <errno.h>
-#include "tty.h"
+#include <unistd.h>	/* for isatty */
+#include <strings.h>	/* for ffs */
 #include "el.h"
+#include "tty.h"
 
 typedef struct ttymodes_t {
 	const char *m_name;
@@ -55,7 +57,7 @@ typedef struct ttymodes_t {
 }          ttymodes_t;
 
 typedef struct ttymap_t {
-	int nch, och;		/* Internal and termio rep of chars */
+	Int nch, och;		/* Internal and termio rep of chars */
 	el_action_t bind[3];	/* emacs, vi, and vi-cmd */
 } ttymap_t;
 
@@ -151,7 +153,7 @@ private const ttymap_t tty_map[] = {
 	{C_LNEXT, VLNEXT,
 	{ED_QUOTED_INSERT, ED_QUOTED_INSERT, ED_UNASSIGNED}},
 #endif /* VLNEXT */
-	{-1, -1,
+	{(Int)-1, (Int)-1,
 	{ED_UNASSIGNED, ED_UNASSIGNED, ED_UNASSIGNED}}
 };
 
@@ -492,14 +494,21 @@ tty_setup(EditLine *el)
 	int rst = 1;
 
 	if (el->el_flags & EDIT_DISABLED)
-		return (0);
+		return 0;
 
+	if (!isatty(el->el_outfd)) {
+#ifdef DEBUG_TTY
+		(void) fprintf(el->el_errfile,
+		    "tty_setup: isatty: %s\n", strerror(errno));
+#endif /* DEBUG_TTY */
+		return -1;
+	}
 	if (tty_getty(el, &el->el_tty.t_ed) == -1) {
 #ifdef DEBUG_TTY
 		(void) fprintf(el->el_errfile,
 		    "tty_setup: tty_getty: %s\n", strerror(errno));
 #endif /* DEBUG_TTY */
-		return (-1);
+		return -1;
 	}
 	el->el_tty.t_ts = el->el_tty.t_ex = el->el_tty.t_ed;
 
@@ -549,13 +558,9 @@ tty_setup(EditLine *el)
 			    "tty_setup: tty_setty: %s\n",
 			    strerror(errno));
 #endif /* DEBUG_TTY */
-			return (-1);
+			return -1;
 		}
 	}
-#ifdef notdef
-	else
-		tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]);
-#endif
 
 	el->el_tty.t_ed.c_iflag &= ~el->el_tty.t_t[ED_IO][MD_INP].t_clrmask;
 	el->el_tty.t_ed.c_iflag |= el->el_tty.t_t[ED_IO][MD_INP].t_setmask;
@@ -571,7 +576,7 @@ tty_setup(EditLine *el)
 
 	tty__setchar(&el->el_tty.t_ed, el->el_tty.t_c[ED_IO]);
 	tty_bind_char(el, 1);
-	return (0);
+	return 0;
 }
 
 protected int
@@ -582,7 +587,7 @@ tty_init(EditLine *el)
 	el->el_tty.t_vdisable = _POSIX_VDISABLE;
 	(void) memcpy(el->el_tty.t_t, ttyperm, sizeof(ttyperm_t));
 	(void) memcpy(el->el_tty.t_c, ttychar, sizeof(ttychar_t));
-	return (tty_setup(el));
+	return tty_setup(el);
 }
 
 
@@ -608,7 +613,7 @@ tty__getspeed(struct termios *td)
 
 	if ((spd = cfgetispeed(td)) == 0)
 		spd = cfgetospeed(td);
-	return (spd);
+	return spd;
 }
 
 /* tty__getspeed():
@@ -892,7 +897,7 @@ tty_bind_char(EditLine *el, int force)
 
 	unsigned char *t_n = el->el_tty.t_c[ED_IO];
 	unsigned char *t_o = el->el_tty.t_ed.c_cc;
-	unsigned char new[2], old[2];
+	Char new[2], old[2];
 	const ttymap_t *tp;
 	el_action_t *map, *alt;
 	const el_action_t *dmap, *dalt;
@@ -908,22 +913,22 @@ tty_bind_char(EditLine *el, int force)
 		dalt = NULL;
 	}
 
-	for (tp = tty_map; tp->nch != -1; tp++) {
+	for (tp = tty_map; tp->nch != (Int)-1; tp++) {
 		new[0] = t_n[tp->nch];
 		old[0] = t_o[tp->och];
 		if (new[0] == old[0] && !force)
 			continue;
 		/* Put the old default binding back, and set the new binding */
-		key_clear(el, map, (char *)old);
-		map[old[0]] = dmap[old[0]];
-		key_clear(el, map, (char *)new);
+		keymacro_clear(el, map, old);
+		map[UC(old[0])] = dmap[UC(old[0])];
+		keymacro_clear(el, map, new);
 		/* MAP_VI == 1, MAP_EMACS == 0... */
-		map[new[0]] = tp->bind[el->el_map.type];
+		map[UC(new[0])] = tp->bind[el->el_map.type];
 		if (dalt) {
-			key_clear(el, alt, (char *)old);
-			alt[old[0]] = dalt[old[0]];
-			key_clear(el, alt, (char *)new);
-			alt[new[0]] = tp->bind[el->el_map.type + 1];
+			keymacro_clear(el, alt, old);
+			alt[UC(old[0])] = dalt[UC(old[0])];
+			keymacro_clear(el, alt, new);
+			alt[UC(new[0])] = tp->bind[el->el_map.type + 1];
 		}
 	}
 }
@@ -937,21 +942,21 @@ tty_rawmode(EditLine *el)
 {
 
 	if (el->el_tty.t_mode == ED_IO || el->el_tty.t_mode == QU_IO)
-		return (0);
+		return 0;
 
 	if (el->el_flags & EDIT_DISABLED)
-		return (0);
+		return 0;
 
 	if (tty_getty(el, &el->el_tty.t_ts) == -1) {
 #ifdef DEBUG_TTY
 		(void) fprintf(el->el_errfile, "tty_rawmode: tty_getty: %s\n",
 		    strerror(errno));
 #endif /* DEBUG_TTY */
-		return (-1);
+		return -1;
 	}
 	/*
          * We always keep up with the eight bit setting and the speed of the
-         * tty. But only we only believe changes that are made to cooked mode!
+         * tty. But we only believe changes that are made to cooked mode!
          */
 	el->el_tty.t_eight = tty__geteightbit(&el->el_tty.t_ts);
 	el->el_tty.t_speed = tty__getspeed(&el->el_tty.t_ts);
@@ -1077,10 +1082,10 @@ tty_rawmode(EditLine *el)
 		(void) fprintf(el->el_errfile, "tty_rawmode: tty_setty: %s\n",
 		    strerror(errno));
 #endif /* DEBUG_TTY */
-		return (-1);
+		return -1;
 	}
 	el->el_tty.t_mode = ED_IO;
-	return (0);
+	return 0;
 }
 
 
@@ -1092,10 +1097,10 @@ tty_cookedmode(EditLine *el)
 {				/* set tty in normal setup */
 
 	if (el->el_tty.t_mode == EX_IO)
-		return (0);
+		return 0;
 
 	if (el->el_flags & EDIT_DISABLED)
-		return (0);
+		return 0;
 
 	if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ex) == -1) {
 #ifdef DEBUG_TTY
@@ -1103,10 +1108,10 @@ tty_cookedmode(EditLine *el)
 		    "tty_cookedmode: tty_setty: %s\n",
 		    strerror(errno));
 #endif /* DEBUG_TTY */
-		return (-1);
+		return -1;
 	}
 	el->el_tty.t_mode = EX_IO;
-	return (0);
+	return 0;
 }
 
 
@@ -1117,7 +1122,7 @@ protected int
 tty_quotemode(EditLine *el)
 {
 	if (el->el_tty.t_mode == QU_IO)
-		return (0);
+		return 0;
 
 	el->el_tty.t_qu = el->el_tty.t_ed;
 
@@ -1138,10 +1143,10 @@ tty_quotemode(EditLine *el)
 		(void) fprintf(el->el_errfile, "QuoteModeOn: tty_setty: %s\n",
 		    strerror(errno));
 #endif /* DEBUG_TTY */
-		return (-1);
+		return -1;
 	}
 	el->el_tty.t_mode = QU_IO;
-	return (0);
+	return 0;
 }
 
 
@@ -1153,16 +1158,16 @@ tty_noquotemode(EditLine *el)
 {
 
 	if (el->el_tty.t_mode != QU_IO)
-		return (0);
+		return 0;
 	if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ed) == -1) {
 #ifdef DEBUG_TTY
 		(void) fprintf(el->el_errfile, "QuoteModeOff: tty_setty: %s\n",
 		    strerror(errno));
 #endif /* DEBUG_TTY */
-		return (-1);
+		return -1;
 	}
 	el->el_tty.t_mode = ED_IO;
-	return (0);
+	return 0;
 }
 
 
@@ -1171,19 +1176,20 @@ tty_noquotemode(EditLine *el)
  */
 protected int
 /*ARGSUSED*/
-tty_stty(EditLine *el, int argc __attribute__((__unused__)), const char **argv)
+tty_stty(EditLine *el, int argc __attribute__((__unused__)), const Char **argv)
 {
 	const ttymodes_t *m;
 	char x;
 	int aflag = 0;
-	const char *s, *d;
-	const char *name;
+	const Char *s, *d;
+        char name[EL_BUFSIZ];
 	struct termios *tios = &el->el_tty.t_ex;
 	int z = EX_IO;
 
 	if (argv == NULL)
-		return (-1);
-	name = *argv++;
+		return -1;
+	strncpy(name, ct_encode_string(*argv++, &el->el_scratch), sizeof(name));
+        name[sizeof(name) - 1] = '\0';
 
 	while (argv && *argv && argv[0][0] == '-' && argv[0][2] == '\0')
 		switch (argv[0][1]) {
@@ -1210,12 +1216,12 @@ tty_stty(EditLine *el, int argc __attrib
 			(void) fprintf(el->el_errfile,
 			    "%s: Unknown switch `%c'.\n",
 			    name, argv[0][1]);
-			return (-1);
+			return -1;
 		}
 
 	if (!argv || !*argv) {
 		int i = -1;
-		int len = 0, st = 0, cu;
+		size_t len = 0, st = 0, cu;
 		for (m = ttymodes; m->m_name; m++) {
 			if (m->m_type != i) {
 				(void) fprintf(el->el_outfile, "%s%s",
@@ -1228,8 +1234,9 @@ tty_stty(EditLine *el, int argc __attrib
 			if (i != -1) {
 			    x = (el->el_tty.t_t[z][i].t_setmask & m->m_value)
 				?  '+' : '\0';
-			    x = (el->el_tty.t_t[z][i].t_clrmask & m->m_value)
-				? '-' : x;
+
+			    if (el->el_tty.t_t[z][i].t_clrmask & m->m_value)
+				x = '-';
 			} else {
 			    x = '\0';
 			}
@@ -1238,9 +1245,9 @@ tty_stty(EditLine *el, int argc __attrib
 
 				cu = strlen(m->m_name) + (x != '\0') + 1;
 
-				if (len + cu >= el->el_term.t_size.h) {
+				if (len + cu >= (size_t)el->el_terminal.t_size.h) {
 					(void) fprintf(el->el_outfile, "\n%*s",
-					    st, "");
+					    (int)st, "");
 					len = st + cu;
 				} else
 					len += cu;
@@ -1254,40 +1261,41 @@ tty_stty(EditLine *el, int argc __attrib
 			}
 		}
 		(void) fprintf(el->el_outfile, "\n");
-		return (0);
+		return 0;
 	}
 	while (argv && (s = *argv++)) {
-		const char *p;
+		const Char *p;
 		switch (*s) {
 		case '+':
 		case '-':
-			x = *s++;
+			x = (char)*s++;
 			break;
 		default:
 			x = '\0';
 			break;
 		}
 		d = s;
-		p = strchr(s, '=');
+		p = Strchr(s, '=');
 		for (m = ttymodes; m->m_name; m++)
-			if ((p ? strncmp(m->m_name, d, (size_t)(p - d)) :
-			    strcmp(m->m_name, d)) == 0 &&
+			if ((p ? strncmp(m->m_name, ct_encode_string(d, &el->el_scratch), (size_t)(p - d)) :
+			    strcmp(m->m_name, ct_encode_string(d, &el->el_scratch))) == 0 &&
 			    (p == NULL || m->m_type == MD_CHAR))
 				break;
 
 		if (!m->m_name) {
 			(void) fprintf(el->el_errfile,
-			    "%s: Invalid argument `%s'.\n", name, d);
-			return (-1);
+			    "%s: Invalid argument `" FSTR "'.\n", name, d);
+			return -1;
 		}
 		if (p) {
 			int c = ffs((int)m->m_value);
-			int v = *++p ? parse__escape((const char **) &p) :
+			int v = *++p ? parse__escape(&p) :
 			    el->el_tty.t_vdisable;
-			assert(c-- != 0);
+			assert(c != 0);
+			c--;
 			c = tty__getcharindex(c);
 			assert(c != -1);
-			tios->c_cc[c] = v;
+			tios->c_cc[c] = (cc_t)v;
 			continue;
 		}
 		switch (x) {
@@ -1312,11 +1320,11 @@ tty_stty(EditLine *el, int argc __attrib
 			(void) fprintf(el->el_errfile,
 			    "tty_stty: tty_setty: %s\n", strerror(errno));
 #endif /* DEBUG_TTY */
-			return (-1);
+			return -1;
 		}
 	}
 
-	return (0);
+	return 0;
 }
 
 
diff -pruN 5.1.58-1/cmd-line-utils/libedit/tty.h 5.1.61-2/cmd-line-utils/libedit/tty.h
--- 5.1.58-1/cmd-line-utils/libedit/tty.h	2011-07-01 15:22:23.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/tty.h	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: tty.h,v 1.11 2005/06/01 11:37:52 lukem Exp $	*/
+/*	$NetBSD: tty.h,v 1.13 2011/08/16 16:25:15 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -40,6 +40,7 @@
 #ifndef _h_el_tty
 #define	_h_el_tty
 
+#include "sys.h"
 #include "histedit.h"
 #include <termios.h>
 #include <unistd.h>
@@ -430,7 +431,7 @@
 #define	C_MIN		23
 #define	C_TIME		24
 #define	C_NCC		25
-#define	C_SH(A)		(1 << (A))
+#define	C_SH(A)		((unsigned int)(1 << (A)))
 
 /*
  * Terminal dependend data structures
@@ -458,7 +459,7 @@ typedef unsigned char ttychar_t[NN_IO][C
 
 protected int	tty_init(EditLine *);
 protected void	tty_end(EditLine *);
-protected int	tty_stty(EditLine *, int, const char **);
+protected int	tty_stty(EditLine *, int, const Char **);
 protected int	tty_rawmode(EditLine *);
 protected int	tty_cookedmode(EditLine *);
 protected int	tty_quotemode(EditLine *);
diff -pruN 5.1.58-1/cmd-line-utils/libedit/vi.c 5.1.61-2/cmd-line-utils/libedit/vi.c
--- 5.1.58-1/cmd-line-utils/libedit/vi.c	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/cmd-line-utils/libedit/vi.c	2011-12-16 19:06:04.000000000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: vi.c,v 1.28 2009/02/06 13:14:37 sketch Exp $	*/
+/*	$NetBSD: vi.c,v 1.41 2011/10/04 15:27:04 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -35,6 +35,7 @@
 #include "config.h"
 #include <stdlib.h>
 #include <unistd.h>
+#include <limits.h>
 #include <sys/wait.h>
 
 #if !defined(lint) && !defined(SCCSID)
@@ -49,25 +50,25 @@ static char sccsid[] = "@(#)vi.c	8.1 (Be
  */
 #include "el.h"
 
-private el_action_t	cv_action(EditLine *, int);
-private el_action_t	cv_paste(EditLine *, int);
+private el_action_t	cv_action(EditLine *, Int);
+private el_action_t	cv_paste(EditLine *, Int);
 
 /* cv_action():
  *	Handle vi actions.
  */
 private el_action_t
-cv_action(EditLine *el, int c)
+cv_action(EditLine *el, Int c)
 {
 
 	if (el->el_chared.c_vcmd.action != NOP) {
 		/* 'cc', 'dd' and (possibly) friends */
-		if (c != el->el_chared.c_vcmd.action)
+		if (c != (Int)el->el_chared.c_vcmd.action)
 			return CC_ERROR;
 
 		if (!(c & YANK))
 			cv_undo(el);
 		cv_yank(el, el->el_line.buffer,
-			    el->el_line.lastchar - el->el_line.buffer);
+		    (int)(el->el_line.lastchar - el->el_line.buffer));
 		el->el_chared.c_vcmd.action = NOP;
 		el->el_chared.c_vcmd.pos = 0;
 		if (!(c & YANK)) {
@@ -77,26 +78,26 @@ cv_action(EditLine *el, int c)
 		if (c & INSERT)
 			el->el_map.current = el->el_map.key;
 
-		return (CC_REFRESH);
+		return CC_REFRESH;
 	}
 	el->el_chared.c_vcmd.pos = el->el_line.cursor;
 	el->el_chared.c_vcmd.action = c;
-	return (CC_ARGHACK);
+	return CC_ARGHACK;
 }
 
 /* cv_paste():
  *	Paste previous deletion before or after the cursor
  */
 private el_action_t
-cv_paste(EditLine *el, int c)
+cv_paste(EditLine *el, Int c)
 {
 	c_kill_t *k = &el->el_chared.c_kill;
-	int len = k->last - k->buf;
+	size_t len = (size_t)(k->last - k->buf);
 
 	if (k->buf == NULL || len == 0)
-		return (CC_ERROR);
+		return CC_ERROR;
 #ifdef DEBUG_PASTE
-	(void) fprintf(el->el_errfile, "Paste: \"%.*s\"\n", len, k->buf);
+	(void) fprintf(el->el_errfile, "Paste: \"%.*s\"\n", (int)len, k->buf);
 #endif
 
 	cv_undo(el);
@@ -104,12 +105,13 @@ cv_paste(EditLine *el, int c)
 	if (!c && el->el_line.cursor < el->el_line.lastchar)
 		el->el_line.cursor++;
 
-	c_insert(el, len);
+	c_insert(el, (int)len);
 	if (el->el_line.cursor + len > el->el_line.lastchar)
-		return (CC_ERROR);
-	(void) memcpy(el->el_line.cursor, k->buf, len +0u);
+		return CC_ERROR;
+	(void) memcpy(el->el_line.cursor, k->buf, len *
+	    sizeof(*el->el_line.cursor));
 
-	return (CC_REFRESH);
+	return CC_REFRESH;
 }
 
 
@@ -119,10 +121,10 @@ cv_paste(EditLine *el, int c)
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_paste_next(EditLine *el, int c __attribute__((__unused__)))
+vi_paste_next(EditLine *el, Int c __attribute__((__unused__)))
 {
 
-	return (cv_paste(el, 0));
+	return cv_paste(el, 0);
 }
 
 
@@ -132,10 +134,10 @@ vi_paste_next(EditLine *el, int c __attr
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_paste_prev(EditLine *el, int c __attribute__((__unused__)))
+vi_paste_prev(EditLine *el, Int c __attribute__((__unused__)))
 {
 
-	return (cv_paste(el, 1));
+	return cv_paste(el, 1);
 }
 
 
@@ -145,11 +147,11 @@ vi_paste_prev(EditLine *el, int c __attr
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_prev_big_word(EditLine *el, int c __attribute__((__unused__)))
+vi_prev_big_word(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	if (el->el_line.cursor == el->el_line.buffer)
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	el->el_line.cursor = cv_prev_word(el->el_line.cursor,
 	    el->el_line.buffer,
@@ -158,9 +160,9 @@ vi_prev_big_word(EditLine *el, int c __a
 
 	if (el->el_chared.c_vcmd.action != NOP) {
 		cv_delfini(el);
-		return (CC_REFRESH);
+		return CC_REFRESH;
 	}
-	return (CC_CURSOR);
+	return CC_CURSOR;
 }
 
 
@@ -170,11 +172,11 @@ vi_prev_big_word(EditLine *el, int c __a
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_prev_word(EditLine *el, int c __attribute__((__unused__)))
+vi_prev_word(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	if (el->el_line.cursor == el->el_line.buffer)
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	el->el_line.cursor = cv_prev_word(el->el_line.cursor,
 	    el->el_line.buffer,
@@ -183,9 +185,9 @@ vi_prev_word(EditLine *el, int c __attri
 
 	if (el->el_chared.c_vcmd.action != NOP) {
 		cv_delfini(el);
-		return (CC_REFRESH);
+		return CC_REFRESH;
 	}
-	return (CC_CURSOR);
+	return CC_CURSOR;
 }
 
 
@@ -195,11 +197,11 @@ vi_prev_word(EditLine *el, int c __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_next_big_word(EditLine *el, int c __attribute__((__unused__)))
+vi_next_big_word(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	if (el->el_line.cursor >= el->el_line.lastchar - 1)
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	el->el_line.cursor = cv_next_word(el, el->el_line.cursor,
 	    el->el_line.lastchar, el->el_state.argument, cv__isWord);
@@ -207,9 +209,9 @@ vi_next_big_word(EditLine *el, int c __a
 	if (el->el_map.type == MAP_VI)
 		if (el->el_chared.c_vcmd.action != NOP) {
 			cv_delfini(el);
-			return (CC_REFRESH);
+			return CC_REFRESH;
 		}
-	return (CC_CURSOR);
+	return CC_CURSOR;
 }
 
 
@@ -219,11 +221,11 @@ vi_next_big_word(EditLine *el, int c __a
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_next_word(EditLine *el, int c __attribute__((__unused__)))
+vi_next_word(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	if (el->el_line.cursor >= el->el_line.lastchar - 1)
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	el->el_line.cursor = cv_next_word(el, el->el_line.cursor,
 	    el->el_line.lastchar, el->el_state.argument, cv__isword);
@@ -231,9 +233,9 @@ vi_next_word(EditLine *el, int c __attri
 	if (el->el_map.type == MAP_VI)
 		if (el->el_chared.c_vcmd.action != NOP) {
 			cv_delfini(el);
-			return (CC_REFRESH);
+			return CC_REFRESH;
 		}
-	return (CC_CURSOR);
+	return CC_CURSOR;
 }
 
 
@@ -242,20 +244,20 @@ vi_next_word(EditLine *el, int c __attri
  *	[~]
  */
 protected el_action_t
-vi_change_case(EditLine *el, int c)
+vi_change_case(EditLine *el, Int c)
 {
 	int i;
 
 	if (el->el_line.cursor >= el->el_line.lastchar)
-		return (CC_ERROR);
+		return CC_ERROR;
 	cv_undo(el);
 	for (i = 0; i < el->el_state.argument; i++) {
 
-		c = *(unsigned char *)el->el_line.cursor;
-		if (isupper(c))
-			*el->el_line.cursor = tolower(c);
-		else if (islower(c))
-			*el->el_line.cursor = toupper(c);
+		c = *el->el_line.cursor;
+		if (Isupper(c))
+			*el->el_line.cursor = Tolower(c);
+		else if (Islower(c))
+			*el->el_line.cursor = Toupper(c);
 
 		if (++el->el_line.cursor >= el->el_line.lastchar) {
 			el->el_line.cursor--;
@@ -274,14 +276,14 @@ vi_change_case(EditLine *el, int c)
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_change_meta(EditLine *el, int c __attribute__((__unused__)))
+vi_change_meta(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	/*
          * Delete with insert == change: first we delete and then we leave in
          * insert mode.
          */
-	return (cv_action(el, DELETE | INSERT));
+	return cv_action(el, DELETE | INSERT);
 }
 
 
@@ -291,13 +293,13 @@ vi_change_meta(EditLine *el, int c __att
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_insert_at_bol(EditLine *el, int c __attribute__((__unused__)))
+vi_insert_at_bol(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	el->el_line.cursor = el->el_line.buffer;
 	cv_undo(el);
 	el->el_map.current = el->el_map.key;
-	return (CC_CURSOR);
+	return CC_CURSOR;
 }
 
 
@@ -307,7 +309,7 @@ vi_insert_at_bol(EditLine *el, int c __a
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_replace_char(EditLine *el, int c __attribute__((__unused__)))
+vi_replace_char(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	if (el->el_line.cursor >= el->el_line.lastchar)
@@ -316,7 +318,7 @@ vi_replace_char(EditLine *el, int c __at
 	el->el_map.current = el->el_map.key;
 	el->el_state.inputmode = MODE_REPLACE_1;
 	cv_undo(el);
-	return (CC_ARGHACK);
+	return CC_ARGHACK;
 }
 
 
@@ -326,13 +328,13 @@ vi_replace_char(EditLine *el, int c __at
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_replace_mode(EditLine *el, int c __attribute__((__unused__)))
+vi_replace_mode(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	el->el_map.current = el->el_map.key;
 	el->el_state.inputmode = MODE_REPLACE;
 	cv_undo(el);
-	return (CC_NORM);
+	return CC_NORM;
 }
 
 
@@ -342,12 +344,12 @@ vi_replace_mode(EditLine *el, int c __at
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_substitute_char(EditLine *el, int c __attribute__((__unused__)))
+vi_substitute_char(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	c_delafter(el, el->el_state.argument);
 	el->el_map.current = el->el_map.key;
-	return (CC_REFRESH);
+	return CC_REFRESH;
 }
 
 
@@ -357,15 +359,15 @@ vi_substitute_char(EditLine *el, int c _
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_substitute_line(EditLine *el, int c __attribute__((__unused__)))
+vi_substitute_line(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	cv_undo(el);
 	cv_yank(el, el->el_line.buffer,
-		    el->el_line.lastchar - el->el_line.buffer);
+	    (int)(el->el_line.lastchar - el->el_line.buffer));
 	(void) em_kill_line(el, 0);
 	el->el_map.current = el->el_map.key;
-	return (CC_REFRESH);
+	return CC_REFRESH;
 }
 
 
@@ -375,15 +377,15 @@ vi_substitute_line(EditLine *el, int c _
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_change_to_eol(EditLine *el, int c __attribute__((__unused__)))
+vi_change_to_eol(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	cv_undo(el);
 	cv_yank(el, el->el_line.cursor,
-		    el->el_line.lastchar - el->el_line.cursor);
+	    (int)(el->el_line.lastchar - el->el_line.cursor));
 	(void) ed_kill_line(el, 0);
 	el->el_map.current = el->el_map.key;
-	return (CC_REFRESH);
+	return CC_REFRESH;
 }
 
 
@@ -393,12 +395,12 @@ vi_change_to_eol(EditLine *el, int c __a
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_insert(EditLine *el, int c __attribute__((__unused__)))
+vi_insert(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	el->el_map.current = el->el_map.key;
 	cv_undo(el);
-	return (CC_NORM);
+	return CC_NORM;
 }
 
 
@@ -408,7 +410,7 @@ vi_insert(EditLine *el, int c __attribut
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_add(EditLine *el, int c __attribute__((__unused__)))
+vi_add(EditLine *el, Int c __attribute__((__unused__)))
 {
 	int ret;
 
@@ -423,7 +425,7 @@ vi_add(EditLine *el, int c __attribute__
 
 	cv_undo(el);
 
-	return (ret);
+	return (el_action_t)ret;
 }
 
 
@@ -433,13 +435,13 @@ vi_add(EditLine *el, int c __attribute__
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_add_at_eol(EditLine *el, int c __attribute__((__unused__)))
+vi_add_at_eol(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	el->el_map.current = el->el_map.key;
 	el->el_line.cursor = el->el_line.lastchar;
 	cv_undo(el);
-	return (CC_CURSOR);
+	return CC_CURSOR;
 }
 
 
@@ -449,10 +451,10 @@ vi_add_at_eol(EditLine *el, int c __attr
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_delete_meta(EditLine *el, int c __attribute__((__unused__)))
+vi_delete_meta(EditLine *el, Int c __attribute__((__unused__)))
 {
 
-	return (cv_action(el, DELETE));
+	return cv_action(el, DELETE);
 }
 
 
@@ -462,11 +464,11 @@ vi_delete_meta(EditLine *el, int c __att
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_end_big_word(EditLine *el, int c __attribute__((__unused__)))
+vi_end_big_word(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	if (el->el_line.cursor == el->el_line.lastchar)
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	el->el_line.cursor = cv__endword(el->el_line.cursor,
 	    el->el_line.lastchar, el->el_state.argument, cv__isWord);
@@ -474,9 +476,9 @@ vi_end_big_word(EditLine *el, int c __at
 	if (el->el_chared.c_vcmd.action != NOP) {
 		el->el_line.cursor++;
 		cv_delfini(el);
-		return (CC_REFRESH);
+		return CC_REFRESH;
 	}
-	return (CC_CURSOR);
+	return CC_CURSOR;
 }
 
 
@@ -486,11 +488,11 @@ vi_end_big_word(EditLine *el, int c __at
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_end_word(EditLine *el, int c __attribute__((__unused__)))
+vi_end_word(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	if (el->el_line.cursor == el->el_line.lastchar)
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	el->el_line.cursor = cv__endword(el->el_line.cursor,
 	    el->el_line.lastchar, el->el_state.argument, cv__isword);
@@ -498,9 +500,9 @@ vi_end_word(EditLine *el, int c __attrib
 	if (el->el_chared.c_vcmd.action != NOP) {
 		el->el_line.cursor++;
 		cv_delfini(el);
-		return (CC_REFRESH);
+		return CC_REFRESH;
 	}
-	return (CC_CURSOR);
+	return CC_CURSOR;
 }
 
 
@@ -510,7 +512,7 @@ vi_end_word(EditLine *el, int c __attrib
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_undo(EditLine *el, int c __attribute__((__unused__)))
+vi_undo(EditLine *el, Int c __attribute__((__unused__)))
 {
 	c_undo_t un = el->el_chared.c_undo;
 
@@ -520,13 +522,14 @@ vi_undo(EditLine *el, int c __attribute_
 	/* switch line buffer and undo buffer */
 	el->el_chared.c_undo.buf = el->el_line.buffer;
 	el->el_chared.c_undo.len = el->el_line.lastchar - el->el_line.buffer;
-	el->el_chared.c_undo.cursor = el->el_line.cursor - el->el_line.buffer;
+	el->el_chared.c_undo.cursor =
+	    (int)(el->el_line.cursor - el->el_line.buffer);
 	el->el_line.limit = un.buf + (el->el_line.limit - el->el_line.buffer);
 	el->el_line.buffer = un.buf;
 	el->el_line.cursor = un.buf + un.cursor;
 	el->el_line.lastchar = un.buf + un.len;
 
-	return (CC_REFRESH);
+	return CC_REFRESH;
 }
 
 
@@ -536,7 +539,7 @@ vi_undo(EditLine *el, int c __attribute_
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_command_mode(EditLine *el, int c __attribute__((__unused__)))
+vi_command_mode(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	/* [Esc] cancels pending action */
@@ -551,7 +554,7 @@ vi_command_mode(EditLine *el, int c __at
 	if (el->el_line.cursor > el->el_line.buffer)
 		el->el_line.cursor--;
 #endif
-	return (CC_CURSOR);
+	return CC_CURSOR;
 }
 
 
@@ -560,7 +563,7 @@ vi_command_mode(EditLine *el, int c __at
  *	[0]
  */
 protected el_action_t
-vi_zero(EditLine *el, int c)
+vi_zero(EditLine *el, Int c)
 {
 
 	if (el->el_state.doingarg)
@@ -569,9 +572,9 @@ vi_zero(EditLine *el, int c)
 	el->el_line.cursor = el->el_line.buffer;
 	if (el->el_chared.c_vcmd.action != NOP) {
 		cv_delfini(el);
-		return (CC_REFRESH);
+		return CC_REFRESH;
 	}
-	return (CC_CURSOR);
+	return CC_CURSOR;
 }
 
 
@@ -581,15 +584,15 @@ vi_zero(EditLine *el, int c)
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_delete_prev_char(EditLine *el, int c __attribute__((__unused__)))
+vi_delete_prev_char(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	if (el->el_line.cursor <= el->el_line.buffer)
-		return (CC_ERROR);
+		return CC_ERROR;
 
 	c_delbefore1(el);
 	el->el_line.cursor--;
-	return (CC_REFRESH);
+	return CC_REFRESH;
 }
 
 
@@ -599,32 +602,32 @@ vi_delete_prev_char(EditLine *el, int c 
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_list_or_eof(EditLine *el, int c)
+vi_list_or_eof(EditLine *el, Int c)
 {
 
 	if (el->el_line.cursor == el->el_line.lastchar) {
 		if (el->el_line.cursor == el->el_line.buffer) {
-			term_writec(el, c);	/* then do a EOF */
-			return (CC_EOF);
+			terminal_writec(el, c);	/* then do a EOF */
+			return CC_EOF;
 		} else {
 			/*
 			 * Here we could list completions, but it is an
 			 * error right now
 			 */
-			term_beep(el);
-			return (CC_ERROR);
+			terminal_beep(el);
+			return CC_ERROR;
 		}
 	} else {
 #ifdef notyet
 		re_goto_bottom(el);
 		*el->el_line.lastchar = '\0';	/* just in case */
-		return (CC_LIST_CHOICES);
+		return CC_LIST_CHOICES;
 #else
 		/*
 		 * Just complain for now.
 		 */
-		term_beep(el);
-		return (CC_ERROR);
+		terminal_beep(el);
+		return CC_ERROR;
 #endif
 	}
 }
@@ -636,18 +639,18 @@ vi_list_or_eof(EditLine *el, int c)
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_kill_line_prev(EditLine *el, int c __attribute__((__unused__)))
+vi_kill_line_prev(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *kp, *cp;
+	Char *kp, *cp;
 
 	cp = el->el_line.buffer;
 	kp = el->el_chared.c_kill.buf;
 	while (cp < el->el_line.cursor)
 		*kp++ = *cp++;	/* copy it */
 	el->el_chared.c_kill.last = kp;
-	c_delbefore(el, el->el_line.cursor - el->el_line.buffer);
+	c_delbefore(el, (int)(el->el_line.cursor - el->el_line.buffer));
 	el->el_line.cursor = el->el_line.buffer;	/* zap! */
-	return (CC_REFRESH);
+	return CC_REFRESH;
 }
 
 
@@ -657,10 +660,10 @@ vi_kill_line_prev(EditLine *el, int c __
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_search_prev(EditLine *el, int c __attribute__((__unused__)))
+vi_search_prev(EditLine *el, Int c __attribute__((__unused__)))
 {
 
-	return (cv_search(el, ED_SEARCH_PREV_HISTORY));
+	return cv_search(el, ED_SEARCH_PREV_HISTORY);
 }
 
 
@@ -670,10 +673,10 @@ vi_search_prev(EditLine *el, int c __att
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_search_next(EditLine *el, int c __attribute__((__unused__)))
+vi_search_next(EditLine *el, Int c __attribute__((__unused__)))
 {
 
-	return (cv_search(el, ED_SEARCH_NEXT_HISTORY));
+	return cv_search(el, ED_SEARCH_NEXT_HISTORY);
 }
 
 
@@ -683,13 +686,13 @@ vi_search_next(EditLine *el, int c __att
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_repeat_search_next(EditLine *el, int c __attribute__((__unused__)))
+vi_repeat_search_next(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	if (el->el_search.patlen == 0)
-		return (CC_ERROR);
+		return CC_ERROR;
 	else
-		return (cv_repeat_srch(el, el->el_search.patdir));
+		return cv_repeat_srch(el, el->el_search.patdir);
 }
 
 
@@ -699,11 +702,11 @@ vi_repeat_search_next(EditLine *el, int 
  */
 /*ARGSUSED*/
 protected el_action_t
-vi_repeat_search_prev(EditLine *el, int c __attribute__((__unused__)))
+vi_repeat_search_prev(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	if (el->el_search.patlen == 0)
-		return (CC_ERROR);
+		return CC_ERROR;
 	else
 		return (cv_repeat_srch(el,
 		    el->el_search.patdir == ED_SEARCH_PREV_HISTORY ?
@@ -717,7 +720,7 @@ vi_repeat_search_prev(EditLine *el, int 
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_next_char(EditLine *el, int c __attribute__((__unused__)))
+vi_next_char(EditLine *el, Int c __attribute__((__unused__)))
 {
 	return cv_csearch(el, CHAR_FWD, -1, el->el_state.argument, 0);
 }
@@ -729,7 +732,7 @@ vi_next_char(EditLine *el, int c __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_prev_char(EditLine *el, int c __attribute__((__unused__)))
+vi_prev_char(EditLine *el, Int c __attribute__((__unused__)))
 {
 	return cv_csearch(el, CHAR_BACK, -1, el->el_state.argument, 0);
 }
@@ -741,7 +744,7 @@ vi_prev_char(EditLine *el, int c __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_to_next_char(EditLine *el, int c __attribute__((__unused__)))
+vi_to_next_char(EditLine *el, Int c __attribute__((__unused__)))
 {
 	return cv_csearch(el, CHAR_FWD, -1, el->el_state.argument, 1);
 }
@@ -753,7 +756,7 @@ vi_to_next_char(EditLine *el, int c __at
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_to_prev_char(EditLine *el, int c __attribute__((__unused__)))
+vi_to_prev_char(EditLine *el, Int c __attribute__((__unused__)))
 {
 	return cv_csearch(el, CHAR_BACK, -1, el->el_state.argument, 1);
 }
@@ -765,7 +768,7 @@ vi_to_prev_char(EditLine *el, int c __at
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_repeat_next_char(EditLine *el, int c __attribute__((__unused__)))
+vi_repeat_next_char(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	return cv_csearch(el, el->el_search.chadir, el->el_search.chacha,
@@ -779,7 +782,7 @@ vi_repeat_next_char(EditLine *el, int c 
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_repeat_prev_char(EditLine *el, int c __attribute__((__unused__)))
+vi_repeat_prev_char(EditLine *el, Int c __attribute__((__unused__)))
 {
 	el_action_t r;
 	int dir = el->el_search.chadir;
@@ -797,20 +800,20 @@ vi_repeat_prev_char(EditLine *el, int c 
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_match(EditLine *el, int c __attribute__((__unused__)))
+vi_match(EditLine *el, Int c __attribute__((__unused__)))
 {
-	const char match_chars[] = "()[]{}";
-	char *cp;
-	int delta, i, count;
-	char o_ch, c_ch;
+	const Char match_chars[] = STR("()[]{}");
+	Char *cp;
+	size_t delta, i, count;
+	Char o_ch, c_ch;
 
 	*el->el_line.lastchar = '\0';		/* just in case */
 
-	i = strcspn(el->el_line.cursor, match_chars);
+	i = Strcspn(el->el_line.cursor, match_chars);
 	o_ch = el->el_line.cursor[i];
 	if (o_ch == 0)
 		return CC_ERROR;
-	delta = strchr(match_chars, o_ch) - match_chars;
+	delta = (size_t)(Strchr(match_chars, o_ch) - match_chars);
 	c_ch = match_chars[delta ^ 1];
 	count = 1;
 	delta = 1 - (delta & 1) * 2;
@@ -833,9 +836,9 @@ vi_match(EditLine *el, int c __attribute
 		if (delta > 0)
 			el->el_line.cursor++;
 		cv_delfini(el);
-		return (CC_REFRESH);
+		return CC_REFRESH;
 	}
-	return (CC_CURSOR);
+	return CC_CURSOR;
 }
 
 /* vi_undo_line():
@@ -844,7 +847,7 @@ vi_match(EditLine *el, int c __attribute
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_undo_line(EditLine *el, int c __attribute__((__unused__)))
+vi_undo_line(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	cv_undo(el);
@@ -858,7 +861,7 @@ vi_undo_line(EditLine *el, int c __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_to_column(EditLine *el, int c __attribute__((__unused__)))
+vi_to_column(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	el->el_line.cursor = el->el_line.buffer;
@@ -872,11 +875,11 @@ vi_to_column(EditLine *el, int c __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_yank_end(EditLine *el, int c __attribute__((__unused__)))
+vi_yank_end(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	cv_yank(el, el->el_line.cursor,
-		el->el_line.lastchar - el->el_line.cursor);
+	    (int)(el->el_line.lastchar - el->el_line.cursor));
 	return CC_REFRESH;
 }
 
@@ -886,7 +889,7 @@ vi_yank_end(EditLine *el, int c __attrib
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_yank(EditLine *el, int c __attribute__((__unused__)))
+vi_yank(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	return cv_action(el, YANK);
@@ -898,7 +901,7 @@ vi_yank(EditLine *el, int c __attribute_
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_comment_out(EditLine *el, int c __attribute__((__unused__)))
+vi_comment_out(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	el->el_line.cursor = el->el_line.buffer;
@@ -915,18 +918,19 @@ vi_comment_out(EditLine *el, int c __att
  * this is against historical precedent...
  */
 #if defined(__weak_reference) && !defined(__FreeBSD__)
-extern char *get_alias_text(const char *) __weak_reference(get_alias_text);
+__weakref_visible char *my_get_alias_text(const char *)
+    __weak_reference(get_alias_text);
 #endif
 protected el_action_t
 /*ARGSUSED*/
 vi_alias(EditLine *el __attribute__((__unused__)),
-	 int c __attribute__((__unused__)))
+	 Int c __attribute__((__unused__)))
 {
 #if defined(__weak_reference) && !defined(__FreeBSD__)
 	char alias_name[3];
 	char *alias_text;
 
-	if (get_alias_text == 0) {
+	if (my_get_alias_text == 0) {
 		return CC_ERROR;
 	}
 
@@ -935,9 +939,9 @@ vi_alias(EditLine *el __attribute__((__u
 	if (el_getc(el, &alias_name[1]) != 1)
 		return CC_ERROR;
 
-	alias_text = get_alias_text(alias_name);
+	alias_text = my_get_alias_text(alias_name);
 	if (alias_text != NULL)
-		el_push(el, alias_text);
+		FUN(el,push)(el, ct_decode_string(alias_text, &el->el_scratch));
 	return CC_NORM;
 #else
 	return CC_ERROR;
@@ -950,14 +954,14 @@ vi_alias(EditLine *el __attribute__((__u
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_to_history_line(EditLine *el, int c __attribute__((__unused__)))
+vi_to_history_line(EditLine *el, Int c __attribute__((__unused__)))
 {
 	int sv_event_no = el->el_history.eventno;
 	el_action_t rval;
 
 
 	if (el->el_history.eventno == 0) {
-		 (void) strncpy(el->el_history.buf, el->el_line.buffer,
+		 (void) Strncpy(el->el_history.buf, el->el_line.buffer,
 		     EL_BUFSIZ);
 		 el->el_history.last = el->el_history.buf +
 			 (el->el_line.lastchar - el->el_line.buffer);
@@ -995,14 +999,19 @@ vi_to_history_line(EditLine *el, int c _
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_histedit(EditLine *el, int c __attribute__((__unused__)))
+vi_histedit(EditLine *el, Int c __attribute__((__unused__)))
 {
 	int fd;
 	pid_t pid;
-	int st;
+	ssize_t st;
+	int status;
 	char tempfile[] = "/tmp/histedit.XXXXXXXXXX";
 	char *cp;
+	size_t len;
+	Char *line;
+	mbstate_t state;
 
+	memset(&state, 0, sizeof(mbstate_t));
 	if (el->el_state.doingarg) {
 		if (vi_to_history_line(el, 0) == CC_ERROR)
 			return CC_ERROR;
@@ -1011,16 +1020,35 @@ vi_histedit(EditLine *el, int c __attrib
 	fd = mkstemp(tempfile);
 	if (fd < 0)
 		return CC_ERROR;
-	cp = el->el_line.buffer;
-	if (write(fd, cp, el->el_line.lastchar - cp +0u) == -1)
+	len = (size_t)(el->el_line.lastchar - el->el_line.buffer);
+#define TMP_BUFSIZ (EL_BUFSIZ * MB_LEN_MAX)
+	cp = el_malloc(TMP_BUFSIZ * sizeof(*cp));
+	if (cp == NULL) {
+		unlink(tempfile);
+		close(fd);
+		return CC_ERROR;
+	}
+	line = el_malloc(len * sizeof(*line));
+	if (line == NULL) {
+		el_free(cp);
+		return CC_ERROR;
+	}
+	Strncpy(line, el->el_line.buffer, len);
+	line[len] = '\0';
+	wcsrtombs(cp, (const wchar_t **) &line, TMP_BUFSIZ - 1, &state);
+	cp[TMP_BUFSIZ - 1] = '\0';
+	len = strlen(cp);
+	if (write(fd, cp, len) == -1)
           goto error;
-	if (write(fd, "\n", 1) == -1)
+	if (write(fd, "\n", (size_t)1) == -1)
           goto error;
 	pid = fork();
 	switch (pid) {
 	case -1:
 		close(fd);
 		unlink(tempfile);
+		el_free(cp);
+                el_free(line);
 		return CC_ERROR;
 	case 0:
 		close(fd);
@@ -1028,14 +1056,25 @@ vi_histedit(EditLine *el, int c __attrib
 		exit(0);
 		/*NOTREACHED*/
 	default:
-		while (waitpid(pid, &st, 0) != pid)
+		while (waitpid(pid, &status, 0) != pid)
 			continue;
-		lseek(fd, 0ll, SEEK_SET);
-		st = read(fd, cp, el->el_line.limit - cp +0u);
-		if (st > 0 && cp[st - 1] == '\n')
-			st--;
-		el->el_line.cursor = cp;
-		el->el_line.lastchar = cp + st;
+		lseek(fd, (off_t)0, SEEK_SET);
+		st = read(fd, cp, TMP_BUFSIZ);
+		if (st > 0) {
+			len = (size_t)(el->el_line.lastchar -
+			    el->el_line.buffer);
+			memset(&state, 0, sizeof(mbstate_t));
+			len = mbsrtowcs(el->el_line.buffer,
+                                        (const char**) &cp, len, &state);
+			if (len > 0 && el->el_line.buffer[len -1] == '\n')
+				--len;
+		}
+		else
+			len = 0;
+                el->el_line.cursor = el->el_line.buffer;
+                el->el_line.lastchar = el->el_line.buffer + len;
+		el_free(cp);
+                el_free(line);
 		break;
 	}
 
@@ -1059,34 +1098,35 @@ error:
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_history_word(EditLine *el, int c __attribute__((__unused__)))
+vi_history_word(EditLine *el, Int c __attribute__((__unused__)))
 {
-	const char *wp = HIST_FIRST(el);
-	const char *wep, *wsp;
+	const Char *wp = HIST_FIRST(el);
+	const Char *wep, *wsp;
 	int len;
-	char *cp;
-	const char *lim;
+	Char *cp;
+	const Char *lim;
 
 	if (wp == NULL)
 		return CC_ERROR;
 
 	wep = wsp = 0;
 	do {
-		while (isspace((unsigned char)*wp))
+		while (Isspace(*wp))
 			wp++;
 		if (*wp == 0)
 			break;
 		wsp = wp;
-		while (*wp && !isspace((unsigned char)*wp))
+		while (*wp && !Isspace(*wp))
 			wp++;
 		wep = wp;
-	} while ((!el->el_state.doingarg || --el->el_state.argument > 0) && *wp != 0);
+	} while ((!el->el_state.doingarg || --el->el_state.argument > 0)
+	    && *wp != 0);
 
 	if (wsp == 0 || (el->el_state.doingarg && el->el_state.argument != 0))
 		return CC_ERROR;
 
 	cv_undo(el);
-	len = wep - wsp;
+	len = (int)(wep - wsp);
 	if (el->el_line.cursor < el->el_line.lastchar)
 		el->el_line.cursor++;
 	c_insert(el, len + 1);
@@ -1108,7 +1148,7 @@ vi_history_word(EditLine *el, int c __at
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_redo(EditLine *el, int c __attribute__((__unused__)))
+vi_redo(EditLine *el, Int c __attribute__((__unused__)))
 {
 	c_redo_t *r = &el->el_chared.c_redo;
 
@@ -1124,10 +1164,10 @@ vi_redo(EditLine *el, int c __attribute_
 			/* sanity */
 			r->pos = r->lim - 1;
 		r->pos[0] = 0;
-		el_push(el, r->buf);
+		FUN(el,push)(el, r->buf);
 	}
 
 	el->el_state.thiscmd = r->cmd;
 	el->el_state.thisch = r->ch;
-	return  (*el->el_map.func[r->cmd])(el, r->ch);
+	return (*el->el_map.func[r->cmd])(el, r->ch);
 }
diff -pruN 5.1.58-1/configure 5.1.61-2/configure
--- 5.1.58-1/configure	2011-07-01 15:24:10.000000000 +0000
+++ 5.1.61-2/configure	2011-12-16 19:07:43.000000000 +0000
@@ -16,7 +16,7 @@ CHARSETS_AVAILABLE="binary armscii8 asci
 CHARSETS_COMPLEX="big5 cp1250 cp932 eucjpms euckr gb2312 gbk latin1 latin2 sjis tis620 ucs2 ujis utf8"
 
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.63 for MySQL Server 5.1.58.
+# Generated by GNU Autoconf 2.63 for MySQL Server 5.1.61.
 #
 # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
 # 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
@@ -759,8 +759,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
 # Identity of this package.
 PACKAGE_NAME='MySQL Server'
 PACKAGE_TARNAME='mysql'
-PACKAGE_VERSION='5.1.58'
-PACKAGE_STRING='MySQL Server 5.1.58'
+PACKAGE_VERSION='5.1.61'
+PACKAGE_STRING='MySQL Server 5.1.61'
 PACKAGE_BUGREPORT=''
 
 ac_unique_file="sql/mysqld.cc"
@@ -1761,7 +1761,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures MySQL Server 5.1.58 to adapt to many kinds of systems.
+\`configure' configures MySQL Server 5.1.61 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1832,7 +1832,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of MySQL Server 5.1.58:";;
+     short | recursive ) echo "Configuration of MySQL Server 5.1.61:";;
    esac
   cat <<\_ACEOF
 
@@ -2146,7 +2146,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-MySQL Server configure 5.1.58
+MySQL Server configure 5.1.61
 generated by GNU Autoconf 2.63
 
 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -2160,7 +2160,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by MySQL Server $as_me 5.1.58, which was
+It was created by MySQL Server $as_me 5.1.61, which was
 generated by GNU Autoconf 2.63.  Invocation command line was
 
   $ $0 $@
@@ -3008,7 +3008,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='mysql'
- VERSION='5.1.58'
+ VERSION='5.1.61'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -44061,7 +44061,7 @@ $as_echo "yes" >&6; }
           # autoconf doesn't provide an automatic way to configure DIST_SUBDIRS of
           # a subdir; for our purposes, it's enough to just check for existing
           # Makefile.am files and add them in here
-          ac_config_files="$ac_config_files storage/ndb/Makefile storage/ndb/src/common/logger/Makefile storage/ndb/src/common/debugger/signaldata/Makefile storage/ndb/src/common/debugger/Makefile storage/ndb/src/common/portlib/Makefile storage/ndb/src/common/Makefile storage/ndb/src/common/mgmcommon/Makefile storage/ndb/src/common/util/Makefile storage/ndb/src/common/transporter/Makefile storage/ndb/src/mgmapi/Makefile storage/ndb/src/kernel/blocks/dbtup/Makefile storage/ndb/src/kernel/blocks/backup/Makefile storage/ndb/src/kernel/blocks/Makefile storage/ndb/src/kernel/blocks/dbdict/Makefile storage/ndb/src/kernel/blocks/dbdih/Makefile storage/ndb/src/kernel/blocks/dblqh/Makefile storage/ndb/src/kernel/error/Makefile storage/ndb/src/kernel/vm/Makefile storage/ndb/src/kernel/Makefile storage/ndb/src/Makefile storage/ndb/src/cw/cpcd/Makefile storage/ndb/src/cw/Makefile storage/ndb/src/mgmclient/Makefile storage/ndb/src/ndbapi/Makefile storage/ndb/src/mgmsrv/Makefile storage/ndb/test/ndbapi/bank/Makefile storage/ndb/test/ndbapi/Makefile storage/ndb/test/Makefile storage/ndb/test/run-test/Makefile storage/ndb/test/tools/Makefile storage/ndb/test/src/Makefile storage/ndb/tools/Makefile storage/ndb/docs/Makefile storage/ndb/include/Makefile"
+          ac_config_files="$ac_config_files storage/ndb/tools/Makefile storage/ndb/include/Makefile storage/ndb/docs/Makefile storage/ndb/Makefile storage/ndb/test/src/Makefile storage/ndb/test/tools/Makefile storage/ndb/test/Makefile storage/ndb/test/run-test/Makefile storage/ndb/test/ndbapi/bank/Makefile storage/ndb/test/ndbapi/Makefile storage/ndb/src/mgmclient/Makefile storage/ndb/src/mgmsrv/Makefile storage/ndb/src/ndbapi/Makefile storage/ndb/src/common/portlib/Makefile storage/ndb/src/common/util/Makefile storage/ndb/src/common/Makefile storage/ndb/src/common/mgmcommon/Makefile storage/ndb/src/common/logger/Makefile storage/ndb/src/common/debugger/signaldata/Makefile storage/ndb/src/common/debugger/Makefile storage/ndb/src/common/transporter/Makefile storage/ndb/src/mgmapi/Makefile storage/ndb/src/Makefile storage/ndb/src/cw/Makefile storage/ndb/src/cw/cpcd/Makefile storage/ndb/src/kernel/Makefile storage/ndb/src/kernel/vm/Makefile storage/ndb/src/kernel/error/Makefile storage/ndb/src/kernel/blocks/Makefile storage/ndb/src/kernel/blocks/dbdict/Makefile storage/ndb/src/kernel/blocks/backup/Makefile storage/ndb/src/kernel/blocks/dbtup/Makefile storage/ndb/src/kernel/blocks/dblqh/Makefile storage/ndb/src/kernel/blocks/dbdih/Makefile"
 
 
 
@@ -49953,7 +49953,7 @@ $as_echo_n "checking \"for man pages to 
     MAN_DROP="$MAN_DROP embedded"
     grep -v 'embedded' $MANLISTFIL > $TMPLISTFIL ; mv -f $TMPLISTFIL $MANLISTFIL
   fi
-  if test X"$with_plugin_innobase" != Xyes
+  if test X"$with_plugin_innobase" != Xyes -a X"$with_plugin_innodb_plugin" != Xyes
   then
     MAN_DROP="$MAN_DROP innodb"
     grep -v 'inno' $MANLISTFIL > $TMPLISTFIL ; mv -f $TMPLISTFIL $MANLISTFIL
@@ -50059,7 +50059,7 @@ then
 fi
 
 # "innochecksum" is not in the "innobase/" subdirectory, but should be switched
- if test X"$with_plugin_innobase" = Xyes; then
+ if test X"$with_plugin_innobase" = Xyes -o X"$with_plugin_innodb_plugin" = Xyes ; then
   BUILD_INNODB_TOOLS_TRUE=
   BUILD_INNODB_TOOLS_FALSE='#'
 else
@@ -50852,7 +50852,7 @@ exec 6>&1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by MySQL Server $as_me 5.1.58, which was
+This file was extended by MySQL Server $as_me 5.1.61, which was
 generated by GNU Autoconf 2.63.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -50915,7 +50915,7 @@ Report bugs to <bug-autoconf@gnu.org>."
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_version="\\
-MySQL Server config.status 5.1.58
+MySQL Server config.status 5.1.61
 configured by $0, generated by GNU Autoconf 2.63,
   with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 
@@ -51414,40 +51414,40 @@ do
     "storage/innodb_plugin/Makefile") CONFIG_FILES="$CONFIG_FILES storage/innodb_plugin/Makefile" ;;
     "storage/myisam/Makefile") CONFIG_FILES="$CONFIG_FILES storage/myisam/Makefile" ;;
     "storage/myisammrg/Makefile") CONFIG_FILES="$CONFIG_FILES storage/myisammrg/Makefile" ;;
+    "storage/ndb/tools/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/tools/Makefile" ;;
+    "storage/ndb/include/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/include/Makefile" ;;
+    "storage/ndb/docs/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/docs/Makefile" ;;
     "storage/ndb/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/Makefile" ;;
-    "storage/ndb/src/common/logger/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/common/logger/Makefile" ;;
-    "storage/ndb/src/common/debugger/signaldata/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/common/debugger/signaldata/Makefile" ;;
-    "storage/ndb/src/common/debugger/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/common/debugger/Makefile" ;;
+    "storage/ndb/test/src/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/test/src/Makefile" ;;
+    "storage/ndb/test/tools/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/test/tools/Makefile" ;;
+    "storage/ndb/test/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/test/Makefile" ;;
+    "storage/ndb/test/run-test/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/test/run-test/Makefile" ;;
+    "storage/ndb/test/ndbapi/bank/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/test/ndbapi/bank/Makefile" ;;
+    "storage/ndb/test/ndbapi/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/test/ndbapi/Makefile" ;;
+    "storage/ndb/src/mgmclient/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/mgmclient/Makefile" ;;
+    "storage/ndb/src/mgmsrv/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/mgmsrv/Makefile" ;;
+    "storage/ndb/src/ndbapi/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/ndbapi/Makefile" ;;
     "storage/ndb/src/common/portlib/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/common/portlib/Makefile" ;;
+    "storage/ndb/src/common/util/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/common/util/Makefile" ;;
     "storage/ndb/src/common/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/common/Makefile" ;;
     "storage/ndb/src/common/mgmcommon/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/common/mgmcommon/Makefile" ;;
-    "storage/ndb/src/common/util/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/common/util/Makefile" ;;
+    "storage/ndb/src/common/logger/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/common/logger/Makefile" ;;
+    "storage/ndb/src/common/debugger/signaldata/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/common/debugger/signaldata/Makefile" ;;
+    "storage/ndb/src/common/debugger/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/common/debugger/Makefile" ;;
     "storage/ndb/src/common/transporter/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/common/transporter/Makefile" ;;
     "storage/ndb/src/mgmapi/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/mgmapi/Makefile" ;;
-    "storage/ndb/src/kernel/blocks/dbtup/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/kernel/blocks/dbtup/Makefile" ;;
-    "storage/ndb/src/kernel/blocks/backup/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/kernel/blocks/backup/Makefile" ;;
+    "storage/ndb/src/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/Makefile" ;;
+    "storage/ndb/src/cw/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/cw/Makefile" ;;
+    "storage/ndb/src/cw/cpcd/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/cw/cpcd/Makefile" ;;
+    "storage/ndb/src/kernel/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/kernel/Makefile" ;;
+    "storage/ndb/src/kernel/vm/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/kernel/vm/Makefile" ;;
+    "storage/ndb/src/kernel/error/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/kernel/error/Makefile" ;;
     "storage/ndb/src/kernel/blocks/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/kernel/blocks/Makefile" ;;
     "storage/ndb/src/kernel/blocks/dbdict/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/kernel/blocks/dbdict/Makefile" ;;
-    "storage/ndb/src/kernel/blocks/dbdih/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/kernel/blocks/dbdih/Makefile" ;;
+    "storage/ndb/src/kernel/blocks/backup/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/kernel/blocks/backup/Makefile" ;;
+    "storage/ndb/src/kernel/blocks/dbtup/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/kernel/blocks/dbtup/Makefile" ;;
     "storage/ndb/src/kernel/blocks/dblqh/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/kernel/blocks/dblqh/Makefile" ;;
-    "storage/ndb/src/kernel/error/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/kernel/error/Makefile" ;;
-    "storage/ndb/src/kernel/vm/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/kernel/vm/Makefile" ;;
-    "storage/ndb/src/kernel/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/kernel/Makefile" ;;
-    "storage/ndb/src/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/Makefile" ;;
-    "storage/ndb/src/cw/cpcd/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/cw/cpcd/Makefile" ;;
-    "storage/ndb/src/cw/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/cw/Makefile" ;;
-    "storage/ndb/src/mgmclient/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/mgmclient/Makefile" ;;
-    "storage/ndb/src/ndbapi/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/ndbapi/Makefile" ;;
-    "storage/ndb/src/mgmsrv/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/mgmsrv/Makefile" ;;
-    "storage/ndb/test/ndbapi/bank/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/test/ndbapi/bank/Makefile" ;;
-    "storage/ndb/test/ndbapi/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/test/ndbapi/Makefile" ;;
-    "storage/ndb/test/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/test/Makefile" ;;
-    "storage/ndb/test/run-test/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/test/run-test/Makefile" ;;
-    "storage/ndb/test/tools/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/test/tools/Makefile" ;;
-    "storage/ndb/test/src/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/test/src/Makefile" ;;
-    "storage/ndb/tools/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/tools/Makefile" ;;
-    "storage/ndb/docs/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/docs/Makefile" ;;
-    "storage/ndb/include/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/include/Makefile" ;;
+    "storage/ndb/src/kernel/blocks/dbdih/Makefile") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/kernel/blocks/dbdih/Makefile" ;;
     "storage/ndb/src/libndb.ver") CONFIG_FILES="$CONFIG_FILES storage/ndb/src/libndb.ver" ;;
     "storage/ndb/include/ndb_version.h") CONFIG_FILES="$CONFIG_FILES storage/ndb/include/ndb_version.h" ;;
     "storage/ndb/include/ndb_global.h") CONFIG_FILES="$CONFIG_FILES storage/ndb/include/ndb_global.h" ;;
@@ -53129,6 +53129,15 @@ $as_echo "$as_me: WARNING: unrecognized 
 fi
 
 
+# Add warning if user configures with --with-ndbcluster
+if test X"$with_plugin_ndbcluster" = Xyes ; then
+  echo
+  echo This version of MySQL Cluster is no longer maintained.
+  echo Please use the separate sources provided for MySQL Cluster instead.
+  echo See http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster.html
+  echo for more details.
+fi
+
 # The first line "Thank you ..." is checked in ./Do-compile to verify that configure
 # ended sucessfully - don't remove it.
 echo
diff -pruN 5.1.58-1/configure.in 5.1.61-2/configure.in
--- 5.1.58-1/configure.in	2011-07-01 15:22:18.000000000 +0000
+++ 5.1.61-2/configure.in	2011-12-16 19:06:00.000000000 +0000
@@ -12,7 +12,7 @@ dnl
 dnl When changing the major version number please also check the switch
 dnl statement in mysqlbinlog::check_master_version().  You may also need
 dnl to update version.c in ndb.
-AC_INIT([MySQL Server], [5.1.58], [], [mysql])
+AC_INIT([MySQL Server], [5.1.61], [], [mysql])
 
 AC_CONFIG_SRCDIR([sql/mysqld.cc])
 AC_CANONICAL_SYSTEM
@@ -2711,7 +2711,7 @@ then
     MAN_DROP="$MAN_DROP embedded"
     grep -v 'embedded' $MANLISTFIL > $TMPLISTFIL ; mv -f $TMPLISTFIL $MANLISTFIL
   fi
-  if test X"$with_plugin_innobase" != Xyes
+  if test X"$with_plugin_innobase" != Xyes -a X"$with_plugin_innodb_plugin" != Xyes
   then
     MAN_DROP="$MAN_DROP innodb"
     grep -v 'inno' $MANLISTFIL > $TMPLISTFIL ; mv -f $TMPLISTFIL $MANLISTFIL
@@ -2790,7 +2790,7 @@ then
 fi
 
 # "innochecksum" is not in the "innobase/" subdirectory, but should be switched
-AM_CONDITIONAL([BUILD_INNODB_TOOLS], [test X"$with_plugin_innobase" = Xyes])
+AM_CONDITIONAL([BUILD_INNODB_TOOLS], [test X"$with_plugin_innobase" = Xyes -o X"$with_plugin_innodb_plugin" = Xyes ])
 
 # IMPORTANT - do not modify LIBS past this line - this hack is the only way
 # I know to add the static NSS magic if we have static NSS libraries with
@@ -2875,6 +2875,15 @@ AC_CONFIG_COMMANDS_POST(ac_configure_arg
 
 AC_OUTPUT
 
+# Add warning if user configures with --with-ndbcluster
+if test X"$with_plugin_ndbcluster" = Xyes ; then
+  echo 
+  echo This version of MySQL Cluster is no longer maintained.
+  echo Please use the separate sources provided for MySQL Cluster instead.
+  echo See http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster.html
+  echo for more details.
+fi
+
 # The first line "Thank you ..." is checked in ./Do-compile to verify that configure
 # ended sucessfully - don't remove it.
 echo
diff -pruN 5.1.58-1/debian/changelog 5.1.61-2/debian/changelog
--- 5.1.58-1/debian/changelog	2012-03-16 09:37:06.000000000 +0000
+++ 5.1.61-2/debian/changelog	2012-03-16 09:37:28.000000000 +0000
@@ -1,3 +1,16 @@
+mysql-5.1 (5.1.61-2) unstable; urgency=high
+
+  * SECURITY UPDATE: Unspecified vulnerabilities identified by Oracle.
+    in all versions of MySQL 5.1 earlier than 5.1.61. CVE list is as
+    follows: CVE-2011-2262 CVE-2012-0075 CVE-2012-0087 CVE-2012-0101
+    CVE-2012-0102 CVE-2012-0112 CVE-2012-0113 CVE-2012-0114 CVE-2012-0115
+    CVE-2012-0116 CVE-2012-0118 CVE-2012-0119 CVE-2012-0120 CVE-2012-0484
+    CVE-2012-0485 CVE-2012-0490 CVE-2012-0492. (Closes: #659687)
+  * d/control: gs is now 'ghostscript'
+  * d/control: libreadline5 -> libreadline6
+
+ -- Clint Byrum <clint@ubuntu.com>  Fri, 02 Mar 2012 00:20:47 -0800
+
 mysql-5.1 (5.1.58-1) unstable; urgency=low
 
   * New upstream release.
diff -pruN 5.1.58-1/Docs/INSTALL-BINARY 5.1.61-2/Docs/INSTALL-BINARY
--- 5.1.58-1/Docs/INSTALL-BINARY	1970-01-01 00:00:00.000000000 +0000
+++ 5.1.61-2/Docs/INSTALL-BINARY	2011-12-16 19:07:06.000000000 +0000
@@ -0,0 +1,171 @@
+
+2.2. Installing MySQL from Generic Binaries on Unix/Linux
+
+   Oracle provides a set of binary distributions of MySQL. These
+   include binary distributions in the form of compressed tar files
+   (files with a .tar.gz extension) for a number of platforms, as
+   well as binaries in platform-specific package formats for selected
+   platforms.
+
+   This section covers the installation of MySQL from a compressed
+   tar file binary distribution. For other platform-specific package
+   formats, see the other platform-specific sections. For example,
+   for Windows distributions, see Section 2.3, "Installing MySQL on
+   Microsoft Windows."
+
+   To obtain MySQL, see Section 2.1.3, "How to Get MySQL."
+
+   MySQL compressed tar file binary distributions have names of the
+   form mysql-VERSION-OS.tar.gz, where VERSION is a number (for
+   example, 5.1.62), and OS indicates the type of operating system
+   for which the distribution is intended (for example, pc-linux-i686
+   or winx64).
+
+   To install MySQL from a compressed tar file binary distribution,
+   your system must have GNU gunzip to uncompress the distribution
+   and a reasonable tar to unpack it. If your tar program supports
+   the z option, it can both uncompress and unpack the file.
+
+   GNU tar is known to work. The standard tar provided with some
+   operating systems is not able to unpack the long file names in the
+   MySQL distribution. You should download and install GNU tar, or if
+   available, use a preinstalled version of GNU tar. Usually this is
+   available as gnutar, gtar, or as tar within a GNU or Free Software
+   directory, such as /usr/sfw/bin or /usr/local/bin. GNU tar is
+   available from http://www.gnu.org/software/tar/.
+   Warning
+
+   If you have previously installed MySQL using your operating system
+   native package management system, such as yum or apt-get, you may
+   experience problems installing using a native binary. Make sure
+   your previous MySQL previous installation has been removed
+   entirely (using your package management system), and that any
+   additional files, such as old versions of your data files, have
+   also been removed. You should also check the existence of
+   configuration files such as /etc/my.cnf or the /etc/mysql
+   directory have been deleted.
+
+   If you run into problems and need to file a bug report, please use
+   the instructions in Section 1.7, "How to Report Bugs or Problems."
+
+   On Unix, to install a compressed tar file binary distribution,
+   unpack it at the installation location you choose (typically
+   /usr/local/mysql). This creates the directories shown in the
+   following table.
+
+   Table 2.2. MySQL Installation Layout for Generic Unix/Linux Binary
+   Package
+   Directory Contents of Directory
+   bin Client programs and the mysqld server
+   data Log files, databases
+   docs Manual in Info format
+   man Unix manual pages
+   include Include (header) files
+   lib Libraries
+   scripts mysql_install_db
+   share Miscellaneous support files, including error messages,
+   sample configuration files, SQL for database installation
+   sql-bench Benchmarks
+
+   Debug versions of the mysqld binary are available as mysqld-debug.
+   To compile your own debug version of MySQL from a source
+   distribution, use the appropriate configuration options to enable
+   debugging support. For more information on compiling from source,
+   see Section 2.11, "Installing MySQL from Source."
+
+   To install and use a MySQL binary distribution, the basic command
+   sequence looks like this:
+shell> groupadd mysql
+shell> useradd -r -g mysql mysql
+shell> cd /usr/local
+shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz
+shell> ln -s full-path-to-mysql-VERSION-OS mysql
+shell> cd mysql
+shell> chown -R mysql .
+shell> chgrp -R mysql .
+shell> scripts/mysql_install_db --user=mysql
+shell> chown -R root .
+shell> chown -R mysql data
+# Next command is optional
+shell> cp support-files/my-medium.cnf /etc/my.cnf
+shell> bin/mysqld_safe --user=mysql &
+# Next command is optional
+shell> cp support-files/mysql.server /etc/init.d/mysql.server
+
+   A more detailed version of the preceding description for
+   installing a binary distribution follows.
+   Note
+
+   This procedure assumes that you have root (administrator) access
+   to your system. Alternatively, you can prefix each command using
+   the sudo (Linux) or pfexec (OpenSolaris) command.
+
+   The procedure does not set up any passwords for MySQL accounts.
+   After following the procedure, proceed to Section 2.12,
+   "Postinstallation Setup and Testing."
+
+Create a mysql User and Group
+
+   If your system does not already have a user and group for mysqld
+   to run as, you may need to create one. The following commands add
+   the mysql group and the mysql user. You might want to call the
+   user and group something else instead of mysql. If so, substitute
+   the appropriate name in the following instructions. The syntax for
+   useradd and groupadd may differ slightly on different versions of
+   Unix, or they may have different names such as adduser and
+   addgroup.
+shell> groupadd mysql
+shell> useradd -r -g mysql mysql
+
+   Note
+
+   Because the user is required only for ownership purposes, not
+   login purposes, the useradd command uses the -r option to create a
+   user that does not have login permissions to your server host.
+   Omit this option to permit logins for the user (or if your useradd
+   does not support the option).
+
+Obtain and Unpack the Distribution
+
+   Pick the directory under which you want to unpack the distribution
+   and change location into it. The example here unpacks the
+   distribution under /usr/local. The instructions, therefore, assume
+   that you have permission to create files and directories in
+   /usr/local. If that directory is protected, you must perform the
+   installation as root.
+shell> cd /usr/local
+
+   Obtain a distribution file using the instructions in Section
+   2.1.3, "How to Get MySQL." For a given release, binary
+   distributions for all platforms are built from the same MySQL
+   source distribution.
+
+   Unpack the distribution, which creates the installation directory.
+   Then create a symbolic link to that directory. tar can uncompress
+   and unpack the distribution if it has z option support:
+shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz
+shell> ln -s full-path-to-mysql-VERSION-OS mysql
+
+   The tar command creates a directory named mysql-VERSION-OS. The ln
+   command makes a symbolic link to that directory. This enables you
+   to refer more easily to the installation directory as
+   /usr/local/mysql.
+
+   If your tar does not have z option support, use gunzip to unpack
+   the distribution and tar to unpack it. Replace the preceding tar
+   command with the following alternative command to uncompress and
+   extract the distribution:
+shell> gunzip < /path/to/mysql-VERSION-OS.tar.gz | tar xvf -
+
+Perform Postinstallation Setup
+
+   The remainder of the installation process involves setting up the
+   configuration file, creating the core databases, and starting the
+   MySQL server. For instructions, see Section 2.12,
+   "Postinstallation Setup and Testing."
+   Note
+
+   The accounts that are listed in the MySQL grant tables initially
+   have no passwords. After starting the server, you should set up
+   passwords for them using the instructions in Section 2.12,
+   "Postinstallation Setup and Testing."
diff -pruN 5.1.58-1/Docs/Makefile.am 5.1.61-2/Docs/Makefile.am
--- 5.1.58-1/Docs/Makefile.am	1970-01-01 00:00:00.000000000 +0000
+++ 5.1.61-2/Docs/Makefile.am	2011-12-16 19:06:07.000000000 +0000
@@ -0,0 +1,42 @@
+# Copyright (C) 2000-2006 MySQL AB
+# 
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+EXTRA_DIST =		mysql.info INSTALL-BINARY @extra_docs@
+
+# make sure that "make install" installs the info page, too
+# automake only seems to take care of this automatically,
+# if we're building the info page from texi directly.
+install-data-hook:	$(srcdir)/mysql.info
+	if test `basename $(prefix)` = "mysql" ; then \
+	  $(mkinstalldirs) $(DESTDIR)$(prefix)/docs ; \
+	  $(INSTALL_DATA) $(srcdir)/mysql.info $(DESTDIR)$(prefix)/docs ; \
+	  test ! -f $(top_srcdir)/ChangeLog || $(INSTALL_DATA) $(top_srcdir)/ChangeLog $(DESTDIR)$(prefix)/docs ; \
+	else \
+	  $(mkinstalldirs) $(DESTDIR)$(infodir) $(DESTDIR)$(pkgdatadir) ; \
+	  $(INSTALL_DATA) $(srcdir)/mysql.info $(DESTDIR)$(infodir) ; \
+	  test ! -f $(top_srcdir)/ChangeLog || $(INSTALL_DATA) $(top_srcdir)/ChangeLog $(DESTDIR)$(pkgdatadir) ; \
+	fi
+
+uninstall-local:
+	if test `basename $(prefix)` = "mysql" ; then \
+	  @RM@ -f $(DESTDIR)$(prefix)/docs/mysql.info ; \
+	  @RM@ -f $(DESTDIR)$(prefix)/docs/ChangeLog ; \
+	else \
+	  @RM@ -f $(DESTDIR)$(infodir)/mysql.info ; \
+	  @RM@ -f $(DESTDIR)$(pkgdatadir)/ChangeLog ; \
+	fi
+
+# Don't update the files from bitkeeper
+%::SCCS/s.%
diff -pruN 5.1.58-1/Docs/Makefile.in 5.1.61-2/Docs/Makefile.in
--- 5.1.58-1/Docs/Makefile.in	1970-01-01 00:00:00.000000000 +0000
+++ 5.1.61-2/Docs/Makefile.in	2011-12-16 19:07:24.000000000 +0000
@@ -0,0 +1,574 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program 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.
+
+@SET_MAKE@
+
+# Copyright (C) 2000-2006 MySQL AB
+# 
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+subdir = Docs
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/config/ac-macros/maintainer.m4 \
+	$(top_srcdir)/config/ac-macros/alloca.m4 \
+	$(top_srcdir)/config/ac-macros/check_cpu.m4 \
+	$(top_srcdir)/config/ac-macros/character_sets.m4 \
+	$(top_srcdir)/config/ac-macros/compiler_flag.m4 \
+	$(top_srcdir)/config/ac-macros/plugins.m4 \
+	$(top_srcdir)/config/ac-macros/ha_ndbcluster.m4 \
+	$(top_srcdir)/config/ac-macros/large_file.m4 \
+	$(top_srcdir)/config/ac-macros/misc.m4 \
+	$(top_srcdir)/config/ac-macros/readline.m4 \
+	$(top_srcdir)/config/ac-macros/ssl.m4 \
+	$(top_srcdir)/config/ac-macros/zlib.m4 \
+	$(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/include/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ABI_CHECK = @ABI_CHECK@
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMTAR = @AMTAR@
+AM_CFLAGS = @AM_CFLAGS@
+AM_CXXFLAGS = @AM_CXXFLAGS@
+AR = @AR@
+ARFLAGS = @ARFLAGS@
+AS = @AS@
+ASFLAGS = @ASFLAGS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AVAILABLE_LANGUAGES = @AVAILABLE_LANGUAGES@
+AWK = @AWK@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+CHECK_PID = @CHECK_PID@
+CHMOD = @CHMOD@
+CLIENT_EXTRA_LDFLAGS = @CLIENT_EXTRA_LDFLAGS@
+CLIENT_LIBS = @CLIENT_LIBS@
+CLIENT_THREAD_LIBS = @CLIENT_THREAD_LIBS@
+CMP = @CMP@
+COMPILATION_COMMENT = @COMPILATION_COMMENT@
+CONF_COMMAND = @CONF_COMMAND@
+CP = @CP@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CXXLDFLAGS = @CXXLDFLAGS@
+CXX_VERSION = @CXX_VERSION@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIFF = @DIFF@
+DOT_FRM_VERSION = @DOT_FRM_VERSION@
+DOXYGEN = @DOXYGEN@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+DVIS = @DVIS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FIND_PROC = @FIND_PROC@
+GETCONF = @GETCONF@
+GREP = @GREP@
+GXX = @GXX@
+HOSTNAME = @HOSTNAME@
+INNODB_DYNAMIC_CFLAGS = @INNODB_DYNAMIC_CFLAGS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KILL = @KILL@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LD_VERSION_SCRIPT = @LD_VERSION_SCRIPT@
+LIBDL = @LIBDL@
+LIBEDIT_LOBJECTS = @LIBEDIT_LOBJECTS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIB_EXTRA_CCFLAGS = @LIB_EXTRA_CCFLAGS@
+LIPO = @LIPO@
+LM_CFLAGS = @LM_CFLAGS@
+LN = @LN@
+LN_CP_F = @LN_CP_F@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MACHINE_TYPE = @MACHINE_TYPE@
+MAKEINDEX = @MAKEINDEX@
+MAKEINFO = @MAKEINFO@
+MAKE_BINARY_DISTRIBUTION_OPTIONS = @MAKE_BINARY_DISTRIBUTION_OPTIONS@
+MAKE_SHELL = @MAKE_SHELL@
+MKDIR_P = @MKDIR_P@
+MV = @MV@
+MYSQLD_DEFAULT_SWITCHES = @MYSQLD_DEFAULT_SWITCHES@
+MYSQLD_EXTRA_LDFLAGS = @MYSQLD_EXTRA_LDFLAGS@
+MYSQLD_EXTRA_LIBS = @MYSQLD_EXTRA_LIBS@
+MYSQLD_USER = @MYSQLD_USER@
+MYSQL_BASE_VERSION = @MYSQL_BASE_VERSION@
+MYSQL_COPYRIGHT_YEAR = @MYSQL_COPYRIGHT_YEAR@
+MYSQL_NO_DASH_VERSION = @MYSQL_NO_DASH_VERSION@
+MYSQL_PREVIOUS_BASE_VERSION = @MYSQL_PREVIOUS_BASE_VERSION@
+MYSQL_SERVER_SUFFIX = @MYSQL_SERVER_SUFFIX@
+MYSQL_TCP_PORT = @MYSQL_TCP_PORT@
+MYSQL_TCP_PORT_DEFAULT = @MYSQL_TCP_PORT_DEFAULT@
+MYSQL_UNIX_ADDR = @MYSQL_UNIX_ADDR@
+MYSQL_U_SCORE_VERSION = @MYSQL_U_SCORE_VERSION@
+MYSQL_VERSION_ID = @MYSQL_VERSION_ID@
+NDB_DEFS = @NDB_DEFS@
+NDB_LD_VERSION_SCRIPT = @NDB_LD_VERSION_SCRIPT@
+NDB_SCI_INCLUDES = @NDB_SCI_INCLUDES@
+NDB_SCI_LIBS = @NDB_SCI_LIBS@
+NDB_SHARED_LIB_MAJOR_VERSION = @NDB_SHARED_LIB_MAJOR_VERSION@
+NDB_SHARED_LIB_VERSION = @NDB_SHARED_LIB_VERSION@
+NDB_SIZEOF_CHAR = @NDB_SIZEOF_CHAR@
+NDB_SIZEOF_CHARP = @NDB_SIZEOF_CHARP@
+NDB_SIZEOF_INT = @NDB_SIZEOF_INT@
+NDB_SIZEOF_LONG = @NDB_SIZEOF_LONG@
+NDB_SIZEOF_LONG_LONG = @NDB_SIZEOF_LONG_LONG@
+NDB_SIZEOF_SHORT = @NDB_SIZEOF_SHORT@
+NDB_VERSION_BUILD = @NDB_VERSION_BUILD@
+NDB_VERSION_MAJOR = @NDB_VERSION_MAJOR@
+NDB_VERSION_MINOR = @NDB_VERSION_MINOR@
+NDB_VERSION_STATUS = @NDB_VERSION_STATUS@
+NM = @NM@
+NMEDIT = @NMEDIT@
+NOINST_LDFLAGS = @NOINST_LDFLAGS@
+NON_THREADED_LIBS = @NON_THREADED_LIBS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PDFLATEX = @PDFLATEX@
+PDFMANUAL = @PDFMANUAL@
+PERL = @PERL@
+PERL5 = @PERL5@
+PROTOCOL_VERSION = @PROTOCOL_VERSION@
+PS = @PS@
+RANLIB = @RANLIB@
+RM = @RM@
+SAVE_ASFLAGS = @SAVE_ASFLAGS@
+SAVE_CC = @SAVE_CC@
+SAVE_CFLAGS = @SAVE_CFLAGS@
+SAVE_CXX = @SAVE_CXX@
+SAVE_CXXFLAGS = @SAVE_CXXFLAGS@
+SAVE_CXXLDFLAGS = @SAVE_CXXLDFLAGS@
+SAVE_LDFLAGS = @SAVE_LDFLAGS@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHARED_LIB_MAJOR_VERSION = @SHARED_LIB_MAJOR_VERSION@
+SHARED_LIB_VERSION = @SHARED_LIB_VERSION@
+SHELL = @SHELL@
+STATIC_NSS_FLAGS = @STATIC_NSS_FLAGS@
+STRIP = @STRIP@
+SYSTEM_TYPE = @SYSTEM_TYPE@
+TAR = @TAR@
+TARGET_LINUX = @TARGET_LINUX@
+TERMCAP_LIB = @TERMCAP_LIB@
+TEST_NDBCLUSTER = @TEST_NDBCLUSTER@
+THREAD_LOBJECTS = @THREAD_LOBJECTS@
+VERSION = @VERSION@
+WRAPLIBS = @WRAPLIBS@
+YACC = @YACC@
+ZLIB_DEPS = @ZLIB_DEPS@
+ZLIB_INCLUDES = @ZLIB_INCLUDES@
+ZLIB_LIBS = @ZLIB_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+condition_dependent_plugin_includes = @condition_dependent_plugin_includes@
+condition_dependent_plugin_links = @condition_dependent_plugin_links@
+condition_dependent_plugin_modules = @condition_dependent_plugin_modules@
+condition_dependent_plugin_objects = @condition_dependent_plugin_objects@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+docs_dirs = @docs_dirs@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_docs = @extra_docs@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+innodb_system_libs = @innodb_system_libs@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+libmysqld_dirs = @libmysqld_dirs@
+localedir = @localedir@
+localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
+man1_files = @man1_files@
+man8_files = @man8_files@
+man_dirs = @man_dirs@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mysql_pg_dirs = @mysql_pg_dirs@
+mysql_pg_distdirs = @mysql_pg_distdirs@
+mysql_pg_unittest_dirs = @mysql_pg_unittest_dirs@
+mysql_plugin_defs = @mysql_plugin_defs@
+mysql_plugin_dirs = @mysql_plugin_dirs@
+mysql_plugin_libs = @mysql_plugin_libs@
+mysql_se_dirs = @mysql_se_dirs@
+mysql_se_distdirs = @mysql_se_distdirs@
+mysql_se_unittest_dirs = @mysql_se_unittest_dirs@
+ndb_bin_am_ldflags = @ndb_bin_am_ldflags@
+ndb_cxxflags_fix = @ndb_cxxflags_fix@
+ndb_mgmclient_libs = @ndb_mgmclient_libs@
+ndb_opt_subdirs = @ndb_opt_subdirs@
+ndb_port = @ndb_port@
+ndb_transporter_opt_objs = @ndb_transporter_opt_objs@
+ndbcluster_includes = @ndbcluster_includes@
+ndbcluster_libs = @ndbcluster_libs@
+ndbcluster_system_libs = @ndbcluster_system_libs@
+netware_dir = @netware_dir@
+oldincludedir = @oldincludedir@
+openssl_includes = @openssl_includes@
+openssl_libs = @openssl_libs@
+pdfdir = @pdfdir@
+plugin_archive_shared_target = @plugin_archive_shared_target@
+plugin_archive_static_target = @plugin_archive_static_target@
+plugin_blackhole_shared_target = @plugin_blackhole_shared_target@
+plugin_blackhole_static_target = @plugin_blackhole_static_target@
+plugin_csv_shared_target = @plugin_csv_shared_target@
+plugin_csv_static_target = @plugin_csv_static_target@
+plugin_daemon_example_shared_target = @plugin_daemon_example_shared_target@
+plugin_daemon_example_static_target = @plugin_daemon_example_static_target@
+plugin_example_shared_target = @plugin_example_shared_target@
+plugin_example_static_target = @plugin_example_static_target@
+plugin_federated_shared_target = @plugin_federated_shared_target@
+plugin_federated_static_target = @plugin_federated_static_target@
+plugin_ftexample_shared_target = @plugin_ftexample_shared_target@
+plugin_ftexample_static_target = @plugin_ftexample_static_target@
+plugin_heap_shared_target = @plugin_heap_shared_target@
+plugin_heap_static_target = @plugin_heap_static_target@
+plugin_innobase_shared_target = @plugin_innobase_shared_target@
+plugin_innobase_static_target = @plugin_innobase_static_target@
+plugin_innodb_plugin_shared_target = @plugin_innodb_plugin_shared_target@
+plugin_innodb_plugin_static_target = @plugin_innodb_plugin_static_target@
+plugin_myisam_shared_target = @plugin_myisam_shared_target@
+plugin_myisam_static_target = @plugin_myisam_static_target@
+plugin_myisammrg_shared_target = @plugin_myisammrg_shared_target@
+plugin_myisammrg_static_target = @plugin_myisammrg_static_target@
+plugin_ndbcluster_shared_target = @plugin_ndbcluster_shared_target@
+plugin_ndbcluster_static_target = @plugin_ndbcluster_static_target@
+plugin_partition_shared_target = @plugin_partition_shared_target@
+plugin_partition_static_target = @plugin_partition_static_target@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+readline_basedir = @readline_basedir@
+readline_dir = @readline_dir@
+readline_h_ln_cmd = @readline_h_ln_cmd@
+readline_link = @readline_link@
+readline_topdir = @readline_topdir@
+sbindir = @sbindir@
+server_scripts = @server_scripts@
+sharedstatedir = @sharedstatedir@
+sql_client_dirs = @sql_client_dirs@
+sql_server = @sql_server@
+sql_server_dirs = @sql_server_dirs@
+sql_union_dirs = @sql_union_dirs@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+tools_dirs = @tools_dirs@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uname_prog = @uname_prog@
+yassl_dir = @yassl_dir@
+yassl_h_ln_cmd = @yassl_h_ln_cmd@
+yassl_libs = @yassl_libs@
+yassl_taocrypt_extra_cxxflags = @yassl_taocrypt_extra_cxxflags@
+yassl_thread_cxxflags = @yassl_thread_cxxflags@
+zlib_dir = @zlib_dir@
+EXTRA_DIST = mysql.info INSTALL-BINARY @extra_docs@
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  Docs/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  Docs/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+	@$(NORMAL_INSTALL)
+	$(MAKE) $(AM_MAKEFLAGS) install-data-hook
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local
+
+.MAKE: install-am install-data-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	distclean distclean-generic distclean-libtool distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-data-hook install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	uninstall uninstall-am uninstall-local
+
+
+# make sure that "make install" installs the info page, too
+# automake only seems to take care of this automatically,
+# if we're building the info page from texi directly.
+install-data-hook:	$(srcdir)/mysql.info
+	if test `basename $(prefix)` = "mysql" ; then \
+	  $(mkinstalldirs) $(DESTDIR)$(prefix)/docs ; \
+	  $(INSTALL_DATA) $(srcdir)/mysql.info $(DESTDIR)$(prefix)/docs ; \
+	  test ! -f $(top_srcdir)/ChangeLog || $(INSTALL_DATA) $(top_srcdir)/ChangeLog $(DESTDIR)$(prefix)/docs ; \
+	else \
+	  $(mkinstalldirs) $(DESTDIR)$(infodir) $(DESTDIR)$(pkgdatadir) ; \
+	  $(INSTALL_DATA) $(srcdir)/mysql.info $(DESTDIR)$(infodir) ; \
+	  test ! -f $(top_srcdir)/ChangeLog || $(INSTALL_DATA) $(top_srcdir)/ChangeLog $(DESTDIR)$(pkgdatadir) ; \
+	fi
+
+uninstall-local:
+	if test `basename $(prefix)` = "mysql" ; then \
+	  @RM@ -f $(DESTDIR)$(prefix)/docs/mysql.info ; \
+	  @RM@ -f $(DESTDIR)$(prefix)/docs/ChangeLog ; \
+	else \
+	  @RM@ -f $(DESTDIR)$(infodir)/mysql.info ; \
+	  @RM@ -f $(DESTDIR)$(pkgdatadir)/ChangeLog ; \
+	fi
+
+# Don't update the files from bitkeeper
+%::SCCS/s.%
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff -pruN 5.1.58-1/Docs/mysql.info 5.1.61-2/Docs/mysql.info
--- 5.1.58-1/Docs/mysql.info	1970-01-01 00:00:00.000000000 +0000
+++ 5.1.61-2/Docs/mysql.info	2011-12-16 19:07:06.000000000 +0000
@@ -0,0 +1,310598 @@
+This is manual.info, produced by makeinfo version 4.8 from manual.texi.
+
+START-INFO-DIR-ENTRY
+* mysql: (mysql).               MySQL documentation.
+END-INFO-DIR-ENTRY
+
+
+File: manual.info,  Node: Top,  Next: preface,  Prev: (dir),  Up: (dir)
+
+* Menu:
+
+* preface::                      Preface and Legal Notice
+* introduction::                 General Information
+* installing::                   Installing and Upgrading MySQL
+* tutorial::                     Tutorial
+* programs::                     MySQL Programs
+* server-administration::        MySQL Server Administration
+* backup-and-recovery::          Backup and Recovery
+* optimization::                 Optimization
+* language-structure::           Language Structure
+* globalization::                Globalization
+* data-types::                   Data Types
+* functions::                    Functions and Operators
+* sql-syntax::                   SQL Statement Syntax
+* storage-engines::              Storage Engines
+* ha-overview::                  High Availability and Scalability
+* replication::                  Replication
+* mysql-cluster::                MySQL Cluster NDB 6.X/7.X
+* partitioning::                 Partitioning
+* stored-programs-views::        Stored Programs and Views
+* information-schema::           `INFORMATION_SCHEMA' Tables
+* connectors-apis::              Connectors and APIs
+* extending-mysql::              Extending MySQL
+* mysql-enterprise-monitor::     MySQL Enterprise Monitor
+* mysql-enterprise-backup::      MySQL Enterprise Backup
+* workbench::                    MySQL Workbench
+* licenses-third-party::         Licenses for Third-Party Components
+* faqs::                         MySQL 5.1 Frequently Asked Questions
+* error-handling::               Errors, Error Codes, and Common Problems
+* news::                         MySQL Change History
+* restrictions::                 Restrictions and Limits
+
+
+File: manual.info,  Node: preface,  Next: introduction,  Prev: Top,  Up: Top
+
+1 Preface and Legal Notice
+**************************
+
+This is the Reference Manual for the MySQL Database System, version
+5.1, through release 5.1.62. Differences between minor versions of
+MySQL 5.1 are noted in the present text with reference to release
+numbers (5.1.X). For license information, see the Legal Notice. This
+product may contain third-party code. For license information on
+third-party code, see *Note licenses-third-party::.
+
+This manual is not intended for use with older versions of the MySQL
+software due to the many functional and other differences between MySQL
+5.1 and previous versions. If you are using an earlier release of the
+MySQL software, please refer to the appropriate manual. For example,
+`MySQL 5.0 Reference Manual' (http://dev.mysql.com/doc/refman/5.0/en/),
+covers the 5.0 series of MySQL software releases.
+
+If you are using MySQL 5.5, please refer to the `MySQL 5.5 Reference
+Manual' (http://dev.mysql.com/doc/refman/5.5/en/).
+
+*Legal Notice*
+
+Copyright (C) 1997, 2011, Oracle and/or its affiliates. All rights
+reserved.
+
+This software and related documentation are provided under a license
+agreement containing restrictions on use and disclosure and are
+protected by intellectual property laws. Except as expressly permitted
+in your license agreement or allowed by law, you may not use, copy,
+reproduce, translate, broadcast, modify, license, transmit, distribute,
+exhibit, perform, publish, or display any part, in any form, or by any
+means. Reverse engineering, disassembly, or decompilation of this
+software, unless required by law for interoperability, is prohibited.
+
+The information contained herein is subject to change without notice
+and is not warranted to be error-free. If you find any errors, please
+report them to us in writing.
+
+If this software or related documentation is delivered to the U.S.
+Government or anyone licensing it on behalf of the U.S. Government, the
+following notice is applicable:
+
+U.S. GOVERNMENT RIGHTS Programs, software, databases, and related
+documentation and technical data delivered to U.S. Government customers
+are "commercial computer software" or "commercial technical data"
+pursuant to the applicable Federal Acquisition Regulation and
+agency-specific supplemental regulations. As such, the use,
+duplication, disclosure, modification, and adaptation shall be subject
+to the restrictions and license terms set forth in the applicable
+Government contract, and, to the extent applicable by the terms of the
+Government contract, the additional rights set forth in FAR 52.227-19,
+Commercial Computer Software License (December 2007).  Oracle USA,
+Inc., 500 Oracle Parkway, Redwood City, CA 94065.
+
+This software is developed for general use in a variety of information
+management applications. It is not developed or intended for use in any
+inherently dangerous applications, including applications which may
+create a risk of personal injury. If you use this software in dangerous
+applications, then you shall be responsible to take all appropriate
+fail-safe, backup, redundancy, and other measures to ensure the safe
+use of this software. Oracle Corporation and its affiliates disclaim
+any liability for any damages caused by use of this software in
+dangerous applications.
+
+Oracle is a registered trademark of Oracle Corporation and/or its
+affiliates. MySQL is a trademark of Oracle Corporation and/or its
+affiliates, and shall not be used without Oracle's express written
+authorization. Other names may be trademarks of their respective owners.
+
+This software and documentation may provide access to or information on
+content, products, and services from third parties. Oracle Corporation
+and its affiliates are not responsible for and expressly disclaim all
+warranties of any kind with respect to third-party content, products,
+and services. Oracle Corporation and its affiliates will not be
+responsible for any loss, costs, or damages incurred due to your access
+to or use of third-party content, products, or services.
+
+This document in any form, software or printed matter, contains
+proprietary information that is the exclusive property of Oracle.  Your
+access to and use of this material is subject to the terms and
+conditions of your Oracle Software License and Service Agreement, which
+has been executed and with which you agree to comply. This document and
+information contained herein may not be disclosed, copied, reproduced,
+or distributed to anyone outside Oracle without prior written consent
+of Oracle or as specifically provided below.  This document is not part
+of your license agreement nor can it be incorporated into any
+contractual agreement with Oracle or its subsidiaries or affiliates.
+
+This documentation is NOT distributed under a GPL license. Use of this
+documentation is subject to the following terms:
+
+You may create a printed copy of this documentation solely for your own
+personal use. Conversion to other formats is allowed as long as the
+actual content is not altered or edited in any way. You shall not
+publish or distribute this documentation in any form or on any media,
+except if you distribute the documentation in a manner similar to how
+Oracle disseminates it (that is, electronically for download on a Web
+site with the software) or on a CD-ROM or similar medium, provided
+however that the documentation is disseminated together with the
+software on the same medium. Any other use, such as any dissemination
+of printed copies or use of this documentation, in whole or in part, in
+another publication, requires the prior written consent from an
+authorized representative of Oracle. Oracle and/or its affiliates
+reserve any and all rights to this documentation not expressly granted
+above.
+
+For more information on the terms of this license, or for details on
+how the MySQL documentation is built and produced, please visit MySQL
+Contact & Questions (http://dev.mysql.com/contact/).
+
+For additional licensing information, including licenses for
+third-party libraries used by MySQL products, see *Note Top::.
+
+For help with using MySQL, please visit either the MySQL Forums
+(http://forums.mysql.com) or MySQL Mailing Lists
+(http://lists.mysql.com) where you can discuss your issues with other
+MySQL users.
+
+For additional documentation on MySQL products, including translations
+of the documentation into other languages, and downloadable versions in
+variety of formats, including HTML and PDF formats, see the MySQL
+Documentation Library (http://dev.mysql.com/doc).
+
+
+File: manual.info,  Node: introduction,  Next: installing,  Prev: preface,  Up: Top
+
+2 General Information
+*********************
+
+* Menu:
+
+* manual-info::                  About This Manual
+* manual-conventions::           Typographical and Syntax Conventions
+* what-is::                      Overview of the MySQL Database Management System
+* mysql-nutshell::               What Is New in MySQL 5.1
+* development-history::          MySQL Development History
+* information-sources::          MySQL Information Sources
+* bug-reports::                  How to Report Bugs or Problems
+* compatibility::                MySQL Standards Compliance
+* credits::                      Credits
+
+The MySQL(tm) software delivers a very fast, multi-threaded,
+multi-user, and robust SQL (Structured Query Language) database server.
+MySQL Server is intended for mission-critical, heavy-load production
+systems as well as for embedding into mass-deployed software. Oracle is
+a registered trademark of Oracle Corporation and/or its affiliates.
+MySQL is a trademark of Oracle Corporation and/or its affiliates, and
+shall not be used by Customer without Oracle's express written
+authorization. Other names may be trademarks of their respective owners.
+
+The MySQL software is Dual Licensed. Users can choose to use the MySQL
+software as an Open Source product under the terms of the GNU General
+Public License (`http://www.fsf.org/licenses/') or can purchase a
+standard commercial license from Oracle. See
+http://www.mysql.com/company/legal/licensing/ for more information on
+our licensing policies.
+
+The following list describes some sections of particular interest in
+this manual:
+
+   * For a discussion of MySQL Database Server capabilities, see *Note
+     features::.
+
+   * For descriptions of new MySQL features, see *Note mysql-nutshell::.
+
+   * For installation instructions, see *Note installing::.  For
+     information about upgrading MySQL, see *Note upgrading::, and the
+     change notes at *Note news::.
+
+   * For a tutorial introduction to the MySQL Database Server, see
+     *Note tutorial::.
+
+   * For information about configuring and administering MySQL Server,
+     see *Note server-administration::.
+
+   * For information about setting up replication servers, see *Note
+     replication::.
+
+   * For answers to a number of questions that are often asked
+     concerning the MySQL Database Server and its capabilities, see
+     *Note faqs::.
+
+   * For a history of new features and bugfixes, see *Note news::.
+
+*Important*:
+
+To report errors (often called `bugs'), please use the instructions at
+*Note bug-reports::.
+
+If you have found a sensitive security bug in MySQL Server, please let
+us know immediately by sending an email message to <security@mysql.com>.
+
+
+File: manual.info,  Node: manual-info,  Next: manual-conventions,  Prev: introduction,  Up: introduction
+
+2.1 About This Manual
+=====================
+
+This is the Reference Manual for the MySQL Database System, version
+5.1, through release 5.1.62.  Differences between minor versions of
+MySQL 5.1 are noted in the present text with reference to release
+numbers (5.1.X).
+
+This manual is not intended for use with older versions of the MySQL
+software due to the many functional and other differences between MySQL
+5.1 and previous versions. If you are using an earlier release of the
+MySQL software, please refer to the appropriate manual. For example,
+`MySQL 5.0 Reference Manual' (http://dev.mysql.com/doc/refman/5.0/en/),
+covers the 5.0 series of MySQL software releases.
+
+If you are using MySQL 5.5, please refer to the `MySQL 5.5 Reference
+Manual' (http://dev.mysql.com/doc/refman/5.5/en/).
+
+Because this manual serves as a reference, it does not provide general
+instruction on SQL or relational database concepts. It also does not
+teach you how to use your operating system or command-line interpreter.
+
+The MySQL Database Software is under constant development, and the
+Reference Manual is updated frequently as well. The most recent version
+of the manual is available online in searchable form at
+`http://dev.mysql.com/doc/'. Other formats also are available there,
+including HTML, PDF, and Windows CHM versions.
+
+The Reference Manual source files are written in DocBook XML format.
+The HTML version and other formats are produced automatically,
+primarily using the DocBook XSL stylesheets. For information about
+DocBook, see `http://docbook.org/'
+
+If you have questions about using MySQL, you can ask them using our
+mailing lists or forums. See *Note mailing-lists::, and *Note forums::.
+If you have suggestions concerning additions or corrections to the
+manual itself, please send them to the
+http://www.mysql.com/company/contact/.
+
+This manual was originally written by David Axmark and Michael `Monty'
+Widenius. It is maintained by the MySQL Documentation Team, consisting
+of Paul DuBois, Stefan Hinz, Philip Olson, John Russell, and Jon
+Stephens.
+
+
+File: manual.info,  Node: manual-conventions,  Next: what-is,  Prev: manual-info,  Up: introduction
+
+2.2 Typographical and Syntax Conventions
+========================================
+
+This manual uses certain typographical conventions:
+
+   * `Text in this style' is used for SQL statements; database, table,
+     and column names; program listings and source code; and
+     environment variables. Example: `To reload the grant tables, use
+     the *Note `FLUSH PRIVILEGES': flush. statement.'
+
+   * Text in this style indicates input that you type in examples.
+
+   * `Text in this style' indicates the names of executable programs
+     and scripts, examples being *Note `mysql': mysql. (the MySQL
+     command line client program) and *Note `mysqld': mysqld. (the
+     MySQL server executable).
+
+   * TEXT IN THIS STYLE is used for variable input for which you should
+     substitute a value of your own choosing.
+
+   * _Text in this style_ is used for emphasis.
+
+   * *Text in this style* is used in table headings and to convey
+     especially strong emphasis.
+
+   * `Text in this style' is used to indicate a program option that
+     affects how the program is executed, or that supplies information
+     that is needed for the program to function in a certain way.
+     _Example_: `The `--host' option (short form `-h') tells the *Note
+     `mysql': mysql. client program the hostname or IP address of the
+     MySQL server that it should connect to'.
+
+   * File names and directory names are written like this: `The global
+     `my.cnf' file is located in the `/etc' directory.'
+
+   * Character sequences are written like this: `To specify a wildcard,
+     use the ``%'' character.'
+
+When commands are shown that are meant to be executed from within a
+particular program, the prompt shown preceding the command indicates
+which command to use. For example, `shell>' indicates a command that
+you execute from your login shell, `root-shell>' is similar but should
+be executed as `root', and `mysql>' indicates a statement that you
+execute from the *Note `mysql': mysql. client program:
+
+     shell> type a shell command here
+     root-shell> type a shell command as ROOT here
+     mysql> type a mysql statement here
+
+In some areas different systems may be distinguished from each other to
+show that commands should be executed in two different environments.
+For example, while working with replication the commands might be
+prefixed with `master' and `slave':
+
+     master> type a mysql command on the replication master here
+     slave> type a mysql command on the replication slave here
+
+The `shell' is your command interpreter. On Unix, this is typically a
+program such as `sh', `csh', or `bash'. On Windows, the equivalent
+program is `command.com' or `cmd.exe', typically run in a console
+window.
+
+When you enter a command or statement shown in an example, do not type
+the prompt shown in the example.
+
+Database, table, and column names must often be substituted into
+statements. To indicate that such substitution is necessary, this
+manual uses DB_NAME, TBL_NAME, and COL_NAME. For example, you might see
+a statement like this:
+
+     mysql> SELECT COL_NAME FROM DB_NAME.TBL_NAME;
+
+This means that if you were to enter a similar statement, you would
+supply your own database, table, and column names, perhaps like this:
+
+     mysql> SELECT author_name FROM biblio_db.author_list;
+
+SQL keywords are not case sensitive and may be written in any
+lettercase. This manual uses uppercase.
+
+In syntax descriptions, square brackets (``['' and ``]'') indicate
+optional words or clauses. For example, in the following statement, `IF
+EXISTS' is optional:
+
+     DROP TABLE [IF EXISTS] TBL_NAME
+
+When a syntax element consists of a number of alternatives, the
+alternatives are separated by vertical bars (``|''). When one member
+from a set of choices _may_ be chosen, the alternatives are listed
+within square brackets (``['' and ``]''):
+
+     TRIM([[BOTH | LEADING | TRAILING] [REMSTR] FROM] STR)
+
+When one member from a set of choices _must_ be chosen, the
+alternatives are listed within braces (``{'' and ``}''):
+
+     {DESCRIBE | DESC} TBL_NAME [COL_NAME | WILD]
+
+An ellipsis (`...') indicates the omission of a section of a statement,
+typically to provide a shorter version of more complex syntax. For
+example, *Note `SELECT ... INTO OUTFILE': select. is shorthand for the
+form of *Note `SELECT': select. statement that has an `INTO OUTFILE'
+clause following other parts of the statement.
+
+An ellipsis can also indicate that the preceding syntax element of a
+statement may be repeated. In the following example, multiple
+RESET_OPTION values may be given, with each of those after the first
+preceded by commas:
+
+     RESET RESET_OPTION [,RESET_OPTION] ...
+
+Commands for setting shell variables are shown using Bourne shell
+syntax. For example, the sequence to set the `CC' environment variable
+and run the `configure' command looks like this in Bourne shell syntax:
+
+     shell> CC=gcc ./configure
+
+If you are using `csh' or `tcsh', you must issue commands somewhat
+differently:
+
+     shell> setenv CC gcc
+     shell> ./configure
+
+
+File: manual.info,  Node: what-is,  Next: mysql-nutshell,  Prev: manual-conventions,  Up: introduction
+
+2.3 Overview of the MySQL Database Management System
+====================================================
+
+* Menu:
+
+* what-is-mysql::                What is MySQL?
+* history::                      History of MySQL
+* features::                     The Main Features of MySQL
+
+
+File: manual.info,  Node: what-is-mysql,  Next: history,  Prev: what-is,  Up: what-is
+
+2.3.1 What is MySQL?
+--------------------
+
+MySQL, the most popular Open Source SQL database management system, is
+developed, distributed, and supported by Oracle Corporation.
+
+The MySQL Web site (http://www.mysql.com/) provides the latest
+information about MySQL software.
+
+   * MySQL is a database management system.
+
+     A database is a structured collection of data. It may be anything
+     from a simple shopping list to a picture gallery or the vast
+     amounts of information in a corporate network. To add, access, and
+     process data stored in a computer database, you need a database
+     management system such as MySQL Server.  Since computers are very
+     good at handling large amounts of data, database management
+     systems play a central role in computing, as standalone utilities,
+     or as parts of other applications.
+
+   * MySQL is a relational database management system.
+
+     A relational database stores data in separate tables rather than
+     putting all the data in one big storeroom. This adds speed and
+     flexibility. The SQL part of `MySQL' stands for `Structured Query
+     Language.' SQL is the most common standardized language used to
+     access databases and is defined by the ANSI/ISO SQL Standard. The
+     SQL standard has been evolving since 1986 and several versions
+     exist. In this manual, `SQL-92' refers to the standard released in
+     1992, `SQL:1999' refers to the standard released in 1999, and
+     `SQL:2003' refers to the current version of the standard. We use
+     the phrase `the SQL standard' to mean the current version of the
+     SQL Standard at any time.
+
+   * MySQL software is Open Source.
+
+     Open Source means that it is possible for anyone to use and modify
+     the software. Anybody can download the MySQL software from the
+     Internet and use it without paying anything. If you wish, you may
+     study the source code and change it to suit your needs. The MySQL
+     software uses the GPL (GNU General Public License),
+     `http://www.fsf.org/licenses/', to define what you may and may not
+     do with the software in different situations. If you feel
+     uncomfortable with the GPL or need to embed MySQL code into a
+     commercial application, you can buy a commercially licensed
+     version from us. See the MySQL Licensing Overview for more
+     information (http://www.mysql.com/company/legal/licensing/).
+
+   * The MySQL Database Server is very fast, reliable, and easy to use.
+
+     If that is what you are looking for, you should give it a try.
+     MySQL Server also has a practical set of features developed in
+     close cooperation with our users. You can find a performance
+     comparison of MySQL Server with other database managers on our
+     benchmark page. See *Note mysql-benchmarks::.
+
+     MySQL Server was originally developed to handle large databases
+     much faster than existing solutions and has been successfully used
+     in highly demanding production environments for several years.
+     Although under constant development, MySQL Server today offers a
+     rich and useful set of functions. Its connectivity, speed, and
+     security make MySQL Server highly suited for accessing databases
+     on the Internet.
+
+   * MySQL Server works in client/server or embedded systems.
+
+     The MySQL Database Software is a client/server system that
+     consists of a multi-threaded SQL server that supports different
+     backends, several different client programs and libraries,
+     administrative tools, and a wide range of application programming
+     interfaces (APIs).
+
+     We also provide MySQL Server as an embedded multi-threaded library
+     that you can link into your application to get a smaller, faster,
+     easier-to-manage standalone product.
+
+   * A large amount of contributed MySQL software is available.
+
+     It is very likely that your favorite application or language
+     supports the MySQL Database Server.
+
+The official way to pronounce `MySQL' is `My Ess Que Ell' (not `my
+sequel'), but we do not mind if you pronounce it as `my sequel' or in
+some other localized way.
+
+
+File: manual.info,  Node: history,  Next: features,  Prev: what-is-mysql,  Up: what-is
+
+2.3.2 History of MySQL
+----------------------
+
+We started out with the intention of using the `mSQL' database system
+to connect to our tables using our own fast low-level (ISAM) routines.
+However, after some testing, we came to the conclusion that `mSQL' was
+not fast enough or flexible enough for our needs. This resulted in a
+new SQL interface to our database but with almost the same API
+interface as `mSQL'. This API was designed to enable third-party code
+that was written for use with `mSQL' to be ported easily for use with
+MySQL.
+
+MySQL is named after co-founder Monty Widenius's daughter, My.
+
+The name of the MySQL Dolphin (our logo) is `Sakila,' which was chosen
+from a huge list of names suggested by users in our `Name the Dolphin'
+contest. The winning name was submitted by Ambrose Twebaze, an Open
+Source software developer from Swaziland, Africa. According to Ambrose,
+the feminine name Sakila has its roots in SiSwati, the local language
+of Swaziland.  Sakila is also the name of a town in Arusha, Tanzania,
+near Ambrose's country of origin, Uganda.
+
+
+File: manual.info,  Node: features,  Prev: history,  Up: what-is
+
+2.3.3 The Main Features of MySQL
+--------------------------------
+
+This section describes some of the important characteristics of the
+MySQL Database Software. See also *Note development-history::. In most
+respects, the roadmap applies to all versions of MySQL. For information
+about features as they are introduced into MySQL on a series-specific
+basis, see the `In a Nutshell' section of the appropriate Manual:
+
+   * MySQL 5.0: MySQL 5.0 in a Nutshell
+     (http://dev.mysql.com/doc/refman/5.0/en/mysql-nutshell.html)
+
+   * MySQL 5.1: *Note MySQL 5.1 in a Nutshell: mysql-nutshell.
+
+   * MySQL 5.5: MySQL 5.5 in a Nutshell
+     (http://dev.mysql.com/doc/refman/5.5/en/mysql-nutshell.html)
+
+Internals and Portability:
+
+   * Written in C and C++.
+
+   * Tested with a broad range of different compilers.
+
+   * Works on many different platforms. See *Note supported-os::.
+
+   * For portability, uses `CMake' in MySQL 5.5 and up. Previous series
+     use GNU Automake, Autoconf, and Libtool.
+
+   * Tested with Purify (a commercial memory leakage detector) as well
+     as with Valgrind, a GPL tool
+     (`http://developer.kde.org/~sewardj/').
+
+   * Uses multi-layered server design with independent modules.
+
+   * Designed to be fully multi-threaded using kernel threads, to
+     easily use multiple CPUs if they are available.
+
+   * Provides transactional and nontransactional storage engines.
+
+   * Uses very fast B-tree disk tables (`MyISAM') with index
+     compression.
+
+   * Designed to make it relatively easy to add other storage engines.
+     This is useful if you want to provide an SQL interface for an
+     in-house database.
+
+   * Uses a very fast thread-based memory allocation system.
+
+   * Executes very fast joins using an optimized nested-loop join.
+
+   * Implements in-memory hash tables, which are used as temporary
+     tables.
+
+   * Implements SQL functions using a highly optimized class library
+     that should be as fast as possible. Usually there is no memory
+     allocation at all after query initialization.
+
+   * Provides the server as a separate program for use in a
+     client/server networked environment, and as a library that can be
+     embedded (linked) into standalone applications. Such applications
+     can be used in isolation or in environments where no network is
+     available.
+
+Data Types:
+
+   * Many data types: signed/unsigned integers 1, 2, 3, 4, and 8 bytes
+     long, *Note `FLOAT': numeric-types, *Note `DOUBLE': numeric-types,
+     *Note `CHAR': char, *Note `VARCHAR': char, *Note `BINARY':
+     binary-varbinary, *Note `VARBINARY': binary-varbinary, *Note
+     `TEXT': blob, *Note `BLOB': blob, *Note `DATE': datetime, *Note
+     `TIME': time, *Note `DATETIME': datetime, *Note `TIMESTAMP':
+     datetime, *Note `YEAR': year, *Note `SET': set, *Note `ENUM':
+     enum, and OpenGIS spatial types. See *Note data-types::.
+
+   * Fixed-length and variable-length string types.
+
+Statements and Functions:
+
+   * Full operator and function support in the *Note `SELECT': select.
+     list and `WHERE' clause of queries. For example:
+
+          mysql> SELECT CONCAT(first_name, ' ', last_name)
+              -> FROM citizen
+              -> WHERE income/dependents > 10000 AND age > 30;
+
+   * Full support for SQL `GROUP BY' and `ORDER BY' clauses. Support
+     for group functions (`COUNT()', `AVG()', `STD()', `SUM()', `MAX()',
+     `MIN()', and `GROUP_CONCAT()').
+
+   * Support for `LEFT OUTER JOIN' and `RIGHT OUTER JOIN' with both
+     standard SQL and ODBC syntax.
+
+   * Support for aliases on tables and columns as required by standard
+     SQL.
+
+   * Support for *Note `DELETE': delete, *Note `INSERT': insert, *Note
+     `REPLACE': replace, and *Note `UPDATE': update. to return the
+     number of rows that were changed (affected), or to return the
+     number of rows matched instead by setting a flag when connecting
+     to the server.
+
+   * Support for MySQL-specific *Note `SHOW': show.  statements that
+     retrieve information about databases, storage engines, tables, and
+     indexes. MySQL 5.0 adds support for the `INFORMATION_SCHEMA'
+     database, implemented according to standard SQL.
+
+   * An *Note `EXPLAIN': explain. statement to show how the optimizer
+     resolves a query.
+
+   * Independence of function names from table or column names. For
+     example, `ABS' is a valid column name. The only restriction is
+     that for a function call, no spaces are permitted between the
+     function name and the ``('' that follows it. See *Note
+     reserved-words::.
+
+   * You can refer to tables from different databases in the same
+     statement.
+
+Security:
+
+   * A privilege and password system that is very flexible and secure,
+     and that enables host-based verification.
+
+   * Password security by encryption of all password traffic when you
+     connect to a server.
+
+Scalability and Limits:
+
+   * Support for large databases. We use MySQL Server with databases
+     that contain 50 million records. We also know of users who use
+     MySQL Server with 200,000 tables and about 5,000,000,000 rows.
+
+   * Support for up to 64 indexes per table (32 before MySQL 4.1.2).
+     Each index may consist of 1 to 16 columns or parts of columns. The
+     maximum index width is 1000 bytes (767 for `InnoDB'); before MySQL
+     4.1.2, the limit is 500 bytes. An index may use a prefix of a
+     column for *Note `CHAR': char, *Note `VARCHAR': char, *Note
+     `BLOB': blob, or *Note `TEXT': blob. column types.
+
+Connectivity:
+
+   * Clients can connect to MySQL Server using several protocols:
+
+        * Clients can connect using TCP/IP sockets on any platform.
+
+        * On Windows systems in the NT family (NT, 2000, XP, 2003, or
+          Vista), clients can connect using named pipes if the server
+          is started with the `--enable-named-pipe' option.  In MySQL
+          4.1 and higher, Windows servers also support shared-memory
+          connections if started with the `--shared-memory' option.
+          Clients can connect through shared memory by using the
+          `--protocol=memory' option.
+
+        * On Unix systems, clients can connect using Unix domain socket
+          files.
+
+   * MySQL client programs can be written in many languages. A client
+     library written in C is available for clients written in C or C++,
+     or for any language that provides C bindings.
+
+   * APIs for C, C++, Eiffel, Java, Perl, PHP, Python, Ruby, and Tcl
+     are available, enabling MySQL clients to be written in many
+     languages. See *Note connectors-apis::.
+
+   * The Connector/ODBC (MyODBC) interface provides MySQL support for
+     client programs that use ODBC (Open Database Connectivity)
+     connections. For example, you can use MS Access to connect to your
+     MySQL server. Clients can be run on Windows or Unix.
+     Connector/ODBC source is available. All ODBC 2.5 functions are
+     supported, as are many others. See *Note connector-odbc::.
+
+   * The Connector/J interface provides MySQL support for Java client
+     programs that use JDBC connections. Clients can be run on Windows
+     or Unix. Connector/J source is available. See *Note connector-j::.
+
+   * MySQL Connector/Net enables developers to easily create .NET
+     applications that require secure, high-performance data
+     connectivity with MySQL. It implements the required ADO.NET
+     interfaces and integrates into ADO.NET aware tools. Developers can
+     build applications using their choice of .NET languages.  MySQL
+     Connector/Net is a fully managed ADO.NET driver written in 100%
+     pure C#. See *Note connector-net::.
+
+Localization:
+
+   * The server can provide error messages to clients in many
+     languages. See *Note error-message-language::.
+
+   * Full support for several different character sets, including
+     `latin1' (cp1252), `german', `big5', `ujis', and more.  For
+     example, the Scandinavian characters ``aa'', ``a"'' and ``o"'' are
+     permitted in table and column names. Unicode support is available
+     as of MySQL 4.1.
+
+   * All data is saved in the chosen character set.
+
+   * Sorting and comparisons are done according to the chosen character
+     set and collation (using `latin1' and Swedish collation by
+     default). It is possible to change this when the MySQL server is
+     started. To see an example of very advanced sorting, look at the
+     Czech sorting code. MySQL Server supports many different character
+     sets that can be specified at compile time and runtime.
+
+   * As of MySQL 4.1, the server time zone can be changed dynamically,
+     and individual clients can specify their own time zone. *Note
+     time-zone-support::.
+
+Clients and Tools:
+
+   * MySQL includes several client and utility programs. These include
+     both command-line programs such as *Note `mysqldump': mysqldump.
+     and *Note `mysqladmin': mysqladmin, and graphical programs such as
+     MySQL Administrator and MySQL Query Browser.
+
+   * MySQL Server has built-in support for SQL statements to check,
+     optimize, and repair tables. These statements are available from
+     the command line through the *Note `mysqlcheck': mysqlcheck.
+     client. MySQL also includes *Note `myisamchk': myisamchk, a very
+     fast command-line utility for performing these operations on
+     `MyISAM' tables. See *Note programs::.
+
+   * MySQL programs can be invoked with the `--help' or `-?' option to
+     obtain online assistance.
+
+
+File: manual.info,  Node: mysql-nutshell,  Next: development-history,  Prev: what-is,  Up: introduction
+
+2.4 What Is New in MySQL 5.1
+============================
+
+This section summarizes what has been added to MySQL 5.1 and what has
+been deprecated for further use.
+
+The following features have been added to MySQL 5.1:
+
+   * Partitioning
+
+     This capability enables distributing portions of individual tables
+     across a file system, according to rules which can be set when the
+     table is created. In effect, different portions of a table are
+     stored as separate tables in different locations, but from the
+     user point of view, the partitioned table is still a single table.
+     Syntactically, this implements a number of new extensions to the
+     *Note `CREATE TABLE': create-table, *Note `ALTER TABLE':
+     alter-table, and `EXPLAIN ... SELECT' statements. As of MySQL
+     5.1.6, queries against partitioned tables can take advantage of
+     _partition pruning_. In some cases, this can result in query
+     execution that is an order of magnitude faster than the same query
+     against a nonpartitioned version of the same table. See *Note
+     partitioning::, for further information on this functionality.
+     (Author: Mikael Ronstro"m)
+
+   * Row-based replication
+
+     Replication capabilities in MySQL originally were based on
+     propagation of SQL statements from master to slave. This is called
+     _statement-based replication_. As of MySQL 5.1.5, another basis
+     for replication is available.  This is called _row-based
+     replication_.  Instead of sending SQL statements to the slave, the
+     master writes events to its binary log that indicate how individual
+     table rows are effected. As of MySQL 5.1.8, a third option is
+     available: _mixed_. This will use statement-based replication by
+     default, and only switch to row-based replication in particular
+     cases. See *Note replication-formats::. (Authors: Lars Thalmann,
+     Guilhem Bichot, Mats Kindahl)
+
+   * Plugin API
+
+     MySQL 5.1 adds support for a very flexible plugin API that enables
+     loading and unloading of various components at runtime, without
+     restarting the server. Although the work on this is not finished
+     yet, _plugin full-text parsers_ are a first step in this
+     direction. This permits users to implement their own input filter
+     on the indexed text, enabling full-text search capability on
+     arbitrary data such as PDF files or other document formats.  A
+     pre-parser full-text plugin performs the actual parsing and
+     extraction of the text and hands it over to the built-in MySQL
+     full-text search. See *Note plugin-api::.  (Author: Sergey
+     Vojtovich)
+
+   * Event scheduler
+
+     MySQL Events are tasks that run according to a schedule.  When you
+     create an event, you are creating a named database object
+     containing one or more SQL statements to be executed at one or
+     more regular intervals, beginning and ending at a specific date
+     and time. Conceptually, this is similar to the idea of the Unix
+     `crontab' (also known as a `cron job') or the Windows Task
+     Scheduler. See *Note events::. (Author: Andrey Hristov)
+
+   * Server log tables
+
+     Before MySQL 5.1, the server writes general query log and slow
+     query log entries to log files. As of MySQL 5.1, the server's
+     logging capabilities for these logs are more flexible. Log entries
+     can be written to log files (as before) or to the `general_log' and
+     `slow_log' tables in the `mysql' database. If logging is enabled,
+     either or both destinations can be selected. The `--log-output'
+     option controls the destination or destinations of log output. See
+     *Note log-destinations::. (Author: Petr Chardin)
+
+   * Upgrade program
+
+     The *Note `mysql_upgrade': mysql-upgrade. program (available as of
+     MySQL 5.1.7) checks all existing tables for incompatibilities with
+     the current version of MySQL Server and repairs them if necessary.
+     This program should be run for each MySQL upgrade. See *Note
+     mysql-upgrade::.  (Authors: Alexey Botchkov, Mikael Widenius)
+
+   * MySQL Cluster
+
+     MySQL Cluster is now released as a separate product, based on
+     MySQL 5.1 but with the addition of the *Note `NDBCLUSTER':
+     mysql-cluster. storage engine.  Clustering support is no longer
+     available in mainline MySQL 5.1 releases. MySQL Cluster releases
+     are identified by a 3-part NDB version number; currently, the
+     MySQL Cluster NDB 6.3, MySQL Cluster NDB 7.0, and MySQL Cluster
+     NDB 7.1 release series are available for production use.
+
+     Some of the changes in MySQL Cluster since MySQL 5.0 are listed
+     here:
+
+        * MySQL Cluster replication
+
+          Replication between MySQL Clusters is now supported. It is
+          now also possible to replicate between a MySQL Cluster and a
+          noncluster database. See *Note mysql-cluster-replication::.
+
+        * MySQL Cluster disk data storage
+
+          Formerly, the *Note `NDBCLUSTER': mysql-cluster.  storage
+          engine was strictly in-memory; now, it is possible to store
+          Cluster data (but not indexes) on disk. This enables MySQL
+          Cluster to scale upward with fewer hardware (RAM)
+          requirements than previously. In addition, the Disk Data
+          implementation includes a new `no-steal' restoration
+          algorithm for fast node restarts when storing very large
+          amounts of data (terabyte range). See *Note
+          mysql-cluster-disk-data::, for more information.
+
+        * Improved backups for MySQL Cluster
+
+          A fault arising in a single data node during a Cluster backup
+          no longer causes the entire backup to be aborted, as occurred
+          in previous versions of MySQL Cluster.
+
+     Many other new features and improvements have been made to the
+     *Note `NDBCLUSTER': mysql-cluster. storage engine in MySQL Cluster
+     NDB 7.0 and MySQL Cluster NDB 7.1; for more information about
+     these, see *Note mysql-cluster-development::.
+
+   * Backup of tablespaces
+
+     The *Note `mysqldump': mysqldump. utility now supports an option
+     for dumping tablespaces. Use `-Y' or `--all-tablespaces' to enable
+     this functionality.
+
+   * Improvements to `INFORMATION_SCHEMA'
+
+     MySQL 5.1 provides much more information in its metadata database
+     than was available in MySQL 5.0. New tables in the
+     `INFORMATION_SCHEMA' database include *Note `FILES': files-table,
+     *Note `EVENTS': events-table, *Note `PARTITIONS': partitions-table,
+     *Note `PROCESSLIST': processlist-table, *Note `ENGINES':
+     engines-table, and *Note `PLUGINS': plugins-table.
+
+   * XML functions with XPath support
+
+     `ExtractValue()' returns the content of a fragment of XML matching
+     a given XPath expression. `UpdateXML()' replaces the element
+     selected from a fragment of XML by an XPath expression supplied by
+     the user with a second XML fragment (also user-supplied), and
+     returns the modified XML.  See *Note xml-functions::. (Author:
+     Alexander Barkov)
+
+   * Load emulator
+
+     The *Note `mysqlslap': mysqlslap. program is designed to emulate
+     client load for a MySQL server and report the timing of each
+     stage. It works as if multiple clients were accessing the server.
+     See *Note mysqlslap::.  (Authors: Patrick Galbraith, Brian Aker)
+
+The following constructs are deprecated and are removed as of MySQL
+5.5. Where alternatives are shown, applications should be updated to
+use them.
+
+   * The `log_bin_trust_routine_creators' system variable (use
+     `log_bin_trust_function_creators').
+
+   * The `table_type' system variable (use `storage_engine').
+
+   * The `TYPE' table option to specify the storage engine for *Note
+     `CREATE TABLE': create-table.  or *Note `ALTER TABLE':
+     alter-table. (use `ENGINE').
+
+   * The `SHOW TABLE TYPES' SQL statement (use *Note `SHOW ENGINES':
+     show-engines.).
+
+   * The *Note `SHOW INNODB STATUS': show-innodb-status. and `SHOW
+     MUTEX STATUS' SQL statements (use *Note `SHOW ENGINE INNODB
+     STATUS': show-engine.  *Note `SHOW ENGINE INNODB MUTEX':
+     show-engine.).
+
+   * The `SHOW PLUGIN' SQL statement (use *Note `SHOW PLUGINS':
+     show-plugins.).
+
+   * The `LOAD TABLE ... FROM MASTER' and `LOAD DATA FROM MASTER' SQL
+     statements (use *Note `mysqldump': mysqldump. or *Note
+     `mysqlhotcopy': mysqlhotcopy. to dump tables and *Note `mysql':
+     mysql. to reload dump files).
+
+   * The *Note `BACKUP TABLE': backup-table. and *Note `RESTORE TABLE':
+     restore-table. SQL statements (use *Note `mysqldump': mysqldump. or
+     *Note `mysqlhotcopy': mysqlhotcopy. to dump tables and *Note
+     `mysql': mysql. to reload dump files).
+
+   * *Note `TIMESTAMP(N)': datetime.  data type: The ability to specify
+     a display width of N (use without N).
+
+   * The `--master-XXX' server options to set replication parameters
+     (use the *Note `CHANGE MASTER TO': change-master-to. statement
+     instead): `--master-host', `--master-user', `--master-password',
+     `--master-port', `--master-connect-retry', `--master-ssl',
+     `--master-ssl-ca', `--master-ssl-capath', `--master-ssl-cert',
+     `--master-ssl-cipher', `--master-ssl-key'.
+
+
+File: manual.info,  Node: development-history,  Next: information-sources,  Prev: mysql-nutshell,  Up: introduction
+
+2.5 MySQL Development History
+=============================
+
+This section describes the general MySQL development history, provides
+an overview about features that have been implemented in previous
+series and that are new in MySQL 5.1, the release series covered in
+this manual. The maturity level this release series is general
+availability. Information about maturity levels can be found in *Note
+choosing-version::.
+
+Before upgrading from one release series to the next, please see the
+notes in *Note upgrading::.
+
+The most requested features and the versions in which they were
+implemented are summarized in the following table.
+
+Feature                MySQL Series
+Unions                 4.0
+Subqueries             4.1
+R-trees                4.1 (for the `MyISAM' storage engine)
+Stored procedures and  5.0
+functions              
+Views                  5.0
+Cursors                5.0
+XA transactions        5.0
+Triggers               5.0 and 5.1
+Event scheduler        5.1
+Partitioning           5.1
+Pluggable storage      5.1
+engine API             
+Plugin API             5.1
+InnoDB Plugin          5.1
+Row-based replication  5.1
+Server log tables      5.1
+
+
+File: manual.info,  Node: information-sources,  Next: bug-reports,  Prev: development-history,  Up: introduction
+
+2.6 MySQL Information Sources
+=============================
+
+* Menu:
+
+* mailing-lists::                MySQL Mailing Lists
+* forums::                       MySQL Community Support at the MySQL Forums
+* irc::                          MySQL Community Support on Internet Relay Chat (IRC)
+* mysql-enterprise-information::  MySQL Enterprise
+
+This section lists sources of additional information that you may find
+helpful, such as the MySQL mailing lists and user forums, and Internet
+Relay Chat.
+
+
+File: manual.info,  Node: mailing-lists,  Next: forums,  Prev: information-sources,  Up: information-sources
+
+2.6.1 MySQL Mailing Lists
+-------------------------
+
+* Menu:
+
+* mailing-list-use::             Guidelines for Using the Mailing Lists
+
+This section introduces the MySQL mailing lists and provides guidelines
+as to how the lists should be used. When you subscribe to a mailing
+list, you receive all postings to the list as email messages. You can
+also send your own questions and answers to the list.
+
+To subscribe to or unsubscribe from any of the mailing lists described
+in this section, visit `http://lists.mysql.com/'. For most of them, you
+can select the regular version of the list where you get individual
+messages, or a digest version where you get one large message per day.
+
+Please _do not_ send messages about subscribing or unsubscribing to any
+of the mailing lists, because such messages are distributed
+automatically to thousands of other users.
+
+Your local site may have many subscribers to a MySQL mailing list.  If
+so, the site may have a local mailing list, so that messages sent from
+`lists.mysql.com' to your site are propagated to the local list. In
+such cases, please contact your system administrator to be added to or
+dropped from the local MySQL list.
+
+To have traffic for a mailing list go to a separate mailbox in your
+mail program, set up a filter based on the message headers.  You can
+use either the `List-ID:' or `Delivered-To:' headers to identify list
+messages.
+
+The MySQL mailing lists are as follows:
+
+   * `announce'
+
+     The list for announcements of new versions of MySQL and related
+     programs. This is a low-volume list to which all MySQL users
+     should subscribe.
+
+   * `mysql'
+
+     The main list for general MySQL discussion. Please note that some
+     topics are better discussed on the more-specialized lists. If you
+     post to the wrong list, you may not get an answer.
+
+   * `bugs'
+
+     The list for people who want to stay informed about issues
+     reported since the last release of MySQL or who want to be
+     actively involved in the process of bug hunting and fixing.  See
+     *Note bug-reports::.
+
+   * `internals'
+
+     The list for people who work on the MySQL code. This is also the
+     forum for discussions on MySQL development and for posting patches.
+
+   * `mysqldoc'
+
+     The list for people who work on the MySQL documentation.
+
+   * `benchmarks'
+
+     The list for anyone interested in performance issues.  Discussions
+     concentrate on database performance (not limited to MySQL), but
+     also include broader categories such as performance of the kernel,
+     file system, disk system, and so on.
+
+   * `packagers'
+
+     The list for discussions on packaging and distributing MySQL.
+     This is the forum used by distribution maintainers to exchange
+     ideas on packaging MySQL and on ensuring that MySQL looks and
+     feels as similar as possible on all supported platforms and
+     operating systems.
+
+   * `java'
+
+     The list for discussions about the MySQL server and Java. It is
+     mostly used to discuss JDBC drivers such as MySQL Connector/J.
+
+   * `win32'
+
+     The list for all topics concerning the MySQL software on Microsoft
+     operating systems, such as Windows 9x, Me, NT, 2000, XP, and 2003.
+
+   * `myodbc'
+
+     The list for all topics concerning connecting to the MySQL server
+     with ODBC.
+
+   * `gui-tools'
+
+     The list for all topics concerning MySQL graphical user interface
+     tools such as `MySQL Administrator' and `MySQL Query Browser'.
+
+   * `cluster'
+
+     The list for discussion of MySQL Cluster.
+
+   * `dotnet'
+
+     The list for discussion of the MySQL server and the .NET platform.
+     It is mostly related to MySQL Connector/Net.
+
+   * `plusplus'
+
+     The list for all topics concerning programming with the C++ API
+     for MySQL.
+
+   * `perl'
+
+     The list for all topics concerning Perl support for MySQL with
+     `DBD::mysql'.
+
+If you're unable to get an answer to your questions from a MySQL
+mailing list or forum, one option is to purchase support from Oracle.
+This puts you in direct contact with MySQL developers.
+
+The following MySQL mailing lists are in languages other than English.
+These lists are not operated by Oracle.
+
+   * `<mysql-france-subscribe@yahoogroups.com>'
+
+     A French mailing list.
+
+   * `<list@tinc.net>'
+
+     A Korean mailing list. To subscribe, email `subscribe mysql
+     your@email.address' to this list.
+
+   * `<mysql-de-request@lists.4t2.com>'
+
+     A German mailing list. To subscribe, email `subscribe mysql-de
+     your@email.address' to this list. You can find information about
+     this mailing list at `http://www.4t2.com/mysql/'.
+
+   * `<mysql-br-request@listas.linkway.com.br>'
+
+     A Portuguese mailing list. To subscribe, email `subscribe mysql-br
+     your@email.address' to this list.
+
+   * `<mysql-alta@elistas.net>'
+
+     A Spanish mailing list. To subscribe, email `subscribe mysql
+     your@email.address' to this list.
+
+
+File: manual.info,  Node: mailing-list-use,  Prev: mailing-lists,  Up: mailing-lists
+
+2.6.1.1 Guidelines for Using the Mailing Lists
+..............................................
+
+Please do not post mail messages from your browser with HTML mode
+turned on. Many users do not read mail with a browser.
+
+When you answer a question sent to a mailing list, if you consider your
+answer to have broad interest, you may want to post it to the list
+instead of replying directly to the individual who asked. Try to make
+your answer general enough that people other than the original poster
+may benefit from it.  When you post to the list, please make sure that
+your answer is not a duplication of a previous answer.
+
+Try to summarize the essential part of the question in your reply. Do
+not feel obliged to quote the entire original message.
+
+When answers are sent to you individually and not to the mailing list,
+it is considered good etiquette to summarize the answers and send the
+summary to the mailing list so that others may have the benefit of
+responses you received that helped you solve your problem.
+
+
+File: manual.info,  Node: forums,  Next: irc,  Prev: mailing-lists,  Up: information-sources
+
+2.6.2 MySQL Community Support at the MySQL Forums
+-------------------------------------------------
+
+The forums at `http://forums.mysql.com' are an important community
+resource. Many forums are available, grouped into these general
+categories:
+
+   * Migration
+
+   * MySQL Usage
+
+   * MySQL Connectors
+
+   * Programming Languages
+
+   * Tools
+
+   * 3rd-Party Applications
+
+   * Storage Engines
+
+   * MySQL Technology
+
+   * SQL Standards
+
+   * Business
+
+
+File: manual.info,  Node: irc,  Next: mysql-enterprise-information,  Prev: forums,  Up: information-sources
+
+2.6.3 MySQL Community Support on Internet Relay Chat (IRC)
+----------------------------------------------------------
+
+In addition to the various MySQL mailing lists and forums, you can find
+experienced community people on Internet Relay Chat (IRC).  These are
+the best networks/channels currently known to us:
+
+*freenode* (see `http://www.freenode.net/' for servers)
+
+   * `#mysql' is primarily for MySQL questions, but other database and
+     general SQL questions are welcome.  Questions about PHP, Perl, or
+     C in combination with MySQL are also common.
+
+If you are looking for IRC client software to connect to an IRC
+network, take a look at `xChat' (`http://www.xchat.org/'). X-Chat (GPL
+licensed) is available for Unix as well as for Windows platforms (a free
+Windows build of X-Chat is available at
+`http://www.silverex.org/download/').
+
+
+File: manual.info,  Node: mysql-enterprise-information,  Prev: irc,  Up: information-sources
+
+2.6.4 MySQL Enterprise
+----------------------
+
+Oracle offers technical support in the form of MySQL Enterprise.  For
+organizations that rely on the MySQL DBMS for business-critical
+production applications, MySQL Enterprise is a commercial subscription
+offering which includes:
+
+   * MySQL Enterprise Server
+
+   * MySQL Enterprise Monitor
+
+   * Monthly Rapid Updates and Quarterly Service Packs
+
+   * MySQL Knowledge Base
+
+   * 24x7 Technical and Consultative Support
+
+MySQL Enterprise is available in multiple tiers, giving you the
+flexibility to choose the level of service that best matches your
+needs. For more information, see MySQL Enterprise
+(http://www.mysql.com/products/enterprise/).
+
+
+File: manual.info,  Node: bug-reports,  Next: compatibility,  Prev: information-sources,  Up: introduction
+
+2.7 How to Report Bugs or Problems
+==================================
+
+Before posting a bug report about a problem, please try to verify that
+it is a bug and that it has not been reported already:
+
+   * Start by searching the MySQL online manual at
+     `http://dev.mysql.com/doc/'. We try to keep the manual up to date
+     by updating it frequently with solutions to newly found problems.
+     The change history (`http://dev.mysql.com/doc/mysql/en/news.html')
+     can be particularly useful since it is quite possible that a newer
+     version contains a solution to your problem.
+
+   * If you get a parse error for an SQL statement, please check your
+     syntax closely. If you cannot find something wrong with it, it is
+     extremely likely that your current version of MySQL Server doesn't
+     support the syntax you are using. If you are using the current
+     version and the manual doesn't cover the syntax that you are
+     using, MySQL Server doesn't support your statement. In this case,
+     your options are to implement the syntax yourself or email
+     <licensing@mysql.com> and ask for an offer to implement it.
+
+     If the manual covers the syntax you are using, but you have an
+     older version of MySQL Server, you should check the MySQL change
+     history to see when the syntax was implemented. In this case, you
+     have the option of upgrading to a newer version of MySQL Server.
+
+   * For solutions to some common problems, see *Note problems::.
+
+   * Search the bugs database at `http://bugs.mysql.com/' to see
+     whether the bug has been reported and fixed.
+
+   * Search the MySQL mailing list archives at
+     `http://lists.mysql.com/'. See *Note mailing-lists::.
+
+   * You can also use http://www.mysql.com/search/ to search all the
+     Web pages (including the manual) that are located at the MySQL Web
+     site.
+
+If you cannot find an answer in the manual, the bugs database, or the
+mailing list archives, check with your local MySQL expert. If you still
+cannot find an answer to your question, please use the following
+guidelines for reporting the bug.
+
+The normal way to report bugs is to visit `http://bugs.mysql.com/',
+which is the address for our bugs database. This database is public and
+can be browsed and searched by anyone. If you log in to the system, you
+can enter new reports.
+
+Bugs posted in the bugs database at `http://bugs.mysql.com/' that are
+corrected for a given release are noted in the change history.
+
+If you have found a sensitive security bug in MySQL, you can send email
+to <security@mysql.com>.
+
+To discuss problems with other users, you can use one of the MySQL
+mailing lists. *Note mailing-lists::.
+
+Writing a good bug report takes patience, but doing it right the first
+time saves time both for us and for yourself. A good bug report,
+containing a full test case for the bug, makes it very likely that we
+will fix the bug in the next release. This section helps you write your
+report correctly so that you do not waste your time doing things that
+may not help us much or at all. Please read this section carefully and
+make sure that all the information described here is included in your
+report.
+
+Preferably, you should test the problem using the latest production or
+development version of MySQL Server before posting. Anyone should be
+able to repeat the bug by just using `mysql test < script_file' on your
+test case or by running the shell or Perl script that you include in
+the bug report. Any bug that we are able to repeat has a high chance of
+being fixed in the next MySQL release.
+
+It is most helpful when a good description of the problem is included
+in the bug report. That is, give a good example of everything you did
+that led to the problem and describe, in exact detail, the problem
+itself. The best reports are those that include a full example showing
+how to reproduce the bug or problem. See MySQL Internals: Porting
+(http://forge.mysql.com/wiki/MySQL_Internals_Porting).
+
+Remember that it is possible for us to respond to a report containing
+too much information, but not to one containing too little. People
+often omit facts because they think they know the cause of a problem
+and assume that some details do not matter. A good principle to follow
+is that if you are in doubt about stating something, state it. It is
+faster and less troublesome to write a couple more lines in your report
+than to wait longer for the answer if we must ask you to provide
+information that was missing from the initial report.
+
+The most common errors made in bug reports are (a) not including the
+version number of the MySQL distribution that you use, and (b) not
+fully describing the platform on which the MySQL server is installed
+(including the platform type and version number). These are highly
+relevant pieces of information, and in 99 cases out of 100, the bug
+report is useless without them. Very often we get questions like, `Why
+doesn't this work for me?' Then we find that the feature requested
+wasn't implemented in that MySQL version, or that a bug described in a
+report has been fixed in newer MySQL versions.  Errors often are
+platform-dependent. In such cases, it is next to impossible for us to
+fix anything without knowing the operating system and the version
+number of the platform.
+
+If you compiled MySQL from source, remember also to provide information
+about your compiler if it is related to the problem.  Often people find
+bugs in compilers and think the problem is MySQL-related. Most
+compilers are under development all the time and become better version
+by version. To determine whether your problem depends on your compiler,
+we need to know what compiler you used.  Note that every compiling
+problem should be regarded as a bug and reported accordingly.
+
+If a program produces an error message, it is very important to include
+the message in your report. If we try to search for something from the
+archives, it is better that the error message reported exactly matches
+the one that the program produces. (Even the lettercase should be
+observed.) It is best to copy and paste the entire error message into
+your report. You should never try to reproduce the message from memory.
+
+If you have a problem with Connector/ODBC (MyODBC), please try to
+generate a trace file and send it with your report. See *Note
+connector-odbc-support-bug-report::.
+
+If your report includes long query output lines from test cases that
+you run with the *Note `mysql': mysql. command-line tool, you can make
+the output more readable by using the `--vertical' option or the `\G'
+statement terminator. The *Note `EXPLAIN SELECT': explain.  example
+later in this section demonstrates the use of `\G'.
+
+Please include the following information in your report:
+
+   * The version number of the MySQL distribution you are using (for
+     example, MySQL 5.0.19). You can find out which version you are
+     running by executing *Note `mysqladmin version': mysqladmin. The
+     *Note `mysqladmin': mysqladmin. program can be found in the `bin'
+     directory under your MySQL installation directory.
+
+   * The manufacturer and model of the machine on which you experience
+     the problem.
+
+   * The operating system name and version. If you work with Windows,
+     you can usually get the name and version number by double-clicking
+     your My Computer icon and pulling down the `Help/About Windows'
+     menu. For most Unix-like operating systems, you can get this
+     information by executing the command `uname -a'.
+
+   * Sometimes the amount of memory (real and virtual) is relevant.  If
+     in doubt, include these values.
+
+   * If you are using a source distribution of the MySQL software,
+     include the name and version number of the compiler that you used.
+     If you have a binary distribution, include the distribution name.
+
+   * If the problem occurs during compilation, include the exact error
+     messages and also a few lines of context around the offending code
+     in the file where the error occurs.
+
+   * If *Note `mysqld': mysqld. died, you should also report the
+     statement that crashed *Note `mysqld': mysqld. You can usually get
+     this information by running *Note `mysqld': mysqld. with query
+     logging enabled, and then looking in the log after *Note `mysqld':
+     mysqld. crashes. See MySQL Internals: Porting
+     (http://forge.mysql.com/wiki/MySQL_Internals_Porting).
+
+   * If a database table is related to the problem, include the output
+     from the `SHOW CREATE TABLE DB_NAME.TBL_NAME' statement in the bug
+     report. This is a very easy way to get the definition of any table
+     in a database. The information helps us create a situation
+     matching the one that you have experienced.
+
+   * The SQL mode in effect when the problem occurred can be
+     significant, so please report the value of the `sql_mode' system
+     variable. For stored procedure, stored function, and trigger
+     objects, the relevant `sql_mode' value is the one in effect when
+     the object was created. For a stored procedure or function, the
+     *Note `SHOW CREATE PROCEDURE': show-create-procedure. or *Note
+     `SHOW CREATE FUNCTION': show-create-function. statement shows the
+     relevant SQL mode, or you can query `INFORMATION_SCHEMA' for the
+     information:
+
+          SELECT ROUTINE_SCHEMA, ROUTINE_NAME, SQL_MODE
+          FROM INFORMATION_SCHEMA.ROUTINES;
+
+     For triggers, you can use this statement:
+
+          SELECT EVENT_OBJECT_SCHEMA, EVENT_OBJECT_TABLE, TRIGGER_NAME, SQL_MODE
+          FROM INFORMATION_SCHEMA.TRIGGERS;
+
+   * For performance-related bugs or problems with *Note `SELECT':
+     select. statements, you should always include the output of
+     `EXPLAIN SELECT ...', and at least the number of rows that the
+     *Note `SELECT': select. statement produces. You should also
+     include the output from `SHOW CREATE TABLE TBL_NAME' for each table
+     that is involved. The more information you provide about your
+     situation, the more likely it is that someone can help you.
+
+     The following is an example of a very good bug report. The
+     statements are run using the *Note `mysql': mysql.  command-line
+     tool. Note the use of the `\G' statement terminator for statements
+     that would otherwise provide very long output lines that are
+     difficult to read.
+
+          mysql> SHOW VARIABLES;
+          mysql> SHOW COLUMNS FROM ...\G
+                 <OUTPUT FROM SHOW COLUMNS>
+          mysql> EXPLAIN SELECT ...\G
+                 <OUTPUT FROM EXPLAIN>
+          mysql> FLUSH STATUS;
+          mysql> SELECT ...;
+                 <A SHORT VERSION OF THE OUTPUT FROM SELECT,
+                 INCLUDING THE TIME TAKEN TO RUN THE QUERY>
+          mysql> SHOW STATUS;
+                 <OUTPUT FROM SHOW STATUS>
+
+   * If a bug or problem occurs while running *Note `mysqld': mysqld,
+     try to provide an input script that reproduces the anomaly. This
+     script should include any necessary source files. The more closely
+     the script can reproduce your situation, the better. If you can
+     make a reproducible test case, you should upload it to be attached
+     to the bug report.
+
+     If you cannot provide a script, you should at least include the
+     output from *Note `mysqladmin variables extended-status
+     processlist': mysqladmin. in your report to provide some
+     information on how your system is performing.
+
+   * If you cannot produce a test case with only a few rows, or if the
+     test table is too big to be included in the bug report (more than
+     10 rows), you should dump your tables using *Note `mysqldump':
+     mysqldump. and create a `README' file that describes your problem.
+     Create a compressed archive of your files using `tar' and `gzip' or
+     `zip', and use FTP to transfer the archive to
+     `ftp://ftp.mysql.com/pub/mysql/upload/'. Then enter the problem
+     into our bugs database at `http://bugs.mysql.com/'.
+
+   * If you believe that the MySQL server produces a strange result
+     from a statement, include not only the result, but also your
+     opinion of what the result should be, and an explanation
+     describing the basis for your opinion.
+
+   * When you provide an example of the problem, it is better to use
+     the table names, variable names, and so forth that exist in your
+     actual situation than to come up with new names. The problem could
+     be related to the name of a table or variable. These cases are
+     rare, perhaps, but it is better to be safe than sorry. After all,
+     it should be easier for you to provide an example that uses your
+     actual situation, and it is by all means better for us. If you
+     have data that you do not want to be visible to others in the bug
+     report, you can use FTP to transfer it to
+     `ftp://ftp.mysql.com/pub/mysql/upload/'. If the information is
+     really top secret and you do not want to show it even to us, go
+     ahead and provide an example using other names, but please regard
+     this as the last choice.
+
+   * Include all the options given to the relevant programs, if
+     possible. For example, indicate the options that you use when you
+     start the *Note `mysqld': mysqld. server, as well as the options
+     that you use to run any MySQL client programs. The options to
+     programs such as *Note `mysqld': mysqld. and *Note `mysql': mysql,
+     and to the `configure' script, are often key to resolving problems
+     and are very relevant. It is never a bad idea to include them. If
+     your problem involves a program written in a language such as Perl
+     or PHP, please include the language processor's version number, as
+     well as the version for any modules that the program uses. For
+     example, if you have a Perl script that uses the `DBI' and
+     `DBD::mysql' modules, include the version numbers for Perl, `DBI',
+     and `DBD::mysql'.
+
+   * If your question is related to the privilege system, please
+     include the output of *Note `mysqlaccess': mysqlaccess, the output
+     of *Note `mysqladmin reload': mysqladmin, and all the error
+     messages you get when trying to connect. When you test your
+     privileges, you should first run *Note `mysqlaccess': mysqlaccess.
+     After this, execute *Note `mysqladmin reload version': mysqladmin.
+     and try to connect with the program that gives you trouble.  *Note
+     `mysqlaccess': mysqlaccess. can be found in the `bin' directory
+     under your MySQL installation directory.
+
+   * If you have a patch for a bug, do include it. But do not assume
+     that the patch is all we need, or that we can use it, if you do
+     not provide some necessary information such as test cases showing
+     the bug that your patch fixes. We might find problems with your
+     patch or we might not understand it at all. If so, we cannot use
+     it.
+
+     If we cannot verify the exact purpose of the patch, we will not
+     use it. Test cases help us here. Show that the patch handles all
+     the situations that may occur. If we find a borderline case (even
+     a rare one) where the patch will not work, it may be useless.
+
+   * Guesses about what the bug is, why it occurs, or what it depends
+     on are usually wrong. Even the MySQL team cannot guess such things
+     without first using a debugger to determine the real cause of a
+     bug.
+
+   * Indicate in your bug report that you have checked the reference
+     manual and mail archive so that others know you have tried to
+     solve the problem yourself.
+
+   * If the problem is that your data appears corrupt or you get errors
+     when you access a particular table, you should first check your
+     tables and then try to repair them with *Note `CHECK TABLE':
+     check-table. and *Note `REPAIR TABLE': repair-table. or with *Note
+     `myisamchk': myisamchk. See *Note server-administration::.
+
+     If you are running Windows, please verify the value of
+     `lower_case_table_names' using the `SHOW VARIABLES LIKE
+     'lower_case_table_names'' statement. This variable affects how the
+     server handles lettercase of database and table names. Its effect
+     for a given value should be as described in *Note
+     identifier-case-sensitivity::.
+
+   * If you often get corrupted tables, you should try to find out when
+     and why this happens. In this case, the error log in the MySQL
+     data directory may contain some information about what happened.
+     (This is the file with the `.err' suffix in the name.) See *Note
+     error-log::. Please include any relevant information from this
+     file in your bug report. Normally *Note `mysqld': mysqld. should
+     _never_ crash a table if nothing killed it in the middle of an
+     update. If you can find the cause of *Note `mysqld': mysqld.
+     dying, it is much easier for us to provide you with a fix for the
+     problem. See *Note what-is-crashing::.
+
+   * If possible, download and install the most recent version of MySQL
+     Server and check whether it solves your problem. All versions of
+     the MySQL software thoroughly tested and should work without
+     problems. We believe in making everything as backward-compatible
+     as possible, and you should be able to switch MySQL versions
+     without difficulty. See *Note which-version::.
+
+
+File: manual.info,  Node: compatibility,  Next: credits,  Prev: bug-reports,  Up: introduction
+
+2.8 MySQL Standards Compliance
+==============================
+
+* Menu:
+
+* standards::                    What Standards MySQL Follows
+* sql-mode::                     Selecting SQL Modes
+* ansi-mode::                    Running MySQL in ANSI Mode
+* extensions-to-ansi::           MySQL Extensions to Standard SQL
+* differences-from-ansi::        MySQL Differences from Standard SQL
+* constraints::                  How MySQL Deals with Constraints
+
+This section describes how MySQL relates to the ANSI/ISO SQL standards.
+MySQL Server has many extensions to the SQL standard, and here you can
+find out what they are and how to use them. You can also find
+information about functionality missing from MySQL Server, and how to
+work around some of the differences.
+
+The SQL standard has been evolving since 1986 and several versions
+exist. In this manual, `SQL-92' refers to the standard released in
+1992, `SQL:1999' refers to the standard released in 1999, `SQL:2003'
+refers to the standard released in 2003, and `SQL:2008' refers to the
+most recent version of the standard, released in 2008. We use the
+phrase `the SQL standard' or `standard SQL' to mean the current version
+of the SQL Standard at any time.
+
+One of our main goals with the product is to continue to work toward
+compliance with the SQL standard, but without sacrificing speed or
+reliability. We are not afraid to add extensions to SQL or support for
+non-SQL features if this greatly increases the usability of MySQL
+Server for a large segment of our user base.  The *Note `HANDLER':
+handler. interface is an example of this strategy. See *Note handler::.
+
+We continue to support transactional and nontransactional databases to
+satisfy both mission-critical 24/7 usage and heavy Web or logging usage.
+
+MySQL Server was originally designed to work with medium-sized
+databases (10-100 million rows, or about 100MB per table) on small
+computer systems. Today MySQL Server handles terabyte-sized databases,
+but the code can also be compiled in a reduced version suitable for
+hand-held and embedded devices. The compact design of the MySQL server
+makes development in both directions possible without any conflicts in
+the source tree.
+
+Currently, we are not targeting real-time support, although MySQL
+replication capabilities offer significant functionality.
+
+MySQL supports high-availability database clustering using the *Note
+`NDBCLUSTER': mysql-cluster. storage engine. See *Note mysql-cluster::.
+
+We are implementing XML functionality beginning in MySQL 5.1, which
+supports most of the W3C XPath standard. We plan to increase support
+for XML as part of future MySQL development. See *Note xml-functions::.
+
+
+File: manual.info,  Node: standards,  Next: sql-mode,  Prev: compatibility,  Up: compatibility
+
+2.8.1 What Standards MySQL Follows
+----------------------------------
+
+Our aim is to support the full ANSI/ISO SQL standard, but without
+making concessions to speed and quality of the code.
+
+ODBC levels 0 to 3.51.
+
+
+File: manual.info,  Node: sql-mode,  Next: ansi-mode,  Prev: standards,  Up: compatibility
+
+2.8.2 Selecting SQL Modes
+-------------------------
+
+The MySQL server can operate in different SQL modes, and can apply
+these modes differentially for different clients. This capability
+enables each application to tailor the server's operating mode to its
+own requirements.
+
+SQL modes control aspects of server operation such as what SQL syntax
+MySQL should support and what kind of data validation checks it should
+perform. This makes it easier to use MySQL in different environments
+and to use MySQL together with other database servers.
+
+You can set the default SQL mode by starting *Note `mysqld': mysqld.
+with the `--sql-mode="MODE_VALUE"' option. You can also change the mode
+at runtime by setting the `sql_mode' system variable with a *Note `SET
+[GLOBAL|SESSION] sql_mode='MODE_VALUE'': set-option.  statement.
+
+For more information on setting the SQL mode, see *Note
+server-sql-mode::.
+
+
+File: manual.info,  Node: ansi-mode,  Next: extensions-to-ansi,  Prev: sql-mode,  Up: compatibility
+
+2.8.3 Running MySQL in ANSI Mode
+--------------------------------
+
+You can tell *Note `mysqld': mysqld. to run in ANSI mode with the
+`--ansi' startup option.  Running the server in ANSI mode is the same
+as starting it with the following options:
+
+     --transaction-isolation=SERIALIZABLE --sql-mode=ANSI
+
+You can achieve the same effect at runtime by executing these two
+statements:
+
+     SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;
+     SET GLOBAL sql_mode = 'ANSI';
+
+You can see that setting the `sql_mode' system variable to `'ANSI''
+enables all SQL mode options that are relevant for ANSI mode as follows:
+
+     mysql> SET GLOBAL sql_mode='ANSI';
+     mysql> SELECT @@global.sql_mode;
+             -> 'REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI'
+
+Running the server in ANSI mode with `--ansi' is not quite the same as
+setting the SQL mode to `'ANSI''. The `--ansi' option affects the SQL
+mode and also sets the transaction isolation level. Setting the SQL
+mode to `'ANSI'' has no effect on the isolation level.
+
+See *Note server-options::, and *Note sql-mode::.
+
+
+File: manual.info,  Node: extensions-to-ansi,  Next: differences-from-ansi,  Prev: ansi-mode,  Up: compatibility
+
+2.8.4 MySQL Extensions to Standard SQL
+--------------------------------------
+
+MySQL Server supports some extensions that you probably won't find in
+other SQL DBMSs. Be warned that if you use them, your code won't be
+portable to other SQL servers. In some cases, you can write code that
+includes MySQL extensions, but is still portable, by using comments of
+the following form:
+
+     /*! MYSQL-SPECIFIC CODE */
+
+In this case, MySQL Server parses and executes the code within the
+comment as it would any other SQL statement, but other SQL servers will
+ignore the extensions. For example, MySQL Server recognizes the
+`STRAIGHT_JOIN' keyword in the following statement, but other servers
+will not:
+
+     SELECT /*! STRAIGHT_JOIN */ col1 FROM table1,table2 WHERE ...
+
+If you add a version number after the ``!'' character, the syntax within
+the comment is executed only if the MySQL version is greater than or
+equal to the specified version number. The `TEMPORARY' keyword in the
+following comment is executed only by servers from MySQL 3.23.02 or
+higher:
+
+     CREATE /*!32302 TEMPORARY */ TABLE t (a INT);
+
+The following descriptions list MySQL extensions, organized by category.
+
+   * Organization of data on disk
+
+     MySQL Server maps each database to a directory under the MySQL
+     data directory, and maps tables within a database to file names in
+     the database directory. This has a few implications:
+
+        * Database and table names are case sensitive in MySQL Server
+          on operating systems that have case-sensitive file names
+          (such as most Unix systems). See *Note
+          identifier-case-sensitivity::.
+
+        * You can use standard system commands to back up, rename,
+          move, delete, and copy tables that are managed by the
+          `MyISAM' storage engine. For example, it is possible to
+          rename a `MyISAM' table by renaming the `.MYD', `.MYI', and
+          `.frm' files to which the table corresponds. (Nevertheless, it
+          is preferable to use *Note `RENAME TABLE': rename-table. or
+          `ALTER TABLE ...  RENAME' and let the server rename the
+          files.)
+
+     Prior to MySQL 5.1.6, database and table names cannot contain path
+     name separator characters (``/'', ``\'').
+
+   * General language syntax
+
+        * By default, strings can be enclosed by either ``"'' or ``''',
+          not just by ``'''. (If the `ANSI_QUOTES' SQL mode is enabled,
+          strings can be enclosed only by ``''' and the server
+          interprets strings enclosed by ``"'' as identifiers.)
+
+        * ``\'' is the escape character in strings.
+
+        * In SQL statements, you can access tables from different
+          databases with the DB_NAME.TBL_NAME syntax. Some SQL servers
+          provide the same functionality but call this `User space'.
+          MySQL Server doesn't support tablespaces such as used in
+          statements like this: `CREATE TABLE ralph.my_table ... IN
+          my_tablespace'.
+
+   * SQL statement syntax
+
+        * The *Note `ANALYZE TABLE': analyze-table, *Note `CHECK
+          TABLE': check-table, *Note `OPTIMIZE TABLE': optimize-table,
+          and *Note `REPAIR TABLE': repair-table. statements.
+
+        * The *Note `CREATE DATABASE': create-database, *Note `DROP
+          DATABASE': drop-database, and *Note `ALTER DATABASE':
+          alter-database.  statements. See *Note create-database::,
+          *Note drop-database::, and *Note alter-database::.
+
+        * The *Note `DO': do. statement.
+
+        * *Note `EXPLAIN SELECT': explain. to obtain a description of
+          how tables are processed by the query optimizer.
+
+        * The *Note `FLUSH': flush. and *Note `RESET': reset.
+          statements.
+
+        * The *Note `SET': set-option.  statement. See *Note
+          set-option::.
+
+        * The *Note `SHOW': show. statement. See *Note show::. The
+          information produced by many of the MySQL-specific *Note
+          `SHOW': show. statements can be obtained in more standard
+          fashion by using *Note `SELECT': select. to query
+          `INFORMATION_SCHEMA'. See *Note information-schema::.
+
+        * Use of *Note `LOAD DATA INFILE': load-data. In many cases,
+          this syntax is compatible with Oracle's *Note `LOAD DATA
+          INFILE': load-data. See *Note load-data::.
+
+        * Use of *Note `RENAME TABLE': rename-table. See *Note
+          rename-table::.
+
+        * Use of *Note `REPLACE': replace. instead of *Note `DELETE':
+          delete. plus *Note `INSERT': insert. See *Note replace::.
+
+        * Use of `CHANGE COL_NAME', `DROP COL_NAME', or *Note `DROP
+          INDEX': drop-index, `IGNORE' or `RENAME' in *Note `ALTER
+          TABLE': alter-table.  statements. Use of multiple `ADD',
+          `ALTER', `DROP', or `CHANGE' clauses in an *Note `ALTER
+          TABLE': alter-table. statement.  See *Note alter-table::.
+
+        * Use of index names, indexes on a prefix of a column, and use
+          of `INDEX' or `KEY' in *Note `CREATE TABLE': create-table.
+          statements. See *Note create-table::.
+
+        * Use of `TEMPORARY' or `IF NOT EXISTS' with *Note `CREATE
+          TABLE': create-table.
+
+        * Use of `IF EXISTS' with *Note `DROP TABLE': drop-table. and
+          *Note `DROP DATABASE': drop-database.
+
+        * The capability of dropping multiple tables with a single
+          *Note `DROP TABLE': drop-table. statement.
+
+        * The `ORDER BY' and `LIMIT' clauses of the *Note `UPDATE':
+          update. and *Note `DELETE': delete. statements.
+
+        * `INSERT INTO TBL_NAME SET COL_NAME = ...' syntax.
+
+        * The `DELAYED' clause of the *Note `INSERT': insert. and *Note
+          `REPLACE': replace. statements.
+
+        * The `LOW_PRIORITY' clause of the *Note `INSERT': insert,
+          *Note `REPLACE': replace, *Note `DELETE': delete, and *Note
+          `UPDATE': update. statements.
+
+        * Use of `INTO OUTFILE' or `INTO DUMPFILE' in *Note `SELECT':
+          select. statements. See *Note select::.
+
+        * Options such as `STRAIGHT_JOIN' or `SQL_SMALL_RESULT' in
+          *Note `SELECT': select. statements.
+
+        * You don't need to name all selected columns in the `GROUP BY'
+          clause. This gives better performance for some very specific,
+          but quite normal queries. See *Note
+          group-by-functions-and-modifiers::.
+
+        * You can specify `ASC' and `DESC' with `GROUP BY', not just
+          with `ORDER BY'.
+
+        * The ability to set variables in a statement with the `:='
+          assignment operator. See *Note user-variables::.
+
+   * Data types
+
+        * The *Note `MEDIUMINT': numeric-types, *Note `SET': set, and
+          *Note `ENUM': enum. data types, and the various *Note `BLOB':
+          blob. and *Note `TEXT': blob. data types.
+
+        * The `AUTO_INCREMENT', `BINARY', `NULL', `UNSIGNED', and
+          `ZEROFILL' data type attributes.
+
+   * Functions and operators
+
+        * To make it easier for users who migrate from other SQL
+          environments, MySQL Server supports aliases for many
+          functions. For example, all string functions support both
+          standard SQL syntax and ODBC syntax.
+
+        * MySQL Server understands the `||' and `&&' operators to mean
+          logical OR and AND, as in the C programming language. In
+          MySQL Server, `||' and `OR' are synonyms, as are `&&' and
+          `AND'.  Because of this nice syntax, MySQL Server doesn't
+          support the standard SQL `||' operator for string
+          concatenation; use `CONCAT()' instead. Because `CONCAT()'
+          takes any number of arguments, it is easy to convert use of
+          the `||' operator to MySQL Server.
+
+        * Use of `COUNT(DISTINCT VALUE_LIST)' where VALUE_LIST has more
+          than one element.
+
+        * String comparisons are case-insensitive by default, with sort
+          ordering determined by the collation of the current character
+          set, which is `latin1' (cp1252 West European) by default. If
+          you don't like this, you should declare your columns with the
+          `BINARY' attribute or use the `BINARY' cast, which causes
+          comparisons to be done using the underlying character code
+          values rather than a lexical ordering.
+
+        * The `%' operator is a synonym for `MOD()'. That is, `N % M'
+          is equivalent to `MOD(N,M)'.  `%' is supported for C
+          programmers and for compatibility with PostgreSQL.
+
+        * The `=', `<>', `<=', `<', `>=', `>', `<<', `>>', `<=>', `AND',
+          `OR', or `LIKE' operators may be used in expressions in the
+          output column list (to the left of the `FROM') in *Note
+          `SELECT': select. statements. For example:
+
+               mysql> SELECT col1=1 AND col2=2 FROM my_table;
+
+        * The `LAST_INSERT_ID()' function returns the most recent
+          `AUTO_INCREMENT' value. See *Note information-functions::.
+
+        * `LIKE' is permitted on numeric values.
+
+        * The `REGEXP' and `NOT REGEXP' extended regular expression
+          operators.
+
+        * `CONCAT()' or `CHAR()' with one argument or more than two
+          arguments. (In MySQL Server, these functions can take a
+          variable number of arguments.)
+
+        * The `BIT_COUNT()', `CASE', `ELT()', `FROM_DAYS()', `FORMAT()',
+          `IF()', `PASSWORD()', `ENCRYPT()', `MD5()', `ENCODE()',
+          `DECODE()', `PERIOD_ADD()', `PERIOD_DIFF()', `TO_DAYS()', and
+          `WEEKDAY()' functions.
+
+        * Use of `TRIM()' to trim substrings. Standard SQL supports
+          removal of single characters only.
+
+        * The `GROUP BY' functions `STD()', `BIT_OR()', `BIT_AND()',
+          `BIT_XOR()', and `GROUP_CONCAT()'. See *Note
+          group-by-functions-and-modifiers::.
+
+
+File: manual.info,  Node: differences-from-ansi,  Next: constraints,  Prev: extensions-to-ansi,  Up: compatibility
+
+2.8.5 MySQL Differences from Standard SQL
+-----------------------------------------
+
+* Menu:
+
+* ansi-diff-select-into-table::  `SELECT INTO TABLE'
+* ansi-diff-update::             `UPDATE'
+* ansi-diff-transactions::       Transactions and Atomic Operations
+* ansi-diff-foreign-keys::       Foreign Keys
+* ansi-diff-comments::           '`--'' as the Start of a Comment
+
+We try to make MySQL Server follow the ANSI SQL standard and the ODBC
+SQL standard, but MySQL Server performs operations differently in some
+cases:
+
+   * There are several differences between the MySQL and standard SQL
+     privilege systems. For example, in MySQL, privileges for a table
+     are not automatically revoked when you delete a table. You must
+     explicitly issue a *Note `REVOKE': revoke. statement to revoke
+     privileges for a table. For more information, see *Note revoke::.
+
+   * The `CAST()' function does not support cast to *Note `REAL':
+     numeric-types. or *Note `BIGINT': numeric-types. See *Note
+     cast-functions::.
+
+
+File: manual.info,  Node: ansi-diff-select-into-table,  Next: ansi-diff-update,  Prev: differences-from-ansi,  Up: differences-from-ansi
+
+2.8.5.1 `SELECT INTO TABLE'
+...........................
+
+MySQL Server doesn't support the `SELECT ... INTO TABLE' Sybase SQL
+extension. Instead, MySQL Server supports the *Note `INSERT INTO ...
+SELECT': insert-select. standard SQL syntax, which is basically the
+same thing. See *Note insert-select::. For example:
+
+     INSERT INTO tbl_temp2 (fld_id)
+         SELECT tbl_temp1.fld_order_id
+         FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;
+
+Alternatively, you can use *Note `SELECT ... INTO OUTFILE':
+select-into. or *Note `CREATE TABLE ... SELECT': create-table.
+
+You can use *Note `SELECT ... INTO': select. with user-defined
+variables. The same syntax can also be used inside stored routines
+using cursors and local variables. See *Note select-into::.
+
+
+File: manual.info,  Node: ansi-diff-update,  Next: ansi-diff-transactions,  Prev: ansi-diff-select-into-table,  Up: differences-from-ansi
+
+2.8.5.2 `UPDATE'
+................
+
+If you access a column from the table to be updated in an expression,
+*Note `UPDATE': update. uses the current value of the column. The
+second assignment in the following statement sets `col2' to the current
+(updated) `col1' value, not the original `col1' value. The result is
+that `col1' and `col2' have the same value. This behavior differs from
+standard SQL.
+
+     UPDATE t1 SET col1 = col1 + 1, col2 = col1;
+
+
+File: manual.info,  Node: ansi-diff-transactions,  Next: ansi-diff-foreign-keys,  Prev: ansi-diff-update,  Up: differences-from-ansi
+
+2.8.5.3 Transactions and Atomic Operations
+..........................................
+
+MySQL Server (version 3.23-max and all versions 4.0 and above) supports
+transactions with the `InnoDB' transactional storage engine. `InnoDB'
+provides _full_ ACID compliance. See *Note storage-engines::. For
+information about `InnoDB' differences from standard SQL with regard to
+treatment of transaction errors, see *Note innodb-error-handling::.
+
+The other nontransactional storage engines in MySQL Server (such as
+`MyISAM') follow a different paradigm for data integrity called `atomic
+operations.' In transactional terms, `MyISAM' tables effectively always
+operate in `autocommit = 1' mode. Atomic operations often offer
+comparable integrity with higher performance.
+
+Because MySQL Server supports both paradigms, you can decide whether
+your applications are best served by the speed of atomic operations or
+the use of transactional features. This choice can be made on a
+per-table basis.
+
+As noted, the tradeoff for transactional versus nontransactional
+storage engines lies mostly in performance.  Transactional tables have
+significantly higher memory and disk space requirements, and more CPU
+overhead. On the other hand, transactional storage engines such as
+`InnoDB' also offer many significant features. MySQL Server's modular
+design enables the concurrent use of different storage engines to suit
+different requirements and deliver optimum performance in all
+situations.
+
+But how do you use the features of MySQL Server to maintain rigorous
+integrity even with the nontransactional `MyISAM' tables, and how do
+these features compare with the transactional storage engines?
+
+   * If your applications are written in a way that is dependent on
+     being able to call *Note `ROLLBACK': commit.  rather than *Note
+     `COMMIT': commit. in critical situations, transactions are more
+     convenient.  Transactions also ensure that unfinished updates or
+     corrupting activities are not committed to the database; the
+     server is given the opportunity to do an automatic rollback and
+     your database is saved.
+
+     If you use nontransactional tables, MySQL Server in almost all
+     cases enables you to resolve potential problems by including
+     simple checks before updates and by running simple scripts that
+     check the databases for inconsistencies and automatically repair
+     or warn if such an inconsistency occurs. You can normally fix
+     tables perfectly with no data integrity loss just by using the
+     MySQL log or even adding one extra log.
+
+   * More often than not, critical transactional updates can be
+     rewritten to be atomic. Generally speaking, all integrity problems
+     that transactions solve can be done with *Note `LOCK TABLES':
+     lock-tables. or atomic updates, ensuring that there are no
+     automatic aborts from the server, which is a common problem with
+     transactional database systems.
+
+   * To be safe with MySQL Server, regardless of whether you use
+     transactional tables, you only need to have backups and have
+     binary logging turned on. When that is true, you can recover from
+     any situation that you could with any other transactional database
+     system. It is always good to have backups, regardless of which
+     database system you use.
+
+The transactional paradigm has its advantages and disadvantages. Many
+users and application developers depend on the ease with which they can
+code around problems where an abort appears to be necessary, or is
+necessary. However, even if you are new to the atomic operations
+paradigm, or more familiar with transactions, do consider the speed
+benefit that nontransactional tables can offer on the order of three to
+five times the speed of the fastest and most optimally tuned
+transactional tables.
+
+In situations where integrity is of highest importance, MySQL Server
+offers transaction-level reliability and integrity even for
+nontransactional tables. If you lock tables with *Note `LOCK TABLES':
+lock-tables, all updates stall until integrity checks are made. If you
+obtain a `READ LOCAL' lock (as opposed to a write lock) for a table
+that enables concurrent inserts at the end of the table, reads are
+permitted, as are inserts by other clients. The newly inserted records
+are not be seen by the client that has the read lock until it releases
+the lock. With *Note `INSERT DELAYED': insert-delayed, you can write
+inserts that go into a local queue until the locks are released,
+without having the client wait for the insert to complete. See *Note
+concurrent-inserts::, and *Note insert-delayed::.
+
+`Atomic,' in the sense that we mean it, is nothing magical. It only
+means that you can be sure that while each specific update is running,
+no other user can interfere with it, and there can never be an
+automatic rollback (which can happen with transactional tables if you
+are not very careful). MySQL Server also guarantees that there are no
+dirty reads.
+
+Following are some techniques for working with nontransactional tables:
+
+   * Loops that need transactions normally can be coded with the help
+     of *Note `LOCK TABLES': lock-tables, and you don't need cursors to
+     update records on the fly.
+
+   * To avoid using *Note `ROLLBACK': commit, you can employ the
+     following strategy:
+
+       1. Use *Note `LOCK TABLES': lock-tables. to lock all the tables
+          you want to access.
+
+       2. Test the conditions that must be true before performing the
+          update.
+
+       3. Update if the conditions are satisfied.
+
+       4. Use *Note `UNLOCK TABLES': lock-tables. to release your locks.
+
+     This is usually a much faster method than using transactions with
+     possible rollbacks, although not always.  The only situation this
+     solution doesn't handle is when someone kills the threads in the
+     middle of an update. In that case, all locks are released but some
+     of the updates may not have been executed.
+
+   * You can also use functions to update records in a single
+     operation. You can get a very efficient application by using the
+     following techniques:
+
+        * Modify columns relative to their current value.
+
+        * Update only those columns that actually have changed.
+
+     For example, when we are updating customer information, we update
+     only the customer data that has changed and test only that none of
+     the changed data, or data that depends on the changed data, has
+     changed compared to the original row. The test for changed data is
+     done with the `WHERE' clause in the *Note `UPDATE': update.
+     statement. If the record wasn't updated, we give the client a
+     message: `Some of the data you have changed has been changed by
+     another user.' Then we show the old row versus the new row in a
+     window so that the user can decide which version of the customer
+     record to use.
+
+     This gives us something that is similar to column locking but is
+     actually even better because we only update some of the columns,
+     using values that are relative to their current values. This means
+     that typical *Note `UPDATE': update. statements look something
+     like these:
+
+          UPDATE tablename SET pay_back=pay_back+125;
+
+          UPDATE customer
+            SET
+              customer_date='current_date',
+              address='new address',
+              phone='new phone',
+              money_owed_to_us=money_owed_to_us-125
+            WHERE
+              customer_id=id AND address='old address' AND phone='old phone';
+
+     This is very efficient and works even if another client has
+     changed the values in the `pay_back' or `money_owed_to_us' columns.
+
+   * In many cases, users have wanted *Note `LOCK TABLES': lock-tables.
+     or *Note `ROLLBACK': commit.  for the purpose of managing unique
+     identifiers. This can be handled much more efficiently without
+     locking or rolling back by using an `AUTO_INCREMENT' column and
+     either the `LAST_INSERT_ID()' SQL function or the *Note
+     `mysql_insert_id()': mysql-insert-id. C API function. See *Note
+     information-functions::, and *Note mysql-insert-id::.
+
+     You can generally code around the need for row-level locking. Some
+     situations really do need it, and `InnoDB' tables support row-level
+     locking. Otherwise, with `MyISAM' tables, you can use a flag
+     column in the table and do something like the following:
+
+          UPDATE TBL_NAME SET row_flag=1 WHERE id=ID;
+
+     MySQL returns `1' for the number of affected rows if the row was
+     found and `row_flag' wasn't `1' in the original row. You can think
+     of this as though MySQL Server changed the preceding statement to:
+
+          UPDATE TBL_NAME SET row_flag=1 WHERE id=ID AND row_flag <> 1;
+
+
+File: manual.info,  Node: ansi-diff-foreign-keys,  Next: ansi-diff-comments,  Prev: ansi-diff-transactions,  Up: differences-from-ansi
+
+2.8.5.4 Foreign Keys
+....................
+
+The `InnoDB' storage engine supports checking of foreign key
+constraints, including `CASCADE', `ON DELETE', and `ON UPDATE'. See
+*Note innodb-foreign-key-constraints::.
+
+For storage engines other than `InnoDB', MySQL Server parses the
+`FOREIGN KEY' syntax in *Note `CREATE TABLE': create-table. statements,
+but does not use or store it. In the future, the implementation will be
+extended to store this information in the table specification file so
+that it may be retrieved by *Note `mysqldump': mysqldump. and ODBC. At
+a later stage, foreign key constraints will be implemented for `MyISAM'
+tables as well.
+
+Foreign key enforcement offers several benefits to database developers:
+
+   * Assuming proper design of the relationships, foreign key
+     constraints make it more difficult for a programmer to introduce
+     an inconsistency into the database.
+
+   * Centralized checking of constraints by the database server makes
+     it unnecessary to perform these checks on the application side.
+     This eliminates the possibility that different applications may
+     not all check the constraints in the same way.
+
+   * Using cascading updates and deletes can simplify the application
+     code.
+
+   * Properly designed foreign key rules aid in documenting
+     relationships between tables.
+
+Do keep in mind that these benefits come at the cost of additional
+overhead for the database server to perform the necessary checks.
+Additional checking by the server affects performance, which for some
+applications may be sufficiently undesirable as to be avoided if
+possible. (Some major commercial applications have coded the foreign
+key logic at the application level for this reason.)
+
+MySQL gives database developers the choice of which approach to use. If
+you don't need foreign keys and want to avoid the overhead associated
+with enforcing referential integrity, you can choose another storage
+engine instead, such as `MyISAM'. (For example, the `MyISAM' storage
+engine offers very fast performance for applications that perform only
+*Note `INSERT': insert. and *Note `SELECT': select. operations. In this
+case, the table has no holes in the middle and the inserts can be
+performed concurrently with retrievals. See *Note concurrent-inserts::.)
+
+If you choose not to take advantage of referential integrity checks,
+keep the following considerations in mind:
+
+   * In the absence of server-side foreign key relationship checking,
+     the application itself must handle relationship issues. For
+     example, it must take care to insert rows into tables in the
+     proper order, and to avoid creating orphaned child records. It
+     must also be able to recover from errors that occur in the middle
+     of multiple-record insert operations.
+
+   * If `ON DELETE' is the only referential integrity capability an
+     application needs, you can achieve a similar effect as of MySQL
+     Server 4.0 by using multiple-table *Note `DELETE': delete.
+     statements to delete rows from many tables with a single
+     statement. See *Note delete::.
+
+   * A workaround for the lack of `ON DELETE' is to add the appropriate
+     *Note `DELETE': delete. statements to your application when you
+     delete records from a table that has a foreign key. In practice,
+     this is often as quick as using foreign keys and is more portable.
+
+Be aware that the use of foreign keys can sometimes lead to problems:
+
+   * Foreign key support addresses many referential integrity issues,
+     but it is still necessary to design key relationships carefully to
+     avoid circular rules or incorrect combinations of cascading
+     deletes.
+
+   * It is not uncommon for a DBA to create a topology of relationships
+     that makes it difficult to restore individual tables from a
+     backup. (MySQL alleviates this difficulty by enabling you to
+     temporarily disable foreign key checks when reloading a table that
+     depends on other tables. See *Note
+     innodb-foreign-key-constraints::. As of MySQL 4.1.1, *Note
+     `mysqldump': mysqldump. generates dump files that take advantage
+     of this capability automatically when they are reloaded.)
+
+Foreign keys in SQL are used to check and enforce referential
+integrity, not to join tables. If you want to get results from multiple
+tables from a *Note `SELECT': select.  statement, you do this by
+performing a join between them:
+
+     SELECT * FROM t1 INNER JOIN t2 ON t1.id = t2.id;
+
+See *Note join::, and *Note example-foreign-keys::.
+
+The `FOREIGN KEY' syntax without `ON DELETE ...' is often used by ODBC
+applications to produce automatic `WHERE' clauses.
+
+
+File: manual.info,  Node: ansi-diff-comments,  Prev: ansi-diff-foreign-keys,  Up: differences-from-ansi
+
+2.8.5.5 '`--'' as the Start of a Comment
+........................................
+
+Standard SQL uses the C syntax `/* this is a comment */' for comments,
+and MySQL Server supports this syntax as well. MySQL also support
+extensions to this syntax that enable MySQL-specific SQL to be embedded
+in the comment, as described in *Note comments::.
+
+Standard SQL uses ``--'' as a start-comment sequence. MySQL Server uses
+``#'' as the start comment character. MySQL Server 3.23.3 and up also
+supports a variant of the ``--'' comment style.  That is, the ``--''
+start-comment sequence must be followed by a space (or by a control
+character such as a newline). The space is required to prevent problems
+with automatically generated SQL queries that use constructs such as
+the following, where we automatically insert the value of the payment
+for `payment':
+
+     UPDATE account SET credit=credit-payment
+
+Consider about what happens if `payment' has a negative value such as
+`-1':
+
+     UPDATE account SET credit=credit--1
+
+`credit--1' is a legal expression in SQL, but ``--'' is interpreted as
+the start of a comment, part of the expression is discarded. The result
+is a statement that has a completely different meaning than intended:
+
+     UPDATE account SET credit=credit
+
+The statement produces no change in value at all. This illustrates that
+permitting comments to start with ``--'' can have serious consequences.
+
+Using our implementation requires a space following the ``--'' for it
+to be recognized as a start-comment sequence in MySQL Server 3.23.3 and
+newer.  Therefore, `credit--1' is safe to use.
+
+Another safe feature is that the *Note `mysql': mysql.  command-line
+client ignores lines that start with ``--''.
+
+The following information is relevant only if you are running a MySQL
+version earlier than 3.23.3:
+
+If you have an SQL script in a text file that contains ``--'' comments,
+you should use the *Note `replace': replace-utility. utility as follows
+to convert the comments to use ``#'' characters before executing the
+script:
+
+     shell> replace " --" " #" < text-file-with-funny-comments.sql \
+              | mysql DB_NAME
+
+That is safer than executing the script in the usual way:
+
+     shell> mysql DB_NAME < text-file-with-funny-comments.sql
+
+You can also edit the script file `in place' to change the ``--''
+comments to ``#'' comments:
+
+     shell> replace " --" " #" -- text-file-with-funny-comments.sql
+
+Change them back with this command:
+
+     shell> replace " #" " --" -- text-file-with-funny-comments.sql
+
+See *Note replace-utility::.
+
+
+File: manual.info,  Node: constraints,  Prev: differences-from-ansi,  Up: compatibility
+
+2.8.6 How MySQL Deals with Constraints
+--------------------------------------
+
+* Menu:
+
+* constraint-primary-key::       `PRIMARY KEY' and `UNIQUE' Index Constraints
+* constraint-invalid-data::      Constraints on Invalid Data
+* constraint-enum::              `ENUM' and `SET' Constraints
+
+MySQL enables you to work both with transactional tables that permit
+rollback and with nontransactional tables that do not.  Because of
+this, constraint handling is a bit different in MySQL than in other
+DBMSs. We must handle the case when you have inserted or updated a lot
+of rows in a nontransactional table for which changes cannot be rolled
+back when an error occurs.
+
+The basic philosophy is that MySQL Server tries to produce an error for
+anything that it can detect while parsing a statement to be executed,
+and tries to recover from any errors that occur while executing the
+statement. We do this in most cases, but not yet for all.
+
+The options MySQL has when an error occurs are to stop the statement in
+the middle or to recover as well as possible from the problem and
+continue. By default, the server follows the latter course. This means,
+for example, that the server may coerce illegal values to the closest
+legal values.
+
+Several SQL mode options are available to provide greater control over
+handling of bad data values and whether to continue statement execution
+or abort when errors occur. Using these options, you can configure
+MySQL Server to act in a more traditional fashion that is like other
+DBMSs that reject improper input. The SQL mode can be set globally at
+server startup to affect all clients. Individual clients can set the
+SQL mode at runtime, which enables each client to select the behavior
+most appropriate for its requirements. See *Note server-sql-mode::.
+
+The following sections describe how MySQL Server handles different
+types of constraints.
+
+
+File: manual.info,  Node: constraint-primary-key,  Next: constraint-invalid-data,  Prev: constraints,  Up: constraints
+
+2.8.6.1 `PRIMARY KEY' and `UNIQUE' Index Constraints
+....................................................
+
+Normally, errors occurs for data-change statements (such as *Note
+`INSERT': insert. or *Note `UPDATE': update.) that would violate
+primary-key, unique-key, or foreign-key constraints. If you are using a
+transactional storage engine such as `InnoDB', MySQL automatically
+rolls back the statement. If you are using a nontransactional storage
+engine, MySQL stops processing the statement at the row for which the
+error occurred and leaves any remaining rows unprocessed.
+
+MySQL supports an `IGNORE' keyword for *Note `INSERT': insert, *Note
+`UPDATE': update, and so forth. If you use it, MySQL ignores
+primary-key or unique-key violations and continues processing with the
+next row. See the section for the statement that you are using (*Note
+insert::, *Note update::, and so forth).
+
+You can get information about the number of rows actually inserted or
+updated with the *Note `mysql_info()': mysql-info. C API function.  You
+can also use the *Note `SHOW WARNINGS': show-warnings. statement. See
+*Note mysql-info::, and *Note show-warnings::.
+
+Currently, only `InnoDB' tables support foreign keys. See *Note
+innodb-foreign-key-constraints::.
+
+
+File: manual.info,  Node: constraint-invalid-data,  Next: constraint-enum,  Prev: constraint-primary-key,  Up: constraints
+
+2.8.6.2 Constraints on Invalid Data
+...................................
+
+By default, MySQL is forgiving of illegal or improper data values and
+coerces them to legal values for data entry.  However, you can change
+the server SQL mode to select more traditional treatment of bad values
+such that the server rejects them and aborts the statement in which
+they occur. See *Note server-sql-mode::.
+
+This section describes the default (forgiving) behavior of MySQL, as
+well as the strict SQL mode and how it differs.
+
+If you are not using strict mode, then whenever you insert an
+`incorrect' value into a column, such as a `NULL' into a `NOT NULL'
+column or a too-large numeric value into a numeric column, MySQL sets
+the column to the `best possible value' instead of producing an error:
+The following rules describe in more detail how this works:
+
+   * If you try to store an out of range value into a numeric column,
+     MySQL Server instead stores zero, the smallest possible value, or
+     the largest possible value, whichever is closest to the invalid
+     value.
+
+   * For strings, MySQL stores either the empty string or as much of
+     the string as can be stored in the column.
+
+   * If you try to store a string that doesn't start with a number into
+     a numeric column, MySQL Server stores 0.
+
+   * Invalid values for *Note `ENUM': enum. and *Note `SET': set.
+     columns are handled as described in *Note constraint-enum::.
+
+   * MySQL enables you to store certain incorrect date values into
+     *Note `DATE': datetime. and *Note `DATETIME': datetime. columns
+     (such as `'2000-02-31'' or `'2000-02-00''). The idea is that it is
+     not the job of the SQL server to validate dates. If MySQL can
+     store a date value and retrieve exactly the same value, MySQL
+     stores it as given. If the date is totally wrong (outside the
+     server's ability to store it), the special `zero' date value
+     `'0000-00-00'' is stored in the column instead.
+
+   * If you try to store `NULL' into a column that doesn't take `NULL'
+     values, an error occurs for single-row *Note `INSERT': insert.
+     statements. For multiple-row *Note `INSERT': insert.  statements
+     or for *Note `INSERT INTO ... SELECT': insert-select. statements,
+     MySQL Server stores the implicit default value for the column data
+     type. In general, this is `0' for numeric types, the empty string
+     (`''') for string types, and the `zero' value for date and time
+     types.  Implicit default values are discussed in *Note
+     data-type-defaults::.
+
+   * If an *Note `INSERT': insert. statement specifies no value for a
+     column, MySQL inserts its default value if the column definition
+     includes an explicit `DEFAULT' clause. If the definition has no
+     such `DEFAULT' clause, MySQL inserts the implicit default value
+     for the column data type.
+
+The reason for using the preceding rules in nonstrict mode is that we
+can't check these conditions until the statement has begun executing.
+We can't just roll back if we encounter a problem after updating a few
+rows, because the storage engine may not support rollback. The option
+of terminating the statement is not that good; in this case, the update
+would be `half done,' which is probably the worst possible scenario. In
+this case, it is better to `do the best you can' and then continue as
+if nothing happened.
+
+In MySQL 5.0.2 and up, you can select stricter treatment of input
+values by using the `STRICT_TRANS_TABLES' or `STRICT_ALL_TABLES' SQL
+modes:
+
+     SET sql_mode = 'STRICT_TRANS_TABLES';
+     SET sql_mode = 'STRICT_ALL_TABLES';
+
+`STRICT_TRANS_TABLES' enables strict mode for transactional storage
+engines, and also to some extent for nontransactional engines. It works
+like this:
+
+   * For transactional storage engines, bad data values occurring
+     anywhere in a statement cause the statement to abort and roll back.
+
+   * For nontransactional storage engines, a statement aborts if the
+     error occurs in the first row to be inserted or updated. (When the
+     error occurs in the first row, the statement can be aborted to
+     leave the table unchanged, just as for a transactional table.)
+     Errors in rows after the first do not abort the statement, because
+     the table has already been changed by the first row. Instead, bad
+     data values are adjusted and result in warnings rather than
+     errors. In other words, with `STRICT_TRANS_TABLES', a wrong value
+     causes MySQL to roll back all updates done so far, if that can be
+     done without changing the table. But once the table has been
+     changed, further errors result in adjustments and warnings.
+
+For even stricter checking, enable `STRICT_ALL_TABLES'. This is the
+same as `STRICT_TRANS_TABLES' except that for nontransactional storage
+engines, errors abort the statement even for bad data in rows following
+the first row.  This means that if an error occurs partway through a
+multiple-row insert or update for a nontransactional table, a partial
+update results. Earlier rows are inserted or updated, but those from
+the point of the error on are not. To avoid this for nontransactional
+tables, either use single-row statements or else use
+`STRICT_TRANS_TABLES' if conversion warnings rather than errors are
+acceptable. To avoid problems in the first place, do not use MySQL to
+check column content. It is safest (and often faster) to let the
+application ensure that it passes only legal values to the database.
+
+With either of the strict mode options, you can cause errors to be
+treated as warnings by using *Note `INSERT IGNORE': insert. or `UPDATE
+IGNORE' rather than *Note `INSERT': insert. or *Note `UPDATE': update.
+without `IGNORE'.
+
+
+File: manual.info,  Node: constraint-enum,  Prev: constraint-invalid-data,  Up: constraints
+
+2.8.6.3 `ENUM' and `SET' Constraints
+....................................
+
+*Note `ENUM': enum. and *Note `SET': set. columns provide an efficient
+way to define columns that can contain only a given set of values. See
+*Note enum::, and *Note set::. However, before MySQL 5.0.2, *Note
+`ENUM': enum. and *Note `SET': set. columns do not provide true
+constraints on entry of invalid data:
+
+   * *Note `ENUM': enum. columns always have a default value. If you
+     specify no default value, then it is `NULL' for columns that can
+     have `NULL', otherwise it is the first enumeration value in the
+     column definition.
+
+   * If you insert an incorrect value into an *Note `ENUM': enum.
+     column or if you force a value into an *Note `ENUM': enum. column
+     with `IGNORE', it is set to the reserved enumeration value of `0',
+     which is displayed as an empty string in string context.
+
+   * If you insert an incorrect value into a *Note `SET': set. column,
+     the incorrect value is ignored. For example, if the column can
+     contain the values `'a'', `'b'', and `'c'', an attempt to assign
+     `'a,x,b,y'' results in a value of `'a,b''.
+
+As of MySQL 5.0.2, you can configure the server to use strict SQL mode.
+See *Note server-sql-mode::. With strict mode enabled, the definition
+of a *Note `ENUM': enum. or *Note `SET': set. column does act as a
+constraint on values entered into the column. An error occurs for
+values that do not satisfy these conditions:
+
+   * An *Note `ENUM': enum. value must be one of those listed in the
+     column definition, or the internal numeric equivalent thereof. The
+     value cannot be the error value (that is, 0 or the empty string).
+     For a column defined as *Note `ENUM('a','b','c')': enum, values
+     such as `''', `'d'', or `'ax'' are illegal and are rejected.
+
+   * A *Note `SET': set. value must be the empty string or a value
+     consisting only of the values listed in the column definition
+     separated by commas. For a column defined as *Note
+     `SET('a','b','c')': set, values such as `'d'' or `'a,b,c,d'' are
+     illegal and are rejected.
+
+Errors for invalid values can be suppressed in strict mode if you use
+*Note `INSERT IGNORE': insert. or `UPDATE IGNORE'. In this case, a
+warning is generated rather than an error. For *Note `ENUM': enum, the
+value is inserted as the error member (`0'). For *Note `SET': set, the
+value is inserted as given except that any invalid substrings are
+deleted. For example, `'a,x,b,y'' results in a value of `'a,b''.
+
+
+File: manual.info,  Node: credits,  Prev: compatibility,  Up: introduction
+
+2.9 Credits
+===========
+
+* Menu:
+
+* contributors::                 Contributors to MySQL
+* documenters-translators::      Documenters and translators
+* packages::                     Packages that support MySQL
+* tools-used-to-create-mysql::   Tools that were used to create MySQL
+* supporters::                   Supporters of MySQL
+
+The following sections list developers, contributors, and supporters
+that have helped to make MySQL what it is today.
+
+
+File: manual.info,  Node: contributors,  Next: documenters-translators,  Prev: credits,  Up: credits
+
+2.9.1 Contributors to MySQL
+---------------------------
+
+Although Oracle Corporation and/or its affiliates own all copyrights in
+the `MySQL server' and the `MySQL manual', we wish to recognize those
+who have made contributions of one kind or another to the `MySQL
+distribution'. Contributors are listed here, in somewhat random order:
+
+   * Gianmassimo Vigazzola <qwerg@mbox.vol.it> or <qwerg@tin.it>
+
+     The initial port to Win32/NT.
+
+   * Per Eric Olsson
+
+     For constructive criticism and real testing of the dynamic record
+     format.
+
+   * Irena Pancirov <irena@mail.yacc.it>
+
+     Win32 port with Borland compiler.  `mysqlshutdown.exe' and
+     `mysqlwatch.exe'.
+
+   * David J. Hughes
+
+     For the effort to make a shareware SQL database. At TcX, the
+     predecessor of MySQL AB, we started with `mSQL', but found that it
+     couldn't satisfy our purposes so instead we wrote an SQL interface
+     to our application builder Unireg. *Note `mysqladmin': mysqladmin.
+     and *Note `mysql': mysql. client are programs that were largely
+     influenced by their `mSQL' counterparts. We have put a lot of
+     effort into making the MySQL syntax a superset of `mSQL'. Many of
+     the API's ideas are borrowed from `mSQL' to make it easy to port
+     free `mSQL' programs to the MySQL API.  The MySQL software doesn't
+     contain any code from `mSQL'. Two files in the distribution
+     (`client/insert_test.c' and `client/select_test.c') are based on
+     the corresponding (noncopyrighted) files in the `mSQL'
+     distribution, but are modified as examples showing the changes
+     necessary to convert code from `mSQL' to MySQL Server.  (`mSQL' is
+     copyrighted David J. Hughes.)
+
+   * Patrick Lynch
+
+     For helping us acquire http://www.mysql.com/.
+
+   * Fred Lindberg
+
+     For setting up qmail to handle the MySQL mailing list and for the
+     incredible help we got in managing the MySQL mailing lists.
+
+   * Igor Romanenko <igor@frog.kiev.ua>
+
+     *Note `mysqldump': mysqldump. (previously `msqldump', but ported
+     and enhanced by Monty).
+
+   * Yuri Dario
+
+     For keeping up and extending the MySQL OS/2 port.
+
+   * Tim Bunce
+
+     Author of *Note `mysqlhotcopy': mysqlhotcopy.
+
+   * Zarko Mocnik <zarko.mocnik@dem.si>
+
+     Sorting for Slovenian language.
+
+   * "TAMITO" <tommy@valley.ne.jp>
+
+     The `_MB' character set macros and the ujis and sjis character
+     sets.
+
+   * Joshua Chamas <joshua@chamas.com>
+
+     Base for concurrent insert, extended date syntax, debugging on NT,
+     and answering on the MySQL mailing list.
+
+   * Yves Carlier <Yves.Carlier@rug.ac.be>
+
+     *Note `mysqlaccess': mysqlaccess, a program to show the access
+     rights for a user.
+
+   * Rhys Jones <rhys@wales.com> (And GWE Technologies Limited)
+
+     For one of the early JDBC drivers.
+
+   * Dr Xiaokun Kelvin ZHU <X.Zhu@brad.ac.uk>
+
+     Further development of one of the early JDBC drivers and other
+     MySQL-related Java tools.
+
+   * James Cooper <pixel@organic.com>
+
+     For setting up a searchable mailing list archive at his site.
+
+   * Rick Mehalick <Rick_Mehalick@i-o.com>
+
+     For `xmysql', a graphical X client for MySQL Server.
+
+   * Doug Sisk <sisk@wix.com>
+
+     For providing RPM packages of MySQL for Red Hat Linux.
+
+   * Diemand Alexander V. <axeld@vial.ethz.ch>
+
+     For providing RPM packages of MySQL for Red Hat Linux-Alpha.
+
+   * Antoni Pamies Olive <toni@readysoft.es>
+
+     For providing RPM versions of a lot of MySQL clients for Intel and
+     SPARC.
+
+   * Jay Bloodworth <jay@pathways.sde.state.sc.us>
+
+     For providing RPM versions for MySQL 3.21.
+
+   * David Sacerdote <davids@secnet.com>
+
+     Ideas for secure checking of DNS host names.
+
+   * Wei-Jou Chen <jou@nematic.ieo.nctu.edu.tw>
+
+     Some support for Chinese(BIG5) characters.
+
+   * Wei He <hewei@mail.ied.ac.cn>
+
+     A lot of functionality for the Chinese(GBK) character set.
+
+   * Jan Pazdziora <adelton@fi.muni.cz>
+
+     Czech sorting order.
+
+   * Zeev Suraski <bourbon@netvision.net.il>
+
+     `FROM_UNIXTIME()' time formatting, `ENCRYPT()' functions, and
+     `bison' advisor. Active mailing list member.
+
+   * Luuk de Boer <luuk@wxs.nl>
+
+     Ported (and extended) the benchmark suite to `DBI'/`DBD'. Have
+     been of great help with `crash-me' and running benchmarks. Some
+     new date functions. The *Note `mysql_setpermission':
+     mysql-setpermission. script.
+
+   * Alexis Mikhailov <root@medinf.chuvashia.su>
+
+     User-defined functions (UDFs); *Note `CREATE FUNCTION':
+     create-function. and *Note `DROP FUNCTION': drop-function.
+
+   * Andreas F. Bobak <bobak@relog.ch>
+
+     The `AGGREGATE' extension to user-defined functions.
+
+   * Ross Wakelin <R.Wakelin@march.co.uk>
+
+     Help to set up InstallShield for MySQL-Win32.
+
+   * Jethro Wright III <jetman@li.net>
+
+     The `libmysql.dll' library.
+
+   * James Pereria <jpereira@iafrica.com>
+
+     Mysqlmanager, a Win32 GUI tool for administering MySQL Servers.
+
+   * Curt Sampson <cjs@portal.ca>
+
+     Porting of MIT-pthreads to NetBSD/Alpha and NetBSD 1.3/i386.
+
+   * Martin Ramsch <m.ramsch@computer.org>
+
+     Examples in the MySQL Tutorial.
+
+   * Steve Harvey
+
+     For making *Note `mysqlaccess': mysqlaccess. more secure.
+
+   * Konark IA-64 Centre of Persistent Systems Private Limited
+
+     `http://www.pspl.co.in/konark/'. Help with the Win64 port of the
+     MySQL server.
+
+   * Albert Chin-A-Young.
+
+     Configure updates for Tru64, large file support and better TCP
+     wrappers support.
+
+   * John Birrell
+
+     Emulation of `pthread_mutex()' for OS/2.
+
+   * Benjamin Pflugmann
+
+     Extended `MERGE' tables to handle `INSERTS'. Active member on the
+     MySQL mailing lists.
+
+   * Jocelyn Fournier
+
+     Excellent spotting and reporting innumerable bugs (especially in
+     the MySQL 4.1 subquery code).
+
+   * Marc Liyanage
+
+     Maintaining the Mac OS X packages and providing invaluable
+     feedback on how to create Mac OS X packages.
+
+   * Robert Rutherford
+
+     Providing invaluable information and feedback about the QNX port.
+
+   * Previous developers of NDB Cluster
+
+     Lots of people were involved in various ways summer students,
+     master thesis students, employees. In total more than 100 people
+     so too many to mention here. Notable name is Ataullah Dabaghi who
+     up until 1999 contributed around a third of the code base. A
+     special thanks also to developers of the AXE system which provided
+     much of the architectural foundations for NDB Cluster with blocks,
+     signals and crash tracing functionality. Also credit should be
+     given to those who believed in the ideas enough to allocate of
+     their budgets for its development from 1992 to present time.
+
+   * Google Inc.
+
+     We wish to recognize Google Inc. for contributions to the MySQL
+     distribution: Mark Callaghan's SMP Performance patches and other
+     patches.
+
+Other contributors, bugfinders, and testers: James H. Thompson,
+Maurizio Menghini, Wojciech Tryc, Luca Berra, Zarko Mocnik, Wim Bonis,
+Elmar Haneke, <jehamby@lightside>, <psmith@BayNetworks.com>,
+<duane@connect.com.au>, Ted Deppner <ted@psyber.com>, Mike Simons,
+Jaakko Hyvatti.
+
+And lots of bug report/patches from the folks on the mailing list.
+
+A big tribute goes to those that help us answer questions on the MySQL
+mailing lists:
+
+   * Daniel Koch <dkoch@amcity.com>
+
+     Irix setup.
+
+   * Luuk de Boer <luuk@wxs.nl>
+
+     Benchmark questions.
+
+   * Tim Sailer <tps@users.buoy.com>
+
+     `DBD::mysql' questions.
+
+   * Boyd Lynn Gerber <gerberb@zenez.com>
+
+     SCO-related questions.
+
+   * Richard Mehalick <RM186061@shellus.com>
+
+     `xmysql'-related questions and basic installation questions.
+
+   * Zeev Suraski <bourbon@netvision.net.il>
+
+     Apache module configuration questions (log & auth), PHP-related
+     questions, SQL syntax-related questions and other general
+     questions.
+
+   * Francesc Guasch <frankie@citel.upc.es>
+
+     General questions.
+
+   * Jonathan J Smith <jsmith@wtp.net>
+
+     Questions pertaining to OS-specifics with Linux, SQL syntax, and
+     other things that might need some work.
+
+   * David Sklar <sklar@student.net>
+
+     Using MySQL from PHP and Perl.
+
+   * Alistair MacDonald <A.MacDonald@uel.ac.uk>
+
+     Is flexible and can handle Linux and perhaps HP-UX.
+
+   * John Lyon <jlyon@imag.net>
+
+     Questions about installing MySQL on Linux systems, using either
+     `.rpm' files or compiling from source.
+
+   * Lorvid Ltd. <lorvid@WOLFENET.com>
+
+     Simple billing/license/support/copyright issues.
+
+   * Patrick Sherrill <patrick@coconet.com>
+
+     ODBC and VisualC++ interface questions.
+
+   * Randy Harmon <rjharmon@uptimecomputers.com>
+
+     `DBD', Linux, some SQL syntax questions.
+
+
+File: manual.info,  Node: documenters-translators,  Next: packages,  Prev: contributors,  Up: credits
+
+2.9.2 Documenters and translators
+---------------------------------
+
+The following people have helped us with writing the MySQL
+documentation and translating the documentation or error messages in
+MySQL.
+
+   * Paul DuBois
+
+     Ongoing help with making this manual correct and understandable.
+     That includes rewriting Monty's and David's attempts at English
+     into English as other people know it.
+
+   * Kim Aldale
+
+     Helped to rewrite Monty's and David's early attempts at English
+     into English.
+
+   * Michael J. Miller Jr.  <mke@terrapin.turbolift.com>
+
+     For the first MySQL manual. And a lot of spelling/language fixes
+     for the FAQ (that turned into the MySQL manual a long time ago).
+
+   * Yan Cailin
+
+     First translator of the MySQL Reference Manual into simplified
+     Chinese in early 2000 on which the Big5 and HK coded
+     (`http://mysql.hitstar.com/') versions were based. Personal home
+     page at linuxdb.yeah.net (http://linuxdb.yeah.net).
+
+   * Jay Flaherty <fty@mediapulse.com>
+
+     Big parts of the Perl `DBI'/`DBD' section in the manual.
+
+   * Paul Southworth <pauls@etext.org>, Ray Loyzaga <yar@cs.su.oz.au>
+
+     Proof-reading of the Reference Manual.
+
+   * Therrien Gilbert <gilbert@ican.net>, Jean-Marc Pouyot
+     <jmp@scalaire.fr>
+
+     French error messages.
+
+   * Petr Snajdr, <snajdr@pvt.net>
+
+     Czech error messages.
+
+   * Jaroslaw Lewandowski <jotel@itnet.com.pl>
+
+     Polish error messages.
+
+   * Miguel Angel Fernandez Roiz
+
+     Spanish error messages.
+
+   * Roy-Magne Mo <rmo@www.hivolda.no>
+
+     Norwegian error messages and testing of MySQL 3.21.xx.
+
+   * Timur I. Bakeyev <root@timur.tatarstan.ru>
+
+     Russian error messages.
+
+   * <brenno@dewinter.com> & Filippo Grassilli <phil@hyppo.com>
+
+     Italian error messages.
+
+   * Dirk Munzinger <dirk@trinity.saar.de>
+
+     German error messages.
+
+   * Billik Stefan <billik@sun.uniag.sk>
+
+     Slovak error messages.
+
+   * Stefan Saroiu <tzoompy@cs.washington.edu>
+
+     Romanian error messages.
+
+   * Peter Feher
+
+     Hungarian error messages.
+
+   * Roberto M. Serqueira
+
+     Portuguese error messages.
+
+   * Carsten H. Pedersen
+
+     Danish error messages.
+
+   * Arjen Lentz
+
+     Dutch error messages, completing earlier partial translation (also
+     work on consistency and spelling).
+
+
+File: manual.info,  Node: packages,  Next: tools-used-to-create-mysql,  Prev: documenters-translators,  Up: credits
+
+2.9.3 Packages that support MySQL
+---------------------------------
+
+The following is a list of creators/maintainers of some of the most
+important API/packages/applications that a lot of people use with MySQL.
+
+We cannot list every possible package here because the list would then
+be way to hard to maintain. For other packages, please refer to the
+software portal at `http://solutions.mysql.com/software/'.
+
+   * Tim Bunce, Alligator Descartes
+
+     For the `DBD' (Perl) interface.
+
+   * Andreas Koenig <a.koenig@mind.de>
+
+     For the Perl interface for MySQL Server.
+
+   * Jochen Wiedmann <wiedmann@neckar-alb.de>
+
+     For maintaining the Perl `DBD::mysql' module.
+
+   * Eugene Chan <eugene@acenet.com.sg>
+
+     For porting PHP for MySQL Server.
+
+   * Georg Richter
+
+     MySQL 4.1 testing and bug hunting. New PHP 5.0 `mysqli' extension
+     (API) for use with MySQL 4.1 and up.
+
+   * Giovanni Maruzzelli <maruzz@matrice.it>
+
+     For porting iODBC (Unix ODBC).
+
+   * Xavier Leroy <Xavier.Leroy@inria.fr>
+
+     The author of LinuxThreads (used by the MySQL Server on Linux).
+
+
+File: manual.info,  Node: tools-used-to-create-mysql,  Next: supporters,  Prev: packages,  Up: credits
+
+2.9.4 Tools that were used to create MySQL
+------------------------------------------
+
+The following is a list of some of the tools we have used to create
+MySQL. We use this to express our thanks to those that has created them
+as without these we could not have made MySQL what it is today.
+
+   * Free Software Foundation
+
+     From whom we got an excellent compiler (`gcc'), an excellent
+     debugger (`gdb' and the `libc' library (from which we have borrowed
+     `strto.c' to get some code working in Linux).
+
+   * Free Software Foundation & The XEmacs development team
+
+     For a really great editor/environment.
+
+   * Julian Seward
+
+     Author of `valgrind', an excellent memory checker tool that has
+     helped us find a lot of otherwise hard to find bugs in MySQL.
+
+   * Dorothea Lu"tkehaus and Andreas Zeller
+
+     For `DDD' (The Data Display Debugger) which is an excellent
+     graphical front end to `gdb').
+
+
+File: manual.info,  Node: supporters,  Prev: tools-used-to-create-mysql,  Up: credits
+
+2.9.5 Supporters of MySQL
+-------------------------
+
+Although Oracle Corporation and/or its affiliates own all copyrights in
+the `MySQL server' and the `MySQL manual', we wish to recognize the
+following companies, which helped us finance the development of the
+`MySQL server', such as by paying us for developing a new feature or
+giving us hardware for development of the `MySQL server'.
+
+   * VA Linux / Andover.net
+
+     Funded replication.
+
+   * NuSphere
+
+     Editing of the MySQL manual.
+
+   * Stork Design studio
+
+     The MySQL Web site in use between 1998-2000.
+
+   * Intel
+
+     Contributed to development on Windows and Linux platforms.
+
+   * Compaq
+
+     Contributed to Development on Linux/Alpha.
+
+   * SWSoft
+
+     Development on the embedded *Note `mysqld': mysqld. version.
+
+   * FutureQuest
+
+     The `--skip-show-database' option.
+
+
+File: manual.info,  Node: installing,  Next: tutorial,  Prev: introduction,  Up: Top
+
+3 Installing and Upgrading MySQL
+********************************
+
+* Menu:
+
+* general-installation-issues::  General Installation Guidance
+* binary-installation::          Installing MySQL from Generic Binaries on Unix/Linux
+* windows-installation::         Installing MySQL on Microsoft Windows
+* macosx-installation::          Installing MySQL on Mac OS X
+* linux-installation::           Installing MySQL on Linux
+* solaris-installation::         Installing MySQL on Solaris and OpenSolaris
+* aix-installation::             Installing MySQL on IBM AIX
+* hpux-installation::            Installing MySQL on HP-UX
+* freebsd-installation::         Installing MySQL on FreeBSD
+* i5os-installation::            Installing MySQL on i5/OS
+* source-installation::          Installing MySQL from Source
+* postinstallation::             Postinstallation Setup and Testing
+* upgrading-downgrading::        Upgrading or Downgrading MySQL
+* environment-variables::        Environment Variables
+* perl-support::                 Perl Installation Notes
+
+This chapter describes how to obtain and install MySQL. A summary of
+the procedure follows and later sections provide the details. If you
+plan to upgrade an existing version of MySQL to a newer version rather
+than install MySQL for the first time, see *Note upgrading::, for
+information about upgrade procedures and about issues that you should
+consider before upgrading.
+
+If you are interested in migrating to MySQL from another database
+system, you may wish to read *Note faqs-migration::, which contains
+answers to some common questions concerning migration issues.
+
+  1. *Determine whether MySQL runs and is supported on your platform.*
+
+     Please note that not all platforms are equally suitable for
+     running MySQL, and that not all platforms on which MySQL is known
+     to run are officially supported by Oracle Corporation:
+
+  2. *Choose which distribution to install.*
+
+     Several versions of MySQL are available, and most are available in
+     several distribution formats. You can choose from pre-packaged
+     distributions containing binary (precompiled) programs or source
+     code. When in doubt, use a binary distribution. We also provide
+     public access to our current source tree for those who want to see
+     our most recent developments and help us test new code. To
+     determine which version and type of distribution you should use,
+     see *Note which-version::.
+
+  3. *Download the distribution that you want to install.*
+
+     For instructions, see *Note getting-mysql::. To verify the
+     integrity of the distribution, use the instructions in *Note
+     verifying-package-integrity::.
+
+  4. *Install the distribution.*
+
+     To install MySQL from a binary distribution, use the instructions
+     in *Note binary-installation::.
+
+     To install MySQL from a source distribution or from the current
+     development source tree, use the instructions in *Note
+     source-installation::.
+
+  5. *Perform any necessary postinstallation setup.*
+
+     After installing MySQL, read *Note postinstallation::.  This
+     section contains important information about making sure the MySQL
+     server is working properly. It also describes how to secure the
+     initial MySQL user accounts, _which have no passwords_ until you
+     assign passwords. The section applies whether you install MySQL
+     using a binary or source distribution.
+
+  6. If you want to run the MySQL benchmark scripts, Perl support for
+     MySQL must be available. See *Note perl-support::.
+
+Instructions for installing MySQL on different platforms and
+environments is available on a platform by platform basis:
+
+   * *Unix, Linux, FreeBSD*
+
+     For instructions on installing MySQL on most Linux and Unix
+     platforms using a generic binary (for example, a `.tar.gz'
+     package), see *Note binary-installation::.
+
+     For information on building MySQL entirely from the source code
+     distributions or the source code repositories, see *Note
+     source-installation::
+
+     For specific platform help on installation, configuration, and
+     building from source see the corresponding platform section:
+
+        * Linux, including notes on distribution specific methods, see
+          *Note linux-installation::.
+
+        * Solaris and OpenSolaris, including PKG and IPS formats, see
+          *Note solaris-installation::.
+
+        * IBM AIX, see *Note solaris-installation::.
+
+        * Hewlett-Packard HP-UX, including the DEPOT package format,
+          see *Note hpux-installation::.
+
+        * FreeBSD, see *Note freebsd-installation::.
+
+   * *Microsoft Windows*
+
+     For instructions on installing MySQL on Microsoft Windows, using
+     either a Zipped binary or an MSI package, see *Note
+     windows-installation::.
+
+     For information on using the MySQL Server Instance Config Wizard,
+     see *Note mysql-config-wizard::.
+
+     For details and instructions on building MySQL from source code
+     using Microsoft Visual Studio, see *Note windows-source-build::.
+
+   * *Mac OS X*
+
+     For installation on Mac OS X, including using both the binary
+     package and native PKG formats, see *Note macosx-installation::.
+
+     For information on making use of the MySQL Startup Item to
+     automatically start and stop MySQL, see *Note
+     macosx-installation-startupitem::.
+
+     For information on the MySQL Preference Pane, see *Note
+     macosx-installation-prefpane::.
+
+   * *IBM i5/OS*
+
+     For instructions on installing, starting, and stopping MySQL on
+     i5/OS, see *Note i5os-installation::.
+
+
+File: manual.info,  Node: general-installation-issues,  Next: binary-installation,  Prev: installing,  Up: installing
+
+3.1 General Installation Guidance
+=================================
+
+* Menu:
+
+* supported-os::                 Operating Systems Supported by MySQL Community Server
+* which-version::                Choosing Which MySQL Distribution to Install
+* getting-mysql::                How to Get MySQL
+* verifying-package-integrity::  Verifying Package Integrity Using MD5 Checksums or `GnuPG'
+* installation-layouts::         Installation Layouts
+* compiler-characteristics::     Compiler-Specific Build Characteristics
+
+The immediately following sections contain the information necessary to
+choose, download, and verify your distribution. The instructions in
+later sections of the chapter describe how to install the distribution
+that you choose. For binary distributions, see the instructions at
+*Note binary-installation:: or the corresponding section for your
+platform if available. To build MySQL from source, use the instructions
+in *Note source-installation::.
+
+
+File: manual.info,  Node: supported-os,  Next: which-version,  Prev: general-installation-issues,  Up: general-installation-issues
+
+3.1.1 Operating Systems Supported by MySQL Community Server
+-----------------------------------------------------------
+
+This section lists the operating systems on which MySQL Community
+Server is known to run.
+
+*Important*:
+
+Oracle Corporation does not necessarily provide official support for
+all the platforms listed in this section. For information about those
+platforms that are officially supported, see
+http://www.mysql.com/support/supportedplatforms.html on the MySQL Web
+site.
+
+We use GNU Autoconf, so it is possible to port MySQL to all modern
+systems that have a C++ compiler and a working implementation of POSIX
+threads. (Thread support is needed for the server. To compile only the
+client code, the only requirement is a C++ compiler.)
+
+MySQL has been reported to compile successfully on the following
+combinations of operating system and thread package.
+
+   * AIX 4.x, 5.x with native threads. See *Note aix-installation::.
+     AIX 5.3 should be upgraded to technology level 7 (5300-07).
+
+   * FreeBSD 5.x and up with native threads. See *Note
+     freebsd-installation::.
+
+   * HP-UX 11.x with the native threads. See *Note hpux-installation::.
+
+   * Linux. Builds on all recent Linux distributions based on the 2.6
+     kernel. See *Note linux-installation::.
+
+   * Mac OS X. See *Note macosx-installation::.
+
+   * Solaris 2.8 on SPARC and x86, including support for native
+     threads. See *Note solaris-installation::.
+
+   * Windows 2000, Windows XP, Windows Vista, Windows Server 2003, and
+     Windows Server 2008. See *Note windows-installation::.
+
+MySQL has also been known to run on other systems in the past. See
+*Note general-installation-issues::. Some porting effort might be
+required for current versions of MySQL on these systems.
+
+Not all platforms are equally well-suited for running MySQL. How well a
+certain platform is suited for a high-load mission-critical MySQL
+server is determined by the following factors:
+
+   * General stability of the thread library. A platform may have an
+     excellent reputation otherwise, but MySQL is only as stable as the
+     thread library it calls, even if everything else is perfect.
+
+   * The capability of the kernel and the thread library to take
+     advantage of symmetric multi-processor (SMP) systems. In other
+     words, when a process creates a thread, it should be possible for
+     that thread to run on a CPU different from the original process.
+
+   * The capability of the kernel and the thread library to run many
+     threads that acquire and release a mutex over a short critical
+     region frequently without excessive context switches.  If the
+     implementation of `pthread_mutex_lock()' is too anxious to yield
+     CPU time, this hurts MySQL tremendously. If this issue is not
+     taken care of, adding extra CPUs actually makes MySQL slower.
+
+   * General file system stability and performance.
+
+   * Table size. If your tables are large, performance is affected by
+     the ability of the file system to deal with large files and
+     dealing with them efficiently.
+
+   * Our level of expertise here at Oracle Corporation with the
+     platform. If we know a platform well, we enable platform-specific
+     optimizations and fixes at compile time. We can also provide
+     advice on configuring your system optimally for MySQL.
+
+   * The amount of testing we have done internally for similar
+     configurations.
+
+   * The number of users that have run MySQL successfully on the
+     platform in similar configurations. If this number is high, the
+     likelihood of encountering platform-specific surprises is much
+     smaller.
+
+
+File: manual.info,  Node: which-version,  Next: getting-mysql,  Prev: supported-os,  Up: general-installation-issues
+
+3.1.2 Choosing Which MySQL Distribution to Install
+--------------------------------------------------
+
+* Menu:
+
+* choosing-version::             Choosing Which Version of MySQL to Install
+* choosing-distribution-format::  Choosing a Distribution Format
+* many-versions::                How and When Updates Are Released
+
+When preparing to install MySQL, you should decide which version to
+use. MySQL development occurs in several release series, and you can
+pick the one that best fits your needs. After deciding which version to
+install, you can choose a distribution format.  Releases are available
+in binary or source format.
+
+
+File: manual.info,  Node: choosing-version,  Next: choosing-distribution-format,  Prev: which-version,  Up: which-version
+
+3.1.2.1 Choosing Which Version of MySQL to Install
+..................................................
+
+The first decision to make is whether you want to use a production
+(stable) release or a development release. In the MySQL development
+process, multiple release series co-exist, each at a different stage of
+maturity.
+
+* Production Releases *
+   * MySQL 5.5: Latest General Availability (Production) release
+
+   * MySQL 5.1: Previous stable (production-quality) release
+
+   * MySQL 5.0: Older stable release nearing the end of the product
+     lifecycle
+
+* Development Release *
+   * MySQL 5.6: Current release under development (pre-Production)
+
+MySQL 4.1, 4.0, and 3.23 are old releases that are no longer supported.
+
+See http://www.mysql.com/about/legal/lifecycle/ for information about
+support policies and schedules.
+
+Normally, if you are beginning to use MySQL for the first time or
+trying to port it to some system for which there is no binary
+distribution, use the most recent General Availability series listed in
+the preceding descriptions. All MySQL releases, even those from
+development series, are checked with the MySQL benchmarks and an
+extensive test suite before being issued.
+
+If you are running an older system and want to upgrade, but do not want
+to take the chance of having a nonseamless upgrade, you should upgrade
+to the latest version in the same release series you are using (where
+only the last part of the version number is newer than yours). We have
+tried to fix only fatal bugs and make only small, relatively `safe'
+changes to that version.
+
+If you want to use new features not present in the production release
+series, you can use a version from a development series.  Be aware that
+development releases are not as stable as production releases.
+
+We do not use a complete code freeze because this prevents us from
+making bugfixes and other fixes that must be done. We may add small
+things that should not affect anything that currently works in a
+production release. Naturally, relevant bugfixes from an earlier series
+propagate to later series.
+
+If you want to use the very latest sources containing all current
+patches and bugfixes, you can use one of our source code repositories
+(see *Note installing-development-tree::). These are not `releases' as
+such, but are available as previews of the code on which future
+releases are to be based.
+
+The naming scheme in MySQL 5.1 uses release names that consist of three
+numbers and a suffix; for example, *mysql-5.1.29-rc*. The numbers
+within the release name are interpreted as follows:
+
+   * The first number (*5*) is the major version and describes the file
+     format. All MySQL 5 releases have the same file format.
+
+   * The second number (*1*) is the release level. Taken together, the
+     major version and release level constitute the release series
+     number.
+
+   * The third number (*29*) is the version number within the release
+     series. This is incremented for each new release. Usually you want
+     the latest version for the series you have chosen.
+
+For each minor update, the last number in the version string is
+incremented. When there are major new features or minor
+incompatibilities with previous versions, the second number in the
+version string is incremented. When the file format changes, the first
+number is increased.
+
+Release names also include a suffix to indicates the stability level of
+the release. Releases within a series progress through a set of
+suffixes to indicate how the stability level improves.  The possible
+suffixes are:
+
+   * *alpha* indicates that the release is for preview purposes only.
+     Known bugs should be documented in the News section (see *Note
+     news::).  Most alpha releases implement new commands and
+     extensions.  Active development that may involve major code
+     changes can occur in an alpha release. However, we do conduct
+     testing before issuing a release.
+
+   * *beta* indicates that the release is appropriate for use with new
+     development. Within beta releases, the features and compatibility
+     should remain consistent. However, beta releases may contain
+     numerous and major unaddressed bugs.
+
+     All APIs, externally visible structures, and columns for SQL
+     statements will not change during future beta, release candidate,
+     or production releases.
+
+   * *rc* indicates a Release Candidate. Release candidates are
+     believed to be stable, having passed all of MySQL's internal
+     testing, and with all known fatal runtime bugs fixed. However, the
+     release has not been in widespread use long enough to know for
+     sure that all bugs have been identified. Only minor fixes are
+     added. (A release candidate is what formerly was known as a gamma
+     release.)
+
+   * If there is no suffix, it indicates that the release is a General
+     Availability (GA) or Production release. GA releases are stable,
+     having successfully passed through all earlier release stages and
+     are believed to be reliable, free of serious bugs, and suitable
+     for use in production systems.  Only critical bugfixes are applied
+     to the release.
+
+All releases of MySQL are run through our standard tests and benchmarks
+to ensure that they are relatively safe to use.  Because the standard
+tests are extended over time to check for all previously found bugs,
+the test suite keeps getting better.
+
+All releases have been tested at least with these tools:
+
+   * An internal test suite
+
+     The `mysql-test' directory contains an extensive set of test
+     cases. We run these tests for every server binary. See *Note
+     mysql-test-suite::, for more information about this test suite.
+
+   * The MySQL benchmark suite
+
+     This suite runs a range of common queries. It is also a test to
+     determine whether the latest batch of optimizations actually made
+     the code faster. See *Note mysql-benchmarks::.
+
+We also perform additional integration and nonfunctional testing of the
+latest MySQL version in our internal production environment.
+Integration testing is done with different connectors, storage engines,
+replication modes, backup, partitioning, stored programs, and so forth
+in various combinations. Additional nonfunctional testing is done in
+areas of performance, concurrency, stress, high volume, upgrade and
+downgrade.
+
+
+File: manual.info,  Node: choosing-distribution-format,  Next: many-versions,  Prev: choosing-version,  Up: which-version
+
+3.1.2.2 Choosing a Distribution Format
+......................................
+
+After choosing which version of MySQL to install, you should decide
+whether to use a binary distribution or a source distribution. In most
+cases, you should probably use a binary distribution, if one exists for
+your platform. Binary distributions are available in native format for
+many platforms, such as RPM files for Linux or PKG package installers
+for Mac OS X or Solaris. Distributions also are available as Zip
+archives or compressed `tar' files.
+
+Reasons to choose a binary distribution include the following:
+
+   * Binary distributions generally are easier to install than source
+     distributions.
+
+   * To satisfy different user requirements, we provide several servers
+     in binary distributions. *Note `mysqld': mysqld.  is an optimized
+     server that is a smaller, faster binary.  *Note `mysqld-debug':
+     mysqld. is compiled with debugging support.
+
+     Each of these servers is compiled from the same source
+     distribution, though with different configuration options.  All
+     native MySQL clients can connect to servers from either MySQL
+     version.
+
+Under some circumstances, you may be better off installing MySQL from a
+source distribution:
+
+   * You want to install MySQL at some explicit location. The standard
+     binary distributions are ready to run at any installation
+     location, but you might require even more flexibility to place
+     MySQL components where you want.
+
+   * You want to configure *Note `mysqld': mysqld. to ensure that
+     features are available that might not be included in the standard
+     binary distributions. Here is a list of the most common extra
+     options that you may want to use to ensure feature availability:
+
+        * `--with-libwrap'
+
+        * `--with-named-z-libs' (this is done for some of the binaries)
+
+        * `--with-debug[=full]'
+
+   * You want to configure *Note `mysqld': mysqld. without some
+     features that are included in the standard binary distributions.
+     For example, distributions normally are compiled with support for
+     all character sets. If you want a smaller MySQL server, you can
+     recompile it with support for only the character sets you need.
+
+   * You want to use the latest sources from one of the Bazaar
+     repositories to have access to all current bugfixes. For example,
+     if you have found a bug and reported it to the MySQL development
+     team, the bugfix is committed to the source repository and you can
+     access it there. The bugfix does not appear in a release until a
+     release actually is issued.
+
+   * You want to read (or modify) the C and C++ code that makes up
+     MySQL. For this purpose, you should get a source distribution,
+     because the source code is always the ultimate manual.
+
+   * Source distributions contain more tests and examples than binary
+     distributions.
+
+
+File: manual.info,  Node: many-versions,  Prev: choosing-distribution-format,  Up: which-version
+
+3.1.2.3 How and When Updates Are Released
+.........................................
+
+MySQL is evolving quite rapidly and we want to share new developments
+with other MySQL users. We try to produce a new release whenever we
+have new and useful features that others also seem to have a need for.
+
+We also try to help users who request features that are easy to
+implement. We take note of what our licensed users want, and we
+especially take note of what our support customers want and try to help
+them in this regard.
+
+No one is _required_ to download a new release. The News section helps
+you determine whether the new release has something you really want. See
+*Note news::.
+
+We use the following policy when updating MySQL:
+
+   * Enterprise Server releases are meant to appear every 18 months,
+     supplemented by quarterly service packs and monthly rapid updates.
+     Community Server releases are meant to appear 2 to 3 times per
+     year.
+
+   * Releases are issued within each series. For each release, the last
+     number in the version is one more than the previous release within
+     the same series.
+
+   * Binary distributions for some platforms are made by us for major
+     releases. Other people may make binary distributions for other
+     systems, but probably less frequently.
+
+   * We make fixes available as soon as we have identified and
+     corrected small or noncritical but annoying bugs. The fixes are
+     available in source form immediately from our public Bazaar
+     repositories, and are included in the next release.
+
+   * If by any chance a security vulnerability or critical bug is found
+     in a release, our policy is to fix it in a new release as soon as
+     possible. (We would like other companies to do this, too!)
+
+
+File: manual.info,  Node: getting-mysql,  Next: verifying-package-integrity,  Prev: which-version,  Up: general-installation-issues
+
+3.1.3 How to Get MySQL
+----------------------
+
+Check our downloads page at `http://dev.mysql.com/downloads/' for
+information about the current version of MySQL and for downloading
+instructions. For a complete up-to-date list of MySQL download mirror
+sites, see `http://dev.mysql.com/downloads/mirrors.html'. You can also
+find information there about becoming a MySQL mirror site and how to
+report a bad or out-of-date mirror.
+
+To obtain the latest development source, see *Note
+installing-development-tree::.
+
+
+File: manual.info,  Node: verifying-package-integrity,  Next: installation-layouts,  Prev: getting-mysql,  Up: general-installation-issues
+
+3.1.4 Verifying Package Integrity Using MD5 Checksums or `GnuPG'
+----------------------------------------------------------------
+
+* Menu:
+
+* verifying-md5-checksum::       Verifying the MD5 Checksum
+* checking-gpg-signature::       Signature Checking Using `GnuPG'
+* checking-rpm-signature::       Signature Checking Using `RPM'
+
+After you have downloaded the MySQL package that suits your needs and
+before you attempt to install it, you should make sure that it is
+intact and has not been tampered with. There are three means of
+integrity checking:
+
+   * MD5 checksums
+
+   * Cryptographic signatures using `GnuPG', the GNU Privacy Guard
+
+   * For RPM packages, the built-in RPM integrity verification mechanism
+
+The following sections describe how to use these methods.
+
+If you notice that the MD5 checksum or GPG signatures do not match,
+first try to download the respective package one more time, perhaps
+from another mirror site. If you repeatedly cannot successfully verify
+the integrity of the package, please notify us about such incidents,
+including the full package name and the download site you have been
+using, at <webmaster@mysql.com> or <build@mysql.com>. Do not report
+downloading problems using the bug-reporting system.
+
+
+File: manual.info,  Node: verifying-md5-checksum,  Next: checking-gpg-signature,  Prev: verifying-package-integrity,  Up: verifying-package-integrity
+
+3.1.4.1 Verifying the MD5 Checksum
+..................................
+
+After you have downloaded a MySQL package, you should make sure that
+its MD5 checksum matches the one provided on the MySQL download pages.
+Each package has an individual checksum that you can verify with the
+following command, where PACKAGE_NAME is the name of the package you
+downloaded:
+
+     shell> md5sum PACKAGE_NAME
+
+Example:
+
+     shell> md5sum mysql-standard-5.1.62-linux-i686.tar.gz
+     aaab65abbec64d5e907dcd41b8699945  mysql-standard-5.1.62-linux-i686.tar.gz
+
+You should verify that the resulting checksum (the string of
+hexadecimal digits) matches the one displayed on the download page
+immediately below the respective package.
+
+*Note*:
+
+Make sure to verify the checksum of the _archive file_ (for example,
+the `.zip' or `.tar.gz' file) and not of the files that are contained
+inside of the archive.
+
+Note that not all operating systems support the `md5sum' command. On
+some, it is simply called `md5', and others do not ship it at all. On
+Linux, it is part of the *GNU Text Utilities* package, which is
+available for a wide range of platforms. You can download the source
+code from `http://www.gnu.org/software/textutils/' as well.  If you
+have OpenSSL installed, you can use the command `openssl md5
+PACKAGE_NAME' instead. A Windows implementation of the `md5' command
+line utility is available from `http://www.fourmilab.ch/md5/'.
+`winMd5Sum' is a graphical MD5 checking tool that can be obtained from
+`http://www.nullriver.com/index/products/winmd5sum'.
+
+
+File: manual.info,  Node: checking-gpg-signature,  Next: checking-rpm-signature,  Prev: verifying-md5-checksum,  Up: verifying-package-integrity
+
+3.1.4.2 Signature Checking Using `GnuPG'
+........................................
+
+Another method of verifying the integrity and authenticity of a package
+is to use cryptographic signatures. This is more reliable than using
+MD5 checksums, but requires more work.
+
+We sign MySQL downloadable packages with `GnuPG' (GNU Privacy Guard).
+`GnuPG' is an Open Source alternative to the well-known Pretty Good
+Privacy (`PGP') by Phil Zimmermann. See `http://www.gnupg.org/' for more
+information about `GnuPG' and how to obtain and install it on your
+system. Most Linux distributions ship with `GnuPG' installed by
+default. For more information about `GnuPG', see
+`http://www.openpgp.org/'.
+
+To verify the signature for a specific package, you first need to
+obtain a copy of our public GPG build key, which you can download from
+`http://pgp.mit.com/'. The key that you want to obtain is named
+`mysql-build@oss.oracle.com'. Alternatively, you can cut and paste the
+key directly from the following text:
+
+     -----BEGIN PGP PUBLIC KEY BLOCK-----
+     Version: PGP Universal 2.9.1 (Build 347)
+
+     mQGiBD4+owwRBAC14GIfUfCyEDSIePvEW3SAFUdJBtoQHH/nJKZyQT7h9bPlUWC3
+     RODjQReyCITRrdwyrKUGku2FmeVGwn2u2WmDMNABLnpprWPkBdCk96+OmSLN9brZ
+     fw2vOUgCmYv2hW0hyDHuvYlQA/BThQoADgj8AW6/0Lo7V1W9/8VuHP0gQwCgvzV3
+     BqOxRznNCRCRxAuAuVztHRcEAJooQK1+iSiunZMYD1WufeXfshc57S/+yeJkegNW
+     hxwR9pRWVArNYJdDRT+rf2RUe3vpquKNQU/hnEIUHJRQqYHo8gTxvxXNQc7fJYLV
+     K2HtkrPbP72vwsEKMYhhr0eKCbtLGfls9krjJ6sBgACyP/Vb7hiPwxh6rDZ7ITnE
+     kYpXBACmWpP8NJTkamEnPCia2ZoOHODANwpUkP43I7jsDmgtobZX9qnrAXw+uNDI
+     QJEXM6FSbi0LLtZciNlYsafwAPEOMDKpMqAK6IyisNtPvaLd8lH0bPAnWqcyefep
+     rv0sxxqUEMcM3o7wwgfN83POkDasDbs3pjwPhxvhz6//62zQJ7Q2TXlTUUwgUmVs
+     ZWFzZSBFbmdpbmVlcmluZyA8bXlzcWwtYnVpbGRAb3NzLm9yYWNsZS5jb20+iGYE
+     ExECACYCGyMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAUCTnc+KgUJE/sCFQAKCRCM
+     cY07UHLh9SbMAJ4l1+qBz2BZNSGCZwwA6YbhGPC7FwCgp8z5TzIw4YQuL5NGJ/sy
+     0oSazqmJASIEEAECAAwFAk53QS4FAwASdQAACgkQlxC4m8pXrXwJ8Qf/be/UO9mq
+     foc2sMyhwMpN4/fdBWwfLkA12FXQDOQMvwH9HsmEjnfUgYKXschZRi+DuHXe1P7l
+     8G2aQLubhBsQf9ejKvRFTzuWMQkdIq+6Koulxv6ofkCcv3d1xtO2W7nb5yxcpVBP
+     rRfGFGebJvZa58DymCNgyGtAU6AOz4veavNmI2+GIDQsY66+tYDvZ+CxwzdYu+HD
+     V9HmrJfc6deM0mnBn7SRjqzxJPgoTQhihTav6q/R5/2p5NvQ/H84OgS6GjosfGc2
+     duUDzCP/kheMRKfzuyKCOHQPtJuIj8++gfpHtEU7IDUX1So3c9n0PdpeBvclsDbp
+     RnCNxQWU4mBot7kCDQQ+PqMdEAgA7+GJfxbMdY4wslPnjH9rF4N2qfWsEN/lxaZo
+     JYc3a6M02WCnHl6ahT2/tBK2w1QI4YFteR47gCvtgb6O1JHffOo2HfLmRDRiRjd1
+     DTCHqeyX7CHhcghj/dNRlW2Z0l5QFEcmV9U0Vhp3aFfWC4Ujfs3LU+hkAWzE7zaD
+     5cH9J7yv/6xuZVw411x0h4UqsTcWMu0iM1BzELqX1DY7LwoPEb/O9Rkbf4fmLe11
+     EzIaCa4PqARXQZc4dhSinMt6K3X4BrRsKTfozBu74F47D8Ilbf5vSYHbuE5p/1oI
+     Dznkg/p8kW+3FxuWrycciqFTcNz215yyX39LXFnlLzKUb/F5GwADBQf+Lwqqa8CG
+     rRfsOAJxim63CHfty5mUc5rUSnTslGYEIOCR1BeQauyPZbPDsDD9MZ1ZaSafanFv
+     wFG6Llx9xkU7tzq+vKLoWkm4u5xf3vn55VjnSd1aQ9eQnUcXiL4cnBGoTbOWI39E
+     cyzgslzBdC++MPjcQTcA7p6JUVsP6oAB3FQWg54tuUo0Ec8bsM8b3Ev42LmuQT5N
+     dKHGwHsXTPtl0klk4bQk4OajHsiy1BMahpT27jWjJlMiJc+IWJ0mghkKHt926s/y
+     mfdf5HkdQ1cyvsz5tryVI3Fx78XeSYfQvuuwqp2H139pXGEkg0n6KdUOetdZWhe7
+     0YGNPw1yjWJT1IhUBBgRAgAMBQJOdz3tBQkT+wG4ABIHZUdQRwABAQkQjHGNO1By
+     4fUUmwCbBYr2+bBEn/L2BOcnw9Z/QFWuhRMAoKVgCFm5fadQ3Afi+UQlAcOphrnJ
+     =Eto8
+     -----END PGP PUBLIC KEY BLOCK-----
+
+To import the build key into your personal public GPG keyring, use `gpg
+--import'. For example, if you have saved the key in a file named
+`mysql_pubkey.asc', the import command looks like this:
+
+     shell> gpg --import mysql_pubkey.asc
+     gpg: key 5072E1F5: public key "MySQL Release Engineering
+     <mysql-build@oss.oracle.com>" imported
+     gpg: Total number processed: 1
+     gpg:               imported: 1
+     gpg: no ultimately trusted keys found
+
+You can also download the key from the public keyserver using the
+public key id, `5072E1F5':
+
+     shell> gpg --recv-keys 5072E1F5
+     gpg: requesting key 5072E1F5 from hkp server keys.gnupg.net
+     gpg: key 5072E1F5: "MySQL Release Engineering <mysql-build@oss.oracle.com>"
+     1 new user ID
+     gpg: key 5072E1F5: "MySQL Release Engineering <mysql-build@oss.oracle.com>"
+     53 new signatures
+     gpg: no ultimately trusted keys found
+     gpg: Total number processed: 1
+     gpg:           new user IDs: 1
+     gpg:         new signatures: 53
+
+If you want to import the key into your RPM configuration to validate
+RPM install packages, you should be able to import the key directly:
+
+     shell> rpm --import mysql_pubkey.asc
+
+If you experience problems, try exporting the key from `gpg' and
+importing:
+
+     shell> gpg --export -a 5072e1f5 > 5072e1f5.asc
+     shell> rpm --import 5072e1f5.asc
+
+Alternatively, `rpm' also supports loading the key directly from a URL,
+and you cas use this manual page:
+
+     shell> rpm --import http://dev.mysql.com/doc/refman/5.1/en/checking-gpg-signature.html
+
+After you have downloaded and imported the public build key, download
+your desired MySQL package and the corresponding signature, which also
+is available from the download page. The signature file has the same
+name as the distribution file with an `.asc' extension, as shown by the
+examples in the following table.
+
+*MySQL Package and Signature Files*
+
+File Type          File Name
+Distribution file  `mysql-standard-5.1.62-linux-i686.tar.gz'
+Signature file     `mysql-standard-5.1.62-linux-i686.tar.gz.asc'
+
+Make sure that both files are stored in the same directory and then run
+the following command to verify the signature for the distribution file:
+
+     shell> gpg --verify PACKAGE_NAME.asc
+
+Example:
+
+     shell> gpg --verify mysql-standard-5.1.62-linux-i686.tar.gz.asc
+     gpg: Signature made Tue 01 Feb 2011 02:38:30 AM CST using DSA key ID 5072E1F5
+     gpg: Good signature from "MySQL Release Engineering <mysql-build@oss.oracle.com>"
+
+The `Good signature' message indicates that everything is all right.
+You can ignore any `insecure memory' warning you might obtain.
+
+See the GPG documentation for more information on how to work with
+public keys.
+
+
+File: manual.info,  Node: checking-rpm-signature,  Prev: checking-gpg-signature,  Up: verifying-package-integrity
+
+3.1.4.3 Signature Checking Using `RPM'
+......................................
+
+For RPM packages, there is no separate signature. RPM packages have a
+built-in GPG signature and MD5 checksum. You can verify a package by
+running the following command:
+
+     shell> rpm --checksig PACKAGE_NAME.rpm
+
+Example:
+
+     shell> rpm --checksig MySQL-server-5.1.62-0.glibc23.i386.rpm
+     MySQL-server-5.1.62-0.glibc23.i386.rpm: md5 gpg OK
+
+*Note*:
+
+If you are using RPM 4.1 and it complains about `(GPG) NOT OK (MISSING
+KEYS: GPG#5072e1f5)', even though you have imported the MySQL public
+build key into your own GPG keyring, you need to import the key into
+the RPM keyring first. RPM 4.1 no longer uses your personal GPG keyring
+(or GPG itself). Rather, RPM maintains a separate keyring because it is
+a system-wide application and a user's GPG public keyring is a
+user-specific file. To import the MySQL public key into the RPM
+keyring, first obtain the key as described in *Note
+checking-gpg-signature::. Then use `rpm --import' to import the key. For
+example, if you have saved the public key in a file named
+`mysql_pubkey.asc', import it using this command:
+
+     shell> rpm --import mysql_pubkey.asc
+
+If you need to obtain the MySQL public key, see *Note
+checking-gpg-signature::.
+
+
+File: manual.info,  Node: installation-layouts,  Next: compiler-characteristics,  Prev: verifying-package-integrity,  Up: general-installation-issues
+
+3.1.5 Installation Layouts
+--------------------------
+
+The installation layout differs for different installation types (for
+example, native packages, binary tarballs, and source tarballs), which
+can lead to confusion when managing different systems or using
+different installation sources. The individual layouts are given in the
+corresponding installation type or platform chapter, as described
+following. Note that the layout of installations from vendors other
+than Oracle may differ from these layouts.
+
+   * *Note windows-installation-layout::
+
+   * *Note source-installation-layout::
+
+   * *Note binary-installation-layout::
+
+   * *Note mysql-installation-layout-linuxrpm::
+
+   * *Note mysql-installation-layout-macosx::
+
+
+File: manual.info,  Node: compiler-characteristics,  Prev: installation-layouts,  Up: general-installation-issues
+
+3.1.6 Compiler-Specific Build Characteristics
+---------------------------------------------
+
+In some cases, the compiler used to build MySQL affects the features
+available for use. The notes in this section apply for binary
+distributions provided by Oracle Corporation or that you compile
+yourself from source.
+
+*`icc' (Intel C++ Compiler) Builds*
+
+A server built with `icc' has these characteristics:
+
+   * SSL support is not included.
+
+   * `InnoDB Plugin' is not included.
+
+
+File: manual.info,  Node: binary-installation,  Next: windows-installation,  Prev: general-installation-issues,  Up: installing
+
+3.2 Installing MySQL from Generic Binaries on Unix/Linux
+========================================================
+
+Oracle provides a set of binary distributions of MySQL. These include
+binary distributions in the form of compressed `tar' files (files with a
+`.tar.gz' extension) for a number of platforms, as well as binaries in
+platform-specific package formats for selected platforms.
+
+This section covers the installation of MySQL from a compressed `tar'
+file binary distribution. For other platform-specific package formats,
+see the other platform-specific sections. For example, for Windows
+distributions, see *Note windows-installation::.
+
+To obtain MySQL, see *Note getting-mysql::.
+
+MySQL compressed `tar' file binary distributions have names of the form
+`mysql-VERSION-OS.tar.gz', where `VERSION' is a number (for example,
+`5.1.62'), and OS indicates the type of operating system for which the
+distribution is intended (for example, `pc-linux-i686' or `winx64').
+
+To install MySQL from a compressed `tar' file binary distribution, your
+system must have GNU `gunzip' to uncompress the distribution and a
+reasonable `tar' to unpack it. If your `tar' program supports the `z'
+option, it can both uncompress and unpack the file.
+
+GNU `tar' is known to work. The standard `tar' provided with some
+operating systems is not able to unpack the long file names in the
+MySQL distribution. You should download and install GNU `tar', or if
+available, use a preinstalled version of GNU tar. Usually this is
+available as `gnutar', `gtar', or as `tar' within a GNU or Free
+Software directory, such as `/usr/sfw/bin' or `/usr/local/bin'. GNU
+`tar' is available from `http://www.gnu.org/software/tar/'.
+
+*Warning*:
+
+If you have previously installed MySQL using your operating system
+native package management system, such as `yum' or `apt-get', you may
+experience problems installing using a native binary. Make sure your
+previous MySQL previous installation has been removed entirely (using
+your package management system), and that any additional files, such as
+old versions of your data files, have also been removed. You should
+also check the existence of configuration files such as `/etc/my.cnf'
+or the `/etc/mysql' directory have been deleted.
+
+If you run into problems and need to file a bug report, please use the
+instructions in *Note bug-reports::.
+
+On Unix, to install a compressed `tar' file binary distribution, unpack
+it at the installation location you choose (typically
+`/usr/local/mysql'). This creates the directories shown in the
+following table.
+
+*MySQL Installation Layout for Generic Unix/Linux Binary Package*
+
+Directory                        Contents of Directory
+`bin'                            Client programs and the *Note `mysqld':
+                                 mysqld. server
+`data'                           Log files, databases
+`docs'                           Manual in Info format
+`man'                            Unix manual pages
+`include'                        Include (header) files
+`lib'                            Libraries
+`scripts'                        *Note `mysql_install_db':
+                                 mysql-install-db.
+`share'                          Miscellaneous support files, including
+                                 error messages, sample configuration
+                                 files, SQL for database installation
+`sql-bench'                      Benchmarks
+
+Debug versions of the *Note `mysqld': mysqld. binary are available as
+*Note `mysqld-debug': mysqld. To compile your own debug version of
+MySQL from a source distribution, use the appropriate configuration
+options to enable debugging support. For more information on compiling
+from source, see *Note source-installation::.
+
+To install and use a MySQL binary distribution, the basic command
+sequence looks like this:
+
+     shell> groupadd mysql
+     shell> useradd -r -g mysql mysql
+     shell> cd /usr/local
+     shell> tar zxvf /PATH/TO/MYSQL-VERSION-OS.tar.gz
+     shell> ln -s FULL-PATH-TO-MYSQL-VERSION-OS mysql
+     shell> cd mysql
+     shell> chown -R mysql .
+     shell> chgrp -R mysql .
+     shell> scripts/mysql_install_db --user=mysql
+     shell> chown -R root .
+     shell> chown -R mysql data
+     # Next command is optional
+     shell> cp support-files/my-medium.cnf /etc/my.cnf
+     shell> bin/mysqld_safe --user=mysql &
+     # Next command is optional
+     shell> cp support-files/mysql.server /etc/init.d/mysql.server
+
+A more detailed version of the preceding description for installing a
+binary distribution follows.
+
+*Note*:
+
+This procedure assumes that you have `root' (administrator) access to
+your system. Alternatively, you can prefix each command using the
+`sudo' (Linux) or `pfexec' (OpenSolaris) command.
+
+The procedure does not set up any passwords for MySQL accounts.  After
+following the procedure, proceed to *Note postinstallation::.
+
+* Create a `mysql' User and Group *
+
+If your system does not already have a user and group for *Note
+`mysqld': mysqld. to run as, you may need to create one. The following
+commands add the `mysql' group and the `mysql' user. You might want to
+call the user and group something else instead of `mysql'. If so,
+substitute the appropriate name in the following instructions. The
+syntax for `useradd' and `groupadd' may differ slightly on different
+versions of Unix, or they may have different names such as `adduser'
+and `addgroup'.
+
+     shell> groupadd mysql
+     shell> useradd -r -g mysql mysql
+
+*Note*:
+
+Because the user is required only for ownership purposes, not login
+purposes, the `useradd' command uses the `-r' option to create a user
+that does not have login permissions to your server host. Omit this
+option to permit logins for the user (or if your `useradd' does not
+support the option).
+
+* Obtain and Unpack the Distribution *
+
+Pick the directory under which you want to unpack the distribution and
+change location into it. The example here unpacks the distribution
+under `/usr/local'. The instructions, therefore, assume that you have
+permission to create files and directories in `/usr/local'. If that
+directory is protected, you must perform the installation as `root'.
+
+     shell> cd /usr/local
+
+Obtain a distribution file using the instructions in *Note
+getting-mysql::. For a given release, binary distributions for all
+platforms are built from the same MySQL source distribution.
+
+Unpack the distribution, which creates the installation directory.
+Then create a symbolic link to that directory.  `tar' can uncompress
+and unpack the distribution if it has `z' option support:
+
+     shell> tar zxvf /PATH/TO/MYSQL-VERSION-OS.tar.gz
+     shell> ln -s FULL-PATH-TO-MYSQL-VERSION-OS mysql
+
+The `tar' command creates a directory named `mysql-VERSION-OS'.  The
+`ln' command makes a symbolic link to that directory. This enables you
+to refer more easily to the installation directory as
+`/usr/local/mysql'.
+
+If your `tar' does not have `z' option support, use `gunzip' to unpack
+the distribution and `tar' to unpack it. Replace the preceding `tar'
+command with the following alternative command to uncompress and
+extract the distribution:
+
+     shell> gunzip < /PATH/TO/MYSQL-VERSION-OS.tar.gz | tar xvf -
+
+* Perform Postinstallation Setup *
+
+The remainder of the installation process involves setting up the
+configuration file, creating the core databases, and starting the MySQL
+server. For instructions, see *Note postinstallation::.
+
+*Note*:
+
+The accounts that are listed in the MySQL grant tables initially have
+no passwords. After starting the server, you should set up passwords
+for them using the instructions in *Note postinstallation::.
+
+
+File: manual.info,  Node: windows-installation,  Next: macosx-installation,  Prev: binary-installation,  Up: installing
+
+3.3 Installing MySQL on Microsoft Windows
+=========================================
+
+* Menu:
+
+* windows-installation-layout::  MySQL Installation Layout on Microsoft Windows
+* windows-choosing-package::     Choosing the Installation Package for Microsoft Windows
+* windows-using-installer::      Installing MySQL on Microsoft Windows Using an MSI Package
+* mysql-config-wizard::          Using the MySQL Server Instance Config Wizard
+* windows-install-archive::      Installing MySQL on Microsoft Windows Using a `noinstall' Zip Archive
+* windows-troubleshooting::      Troubleshooting a Microsoft Windows MySQL Server Installation
+* windows-upgrading::            Upgrading MySQL Server on Microsoft Windows
+* windows-postinstallation::     MySQL Server on Microsoft Windows Postinstallation Procedures
+
+MySQL for Microsoft Windows is available in a number of different
+forms. A Microsoft Windows operating system such as Windows 2000,
+Windows XP, Windows Vista, Windows 7, Windows Server 2003, or Windows
+Server 2008. Both 32-bit and 64-bit versions are supported.
+
+In addition to running MySQL as a standard application, you can also
+run the MySQL server as a Windows service. By using a service you can
+monitor and control the operation of the server through the standard
+Windows service management tools. For more information, see *Note
+windows-start-service::.
+
+Generally, you should install MySQL on Windows using an account that
+has administrator rights. Otherwise, you may encounter problems with
+certain operations such as editing the `PATH' environment variable or
+accessing the `Service Control Manager'. Once installed, MySQL does not
+need to be executed using a user with Administrator privileges.
+
+For a list of limitations within the Windows version of MySQL, see
+*Note limits-windows::.
+
+In addition to the MySQL Server package, you may need or want
+additional components to use MySQL with your application or development
+environment. These include, but are not limited to:
+
+   * If you plan to connect to the MySQL server using ODBC, you need a
+     Connector/ODBC driver. For more information, including
+     installation and configuration instructions, see *Note
+     connector-odbc::.
+
+   * If you plan to use MySQL server with .NET applications, you need
+     the Connector/Net driver. For more information, including
+     installation and configuration instructions, see *Note
+     connector-net::.
+
+MySQL distributions for Windows can be downloaded from
+`http://dev.mysql.com/downloads/'. See *Note getting-mysql::.
+
+MySQL for Windows is available in several distribution formats,
+detailed below. Generally speaking, you should use a binary
+distribution that includes an installer. It is simpler to use than the
+others, and you need no additional tools to get MySQL up and running.
+The installer for the Windows version of MySQL, combined with a GUI
+Config Wizard, automatically installs MySQL, creates an option file,
+starts the server, and secures the default user accounts.
+
+   * Binary installer distribution. The installable distribution comes
+     packaged as a Microsoft Windows Installer (MSI) package that you
+     can install manually or automatically on your systems.  Two
+     formats are available, an essentials package that contains all the
+     files you need to install and configure MySQL, but no additional
+     components, and a complete package that includes MySQL,
+     configuration tools, benchmarks and other components. For more
+     information on the specific differences, see *Note
+     windows-choosing-package::
+
+     For instructions on installing MySQL using one of the MSI
+     installation packages, see *Note windows-using-installer::.
+
+   * Standard binary distribution format packaged as a Zip file
+     containing all of the necessary files that you unpack into your
+     chosen location. This package contains all of the files in the
+     full Windows MSI Installer package, but does not including an
+     installation program.
+
+     For instructions on installing MySQL using the Zip file, see *Note
+     windows-install-archive::.
+
+   * The source distribution contains all the code and support files
+     for building the executables using the Visual Studio compiler
+     system.
+
+     For instructions on building MySQL from source on Windows, see
+     *Note windows-source-build::.
+
+*MySQL on Windows considerations:*
+
+   * *Large Table Support*
+
+     If you need tables with a size larger than 4GB, install MySQL on
+     an NTFS or newer file system. Do not forget to use `MAX_ROWS' and
+     `AVG_ROW_LENGTH' when you create tables. See *Note create-table::.
+
+   * *MySQL and Virus Checking Software*
+
+     Using virus scanning software such as Norton/Symantec Anti-Virus
+     on directories containing MySQL data and temporary tables can
+     cause issues, both in terms of the performance of MySQL and the
+     virus-scanning software mis-identifying the contents of the files
+     as containing spam. This is because of the fingerprinting
+     mechanism used by the virus scanning software, and the way in
+     which MySQL rapidly updates different files, which may be
+     identified as a potential security risk.
+
+     After installing MySQL Server, it is recommended that you disable
+     virus scanning on the main directory (`datadir') being used to
+     store your MySQL table data. There is usually a system built into
+     the virus scanning software to permit certain directories to be
+     specifically ignored during virus scanning.
+
+     In addition, by default, MySQL creates temporary files in the
+     standard Windows temporary directory. To prevent the temporary
+     files also being scanned, you should configure a separate
+     temporary directory for MySQL temporary files and add this to the
+     virus scanning exclusion list. To do this, add a configuration
+     option for the `tmpdir' parameter to your `my.ini' configuration
+     file. For more information, see *Note windows-create-option-file::.
+
+
+File: manual.info,  Node: windows-installation-layout,  Next: windows-choosing-package,  Prev: windows-installation,  Up: windows-installation
+
+3.3.1 MySQL Installation Layout on Microsoft Windows
+----------------------------------------------------
+
+For MySQL 5.1 on Windows, the default installation directory is
+`C:\Program Files\MySQL\MySQL Server 5.1'. Some Windows users prefer to
+install in `C:\mysql', the directory that formerly was used as the
+default. However, the layout of the subdirectories remains the same.
+
+For MySQL 5.1.23 and earlier, all of the files are located within the
+parent directory, using the structure shown in the following table.
+
+*Installation Layout for Windows Using MySQL 5.1.23 and Earlier*
+
+Directory                        Contents of Directory
+`bin'                            Client programs and the *Note `mysqld':
+                                 mysqld. server
+`data'                           Log files, databases
+`examples'                       Example programs and scripts
+`include'                        Include (header) files
+`lib'                            Libraries
+`scripts'                        Utility scripts
+`share'                          Miscellaneous support files, including
+                                 error messages, character set files,
+                                 sample configuration files, SQL for
+                                 database installation
+
+For MySQL 5.1.24 and later, the default location of data directory was
+changed. The remainder of the directory structure remains the same.
+
+*Installation Layout for Windows Using MySQL 5.1.24 and later*
+
+Directory                 Contents of Directory
+`bin'                     Client programs and the *Note `mysqld':
+                          mysqld. server
+`C:\Documents and         Log files, databases (Windows XP, Windows
+Settings\All              Server 2003)
+Users\Application         
+Data\MySQL'               
+`C:\ProgramData\MySQL'    Log files, databases (Windows 7, Windows
+                          Server 2008)
+`Docs'                    Manual in CHM format
+`examples'                Example programs and scripts
+`include'                 Include (header) files
+`lib'                     Libraries
+`scripts'                 Utility scripts
+`share'                   Miscellaneous support files, including error
+                          messages, character set files, sample
+                          configuration files, SQL for database
+                          installation
+
+
+File: manual.info,  Node: windows-choosing-package,  Next: windows-using-installer,  Prev: windows-installation-layout,  Up: windows-installation
+
+3.3.2 Choosing the Installation Package for Microsoft Windows
+-------------------------------------------------------------
+
+For MySQL 5.1, there are three installation package formats to choose
+from when installing MySQL on Windows:
+
+*Microsoft Windows MySQL Installation package comparison*
+
+                              Packaging                     
+Feature                       Essentials     Complete       Zip
+                                                            (No-install)
+Installer                     Yes            Yes            No
+Directory-only                                              
+MySQL Server Instance Config  Yes            Yes            No
+Wizard                                                      
+Test Suite                    No             Yes            Yes
+MySQL Server                  Yes            Yes            Yes
+MySQL Client Programs         Yes            Yes            Yes
+C Headers/Libraries           Yes            Yes            Yes
+Embedded Server               No             Optional       Yes
+Scripts and Examples          No             Optional       Yes
+
+In the above table:
+
+   * _Yes_ indiciates that the component is installed by default.
+
+   * _No_ indicates that the component is not installed or included.
+
+   * _Optional_ indicates that the component is included with the
+     package, but not installed unless explicitly requested using the
+     Custom installation mode.
+
+The workflow for installing using the MSI installer is shown below:
+
+FIGURE GOES HERE: Installation Workflow for Windows using MSI
+
+The workflow for installing using the MSI installer is shown below:
+
+FIGURE GOES HERE: Installation Workflow for Windows using Zip
+
+     *Note*:
+
+     For the Essentials and Complete packages in the MSI installer, you
+     can select individual components to be installed by using the
+     Custom mode, including disable the components confiurated for
+     installation by default.
+
+     Full details on the components are suggested uses are provided
+     below for reference:
+
+   * *Windows Essentials*: This package has a file name similar to
+     `mysql-essential-5.1.62-win32.msi' and is supplied as a Microsoft
+     Installer (MSI) package. The package includes the minimum set of
+     files needed to install MySQL on Windows, including the MySQL
+     Server Instance Config Wizard. This package does not include
+     optional components such as the embedded server, developer headers
+     and libraries or benchmark suite.
+
+     To install using this package, see *Note windows-using-installer::.
+
+   * *Windows MSI Installer (Complete)*: This package has a file name
+     similar to `mysql-5.1.62-win32.msi' and contains all files needed
+     for a complete Windows installation, including the MySQL Server
+     Instance Config Wizard. This package includes optional components
+     such as the embedded server and benchmark suite.
+
+     To install using this package, see *Note windows-using-installer::.
+
+   * *Without installer*: This package has a file name similar to
+     `mysql-noinstall-5.1.62-win32.zip' and contains all the files
+     found in the Complete install package, with the exception of the
+     MySQL Server Instance Config Wizard. This package does not include
+     an automated installer, and must be manually installed and
+     configured.
+
+The Essentials package is recommended for most users. Both the
+Essentials and Complete distributions are available as an `.msi' file
+for use with the Windows Installer.  The Noinstall distribution is
+packaged as a Zip archive. To use a Zip archive, you must have a tool
+that can unpack `.zip' files.
+
+When using the MSI installers you can automate the installation
+process. For more information, see *Note windows-installer-msi-quiet::.
+To automate the creation of a MySQL instance, see *Note
+mysql-config-wizard-cmdline::.
+
+Your choice of install package affects the installation process you
+must follow. If you choose to install either an Essentials or Complete
+install package, see *Note windows-using-installer::. If you choose to
+install a Noinstall archive, see *Note windows-install-archive::.
+
+
+File: manual.info,  Node: windows-using-installer,  Next: mysql-config-wizard,  Prev: windows-choosing-package,  Up: windows-installation
+
+3.3.3 Installing MySQL on Microsoft Windows Using an MSI Package
+----------------------------------------------------------------
+
+* Menu:
+
+* windows-install-wizard::       Using the MySQL Installation Wizard for Microsoft Windows
+* windows-installer-msi-quiet::  Automating MySQL Installation on Microsoft Windows using the MSI Package
+* windows-installer-uninstalling::  Removing MySQL When Installed from the MSI Package
+
+The MSI package is designed to install and configure MySQL in such a
+way that you can immediately get started using MySQL.
+
+The MySQL Installation Wizard and MySQL Configuration Wizard are
+available in the Essentials and Complete install packages. They are
+recommended for most standard MySQL installations. Exceptions include
+users who need to install multiple instances of MySQL on a single
+server host and advanced users who want complete control of server
+configuration.
+
+   * For information on installing using the GUI MSI installer process,
+     see *Note windows-install-wizard::.
+
+   * For information on installing using the command line using the MSI
+     package, see *Note windows-installer-msi-quiet::.
+
+   * If you have previously installed MySQL using the MSI package and
+     want to remove MySQL, see *Note windows-installer-uninstalling::.
+
+The workflow sequence for using the installer is shown in the figure
+below:
+
+FIGURE GOES HERE: Installation Workflow for Windows using MSI Installer
+
+*Note*:
+
+Microsoft Windows XP and later include a firewall which specifically
+blocks ports. If you plan on using MySQL through a network port then
+you should open and create an exception for this port before performing
+the installation. To check and if necessary add an exception to the
+firewall settings:
+
+  1. First ensure that you are logged in as an Administrator or a user
+     with Administrator privileges.
+
+  2. Go to the `Control Panel', and double click the `Windows Firewall'
+     icon.
+
+  3. Choose the `Allow a program through Windows Firewall' option and
+     click the `Add port' button.
+
+  4. Enter `MySQL' into the `Name' text box and `3306' (or the port of
+     your choice) into the `Port number' text box.
+
+  5. Also ensure that the `TCP' protocol radio button is selected.
+
+  6. If you wish, you can also limit access to the MySQL server by
+     choosing the `Change scope' button.
+
+  7. Confirm your choices by clicking the `OK' button.
+
+Additionally, when running the MySQL Installation Wizard on Windows
+Vista or newer, ensure that you are logged in as a user with
+administrative rights.
+
+*Note*:
+
+When using Windows Vista or newer, you may want to disable User Account
+Control (UAC) before performing the installation. If you do not do so,
+then MySQL may be identified as a security risk, which will mean that
+you need to enable MySQL. You can disable the security checking by
+following these instructions:
+
+  1. Open `Control Panel'.
+
+  2. Under the `User Accounts and Family Safety', select `Add or remove
+     user accounts.'
+
+  3. Click the `Got to the main User Accounts page' link.
+
+  4. Click on `Turn User Account Control on or off'. You may be
+     prompted to provide permission to change this setting. Click
+     `Continue'.
+
+  5. Deselect or uncheck the check box next to `Use User Account
+     Control (UAC) to help protect your computer'. Click `OK' to save
+     the setting.
+
+You will need to restart to complete the process. Click `Restart Now'
+to reboot the machine and apply the changes. You can then follow the
+instructions below for installing Windows.
+
+
+File: manual.info,  Node: windows-install-wizard,  Next: windows-installer-msi-quiet,  Prev: windows-using-installer,  Up: windows-using-installer
+
+3.3.3.1 Using the MySQL Installation Wizard for Microsoft Windows
+.................................................................
+
+* Menu:
+
+* mysql-install-wizard-starting::  MySQL Installation Wizard: Downloading and Starting
+* mysql-install-wizard-install-type::  MySQL Installation Wizard: Choosing an Install Type
+* mysql-install-wizard-custom-install::  MySQL Installation Wizard: The Custom Install Dialog
+* mysql-install-wizard-confirmation-dialog::  MySQL Installation Wizard: The Confirmation Dialog
+* mysql-install-wizard-changes::  MySQL Installation Wizard: Changes Made
+* mysql-install-wizard-upgrading::  MySQL Installation Wizard: Upgrading MySQL
+
+MySQL Installation Wizard is an installer for the MySQL server that
+uses the latest installer technologies for Microsoft Windows. The MySQL
+Installation Wizard, in combination with the MySQL Config Wizard,
+enables a user to install and configure a MySQL server that is ready
+for use immediately after installation.
+
+The MySQL Installation Wizard uses the standard Microsoft Installer
+Engine (MSI) system is the standard installer for all MySQL server
+distributions. See *Note mysql-install-wizard-upgrading::, for more
+information on upgrading from a previous version.
+
+If you are upgrading an installation from MySQL 5.1.31 or earlier to
+MySQL 5.1.32 or later, read the notes provided in *Note
+mysql-install-wizard-upgrading::.
+
+The Microsoft Windows Installer Engine was updated with the release of
+Windows XP; those using a previous version of Windows can reference
+this Microsoft Knowledge Base article
+(http://support.microsoft.com/default.aspx?scid=kb;EN-US;292539) for
+information on upgrading to the latest version of the Windows Installer
+Engine.
+
+In addition, Microsoft has introduced the WiX (Windows Installer XML)
+toolkit. This is the first highly acknowledged Open Source project from
+Microsoft. We have switched to WiX because it is an Open Source project
+and it enables us to handle the complete Windows installation process
+in a flexible manner using scripts.
+
+Improving the MySQL Installation Wizard depends on the support and
+feedback of users like you. If you find that the MySQL Installation
+Wizard is lacking some feature important to you, or if you discover a
+bug, please report it in our bugs database using the instructions given
+in *Note bug-reports::.
+
+
+File: manual.info,  Node: mysql-install-wizard-starting,  Next: mysql-install-wizard-install-type,  Prev: windows-install-wizard,  Up: windows-install-wizard
+
+3.3.3.2 MySQL Installation Wizard: Downloading and Starting
+...........................................................
+
+The MySQL installation packages can be downloaded from
+`http://dev.mysql.com/downloads/'. If the package you download is
+contained within a Zip archive, you need to extract the archive first.
+
+The process for starting the wizard depends on the contents of the
+installation package you download. If there is a `setup.exe' file
+present, double-click it to start the installation process. If there is
+an `.msi' file present, double-click it to start the installation
+process.
+
+
+File: manual.info,  Node: mysql-install-wizard-install-type,  Next: mysql-install-wizard-custom-install,  Prev: mysql-install-wizard-starting,  Up: windows-install-wizard
+
+3.3.3.3 MySQL Installation Wizard: Choosing an Install Type
+...........................................................
+
+There are three installation types available: *Typical*, *Complete*, and
+*Custom*.
+
+The *Typical* installation type installs the MySQL server, the *Note
+`mysql': mysql.  command-line client, and the command-line utilities.
+The command-line clients and utilities include *Note `mysqldump':
+mysqldump, *Note `myisamchk': myisamchk, and several other tools to
+help you manage the MySQL server.
+
+The *Complete* installation type installs all components included in
+the installation package. The full installation package includes
+components such as the embedded server library, the benchmark suite,
+support scripts, and documentation.
+
+The *Custom* installation type gives you complete control over which
+packages you wish to install and the installation path that is used. See
+*Note mysql-install-wizard-custom-install::, for more information on
+performing a custom install.
+
+If you choose the *Typical* or *Complete* installation types and click
+the `Next' button, you advance to the confirmation screen to verify
+your choices and begin the installation. If you choose the *Custom*
+installation type and click the `Next' button, you advance to the
+custom installation dialog, described in *Note
+mysql-install-wizard-custom-install::.
+
+
+File: manual.info,  Node: mysql-install-wizard-custom-install,  Next: mysql-install-wizard-confirmation-dialog,  Prev: mysql-install-wizard-install-type,  Up: windows-install-wizard
+
+3.3.3.4 MySQL Installation Wizard: The Custom Install Dialog
+............................................................
+
+If you wish to change the installation path or the specific components
+that are installed by the MySQL Installation Wizard, choose the *Custom*
+installation type.
+
+A tree view on the left side of the custom install dialog lists all
+available components. Components that are not installed have a red `X'
+icon; components that are installed have a gray icon. To change whether
+a component is installed, click that component's icon and choose a new
+option from the drop-down list that appears.
+
+You can change the default installation path by clicking the
+`Change...' button to the right of the displayed installation path.
+
+After choosing your installation components and installation path,
+click the `Next' button to advance to the confirmation dialog.
+
+
+File: manual.info,  Node: mysql-install-wizard-confirmation-dialog,  Next: mysql-install-wizard-changes,  Prev: mysql-install-wizard-custom-install,  Up: windows-install-wizard
+
+3.3.3.5 MySQL Installation Wizard: The Confirmation Dialog
+..........................................................
+
+Once you choose an installation type and optionally choose your
+installation components, you advance to the confirmation dialog. Your
+installation type and installation path are displayed for you to review.
+
+To install MySQL if you are satisfied with your settings, click the
+`Install' button. To change your settings, click the `Back' button.  To
+exit the MySQL Installation Wizard without installing MySQL, click the
+`Cancel' button.
+
+In MySQL 5.1.47 and earlier, after installation is complete, you have
+the option of registering with the MySQL web site.  Registration gives
+you access to post in the MySQL forums at forums.mysql.com
+(http://forums.mysql.com), along with the ability to report bugs at
+bugs.mysql.com (http://bugs.mysql.com) and to subscribe to our
+newsletter.
+
+The final screen of the installer provides a summary of the
+installation and gives you the option to launch the MySQL Config
+Wizard, which you can use to create a configuration file, install the
+MySQL service, and configure security settings.
+
+
+File: manual.info,  Node: mysql-install-wizard-changes,  Next: mysql-install-wizard-upgrading,  Prev: mysql-install-wizard-confirmation-dialog,  Up: windows-install-wizard
+
+3.3.3.6 MySQL Installation Wizard: Changes Made
+...............................................
+
+Once you click the `Install' button, the MySQL Installation Wizard
+begins the installation process and makes certain changes to your
+system which are described in the sections that follow.
+
+*Changes to the Registry*
+
+The MySQL Installation Wizard creates one Windows registry key in a
+typical install situation, located in
+`HKEY_LOCAL_MACHINE\SOFTWARE\MySQL AB'. For 64-bit Windows, the
+registry location is `HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MYSQL
+AB'. A server version specific entry will be created for each major
+version of MySQL that you install.
+
+The MySQL Installation Wizard creates a key named after the major
+version of the server that is being installed, such as `MySQL Server
+5.1'. It contains two string values, `Location' and `Version'. The
+`Location' string contains the path to the installation directory. In a
+default installation it contains `C:\Program Files\MySQL\MySQL Server
+5.1\'. The `Version' string contains the release number.  For example,
+for an installation of MySQL Server 5.1.62, the key contains a value of
+`5.1.62'.
+
+These registry keys are used to help external tools identify the
+installed location of the MySQL server, preventing a complete scan of
+the hard-disk to determine the installation path of the MySQL server.
+The registry keys are not required to run the server, and if you
+install MySQL using the `noinstall' Zip archive, the registry keys are
+not created.
+
+*Changes to the Start Menu*
+
+The MySQL Installation Wizard creates a new entry in the Windows
+`Start' menu under a common MySQL menu heading named after the major
+version of MySQL that you have installed. For example, if you install
+MySQL 5.1, the MySQL Installation Wizard creates a `MySQL Server 5.1'
+section in the `Start' menu.
+
+The following entries are created within the new `Start' menu section:
+
+   * `MySQL Command Line Client': This is a shortcut to the *Note
+     `mysql': mysql. command-line client and is configured to connect
+     as the `root' user. The shortcut prompts for a `root' user
+     password when you connect.
+
+   * `MySQL Server Instance Config Wizard': This is a shortcut to the
+     MySQL Config Wizard. Use this shortcut to configure a newly
+     installed server, or to reconfigure an existing server.
+
+   * `MySQL Documentation': This is a link to the MySQL server
+     documentation that is stored locally in the MySQL server
+     installation directory. This option is not available when the
+     MySQL server is installed using the Essentials installation
+     package.
+
+*Changes to the File System*
+
+The MySQL Installation Wizard by default installs the MySQL 5.1 server
+to `C:\PROGRAM FILES\MySQL\MySQL Server 5.1', where PROGRAM FILES is
+the default location for applications in your system, and 5.1 is the
+major version of your MySQL server. This is the recommended location
+for the MySQL server, replacing the former default location `C:\mysql'.
+
+By default, all MySQL applications are stored in a common directory at
+`C:\PROGRAM FILES\MySQL', where PROGRAM FILES is the default location
+for applications in your Windows installation. A typical MySQL
+installation on a developer machine might look like this:
+
+     C:\Program Files\MySQL\MySQL Server 5.1
+     C:\Program Files\MySQL\MySQL Workbench 5.1 OSS
+
+This approach makes it easier to manage and maintain all MySQL
+applications installed on a particular system.
+
+In MySQL 5.1.23 and earlier, the default location for the data files
+used by MySQL is located within the corresponding MySQL Server
+installation directory. For MySQL 5.1.24 and later, the default
+location of the data directory is the `AppData' directory configured
+for the user that installed the MySQL application.
+
+
+File: manual.info,  Node: mysql-install-wizard-upgrading,  Prev: mysql-install-wizard-changes,  Up: windows-install-wizard
+
+3.3.3.7 MySQL Installation Wizard: Upgrading MySQL
+..................................................
+
+The MySQL Installation Wizard can perform server upgrades automatically
+using the upgrade capabilities of MSI. That means you do not need to
+remove a previous installation manually before installing a new
+release. The installer automatically shuts down and removes the
+previous MySQL service before installing the new version.
+
+Automatic upgrades are available only when upgrading between
+installations that have the same major and minor version numbers. For
+example, you can upgrade automatically from MySQL 5.1.5 to MySQL 5.1.6,
+but not from MySQL 5.0 to MySQL 5.1.
+
+In MySQL 5.1.32 and later, the `EXE' version of the MSI installer
+packages were removed. When upgrading an existing MySQL installation
+from the old EXE based installer to the MSI based installer, please
+keep the following notes in mind:
+
+   * The MSI installer will not identify an existing installation that
+     was installed using the old EXE installer. This means that the
+     installer will not stop the existing server, or detect that the
+     existing password is required before installing the new version.
+     To work around this:
+
+       1. Stop the current server manually using `net stop' or
+          `mysqladmin shutdown'.
+
+       2. Remove the existing installation manually by using the
+          `Add/Remove Programs' control panel. This will keep the
+          existing configuration and data files, as these are not
+          removed automatically.
+
+       3. Install the new version of MySQL using the MSI installer.
+          When running the installation, skip updating the security by
+          deselecting the check box on the security screen.
+
+       4. Complete the installation, and then start the server again.
+          You should be able to login with your existing user and
+          password credentials.
+
+   * You can only upgrade the version and release using the MSI
+     installer. For example, you can upgrade an open source
+     installation with an open source installer. You cannot upgrade an
+     open source installation using the enterprise installer.
+
+See *Note windows-upgrading::.
+
+
+File: manual.info,  Node: windows-installer-msi-quiet,  Next: windows-installer-uninstalling,  Prev: windows-install-wizard,  Up: windows-using-installer
+
+3.3.3.8 Automating MySQL Installation on Microsoft Windows using the MSI Package
+................................................................................
+
+The Microsoft Installer (MSI) supports a both a _quiet_ and a _passive_
+mode that can be used to install MySQL automatically without requiring
+intervention. You can use this either in scripts to automatically
+install MySQL or through a terminal connection such as Telnet where you
+do not have access to the standard Windows user interface. The MSI
+packages can also be used in combination with Microsoft's Group Policy
+system (part of Windows Server 2003 and Windows Server 2008) to install
+MySQL across multiple machines.
+
+To install MySQL from one of the MSI packages automatically from the
+command line (or within a script), you need to use the `msiexec.exe'
+tool. For example, to perform a quiet installation (which shows no
+dialog boxes or progress):
+
+     shell> msiexec /i /quiet mysql-5.1.62.msi
+
+The `/i' indicates that you want to perform an installation. The
+`/quiet' option indicates that you want no interactive elements.
+
+To provide a dialog box showing the progress during installation, and
+the dialog boxes providing information on the installation and
+registration of MySQL, use `/passive' mode instead of `/quiet':
+
+     shell> msiexec /i /passive mysql-5.1.62.msi
+
+Regardless of the mode of the installation, installing the package in
+this manner performs a 'Typical' installation, and installs the default
+components into the standard location.
+
+You can also use this method to uninstall MySQL by using the
+`/uninstall' or `/x' options:
+
+     shell> msiexec /x /quiet mysql-5.1.62.msi
+
+To install MySQL and configure a MySQL instance from the command line,
+see *Note mysql-config-wizard-cmdline::.
+
+For information on using MSI packages to install software automatically
+using Group Policy, see How to use Group Policy to remotely install
+software in Windows Server 2003
+(http://support.microsoft.com/kb/816102).
+
+
+File: manual.info,  Node: windows-installer-uninstalling,  Prev: windows-installer-msi-quiet,  Up: windows-using-installer
+
+3.3.3.9 Removing MySQL When Installed from the MSI Package
+..........................................................
+
+To uninstall a MySQL where you have used the MSI packages, you must use
+the `Add/Remove Programs' tool within `Control Panel'. To do this:
+
+  1. Right-click the `start' menu and choose `Control Panel'.
+
+  2. If the Control Panel is set to category mode (you will see `Pick a
+     category' at the top of the `Control Panel' window), double-click
+     `Add or Remove Programs'. If the Control is set to classic mode,
+     double-click the `Add or Remove Programs' icon.
+
+  3. Find MySQL in the list of installed software. MySQL Server is
+     installed against major version numbers (MySQL 5.0, MySQL 5.1,
+     etc.). Select the version that you want to remove and click
+     `Remove'.
+
+  4. You will be prompted to confirm the removal. Click `Yes' to remove
+     MySQL.
+
+When MySQL is removed using this method, only the installed components
+are removed. Any database information (including the tables and data),
+import or export files, log files, and binary logs produced during
+execution are kept in their configured location.
+
+If you try to install MySQL again the information will be retained and
+you will be prompted to enter the password configured with the original
+installation.
+
+If you want to delete MySQL completely:
+
+   * Delete the associated data directory. On Windows XP and Windows
+     Server 2003, before MySQL 5.1.24, the default data directory would
+     be located within the MySQL installation directory. On MySQL
+     5.1.24 and later, the default data directory is the configured
+     AppData directory, which is `C:\Documents and Settings\All
+     Users\Application Data\MySQL' by default.
+
+   * On Windows 7 and Windows Server 2008, the default data directory
+     location is `C:\ProgramData\Mysql'.
+
+     *Note*:
+
+     The `C:\ProgramData' directory is hidden by default. You must
+     change your folder options to view the hidden file. Choose
+     `Organize', `Folder and search options', `Show hidden folders'.
+
+
+File: manual.info,  Node: mysql-config-wizard,  Next: windows-install-archive,  Prev: windows-using-installer,  Up: windows-installation
+
+3.3.4 Using the MySQL Server Instance Config Wizard
+---------------------------------------------------
+
+* Menu:
+
+* mysql-config-wizard-starting::  Starting the MySQL Server Instance Config Wizard
+* mysql-config-wizard-maintenance::  MySQL Server Instance Config Wizard: Choosing a Maintenance Option
+* mysql-config-wizard-configuration-type::  MySQL Server Instance Config Wizard: Choosing a Configuration Type
+* mysql-config-wizard-server-type::  MySQL Server Instance Config Wizard: The Server Type Dialog
+* mysql-config-wizard-database-usage::  MySQL Server Instance Config Wizard: The Database Usage Dialog
+* mysql-config-wizard-tablespace::  MySQL Server Instance Config Wizard: The InnoDB Tablespace Dialog
+* mysql-config-wizard-connections::  MySQL Server Instance Config Wizard: The Concurrent Connections Dialog
+* mysql-config-wizard-networking::  MySQL Server Instance Config Wizard: The Networking and Strict Mode Options Dialog
+* mysql-config-wizard-character-set::  MySQL Server Instance Config Wizard: The Character Set Dialog
+* mysql-config-wizard-service::  MySQL Server Instance Config Wizard: The Service Options Dialog
+* mysql-config-wizard-security::  MySQL Server Instance Config Wizard: The Security Options Dialog
+* mysql-config-wizard-confirmation::  MySQL Server Instance Config Wizard: The Confirmation Dialog
+* mysql-config-wizard-cmdline::  MySQL Server Instance Config Wizard: Creating an Instance from the Command Line
+
+The MySQL Server Instance Config Wizard helps automate the process of
+configuring your server. It creates a custom MySQL configuration file
+(`my.ini' or `my.cnf') by asking you a series of questions and then
+applying your responses to a template to generate the configuration
+file that is tuned to your installation.
+
+The complete and essential MSI installation packages include the MySQL
+Server Instance Config Wizard in the MySQL 5.1 server. The MySQL Server
+Instance Config Wizard is only available for Windows.
+
+The workflow sequence for using the MySQL Server Instance Config Wizard
+is shown in the figure below:
+
+FIGURE GOES HERE: MySQL Server Instance Config Wizard Workflow
+
+
+File: manual.info,  Node: mysql-config-wizard-starting,  Next: mysql-config-wizard-maintenance,  Prev: mysql-config-wizard,  Up: mysql-config-wizard
+
+3.3.4.1 Starting the MySQL Server Instance Config Wizard
+........................................................
+
+The MySQL Server Instance Config Wizard is normally started as part of
+the installation process. You should only need to run the MySQL Server
+Instance Config Wizard again when you need to change the configuration
+parameters of your server.
+
+If you chose not to open a port prior to installing MySQL on Windows
+Vista or newer, you can choose to use the MySQL Server Instance Config
+Wizard after installation. However, you must open a port in the Windows
+Firewall. To do this see the instructions given in *Note
+mysql-install-wizard-starting::. Rather than opening a port, you also
+have the option of adding MySQL as a program that bypasses the Windows
+Firewall. One or the other option is sufficient--you need not do both.
+Additionally, when running the MySQL Server Config Wizard on Windows
+Vista or newer, ensure that you are logged in as a user with
+administrative rights.
+
+MySQL Server Instance Config Wizard
+
+You can launch the MySQL Config Wizard by clicking the `MySQL Server
+Instance Config Wizard' entry in the `MySQL' section of the Windows
+`Start' menu.
+
+Alternatively, you can navigate to the `bin' directory of your MySQL
+installation and launch the `MySQLInstanceConfig.exe' file directly.
+
+The MySQL Server Instance Config Wizard places the `my.ini' file in the
+installation directory for the MySQL server. This helps associate
+configuration files with particular server instances.
+
+To ensure that the MySQL server knows where to look for the `my.ini'
+file, an argument similar to this is passed to the MySQL server as part
+of the service installation:
+
+     --defaults-file="C:\PROGRAM FILES\MYSQL\MYSQL SERVER 5.1\my.ini"
+
+Here, C:\PROGRAM FILES\MYSQL\MYSQL SERVER 5.1 is replaced with the
+installation path to the MySQL Server. The `--defaults-file' option
+instructs the MySQL server to read the specified file for configuration
+options when it starts.
+
+Apart from making changes to the `my.ini' file by running the MySQL
+Server Instance Config Wizard again, you can modify it by opening it
+with a text editor and making any necessary changes. You can also
+modify the server configuration with the
+http://www.mysql.com/products/administrator/ utility. For more
+information about server configuration, see *Note server-options::.
+
+MySQL clients and utilities such as the *Note `mysql': mysql.  and
+*Note `mysqldump': mysqldump. command-line clients are not able to
+locate the `my.ini' file located in the server installation directory.
+To configure the client and utility applications, create a new `my.ini'
+file in the Windows installation directory (for example, `C:\WINDOWS').
+
+Under Windows Server 2003, Windows Server 2000, Windows XP, and Windows
+Vista, MySQL Server Instance Config Wizard will configure MySQL to work
+as a Windows service. To start and stop MySQL you use the `Services'
+application that is supplied as part of the Windows Administrator Tools.
+
+
+File: manual.info,  Node: mysql-config-wizard-maintenance,  Next: mysql-config-wizard-configuration-type,  Prev: mysql-config-wizard-starting,  Up: mysql-config-wizard
+
+3.3.4.2 MySQL Server Instance Config Wizard: Choosing a Maintenance Option
+..........................................................................
+
+If the MySQL Server Instance Config Wizard detects an existing
+configuration file, you have the option of either reconfiguring your
+existing server, or removing the server instance by deleting the
+configuration file and stopping and removing the MySQL service.
+
+To reconfigure an existing server, choose the `Re-configure Instance'
+option and click the `Next' button. Any existing configuration file is
+not overwritten, but renamed (within the same directory) using a
+timestamp (Windows) or sequential number (Linux). To remove the
+existing server instance, choose the `Remove Instance' option and click
+the `Next' button.
+
+If you choose the `Remove Instance' option, you advance to a
+confirmation window. Click the `Execute' button. The MySQL Server Config
+Wizard stops and removes the MySQL service, and then deletes the
+configuration file. The server installation and its `data' folder are
+not removed.
+
+If you choose the `Re-configure Instance' option, you advance to the
+`Configuration Type' dialog where you can choose the type of
+installation that you wish to configure.
+
+
+File: manual.info,  Node: mysql-config-wizard-configuration-type,  Next: mysql-config-wizard-server-type,  Prev: mysql-config-wizard-maintenance,  Up: mysql-config-wizard
+
+3.3.4.3 MySQL Server Instance Config Wizard: Choosing a Configuration Type
+..........................................................................
+
+When you start the MySQL Server Instance Config Wizard for a new MySQL
+installation, or choose the `Re-configure Instance' option for an
+existing installation, you advance to the `Configuration Type' dialog.
+
+MySQL Server Instance Config Wizard: Configuration Type
+
+There are two configuration types available: `Detailed Configuration'
+and `Standard Configuration'. The `Standard Configuration' option is
+intended for new users who want to get started with MySQL quickly
+without having to make many decisions about server configuration. The
+`Detailed Configuration' option is intended for advanced users who want
+more fine-grained control over server configuration.
+
+If you are new to MySQL and need a server configured as a single-user
+developer machine, the `Standard Configuration' should suit your needs.
+Choosing the `Standard Configuration' option causes the MySQL Config
+Wizard to set all configuration options automatically with the
+exception of `Service Options' and `Security Options'.
+
+The `Standard Configuration' sets options that may be incompatible with
+systems where there are existing MySQL installations. If you have an
+existing MySQL installation on your system in addition to the
+installation you wish to configure, the `Detailed Configuration' option
+is recommended.
+
+To complete the `Standard Configuration', please refer to the sections
+on `Service Options' and `Security Options' in *Note
+mysql-config-wizard-service::, and *Note
+mysql-config-wizard-security::, respectively.
+
+
+File: manual.info,  Node: mysql-config-wizard-server-type,  Next: mysql-config-wizard-database-usage,  Prev: mysql-config-wizard-configuration-type,  Up: mysql-config-wizard
+
+3.3.4.4 MySQL Server Instance Config Wizard: The Server Type Dialog
+...................................................................
+
+There are three different server types available to choose from.  The
+server type that you choose affects the decisions that the MySQL Server
+Instance Config Wizard makes with regard to memory, disk, and processor
+usage.
+
+MySQL Server Instance Config Wizard: Server Type
+
+   * `Developer Machine': Choose this option for a typical desktop
+     workstation where MySQL is intended only for personal use. It is
+     assumed that many other desktop applications are running. The
+     MySQL server is configured to use minimal system resources.
+
+   * `Server Machine': Choose this option for a server machine where
+     the MySQL server is running alongside other server applications
+     such as FTP, email, and Web servers. The MySQL server is
+     configured to use a moderate portion of the system resources.
+
+   * `Dedicated MySQL Server Machine': Choose this option for a server
+     machine that is intended to run only the MySQL server. It is
+     assumed that no other applications are running. The MySQL server
+     is configured to use all available system resources.
+
+*Note*:
+
+By selecting one of the preconfigured configurations, the values and
+settings of various options in your `my.cnf' or `my.ini' will be
+altered accordingly. The default values and options as described in the
+reference manual may therefore be different to the options and values
+that were created during the execution of the Config Wizard.
+
+
+File: manual.info,  Node: mysql-config-wizard-database-usage,  Next: mysql-config-wizard-tablespace,  Prev: mysql-config-wizard-server-type,  Up: mysql-config-wizard
+
+3.3.4.5 MySQL Server Instance Config Wizard: The Database Usage Dialog
+......................................................................
+
+The `Database Usage' dialog enables you to indicate the storage engines
+that you expect to use when creating MySQL tables. The option you
+choose determines whether the `InnoDB' storage engine is available and
+what percentage of the server resources are available to `InnoDB'.
+
+MySQL Server Instance Config Wizard: Usage Dialog
+
+   * `Multifunctional Database': This option enables both the `InnoDB'
+     and `MyISAM' storage engines and divides resources evenly between
+     the two. This option is recommended for users who use both storage
+     engines on a regular basis.
+
+   * `Transactional Database Only': This option enables both the
+     `InnoDB' and `MyISAM' storage engines, but dedicates most server
+     resources to the `InnoDB' storage engine. This option is
+     recommended for users who use `InnoDB' almost exclusively and make
+     only minimal use of `MyISAM'.
+
+   * `Non-Transactional Database Only': This option disables the
+     `InnoDB' storage engine completely and dedicates all server
+     resources to the `MyISAM' storage engine. This option is
+     recommended for users who do not use `InnoDB'.
+
+The Config Wizard uses a template to generate the server configuration
+file. The `Database Usage' dialog sets one of the following option
+strings:
+
+     Multifunctional Database:        MIXED
+     Transactional Database Only:     INNODB
+     Non-Transactional Database Only: MYISAM
+
+When these options are processed through the default template
+(my-template.ini) the result is:
+
+     Multifunctional Database:
+     default-storage-engine=InnoDB
+     _myisam_pct=50
+
+     Transactional Database Only:
+     default-storage-engine=InnoDB
+     _myisam_pct=5
+
+     Non-Transactional Database Only:
+     default-storage-engine=MyISAM
+     _myisam_pct=100
+     skip-innodb
+
+The `_myisam_pct' value is used to calculate the percentage of
+resources dedicated to `MyISAM'. The remaining resources are allocated
+to `InnoDB'.
+
+
+File: manual.info,  Node: mysql-config-wizard-tablespace,  Next: mysql-config-wizard-connections,  Prev: mysql-config-wizard-database-usage,  Up: mysql-config-wizard
+
+3.3.4.6 MySQL Server Instance Config Wizard: The InnoDB Tablespace Dialog
+.........................................................................
+
+Some users may want to locate the `InnoDB' tablespace files in a
+different location than the MySQL server data directory. Placing the
+tablespace files in a separate location can be desirable if your system
+has a higher capacity or higher performance storage device available,
+such as a RAID storage system.
+
+MySQL Server Instance Config Wizard: InnoDB Data Tablespace
+
+To change the default location for the `InnoDB' tablespace files,
+choose a new drive from the drop-down list of drive letters and choose
+a new path from the drop-down list of paths. To create a custom path,
+click the `...' button.
+
+If you are modifying the configuration of an existing server, you must
+click the `Modify' button before you change the path. In this situation
+you must move the existing tablespace files to the new location
+manually before starting the server.
+
+
+File: manual.info,  Node: mysql-config-wizard-connections,  Next: mysql-config-wizard-networking,  Prev: mysql-config-wizard-tablespace,  Up: mysql-config-wizard
+
+3.3.4.7 MySQL Server Instance Config Wizard: The Concurrent Connections Dialog
+..............................................................................
+
+To prevent the server from running out of resources, it is important to
+limit the number of concurrent connections to the MySQL server that can
+be established. The `Concurrent Connections' dialog enables you to
+choose the expected usage of your server, and sets the limit for
+concurrent connections accordingly. It is also possible to set the
+concurrent connection limit manually.
+
+MySQL Server Instance Config Wizard: Connections
+
+   * `Decision Support (DSS)/OLAP': Choose this option if your server
+     does not require a large number of concurrent connections. The
+     maximum number of connections is set at 100, with an average of 20
+     concurrent connections assumed.
+
+   * `Online Transaction Processing (OLTP)': Choose this option if your
+     server requires a large number of concurrent connections. The
+     maximum number of connections is set at 500.
+
+   * `Manual Setting': Choose this option to set the maximum number of
+     concurrent connections to the server manually. Choose the number
+     of concurrent connections from the drop-down box provided, or
+     enter the maximum number of connections into the drop-down box if
+     the number you desire is not listed.
+
+
+File: manual.info,  Node: mysql-config-wizard-networking,  Next: mysql-config-wizard-character-set,  Prev: mysql-config-wizard-connections,  Up: mysql-config-wizard
+
+3.3.4.8 MySQL Server Instance Config Wizard: The Networking and Strict Mode Options Dialog
+..........................................................................................
+
+Use the `Networking Options' dialog to enable or disable TCP/IP
+networking and to configure the port number that is used to connect to
+the MySQL server.
+
+MySQL Server Instance Config Wizard: Network Configuration
+
+TCP/IP networking is enabled by default. To disable TCP/IP networking,
+uncheck the box next to the `Enable TCP/IP Networking' option.
+
+Port 3306 is used by default. To change the port used to access MySQL,
+choose a new port number from the drop-down box or type a new port
+number directly into the drop-down box. If the port number you choose
+is in use, you are prompted to confirm your choice of port number.
+
+Set the `Server SQL Mode' to either enable or disable strict mode.
+Enabling strict mode (default) makes MySQL behave more like other
+database management systems. _If you run applications that rely on
+MySQL's old `forgiving' behavior, make sure to either adapt those
+applications or to disable strict mode._ For more information about
+strict mode, see *Note server-sql-mode::.
+
+
+File: manual.info,  Node: mysql-config-wizard-character-set,  Next: mysql-config-wizard-service,  Prev: mysql-config-wizard-networking,  Up: mysql-config-wizard
+
+3.3.4.9 MySQL Server Instance Config Wizard: The Character Set Dialog
+.....................................................................
+
+The MySQL server supports multiple character sets and it is possible to
+set a default server character set that is applied to all tables,
+columns, and databases unless overridden. Use the `Character Set'
+dialog to change the default character set of the MySQL server.
+
+MySQL Server Instance Config Wizard: Character Set
+
+   * `Standard Character Set': Choose this option if you want to use
+     `latin1' as the default server character set. `latin1' is used for
+     English and many Western European languages.
+
+   * `Best Support For Multilingualism': Choose this option if you want
+     to use `utf8' as the default server character set.  This is a
+     Unicode character set that can store characters from many
+     different languages.
+
+   * `Manual Selected Default Character Set / Collation': Choose this
+     option if you want to pick the server's default character set
+     manually. Choose the desired character set from the provided
+     drop-down list.
+
+
+File: manual.info,  Node: mysql-config-wizard-service,  Next: mysql-config-wizard-security,  Prev: mysql-config-wizard-character-set,  Up: mysql-config-wizard
+
+3.3.4.10 MySQL Server Instance Config Wizard: The Service Options Dialog
+........................................................................
+
+On Windows platforms, the MySQL server can be installed as a Windows
+service. When installed this way, the MySQL server can be started
+automatically during system startup, and even restarted automatically
+by Windows in the event of a service failure.
+
+The MySQL Server Instance Config Wizard installs the MySQL server as a
+service by default, using the service name `MySQL'. If you do not wish
+to install the service, uncheck the box next to the `Install As Windows
+Service' option. You can change the service name by picking a new
+service name from the drop-down box provided or by entering a new
+service name into the drop-down box.
+
+*Note*:
+
+Service names can include any legal character except forward (`/') or
+backward (`\') slashes, and must be less than 256 characters long.
+
+*Warning*:
+
+If you are installing multiple versions of MySQL onto the same machine,
+you _must_ choose a different service name for each version that you
+install. If you do not choose a different service for each installed
+version then the service manager information will be inconsistent and
+this will cause problems when you try to uninstall a previous version.
+
+If you have already installed multiple versions using the same service
+name, you must manually edit the contents of the
+`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services' parameters
+within the Windows registry to update the association of the service
+name with the correct server version.
+
+Typically, when installing multiple versions you create a service name
+based on the version information. For example, you might install MySQL
+5.x as `mysql5', or specific versions such as MySQL 5.1.30 as
+`mysql50130'.
+
+To install the MySQL server as a service but not have it started
+automatically at startup, uncheck the box next to the `Launch the MySQL
+Server Automatically' option.
+
+
+File: manual.info,  Node: mysql-config-wizard-security,  Next: mysql-config-wizard-confirmation,  Prev: mysql-config-wizard-service,  Up: mysql-config-wizard
+
+3.3.4.11 MySQL Server Instance Config Wizard: The Security Options Dialog
+.........................................................................
+
+The content of the security options portion of the MySQL Server
+Instance Configuration Wizard will depend on whether this is a new
+installation, or modifying an existing installation.
+
+   * *Setting the root password for a new installation*
+
+     _It is strongly recommended that you set a `root' password for
+     your MySQL server_, and the MySQL Server Instance Config Wizard
+     requires by default that you do so. If you do not wish to set a
+     `root' password, uncheck the box next to the `Modify Security
+     Settings' option.
+
+     *Note*:
+
+     If you have previously installed MySQL, but not deleted the data
+     directory associated with the previous installation, you may be
+     prompted to provide the current root password. The password will
+     be the one configured with your old data directory. If you do not
+     want to use this data, or do not know the root password, you should
+     cancel the installation, delete the previous installation data,
+     and then restart the installation process. For more information on
+     deleting MySQL data on Microsoft Windows, see *Note
+     windows-installer-uninstalling::.
+
+     MySQL Server Instance Config Wizard: Security
+
+   * To set the `root' password, enter the desired password into both
+     the `New root password' and `Confirm' boxes.
+
+     *Setting the root password for an existing installation*
+
+     If you are modifying the configuration of an existing
+     configuration, or you are installing an upgrade and the MySQL
+     Server Instance Configuration Wizard has detected an existing
+     MySQL system, then you must enter the existing password for `root'
+     before changing the configuration information.
+
+     MySQL Server Instance Config Wizard: Security (Existing
+     Installation)
+
+     If you want to change the current `root' password, enter the
+     desired new password into both the `New root password' and
+     `Confirm' boxes.
+
+To permit `root' logins from across the network, check the box next to
+the `Enable root access from remote machines' option. This decreases
+the security of your `root' account.
+
+To create an anonymous user account, check the box next to the `Create
+An Anonymous Account' option.  Creating an anonymous account can
+decrease server security and cause login and permission difficulties.
+For this reason, it is not recommended.
+
+
+File: manual.info,  Node: mysql-config-wizard-confirmation,  Next: mysql-config-wizard-cmdline,  Prev: mysql-config-wizard-security,  Up: mysql-config-wizard
+
+3.3.4.12 MySQL Server Instance Config Wizard: The Confirmation Dialog
+.....................................................................
+
+The final dialog in the MySQL Server Instance Config Wizard is the
+`Confirmation Dialog'. To start the configuration process, click the
+`Execute' button. To return to a previous dialog, click the `Back'
+button. To exit the MySQL Server Instance Config Wizard without
+configuring the server, click the `Cancel' button.
+
+MySQL Server Instance Config Wizard: Confirmation
+
+After you click the `Execute' button, the MySQL Server Instance Config
+Wizard performs a series of tasks and displays the progress onscreen as
+the tasks are performed.
+
+The MySQL Server Instance Config Wizard first determines configuration
+file options based on your choices using a template prepared by MySQL
+developers and engineers. This template is named `my-template.ini' and
+is located in your server installation directory.
+
+The MySQL Config Wizard then writes these options to the corresponding
+configuration file.
+
+If you chose to create a service for the MySQL server, the MySQL Server
+Instance Config Wizard creates and starts the service. If you are
+reconfiguring an existing service, the MySQL Server Instance Config
+Wizard restarts the service to apply your configuration changes.
+
+If you chose to set a `root' password, the MySQL Config Wizard connects
+to the server, sets your new `root' password, and applies any other
+security settings you may have selected.
+
+After the MySQL Server Instance Config Wizard has completed its tasks,
+it displays a summary. Click the `Finish' button to exit the MySQL
+Server Config Wizard.
+
+
+File: manual.info,  Node: mysql-config-wizard-cmdline,  Prev: mysql-config-wizard-confirmation,  Up: mysql-config-wizard
+
+3.3.4.13 MySQL Server Instance Config Wizard: Creating an Instance from the Command Line
+........................................................................................
+
+In addition to using the GUI interface to the MySQL Server Instance
+Config Wizard, you can also create instances automatically from the
+command line.
+
+To use the MySQL Server Instance Config Wizard on the command line, you
+need to use the `MySQLInstanceConfig.exe' command that is installed
+with MySQL in the `bin' directory within the installation directory.
+`MySQLInstanceConfig.exe' takes a number of command-line arguments the
+set the properties that would normally be selected through the GUI
+interface, and then creates a new configuration file (`my.ini') by
+combining these selections with a template configuration file to
+produce the working configuration file.
+
+The main command line options are provided in the table below.  Some of
+the options are required, while some options are optional.
+
+*MySQL Server Instance Config Wizard Command Line Options*
+
+Option         Description
+Required       
+Parameters     
+`-nPRODUCTNAME'The name of the instance when installed
+`-pPATH'       Path of the base directory for
+               installation. This is equivalent to the
+               directory when using the `basedir'
+               configuration parameter
+`-vVERSION'    The version tag to use for this
+               installation
+Action to      
+Perform        
+`-i'           Install an instance
+`-r'           Remove an instance
+`-s'           Stop an existing instance
+`-q'           Perform the operation quietly
+`-lFILENAME'   Sae the installation progress in a logfile
+Config File    
+to Use         
+`-tFILENAME'   Path to the template config file that will
+               be used to generate the installed
+               configuration file
+`-cFILENAME'   Path to a config file to be generated
+
+The `-t' and `-c' options work together to set the configuration
+parameters for a new instance.  The `-t' option specifies the template
+configuration file to use as the basic configuration, which are then
+merged with the configuration parameters generated by the MySQL Server
+Instance Config Wizard into the configuration file specified by the
+`-c' option.
+
+A sample template file, `my-template.ini' is provided in the toplevel
+MySQL installation directory. The file contains elements are replaced
+automatically by the MySQL Server Instance Config Wizard during
+configuration.
+
+If you specify a configuration file that already exists, the existing
+configuration file will be saved in the file with the original, with
+the date and time added. For example, the `mysql.ini' will be copied to
+`mysql 2009-10-27 1646.ini.bak'.
+
+The parameters that you can specify on the command line are listed in
+the table below.
+
+*MySQL Server Instance Config Wizard Parameters*
+
+Parameter      Description
+`ServiceName=$'Specify the name of the service to be
+               created
+`AddBinToPath={yesSpecifies whether to add the binary
+| no}'         directory of MySQL to the standard `PATH'
+               environment variable
+`ServerType={DEVELOPMENTSpecify the server type. For more
+| SERVER |     information, see *Note
+DEDICATED}'    mysql-config-wizard-server-type::
+`DatabaseType={MIXEDSpecify the default database type. For
+| INNODB |     more information, see *Note
+MYISAM}'       mysql-config-wizard-database-usage::
+`ConnectionUsage={DSSSpecify the type of connection support,
+| OLTP}'       this automates the setting for the number
+               of concurrent connections (see the
+               `ConnectionCount' parameter). For more
+               information, see *Note
+               mysql-config-wizard-connections::
+`ConnectionCount=#'Specify the number of concurrent
+               connections to support. For more
+               information, see *Note
+               mysql-config-wizard-server-type::
+`SkipNetworking={yesSpecify whether network support should be
+| no}'         supported. Specifying `yes' disables
+               network access altogether
+`Port=#'       Specify the network port number to use for
+               network connections. For more information,
+               see *Note mysql-config-wizard-networking::
+`StrictMode={yesSpecify whether to use the `strict' SQL
+| no}'         mode. For more information, see *Note
+               mysql-config-wizard-networking::
+`Charset=$'    Specify the default character set. For
+               more information, see *Note
+               mysql-config-wizard-character-set::
+`RootPassword=$'Specify the root password
+`RootCurrentPassword=$'Specify the current root password then
+               stopping or reconfiguring an existing
+               service
+
+*Note*:
+
+When specifying options on the command line, you can enclose the entire
+command-line option and the value you are specifying using double
+quotation marks. This enables you to use spaces in the options. For
+example, `"-cC:\mysql.ini"'.
+
+The following command installs a MySQL Server 5.1 instance from the
+directory `C:\Program Files\MySQL\MySQL Server 5.1' using the service
+name `MySQL51' and setting the root password to 1234.
+
+     shell> MySQLInstanceConfig.exe -i -q "-lC:\mysql_install_log.txt" »
+        "-nMySQL Server 5.1" "-pC:\Program Files\MySQL\MySQL Server 5.1" -v5.1.62 »
+        "-tmy-template.ini" "-cC:\mytest.ini" ServerType=DEVELOPMENT DatabaseType=MIXED »
+        ConnectionUsage=DSS Port=3311 ServiceName=MySQL51 RootPassword=1234
+
+In the above example, a log file will be generated in
+`mysql_install_log.txt' containing the information about the instance
+creation process. The log file generated by the above example is shown
+below:
+
+     Welcome to the MySQL Server Instance Configuration Wizard 1.0.16.0
+     Date: 2009-10-27 17:07:21
+
+     Installing service ...
+
+     Product Name:         MySQL Server 5.1
+     Version:              5.1.62
+     Installation Path:    C:\Program Files\MySQL\MySQL Server 5.1\
+
+     Creating configuration file C:\mytest.ini using template my-template.ini.
+     Options:
+     DEVELOPMENT
+     MIXED
+     DSS
+     STRICTMODE
+
+     Variables:
+     port: 3311
+     default-character-set: latin1
+     basedir: "C:/Program Files/MySQL/MySQL Server 5.1/"
+     datadir: "C:/Program Files/MySQL/MySQL Server 5.1/Data/"
+
+     Creating Windows service entry.
+     Service name: "MySQL51"
+     Parameters:   "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqld" --defaults-file="C:\mytest.ini" MySQL51.
+     Windows service MySQL51 installed.
+
+When using the command line, the return values in the following table
+indicate an error performing the specified option.
+
+*Return Value from MySQL Server Instance Config Wizard*
+
+Value          Description
+2              Configuration template file cannot be found
+3              The Windows service entry cannot be created
+4              Could not connect to the Service Control Manager
+5              The MySQL service cannot be started
+6              The MySQL service cannot be stopped
+7              The security settings cannot be applied
+8              The configuration file cannot be written
+9              The Windows service entry cannot be removed
+
+You can perform an installation of MySQL automatically using the MSI
+package. For more information, see *Note windows-installer-msi-quiet::.
+
+
+File: manual.info,  Node: windows-install-archive,  Next: windows-troubleshooting,  Prev: mysql-config-wizard,  Up: windows-installation
+
+3.3.5 Installing MySQL on Microsoft Windows Using a `noinstall' Zip Archive
+---------------------------------------------------------------------------
+
+* Menu:
+
+* windows-extract-archive::      Extracting the Install Archive
+* windows-create-option-file::   Creating an Option File
+* windows-select-server::        Selecting a MySQL Server Type
+* windows-server-first-start::   Starting MySQL Server on Microsoft Windows for the First Time
+* windows-start-command-line::   Starting MySQL Server from the Windows Command Line
+* mysql-installation-windows-path::  Customizing the PATH for MySQL Tools
+* windows-start-service::        Starting MySQL Server as a Microsoft Windows Service
+* windows-testing::              Testing The MySQL Server Installation on Microsoft Windows
+
+Users who are installing from the `noinstall' package can use the
+instructions in this section to manually install MySQL. The process for
+installing MySQL from a Zip archive is as follows:
+
+  1. Extract the archive to the desired install directory
+
+  2. Create an option file
+
+  3. Choose a MySQL server type
+
+  4. Start the MySQL server
+
+  5. Secure the default user accounts
+
+This process is described in the sections that follow.
+
+
+File: manual.info,  Node: windows-extract-archive,  Next: windows-create-option-file,  Prev: windows-install-archive,  Up: windows-install-archive
+
+3.3.5.1 Extracting the Install Archive
+......................................
+
+To install MySQL manually, do the following:
+
+  1. If you are upgrading from a previous version please refer to *Note
+     windows-upgrading::, before beginning the upgrade process.
+
+  2. Make sure that you are logged in as a user with administrator
+     privileges.
+
+  3. Choose an installation location. Traditionally, the MySQL server
+     is installed in `C:\mysql'. The MySQL Installation Wizard installs
+     MySQL under `C:\Program Files\MySQL'. If you do not install MySQL
+     at `C:\mysql', you must specify the path to the install directory
+     during startup or in an option file. See *Note
+     windows-create-option-file::.
+
+  4. Extract the install archive to the chosen installation location
+     using your preferred Zip archive tool. Some tools may extract the
+     archive to a folder within your chosen installation location. If
+     this occurs, you can move the contents of the subfolder into the
+     chosen installation location.
+
+
+File: manual.info,  Node: windows-create-option-file,  Next: windows-select-server,  Prev: windows-extract-archive,  Up: windows-install-archive
+
+3.3.5.2 Creating an Option File
+...............................
+
+If you need to specify startup options when you run the server, you can
+indicate them on the command line or place them in an option file. For
+options that are used every time the server starts, you may find it
+most convenient to use an option file to specify your MySQL
+configuration. This is particularly true under the following
+circumstances:
+
+   * The installation or data directory locations are different from
+     the default locations (`C:\Program Files\MySQL\MySQL Server 5.1'
+     and `C:\Program Files\MySQL\MySQL Server 5.1\data').
+
+   * You need to tune the server settings, such as memory, cache, or
+     InnoDB configuration information.
+
+When the MySQL server starts on Windows, it looks for option files in
+several locations, such as the Windows directory, `C:\', and the MySQL
+installation directory (for the full list of locations, see *Note
+option-files::). The Windows directory typically is named something
+like `C:\WINDOWS'. You can determine its exact location from the value
+of the `WINDIR' environment variable using the following command:
+
+     C:\> echo %WINDIR%
+
+MySQL looks for options in each location first in the `my.ini' file,
+and then in the `my.cnf' file. However, to avoid confusion, it is best
+if you use only one file. If your PC uses a boot loader where `C:' is
+not the boot drive, your only option is to use the `my.ini' file.
+Whichever option file you use, it must be a plain text file.
+
+You can also make use of the example option files included with your
+MySQL distribution; see *Note option-files-preconfigured::.
+
+An option file can be created and modified with any text editor, such
+as Notepad. For example, if MySQL is installed in `E:\mysql' and the
+data directory is in `E:\mydata\data', you can create an option file
+containing a `[mysqld]' section to specify values for the `basedir' and
+`datadir' options:
+
+     [mysqld]
+     # set basedir to your installation path
+     basedir=E:/mysql
+     # set datadir to the location of your data directory
+     datadir=E:/mydata/data
+
+Note that Windows path names are specified in option files using
+(forward) slashes rather than backslashes. If you do use backslashes,
+double them:
+
+     [mysqld]
+     # set basedir to your installation path
+     basedir=E:\\mysql
+     # set datadir to the location of your data directory
+     datadir=E:\\mydata\\data
+
+The rules for use of backslash in option file values are given in *Note
+option-files::.
+
+In MySQL 5.1.23 and earlier, the MySQL installer places the data
+directory directly under the directory where you install MySQL.  On
+MySQL 5.1.24 and later, the data directory is located within the
+`AppData' directory for the user running MySQL.
+
+If you would like to use a data directory in a different location, you
+should copy the entire contents of the `data' directory to the new
+location. For example, if you want to use `E:\mydata' as the data
+directory instead, you must do two things:
+
+  1. Move the entire `data' directory and all of its contents from the
+     default location (for example `C:\Program Files\MySQL\MySQL Server
+     5.1\data') to `E:\mydata'.
+
+  2. Use a `--datadir' option to specify the new data directory
+     location each time you start the server.
+
+
+File: manual.info,  Node: windows-select-server,  Next: windows-server-first-start,  Prev: windows-create-option-file,  Up: windows-install-archive
+
+3.3.5.3 Selecting a MySQL Server Type
+.....................................
+
+The following table shows the available servers for Windows in MySQL
+5.1.20 and earlier.
+
+*`mysqld' binary types for Microsoft Windows up to MySQL 5.1.20*
+
+Binary         Description
+*Note          Optimized binary with named-pipe support
+`mysqld-nt':   
+mysqld.        
+*Note          Optimized binary without named-pipe support
+`mysqld':      
+mysqld.        
+*Note          Like *Note `mysqld-nt': mysqld, but compiled with full
+`mysqld-debug':debugging and automatic memory allocation checking
+mysqld.        
+
+The following table shows the available servers for Windows in MySQL
+5.1.21 and later.
+
+*`mysqld' binary types for Microsoft Windows MySQL 5.1.21 and later*
+
+Binary         Description
+*Note          Optimized binary with named-pipe support
+`mysqld':      
+mysqld.        
+*Note          Like *Note `mysqld': mysqld, but compiled with full
+`mysqld-debug':debugging and automatic memory allocation checking
+mysqld.        
+
+All of the preceding binaries are optimized for modern Intel
+processors, but should work on any Intel i386-class or higher processor.
+
+Each of the servers in a distribution support the same set of storage
+engines. The *Note `SHOW ENGINES': show-engines.  statement displays
+which engines a given server supports.
+
+All Windows MySQL 5.1 servers have support for symbolic linking of
+database directories.
+
+MySQL supports TCP/IP on all Windows platforms. MySQL servers on
+Windows support named pipes as indicated in the following list.
+However, the default is to use TCP/IP regardless of platform.  (Named
+pipes are slower than TCP/IP in many Windows configurations.)
+
+Use of named pipes is subject to these conditions:
+
+   * Named pipes are enabled only if you start the server with the
+     `--enable-named-pipe' option. It is necessary to use this option
+     explicitly because some users have experienced problems with
+     shutting down the MySQL server when named pipes were used.
+
+   * For MySQL 5.1.20 and earlier, named-pipe connections are permitted
+     only by the *Note `mysqld-nt': mysqld. and *Note `mysqld-debug':
+     mysqld. servers. For MySQL 5.1.21 and later, the *Note `mysqld':
+     mysqld. and *Note `mysqld-debug': mysqld. servers both contain
+     support for named-pipe connections.
+
+*Note*:
+
+Most of the examples in this manual use *Note `mysqld': mysqld. as the
+server name. If you choose to use a different server, such as *Note
+`mysqld-nt': mysqld.  or *Note `mysqld-debug': mysqld, make the
+appropriate substitutions in the commands that are shown in the
+examples.
+
+
+File: manual.info,  Node: windows-server-first-start,  Next: windows-start-command-line,  Prev: windows-select-server,  Up: windows-install-archive
+
+3.3.5.4 Starting MySQL Server on Microsoft Windows for the First Time
+.....................................................................
+
+This section gives a general overview of starting the MySQL server. The
+following sections provide more specific information for starting the
+MySQL server from the command line or as a Windows service.
+
+The information here applies primarily if you installed MySQL using the
+`Noinstall' version, or if you wish to configure and test MySQL
+manually rather than with the GUI tools.
+
+The examples in these sections assume that MySQL is installed under the
+default location of `C:\Program Files\MySQL\MySQL Server 5.1'. Adjust
+the path names shown in the examples if you have MySQL installed in a
+different location.
+
+Clients have two options. They can use TCP/IP, or they can use a named
+pipe if the server supports named-pipe connections.
+
+MySQL for Windows also supports shared-memory connections if the server
+is started with the `--shared-memory' option. Clients can connect
+through shared memory by using the `--protocol=MEMORY' option.
+
+For information about which server binary to run, see *Note
+windows-select-server::.
+
+Testing is best done from a command prompt in a console window (or `DOS
+window'). In this way you can have the server display status messages
+in the window where they are easy to see. If something is wrong with
+your configuration, these messages make it easier for you to identify
+and fix any problems.
+
+To start the server, enter this command:
+
+     C:\> "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqld" --console
+
+For a server that includes `InnoDB' support, you should see the
+messages similar to those following as it starts (the path names and
+sizes may differ):
+
+     InnoDB: The first specified datafile c:\ibdata\ibdata1 did not exist:
+     InnoDB: a new database to be created!
+     InnoDB: Setting file c:\ibdata\ibdata1 size to 209715200
+     InnoDB: Database physically writes the file full: wait...
+     InnoDB: Log file c:\iblogs\ib_logfile0 did not exist: new to be created
+     InnoDB: Setting log file c:\iblogs\ib_logfile0 size to 31457280
+     InnoDB: Log file c:\iblogs\ib_logfile1 did not exist: new to be created
+     InnoDB: Setting log file c:\iblogs\ib_logfile1 size to 31457280
+     InnoDB: Log file c:\iblogs\ib_logfile2 did not exist: new to be created
+     InnoDB: Setting log file c:\iblogs\ib_logfile2 size to 31457280
+     InnoDB: Doublewrite buffer not found: creating new
+     InnoDB: Doublewrite buffer created
+     InnoDB: creating foreign key constraint system tables
+     InnoDB: foreign key constraint system tables created
+     011024 10:58:25  InnoDB: Started
+
+When the server finishes its startup sequence, you should see something
+like this, which indicates that the server is ready to service client
+connections:
+
+     mysqld: ready for connections
+     Version: '5.1.62'  socket: ''  port: 3306
+
+The server continues to write to the console any further diagnostic
+output it produces. You can open a new console window in which to run
+client programs.
+
+If you omit the `--console' option, the server writes diagnostic output
+to the error log in the data directory (`C:\Program Files\MySQL\MySQL
+Server 5.1\data' by default). The error log is the file with the `.err'
+extension.
+
+*Note*:
+
+The accounts that are listed in the MySQL grant tables initially have
+no passwords. After starting the server, you should set up passwords
+for them using the instructions in *Note postinstallation::.
+
+
+File: manual.info,  Node: windows-start-command-line,  Next: mysql-installation-windows-path,  Prev: windows-server-first-start,  Up: windows-install-archive
+
+3.3.5.5 Starting MySQL Server from the Windows Command Line
+...........................................................
+
+The MySQL server can be started manually from the command line.  This
+can be done on any version of Windows.
+
+To start the *Note `mysqld': mysqld. server from the command line, you
+should start a console window (or `DOS window') and enter this command:
+
+     C:\> "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqld"
+
+The path to *Note `mysqld': mysqld. may vary depending on the install
+location of MySQL on your system.
+
+You can stop the MySQL server by executing this command:
+
+     C:\> "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqladmin" -u root shutdown
+
+*Note*:
+
+If the MySQL `root' user account has a password, you need to invoke
+*Note `mysqladmin': mysqladmin.  with the `-p' option and supply the
+password when prompted.
+
+This command invokes the MySQL administrative utility *Note
+`mysqladmin': mysqladmin. to connect to the server and tell it to shut
+down. The command connects as the MySQL `root' user, which is the
+default administrative account in the MySQL grant system. Note that
+users in the MySQL grant system are wholly independent from any login
+users under Windows.
+
+If *Note `mysqld': mysqld. doesn't start, check the error log to see
+whether the server wrote any messages there to indicate the cause of
+the problem. The error log is located in the `C:\Program
+Files\MySQL\MySQL Server 5.1\data' directory. It is the file with a
+suffix of `.err'. You can also try to start the server as *Note `mysqld
+--console': mysqld.; in this case, you may get some useful information
+on the screen that may help solve the problem.
+
+The last option is to start *Note `mysqld': mysqld. with the
+`--standalone' and `--debug' options. In this case, *Note `mysqld':
+mysqld. writes a log file `C:\mysqld.trace' that should contain the
+reason why *Note `mysqld': mysqld. doesn't start. See MySQL Internals:
+Porting (http://forge.mysql.com/wiki/MySQL_Internals_Porting).
+
+Use *Note `mysqld --verbose --help': mysqld. to display all the options
+that *Note `mysqld': mysqld. supports.
+
+
+File: manual.info,  Node: mysql-installation-windows-path,  Next: windows-start-service,  Prev: windows-start-command-line,  Up: windows-install-archive
+
+3.3.5.6 Customizing the PATH for MySQL Tools
+............................................
+
+To make it easier to invoke MySQL programs, you can add the path name
+of the MySQL `bin' directory to your Windows system `PATH' environment
+variable:
+
+   * On the Windows desktop, right-click the `My Computer' icon, and
+     select `Properties'.
+
+   * Next select the `Advanced' tab from the `System Properties' menu
+     that appears, and click the `Environment Variables' button.
+
+   * Under `System Variables', select `Path', and then click the `Edit'
+     button. The `Edit System Variable' dialogue should appear.
+
+   * Place your cursor at the end of the text appearing in the space
+     marked `Variable Value'. (Use the `End' key to ensure that your
+     cursor is positioned at the very end of the text in this space.)
+     Then enter the complete path name of your MySQL `bin' directory
+     (for example, `C:\Program Files\MySQL\MySQL Server 5.1\bin')
+
+     *Note*:
+
+     There must be a semicolon separating this path from any values
+     present in this field.
+
+     Dismiss this dialogue, and each dialogue in turn, by clicking `OK'
+     until all of the dialogues that were opened have been dismissed.
+     You should now be able to invoke any MySQL executable program by
+     typing its name at the DOS prompt from any directory on the system,
+     without having to supply the path. This includes the servers, the
+     *Note `mysql': mysql. client, and all MySQL command-line utilities
+     such as *Note `mysqladmin': mysqladmin.  and *Note `mysqldump':
+     mysqldump.
+
+     You should not add the MySQL `bin' directory to your Windows
+     `PATH' if you are running multiple MySQL servers on the same
+     machine.
+
+*Warning*:
+
+You must exercise great care when editing your system `PATH' by hand;
+accidental deletion or modification of any portion of the existing
+`PATH' value can leave you with a malfunctioning or even unusable
+system.
+
+
+File: manual.info,  Node: windows-start-service,  Next: windows-testing,  Prev: mysql-installation-windows-path,  Up: windows-install-archive
+
+3.3.5.7 Starting MySQL Server as a Microsoft Windows Service
+............................................................
+
+On Windows, the recommended way to run MySQL is to install it as a
+Windows service, whereby MySQL starts and stops automatically when
+Windows starts and stops, and can be managed using the service manager
+framework. A MySQL server installed as a service can also be controlled
+from the command line using `NET' commands, or with the graphical
+`Services' utility. Generally, to install MySQL as a Windows service
+you should be logged in using an account that has administrator rights.
+
+The `Services' utility (the Windows `Service Control Manager') can be
+found in the Windows Control Panel (under `Administrative Tools' on
+Windows 2000, XP, Vista, and Server 2003). To avoid conflicts, it is
+advisable to close the `Services' utility while performing server
+installation or removal operations from the command line.
+
+Before installing MySQL as a Windows service, you should first stop the
+current server if it is running by using the following command:
+
+     C:\> "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqladmin"
+               -u root shutdown
+
+*Note*:
+
+If the MySQL `root' user account has a password, you need to invoke
+*Note `mysqladmin': mysqladmin.  with the `-p' option and supply the
+password when prompted.
+
+This command invokes the MySQL administrative utility *Note
+`mysqladmin': mysqladmin. to connect to the server and tell it to shut
+down. The command connects as the MySQL `root' user, which is the
+default administrative account in the MySQL grant system. Note that
+users in the MySQL grant system are wholly independent from any login
+users under Windows.
+
+Install the server as a service using this command:
+
+     C:\> "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqld" --install
+
+*Note*:
+
+The service-installation command does not start the server.
+
+The following additional arguments can be used when installing the
+service:
+
+   * You can specify a service name immediately following the
+     `--install' option. The default service name is `MySQL'.
+
+   * If a service name is given, it can be followed by a single option.
+     By convention, this should be `--defaults-file=FILE_NAME' to
+     specify the name of an option file from which the server should
+     read options when it starts.
+
+     The use of a single option other than `--defaults-file' is possible
+     but discouraged.  `--defaults-file' is more flexible because it
+     enables you to specify multiple startup options for the server by
+     placing them in the named option file.
+
+   * You can also specify a `--local-service' option following the
+     service name. This causes the server to run using the
+     `LocalService' Windows account that has limited system privileges.
+     This account is available only for Windows XP or newer. If both
+     `--defaults-file' and `--local-service' are given following the
+     service name, they can be in any order.
+
+For a MySQL server that is installed as a Windows service, the
+following rules determine the service name and option files that the
+server uses:
+
+   * If the service-installation command specifies no service name or
+     the default service name (`MySQL') following the `--install'
+     option, the server uses the a service name of `MySQL' and reads
+     options from the `[mysqld]' group in the standard option files.
+
+   * If the service-installation command specifies a service name other
+     than `MySQL' following the `--install' option, the server uses that
+     service name. It reads options from the `[mysqld]' group and the
+     group that has the same name as the service in the standard option
+     files. This enables you to use the `[mysqld]' group for options
+     that should be used by all MySQL services, and an option group
+     with the service name for use by the server installed with that
+     service name.
+
+   * If the service-installation command specifies a `--defaults-file'
+     option after the service name, the server reads options only from
+     the `[mysqld]' group of the named file and ignores the standard
+     option files.
+
+As a more complex example, consider the following command:
+
+     C:\> "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqld"
+               --install MySQL --defaults-file=C:\my-opts.cnf
+
+Here, the default service name (`MySQL') is given after the `--install'
+option. If no `--defaults-file' option had been given, this command
+would have the effect of causing the server to read the `[mysqld]'
+group from the standard option files. However, because the
+`--defaults-file' option is present, the server reads options from the
+`[mysqld]' option group, and only from the named file.
+
+You can also specify options as Start parameters in the Windows
+`Services' utility before you start the MySQL service.
+
+Once a MySQL server has been installed as a service, Windows starts the
+service automatically whenever Windows starts. The service also can be
+started immediately from the `Services' utility, or by using a `NET
+START MySQL' command. The `NET' command is not case sensitive.
+
+When run as a service, *Note `mysqld': mysqld. has no access to a
+console window, so no messages can be seen there. If *Note `mysqld':
+mysqld. does not start, check the error log to see whether the server
+wrote any messages there to indicate the cause of the problem. The
+error log is located in the MySQL data directory (for example,
+`C:\Program Files\MySQL\MySQL Server 5.1\data'). It is the file with a
+suffix of `.err'.
+
+When a MySQL server has been installed as a service, and the service is
+running, Windows stops the service automatically when Windows shuts
+down. The server also can be stopped manually by using the `Services'
+utility, the `NET STOP MySQL' command, or the *Note `mysqladmin
+shutdown': mysqladmin. command.
+
+You also have the choice of installing the server as a manual service
+if you do not wish for the service to be started automatically during
+the boot process. To do this, use the `--install-manual' option rather
+than the `--install' option:
+
+     C:\> "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqld" --install-manual
+
+To remove a server that is installed as a service, first stop it if it
+is running by executing `NET STOP MySQL'.  Then use the `--remove'
+option to remove it:
+
+     C:\> "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqld" --remove
+
+If *Note `mysqld': mysqld. is not running as a service, you can start
+it from the command line. For instructions, see *Note
+windows-start-command-line::.
+
+Please see *Note windows-troubleshooting::, if you encounter
+difficulties during installation.
+
+
+File: manual.info,  Node: windows-testing,  Prev: windows-start-service,  Up: windows-install-archive
+
+3.3.5.8 Testing The MySQL Server Installation on Microsoft Windows
+..................................................................
+
+You can test whether the MySQL server is working by executing any of
+the following commands:
+
+     C:\> "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqlshow"
+     C:\> "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqlshow" -u root mysql
+     C:\> "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqladmin" version status proc
+     C:\> "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysql" test
+
+*Note*:
+
+By default, *Note `mysqlshow': mysqlshow. will try to connect using the
+`ODBC' user. This user is not created by default. You should specify a
+valid user, or `root' with the right password to check the operation of
+the server.
+
+If *Note `mysqld': mysqld. is slow to respond to TCP/IP connections
+from client programs, there is probably a problem with your DNS. In
+this case, start *Note `mysqld': mysqld.  with the `--skip-name-resolve'
+option and use only `localhost' and IP addresses in the `Host' column
+of the MySQL grant tables.
+
+You can force a MySQL client to use a named-pipe connection rather than
+TCP/IP by specifying the `--pipe' or `--protocol=PIPE' option, or by
+specifying `.' (period) as the host name. Use the `--socket' option to
+specify the name of the pipe if you do not want to use the default pipe
+name.
+
+Note that if you have set a password for the `root' account, deleted
+the anonymous account, or created a new user account, then you must use
+the appropriate `-u' and `-p' options with the commands shown above to
+connect with the MySQL Server. See *Note connecting::.
+
+For more information about *Note `mysqlshow': mysqlshow, see *Note
+mysqlshow::.
+
+
+File: manual.info,  Node: windows-troubleshooting,  Next: windows-upgrading,  Prev: windows-install-archive,  Up: windows-installation
+
+3.3.6 Troubleshooting a Microsoft Windows MySQL Server Installation
+-------------------------------------------------------------------
+
+When installing and running MySQL for the first time, you may encounter
+certain errors that prevent the MySQL server from starting. The purpose
+of this section is to help you diagnose and correct some of these
+errors.
+
+Your first resource when troubleshooting server issues is the error
+log. The MySQL server uses the error log to record information relevant
+to the error that prevents the server from starting. The error log is
+located in the data directory specified in your `my.ini' file. The
+default data directory location is `C:\Program Files\MySQL\MySQL Server
+5.1\data', or `C:\ProgramData\Mysql' on Windows 7 and Windows Server
+2008. The `C:\ProgramData' diectory is hidden by default. You need to
+change your folder options to see the directory and contents. For more
+information on the error log and understanding the content, see *Note
+error-log::.
+
+Another source of information regarding possible errors is the console
+messages displayed when the MySQL service is starting. Use the `NET
+START MySQL' command from the command line after installing *Note
+`mysqld': mysqld. as a service to see any error messages regarding the
+starting of the MySQL server as a service. See *Note
+windows-start-service::.
+
+The following examples show other common error messages you may
+encounter when installing MySQL and starting the server for the first
+time:
+
+   * If the MySQL server cannot find the `mysql' privileges database or
+     other critical files, you may see these messages:
+
+          System error 1067 has occurred.
+          Fatal error: Can't open privilege tables: Table 'mysql.host' doesn't exist
+
+     These messages often occur when the MySQL base or data directories
+     are installed in different locations than the default locations
+     (`C:\Program Files\MySQL\MySQL Server 5.1' and `C:\Program
+     Files\MySQL\MySQL Server 5.1\data', respectively).
+
+     This situation may occur when MySQL is upgraded and installed to a
+     new location, but the configuration file is not updated to reflect
+     the new location. In addition, there may be old and new
+     configuration files that conflict. Be sure to delete or rename any
+     old configuration files when upgrading MySQL.
+
+     If you have installed MySQL to a directory other than `C:\Program
+     Files\MySQL\MySQL Server 5.1', you need to ensure that the MySQL
+     server is aware of this through the use of a configuration
+     (`my.ini') file. The `my.ini' file needs to be located in your
+     Windows directory, typically `C:\WINDOWS'.  You can determine its
+     exact location from the value of the `WINDIR' environment variable
+     by issuing the following command from the command prompt:
+
+          C:\> echo %WINDIR%
+
+     An option file can be created and modified with any text editor,
+     such as Notepad. For example, if MySQL is installed in `E:\mysql'
+     and the data directory is `D:\MySQLdata', you can create the option
+     file and set up a `[mysqld]' section to specify values for the
+     `basedir' and `datadir' options:
+
+          [mysqld]
+          # set basedir to your installation path
+          basedir=E:/mysql
+          # set datadir to the location of your data directory
+          datadir=D:/MySQLdata
+
+     Note that Windows path names are specified in option files using
+     (forward) slashes rather than backslashes. If you do use
+     backslashes, double them:
+
+          [mysqld]
+          # set basedir to your installation path
+          basedir=C:\\Program Files\\MySQL\\MySQL Server 5.1
+          # set datadir to the location of your data directory
+          datadir=D:\\MySQLdata
+
+     The rules for use of backslash in option file values are given in
+     *Note option-files::.
+
+     If you change the `datadir' value in your MySQL configuration
+     file, you must move the contents of the existing MySQL data
+     directory before restarting the MySQL server.
+
+     See *Note windows-create-option-file::.
+
+   * If you reinstall or upgrade MySQL without first stopping and
+     removing the existing MySQL service and install MySQL using the
+     MySQL Config Wizard, you may see this error:
+
+          Error: Cannot create Windows service for MySql. Error: 0
+
+     This occurs when the Config Wizard tries to install the service
+     and finds an existing service with the same name.
+
+     One solution to this problem is to choose a service name other
+     than `mysql' when using the configuration wizard. This enables the
+     new service to be installed correctly, but leaves the outdated
+     service in place. Although this is harmless, it is best to remove
+     old services that are no longer in use.
+
+     To permanently remove the old `mysql' service, execute the
+     following command as a user with administrative privileges, on the
+     command-line:
+
+          C:\> sc delete mysql
+          [SC] DeleteService SUCCESS
+
+     If the `sc' utility is not available for your version of Windows,
+     download the `delsrv' utility from
+     `http://www.microsoft.com/windows2000/techinfo/reskit/tools/existing/delsrv-o.asp'
+     and use the `delsrv mysql' syntax.
+
+
+File: manual.info,  Node: windows-upgrading,  Next: windows-postinstallation,  Prev: windows-troubleshooting,  Up: windows-installation
+
+3.3.7 Upgrading MySQL Server on Microsoft Windows
+-------------------------------------------------
+
+This section lists some of the steps you should take when upgrading
+MySQL on Windows.
+
+  1. Review *Note upgrading::, for additional information on upgrading
+     MySQL that is not specific to Windows.
+
+  2. You should always back up your current MySQL installation before
+     performing an upgrade. See *Note backup-methods::.
+
+  3. Download the latest Windows distribution of MySQL from
+     `http://dev.mysql.com/downloads/'.
+
+  4. Before upgrading MySQL, you must stop the server. If the server is
+     installed as a service, stop the service with the following
+     command from the command prompt:
+
+          C:\> NET STOP MySQL
+
+     If you are not running the MySQL server as a service, use *Note
+     `mysqladmin': mysqladmin. to stop it. For example, before
+     upgrading from MySQL 5.0 to 5.1, use *Note `mysqladmin':
+     mysqladmin. from MySQL 5.0 as follows:
+
+          C:\> "C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqladmin" -u root shutdown
+
+     *Note*:
+
+     If the MySQL `root' user account has a password, you need to
+     invoke *Note `mysqladmin': mysqladmin.  with the `-p' option and
+     supply the password when prompted.
+
+  5. Before upgrading to MySQL 5.1 from a version previous to 4.1.5, or
+     from a version of MySQL installed from a Zip archive to a version
+     of MySQL installed with the MySQL Installation Wizard, you must
+     first manually remove the previous installation and MySQL service
+     (if the server is installed as a service).
+
+     To remove the MySQL service, use the following command:
+
+          C:\> C:\mysql\bin\mysqld --remove
+
+     *Important*:
+
+     If you do not remove the existing service, the MySQL Installation
+     Wizard may fail to properly install the new MySQL service.
+
+  6. When upgrading from MySQL 5.1.23 to MySQL 5.1.24, the change in
+     the default location of the data directory from a directory within
+     the MySQL installation to the `AppData' folder means that you must
+     manually copy the data files from your old installation to the new
+     location.
+
+  7. If you are using the MySQL Installation Wizard, start the wizard
+     as described in *Note windows-install-wizard::.
+
+  8. If you are installing MySQL from a Zip archive, extract the
+     archive. You may either overwrite your existing MySQL installation
+     (usually located at `C:\mysql'), or install it into a different
+     directory, such as `C:\mysql5'. Overwriting the existing
+     installation is recommended.
+
+  9. If you were running MySQL as a Windows service and you had to
+     remove the service earlier in this procedure, reinstall the
+     service. (See *Note windows-start-service::.)
+
+ 10. Restart the server. For example, use `NET START MySQL' if you run
+     MySQL as a service, or invoke *Note `mysqld': mysqld. directly
+     otherwise.
+
+ 11. As Administrator, run *Note `mysql_upgrade': mysql-upgrade. to
+     check your tables, attempt to repair them if necessary, and update
+     your grant tables if they have changed so that you can take
+     advantage of any new capabilities. See *Note mysql-upgrade::.
+
+ 12. If you encounter errors, see *Note windows-troubleshooting::.
+
+
+File: manual.info,  Node: windows-postinstallation,  Prev: windows-upgrading,  Up: windows-installation
+
+3.3.8 MySQL Server on Microsoft Windows Postinstallation Procedures
+-------------------------------------------------------------------
+
+On Windows, you need not create the data directory and the grant
+tables. MySQL Windows distributions include the grant tables with a set
+of preinitialized accounts in the `mysql' database under the data
+directory. Regarding passwords, if you installed MySQL using the
+Windows Installation Wizard, you may have already assigned passwords to
+the accounts. (See *Note windows-install-wizard::.) Otherwise, use the
+password-assignment procedure given in *Note default-privileges::.
+
+Before setting up passwords, you might want to try running some client
+programs to make sure that you can connect to the server and that it is
+operating properly. Make sure that the server is running (see *Note
+windows-server-first-start::), and then issue the following commands to
+verify that you can retrieve information from the server. You may need
+to specify directory different from `C:\mysql\bin' on the command line.
+If you used the Windows Installation Wizard, the default directory is
+`C:\Program Files\MySQL\MySQL Server 5.1', and the *Note `mysql':
+mysql. and *Note `mysqlshow': mysqlshow. client programs are in
+`C:\Program Files\MySQL\MySQL Server 5.1\bin'. See *Note
+windows-install-wizard::, for more information.
+
+Use *Note `mysqlshow': mysqlshow. to see what databases exist:
+
+     C:\> C:\mysql\bin\mysqlshow
+     +--------------------+
+     |     Databases      |
+     +--------------------+
+     | information_schema |
+     | mysql              |
+     | test               |
+     +--------------------+
+
+The list of installed databases may vary, but will always include the
+minimum of `mysql' and `information_schema'. In most cases, the `test'
+database will also be installed automatically.
+
+The preceding command (and commands for other MySQL programs such as
+*Note `mysql': mysql.) may not work if the correct MySQL account does
+not exist. For example, the program may fail with an error, or you may
+not be able to view all databases. If you installed using the MSI
+packages and used the MySQL Server Instance Config Wizard, then the
+`root' user will have been created automatically with the password you
+supplied. In this case, you should use the `-u root' and `-p' options.
+(You will also need to use the `-u root' and `-p' options if you have
+already secured the initial MySQL accounts.) With `-p', you will be
+prompted for the `root' password. For example:
+
+     C:\> C:\mysql\bin\mysqlshow -u root -p
+     Enter password: (ENTER ROOT PASSWORD HERE)
+     +--------------------+
+     |     Databases      |
+     +--------------------+
+     | information_schema |
+     | mysql              |
+     | test               |
+     +--------------------+
+
+If you specify a database name, *Note `mysqlshow': mysqlshow.  displays
+a list of the tables within the database:
+
+     C:\> C:\mysql\bin\mysqlshow mysql
+     Database: mysql
+     +---------------------------+
+     |          Tables           |
+     +---------------------------+
+     | columns_priv              |
+     | db                        |
+     | event                     |
+     | func                      |
+     | help_category             |
+     | help_keyword              |
+     | help_relation             |
+     | help_topic                |
+     | host                      |
+     | plugin                    |
+     | proc                      |
+     | procs_priv                |
+     | servers                   |
+     | tables_priv               |
+     | time_zone                 |
+     | time_zone_leap_second     |
+     | time_zone_name            |
+     | time_zone_transition      |
+     | time_zone_transition_type |
+     | user                      |
+     +---------------------------+
+
+Use the *Note `mysql': mysql. program to select information from a
+table in the `mysql' database:
+
+     C:\> C:\mysql\bin\mysql -e "SELECT Host,Db,User FROM mysql.db"
+     +------+--------+------+
+     | host | db     | user |
+     +------+--------+------+
+     | %    | test   |      |
+     | %    | test_% |      |
+     +------+--------+------+
+
+For more information about *Note `mysqlshow': mysqlshow. and *Note
+`mysql': mysql, see *Note mysqlshow::, and *Note mysql::.
+
+If you are running a version of Windows that supports services, you can
+set up the MySQL server to run automatically when Windows starts. See
+*Note windows-start-service::.
+
+
+File: manual.info,  Node: macosx-installation,  Next: linux-installation,  Prev: windows-installation,  Up: installing
+
+3.4 Installing MySQL on Mac OS X
+================================
+
+* Menu:
+
+* macosx-installation-notes::    General Notes on Installing MySQL on Mac OS X
+* macosx-installation-pkg::      Installing MySQL on Mac OS X Using Native Packages
+* macosx-installation-startupitem::  Installing the MySQL Startup Item
+* macosx-installation-prefpane::  Installing and Using the MySQL Preference Pane
+* macosx-installation-server::   Using the Bundled MySQL on Mac OS X Server
+
+MySQL for Mac OS X is available in a number of different forms:
+
+   * Native Package Installer format, which uses the native Mac OS X
+     installer to walk you through the installation of MySQL. For more
+     information, see *Note macosx-installation-pkg::.  You can use the
+     package installer with Mac OS X 10.3 and later, and the package is
+     available for both PowerPC and Intel architectures, and 32-bit and
+     64-bit architectures. There is no Universal Binary available using
+     the package installation method. The user you use to perform the
+     installation must have administrator privileges.
+
+   * Tar package format, which uses a file packaged using the Unix
+     `tar' and `gzip' commands. To use this method, you will need to
+     open a `Terminal' window. You do not need administrator privileges
+     using this method, as you can install the MySQL server anywhere
+     using this method. For more information on using this method, you
+     can use the generic instructions for using a tarball, *Note
+     binary-installation::.You can use the package installer with Mac
+     OS X 10.3 and later, and available for both PowerPC and Intel
+     architectures, and both 32-bit and 64-bit architectures. A
+     Universal Binary, incorporating both Power PC and Intel
+     architectures and 32-bit and 64-bit binaries is available.
+
+     In addition to the core installation, the Package Installer also
+     includes *Note macosx-installation-startupitem:: and *Note
+     macosx-installation-prefpane::, both of which simplify the
+     management of your installation.
+
+   * Mac OS X server includes a version of MySQL as standard. If you
+     want to use a more recent version than that supplied with the Mac
+     OS X server release, you can make use of the package or tar
+     formats. For more information on using the MySQL bundled with Mac
+     OS X, see *Note macosx-installation-server::.
+
+For additional information on using MySQL on Mac OS X, see *Note
+macosx-installation-notes::.
+
+
+File: manual.info,  Node: macosx-installation-notes,  Next: macosx-installation-pkg,  Prev: macosx-installation,  Up: macosx-installation
+
+3.4.1 General Notes on Installing MySQL on Mac OS X
+---------------------------------------------------
+
+You should keep the following issues and notes in mind:
+
+   * The default location for the MySQL Unix socket is different on Mac
+     OS X and Mac OS X Server depending on the installation type you
+     chose. The following table shows the default locations by
+     installation type.
+
+     *MySQL Unix Socket Locations on Mac OS X by Installation Type*
+
+     Installation Type    Socket Location
+     Package Installer    `/tmp/mysql.sock'
+     from MySQL           
+     Tarball from MySQL   `/tmp/mysql.sock'
+     MySQL Bundled with   `/var/mysql/mysql.sock'
+     Mac OS X Server      
+
+     To prevent issues, you should either change the configuration of
+     the socket used within your application (for example, changing
+     `php.ini'), or you should configure the socket location using a
+     MySQL configuration file and the `socket' option. For more
+     information, see *Note server-options::.
+
+   * You may need (or want) to create a specific `mysql' user to own
+     the MySQL directory and data. On Mac OS X 10.4 and lower you can
+     do this by using the `Netinfo Manager' application, located within
+     the `Utilities' folder within the `Applications' folder. On Mac OS
+     X 10.5 and later you can do this through the `Directory Utility'.
+     From Mac OS X 10.5 and later (including Mac OS X Server 10.5) the
+     `mysql' should already exist. For use in single user mode, an
+     entry for `_mysql' (note the underscore prefix) should already
+     exist within the system `/etc/passwd' file.
+
+   * Due to a bug in the Mac OS X package installer, you may see this
+     error message in the destination disk selection dialog:
+
+          You cannot install this software on this disk. (null)
+
+     If this error occurs, click the `Go Back' button once to return to
+     the previous screen. Then click `Continue' to advance to the
+     destination disk selection again, and you should be able to choose
+     the destination disk correctly. We have reported this bug to Apple
+     and it is investigating this problem.
+
+   * Because the MySQL package installer installs the MySQL contents
+     into a version and platform specific directory, you can use this
+     to upgrade and migrate your database between versions. You will
+     need to either copy the `data' directory from the old version to
+     the new version, or alternatively specify an alternative `datadir'
+     value to set location of the data directory.
+
+   * You might want to add aliases to your shell's resource file to
+     make it easier to access commonly used programs such as *Note
+     `mysql': mysql. and *Note `mysqladmin': mysqladmin.  from the
+     command line. The syntax for `bash' is:
+
+          alias mysql=/usr/local/mysql/bin/mysql
+          alias mysqladmin=/usr/local/mysql/bin/mysqladmin
+
+     For `tcsh', use:
+
+          alias mysql /usr/local/mysql/bin/mysql
+          alias mysqladmin /usr/local/mysql/bin/mysqladmin
+
+     Even better, add `/usr/local/mysql/bin' to your `PATH' environment
+     variable. You can do this by modifying the appropriate startup
+     file for your shell.  For more information, see *Note
+     invoking-programs::.
+
+   * After you have copied over the MySQL database files from the
+     previous installation and have successfully started the new
+     server, you should consider removing the old installation files to
+     save disk space. Additionally, you should also remove older
+     versions of the Package Receipt directories located in
+     `/Library/Receipts/mysql-VERSION.pkg'.
+
+
+File: manual.info,  Node: macosx-installation-pkg,  Next: macosx-installation-startupitem,  Prev: macosx-installation-notes,  Up: macosx-installation
+
+3.4.2 Installing MySQL on Mac OS X Using Native Packages
+--------------------------------------------------------
+
+You can install MySQL on Mac OS X 10.3.x (`Panther') or newer using a
+Mac OS X binary package in PKG format instead of the binary tarball
+distribution. Please note that older versions of Mac OS X (for example,
+10.1.x or 10.2.x) are _not_ supported by this package.
+
+The package is located inside a disk image (`.dmg') file that you first
+need to mount by double-clicking its icon in the Finder. It should then
+mount the image and display its contents.
+
+*Note*:
+
+Before proceeding with the installation, be sure to stop all running
+MySQL server instances by using either the MySQL Manager Application
+(on Mac OS X Server) or *Note `mysqladmin shutdown': mysqladmin. on the
+command line.
+
+When installing from the package version, you should also install the
+MySQL Preference Pane, which will enable you to control the startup and
+execution of your MySQL server from System Preferences. For more
+information, see *Note macosx-installation-prefpane::.
+
+When installing using the package installer, the files are installed
+into a directory within `/usr/local' matching the name of the
+installation version and platform. For example, the installer file
+`mysql-5.1.39-osx10.5-x86_64.pkg' installs MySQL into
+`/usr/local/mysql-5.1.39-osx10.5-x86_64 '. The following table shows
+the layout of the installation directory.
+
+*MySQL Installation Layout on Mac OS X*
+
+Directory                        Contents of Directory
+`bin'                            Client programs and the *Note `mysqld':
+                                 mysqld. server
+`data'                           Log files, databases
+`docs'                           Manual in Info format
+`include'                        Include (header) files
+`lib'                            Libraries
+`man'                            Unix manual pages
+`mysql-test'                     MySQL test suite
+`scripts'                        *Note `mysql_install_db':
+                                 mysql-install-db.
+`share'                          Miscellaneous support files, including
+                                 error messages, sample configuration
+                                 files, SQL for database installation
+`sql-bench'                      Benchmarks
+`support-files'                  Scripts and sample configuration files
+`/tmp/mysql.sock'                Location of the MySQL Unix socket
+
+During the package installer process, a symbolic link from
+`/usr/local/mysql' to the version/platform specific directory created
+during installation will be created automatically.
+
+  1. Download and open the MySQL package installer, which is provided
+     on a disk image (`.dmg') that includes the main MySQL installation
+     package, the `MySQLStartupItem.pkg' installation package, and the
+     `MySQL.prefPane'.  Double-click the disk image to open it.
+
+  2. Double-click the MySQL installer package. It will be named
+     according to the version of MySQL you have downloaded. For
+     example, if you have downloaded MySQL 5.1.39, double-click
+     `mysql-5.1.39-osx10.5-x86.pkg'.
+
+  3. You will be presented with the opening installer dialog. Click
+     `Continue' to begin installation.
+
+     MySQL Package Installer: Step 1
+
+  4. A copy of the installation instructions and other important
+     information relevant to this installation are displayed. Click
+     `Continue' .
+
+  5. If you have downloaded the community version of MySQL, you will be
+     shown a copy of the relevant GNU General Public License. Click
+     `Continue' .
+
+  6. Select the drive you want to use to install the MySQL Startup
+     Item. The drive must have a valid, bootable, Mac OS X operating
+     system installed. Click `Continue'.
+
+     MySQL Package Installer: Step 4
+
+  7. You will be asked to confirm the details of the installation,
+     including the space required for the installation. To change the
+     drive on which the startup item is installed, click either `Go
+     Back' or `Change Install Location...'. To install the startup
+     item, click `Install'.
+
+  8. Once the installation has been completed successfully, you will be
+     shown an `Install Succeeded' message.
+
+For convenience, you may also want to install the startup item and
+preference pane. See *Note macosx-installation-startupitem::, and *Note
+macosx-installation-prefpane::.
+
+
+File: manual.info,  Node: macosx-installation-startupitem,  Next: macosx-installation-prefpane,  Prev: macosx-installation-pkg,  Up: macosx-installation
+
+3.4.3 Installing the MySQL Startup Item
+---------------------------------------
+
+The MySQL Installation Package includes a startup item that can be used
+to automatically start and stop MySQL.
+
+To install the MySQL Startup Item:
+
+  1. Download and open the MySQL package installer, which is provided
+     on a disk image (`.dmg') that includes the main MySQL installation
+     package, the `MySQLStartupItem.pkg' installation package, and the
+     `MySQL.prefPane'.  Double-click the disk image to open it.
+
+  2. Double-click the `MySQLStartItem.pkg' file to start the
+     installation process.
+
+  3. You will be presented with the `Install MySQL Startup Item' dialog.
+
+     MySQL Startup Item Installer: Step 1
+
+     Click `Continue' to continue the installation process.
+
+  4. A copy of the installation instructions and other important
+     information relevant to this installation are displayed. Click
+     `Continue' .
+
+  5. Select the drive you want to use to install the MySQL Startup
+     Item. The drive must have a valid, bootable, Mac OS X operating
+     system installed. Click `Continue'.
+
+     MySQL Startup Item Installer: Step 3
+
+  6. You will be asked to confirm the details of the installation.  To
+     change the drive on which the startup item is installed, click
+     either `Go Back' or `Change Install Location...'. To install the
+     startup item, click `Install'.
+
+  7. Once the installation has been completed successfully, you will be
+     shown an `Install Succeeded' message.
+
+     MySQL Startup Item Installer: Step 5
+
+The Startup Item for MySQL is installed into
+`/Library/StartupItems/MySQLCOM'. The Startup Item installation adds a
+variable `MYSQLCOM=-YES-' to the system configuration file
+`/etc/hostconfig'. If you want to disable the automatic startup of
+MySQL, change this variable to `MYSQLCOM=-NO-'.
+
+After the installation, you can start and stop MySQL by running the
+following commands in a terminal window. You must have administrator
+privileges to perform these tasks, and you may be prompted for your
+password.
+
+If you have installed the Startup Item, use this command to start the
+server:
+
+     shell> sudo /Library/StartupItems/MySQLCOM/MySQLCOM start
+
+If you have installed the Startup Item, use this command to stop the
+server:
+
+     shell> sudo /Library/StartupItems/MySQLCOM/MySQLCOM stop
+
+
+File: manual.info,  Node: macosx-installation-prefpane,  Next: macosx-installation-server,  Prev: macosx-installation-startupitem,  Up: macosx-installation
+
+3.4.4 Installing and Using the MySQL Preference Pane
+----------------------------------------------------
+
+The MySQL Package installer disk image also includes a custom MySQL
+Preference Pane that enables you to start, stop, and control automated
+startup during boot of your MySQL installation.
+
+To install the MySQL Preference Pane:
+
+  1. Download and open the MySQL package installer package, which is
+     provided on a disk image (`.dmg') that includes the main MySQL
+     installation package, the `MySQLStartupItem.pkg' installation
+     package, and the `MySQL.prefPane'.  Double-click the disk image to
+     open it.
+
+  2. Double-click the `MySQL.prefPane'. The MySQL System Preferences
+     will open.
+
+  3. If this is the first time you have installed the preference pane,
+     you will be asked to confirm installation and whether you want to
+     install the preference pane for all users, or only the current
+     user. To install the preference pane for all users you will need
+     administrator privileges. If necessary, you will be prompted for
+     the username and password for a user with administrator privileges.
+
+  4. If you already have the MySQL Preference Pane installed, you will
+     be asked to confirm whether you want to overwrite the existing
+     MySQL Preference Pane.
+
+*Note*:
+
+The MySQL Preference Pane only starts and stops MySQL installation
+installed from the MySQL package installation that have been installed
+in the default location.
+
+Once the MySQL Preference Pane has been installed, you can control your
+MySQL server instance using the preference pane. To use the preference
+pane, open the `System Preferences...' from the Apple menu. Select the
+MySQL preference pane by clicking the MySQL logo within the `Other'
+section of the preference panes list.
+
+MySQL Preference Pane
+
+The MySQL Preference Pane shows the current status of the MySQL server,
+showing `stopped' (in red) if the server is not running and `running'
+(in green) if the server has already been started. The preference pane
+also shows the current setting for whether the MySQL server has been
+set to start automatically.
+
+   * *To start MySQL using the preference pane: *
+
+     Click `Start MySQL Server'. You may be prompted for the username
+     and password of a user with administrator privileges to start the
+     MySQL server.
+
+   * *To stop MySQL using the preference pane: *
+
+     Click `Stop MySQL Server'. You may be prompted for the username
+     and password of a user with administrator privileges to stop the
+     MySQL server.
+
+   * *To automatically start the MySQL server when the system boots:*
+
+     Check the check box next to `Automatically Start MySQL Server on
+     Startup'.
+
+   * *To disable automatic MySQL server startup when the system boots:*
+
+     Uncheck the check box next to `Automatically Start MySQL Server on
+     Startup'.
+
+You can close the `System Preferences...' window once you have
+completed your settings.
+
+
+File: manual.info,  Node: macosx-installation-server,  Prev: macosx-installation-prefpane,  Up: macosx-installation
+
+3.4.5 Using the Bundled MySQL on Mac OS X Server
+------------------------------------------------
+
+If you are running Mac OS X Server, a version of MySQL should already
+be installed. The following table shows the versions of MySQL that ship
+with Mac OS X Server versions.
+
+*MySQL Versions Preinstalled with Mac OS X Server*
+
+Mac OS X Server        MySQL Version
+Version                
+10.2-10.2.2            3.23.51
+10.2.3-10.2.6          3.23.53
+10.3                   4.0.14
+10.3.2                 4.0.16
+10.4.0                 4.1.10a
+10.5.0                 5.0.45
+10.6.0                 5.0.82
+
+The following table shows the installation layout of MySQL on Mac OS X
+Server.
+
+*MySQL Directory Layout for Preinstalled MySQL installations on Mac OS X
+Server*
+
+Directory                 Contents of Directory
+`/usr/bin'                Client programs
+`/var/mysql'              Log files, databases
+`/usr/libexec'            The *Note `mysqld': mysqld. server
+`/usr/share/man'          Unix manual pages
+`/usr/share/mysql/mysql-test'MySQL test suite
+`/usr/share/mysql'        Miscellaneous support files, including error
+                          messages, character set files, sample
+                          configuration files, SQL for database
+                          installation
+`/var/mysql/mysql.sock'   Location of the MySQL Unix socket
+
+* Additional Resources *
+
+   * For more information on managing the bundled MySQL instance in Mac
+     OS X Server 10.5, see Mac OS X Server: Web Technologies
+     Administration For Version 10.5 Leopard
+     (http://images.apple.com/server/macosx/docs/Web_Technologies_Admin_v10.5.pdf).
+
+   * For more information on managing the bundled MySQL instance in Mac
+     OS X Server 10.6, see Mac OS X Server: Web Technologies
+     Administration Version 10.6 Snow Leopard
+     (http://manuals.info.apple.com/en_US/WebTech_v10.6.pdf).
+
+   * The MySQL server bundled with Mac OS X Server does not include the
+     MySQL client libraries and header files required to access and use
+     MySQL from a third-party driver, such as Perl DBI or PHP. For more
+     information on obtaining and installing MySQL libraries, see Mac
+     OS X Server version 10.5: MySQL libraries available for download
+     (http://support.apple.com/kb/TA25017). Alternatively, you can
+     ignore the bundled MySQL server and install MySQL from the package
+     or tarball installation.
+
+
+File: manual.info,  Node: linux-installation,  Next: solaris-installation,  Prev: macosx-installation,  Up: installing
+
+3.5 Installing MySQL on Linux
+=============================
+
+* Menu:
+
+* linux-installation-rpm::       Installing MySQL from RPM Packages on Linux
+* linux-installation-native::    Installing MySQL on Linux using Native Package Manager
+
+Linux supports a number of different solutions for installing MySQL.
+The recommended method is to use one of the distributions from Oracle.
+If you choose this method, there are three options available:
+
+   * Installing from a generic binary package in `.tar.gz' format. See
+     *Note binary-installation:: for more information.
+
+   * Extracting and compiling MySQL from a source distribution. For
+     detailed instructions, see *Note source-installation::.
+
+   * Installing using a pre-compiled RPM package. For more information
+     on using the RPM solution, see *Note linux-installation-rpm::.
+
+As an alternative, you can use the native package manager within your
+Linux distribution to automatically download and install MySQL for you.
+Native package installations can take of the download and dependencies
+required to run MySQL, but the MySQL version will often be some way
+behind the currently available release. You will also normally be
+unable to install developmental releases, as these are not usually made
+available in the native repository. For more information on using the
+native package installers, see *Note linux-installation-native::.
+
+*Note*:
+
+For many Linux installations, you will want to set up MySQL to be
+started automatically when your machine starts. Many of the native
+package installations perform this operation for you, but for source,
+binary and RPM solutions you may need to set this up separately. The
+required script, *Note `mysql.server': mysql-server, can be found in
+the `support-files' directory under the MySQL installation directory or
+in a MySQL source tree.  You can install it as `/etc/init.d/mysql' for
+automatic MySQL startup and shutdown. See *Note automatic-start::.
+
+
+File: manual.info,  Node: linux-installation-rpm,  Next: linux-installation-native,  Prev: linux-installation,  Up: linux-installation
+
+3.5.1 Installing MySQL from RPM Packages on Linux
+-------------------------------------------------
+
+The recommended way to install MySQL on RPM-based Linux distributions
+is by using the RPM packages. The RPMs that we provide to the community
+should work on all versions of Linux that support RPM packages and use
+`glibc' 2.3. To obtain RPM packages, see *Note getting-mysql::.
+
+For non-RPM Linux distributions, you can install MySQL using a
+`.tar.gz' package. See *Note binary-installation::.
+
+Installations created from our Linux RPM distributions result in files
+under the following system directories.
+
+*MySQL Installation Layout for Linux RPM*
+
+Directory                        Contents of Directory
+`/usr/bin'                       Client programs and scripts
+`/usr/sbin'                      The *Note `mysqld': mysqld. server
+`/var/lib/mysql'                 Log files, databases
+`/usr/share/info'                Manual in Info format
+`/usr/share/man'                 Unix manual pages
+`/usr/include/mysql'             Include (header) files
+`/usr/lib/mysql'                 Libraries
+`/usr/share/mysql'               Miscellaneous support files, including
+                                 error messages, character set files,
+                                 sample configuration files, SQL for
+                                 database installation
+`/usr/share/sql-bench'           Benchmarks
+
+*Note*:
+
+RPM distributions of MySQL are also provided by other vendors.  Be
+aware that they may differ from those built by us in features,
+capabilities, and conventions (including communication setup), and that
+the instructions in this manual do not necessarily apply to installing
+them. The vendor's instructions should be consulted instead.
+
+In most cases, you need to install only the `MySQL-server' and
+`MySQL-client' packages to get a functional MySQL installation. The
+other packages are not required for a standard installation.
+
+RPMs for MySQL Cluster
+
+Beginning with MySQL 5.1.24, standard MySQL server RPMs built by MySQL
+no longer provide support for the *Note `NDBCLUSTER': mysql-cluster.
+storage engine. MySQL Cluster users should check the MySQL Cluster
+Downloads page at http://dev.mysql.com/downloads/cluster/ for RPMs that
+should work with most Linux distributions for both of these release
+series.
+
+*Important*:
+
+When upgrading a MySQL Cluster RPM installation, you must upgrade _all_
+installed RPMs, including the `Server' and `Client' RPMs.
+
+For more information about installing MySQL Cluster from RPMs, see
+*Note mysql-cluster-install-linux-rpm::.
+
+For upgrades, if your installation was originally produced by
+installing multiple RPM packages, it is best to upgrade all the
+packages, not just some. For example, if you previously installed the
+server and client RPMs, do not upgrade just the server RPM.
+
+The RPM packages shown in the following list are available. The names
+shown here use a suffix of `.glibc23.i386.rpm', but particular packages
+can have different suffixes, described later.
+
+   * `MySQL-server-VERSION.glibc23.i386.rpm'
+
+     The MySQL server. You need this unless you only want to connect to
+     a MySQL server running on another machine.
+
+   * `MySQL-client-VERSION.glibc23.i386.rpm'
+
+     The standard MySQL client programs. You probably always want to
+     install this package.
+
+   * `MySQL-devel-VERSION.glibc23.i386.rpm'
+
+     The libraries and include files that are needed if you want to
+     compile other MySQL clients, such as the Perl modules.
+
+   * `MySQL-debuginfo-VERSION.glibc23.i386.rpm'
+
+     This package contains debugging information. It is specific to Red
+     Hat Enterprise Linux. `debuginfo' RPMs are never needed to use
+     MySQL software; this is true both for the server and for client
+     programs. However, they contain additional information that might
+     be needed by a debugger to analyze a crash.
+
+   * `MySQL-shared-VERSION.glibc23.i386.rpm'
+
+     This package contains the shared libraries (`libmysqlclient.so*')
+     that certain languages and applications need to dynamically load
+     and use MySQL. It contains single-threaded and thread-safe
+     libraries. If you install this package, do not install the
+     `MySQL-shared-compat' package.
+
+   * `MySQL-shared-compat-VERSION.glibc23.i386.rpm'
+
+     This package includes the shared libraries for older releases, up
+     to the current release. It contains single-threaded and
+     thread-safe libraries. Install this package instead of
+     `MySQL-shared' if you have applications installed that are
+     dynamically linked against older versions of MySQL but you want to
+     upgrade to the current version without breaking the library
+     dependencies.
+
+   * `MySQL-shared-compat-advanced-gpl-VERSION.glibc23.i386.rpm',
+     `MySQL-shared-compat-advanced-VERSION.glibc23.i386.rpm'
+
+     These are like the `MySQL-shared-compat' package, but are for the
+     `MySQL Enterprise Server - Advanced Edition' products. Install
+     these packages rather than the normal `MySQL-shared-compat'
+     package if you want to included shared client libraries for older
+     MySQL versions.
+
+   * `MySQL-embedded-VERSION.glibc23.i386.rpm'
+
+     The embedded MySQL server library.
+
+   * `MySQL-ndb-management-VERSION.glibc23.i386.rpm',
+     `MySQL-ndb-storage-VERSION.glibc23.i386.rpm',
+     `MySQL-ndb-tools-VERSION.glibc23.i386.rpm',
+     `MySQL-ndb-extra-VERSION.glibc23.i386.rpm'
+
+     Packages that contain additional files for MySQL Cluster
+     installations.
+
+     *Note*:
+
+     The `MySQL-ndb-tools' RPM requires a working installation of perl.
+     Prior to MySQL 5.1.18, the `DBI' and `HTML::Template' packages
+     were also required. See *Note perl-support::, and *Note
+     mysql-cluster-programs-ndb-size-pl::, for more information.
+
+   * `MySQL-test-VERSION.glibc23.i386.rpm'
+
+     This package includes the MySQL test suite.
+
+   * `MySQL-VERSION.src.rpm'
+
+     This contains the source code for all of the previous packages. It
+     can also be used to rebuild the RPMs on other architectures (for
+     example, Alpha or SPARC).
+
+The suffix of RPM package names (following the VERSION value) has the
+following syntax:
+
+     .PLATFORM.CPU.rpm
+
+The PLATFORM and CPU values indicate the type of system for which the
+package is built.  PLATFORM indicates the platform and CPU indicates
+the processor type or family.
+
+All packages are dynamically linked against `glibc' 2.3. The PLATFORM
+value indicates whether the package is platform independent or intended
+for a specific platform, as shown in the following table.
+
+*MySQL Linux Installation Packages*
+
+PLATFORM Value     Intended Use
+`glibc23'          Platform independent, should run on any Linux
+                   distribution that supports `glibc' 2.3
+`rhel4', `rhel5'   Red Hat Enterprise Linux 4 or 5
+`sles10', `sles11' SuSE Linux Enterprise Server 10 or 11
+
+In MySQL 5.1, only `glibc23' packages are available currently.
+
+The CPU value indicates the processor type or family for which the
+package is built.
+
+*MySQL Installation Packages for Linux CPU Identifier*
+
+CPU Value          Intended Processor Type or Family
+`i386', `i586',    Pentium processor or better, 32 bit
+`i686'             
+`x86_64'           64-bit x86 processor
+`ia64'             Itanium (IA-64) processor
+
+To see all files in an RPM package (for example, a `MySQL-server' RPM),
+run a command like this:
+
+     shell> rpm -qpl MySQL-server-VERSION.glibc23.i386.rpm
+
+To perform a standard minimal installation, install the server and
+client RPMs:
+
+     shell> rpm -i MySQL-server-VERSION.glibc23.i386.rpm
+     shell> rpm -i MySQL-client-VERSION.glibc23.i386.rpm
+
+To install only the client programs, install just the client RPM:
+
+     shell> rpm -i MySQL-client-VERSION.glibc23.i386.rpm
+
+RPM provides a feature to verify the integrity and authenticity of
+packages before installing them. If you would like to learn more about
+this feature, see *Note verifying-package-integrity::.
+
+The server RPM places data under the `/var/lib/mysql' directory. The
+RPM also creates a login account for a user named `mysql' (if one does
+not exist) to use for running the MySQL server, and creates the
+appropriate entries in `/etc/init.d/' to start the server automatically
+at boot time. (This means that if you have performed a previous
+installation and have made changes to its startup script, you may want
+to make a copy of the script so that you do not lose it when you
+install a newer RPM.) See *Note automatic-start::, for more information
+on how MySQL can be started automatically on system startup.
+
+In MySQL 5.1.49 and later, during an upgrade installation using the RPM
+packages, if the MySQL server is running when the upgrade occurs, the
+MySQL server is stopped, the upgrade occurs, and the MySQL server is
+restarted. If the MySQL server is not already running when the RPM
+upgrade occurs, the MySQL server is not started at the end of the
+installation.
+
+If something goes wrong, you can find more information in the binary
+installation section. See *Note binary-installation::.
+
+*Note*:
+
+The accounts that are listed in the MySQL grant tables initially have
+no passwords. After starting the server, you should set up passwords
+for them using the instructions in *Note postinstallation::.
+
+During RPM installation, a user named `mysql' and a group named `mysql'
+are created on the system.  This is done using the `useradd',
+`groupadd', and `usermod' commands. Those commands require appropriate
+administrative privileges, which is required for locally managed users
+and groups (as listed in the `/etc/passwd' and `/etc/group' files) by
+the RPM installation process being run by `root'.
+
+If you log in as the `mysql' user, you may find that MySQL displays
+`Invalid (old?) table or database name' errors that mention `.mysqlgui',
+`lost+found', `.mysqlgui', `.bash_history', `.fonts.cache-1',
+`.lesshst', `.mysql_history', `.profile', `.viminfo', and similar files
+created by MySQL or operating system utilities. You can safely ignore
+these error messages or remove the files or directories that cause them
+if you do not need them.
+
+For nonlocal user management (LDAP, NIS, and so forth), the
+administrative tools may require additional authentication (such as a
+password), and will fail if the installing user does not provide this
+authentication. Even if they fail, the RPM installation will not abort
+but succeed, and this is intentional.  If they failed, some of the
+intended transfer of ownership may be missing, and it is recommended
+that the system administrator then manually ensures some appropriate
+user and group exists and manually transfers ownership following the
+actions in the RPM spec file.
+
+
+File: manual.info,  Node: linux-installation-native,  Prev: linux-installation-rpm,  Up: linux-installation
+
+3.5.2 Installing MySQL on Linux using Native Package Manager
+------------------------------------------------------------
+
+Many Linux distributions include a version of the MySQL server, client
+tools, and development components into the standard package management
+system built into distributions such as Fedora, Debian, Ubuntu, and
+Gentoo. This section provides basic instructions for installing MySQL
+using these systems.
+
+*Important*:
+
+Native package installations can take care of the download and
+dependencies required to run MySQL, but the MySQL version will often be
+some way behind the currently available release. You will also normally
+be unable to install developmental releases, as these are not usually
+made available in the native repository.
+
+Distribution specific instructions are shown below:
+
+   * *Red Hat Linux, Fedora, CentOS*
+
+     For Red Hat and similar distributions, the MySQL distribution is
+     divided into a number of separate packages, `mysql' for the client
+     tools, `mysql-server' for the server and associated tools, and
+     `mysql-libs' for the libraries.  The libraries are required if you
+     want to provide connectivity from different languages and
+     environments such as Perl, Python and others.
+
+     To install, use the `yum' command to specify the packages that you
+     want to install. For example:
+
+          root-shell> yum install mysql mysql-server mysql-libs mysql-server
+          Loaded plugins: presto, refresh-packagekit
+          Setting up Install Process
+          Resolving Dependencies
+          --> Running transaction check
+          ---> Package mysql.x86_64 0:5.1.48-2.fc13 set to be updated
+          ---> Package mysql-libs.x86_64 0:5.1.48-2.fc13 set to be updated
+          ---> Package mysql-server.x86_64 0:5.1.48-2.fc13 set to be updated
+          --> Processing Dependency: perl-DBD-MySQL for package: mysql-server-5.1.48-2.fc13.x86_64
+          --> Running transaction check
+          ---> Package perl-DBD-MySQL.x86_64 0:4.017-1.fc13 set to be updated
+          --> Finished Dependency Resolution
+
+          Dependencies Resolved
+
+          ================================================================================
+           Package               Arch          Version               Repository      Size
+          ================================================================================
+          Installing:
+           mysql                 x86_64        5.1.48-2.fc13         updates        889 k
+           mysql-libs            x86_64        5.1.48-2.fc13         updates        1.2 M
+           mysql-server          x86_64        5.1.48-2.fc13         updates        8.1 M
+          Installing for dependencies:
+           perl-DBD-MySQL        x86_64        4.017-1.fc13          updates        136 k
+
+          Transaction Summary
+          ================================================================================
+          Install       4 Package(s)
+          Upgrade       0 Package(s)
+
+          Total download size: 10 M
+          Installed size: 30 M
+          Is this ok [y/N]: y
+          Downloading Packages:
+          Setting up and reading Presto delta metadata
+          Processing delta metadata
+          Package(s) data still to download: 10 M
+          (1/4): mysql-5.1.48-2.fc13.x86_64.rpm                    | 889 kB     00:04
+          (2/4): mysql-libs-5.1.48-2.fc13.x86_64.rpm               | 1.2 MB     00:06
+          (3/4): mysql-server-5.1.48-2.fc13.x86_64.rpm             | 8.1 MB     00:40
+          (4/4): perl-DBD-MySQL-4.017-1.fc13.x86_64.rpm            | 136 kB     00:00
+          --------------------------------------------------------------------------------
+          Total                                           201 kB/s |  10 MB     00:52
+          Running rpm_check_debug
+          Running Transaction Test
+          Transaction Test Succeeded
+          Running Transaction
+            Installing     : mysql-libs-5.1.48-2.fc13.x86_64                          1/4
+            Installing     : mysql-5.1.48-2.fc13.x86_64                               2/4
+            Installing     : perl-DBD-MySQL-4.017-1.fc13.x86_64                       3/4
+            Installing     : mysql-server-5.1.48-2.fc13.x86_64                        4/4
+
+          Installed:
+            mysql.x86_64 0:5.1.48-2.fc13            mysql-libs.x86_64 0:5.1.48-2.fc13
+            mysql-server.x86_64 0:5.1.48-2.fc13
+
+          Dependency Installed:
+            perl-DBD-MySQL.x86_64 0:4.017-1.fc13
+
+          Complete!
+
+     MySQL and the MySQL server should now be installed. A sample
+     configuration file is installed into `/etc/my.cnf'. An init
+     script, to start and stop the server, will have been installed into
+     `/etc/init.d/mysqld'. To start the MySQL server use `service':
+
+          root-shell> service mysqld start
+
+     To enable the server to be started and stopped automatically
+     during boot, use `chkconfig':
+
+          root-shell> chkconfig --levels 235 mysqld on
+
+     Which enables the MySQL server to be started (and stopped)
+     automatically at the specified the run levels.
+
+     The database tables will have been automatically created for you,
+     if they do not already exist. You should, however, run *Note
+     `mysql_secure_installation': mysql-secure-installation. to set the
+     root passwords on your server.
+
+   * *Debian, Ubuntu, Kubuntu*
+
+     On Debian and related distributions, there are two packages,
+     `mysql-client' and `mysql-server', for the client and server
+     components respectively. You should specify an explicit version,
+     for example `mysql-client-5.1', to ensure that you install the
+     version of MySQL that you want.
+
+     To download and install, including any dependencies, use the
+     `apt-get' command, specifying the packages that you want to
+     install.
+
+     *Note*:
+
+     Before installing, make sure that you update your `apt-get' index
+     files to ensure you are downloading the latest available version.
+
+     A sample installation of the MySQL packages might look like this
+     (some sections trimmed for clarity):
+
+          root-shell> apt-get install mysql-client-5.1 mysql-server-5.1
+          Reading package lists... Done
+          Building dependency tree
+          Reading state information... Done
+          The following packages were automatically installed and are no longer required:
+            linux-headers-2.6.28-11 linux-headers-2.6.28-11-generic
+          Use 'apt-get autoremove' to remove them.
+          The following extra packages will be installed:
+            bsd-mailx libdbd-mysql-perl libdbi-perl libhtml-template-perl
+            libmysqlclient15off libmysqlclient16 libnet-daemon-perl libplrpc-perl mailx
+            mysql-common postfix
+          Suggested packages:
+            dbishell libipc-sharedcache-perl tinyca procmail postfix-mysql postfix-pgsql
+            postfix-ldap postfix-pcre sasl2-bin resolvconf postfix-cdb
+          The following NEW packages will be installed
+            bsd-mailx libdbd-mysql-perl libdbi-perl libhtml-template-perl
+            libmysqlclient15off libmysqlclient16 libnet-daemon-perl libplrpc-perl mailx
+            mysql-client-5.1 mysql-common mysql-server-5.1 postfix
+          0 upgraded, 13 newly installed, 0 to remove and 182 not upgraded.
+          Need to get 1907kB/25.3MB of archives.
+          After this operation, 59.5MB of additional disk space will be used.
+          Do you want to continue [Y/n]? Y
+          Get: 1 http://gb.archive.ubuntu.com jaunty-updates/main mysql-common 5.1.30really5.0.75-0ubuntu10.5 [63.6kB]
+          Get: 2 http://gb.archive.ubuntu.com jaunty-updates/main libmysqlclient15off 5.1.30really5.0.75-0ubuntu10.5 [1843kB]
+          Fetched 1907kB in 9s (205kB/s)
+          Preconfiguring packages ...
+          Selecting previously deselected package mysql-common.
+          (Reading database ... 121260 files and directories currently installed.)
+          ...
+          Processing 1 added doc-base file(s)...
+          Registering documents with scrollkeeper...
+          Setting up libnet-daemon-perl (0.43-1) ...
+          Setting up libplrpc-perl (0.2020-1) ...
+          Setting up libdbi-perl (1.607-1) ...
+          Setting up libmysqlclient15off (5.1.30really5.0.75-0ubuntu10.5) ...
+
+          Setting up libdbd-mysql-perl (4.008-1) ...
+          Setting up libmysqlclient16 (5.1.31-1ubuntu2) ...
+
+          Setting up mysql-client-5.1 (5.1.31-1ubuntu2) ...
+
+          Setting up mysql-server-5.1 (5.1.31-1ubuntu2) ...
+           * Stopping MySQL database server mysqld
+             ...done.
+          100825 11:46:15  InnoDB: Started; log sequence number 0 46409
+          100825 11:46:15  InnoDB: Starting shutdown...
+          100825 11:46:17  InnoDB: Shutdown completed; log sequence number 0 46409
+          100825 11:46:17 [Warning] Forcing shutdown of 1 plugins
+           * Starting MySQL database server mysqld
+             ...done.
+           * Checking for corrupt, not cleanly closed and upgrade needing tables.
+          ...
+          Processing triggers for libc6 ...
+          ldconfig deferred processing now taking place
+
+     *Note*:
+
+     The `apt-get' command will install a number of packages, including
+     the MySQL server, in order to provide the typical tools and
+     application environment. This can mean that you install a large
+     number of packages in addition to the main MySQL package.
+
+     During installation, the initial database will be created, and you
+     will be prompted for the MySQL root password (and confirmation). A
+     configuration file will have been created in `/etc/mysql/my.cnf'.
+     An init script will have been created in `/etc/init.d/mysql'.
+
+     The server will already be started. You can manually start and
+     stop the server using:
+
+          root-shell> service mysql [start|stop]
+
+     The service will automatically be added to the 2, 3 and 4 run
+     levels, with stop scripts in the single, shutdown and restart
+     levels.
+
+   * *Gentoo Linux*
+
+     As a source-based distribution, installing MySQL on Gentoo
+     involves downloading the source, patching the Gentoo specifics,
+     and then compiling the MySQL server and installing it. This
+     process is handled automatically by the `emerge' command.
+     Depending on the version of MySQL that you want to install, you
+     may need to unmask the specific version that you want for your
+     chosen platform.
+
+     The MySQL server and client tools are provided within a single
+     package, `dev-db/mysql'. You can obtain a list of the versions
+     available to install by looking at the portage directory for the
+     package:
+
+          root-shell> ls /usr/portage/dev-db/mysql/mysql-5.1*
+          mysql-5.1.39-r1.ebuild
+          mysql-5.1.44-r1.ebuild
+          mysql-5.1.44-r2.ebuild
+          mysql-5.1.44-r3.ebuild
+          mysql-5.1.44.ebuild
+          mysql-5.1.45-r1.ebuild
+          mysql-5.1.45.ebuild
+          mysql-5.1.46.ebuild
+
+     To install a specific MySQL version, you must specify the entire
+     atom. For example:
+
+          root-shell> emerge =dev-db/mysql-5.1.46
+
+     A simpler alternative is to use the `virtual/mysql-5.1' package,
+     which will install the latest version:
+
+          root-shell> emerge =virtual/mysql-5.1
+
+     If the package is masked (because it is not tested or certified
+     for the current platform), use the `ACCEPT_KEYWORDS' environment
+     variable. For example:
+
+          root-shell> ACCEPT_KEYWORDS="~x86" emerge =virtual/mysql-5.1
+
+     After installation, you should create a new database using *Note
+     `mysql_install_db': mysql-install-db, and set the password for the
+     root user on MySQL. You can use the configuration interface to set
+     the password and create the initial database:
+
+          root-shell> emerge --config =dev-db/mysql-5.1.46
+
+     A sample configuration file will have been created for you in
+     `/etc/mysql/my.cnf', and an init script will have been created in
+     `/etc/init.d/mysql'.
+
+     To enable MySQL to start automatically at the normal (default) run
+     levels, you can use:
+
+          root-shell> rc-update add default mysql
+
+
+File: manual.info,  Node: solaris-installation,  Next: aix-installation,  Prev: linux-installation,  Up: installing
+
+3.6 Installing MySQL on Solaris and OpenSolaris
+===============================================
+
+* Menu:
+
+* solaris-installation-pkg::     Installing MySQL on Solaris using a Solaris `PKG'
+* solaris-installation-opensolaris::  Installing MySQL on OpenSolaris using IPS
+
+MySQL on Solaris and OpenSolaris is available in a number of different
+formats.
+
+   * For information on installing using the native Solaris `PKG'
+     format, see *Note solaris-installation-pkg::.
+
+   * On OpenSolaris, the standard package repositories include MySQL
+     packages specially built for OpenSolaris that include entries for
+     the Service Management Framework (SMF) to enable control of the
+     installation using the SMF administration commands. For more
+     information, see *Note solaris-installation-opensolaris::.
+
+   * To use a standard `tar' binary installation, use the notes
+     provided in *Note binary-installation::.  Check the notes and
+     hints at the end of this section for Solaris specific notes that
+     you may need before or after installation.
+
+   * For information on installing MySQL on Solaris or OpenSolaris
+     using a source distribution, first check the Solaris advice, *Note
+     solaris-installation-source::. For detailed instructions on
+     installing from source, see *Note source-installation::.
+
+To obtain a binary MySQL distribution for Solaris in tarball or PKG
+format, `http://dev.mysql.com/downloads/mysql/5.1.html'.
+
+Additional notes to be aware of when installing and using MySQL on
+Solaris:
+
+   * If you want to use MySQL with the `mysql' user and group, use the
+     `groupadd' and `useradd' commands:
+
+          groupadd mysql
+          useradd -g mysql mysql
+
+   * If you install MySQL using a binary tarball distribution on
+     Solaris, you may run into trouble even before you get the MySQL
+     distribution unpacked, as the Solaris `tar' cannot handle long
+     file names. This means that you may see errors when you try to
+     unpack MySQL.
+
+     If this occurs, you must use GNU `tar' (`gtar') to unpack the
+     distribution. In Solaris 10 and OpenSolaris `gtar' is normally
+     located in `/usr/sfw/bin/gtar', but may not be included in the
+     default path definition.
+
+   * When using Solaris 10 for x86_64, you should mount any file
+     systems on which you intend to store `InnoDB' files with the
+     `forcedirectio' option. (By default mounting is done without this
+     option.) Failing to do so will cause a significant drop in
+     performance when using the `InnoDB' storage engine on this
+     platform.
+
+   * If you would like MySQL to start automatically, you can copy
+     `support-files/mysql.server' to `/etc/init.d' and create a
+     symbolic link to it named `/etc/rc3.d/S99mysql.server'.
+
+   * If too many processes try to connect very rapidly to *Note
+     `mysqld': mysqld, you should see this error in the MySQL log:
+
+          Error in accept: Protocol error
+
+     You might try starting the server with the `--back_log=50' option
+     as a workaround for this.
+
+   * To configure the generation of core files on Solaris you should
+     use the `coreadm' command. Because of the security implications of
+     generating a core on a `setuid()' application, by default, Solaris
+     does not support core files on `setuid()' programs. However, you
+     can modify this behavior using `coreadm'. If you enable `setuid()'
+     core files for the current user, they will be generated using the
+     mode 600 and owned by the superuser.
+
+
+File: manual.info,  Node: solaris-installation-pkg,  Next: solaris-installation-opensolaris,  Prev: solaris-installation,  Up: solaris-installation
+
+3.6.1 Installing MySQL on Solaris using a Solaris `PKG'
+-------------------------------------------------------
+
+You can install MySQL on Solaris and OpenSolaris using a binary package
+using the native Solaris PKG format instead of the binary tarball
+distribution.
+
+To use this package, download the corresponding
+`mysql-VERSION-solaris10-PLATFORM.pkg.gz' file, then decompress it. For
+example:
+
+     shell> gunzip mysql-5.1.62-solaris10-x86_64.pkg.gz
+
+To install a new package, use `pkgadd' and follow the onscreen prompts.
+You must have root privileges to perform this operation:
+
+     shell> pkgadd -d mysql-5.1.62-solaris10-x86_64.pkg
+
+     The following packages are available:
+       1  mysql     MySQL Community Server (GPL)
+                    (i86pc) 5.1.62
+
+     Select package(s) you wish to process (or 'all' to process
+     all packages). (default: all) [?,??,q]:
+
+The `PKG' installer installs all of the files and tools needed, and
+then initializes your database if one does not exist. To complete the
+installation, you should set the root password for MySQL as provided in
+the instructions at the end of the installation. Alternatively, you can
+run the *Note `mysql_secure_installation': mysql-secure-installation.
+script that comes with the installation.
+
+The default installation directory is `/opt/mysql'. You can only change
+the root path of the installation when using `pkgadd', which can be
+used to install MySQL in a different Solaris zone. If you need to
+install in a specific directory, use the binary `tar' file.
+
+The `pkg' installer copies a suitable startup script for MySQL into
+`/etc/init.d/mysql'. To enable MySQL to startup and shutdown
+automatically, you should create a link between this file and the init
+script directories.  For example, to ensure safe startup and shutdown
+of MySQL you could use the following commands to add the right links:
+
+     shell> ln /etc/init.d/mysql /etc/rc3.d/S91mysql
+     shell> ln /etc/init.d/mysql /etc/rc0.d/K02mysql
+
+To remove MySQL, the installed package name is `mysql'. You can use
+this in combination with the `pkgrm' command to remove the installation.
+
+To upgrade when using the Solaris package file format, you must remove
+the existing installation before installing the updated package.
+Removal of the package does not delete the existing database
+information, only the server, binaries and support files.  The typical
+upgrade sequence is therefore:
+
+     shell> mysqladmin shutdown
+     shell> pkgrm mysql
+     shell> pkgadd -d mysql-5.1.62-solaris10-x86_64.pkg
+     shell> mysql_upgrade
+     shell> mysqld_safe &
+
+You should check the notes in *Note upgrading-downgrading:: before
+performing any upgrade.
+
+
+File: manual.info,  Node: solaris-installation-opensolaris,  Prev: solaris-installation-pkg,  Up: solaris-installation
+
+3.6.2 Installing MySQL on OpenSolaris using IPS
+-----------------------------------------------
+
+OpenSolaris includes standard packages for MySQL in the core
+repository. The MySQL packages are based on a specific release of MySQL
+and updated periodically. For the latest release you must use either
+the native Solaris `PKG', `tar', or source installations. The native
+OpenSolaris packages include SMF files so that you can easily control
+your MySQL installation, including automatic startup and recovery,
+using the native service management tools.
+
+To install MySQL on OpenSolaris, use the `pkg' command. You will need
+to be logged in as root, or use the `pfexec' tool, as shown in the
+example below:
+
+     shell> pfexec pkg install SUNWmysql51
+
+The package set installs three individual packages, `SUNWmysql51lib',
+which contains the MySQL client libraries; `SUNWmysql51r' which contains
+the root components, including SMF and configuration files; and
+`SUNWmysql51u' which contains the scripts, binary tools and other
+files. You can install these packages individually if you only need the
+corresponding components.
+
+The MySQL files are installed into `/usr/mysql' which symbolic links
+for the sub directories (`bin', `lib', etc.) to a version specific
+directory. For MySQL 5.1, the full installation is located in
+`/usr/mysql/5.1'. The default data directory is `/var/mysql/5.1/data'.
+The configuration file is installed in `/etc/mysql/5.1/my.cnf'. This
+layout permits multiple versions of MySQL to be installed, without
+overwriting the data and binaries from other versions.
+
+Once installed, you must run *Note `mysql_install_db': mysql-install-db.
+to initialize the database, and use the *Note
+`mysql_secure_installation': mysql-secure-installation. to secure your
+installation.
+
+* Using SMF to manage your MySQL installation *
+
+Once installed, you can start and stop your MySQL server using the
+installed SMF configuration. The service name is `mysql', or if you
+have multiple versions installed, you should use the full version name,
+for example `mysql:version_51'. To start and enable MySQL to be started
+at boot time:
+
+     shell> svcadm enable mysql
+
+To disable MySQL from starting during boot time, and shut the MySQL
+server down if it is running, use:
+
+     shell> svcadm disable mysql
+
+To restart MySQL, for example after a configuration file changes, use
+the `restart' option:
+
+     shell> svcadm restart mysql
+
+You can also use SMF to configure the data directory and enable full
+64-bit mode. For example, to set the data directory used by MySQL:
+
+     shell> svccfg
+     svc:> select mysql:version_51
+     svc:/application/database/mysql:version_51> setprop mysql/data=/data0/mysql
+
+By default, the 32-bit binaries are used. To enable the 64-bit server
+on 64-bit platforms, set the `enable_64bit' parameter. For example:
+
+     svc:/application/database/mysql:version_51> setprop mysql/enable_64bit=1
+
+You need to refresh the SMF after settings these options:
+
+     shell> svcadm refresh mysql
+
+
+File: manual.info,  Node: aix-installation,  Next: hpux-installation,  Prev: solaris-installation,  Up: installing
+
+3.7 Installing MySQL on IBM AIX
+===============================
+
+* Menu:
+
+* aix-installation-general::     General Notes on Installing MySQL on AIX
+
+MySQL for IBM AIX is available in a number of different forms:
+
+   * Using a binary tarball distribution provided at
+     `http://dev.mysql.com/downloads/'. Please read the *Note general
+     notes on AIX installation: aix-installation-general. before
+     continuing. For more information on binary installations, see
+     *Note binary-installation::.
+
+   * Using a source tarball and compiling MySQL. Please read the *Note
+     general notes on AIX installation: aix-installation-general.
+     before continuing. You should also check the instructions on *Note
+     building on AIX from source: aix-installation-source. For general
+     information on building from source, see *Note
+     source-installation::.
+
+
+File: manual.info,  Node: aix-installation-general,  Prev: aix-installation,  Up: aix-installation
+
+3.7.1 General Notes on Installing MySQL on AIX
+----------------------------------------------
+
+General notes on using MySQL on IBM AIX:
+
+   * If you have problems with threads on AIX 5.3, you should upgrade
+     AIX 5.3 to technology level 7 (5300-07).
+
+
+File: manual.info,  Node: hpux-installation,  Next: freebsd-installation,  Prev: aix-installation,  Up: installing
+
+3.8 Installing MySQL on HP-UX
+=============================
+
+* Menu:
+
+* hpux-installation-general::    General Notes on Installing MySQL on HP-UX
+* hpux-installation-depot::      Installing MySQL on HP-UX using DEPOT
+
+MySQL for HP-UX is available in a number of different forms:
+
+   * Using a DEPOT distribution provided at
+     `http://dev.mysql.com/downloads/'. Please read the *Note general
+     notes on HP-UX installation: hpux-installation-general. before
+     continuing. For more information on DEPOT installations, see *Note
+     hpux-installation-depot::.
+
+   * Using a binary tarball distribution provided at
+     `http://dev.mysql.com/downloads/'. Please read the *Note general
+     notes on HP-UX installation: hpux-installation-general. before
+     continuing. For more information on binary installations, see
+     *Note binary-installation::.
+
+   * Using a source tarball and compiling MySQL. Please read the *Note
+     general notes on HP-UX installation: hpux-installation-general.
+     before continuing. You should also check the instructions on *Note
+     building on HP-UX from source: hpux-installation-source. For
+     general information on building from source, see *Note
+     source-installation::.
+
+
+File: manual.info,  Node: hpux-installation-general,  Next: hpux-installation-depot,  Prev: hpux-installation,  Up: hpux-installation
+
+3.8.1 General Notes on Installing MySQL on HP-UX
+------------------------------------------------
+
+Some additional notes on installing and using MySQL on HP-UX:
+
+   * If you install MySQL using a binary tarball distribution on HP-UX,
+     you may run into trouble even before you get the MySQL
+     distribution unpacked, as the HP-UX `tar' cannot handle long file
+     names. This means that you may see errors when you try to unpack
+     MySQL.
+
+     If this occurs, you must use GNU `tar' (`gtar') to unpack the
+     distribution.
+
+   * Because of some critical bugs in the standard HP-UX libraries, you
+     should install the following patches before trying to run MySQL on
+     HP-UX 11.0:
+
+          PHKL_22840 Streams cumulative
+          PHNE_22397 ARPA cumulative
+
+     This solves the problem of getting `EWOULDBLOCK' from `recv()' and
+     `EBADF' from `accept()' in threaded applications.
+
+
+File: manual.info,  Node: hpux-installation-depot,  Prev: hpux-installation-general,  Up: hpux-installation
+
+3.8.2 Installing MySQL on HP-UX using DEPOT
+-------------------------------------------
+
+The HP-UX DEPOT format packages can be installed using the `swinstall'
+command. You should install the `ncurses' and `zlib' libraries before
+installing the MySQL DEPOT package. You can use the free software
+`depothelper' tool to install these packages and any dependencies for
+you automatically.
+
+To install using the MySQL DEPOT packages, follow this guide:
+
+  1. Download the MySQL DEPOT package from
+     `http://dev.mysql.com/downloads/'. You must decompress the package
+     before installation:
+
+          root-shell> gunzip mysql-5.1.48-hpux11.31-ia64-64bit.depot.gz
+
+  2. Install the DEPOT package using `swinstall':
+
+          root-shell> swinstall -s MYSQL-5.1.49-HPUX11.31-IA64-64BIT.DEPOT
+
+     MySQL will be installed into a directory matching the depot
+     package name, within `/usr/local'. For convenience, you may want
+     to create a symbolic link to the installed directory, for example:
+
+          root-shell> ln -s mysql-5.1.49-hpux11.31-ia64-64bit mysql
+
+  3. Your package is now installed. You should complete the
+     configuration of MySQL by creating a user and group:
+
+          root-shell> /usr/sbin/groupadd mysql
+          root-shell> /usr/sbin/useradd -g mysql -d /var/lib/mysql/ -s /bin/false mysql
+
+  4. Create the standard database using the new user/group you have
+     created, and set the permissions:
+
+          root-shell> cd /usr/local/
+          root-shell> scripts/mysql_install_db --user=mysql
+          root-shell> chown -R root .
+          root-shell> chown -R mysql data
+
+  5. Finally, secure your new installation by setting the root
+     passwords, and then start your MySQL server using the `mysql' user:
+
+          root-shell> mysql_secure_installation
+          root-shell> mysqld_safe --user=mysql &
+
+
+File: manual.info,  Node: freebsd-installation,  Next: i5os-installation,  Prev: hpux-installation,  Up: installing
+
+3.9 Installing MySQL on FreeBSD
+===============================
+
+This section provides information about installing MySQL on variants of
+FreeBSD Unix.
+
+You can install MySQL on FreeBSD by using the binary distribution
+provided by Oracle. For more information, see *Note
+binary-installation::.
+
+The easiest (and preferred) way to install MySQL is to use the *Note
+`mysql-server': mysql-server. and `mysql-client' ports available at
+`http://www.freebsd.org/'. Using these ports gives you the following
+benefits:
+
+   * A working MySQL with all optimizations enabled that are known to
+     work on your version of FreeBSD.
+
+   * Automatic configuration and build.
+
+   * Startup scripts installed in `/usr/local/etc/rc.d'.
+
+   * The ability to use `pkg_info -L' to see which files are installed.
+
+   * The ability to use `pkg_delete' to remove MySQL if you no longer
+     want it on your machine.
+
+The MySQL build process requires GNU make (`gmake') to work. If GNU
+`make' is not available, you must install it first before compiling
+MySQL.
+
+To install using the ports system:
+
+     # cd /usr/ports/databases/mysql51-server
+     # make
+     ...
+     # cd /usr/ports/databases/mysql51-client
+     # make
+     ...
+
+The standard port installation places the server into
+`/usr/local/libexec/mysqld', with the startup script for the MySQL
+server placed in `/usr/local/etc/rc.d/mysql-server'.
+
+Some additional notes on the BSD implementation:
+
+   * To remove MySQL after installation using the ports system:
+
+          # cd /usr/ports/databases/mysql51-server
+          # make deinstall
+          ...
+          # cd /usr/ports/databases/mysql51-client
+          # make deinstall
+          ...
+
+   * If you get problems with the current date in MySQL, setting the
+     `TZ' variable should help. See *Note environment-variables::.
+
+
+File: manual.info,  Node: i5os-installation,  Next: source-installation,  Prev: freebsd-installation,  Up: installing
+
+3.10 Installing MySQL on i5/OS
+==============================
+
+The i5/OS POWER MySQL package was created in cooperation with IBM.
+MySQL works within the Portable Application Solution Environment (PASE)
+on the System i series of hardware and will also provide database
+services for the Zend Core for i5/OS.
+
+MySQL for i5/OS is provided both as a `tar' file and as a save file
+(`.savf') package that can be downloaded and installed directly without
+any additional installation steps required. To install MySQL using the
+`tar' file, see *Note binary-installation::.
+
+MySQL is only supported on i5/OS V5R4 or later releases. The i5/OS PASE
+must be installed for MySQL to operate. You must be able to login as a
+user in `*SECOFR' class.
+
+You should the installation notes and tips for i5/OS before starting
+installation. See i5/OS Installation Notes.
+
+*Before Installation:*
+
+*Note*:
+
+The installation package will use an existing configuration if you have
+previously installed MySQL (which is identified by looking for the file
+`/etc/my.cnf'). The values for the data directory (`DATADIR') and owner
+of the MySQL files (`USRPRF') specified during the installation will be
+ignored, and the values determined from the `/etc/my.cnf' will be used
+instead.
+
+If you want to change these parameters during a new install, you should
+temporarily rename `/etc/my.cnf', install MySQL using the new
+parameters you want to use, and then merge your previous `/etc/my.cnf'
+configuration settings with the new `/etc/my.cnf' file that is created
+during installation.
+
+   * You must have a user profile with PASE with suitable privileges.
+     The user should be within the `*SECOFR' class, such as the
+     `QSECOFR' user ID. You can use the `WRKUSRPRF' command to check
+     your user profile.
+
+   * For network connections to MySQL, you must have TCP/IP enabled.
+     You should also check the following:
+
+        * Ensure that a name has defined for the system. Run the
+          Configure TCP/IP (`CFGTCP') command and select option 12
+          (Change TCP/IP domain information) to display this setting.
+          Make sure that a value is listed in the Host name field.
+
+        * Make sure that the system has a loopback entry which
+          represents the `localhost' or `127.0.0.1'.
+
+        * Ensure that the IP address of the IBM i machine is mapped
+          correctly to the host name.
+
+To install MySQL on i5/OS, follow these steps:
+
+  1. On the System i machine, create a save file that will be used to
+     receive the downloaded installation save file. The file should be
+     located within the General Purpose Library (`QGPL'):
+
+          CRTSAVF FILE(QGPL/MYSQLINST) TESXT('MySQL Save file')
+
+  2. Download the MySQL installation save file in 32-bit
+     (`mysql-5.1.62-i5os-power-32bit.savf') or 64-bit
+     (`mysql-5.1.62-i5os-power-64bit.savf') from MySQL Downloads
+     (http://dev.mysql.com/downloads).
+
+  3. You need to FTP the downloaded `.savf' file directly into the
+     `QGPL/MYSQLINST' file on the System i server. You can do this
+     through FTP using the following steps after logging in to the
+     System i machine:
+
+          ftp> bin
+          ftp> cd qgpl
+          ftp> put mysql-5.1.62-i5os-power.savf mysqlinst
+
+  4. Log into the System i server using a user in the `*SECOFR' class,
+     such as the `QSECOFR' user ID.
+
+  5. You need to restore the installation library stored in the `.savf'
+     save file:
+
+          RSTLIB MYSQLINST DEV(*SAVF) SAVF(QGPL/MYSQLINST) MBROPT(*ALL) ALWOBJDIF(*ALL)
+
+     *Note*:
+
+     You can ignore the security changes-type message at the bottom of
+     the installation panel.
+
+  6. Once you have finished restoring the `MYSQLINST' library, check
+     that all the necessary objects for installation are on the system
+     by using the Display Library (`DSPLIB') command:
+
+          DSPLIB LIB(MYSQLINST)
+
+  7. You need to execute the installation command,
+     `MYSQLINST/INSMYSQL'. You can specify three parameter settings
+     during installation:
+
+        * `DIR('/QOPENSYS/USR/LOCAL/MYSQL')' sets the installation
+          location for the MySQL files. The directory will be created
+          if it does not already exist.
+
+        * `DATADIR('/QOPENSYS/USR/LOCAL/MYSQL/DATA')' sets the location
+          of the directory that will be used to store the database
+          files and binary logs. The default setting is
+          `/QOpenSys/usr/local/mysql/data'. Note that if the installer
+          detects an existing installation (due to the existence of
+          `/etc/my.cnf'), then the existing setting will be used
+          instead of the default.
+
+        * `USRPRF(MYSQL)' sets the user profile that will own the files
+          that are installed. The profile will be created if it does not
+          already exist.
+
+          *Note*:
+
+          You should choose an appropriate user for using the MySQL
+          server installation. The user will be used whenever you need
+          to do any administration on the MySQL server.
+
+     Once you have set the appropriate parameters, you can begin the
+     installation.
+
+     The installation copies all the necessary files into a directory
+     matching the `DIR' configuration value; sets the ownership on
+     those files, sets up the MySQL environment and creates the MySQL
+     configuration file (in `/etc/my.cnf') completing all the steps in a
+     typical binary installation process automatically. If this is a
+     new installation of MySQL, or if the installer detects that this
+     is a new version (because the `/etc/my.cnf' file does not exist),
+     then the initial core MySQL databases will also be created during
+     installation.
+
+     Once the installation has been completed, you will get a notice
+     advising you to set the password for the root user. For more
+     information, *Note postinstallation::.
+
+  8. Once the installation has completed, you can delete the
+     installation file:
+
+          DLTLIB LIB(MYSQLINST)
+
+*Upgrading an existing MySQL instance*
+
+You need to execute the upgrade command, `MYSQLINST/UPGMYSQL'.
+
+*Note*:
+
+You cannot use `MYSQLINST/UPGMYSQL' to upgrade between major versions
+of MySQL (for example from 5.0 to 5.1). For information and advice on
+migrating between major versions you can use the advice provided in
+*Note upgrading-from-previous-series::.
+
+You must specify 6 parameters to perform an upgrade:
+
+   * `DIR('/QOpenSys/usr/local/')': Sets the installation location for
+     the MySQL files. The directory will be created if it does not
+     already exist. This is the directory that the MySQL server will be
+     installed into, inside a directory with a name matching the
+     version and release. For example, if installing MySQL 5.1.62 with
+     the `DIR' set to `/QOpenSys/usr/local/' would result in
+     `/QOpenSys/usr/local/mysql-5.1.62-i5os-power64' and a symbolic
+     link to this directory will be created in
+     `/QOpenSys/usr/local/mysql'.
+
+   * `DATADIR('/QOpenSys/mysql/data')': Sets the location of the
+     directory that will be upgraded.
+
+   * `USRPRF('MYSQL')': Sets the user profile that will own the files
+     that are installed. The profile will be created if it does not
+     already exist; if it is created as part of the upgrade process, it
+     will be disabled initially. You may wish to enable this user
+     profile so that it can be used to start the MySQL server later. It
+     is best practice to use the one previously created during the
+     first installation.
+
+   * `MYSQLUSR('root user')': Any user account in the current MySQL
+     server with `SUPER' privileges.
+
+   * `PASSWORD('root user password')': The password for the above
+     account. This is necessary as the upgrade starts the MySQL server
+     to upgrade the tables and the password is need to be able to
+     shutdown the MySQL server.
+
+   * `CURINST('path to previous install')': The full path to the
+     installation that is being upgraded. For example an installation
+     in `/QOpenSys/usr/local/' will be
+     `/QOpenSys/usr/local/mysql-5.1.62-i5os-power64'.  Failure to
+     specify this option may result in corruption of your existing data
+     files.
+
+For example:
+
+     MYSQLINST/UPGMYSQL DIR('/QOPENSYS/USR/LOCAL/') DATADIR('/QOPENSYS/MYSQL/DATA') »
+          USERPRF(MYSQL) MYSQLUSR('ROOT') PASSWORD('ROOT') CURINST('/QOPENSYS/USR/LOCAL/MYSQL-5.1.62-I5OS-POWER64')
+
+You should receive a Program Message indicating `UPGRADE SUCCESSFUL!'
+upon completion or an error message if there is a problem.You can view
+the upgrade programs progression and the error in the text file
+`upgrade.log' in the installation directory.
+
+*To start MySQL*:
+
+  1. Log into the System i server using the user profile create or
+     specified during installation. By default, this is `MYSQL'.
+
+     *Note*:
+
+     You should start *Note `mysqld_safe': mysqld-safe. using a user
+     that in the PASE environment has the id=0 (the equivalent of the
+     standard Unix `root' user). If you do not use a user with this ID
+     then the system will be unable to change the user when executing
+     *Note `mysqld': mysqld. as set using `--user' option. If this
+     happens, *Note `mysqld': mysqld. may be unable to read the files
+     located within the MySQL data directory and the execution will
+     fail.
+
+  2. Enter the PASE environment using `call qp2term'.
+
+  3. Start the MySQL server by changing to the installation directory
+     and running *Note `mysqld_safe': mysqld-safe, specifying the user
+     name used to install the server. The installer conveniently
+     installs a symbolic link to the installation directory
+     (`mysql-5.0.42-i5os-power-32bit') as `/opt/mysql/mysql':
+
+          > cd /opt/mysql/mysql
+          > bin/mysqld_safe --user=mysql &
+
+     You should see a message similar to the following:
+
+          Starting mysqld daemon with databases »
+               from /opt/mysql/mysql-enterprise-5.0.42-i5os-power-32bit/data
+
+If you are having problems starting MySQL server, see *Note
+starting-server::.
+
+*To stop MySQL*:
+
+  1. Log into the System i server using the user profile create or
+     specified during installation. By default, this is `MYSQL'.
+
+  2. Enter the PASE environment using `call qp2term'.
+
+  3. Stop the MySQL server by changing into the installation directory
+     and running *Note `mysqladmin': mysqladmin, specifying the user
+     name used to install the server:
+
+          > cd /opt/mysql/mysql
+          > bin/mysqladmin -u root shutdown
+
+     If the session that you started and stopped MySQL are the same,
+     you may get the log output from `mysqld':
+
+             STOPPING server from pid file »
+               /opt/mysql/mysql-enterprise-5.0.42-i5os-power-32bit/data/I5DBX.RCHLAND.IBM.COM.pid
+             070718 10:34:20  mysqld ended
+
+     If the sessions used to start and stop MySQL are different, you
+     will not receive any confirmation of the shutdown.
+
+_Note and tips_
+
+   * A problem has been identified with the installation process on
+     DBCS systems. If you are having problems install MySQL on a DBCS
+     system, you need to change your job's coded character set
+     identifier (`CSSID') to 37 (`EBCDIC') before executing the install
+     command, `INSMYSQL'. To do this, determine your existing `CSSID'
+     (using `DSPJOB' and selecting option 2), execute `CHGJOB
+     CSSID(37)', run `INSMYSQL' to install MySQL and then execute
+     `CHGJOB' again with your original `CSSID.'
+
+   * If you want to use the Perl scripts that are included with MySQL,
+     you need to download the iSeries Tools for Developers (5799-PTL).
+     See `http://www-03.ibm.com/servers/enable/site/porting/tools/'.
+
+
+File: manual.info,  Node: source-installation,  Next: postinstallation,  Prev: i5os-installation,  Up: installing
+
+3.11 Installing MySQL from Source
+=================================
+
+* Menu:
+
+* source-installation-layout::   MySQL Layout for Source Installation
+* installing-source-distribution::  Installing MySQL from a Standard Source Distribution
+* installing-development-tree::  Installing MySQL from a Development Source Tree
+* source-configuration-options::  MySQL Source-Configuration Options
+* compilation-problems::         Dealing with Problems Compiling MySQL
+* compile-and-link-options::     Compiling and Linking an Optimized `mysqld' Server
+* windows-source-build::         Installing MySQL from Source on Windows
+* solaris-installation-source::  Notes on Installing MySQL on Solaris from Source
+* aix-installation-source::      Notes on Installing MySQL on AIX from Source
+* hpux-installation-source::     Notes on Installing MySQL on HP-UX from Source
+
+Building MySQL from the source code enables you to customize build
+parameters, compiler optimizations, and installation location. For a
+list of systems on which MySQL is known to run, see *Note
+supported-os::.
+
+Before you proceed with an installation from source, check whether we
+produce a precompiled binary distribution for your platform and whether
+it works for you. We put a great deal of effort into ensuring that our
+binaries are built with the best possible options for optimal
+performance. Instructions for installing binary distributions are
+available in *Note binary-installation::.
+
+To obtain a source distribution for MySQL, see *Note getting-mysql::.
+MySQL source distributions are available as compressed `tar' files, Zip
+archives, or RPM packages. Distribution files have names of the form
+`mysql-VERSION.tar.gz', `mysql-VERSION.zip', or `mysql-VERSION.rpm',
+where VERSION is a number like `5.1.62'.
+
+To perform a MySQL installation using the source code:
+
+   * To build MySQL from source on Unix-like systems, including Linux,
+     commercial Unix, BSD, Mac OS X and others using a `.tar.gz' or
+     RPM-based source code distribution, see *Note
+     installing-source-distribution::.
+
+   * To build MySQL from source on Windows (Windows XP or newer
+     required), see *Note windows-source-build::.
+
+   * For information on building from one of our development trees, see
+     *Note installing-development-tree::.
+
+   * For information on using the `configure' command to specify the
+     source build parameters, including links to platform specific
+     parameters that you might need, see *Note
+     source-configuration-options::.
+
+To install MySQL from source, your system must have the following tools:
+
+   * GNU `gunzip' to uncompress the distribution and a reasonable `tar'
+     to unpack it (if you use a `.tar.gz' distribution), or `WinZip' or
+     another tool that can read `.zip' files (if you use a `.zip'
+     distribution).
+
+     GNU `tar' is known to work. The standard `tar' provided with some
+     operating systems is not able to unpack the long file names in the
+     MySQL distribution. You should download and install GNU `tar', or
+     if available, use a preinstalled version of GNU tar. Usually this
+     is available as `gnutar', `gtar', or as `tar' within a GNU or Free
+     Software directory, such as `/usr/sfw/bin' or `/usr/local/bin'.
+     GNU `tar' is available from `http://www.gnu.org/software/tar/'.
+
+   * A working ANSI C++ compiler. GCC 3.4.6 or later, Sun Studio 10 or
+     later, Visual Studio 2005 or later, and many current
+     vendor-supplied compilers are known to work.
+
+   * A good `make' program. Although some platforms come with their own
+     `make' implementations, it is highly recommended that you use GNU
+     `make' 3.75 or newer. It may already be available on your system as
+     `gmake'. GNU `make' is available from
+     `http://www.gnu.org/software/make/'.
+
+   * `libtool' 1.5, available from
+     `http://www.gnu.org/software/libtool/'. 1.5.24 or later is
+     recommended.
+
+If you run into problems and need to file a bug report, please use the
+instructions in *Note bug-reports::.
+
+
+File: manual.info,  Node: source-installation-layout,  Next: installing-source-distribution,  Prev: source-installation,  Up: source-installation
+
+3.11.1 MySQL Layout for Source Installation
+-------------------------------------------
+
+By default, when you install MySQL after compiling it from a source
+distribution, the installation step installs files under `/usr/local'.
+Components are installed in the directories shown in the following
+table. To configure particular installation locations, use the options
+described at *Note source-configuration-options::.
+
+*MySQL Layout for Installation from Source*
+
+Directory                 Contents of Directory
+`bin'                     Client programs and scripts
+`include/mysql'           Include (header) files
+`Docs'                    Manual in Info format
+`man'                     Unix manual pages
+`lib/mysql'               Libraries
+`libexec'                 The *Note `mysqld': mysqld. server
+`share/mysql'             Miscellaneous support files, including error
+                          messages, sample configuration files, SQL for
+                          database installation
+`sql-bench'               Benchmarks
+`var'                     Log files, databases
+
+Within its installation directory, the layout of a source installation
+differs from that of a binary installation in the following ways:
+
+   * The *Note `mysqld': mysqld. server is installed in the `libexec'
+     directory rather than in the `bin' directory.
+
+   * The data directory is `var' rather than `data'.
+
+   * *Note `mysql_install_db': mysql-install-db. is installed in the
+     `bin' directory rather than in the `scripts' directory.
+
+   * The header file and library directories are `include/mysql' and
+     `lib/mysql' rather than `include' and `lib'.
+
+
+File: manual.info,  Node: installing-source-distribution,  Next: installing-development-tree,  Prev: source-installation-layout,  Up: source-installation
+
+3.11.2 Installing MySQL from a Standard Source Distribution
+-----------------------------------------------------------
+
+To install MySQL from source, first configure, build, and install from
+a source package. Then follow the same postinstallation setup sequence
+as for a binary installation.
+
+If you start from a source RPM, use the following command to make a
+binary RPM that you can install. If you do not have `rpmbuild', use
+`rpm' instead.
+
+     shell> rpmbuild --rebuild --clean MySQL-VERSION.src.rpm
+
+The result is one or more binary RPM packages that you install as
+indicated in *Note linux-installation-rpm::.
+
+The sequence for installation from a compressed `tar' file source
+distribution is similar to the process for installing from a generic
+binary distribution that is detailed in *Note binary-installation::.
+For a MySQL `.tar.gz' source distribution, the basic installation
+command sequence looks like this:
+
+     # Preconfiguration setup
+     shell> groupadd mysql
+     shell> useradd -g mysql mysql
+     # Beginning of source-build specific instructions
+     shell> tar zxvf mysql-VERSION.tar.gz
+     shell> cd mysql-VERSION
+     shell> ./configure --prefix=/usr/local/mysql
+     shell> make
+     shell> make install
+     # End of source-build specific instructions
+     # Postinstallation setup
+     shell> cd /usr/local/mysql
+     shell> chown -R mysql .
+     shell> chgrp -R mysql .
+     shell> bin/mysql_install_db --user=mysql
+     shell> chown -R root .
+     shell> chown -R mysql var
+     # Next command is optional
+     shell> cp support-files/my-medium.cnf /etc/my.cnf
+     shell> bin/mysqld_safe --user=mysql &
+     # Next command is optional
+     shell> cp support-files/mysql.server /etc/init.d/mysql.server
+
+A more detailed version of the source-build specific instructions is
+shown following. Perform the following steps as the `mysql' user,
+except as noted.
+
+*Note*:
+
+The procedure shown here does not set up any passwords for MySQL
+accounts. After following the procedure, proceed to *Note
+postinstallation::, for postinstallation setup and testing.
+
+  1. Set up the `mysql' user and group that will be used to run and
+     execute the MySQL server and own the database directory. For
+     details, see Creating a `mysql' System User and Group, in *Note
+     binary-installation::.
+
+  2. Pick the directory under which you want to unpack the distribution
+     and change location into it.
+
+  3. Obtain a distribution file using the instructions in *Note
+     getting-mysql::.
+
+  4. Unpack the distribution into the current directory.  `tar' can
+     uncompress and unpack the distribution if it has `z' option
+     support:
+
+          shell> tar zxvf /PATH/TO/MYSQL-VERSION.tar.gz
+
+     This command creates a directory named `mysql-VERSION'.
+
+     If your `tar' does not have `z' option support, use `gunzip' to
+     unpack the distribution and `tar' to unpack it:
+
+          shell> gunzip < /PATH/TO/MYSQL-VERSION.tar.gz | tar xvf -
+
+  5. Change location into the top-level directory of the unpacked
+     distribution:
+
+          shell> cd mysql-VERSION
+
+  6. Configure the source directory:
+
+          shell> ./configure --prefix=/us