mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
84626f52fb
Docs/Flags/australia.eps: First import - 3.23.10 Docs/Flags/australia.gif: First import - 3.23.10 Docs/Flags/australia.txt: First import - 3.23.10 Docs/Flags/austria.eps: First import - 3.23.10 Docs/Flags/austria.gif: First import - 3.23.10 Docs/Flags/austria.txt: First import - 3.23.10 Docs/Flags/brazil.eps: First import - 3.23.10 Docs/Flags/brazil.gif: First import - 3.23.10 Docs/Flags/brazil.txt: First import - 3.23.10 Docs/Flags/bulgaria.eps: First import - 3.23.10 Docs/Flags/bulgaria.gif: First import - 3.23.10 Docs/Flags/bulgaria.txt: First import - 3.23.10 Docs/Flags/canada.eps: First import - 3.23.10 Docs/Flags/canada.gif: First import - 3.23.10 Docs/Flags/canada.txt: First import - 3.23.10 Docs/Flags/chile.eps: First import - 3.23.10 Docs/Flags/chile.gif: First import - 3.23.10 Docs/Flags/chile.txt: First import - 3.23.10 Docs/Flags/china.eps: First import - 3.23.10 Docs/Flags/china.gif: First import - 3.23.10 Docs/Flags/china.txt: First import - 3.23.10 Docs/Flags/croatia.eps: First import - 3.23.10 Docs/Flags/croatia.gif: First import - 3.23.10 Docs/Flags/croatia.txt: First import - 3.23.10 Docs/Flags/czech-republic.eps: First import - 3.23.10 Docs/Flags/czech-republic.gif: First import - 3.23.10 Docs/Flags/czech-republic.txt: First import - 3.23.10 Docs/Flags/denmark.eps: First import - 3.23.10 Docs/Flags/denmark.gif: First import - 3.23.10 Docs/Flags/denmark.txt: First import - 3.23.10 Docs/Flags/estonia.eps: First import - 3.23.10 Docs/Flags/estonia.gif: First import - 3.23.10 Docs/Flags/estonia.txt: First import - 3.23.10 Docs/Flags/finland.eps: First import - 3.23.10 Docs/Flags/finland.gif: First import - 3.23.10 Docs/Flags/finland.txt: First import - 3.23.10 Docs/Flags/france.eps: First import - 3.23.10 Docs/Flags/france.gif: First import - 3.23.10 Docs/Flags/france.txt: First import - 3.23.10 Docs/Flags/germany.eps: First import - 3.23.10 Docs/Flags/germany.gif: First import - 3.23.10 Docs/Flags/germany.txt: First import - 3.23.10 Docs/Flags/great-britain.eps: First import - 3.23.10 Docs/Flags/great-britain.gif: First import - 3.23.10 Docs/Flags/great-britain.txt: First import - 3.23.10 Docs/Flags/greece.eps: First import - 3.23.10 Docs/Flags/greece.gif: First import - 3.23.10 Docs/Flags/greece.txt: First import - 3.23.10 Docs/Flags/hungary.eps: First import - 3.23.10 Docs/Flags/hungary.gif: First import - 3.23.10 Docs/Flags/hungary.txt: First import - 3.23.10 Docs/Flags/iceland.eps: First import - 3.23.10 Docs/Flags/iceland.gif: First import - 3.23.10 Docs/Flags/iceland.txt: First import - 3.23.10 Docs/Flags/ireland.eps: First import - 3.23.10 Docs/Flags/ireland.gif: First import - 3.23.10 Docs/Flags/ireland.txt: First import - 3.23.10 Docs/Flags/island.eps: First import - 3.23.10 Docs/Flags/island.gif: First import - 3.23.10 Docs/Flags/island.txt: First import - 3.23.10 Docs/Flags/israel.eps: First import - 3.23.10 Docs/Flags/israel.gif: First import - 3.23.10 Docs/Flags/israel.txt: First import - 3.23.10 Docs/Flags/italy.eps: First import - 3.23.10 Docs/Flags/italy.gif: First import - 3.23.10 Docs/Flags/italy.txt: First import - 3.23.10 Docs/Flags/japan.eps: First import - 3.23.10 Docs/Flags/japan.gif: First import - 3.23.10 Docs/Flags/japan.txt: First import - 3.23.10 Docs/Flags/kroatia.eps: First import - 3.23.10 Docs/Flags/kroatia.gif: First import - 3.23.10 Docs/Flags/kroatia.txt: First import - 3.23.10 Docs/Flags/netherlands.eps: First import - 3.23.10 Docs/Flags/netherlands.gif: First import - 3.23.10 Docs/Flags/netherlands.txt: First import - 3.23.10 Docs/Flags/poland.eps: First import - 3.23.10 Docs/Flags/poland.gif: First import - 3.23.10 Docs/Flags/poland.txt: First import - 3.23.10 Docs/Flags/portugal.eps: First import - 3.23.10 Docs/Flags/portugal.gif: First import - 3.23.10 Docs/Flags/portugal.txt: First import - 3.23.10 Docs/Flags/romania.eps: First import - 3.23.10 Docs/Flags/romania.gif: First import - 3.23.10 Docs/Flags/romania.txt: First import - 3.23.10 Docs/Flags/russia.eps: First import - 3.23.10 Docs/Flags/russia.gif: First import - 3.23.10 Docs/Flags/russia.txt: First import - 3.23.10 Docs/Flags/singapore.eps: First import - 3.23.10 Docs/Flags/singapore.gif: First import - 3.23.10 Docs/Flags/singapore.txt: First import - 3.23.10 Docs/Flags/south-africa.eps: First import - 3.23.10 Docs/Flags/south-africa.gif: First import - 3.23.10 Docs/Flags/south-africa.txt: First import - 3.23.10 Docs/Flags/south-africa1.eps: First import - 3.23.10 Docs/Flags/south-africa1.gif: First import - 3.23.10 Docs/Flags/south-africa1.txt: First import - 3.23.10 Docs/Flags/south-korea.eps: First import - 3.23.10 Docs/Flags/south-korea.gif: First import - 3.23.10 Docs/Flags/south-korea.txt: First import - 3.23.10 Docs/Flags/spain.eps: First import - 3.23.10 Docs/Flags/spain.gif: First import - 3.23.10 Docs/Flags/spain.txt: First import - 3.23.10 Docs/Flags/sweden.eps: First import - 3.23.10 Docs/Flags/sweden.gif: First import - 3.23.10 Docs/Flags/sweden.txt: First import - 3.23.10 Docs/Flags/switzerland.eps: First import - 3.23.10 Docs/Flags/switzerland.gif: First import - 3.23.10 Docs/Flags/switzerland.txt: First import - 3.23.10 Docs/Flags/taiwan.eps: First import - 3.23.10 Docs/Flags/taiwan.gif: First import - 3.23.10 Docs/Flags/taiwan.txt: First import - 3.23.10 Docs/Flags/ukraine.eps: First import - 3.23.10 Docs/Flags/ukraine.gif: First import - 3.23.10 Docs/Flags/ukraine.txt: First import - 3.23.10 Docs/Flags/usa.eps: First import - 3.23.10 Docs/Flags/usa.gif: First import - 3.23.10 Docs/Flags/usa.txt: First import - 3.23.10 Docs/Images/mysql-logo.gif: First import - 3.23.10 Docs/To-be-included-in-the-manual/MySQL-for-dummies: First import - 3.23.10 README: First import - 3.23.10 config.guess: First import - 3.23.10 dbug/dbug_long.h: First import - 3.23.10 dbug/example1.c: First import - 3.23.10 dbug/example2.c: First import - 3.23.10 dbug/example3.c: First import - 3.23.10 dbug/factorial.c: First import - 3.23.10 dbug/main.c: First import - 3.23.10 dbug/monty.doc: First import - 3.23.10 dbug/readme.prof: First import - 3.23.10 dbug/sanity.c: First import - 3.23.10 dbug/user.r: First import - 3.23.10 heap/ChangeLog: First import - 3.23.10 install-sh: First import - 3.23.10 ltconfig: First import - 3.23.10 ltmain.sh: First import - 3.23.10 missing: First import - 3.23.10 mit-pthreads/COPYRIGHT: First import - 3.23.10 mit-pthreads/FAQ: First import - 3.23.10 mit-pthreads/NOTES_OSR5_BUILD_SKUNKWARE97: First import - 3.23.10 mit-pthreads/NOTES: First import - 3.23.10 mit-pthreads/README: First import - 3.23.10 mit-pthreads/TODO-mysql: First import - 3.23.10 mit-pthreads/Whats_New: First import - 3.23.10 mit-pthreads/bin/Makefile.in: First import - 3.23.10 mit-pthreads/bin/finger/Makefile.in: First import - 3.23.10 mit-pthreads/bin/finger/finger.c: First import - 3.23.10 mit-pthreads/bin/finger/net.c: First import - 3.23.10 mit-pthreads/config/COPYING.GNU: First import - 3.23.10 mit-pthreads/config/COPYRIGHT: First import - 3.23.10 mit-pthreads/config/GNUmakefile.in: First import - 3.23.10 mit-pthreads/config/Makefile.in: First import - 3.23.10 mit-pthreads/config/acconfig.h: First import - 3.23.10 mit-pthreads/config/aclocal.m4: First import - 3.23.10 mit-pthreads/config/config.flags.in: First import - 3.23.10 mit-pthreads/config/config.guess: First import - 3.23.10 mit-pthreads/config/config.sub: First import - 3.23.10 mit-pthreads/config/configure.org: First import - 3.23.10 mit-pthreads/config/install-sh: First import - 3.23.10 mit-pthreads/configure: First import - 3.23.10 mit-pthreads/gen/GNUmakefile.inc: First import - 3.23.10 mit-pthreads/gen/Makefile.inc: First import - 3.23.10 mit-pthreads/gen/ctime.c: First import - 3.23.10 mit-pthreads/gen/difftime.c: First import - 3.23.10 mit-pthreads/gen/directory.c: First import - 3.23.10 mit-pthreads/gen/eprintf.c: First import - 3.23.10 mit-pthreads/gen/getcwd.c: First import - 3.23.10 mit-pthreads/gen/getpwent.c: First import - 3.23.10 mit-pthreads/gen/getpwnamuid.c: First import - 3.23.10 mit-pthreads/gen/getwd.c: First import - 3.23.10 mit-pthreads/gen/isatty.c: First import - 3.23.10 mit-pthreads/gen/popen.c: First import - 3.23.10 mit-pthreads/gen/pwd_internal.c: First import - 3.23.10 mit-pthreads/gen/pwd_internal.h: First import - 3.23.10 mit-pthreads/gen/syslog.c: First import - 3.23.10 mit-pthreads/gen/time.c: First import - 3.23.10 mit-pthreads/include/Makefile.inc: First import - 3.23.10 mit-pthreads/include/arpa/inet.h: First import - 3.23.10 mit-pthreads/include/arpa/nameser.h: First import - 3.23.10 mit-pthreads/include/dirent.h: First import - 3.23.10 mit-pthreads/include/endian.h: First import - 3.23.10 mit-pthreads/include/errno.h: First import - 3.23.10 mit-pthreads/include/math.h: First import - 3.23.10 mit-pthreads/include/netdb.h: First import - 3.23.10 mit-pthreads/include/pthread.h: First import - 3.23.10 mit-pthreads/include/pthread/cleanup.h: First import - 3.23.10 mit-pthreads/include/pthread/debug_out.h: First import - 3.23.10 mit-pthreads/include/pthread/fd.h: First import - 3.23.10 mit-pthreads/include/pthread/fd_pipe.h: First import - 3.23.10 mit-pthreads/include/pthread/kernel.h: First import - 3.23.10 mit-pthreads/include/pthread/kthread.h: First import - 3.23.10 mit-pthreads/include/pthread/mutex.h: First import - 3.23.10 mit-pthreads/include/pthread/prio_queue.h: First import - 3.23.10 mit-pthreads/include/pthread/pthread_attr.h: First import - 3.23.10 mit-pthreads/include/pthread/pthread_once.h: First import - 3.23.10 mit-pthreads/include/pthread/queue.h: First import - 3.23.10 mit-pthreads/include/pthread/sleep.h: First import - 3.23.10 mit-pthreads/include/pthread/specific.h: First import - 3.23.10 mit-pthreads/include/pthread/state.def: First import - 3.23.10 mit-pthreads/include/pthread/types.h: First import - 3.23.10 mit-pthreads/include/pthread/unistd.h: First import - 3.23.10 mit-pthreads/include/pthread/util.h: First import - 3.23.10 mit-pthreads/include/pthread/version.h: First import - 3.23.10 mit-pthreads/include/pthread/xtypes.h: First import - 3.23.10 mit-pthreads/include/pwd.h: First import - 3.23.10 mit-pthreads/include/resolv.h: First import - 3.23.10 mit-pthreads/include/sched.h: First import - 3.23.10 mit-pthreads/include/signal.h: First import - 3.23.10 mit-pthreads/include/stdio.h: First import - 3.23.10 mit-pthreads/include/stdlib.h: First import - 3.23.10 mit-pthreads/include/string.h: First import - 3.23.10 mit-pthreads/include/syslog.h: First import - 3.23.10 mit-pthreads/include/time.h: First import - 3.23.10 mit-pthreads/include/timers.h: First import - 3.23.10 mit-pthreads/include/tzfile.h: First import - 3.23.10 mit-pthreads/include/unistd.h: First import - 3.23.10 mit-pthreads/lib/Makefile.in: First import - 3.23.10 mit-pthreads/lib/libpthreadutil/Makefile.in: First import - 3.23.10 mit-pthreads/lib/libpthreadutil/pthread_atexit.c: First import - 3.23.10 mit-pthreads/lib/libpthreadutil/pthread_tad.c: First import - 3.23.10 mit-pthreads/lib/libpthreadutil/pthreadutil.h: First import - 3.23.10 mit-pthreads/machdep/alpha-osf1/__math.h: First import - 3.23.10 mit-pthreads/machdep/alpha-osf1/__signal.h: First import - 3.23.10 mit-pthreads/machdep/alpha-osf1/__stdio.h: First import - 3.23.10 mit-pthreads/machdep/alpha-osf1/__stdlib.h: First import - 3.23.10 mit-pthreads/machdep/alpha-osf1/__string.h: First import - 3.23.10 mit-pthreads/machdep/alpha-osf1/__time.h: First import - 3.23.10 mit-pthreads/machdep/alpha-osf1/__unistd.h: First import - 3.23.10 mit-pthreads/machdep/alpha-osf1/cdefs.h: First import - 3.23.10 mit-pthreads/machdep/alpha-osf1/compat.h: First import - 3.23.10 mit-pthreads/machdep/alpha-osf1/dirent.h: First import - 3.23.10 mit-pthreads/machdep/alpha-osf1/signal.h: First import - 3.23.10 mit-pthreads/machdep/alpha-osf1/socket.h: First import - 3.23.10 mit-pthreads/machdep/alpha-osf1/timers.h: First import - 3.23.10 mit-pthreads/machdep/alpha-osf1/uio.h: First import - 3.23.10 mit-pthreads/machdep/bsdi-1.1/compat.h: First import - 3.23.10 mit-pthreads/machdep/bsdi-1.1/dirent.h: First import - 3.23.10 mit-pthreads/machdep/bsdi-1.1/errno.h: First import - 3.23.10 mit-pthreads/machdep/bsdi-1.1/socket.h: First import - 3.23.10 mit-pthreads/machdep/bsdi-1.1/timers.h: First import - 3.23.10 mit-pthreads/machdep/bsdi-2.0/__math.h: First import - 3.23.10 mit-pthreads/machdep/bsdi-2.0/__path.h: First import - 3.23.10 mit-pthreads/machdep/bsdi-2.0/__signal.h: First import - 3.23.10 mit-pthreads/machdep/bsdi-2.0/__stdio.h: First import - 3.23.10 mit-pthreads/machdep/bsdi-2.0/__stdlib.h: First import - 3.23.10 mit-pthreads/machdep/bsdi-2.0/__string.h: First import - 3.23.10 mit-pthreads/machdep/bsdi-2.0/__time.h: First import - 3.23.10 mit-pthreads/machdep/bsdi-2.0/__unistd.h: First import - 3.23.10 mit-pthreads/machdep/bsdi-2.0/compat.h: First import - 3.23.10 mit-pthreads/machdep/bsdi-2.0/dirent.h: First import - 3.23.10 mit-pthreads/machdep/bsdi-2.0/errno.h: First import - 3.23.10 mit-pthreads/machdep/bsdi-2.0/time.h: First import - 3.23.10 mit-pthreads/machdep/bsdi-2.0/timers.h: First import - 3.23.10 mit-pthreads/machdep/bsdi-2.0/wait.h: First import - 3.23.10 mit-pthreads/machdep/engine-alpha-netbsd-1.1.c: First import - 3.23.10 mit-pthreads/machdep/engine-alpha-netbsd-1.1.h: First import - 3.23.10 mit-pthreads/machdep/engine-alpha-netbsd-1.3.c: First import - 3.23.10 mit-pthreads/machdep/engine-alpha-netbsd-1.3.h: First import - 3.23.10 mit-pthreads/machdep/engine-alpha-osf1.c: First import - 3.23.10 mit-pthreads/machdep/engine-alpha-osf1.h: First import - 3.23.10 mit-pthreads/machdep/engine-arm32-netbsd-1.3.c: First import - 3.23.10 mit-pthreads/machdep/engine-arm32-netbsd-1.3.h: First import - 3.23.10 mit-pthreads/machdep/engine-hppa-hpux-10.20.c: First import - 3.23.10 mit-pthreads/machdep/engine-hppa-hpux-10.20.h: First import - 3.23.10 mit-pthreads/machdep/engine-hppa-hpux-9.03.c: First import - 3.23.10 mit-pthreads/machdep/engine-hppa-hpux-9.03.h: First import - 3.23.10 mit-pthreads/machdep/engine-i386-bsdi-1.1.c: First import - 3.23.10 mit-pthreads/machdep/engine-i386-bsdi-1.1.h: First import - 3.23.10 mit-pthreads/machdep/engine-i386-bsdi-2.0.c: First import - 3.23.10 mit-pthreads/machdep/engine-i386-bsdi-2.0.h: First import - 3.23.10 mit-pthreads/machdep/engine-i386-freebsd-1.1.c: First import - 3.23.10 mit-pthreads/machdep/engine-i386-freebsd-1.1.h: First import - 3.23.10 mit-pthreads/machdep/engine-i386-freebsd-2.0.c: First import - 3.23.10 mit-pthreads/machdep/engine-i386-freebsd-2.0.h: First import - 3.23.10 mit-pthreads/machdep/engine-i386-linux-1.0.c: First import - 3.23.10 mit-pthreads/machdep/engine-i386-linux-1.0.h: First import - 3.23.10 mit-pthreads/machdep/engine-i386-netbsd-0.9.c: First import - 3.23.10 mit-pthreads/machdep/engine-i386-netbsd-0.9.h: First import - 3.23.10 mit-pthreads/machdep/engine-i386-netbsd-1.0.c: First import - 3.23.10 mit-pthreads/machdep/engine-i386-netbsd-1.0.h: First import - 3.23.10 mit-pthreads/machdep/engine-i386-netbsd-1.3.c: First import - 3.23.10 mit-pthreads/machdep/engine-i386-netbsd-1.3.h: First import - 3.23.10 mit-pthreads/machdep/engine-i386-openbsd-2.0.c: First import - 3.23.10 mit-pthreads/machdep/engine-i386-openbsd-2.0.h: First import - 3.23.10 mit-pthreads/machdep/engine-i386-sco-3.2v5.c: First import - 3.23.10 mit-pthreads/machdep/engine-i386-sco-3.2v5.h: First import - 3.23.10 mit-pthreads/machdep/engine-ip22-irix-5.2.c: First import - 3.23.10 mit-pthreads/machdep/engine-ip22-irix-5.2.h: First import - 3.23.10 mit-pthreads/machdep/engine-m68000-netbsd.c: First import - 3.23.10 mit-pthreads/machdep/engine-m68000-netbsd.h: First import - 3.23.10 mit-pthreads/machdep/engine-r2000-ultrix-4.2.c: First import - 3.23.10 mit-pthreads/machdep/engine-r2000-ultrix-4.2.h: First import - 3.23.10 mit-pthreads/machdep/engine-romp-bsd.c: First import - 3.23.10 mit-pthreads/machdep/engine-romp-bsd.h: First import - 3.23.10 mit-pthreads/machdep/engine-sparc-netbsd-1.3.c: First import - 3.23.10 mit-pthreads/machdep/engine-sparc-netbsd-1.3.h: First import - 3.23.10 mit-pthreads/machdep/engine-sparc-sunos-4.1.3.c: First import - 3.23.10 mit-pthreads/machdep/engine-sparc-sunos-4.1.3.h: First import - 3.23.10 mit-pthreads/machdep/engine-sparc-sunos-5.3.c: First import - 3.23.10 mit-pthreads/machdep/engine-sparc-sunos-5.3.h: First import - 3.23.10 mit-pthreads/machdep/freebsd-1.1/compat.h: First import - 3.23.10 mit-pthreads/machdep/freebsd-1.1/dirent.h: First import - 3.23.10 mit-pthreads/machdep/freebsd-1.1/socket.h: First import - 3.23.10 mit-pthreads/machdep/freebsd-1.1/timers.h: First import - 3.23.10 mit-pthreads/machdep/freebsd-2.0/__math.h: First import - 3.23.10 mit-pthreads/machdep/freebsd-2.0/__path.h: First import - 3.23.10 mit-pthreads/machdep/freebsd-2.0/__signal.h: First import - 3.23.10 mit-pthreads/machdep/freebsd-2.0/__stdio.h: First import - 3.23.10 mit-pthreads/machdep/freebsd-2.0/__stdlib.h: First import - 3.23.10 mit-pthreads/machdep/freebsd-2.0/__string.h: First import - 3.23.10 mit-pthreads/machdep/freebsd-2.0/__time.h: First import - 3.23.10 mit-pthreads/machdep/freebsd-2.0/__unistd.h: First import - 3.23.10 mit-pthreads/machdep/freebsd-2.0/compat.h: First import - 3.23.10 mit-pthreads/machdep/freebsd-2.0/dirent.h: First import - 3.23.10 mit-pthreads/machdep/freebsd-2.0/errno.h: First import - 3.23.10 mit-pthreads/machdep/freebsd-2.0/timers.h: First import - 3.23.10 mit-pthreads/machdep/freebsd-2.0/wait.h: First import - 3.23.10 mit-pthreads/machdep/hpux-10.20/__math.h: First import - 3.23.10 mit-pthreads/machdep/hpux-10.20/__signal.h: First import - 3.23.10 mit-pthreads/machdep/hpux-10.20/__stdio.h: First import - 3.23.10 mit-pthreads/machdep/hpux-10.20/__stdlib.h: First import - 3.23.10 mit-pthreads/machdep/hpux-10.20/__string.h: First import - 3.23.10 mit-pthreads/machdep/hpux-10.20/__time.h: First import - 3.23.10 mit-pthreads/machdep/hpux-10.20/__unistd.h: First import - 3.23.10 mit-pthreads/machdep/hpux-10.20/cdefs.h: First import - 3.23.10 mit-pthreads/machdep/hpux-10.20/compat.h: First import - 3.23.10 mit-pthreads/machdep/hpux-10.20/dirent.h: First import - 3.23.10 mit-pthreads/machdep/hpux-10.20/socket.h: First import - 3.23.10 mit-pthreads/machdep/hpux-10.20/stdtypes.h: First import - 3.23.10 mit-pthreads/machdep/hpux-10.20/time.h: First import - 3.23.10 mit-pthreads/machdep/hpux-10.20/timers.h: First import - 3.23.10 mit-pthreads/machdep/hpux-10.20/uio.h: First import - 3.23.10 mit-pthreads/machdep/hpux-10.20/wait.h: First import - 3.23.10 mit-pthreads/machdep/hpux-9.03/__math.h: First import - 3.23.10 mit-pthreads/machdep/hpux-9.03/__signal.h: First import - 3.23.10 mit-pthreads/machdep/hpux-9.03/__stdio.h: First import - 3.23.10 mit-pthreads/machdep/hpux-9.03/__stdlib.h: First import - 3.23.10 mit-pthreads/machdep/hpux-9.03/__string.h: First import - 3.23.10 mit-pthreads/machdep/hpux-9.03/__time.h: First import - 3.23.10 mit-pthreads/machdep/hpux-9.03/__unistd.h: First import - 3.23.10 mit-pthreads/machdep/hpux-9.03/cdefs.h: First import - 3.23.10 mit-pthreads/machdep/hpux-9.03/compat.h: First import - 3.23.10 mit-pthreads/machdep/hpux-9.03/dirent.h: First import - 3.23.10 mit-pthreads/machdep/hpux-9.03/socket.h: First import - 3.23.10 mit-pthreads/machdep/hpux-9.03/stdtypes.h: First import - 3.23.10 mit-pthreads/machdep/hpux-9.03/time.h: First import - 3.23.10 mit-pthreads/machdep/hpux-9.03/timers.h: First import - 3.23.10 mit-pthreads/machdep/hpux-9.03/uio.h: First import - 3.23.10 mit-pthreads/machdep/hpux-9.03/wait.h: First import - 3.23.10 mit-pthreads/machdep/i386-sco-3.2v5/__math.h: First import - 3.23.10 mit-pthreads/machdep/i386-sco-3.2v5/__signal.h: First import - 3.23.10 mit-pthreads/machdep/i386-sco-3.2v5/__stdio.h: First import - 3.23.10 mit-pthreads/machdep/i386-sco-3.2v5/__stdlib.h: First import - 3.23.10 mit-pthreads/machdep/i386-sco-3.2v5/__string.h: First import - 3.23.10 mit-pthreads/machdep/i386-sco-3.2v5/__time.h: First import - 3.23.10 mit-pthreads/machdep/i386-sco-3.2v5/__unistd.h: First import - 3.23.10 mit-pthreads/machdep/i386-sco-3.2v5/compat.h: First import - 3.23.10 mit-pthreads/machdep/i386-sco-3.2v5/dirent.h: First import - 3.23.10 mit-pthreads/machdep/i386-sco-3.2v5/posix/__signal.h: First import - 3.23.10 mit-pthreads/machdep/i386-sco-3.2v5/socket.h: First import - 3.23.10 mit-pthreads/machdep/i386-sco-3.2v5/syscall.h: First import - 3.23.10 mit-pthreads/machdep/i386-sco-3.2v5/timers.h: First import - 3.23.10 mit-pthreads/machdep/i386-sco-3.2v5/trash.can: First import - 3.23.10 mit-pthreads/machdep/irix-5.2/__math.h: First import - 3.23.10 mit-pthreads/machdep/irix-5.2/__signal.h: First import - 3.23.10 mit-pthreads/machdep/irix-5.2/__stdio.h: First import - 3.23.10 mit-pthreads/machdep/irix-5.2/__stdlib.h: First import - 3.23.10 mit-pthreads/machdep/irix-5.2/__string.h: First import - 3.23.10 mit-pthreads/machdep/irix-5.2/__time.h: First import - 3.23.10 mit-pthreads/machdep/irix-5.2/__unistd.h: First import - 3.23.10 mit-pthreads/machdep/irix-5.2/compat.h: First import - 3.23.10 mit-pthreads/machdep/irix-5.2/dirent.h: First import - 3.23.10 mit-pthreads/machdep/irix-5.2/socket.h: First import - 3.23.10 mit-pthreads/machdep/irix-5.2/timers.h: First import - 3.23.10 mit-pthreads/machdep/irix-5.2/wait.h: First import - 3.23.10 mit-pthreads/machdep/linux-1.0/__math.h: First import - 3.23.10 mit-pthreads/machdep/linux-1.0/__path.h: First import - 3.23.10 mit-pthreads/machdep/linux-1.0/__signal.h: First import - 3.23.10 mit-pthreads/machdep/linux-1.0/__stdio.h: First import - 3.23.10 mit-pthreads/machdep/linux-1.0/__stdlib.h: First import - 3.23.10 mit-pthreads/machdep/linux-1.0/__string.h: First import - 3.23.10 mit-pthreads/machdep/linux-1.0/__time.h: First import - 3.23.10 mit-pthreads/machdep/linux-1.0/__unistd.h: First import - 3.23.10 mit-pthreads/machdep/linux-1.0/cdefs.h: First import - 3.23.10 mit-pthreads/machdep/linux-1.0/compat.h: First import - 3.23.10 mit-pthreads/machdep/linux-1.0/dirent.h: First import - 3.23.10 mit-pthreads/machdep/linux-1.0/errno.h: First import - 3.23.10 mit-pthreads/machdep/linux-1.0/socket.h: First import - 3.23.10 mit-pthreads/machdep/linux-1.0/timers.h: First import - 3.23.10 mit-pthreads/machdep/linux-1.0/uio.h: First import - 3.23.10 mit-pthreads/machdep/linux-1.0/wait.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-0.9/dirent.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.0/__math.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.0/__path.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.0/__signal.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.0/__stdio.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.0/__stdlib.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.0/__string.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.0/__time.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.0/__unistd.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.0/compat.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.0/dirent.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.0/errno.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.0/time.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.0/timers.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.0/wait.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.1/__math.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.1/__path.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.1/__signal.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.1/__stdio.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.1/__stdlib.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.1/__string.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.1/__time.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.1/__unistd.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.1/compat.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.1/dirent.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.1/errno.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.1/time.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.1/timers.h: First import - 3.23.10 mit-pthreads/machdep/netbsd-1.1/wait.h: First import - 3.23.10 mit-pthreads/machdep/openbsd-2.0/__math.h: First import - 3.23.10 mit-pthreads/machdep/openbsd-2.0/__path.h: First import - 3.23.10 mit-pthreads/machdep/openbsd-2.0/__signal.h: First import - 3.23.10 mit-pthreads/machdep/openbsd-2.0/__stdio.h: First import - 3.23.10 mit-pthreads/machdep/openbsd-2.0/__stdlib.h: First import - 3.23.10 mit-pthreads/machdep/openbsd-2.0/__string.h: First import - 3.23.10 mit-pthreads/machdep/openbsd-2.0/__time.h: First import - 3.23.10 mit-pthreads/machdep/openbsd-2.0/__unistd.h: First import - 3.23.10 mit-pthreads/machdep/openbsd-2.0/compat.h: First import - 3.23.10 mit-pthreads/machdep/openbsd-2.0/dirent.h: First import - 3.23.10 mit-pthreads/machdep/openbsd-2.0/errno.h: First import - 3.23.10 mit-pthreads/machdep/openbsd-2.0/timers.h: First import - 3.23.10 mit-pthreads/machdep/openbsd-2.0/wait.h: First import - 3.23.10 mit-pthreads/machdep/posix-alpha-osf1.h: First import - 3.23.10 mit-pthreads/machdep/posix-bsdi-1.1.h: First import - 3.23.10 mit-pthreads/machdep/posix-bsdi-2.0.h: First import - 3.23.10 mit-pthreads/machdep/posix-freebsd-1.1.h: First import - 3.23.10 mit-pthreads/machdep/posix-freebsd-2.0.h: First import - 3.23.10 mit-pthreads/machdep/posix-hpux-10.20.h: First import - 3.23.10 mit-pthreads/machdep/posix-hpux-9.03.h: First import - 3.23.10 mit-pthreads/machdep/posix-i386-sco-3.2v5.h: First import - 3.23.10 mit-pthreads/machdep/posix-irix-5.2.h: First import - 3.23.10 mit-pthreads/machdep/posix-linux-1.0.h: First import - 3.23.10 mit-pthreads/machdep/posix-netbsd-0.9.h: First import - 3.23.10 mit-pthreads/machdep/posix-netbsd-1.0.h: First import - 3.23.10 mit-pthreads/machdep/posix-netbsd-1.1.h: First import - 3.23.10 mit-pthreads/machdep/posix-openbsd-2.0.h: First import - 3.23.10 mit-pthreads/machdep/posix-romp-bsd.h: First import - 3.23.10 mit-pthreads/machdep/posix-sco-3.2v5.h: First import - 3.23.10 mit-pthreads/machdep/posix-sunos-4.1.3.h: First import - 3.23.10 mit-pthreads/machdep/posix-sunos-5.3.h: First import - 3.23.10 mit-pthreads/machdep/posix-sunos-5.5.h: First import - 3.23.10 mit-pthreads/machdep/posix-ultrix-4.2.h: First import - 3.23.10 mit-pthreads/machdep/sco-3.2v5/__math.h: First import - 3.23.10 mit-pthreads/machdep/sco-3.2v5/__signal.h: First import - 3.23.10 mit-pthreads/machdep/sco-3.2v5/__stdio.h: First import - 3.23.10 mit-pthreads/machdep/sco-3.2v5/__stdlib.h: First import - 3.23.10 mit-pthreads/machdep/sco-3.2v5/__string.h: First import - 3.23.10 mit-pthreads/machdep/sco-3.2v5/__time.h: First import - 3.23.10 mit-pthreads/machdep/sco-3.2v5/__unistd.h: First import - 3.23.10 mit-pthreads/machdep/sco-3.2v5/compat.h: First import - 3.23.10 mit-pthreads/machdep/sco-3.2v5/dirent.h: First import - 3.23.10 mit-pthreads/machdep/sco-3.2v5/posix/__signal.h: First import - 3.23.10 mit-pthreads/machdep/sco-3.2v5/socket.h: First import - 3.23.10 mit-pthreads/machdep/sco-3.2v5/syscall.h: First import - 3.23.10 mit-pthreads/machdep/sco-3.2v5/timers.h: First import - 3.23.10 mit-pthreads/machdep/sco-3.2v5/trash.can: First import - 3.23.10 mit-pthreads/machdep/sunos-4.1.3/__math.h: First import - 3.23.10 mit-pthreads/machdep/sunos-4.1.3/__path.h: First import - 3.23.10 mit-pthreads/machdep/sunos-4.1.3/__signal.h: First import - 3.23.10 mit-pthreads/machdep/sunos-4.1.3/__stdio.h: First import - 3.23.10 mit-pthreads/machdep/sunos-4.1.3/__stdlib.h: First import - 3.23.10 mit-pthreads/machdep/sunos-4.1.3/__string.h: First import - 3.23.10 mit-pthreads/machdep/sunos-4.1.3/__time.h: First import - 3.23.10 mit-pthreads/machdep/sunos-4.1.3/__unistd.h: First import - 3.23.10 mit-pthreads/machdep/sunos-4.1.3/cdefs.h: First import - 3.23.10 mit-pthreads/machdep/sunos-4.1.3/compat.h: First import - 3.23.10 mit-pthreads/machdep/sunos-4.1.3/dirent.h: First import - 3.23.10 mit-pthreads/machdep/sunos-4.1.3/fcntlcom.h: First import - 3.23.10 mit-pthreads/machdep/sunos-4.1.3/signal.h: First import - 3.23.10 mit-pthreads/machdep/sunos-4.1.3/stat.h: First import - 3.23.10 mit-pthreads/machdep/sunos-4.1.3/time.h: First import - 3.23.10 mit-pthreads/machdep/sunos-4.1.3/timers.h: First import - 3.23.10 mit-pthreads/machdep/sunos-4.1.3/wait.h: First import - 3.23.10 mit-pthreads/machdep/sunos-5.3/__math.h: First import - 3.23.10 mit-pthreads/machdep/sunos-5.3/__signal.h: First import - 3.23.10 mit-pthreads/machdep/sunos-5.3/__stdio.h: First import - 3.23.10 mit-pthreads/machdep/sunos-5.3/__stdlib.h: First import - 3.23.10 mit-pthreads/machdep/sunos-5.3/__string.h: First import - 3.23.10 mit-pthreads/machdep/sunos-5.3/__time.h: First import - 3.23.10 mit-pthreads/machdep/sunos-5.3/__unistd.h: First import - 3.23.10 mit-pthreads/machdep/sunos-5.3/cdefs.h: First import - 3.23.10 mit-pthreads/machdep/sunos-5.3/compat.h: First import - 3.23.10 mit-pthreads/machdep/sunos-5.3/dirent.h: First import - 3.23.10 mit-pthreads/machdep/sunos-5.3/socket.h: First import - 3.23.10 mit-pthreads/machdep/sunos-5.3/timers.h: First import - 3.23.10 mit-pthreads/machdep/sunos-5.3/uio.h: First import - 3.23.10 mit-pthreads/machdep/sunos-5.5/__math.h: First import - 3.23.10 mit-pthreads/machdep/sunos-5.5/__signal.h: First import - 3.23.10 mit-pthreads/machdep/sunos-5.5/__stdio.h: First import - 3.23.10 mit-pthreads/machdep/sunos-5.5/__stdlib.h: First import - 3.23.10 mit-pthreads/machdep/sunos-5.5/__string.h: First import - 3.23.10 mit-pthreads/machdep/sunos-5.5/__time.h: First import - 3.23.10 mit-pthreads/machdep/sunos-5.5/__unistd.h: First import - 3.23.10 mit-pthreads/machdep/sunos-5.5/cdefs.h: First import - 3.23.10 mit-pthreads/machdep/sunos-5.5/compat.h: First import - 3.23.10 mit-pthreads/machdep/sunos-5.5/dirent.h: First import - 3.23.10 mit-pthreads/machdep/sunos-5.5/socket.h: First import - 3.23.10 mit-pthreads/machdep/sunos-5.5/timers.h: First import - 3.23.10 mit-pthreads/machdep/sunos-5.5/uio.h: First import - 3.23.10 mit-pthreads/machdep/syscall-alpha-netbsd-1.1.S: First import - 3.23.10 mit-pthreads/machdep/syscall-alpha-netbsd-1.3.S: First import - 3.23.10 mit-pthreads/machdep/syscall-alpha-osf1.S: First import - 3.23.10 mit-pthreads/machdep/syscall-arm32-netbsd-1.3.S: First import - 3.23.10 mit-pthreads/machdep/syscall-hppa-hpux-10.20.S: First import - 3.23.10 mit-pthreads/machdep/syscall-hppa-hpux-9.03.S: First import - 3.23.10 mit-pthreads/machdep/syscall-i386-bsdi-1.1.S: First import - 3.23.10 mit-pthreads/machdep/syscall-i386-bsdi-2.0.S: First import - 3.23.10 mit-pthreads/machdep/syscall-i386-freebsd-1.1.S: First import - 3.23.10 mit-pthreads/machdep/syscall-i386-freebsd-2.0.S: First import - 3.23.10 mit-pthreads/machdep/syscall-i386-linux-1.0.S: First import - 3.23.10 mit-pthreads/machdep/syscall-i386-netbsd-0.9.S: First import - 3.23.10 mit-pthreads/machdep/syscall-i386-netbsd-1.0.S: First import - 3.23.10 mit-pthreads/machdep/syscall-i386-netbsd-1.1.S: First import - 3.23.10 mit-pthreads/machdep/syscall-i386-netbsd-1.3.S: First import - 3.23.10 mit-pthreads/machdep/syscall-i386-openbsd-2.0.S: First import - 3.23.10 mit-pthreads/machdep/syscall-i386-sco-3.2v5.S: First import - 3.23.10 mit-pthreads/machdep/syscall-ip22-irix-5.2.S: First import - 3.23.10 mit-pthreads/machdep/syscall-m68000-netbsd.S: First import - 3.23.10 mit-pthreads/machdep/syscall-r2000-ultrix-4.2.S: First import - 3.23.10 mit-pthreads/machdep/syscall-romp-bsd.S: First import - 3.23.10 mit-pthreads/machdep/syscall-sparc-netbsd-1.1.S: First import - 3.23.10 mit-pthreads/machdep/syscall-sparc-netbsd-1.3.S: First import - 3.23.10 mit-pthreads/machdep/syscall-sparc-sunos-4.1.3.S: First import - 3.23.10 mit-pthreads/machdep/syscall-sparc-sunos-5.3.S: First import - 3.23.10 mit-pthreads/machdep/syscall-sparc-sunos4.S: First import - 3.23.10 mit-pthreads/machdep/syscall-template-alpha-netbsd-1.1.S: First import - 3.23.10 mit-pthreads/machdep/syscall-template-alpha-netbsd-1.3.S: First import - 3.23.10 mit-pthreads/machdep/syscall-template-alpha-osf1.S: First import - 3.23.10 mit-pthreads/machdep/syscall-template-arm32-netbsd-1.3.S: First import - 3.23.10 mit-pthreads/machdep/syscall-template-hppa-hpux-10.20.S: First import - 3.23.10 mit-pthreads/machdep/syscall-template-hppa-hpux-9.03.S: First import - 3.23.10 mit-pthreads/machdep/syscall-template-i386-bsdi-2.0.S: First import - 3.23.10 mit-pthreads/machdep/syscall-template-i386-freebsd-2.0.S: First import - 3.23.10 mit-pthreads/machdep/syscall-template-i386-netbsd-1.1.S: First import - 3.23.10 mit-pthreads/machdep/syscall-template-i386-netbsd-1.3.S: First import - 3.23.10 mit-pthreads/machdep/syscall-template-i386-netbsd1.0.S: First import - 3.23.10 mit-pthreads/machdep/syscall-template-i386-openbsd-2.0.S: First import - 3.23.10 mit-pthreads/machdep/syscall-template-i386-sco-3.2v5.S: First import - 3.23.10 mit-pthreads/machdep/syscall-template-ip22-irix-5.2.S: First import - 3.23.10 mit-pthreads/machdep/syscall-template-m68000-netbsd.S: First import - 3.23.10 mit-pthreads/machdep/syscall-template-r2000-ultrix-4.2.S: First import - 3.23.10 mit-pthreads/machdep/syscall-template-sparc-netbsd-1.1.S: First import - 3.23.10 mit-pthreads/machdep/syscall-template-sparc-netbsd-1.3.S: First import - 3.23.10 mit-pthreads/machdep/syscall-template-sparc-sunos-5.3.S: First import - 3.23.10 mit-pthreads/machdep/syscall-template-sparc-sunos4.S: First import - 3.23.10 mit-pthreads/machdep/ultrix-4.2/__math.h: First import - 3.23.10 mit-pthreads/machdep/ultrix-4.2/__signal.h: First import - 3.23.10 mit-pthreads/machdep/ultrix-4.2/__stdio.h: First import - 3.23.10 mit-pthreads/machdep/ultrix-4.2/__stdlib.h: First import - 3.23.10 mit-pthreads/machdep/ultrix-4.2/__string.h: First import - 3.23.10 mit-pthreads/machdep/ultrix-4.2/__time.h: First import - 3.23.10 mit-pthreads/machdep/ultrix-4.2/__unistd.h: First import - 3.23.10 mit-pthreads/machdep/ultrix-4.2/cdefs.h: First import - 3.23.10 mit-pthreads/machdep/ultrix-4.2/compat.h: First import - 3.23.10 mit-pthreads/machdep/ultrix-4.2/dirent.h: First import - 3.23.10 mit-pthreads/machdep/ultrix-4.2/errno.h: First import - 3.23.10 mit-pthreads/machdep/ultrix-4.2/time.h: First import - 3.23.10 mit-pthreads/machdep/ultrix-4.2/timers.h: First import - 3.23.10 mit-pthreads/machdep/ultrix-4.2/wait.h: First import - 3.23.10 mit-pthreads/machdep/unistd-i386-freebsd-1.1.h: First import - 3.23.10 mit-pthreads/machdep/unistd-i386-linux-1.0.h: First import - 3.23.10 mit-pthreads/machdep/unistd-sparc-sunos-4.1.3.h: First import - 3.23.10 mit-pthreads/net/GNUmakefile.inc: First import - 3.23.10 mit-pthreads/net/gethostbyaddr.c: First import - 3.23.10 mit-pthreads/net/gethostbyname.c: First import - 3.23.10 mit-pthreads/net/gethostent.c: First import - 3.23.10 mit-pthreads/net/getnetbyaddr.c: First import - 3.23.10 mit-pthreads/net/getnetbyname.c: First import - 3.23.10 mit-pthreads/net/getnetent.c: First import - 3.23.10 mit-pthreads/net/getproto.c: First import - 3.23.10 mit-pthreads/net/getprotoent.c: First import - 3.23.10 mit-pthreads/net/getprotoname.c: First import - 3.23.10 mit-pthreads/net/getservbyname.c: First import - 3.23.10 mit-pthreads/net/getservbyport.c: First import - 3.23.10 mit-pthreads/net/getservent.c: First import - 3.23.10 mit-pthreads/net/herror.c: First import - 3.23.10 mit-pthreads/net/inet_addr.c: First import - 3.23.10 mit-pthreads/net/inet_lnaof.c: First import - 3.23.10 mit-pthreads/net/inet_makeaddr.c: First import - 3.23.10 mit-pthreads/net/inet_netof.c: First import - 3.23.10 mit-pthreads/net/inet_network.c: First import - 3.23.10 mit-pthreads/net/inet_ntoa.c: First import - 3.23.10 mit-pthreads/net/net_internal.c: First import - 3.23.10 mit-pthreads/net/net_internal.h: First import - 3.23.10 mit-pthreads/net/proto_internal.c: First import - 3.23.10 mit-pthreads/net/proto_internal.h: First import - 3.23.10 mit-pthreads/net/res_comp.c: First import - 3.23.10 mit-pthreads/net/res_debug.c: First import - 3.23.10 mit-pthreads/net/res_init.c: First import - 3.23.10 mit-pthreads/net/res_internal.c: First import - 3.23.10 mit-pthreads/net/res_internal.h: First import - 3.23.10 mit-pthreads/net/res_mkquery.c: First import - 3.23.10 mit-pthreads/net/res_query.c: First import - 3.23.10 mit-pthreads/net/res_querydomain.c: First import - 3.23.10 mit-pthreads/net/res_search.c: First import - 3.23.10 mit-pthreads/net/res_send.c: First import - 3.23.10 mit-pthreads/net/serv_internal.c: First import - 3.23.10 mit-pthreads/net/serv_internal.h: First import - 3.23.10 mit-pthreads/patches/Streepy.html: First import - 3.23.10 mit-pthreads/patches/Streepy2.html: First import - 3.23.10 mit-pthreads/patches/bill_lear: First import - 3.23.10 mit-pthreads/patches/chris_demetriou: First import - 3.23.10 mit-pthreads/patches/mevans: First import - 3.23.10 mit-pthreads/patches/p153: First import - 3.23.10 mit-pthreads/patches/p155: First import - 3.23.10 mit-pthreads/pg++: First import - 3.23.10 mit-pthreads/pgcc: First import - 3.23.10 mit-pthreads/pthreads/GNUmakefile.inc: First import - 3.23.10 mit-pthreads/pthreads/Makefile.inc: First import - 3.23.10 mit-pthreads/pthreads/_exit.c: First import - 3.23.10 mit-pthreads/pthreads/cleanup.c: First import - 3.23.10 mit-pthreads/pthreads/cond.c: First import - 3.23.10 mit-pthreads/pthreads/condattr.c: First import - 3.23.10 mit-pthreads/pthreads/dump_state.c: First import - 3.23.10 mit-pthreads/pthreads/errno.c: First import - 3.23.10 mit-pthreads/pthreads/fd_pipe.c: First import - 3.23.10 mit-pthreads/pthreads/file.c: First import - 3.23.10 mit-pthreads/pthreads/globals.c: First import - 3.23.10 mit-pthreads/pthreads/info.c: First import - 3.23.10 mit-pthreads/pthreads/init.cc: First import - 3.23.10 mit-pthreads/pthreads/malloc.c: First import - 3.23.10 mit-pthreads/pthreads/mutex.c: First import - 3.23.10 mit-pthreads/pthreads/mutexattr.c: First import - 3.23.10 mit-pthreads/pthreads/panic.c: First import - 3.23.10 mit-pthreads/pthreads/prio_queue.c: First import - 3.23.10 mit-pthreads/pthreads/process.c: First import - 3.23.10 mit-pthreads/pthreads/pthread.c: First import - 3.23.10 mit-pthreads/pthreads/pthread_attr.c: First import - 3.23.10 mit-pthreads/pthreads/pthread_cancel.c: First import - 3.23.10 mit-pthreads/pthreads/pthread_detach.c: First import - 3.23.10 mit-pthreads/pthreads/pthread_init.c: First import - 3.23.10 mit-pthreads/pthreads/pthread_join.c: First import - 3.23.10 mit-pthreads/pthreads/pthread_kill.c: First import - 3.23.10 mit-pthreads/pthreads/pthread_once.c: First import - 3.23.10 mit-pthreads/pthreads/queue.c: First import - 3.23.10 mit-pthreads/pthreads/readv.c: First import - 3.23.10 mit-pthreads/pthreads/schedparam.c: First import - 3.23.10 mit-pthreads/pthreads/select.c: First import - 3.23.10 mit-pthreads/pthreads/sig.c: First import - 3.23.10 mit-pthreads/pthreads/sleep.c: First import - 3.23.10 mit-pthreads/pthreads/specific.c: First import - 3.23.10 mit-pthreads/pthreads/stat.c: First import - 3.23.10 mit-pthreads/pthreads/wait.c: First import - 3.23.10 mit-pthreads/pthreads/writev.c: First import - 3.23.10 mit-pthreads/scripts/GNUmakefile.inc: First import - 3.23.10 mit-pthreads/scripts/Makefile.inc: First import - 3.23.10 mit-pthreads/scripts/pgcc.sh: First import - 3.23.10 mit-pthreads/stdio/GNUmakefile.inc: First import - 3.23.10 mit-pthreads/stdio/Makefile.inc: First import - 3.23.10 mit-pthreads/stdio/README: First import - 3.23.10 mit-pthreads/stdio/clrerr.c: First import - 3.23.10 mit-pthreads/stdio/fclose.c: First import - 3.23.10 mit-pthreads/stdio/fdopen.c: First import - 3.23.10 mit-pthreads/stdio/feof.c: First import - 3.23.10 mit-pthreads/stdio/ferror.c: First import - 3.23.10 mit-pthreads/stdio/fflush.c: First import - 3.23.10 mit-pthreads/stdio/fgetc.c: First import - 3.23.10 mit-pthreads/stdio/fgetline.c: First import - 3.23.10 mit-pthreads/stdio/fgetpos.c: First import - 3.23.10 mit-pthreads/stdio/fgets.c: First import - 3.23.10 mit-pthreads/stdio/fileno.c: First import - 3.23.10 mit-pthreads/stdio/findfp.c: First import - 3.23.10 mit-pthreads/stdio/flags.c: First import - 3.23.10 mit-pthreads/stdio/floatio.h: First import - 3.23.10 mit-pthreads/stdio/fopen.c: First import - 3.23.10 mit-pthreads/stdio/fprintf.c: First import - 3.23.10 mit-pthreads/stdio/fpurge.c: First import - 3.23.10 mit-pthreads/stdio/fputc.c: First import - 3.23.10 mit-pthreads/stdio/fputs.c: First import - 3.23.10 mit-pthreads/stdio/fread.c: First import - 3.23.10 mit-pthreads/stdio/freopen.c: First import - 3.23.10 mit-pthreads/stdio/fscanf.c: First import - 3.23.10 mit-pthreads/stdio/fseek.c: First import - 3.23.10 mit-pthreads/stdio/fsetpos.c: First import - 3.23.10 mit-pthreads/stdio/ftell.c: First import - 3.23.10 mit-pthreads/stdio/funopen.c: First import - 3.23.10 mit-pthreads/stdio/fvwrite.c: First import - 3.23.10 mit-pthreads/stdio/fvwrite.h: First import - 3.23.10 mit-pthreads/stdio/fwalk.c: First import - 3.23.10 mit-pthreads/stdio/fwrite.c: First import - 3.23.10 mit-pthreads/stdio/getc.c: First import - 3.23.10 mit-pthreads/stdio/getc_unlocked.c: First import - 3.23.10 mit-pthreads/stdio/getchar.c: First import - 3.23.10 mit-pthreads/stdio/getchar_unlocked.c: First import - 3.23.10 mit-pthreads/stdio/gets.c: First import - 3.23.10 mit-pthreads/stdio/getw.c: First import - 3.23.10 mit-pthreads/stdio/glue.h: First import - 3.23.10 mit-pthreads/stdio/local.h: First import - 3.23.10 mit-pthreads/stdio/makebuf.c: First import - 3.23.10 mit-pthreads/stdio/mktemp.c: First import - 3.23.10 mit-pthreads/stdio/perror.c: First import - 3.23.10 mit-pthreads/stdio/printf.c: First import - 3.23.10 mit-pthreads/stdio/putc.c: First import - 3.23.10 mit-pthreads/stdio/putc_unlocked.c: First import - 3.23.10 mit-pthreads/stdio/putchar.c: First import - 3.23.10 mit-pthreads/stdio/putchar_unlocked.c: First import - 3.23.10 mit-pthreads/stdio/puts.c: First import - 3.23.10 mit-pthreads/stdio/putw.c: First import - 3.23.10 mit-pthreads/stdio/refill.c: First import - 3.23.10 mit-pthreads/stdio/remove.c: First import - 3.23.10 mit-pthreads/stdio/rewind.c: First import - 3.23.10 mit-pthreads/stdio/rget.c: First import - 3.23.10 mit-pthreads/stdio/scanf.c: First import - 3.23.10 mit-pthreads/stdio/setbuf.c: First import - 3.23.10 mit-pthreads/stdio/setbuffer.c: First import - 3.23.10 mit-pthreads/stdio/setvbuf.c: First import - 3.23.10 mit-pthreads/stdio/snprintf.c: First import - 3.23.10 mit-pthreads/stdio/sprintf.c: First import - 3.23.10 mit-pthreads/stdio/sscanf.c: First import - 3.23.10 mit-pthreads/stdio/stdio.c: First import - 3.23.10 mit-pthreads/stdio/strerror.c: First import - 3.23.10 mit-pthreads/stdio/tempnam.c: First import - 3.23.10 mit-pthreads/stdio/tmpfile.c: First import - 3.23.10 mit-pthreads/stdio/tmpnam.c: First import - 3.23.10 mit-pthreads/stdio/ungetc.c: First import - 3.23.10 mit-pthreads/stdio/vfprintf.c: First import - 3.23.10 mit-pthreads/stdio/vfscanf.c: First import - 3.23.10 mit-pthreads/stdio/vprintf.c: First import - 3.23.10 mit-pthreads/stdio/vscanf.c: First import - 3.23.10 mit-pthreads/stdio/vsnprintf.c: First import - 3.23.10 mit-pthreads/stdio/vsprintf.c: First import - 3.23.10 mit-pthreads/stdio/vsscanf.c: First import - 3.23.10 mit-pthreads/stdio/wbuf.c: First import - 3.23.10 mit-pthreads/stdio/wsetup.c: First import - 3.23.10 mit-pthreads/stdio/xprintf.c: First import - 3.23.10 mit-pthreads/stdlib/GNUmakefile.inc: First import - 3.23.10 mit-pthreads/stdlib/Makefile.inc: First import - 3.23.10 mit-pthreads/stdlib/abort.c: First import - 3.23.10 mit-pthreads/stdlib/atexit.h: First import - 3.23.10 mit-pthreads/stdlib/exit.c: First import - 3.23.10 mit-pthreads/stdlib/rand.c: First import - 3.23.10 mit-pthreads/stdlib/random.c: First import - 3.23.10 mit-pthreads/stdlib/strtod.c: First import - 3.23.10 mit-pthreads/stdlib/strtol.c: First import - 3.23.10 mit-pthreads/stdlib/strtoul.c: First import - 3.23.10 mit-pthreads/stdlib/system.c: First import - 3.23.10 mit-pthreads/string/GNUmakefile.inc: First import - 3.23.10 mit-pthreads/string/Makefile.inc: First import - 3.23.10 mit-pthreads/string/strtok.c: First import - 3.23.10 mit-pthreads/tests/Makefile.in: First import - 3.23.10 mit-pthreads/tests/README: First import - 3.23.10 mit-pthreads/tests/bench_fcntl.c: First import - 3.23.10 mit-pthreads/tests/bench_pipe.c: First import - 3.23.10 mit-pthreads/tests/bench_read.c: First import - 3.23.10 mit-pthreads/tests/p_bench_getpid.c: First import - 3.23.10 mit-pthreads/tests/p_bench_mutex.c: First import - 3.23.10 mit-pthreads/tests/p_bench_pthread_create.c: First import - 3.23.10 mit-pthreads/tests/p_bench_read.c: First import - 3.23.10 mit-pthreads/tests/p_bench_semaphore.c: First import - 3.23.10 mit-pthreads/tests/p_bench_yield.c: First import - 3.23.10 mit-pthreads/tests/test_create.c: First import - 3.23.10 mit-pthreads/tests/test_cwd.c: First import - 3.23.10 mit-pthreads/tests/test_execve.c: First import - 3.23.10 mit-pthreads/tests/test_fcntl.c: First import - 3.23.10 mit-pthreads/tests/test_fork.c: First import - 3.23.10 mit-pthreads/tests/test_netdb.c: First import - 3.23.10 mit-pthreads/tests/test_pause.c: First import - 3.23.10 mit-pthreads/tests/test_preemption.c: First import - 3.23.10 mit-pthreads/tests/test_preemption_float.c: First import - 3.23.10 mit-pthreads/tests/test_pthread_cond_timedwait.c: First import - 3.23.10 mit-pthreads/tests/test_pthread_join.c: First import - 3.23.10 mit-pthreads/tests/test_pthread_mutex.c: First import - 3.23.10 mit-pthreads/tests/test_pw.c: First import - 3.23.10 mit-pthreads/tests/test_readdir.c: First import - 3.23.10 mit-pthreads/tests/test_select.c: First import - 3.23.10 mit-pthreads/tests/test_setjmp.c: First import - 3.23.10 mit-pthreads/tests/test_sleep.c: First import - 3.23.10 mit-pthreads/tests/test_sock_1.c: First import - 3.23.10 mit-pthreads/tests/test_sock_2.c: First import - 3.23.10 mit-pthreads/tests/test_sock_2a.c: First import - 3.23.10 mit-pthreads/tests/test_stdio_1.c: First import - 3.23.10 mit-pthreads/tests/test_switch.c: First import - 3.23.10 mysys/COPYING.LIB: First import - 3.23.10 mysys/getopt.c: First import - 3.23.10 readline/COPYING: First import - 3.23.10 readline/INSTALL: First import - 3.23.10 readline/Makefile.am: First import - 3.23.10 readline/README: First import - 3.23.10 readline/ansi_stdlib.h: First import - 3.23.10 readline/bind.c: First import - 3.23.10 readline/callback.c: First import - 3.23.10 readline/chardefs.h: First import - 3.23.10 readline/configure.in: First import - 3.23.10 readline/configure: First import - 3.23.10 readline/display.c: First import - 3.23.10 readline/emacs_keymap.c: First import - 3.23.10 readline/funmap.c: First import - 3.23.10 readline/histexpand.c: First import - 3.23.10 readline/histfile.c: First import - 3.23.10 readline/histlib.h: First import - 3.23.10 readline/history.c: First import - 3.23.10 readline/history.h: First import - 3.23.10 readline/histsearch.c: First import - 3.23.10 readline/input.c: First import - 3.23.10 readline/isearch.c: First import - 3.23.10 readline/keymaps.c: First import - 3.23.10 readline/keymaps.h: First import - 3.23.10 readline/kill.c: First import - 3.23.10 readline/macro.c: First import - 3.23.10 readline/nls.c: First import - 3.23.10 readline/parens.c: First import - 3.23.10 readline/posixdir.h: First import - 3.23.10 readline/posixjmp.h: First import - 3.23.10 readline/posixstat.h: First import - 3.23.10 readline/readline.c: First import - 3.23.10 readline/readline.h: First import - 3.23.10 readline/rlconf.h: First import - 3.23.10 readline/rldefs.h: First import - 3.23.10 readline/rltty.c: First import - 3.23.10 readline/rltty.h: First import - 3.23.10 readline/rlwinsize.h: First import - 3.23.10 readline/search.c: First import - 3.23.10 readline/shell.c: First import - 3.23.10 readline/signals.c: First import - 3.23.10 readline/tcap.h: First import - 3.23.10 readline/terminal.c: First import - 3.23.10 readline/tilde.c: First import - 3.23.10 readline/tilde.h: First import - 3.23.10 readline/undo.c: First import - 3.23.10 readline/util.c: First import - 3.23.10 readline/vi_keymap.c: First import - 3.23.10 readline/vi_mode.c: First import - 3.23.10 readline/xmalloc.c: First import - 3.23.10 regex/CHANGES: First import - 3.23.10 regex/COPYRIGHT: First import - 3.23.10 regex/README: First import - 3.23.10 regex/WHATSNEW: First import - 3.23.10 regex/cclass.h: First import - 3.23.10 regex/cname.h: First import - 3.23.10 regex/debug.c: First import - 3.23.10 regex/debug.ih: First import - 3.23.10 regex/engine.c: First import - 3.23.10 regex/engine.ih: First import - 3.23.10 regex/main.ih: First import - 3.23.10 regex/regcomp.ih: First import - 3.23.10 regex/regerror.c: First import - 3.23.10 regex/regerror.ih: First import - 3.23.10 regex/regex.3: First import - 3.23.10 regex/regex.7: First import - 3.23.10 regex/regex.h: First import - 3.23.10 regex/regfree.c: First import - 3.23.10 regex/reginit.c: First import - 3.23.10 regex/split.c: First import - 3.23.10 regex/tests: First import - 3.23.10 scripts/msql2mysql.sh: First import - 3.23.10 scripts/mysql_fix_privilege_tables.sh: First import - 3.23.10 scripts/mysql_setpermission.sh: First import - 3.23.10 scripts/mysqlaccess.conf: First import - 3.23.10 scripts/mysqlbug.sh: First import - 3.23.10 sql-bench/Data/ATIS/aircraft.txt: First import - 3.23.10 sql-bench/Data/ATIS/airline.txt: First import - 3.23.10 sql-bench/Data/ATIS/airport.txt: First import - 3.23.10 sql-bench/Data/ATIS/airport_service.txt: First import - 3.23.10 sql-bench/Data/ATIS/city.txt: First import - 3.23.10 sql-bench/Data/ATIS/class_of_service.txt: First import - 3.23.10 sql-bench/Data/ATIS/code_description.txt: First import - 3.23.10 sql-bench/Data/ATIS/compound_class.txt: First import - 3.23.10 sql-bench/Data/ATIS/connect_leg.txt: First import - 3.23.10 sql-bench/Data/ATIS/connection.txt: First import - 3.23.10 sql-bench/Data/ATIS/date_day.txt: First import - 3.23.10 sql-bench/Data/ATIS/day_name.txt: First import - 3.23.10 sql-bench/Data/ATIS/dual_carrier.txt: First import - 3.23.10 sql-bench/Data/ATIS/fare.txt: First import - 3.23.10 sql-bench/Data/ATIS/flight.txt: First import - 3.23.10 sql-bench/Data/ATIS/flight_class.txt: First import - 3.23.10 sql-bench/Data/ATIS/flight_day.txt: First import - 3.23.10 sql-bench/Data/ATIS/flight_fare.txt: First import - 3.23.10 sql-bench/Data/ATIS/food_service.txt: First import - 3.23.10 sql-bench/Data/ATIS/ground_service.txt: First import - 3.23.10 sql-bench/Data/ATIS/month_name.txt: First import - 3.23.10 sql-bench/Data/ATIS/restrict_carrier.txt: First import - 3.23.10 sql-bench/Data/ATIS/restrict_class.txt: First import - 3.23.10 sql-bench/Data/ATIS/restriction.txt: First import - 3.23.10 sql-bench/Data/ATIS/state.txt: First import - 3.23.10 sql-bench/Data/ATIS/stop.txt: First import - 3.23.10 sql-bench/Data/ATIS/stop1.txt: First import - 3.23.10 sql-bench/Data/ATIS/time_interval.txt: First import - 3.23.10 sql-bench/Data/ATIS/time_zone.txt: First import - 3.23.10 sql-bench/Data/ATIS/transport.txt: First import - 3.23.10 sql-bench/Data/Wisconsin/onek.data: First import - 3.23.10 sql-bench/Data/Wisconsin/tenk.data: First import - 3.23.10 sql-bench/README: First import - 3.23.10 sql-bench/Results/ATIS-Adabas-Linux_2.0.35_i686-cmp-adabas,mysql: First import - 3.23.10 sql-bench/Results/ATIS-AdabasD-Linux_2.0.35_i686-cmp-adabasd,mysql: First import - 3.23.10 sql-bench/Results/ATIS-msql-Linux_2.2.10_i686-cmp-msql,mysql: First import - 3.23.10 sql-bench/Results/ATIS-mysql-3.21-Linux_2.2.1_i686: First import - 3.23.10 sql-bench/Results/ATIS-mysql-HP_UX_B.10.20_9000_778: First import - 3.23.10 sql-bench/Results/ATIS-mysql-Linux_2.0.35_i686-cmp-adabas,mysql: First import - 3.23.10 sql-bench/Results/ATIS-mysql-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/ATIS-mysql-Linux_2.2.10_i686-cmp-msql,mysql: First import - 3.23.10 sql-bench/Results/ATIS-mysql-Linux_2.2.10_i686: First import - 3.23.10 sql-bench/Results/ATIS-mysql-Linux_2.2.1_i686-cmp-adabas,mysql: First import - 3.23.10 sql-bench/Results/ATIS-mysql-SunOS_5.5.1_sun4u: First import - 3.23.10 sql-bench/Results/ATIS-mysql-SunOS_5.6_sun4m: ***MISSING WEAVE*** sql-bench/Results/ATIS-mysql-SunOS_5.7_sun4m: First import - 3.23.10 sql-bench/Results/ATIS-mysql-SunOS_5.7_sun4u: First import - 3.23.10 sql-bench/Results/ATIS-mysql_3.21-Linux_2.0.35_i686: First import - 3.23.10 sql-bench/Results/ATIS-mysql_fast-Linux_2.2.10_i686-cmp-msql,mysql: First import - 3.23.10 sql-bench/Results/ATIS-mysql_odbc-win98: First import - 3.23.10 sql-bench/Results/ATIS-oracle-Linux_2.0.36_i686-cmp-mysql,oracle: First import - 3.23.10 sql-bench/Results/ATIS-oracle_fast-Linux_2.0.36_i686-cmp-mysql,oracle: First import - 3.23.10 sql-bench/Results/ATIS-pg-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/ATIS-pg_fast-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/ATIS-solid-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/RUN-Adabas-Linux_2.0.35_i686-cmp-adabas,mysql: First import - 3.23.10 sql-bench/Results/RUN-msql-Linux_2.2.10_i686-cmp-msql,mysql: First import - 3.23.10 sql-bench/Results/RUN-mysql-3.21-Linux_2.2.1_i686: First import - 3.23.10 sql-bench/Results/RUN-mysql-HP_UX_B.10.20_9000_778: First import - 3.23.10 sql-bench/Results/RUN-mysql-Linux_2.0.35_i686-cmp-adabas,mysql: First import - 3.23.10 sql-bench/Results/RUN-mysql-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/RUN-mysql-Linux_2.2.10_i686-cmp-msql,mysql: First import - 3.23.10 sql-bench/Results/RUN-mysql-Linux_2.2.10_i686: First import - 3.23.10 sql-bench/Results/RUN-mysql-Linux_2.2.1_i686-cmp-adabas,mysql: First import - 3.23.10 sql-bench/Results/RUN-mysql-SunOS_5.5.1_sun4u: First import - 3.23.10 sql-bench/Results/RUN-mysql-SunOS_5.6_sun4m: ***MISSING WEAVE*** sql-bench/Results/RUN-mysql-SunOS_5.7_sun4m: First import - 3.23.10 sql-bench/Results/RUN-mysql-SunOS_5.7_sun4u: First import - 3.23.10 sql-bench/Results/RUN-mysql_3.21-Linux_2.0.35_i686: First import - 3.23.10 sql-bench/Results/RUN-mysql_fast-Linux_2.2.10_i686-cmp-msql,mysql: First import - 3.23.10 sql-bench/Results/RUN-mysql_odbc-win98: First import - 3.23.10 sql-bench/Results/RUN-oracle-Linux_2.0.36_i686-cmp-mysql,oracle: First import - 3.23.10 sql-bench/Results/RUN-oracle_fast-Linux_2.0.36_i686-cmp-mysql,oracle: First import - 3.23.10 sql-bench/Results/RUN-pg-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/RUN-pg_fast-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/RUN-solid-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/alter-table-Adabas-Linux_2.0.35_i686-cmp-adabas,mysql: First import - 3.23.10 sql-bench/Results/alter-table-AdabasD-Linux_2.0.35_i686-cmp-adabasd,mysql: First import - 3.23.10 sql-bench/Results/alter-table-msql-Linux_2.2.10_i686-cmp-msql,mysql: First import - 3.23.10 sql-bench/Results/alter-table-mysql-3.21-Linux_2.2.1_i686: First import - 3.23.10 sql-bench/Results/alter-table-mysql-HP_UX_B.10.20_9000_778: First import - 3.23.10 sql-bench/Results/alter-table-mysql-Linux_2.0.35_i686-cmp-adabas,mysql: First import - 3.23.10 sql-bench/Results/alter-table-mysql-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/alter-table-mysql-Linux_2.2.10_i686-cmp-msql,mysql: First import - 3.23.10 sql-bench/Results/alter-table-mysql-Linux_2.2.10_i686: First import - 3.23.10 sql-bench/Results/alter-table-mysql-Linux_2.2.1_i686-cmp-adabas,mysql: First import - 3.23.10 sql-bench/Results/alter-table-mysql-SunOS_5.5.1_sun4u: First import - 3.23.10 sql-bench/Results/alter-table-mysql-SunOS_5.6_sun4m: ***MISSING WEAVE*** sql-bench/Results/alter-table-mysql-SunOS_5.7_sun4m: First import - 3.23.10 sql-bench/Results/alter-table-mysql-SunOS_5.7_sun4u: First import - 3.23.10 sql-bench/Results/alter-table-mysql_3.21-Linux_2.0.35_i686: First import - 3.23.10 sql-bench/Results/alter-table-mysql_fast-Linux_2.2.10_i686-cmp-msql,mysql: First import - 3.23.10 sql-bench/Results/alter-table-mysql_odbc-win98: First import - 3.23.10 sql-bench/Results/alter-table-oracle-Linux_2.0.36_i686-cmp-mysql,oracle: First import - 3.23.10 sql-bench/Results/alter-table-oracle_fast-Linux_2.0.36_i686-cmp-mysql,oracle: First import - 3.23.10 sql-bench/Results/alter-table-pg-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/alter-table-pg_fast-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/alter-table-solid-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/big-tables-Adabas-Linux_2.0.35_i686-cmp-adabas,mysql: First import - 3.23.10 sql-bench/Results/big-tables-msql-Linux_2.2.10_i686-cmp-msql,mysql: First import - 3.23.10 sql-bench/Results/big-tables-mysql-3.21-Linux_2.2.1_i686: First import - 3.23.10 sql-bench/Results/big-tables-mysql-HP_UX_B.10.20_9000_778: First import - 3.23.10 sql-bench/Results/big-tables-mysql-Linux_2.0.35_i686-cmp-adabas,mysql: First import - 3.23.10 sql-bench/Results/big-tables-mysql-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/big-tables-mysql-Linux_2.2.10_i686-cmp-msql,mysql: First import - 3.23.10 sql-bench/Results/big-tables-mysql-Linux_2.2.10_i686: First import - 3.23.10 sql-bench/Results/big-tables-mysql-Linux_2.2.1_i686-cmp-adabas,mysql: First import - 3.23.10 sql-bench/Results/big-tables-mysql-SunOS_5.5.1_sun4u: First import - 3.23.10 sql-bench/Results/big-tables-mysql-SunOS_5.6_sun4m: ***MISSING WEAVE*** sql-bench/Results/big-tables-mysql-SunOS_5.7_sun4m: First import - 3.23.10 sql-bench/Results/big-tables-mysql-SunOS_5.7_sun4u: First import - 3.23.10 sql-bench/Results/big-tables-mysql_3.21-Linux_2.0.35_i686: First import - 3.23.10 sql-bench/Results/big-tables-mysql_fast-Linux_2.2.10_i686-cmp-msql,mysql: First import - 3.23.10 sql-bench/Results/big-tables-mysql_odbc-win98: First import - 3.23.10 sql-bench/Results/big-tables-oracle-Linux_2.0.36_i686-cmp-mysql,oracle: First import - 3.23.10 sql-bench/Results/big-tables-oracle_fast-Linux_2.0.36_i686-cmp-mysql,oracle: First import - 3.23.10 sql-bench/Results/big-tables-pg-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/big-tables-pg_fast-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/big-tables-solid-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/connect-Adabas-Linux_2.0.35_i686-cmp-adabas,mysql: First import - 3.23.10 sql-bench/Results/connect-msql-Linux_2.2.10_i686-cmp-msql,mysql: First import - 3.23.10 sql-bench/Results/connect-mysql-3.21-Linux_2.2.1_i686: First import - 3.23.10 sql-bench/Results/connect-mysql-HP_UX_B.10.20_9000_778: First import - 3.23.10 sql-bench/Results/connect-mysql-Linux_2.0.35_i686-cmp-adabas,mysql: First import - 3.23.10 sql-bench/Results/connect-mysql-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/connect-mysql-Linux_2.2.10_i686-cmp-msql,mysql: First import - 3.23.10 sql-bench/Results/connect-mysql-Linux_2.2.10_i686: First import - 3.23.10 sql-bench/Results/connect-mysql-Linux_2.2.1_i686-cmp-adabas,mysql: First import - 3.23.10 sql-bench/Results/connect-mysql-SunOS_5.5.1_sun4u: First import - 3.23.10 sql-bench/Results/connect-mysql-SunOS_5.6_sun4m: ***MISSING WEAVE*** sql-bench/Results/connect-mysql-SunOS_5.7_sun4m: First import - 3.23.10 sql-bench/Results/connect-mysql-SunOS_5.7_sun4u: First import - 3.23.10 sql-bench/Results/connect-mysql_3.21-Linux_2.0.35_i686: First import - 3.23.10 sql-bench/Results/connect-mysql_fast-Linux_2.2.10_i686-cmp-msql,mysql: First import - 3.23.10 sql-bench/Results/connect-mysql_odbc-win98: First import - 3.23.10 sql-bench/Results/connect-oracle-Linux_2.0.36_i686-cmp-mysql,oracle: First import - 3.23.10 sql-bench/Results/connect-pg-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/connect-pg_fast-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/connect-solid-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/create-Adabas-Linux_2.0.35_i686-cmp-adabas,mysql: First import - 3.23.10 sql-bench/Results/create-msql-Linux_2.2.10_i686-cmp-msql,mysql: First import - 3.23.10 sql-bench/Results/create-mysql-3.21-Linux_2.2.1_i686: First import - 3.23.10 sql-bench/Results/create-mysql-HP_UX_B.10.20_9000_778: First import - 3.23.10 sql-bench/Results/create-mysql-Linux_2.0.35_i686-cmp-adabas,mysql: First import - 3.23.10 sql-bench/Results/create-mysql-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/create-mysql-Linux_2.2.10_i686-cmp-msql,mysql: First import - 3.23.10 sql-bench/Results/create-mysql-Linux_2.2.10_i686: First import - 3.23.10 sql-bench/Results/create-mysql-Linux_2.2.1_i686-cmp-adabas,mysql: First import - 3.23.10 sql-bench/Results/create-mysql-SunOS_5.5.1_sun4u: First import - 3.23.10 sql-bench/Results/create-mysql-SunOS_5.6_sun4m: ***MISSING WEAVE*** sql-bench/Results/create-mysql-SunOS_5.7_sun4m: First import - 3.23.10 sql-bench/Results/create-mysql-SunOS_5.7_sun4u: First import - 3.23.10 sql-bench/Results/create-mysql_3.21-Linux_2.0.35_i686: First import - 3.23.10 sql-bench/Results/create-mysql_fast-Linux_2.2.10_i686-cmp-msql,mysql: First import - 3.23.10 sql-bench/Results/create-mysql_odbc-win98: First import - 3.23.10 sql-bench/Results/create-oracle-Linux_2.0.36_i686-cmp-mysql,oracle: First import - 3.23.10 sql-bench/Results/create-oracle_fast-Linux_2.0.36_i686-cmp-mysql,oracle: First import - 3.23.10 sql-bench/Results/create-pg-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/create-pg_fast-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/insert-mysql-HP_UX_B.10.20_9000_778: First import - 3.23.10 sql-bench/Results/select-mysql-HP_UX_B.10.20_9000_778: First import - 3.23.10 sql-bench/Results/wisconsin-mysql-HP_UX_B.10.20_9000_778: First import - 3.23.10 sql/md5.c: First import - 3.23.10 sql/share/norwegian-ny/.cvsignore: First import - 3.23.10 sql/share/norwegian/.cvsignore: First import - 3.23.10 stamp-h.in: First import - 3.23.10 strings/ChangeLog: First import - 3.23.10 strings/bfill.c: First import - 3.23.10 strings/bmove.c: First import - 3.23.10 strings/strend.c: First import - 3.23.10 strings/strstr.c: First import - 3.23.10 strings/strxnmov.c: First import - 3.23.10 tests/auto_increment.res: First import - 3.23.10 tests/auto_increment.tst: First import - 3.23.10 tests/function.res: First import - 3.23.10 tests/function.tst: First import - 3.23.10 tests/grant.res: First import - 3.23.10 tests/lock_test.res: First import - 3.23.10 tests/table_types.pl: First import - 3.23.10 tests/udf_test.res: First import - 3.23.10 tests/udf_test: First import - 3.23.10 sql-bench/Results-linux/ATIS-mysql-Linux_2.0.33_i586-cmp-access,mysql: ***MISSING WEAVE*** sql-bench/Results-linux/ATIS-mysql-Linux_2.0.33_i586-cmp-ms-sql,mysql,sybase: ***MISSING WEAVE*** sql-bench/Results-linux/RUN-mysql-Linux_2.0.33_i586-cmp-access,mysql: ***MISSING WEAVE*** sql-bench/Results-linux/RUN-mysql-Linux_2.0.33_i586-cmp-ms-sql,mysql,sybase: ***MISSING WEAVE*** sql-bench/Results-linux/big-tables-mysql-Linux_2.0.33_i586-cmp-access,mysql: ***MISSING WEAVE*** sql-bench/Results-linux/big-tables-mysql-Linux_2.0.33_i586-cmp-ms-sql,mysql,sybase: ***MISSING WEAVE*** sql-bench/Results-linux/connect-mysql-Linux_2.0.33_i586-cmp-access,mysql: ***MISSING WEAVE*** sql-bench/Results-linux/connect-mysql-Linux_2.0.33_i586-cmp-ms-sql,mysql,sybase: ***MISSING WEAVE*** sql-bench/Results-linux/create-mysql-Linux_2.0.33_i586-cmp-access,mysql: ***MISSING WEAVE*** sql-bench/Results-linux/create-mysql-Linux_2.0.33_i586-cmp-ms-sql,mysql,sybase: ***MISSING WEAVE*** sql-bench/Results-linux/insert-mysql-Linux_2.0.33_i586-cmp-access,mysql: ***MISSING WEAVE*** sql-bench/Results-linux/insert-mysql-Linux_2.0.33_i586-cmp-ms-sql,mysql,sybase: ***MISSING WEAVE*** sql-bench/Results-linux/select-mysql-Linux_2.0.33_i586-cmp-access,mysql: ***MISSING WEAVE*** sql-bench/Results-linux/select-mysql-Linux_2.0.33_i586-cmp-ms-sql,mysql,sybase: ***MISSING WEAVE*** sql-bench/Results-linux/wisconsin-mysql-Linux_2.0.33_i586-cmp-access,mysql: ***MISSING WEAVE*** sql-bench/Results-linux/wisconsin-mysql-Linux_2.0.33_i586-cmp-ms-sql,mysql,sybase: ***MISSING WEAVE*** sql-bench/Results-win32/ATIS-db2_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/ATIS-informix_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/ATIS-ms-sql_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/ATIS-mysql-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/ATIS-mysql_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/ATIS-oracle_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/ATIS-solid_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/ATIS-sybase_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/RUN-db2_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/RUN-informix_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/RUN-ms-sql_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/RUN-mysql-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/RUN-mysql_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/RUN-oracle_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/RUN-solid_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/RUN-sybase_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/alter-table-db2_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/alter-table-informix_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/alter-table-ms-sql_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/alter-table-mysql-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/alter-table-mysql_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/alter-table-oracle_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/alter-table-solid_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/alter-table-sybase_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/big-tables-db2_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/big-tables-informix_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/big-tables-ms-sql_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/big-tables-mysql-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/big-tables-mysql_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/big-tables-oracle_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/big-tables-solid_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/big-tables-sybase_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/connect-db2_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/connect-informix_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/connect-ms-sql_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/connect-mysql-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/connect-mysql_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/connect-oracle_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/connect-solid_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/connect-sybase_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/create-db2_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/create-informix_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/create-ms-sql_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/create-mysql-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/create-mysql_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/create-oracle_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/create-solid_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/create-sybase_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/insert-db2_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/insert-informix_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/insert-ms-sql_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/insert-mysql-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/insert-mysql_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/insert-oracle_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/insert-solid_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/insert-sybase_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/select-db2_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/select-informix_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/select-ms-sql_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/select-mysql-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/select-mysql_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/select-oracle_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/select-solid_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/wisconsin-db2_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/wisconsin-informix_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/wisconsin-ms-sql_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/wisconsin-mysql-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/wisconsin-mysql_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/wisconsin-oracle_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results-win32/wisconsin-solid_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase: First import - 3.23.10 sql-bench/Results/create-solid-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/insert-Adabas-Linux_2.0.35_i686-cmp-adabas,mysql: First import - 3.23.10 sql-bench/Results/insert-msql-Linux_2.2.10_i686-cmp-msql,mysql: First import - 3.23.10 sql-bench/Results/insert-mysql-3.21-Linux_2.2.1_i686: First import - 3.23.10 sql-bench/Results/insert-mysql-Linux_2.0.35_i686-cmp-adabas,mysql: First import - 3.23.10 sql-bench/Results/insert-mysql-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/insert-mysql-Linux_2.2.10_i686-cmp-msql,mysql: First import - 3.23.10 sql-bench/Results/insert-mysql-Linux_2.2.10_i686: First import - 3.23.10 sql-bench/Results/insert-mysql-Linux_2.2.1_i686-cmp-adabas,mysql: First import - 3.23.10 sql-bench/Results/insert-mysql-SunOS_5.5.1_sun4u: First import - 3.23.10 sql-bench/Results/insert-mysql-SunOS_5.6_sun4m: ***MISSING WEAVE*** sql-bench/Results/insert-mysql-SunOS_5.7_sun4m: First import - 3.23.10 sql-bench/Results/insert-mysql-SunOS_5.7_sun4u: First import - 3.23.10 sql-bench/Results/insert-mysql_3.21-Linux_2.0.35_i686: First import - 3.23.10 sql-bench/Results/insert-mysql_fast-Linux_2.2.10_i686-cmp-msql,mysql: First import - 3.23.10 sql-bench/Results/insert-mysql_odbc-win98: First import - 3.23.10 sql-bench/Results/insert-oracle-Linux_2.0.36_i686-cmp-mysql,oracle: First import - 3.23.10 sql-bench/Results/insert-oracle_fast-Linux_2.0.36_i686-cmp-mysql,oracle: First import - 3.23.10 sql-bench/Results/insert-pg-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/insert-pg_fast-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/insert-solid-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/select-Adabas-Linux_2.0.35_i686-cmp-adabas,mysql: First import - 3.23.10 sql-bench/Results/select-msql-Linux_2.2.10_i686-cmp-msql,mysql: First import - 3.23.10 sql-bench/Results/select-mysql-3.21-Linux_2.2.1_i686: First import - 3.23.10 sql-bench/Results/select-mysql-Linux_2.0.35_i686-cmp-adabas,mysql: First import - 3.23.10 sql-bench/Results/select-mysql-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/select-mysql-Linux_2.2.10_i686-cmp-msql,mysql: First import - 3.23.10 sql-bench/Results/select-mysql-Linux_2.2.10_i686: First import - 3.23.10 sql-bench/Results/select-mysql-Linux_2.2.1_i686-cmp-adabas,mysql: First import - 3.23.10 sql-bench/Results/select-mysql-SunOS_5.5.1_sun4u: First import - 3.23.10 sql-bench/Results/select-mysql-SunOS_5.6_sun4m: ***MISSING WEAVE*** sql-bench/Results/select-mysql-SunOS_5.7_sun4m: First import - 3.23.10 sql-bench/Results/select-mysql-SunOS_5.7_sun4u: First import - 3.23.10 sql-bench/Results/select-mysql_3.21-Linux_2.0.35_i686: First import - 3.23.10 sql-bench/Results/select-mysql_fast-Linux_2.2.10_i686-cmp-msql,mysql: First import - 3.23.10 sql-bench/Results/select-mysql_odbc-win98: First import - 3.23.10 sql-bench/Results/select-oracle-Linux_2.0.36_i686-cmp-mysql,oracle: First import - 3.23.10 sql-bench/Results/select-oracle_fast-Linux_2.0.36_i686-cmp-mysql,oracle: First import - 3.23.10 sql-bench/Results/select-pg-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/select-pg_fast-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/select-solid-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/wisconsin-Adabas-Linux_2.0.35_i686-cmp-adabas,mysql: First import - 3.23.10 sql-bench/Results/wisconsin-msql-Linux_2.2.10_i686-cmp-msql,mysql: First import - 3.23.10 sql-bench/Results/wisconsin-mysql-3.21-Linux_2.2.1_i686: First import - 3.23.10 sql-bench/Results/wisconsin-mysql-Linux_2.0.35_i686-cmp-adabas,mysql: First import - 3.23.10 sql-bench/Results/wisconsin-mysql-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/wisconsin-mysql-Linux_2.2.10_i686-cmp-msql,mysql: First import - 3.23.10 sql-bench/Results/wisconsin-mysql-Linux_2.2.10_i686: First import - 3.23.10 sql-bench/Results/wisconsin-mysql-Linux_2.2.1_i686-cmp-adabas,mysql: First import - 3.23.10 sql-bench/Results/wisconsin-mysql-SunOS_5.5.1_sun4u: First import - 3.23.10 sql-bench/Results/wisconsin-mysql-SunOS_5.6_sun4m: ***MISSING WEAVE*** sql-bench/Results/wisconsin-mysql-SunOS_5.7_sun4m: First import - 3.23.10 sql-bench/Results/wisconsin-mysql-SunOS_5.7_sun4u: First import - 3.23.10 sql-bench/Results/wisconsin-mysql_3.21-Linux_2.0.35_i686: First import - 3.23.10 sql-bench/Results/wisconsin-mysql_fast-Linux_2.2.10_i686-cmp-msql,mysql: First import - 3.23.10 sql-bench/Results/wisconsin-mysql_odbc-win98: First import - 3.23.10 sql-bench/Results/wisconsin-oracle-Linux_2.0.36_i686-cmp-mysql,oracle: First import - 3.23.10 sql-bench/Results/wisconsin-oracle_fast-Linux_2.0.36_i686-cmp-mysql,oracle: First import - 3.23.10 sql-bench/Results/wisconsin-pg-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/wisconsin-pg_fast-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/Results/wisconsin-solid-Linux_2.0.36_i686-cmp-mysql,pg,solid: First import - 3.23.10 sql-bench/limits/Adabas.cfg: First import - 3.23.10 sql-bench/limits/Adabas.comment: First import - 3.23.10 sql-bench/limits/Informix.cfg: First import - 3.23.10 sql-bench/limits/Informix.comment: First import - 3.23.10 sql-bench/limits/access.comment: First import - 3.23.10 sql-bench/limits/access_odbc.cfg: First import - 3.23.10 sql-bench/limits/db2.cfg: First import - 3.23.10 sql-bench/limits/empress.cfg: First import - 3.23.10 sql-bench/limits/empress.comment: First import - 3.23.10 sql-bench/limits/ms-sql65.cfg: First import - 3.23.10 sql-bench/limits/msql.cfg: First import - 3.23.10 sql-bench/limits/mysql-3.22.cfg: First import - 3.23.10 sql-bench/limits/pg.comment: First import - 3.23.10 sql-bench/limits/solid-nt4.cfg: First import - 3.23.10 sql-bench/limits/solid.cfg: First import - 3.23.10 sql-bench/limits/sybase.cfg: First import - 3.23.10 support-files/binary-configure.sh: First import - 3.23.10 support-files/mysql-log-rotate.sh: First import - 3.23.10 mkinstalldirs: Update to 3.23.11 Docs/mysqld_error.txt: Update to 3.23.11 man/mysql.1: Update to 3.23.11 mysys/ChangeLog: Update to 3.23.11 scripts/mysqlaccess.sh: Update to 3.23.11 strings/Attic/ptr_cmp.c: Update to 3.23.11 dbug/dbug_analyze.c: Update for 3.23.12 dbug/doinstall.sh: Update for 3.23.12 dbug/install.sh: Update for 3.23.12 dbug/mklintlib.sh: Update for 3.23.12 dbug/qmake.cmd: Update for 3.23.12 dbug/vargs.h: Update for 3.23.12 isam/test_all.res: Update for 3.23.12 isam/test_all: Update for 3.23.12 myisam/NEWS: Update for 3.23.12 myisam/common_words: ***MISSING WEAVE*** myisam/mi_test_all.res: Update for 3.23.12 myisam/test_pack: Update for 3.23.12 scripts/safe_mysqld-watch.sh: Update for 3.23.12 sql/ha_hash.h: Update for 3.23.12 sql/nt_servc.h: Update for 3.23.12 strings/READ-ME: Update for 3.23.12 strings/bzero.c: Update for 3.23.12 strings/latin2.def: Update for 3.23.12 strings/memset.c: Update for 3.23.12 strings/strcat.c: Update for 3.23.12 strings/strchr.c: Update for 3.23.12 strings/strcmp.c: Update for 3.23.12 strings/string.doc: Update for 3.23.12 strings/strings-not-used.h: Update for 3.23.12 strings/strlen.c: Update for 3.23.12 strings/strrchr.c: Update for 3.23.12 strings/t_ctype.h: Update for 3.23.12 Build-tools/Do-create-perl-rpms: Initial checkin of MySQL build environment. Build-tools/Do-local-patch-file: Initial checkin of MySQL build environment. Build-tools/newest: Initial checkin of MySQL build environment. Docs/MySQL-logos/mysql-01.gif: Initial checkin of MySQL build environment. Docs/MySQL-logos/mysql-02.gif: Initial checkin of MySQL build environment. Docs/MySQL-logos/mysql-03.gif: Initial checkin of MySQL build environment. Docs/MySQL-logos/mysql-04.gif: Initial checkin of MySQL build environment. Docs/MySQL-logos/mysql-05.gif: Initial checkin of MySQL build environment. Docs/MySQL-logos/mysql-06.gif: Initial checkin of MySQL build environment. Docs/MySQL-logos/mysql-07.gif: Initial checkin of MySQL build environment. Docs/MySQL-logos/mysql-08.gif: Initial checkin of MySQL build environment. Docs/MySQL-logos/mysql-09.gif: Initial checkin of MySQL build environment. Docs/MySQL-logos/mysql-10.gif: Initial checkin of MySQL build environment. Docs/MySQL-logos/mysql-11.gif: Initial checkin of MySQL build environment. Docs/MySQL-logos/mysql-12.gif: Initial checkin of MySQL build environment. Docs/MySQL-logos/mysql-13.gif: Initial checkin of MySQL build environment. Docs/MySQL-logos/mysql-14.gif: Initial checkin of MySQL build environment. Docs/MySQL-logos/mysql-15.gif: Initial checkin of MySQL build environment. Docs/MySQL-logos/mysql-16.gif: Initial checkin of MySQL build environment. Docs/MySQL-logos/mysql-17.gif: Initial checkin of MySQL build environment. Docs/MySQL-logos/mysql-compatible.jpg: Initial checkin of MySQL build environment. Docs/MySQL-logos/mysql_anim-01.gif: Initial checkin of MySQL build environment. Docs/MySQL-logos/mysql_anim-02.gif: Initial checkin of MySQL build environment. Docs/MySQL-logos/mysql_anim-03.gif: Initial checkin of MySQL build environment. Docs/MySQL-logos/mysql_anim-04.gif: Initial checkin of MySQL build environment. Docs/MySQL-logos/mysql_anim-05.gif: Initial checkin of MySQL build environment. Docs/MySQL-logos/mysql_anim-06.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/afghanistan.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/albania.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/algeria.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/andorra.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/angola.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/antartica.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/antigua-and-barbuda.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/argentina.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/armenia.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/australia.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/austria.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/azerbaijan.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/bahamas.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/bahrein.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/bangladesh.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/barbados.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/belarus.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/belgium.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/belize.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/benin.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/bermuda.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/bhutan.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/bolivia.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/bosnia-and-herzegovina.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/botswana.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/brazil.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/brunei.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/bulgaria.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/burkina-faso.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/burma.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/burundi.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/cambodia.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/cameroon.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/canada.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/cape-verde.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/central-african-republic.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/chad.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/chile.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/china.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/colombia.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/comoros.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/congo.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/costa-rica.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/cote-d-ivoire.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/croatia.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/cuba.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/cyprus.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/czech-republic.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/denmark-original-incorrect.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/denmark.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/djibouti.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/dominica.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/dominican-republic.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/ecuador.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/egypt.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/el-salvador.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/equatorial-guinea.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/eritrea.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/estonia.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/ethiopia.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/fiji.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/finland.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/france.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/gabon.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/gambia.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/georgia.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/germany.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/ghana.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/great-britain.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/greece.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/greenland.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/grenada.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/guatemala.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/guinea-bissau.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/guinea.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/guyana.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/haiti.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/honduras.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/hungary.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/iceland.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/india.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/indonesia.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/iran.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/iraq.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/ireland.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/israel.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/italy.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/jamaica.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/japan.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/jordan.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/kazakhstan.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/kenya.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/kiribati.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/kuwait.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/kyrgyzstan.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/laos.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/latvia.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/lebanon.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/lesotho.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/liberia.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/libya.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/liechtenstein.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/lithuania.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/luxembourg.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/macedonia.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/madagascar.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/malawi.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/malaysia.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/maldives.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/mali.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/malta.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/marshall.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/mauritania.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/mauritius.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/mexico.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/micronesia.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/moldova.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/monaco.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/mongolia.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/morocco.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/mozambique.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/namibia.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/nauru.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/nepal.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/netherlands.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/new-zealand.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/nicaragua.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/niger.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/nigeria.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/north-korea.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/norway.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/oman.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/pakistan.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/panama.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/papua-new-guinea.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/paraguay.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/peru.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/philippines.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/poland.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/portugal.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/qatar.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/romania.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/russia.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/rwanda.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/saint-kitts-and-nevis.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/saint-lucia.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/samoa.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/sao-tome-and-principe.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/saudi-arabia.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/senegal.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/seychelles.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/sierra-leone.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/singapore.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/slovakia.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/slovenia.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/solomon-islands.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/somalia.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/south-africa.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/south-korea.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/spain.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/sri-lanka.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/sudan.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/suriname.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/swaziland.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/sweden.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/sweden2.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/switzerland.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/syria.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/taiwan.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/tajikistan.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/tanzania.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/thailand.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/togo.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/tonga.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/trinidad-and-tobago.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/tunisia.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/turkey.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/turkmenistan.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/tuvalu.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/uganda.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/ukraine.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/united-arab-emirates.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/united-states-of-america.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/uruguay.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/usa.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/uzbekistan.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/vanuatu.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/venezuela.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/vietnam.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/vincent-and-grenadines.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/yemen.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/yugoslavia.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/zaire.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/zambia.gif: Initial checkin of MySQL build environment. Docs/Raw-Flags/zimbabwe.gif: Initial checkin of MySQL build environment. Docs/Support/generate-flag-images: Initial checkin of MySQL build environment. Docs/Support/generate-mirror-listing.pl: Initial checkin of MySQL build environment. Docs/Support/generate-text-files.pl: Initial checkin of MySQL build environment. Docs/Support/make-makefile: Initial checkin of MySQL build environment. Docs/Support/texinfo.tex: Initial checkin of MySQL build environment. Docs/Translations/myodbc-br.texi: Initial checkin of MySQL build environment. man/.cvsignore: Initial checkin of MySQL build environment. mit-pthreads/include/pthread/config.h: Initial checkin of MySQL build environment. readline/.cvsignore: Initial checkin of MySQL build environment. sql/share/.cvsignore: Initial checkin of MySQL build environment. tests/.cvsignore: Initial checkin of MySQL build environment. libmysql/acconfig.h: ***MISSING WEAVE*** libmysql/acinclude.m4: Configure stuff for libmysql. libmysql/configure.in: Configure stuff for libmysql. mit-pthreads/.cvsignore: More work on initial build mit-pthreads/include/pthread/cond.h: Update to 3.23.12 mit-pthreads/machdep/engine-i386-linux-2.0.c: Update to 3.23.12 mit-pthreads/machdep/engine-i386-linux-2.0.h: Update to 3.23.12 mit-pthreads/machdep/posix-linux-2.0.h: Update to 3.23.12 mit-pthreads/machdep/unistd-i386-linux-2.0.h: Update to 3.23.12 sql/add_errmsg: Update to 3.23.12 sql/watchdog_mysqld: Update to 3.23.12 strings/Attic/memory.h: Update to 3.23.12 dbug/.cvsignore: Update to 3.23.12 heap/.cvsignore: Update to 3.23.12 merge/.cvsignore: Update to 3.23.12 mit-pthreads/bin/.cvsignore: Update to 3.23.12 mit-pthreads/bin/finger/.cvsignore: Update to 3.23.12 mit-pthreads/lib/.cvsignore: Update to 3.23.12 mit-pthreads/lib/libpthreadutil/.cvsignore: Update to 3.23.12 mit-pthreads/machdep/linux-2.0/__math.h: Update to 3.23.12 mit-pthreads/machdep/linux-2.0/__path.h: Update to 3.23.12 mit-pthreads/machdep/linux-2.0/__signal.h: Update to 3.23.12 mit-pthreads/machdep/linux-2.0/__stdio.h: Update to 3.23.12 mit-pthreads/machdep/linux-2.0/__stdlib.h: Update to 3.23.12 mit-pthreads/machdep/linux-2.0/__string.h: Update to 3.23.12 mit-pthreads/machdep/linux-2.0/__time.h: Update to 3.23.12 mit-pthreads/machdep/linux-2.0/cdefs.h: Update to 3.23.12 mit-pthreads/machdep/linux-2.0/compat.h: Update to 3.23.12 mit-pthreads/machdep/linux-2.0/dirent.h: Update to 3.23.12 mit-pthreads/machdep/linux-2.0/errno.h: Update to 3.23.12 mit-pthreads/machdep/linux-2.0/socket.h: Update to 3.23.12 mit-pthreads/machdep/linux-2.0/socketcall.h: Update to 3.23.12 mit-pthreads/machdep/linux-2.0/timers.h: Update to 3.23.12 mit-pthreads/machdep/linux-2.0/uio.h: Update to 3.23.12 mit-pthreads/machdep/linux-2.0/wait.h: Update to 3.23.12 mit-pthreads/tests/.cvsignore: Update to 3.23.12 myisammrg/.cvsignore: Update to 3.23.12 regex/.cvsignore: Update to 3.23.12 mit-pthreads/machdep/linux-2.0/extra/bits/local_lim.h: Update to 3.23.12 mit-pthreads/machdep/linux-2.0/extra/bits/socket.h: Update to 3.23.12 vio/.cvsignore: Update for 3.23.12 vio/Vio.cc: Update for 3.23.12 vio/VioAcceptorFd.cc: Update for 3.23.12 vio/VioAcceptorFd.h: Update for 3.23.12 vio/VioConnectorFd.cc: Update for 3.23.12 vio/VioConnectorFd.h: Update for 3.23.12 vio/VioFd.cc: Update for 3.23.12 vio/VioFd.h: Update for 3.23.12 vio/VioPipe.cc: Update for 3.23.12 vio/VioSSL.cc: Update for 3.23.12 vio/VioSSL.h: Update for 3.23.12 vio/VioSSLAcceptorFd.cc: Update for 3.23.12 vio/VioSSLFactoriesFd.cc: Update for 3.23.12 vio/VioSSLFactoriesFd.h: Update for 3.23.12 vio/VioSocket.cc: Update for 3.23.12 vio/VioSocket.h: Update for 3.23.12 vio/version.cc: Update for 3.23.12 vio/vio-global.h: Update for 3.23.12 vio/vioelitexx.cc: Update for 3.23.12 vio/viotest-ssl.cc: Update for 3.23.12 vio/viotest-sslconnect.cc: Update for 3.23.12 vio/viotest.cc: Update for 3.23.12 vio/viotypes.h: Update for 3.23.12 strings/strxmov.c: Update to 3.23.12a sql/md5.h: Lots of patches for Alpha-Linux Docs/Images/empty.png: *** empty log message *** Docs/Images/flag-background.pnm: *** empty log message *** NEW-RPMS/.cvsignore: Changes for new build environment sql-bench/example.bat: Update for 3.23.12a sql-bench/pwd.bat: Update for 3.23.12a sql-bench/uname.bat: Update for 3.23.12a sql-bench/Results/Attic/ATIS-mysql-Linux_2.2.12_20smp_i686: ***MISSING WEAVE*** sql-bench/Results/Attic/RUN-mysql-Linux_2.2.12_20smp_i686: ***MISSING WEAVE*** sql-bench/Results/Attic/alter-table-mysql-Linux_2.2.12_20smp_i686: ***MISSING WEAVE*** sql-bench/Results/Attic/big-tables-mysql-Linux_2.2.12_20smp_i686: ***MISSING WEAVE*** sql-bench/Results/Attic/connect-mysql-Linux_2.2.12_20smp_i686: ***MISSING WEAVE*** sql-bench/Results/Attic/create-mysql-Linux_2.2.12_20smp_i686: ***MISSING WEAVE*** sql-bench/Results/Attic/insert-mysql-Linux_2.2.12_20smp_i686: ***MISSING WEAVE*** sql-bench/Results/Attic/select-mysql-Linux_2.2.12_20smp_i686: ***MISSING WEAVE*** sql-bench/Results/Attic/wisconsin-mysql-Linux_2.2.12_20smp_i686: ***MISSING WEAVE*** sql-bench/Results-linux/ATIS-mysql-Linux_2.2.12_20smp_i686: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/ATIS-mysql-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/ATIS-mysql-Linux_dynamic: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/ATIS-mysql-Linux_pgcc: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/ATIS-mysql-Linux_static: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/ATIS-mysql_fast-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/ATIS-mysql_local_tcp-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/ATIS-mysql_new-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/RUN-mysql-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/RUN-mysql-Linux_dynamic: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/RUN-mysql-Linux_pgcc: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/RUN-mysql-Linux_static: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/RUN-mysql_fast-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/RUN-mysql_local_tcp-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/RUN-mysql_new-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/big-tables-mysql-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/big-tables-mysql-Linux_dynamic: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/big-tables-mysql-Linux_pgcc: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/big-tables-mysql-Linux_static: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/big-tables-mysql_fast-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/big-tables-mysql_local_tcp-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/big-tables-mysql_new-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/connect-mysql-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/connect-mysql-Linux_dynamic: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/connect-mysql-Linux_pgcc: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/connect-mysql-Linux_static: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/connect-mysql_fast-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/connect-mysql_local_tcp-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/connect-mysql_new-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/create-mysql-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/create-mysql-Linux_dynamic: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/create-mysql-Linux_pgcc: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/create-mysql-Linux_static: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/create-mysql_fast-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/create-mysql_local_tcp-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/create-mysql_new-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/insert-mysql-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/insert-mysql-Linux_dynamic: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/insert-mysql-Linux_pgcc: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/insert-mysql-Linux_static: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/insert-mysql_fast-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/insert-mysql_local_tcp-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/insert-mysql_new-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/select-mysql-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/select-mysql-Linux_dynamic: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/select-mysql-Linux_pgcc: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/select-mysql-Linux_static: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/select-mysql_fast-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/select-mysql_local_tcp-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/select-mysql_new-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/wisconsin-mysql-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/wisconsin-mysql-Linux_dynamic: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/wisconsin-mysql-Linux_pgcc: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/wisconsin-mysql-Linux_static: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/wisconsin-mysql_fast-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/wisconsin-mysql_local_tcp-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/Attic/wisconsin-mysql_new-Linux_2.0.33_i586: ***MISSING WEAVE*** sql-bench/Results-linux/alter-table-mysql-Linux_2.2.12_20smp_i686: ***MISSING WEAVE*** sql-bench/Results-linux/big-tables-mysql-Linux_2.2.12_20smp_i686: ***MISSING WEAVE*** sql-bench/Results-linux/connect-mysql-Linux_2.2.12_20smp_i686: ***MISSING WEAVE*** sql-bench/Results-linux/insert-mysql-Linux_2.2.12_20smp_i686: ***MISSING WEAVE*** sql-bench/Results-linux/select-mysql-Linux_2.2.12_20smp_i686: ***MISSING WEAVE*** sql-bench/Results-linux/wisconsin-mysql-Linux_2.2.12_20smp_i686: ***MISSING WEAVE*** sql-bench/.cvsignore: Update of benchmarks sql-bench/Results-win32/ATIS-access_odbc-win98-cmp-access,mysql: Update of benchmarks sql-bench/Results-win32/ATIS-mysql-win98-cmp-access,mysql: Update of benchmarks sql-bench/Results-win32/RUN-access_odbc-win98-cmp-access,mysql: Update of benchmarks sql-bench/Results-win32/RUN-mysql-win98-cmp-access,mysql: Update of benchmarks sql-bench/Results-win32/alter-table-access_odbc-win98-cmp-access,mysql: Update of benchmarks sql-bench/Results-win32/alter-table-mysql-win98-cmp-access,mysql: Update of benchmarks sql-bench/Results-win32/big-tables-access_odbc-win98-cmp-access,mysql: Update of benchmarks sql-bench/Results-win32/big-tables-mysql-win98-cmp-access,mysql: Update of benchmarks sql-bench/Results-win32/connect-access_odbc-win98-cmp-access,mysql: Update of benchmarks sql-bench/Results-win32/connect-mysql-win98-cmp-access,mysql: Update of benchmarks sql-bench/Results-win32/create-access_odbc-win98-cmp-access,mysql: Update of benchmarks sql-bench/Results-win32/create-mysql-win98-cmp-access,mysql: Update of benchmarks sql-bench/Results-win32/insert-access_odbc-win98-cmp-access,mysql: Update of benchmarks sql-bench/Results-win32/insert-mysql-win98-cmp-access,mysql: Update of benchmarks sql-bench/Results-win32/select-access_odbc-win98-cmp-access,mysql: Update of benchmarks sql-bench/Results-win32/select-mysql-win98-cmp-access,mysql: Update of benchmarks sql-bench/Results-win32/wisconsin-access_odbc-win98-cmp-access,mysql: Update of benchmarks sql-bench/Results-win32/wisconsin-mysql-win98-cmp-access,mysql: Update of benchmarks sql-bench/Results-linux/RUN-mysql-Linux_2.2.12_20smp_i686: ***MISSING WEAVE*** sql-bench/Results-linux/create-mysql-Linux_2.2.12_20smp_i686: ***MISSING WEAVE*** Docs/Images/Attic/mysql5.gif: Second copy Docs/Images/Attic/html-fs.gif: Moved to web...icons Docs/Images/Attic/mysql-01.gif: Moved to web...icons Docs/Images/Attic/mysql-02.gif: Moved to web...icons Docs/Images/Attic/mysql-03.gif: Moved to web...icons Docs/Images/Attic/mysql-04.gif: Moved to web...icons Docs/Images/Attic/mysql-05.gif: Moved to web...icons Docs/Images/Attic/mysql-06.gif: Moved to web...icons Docs/Images/Attic/mysql-07.gif: Moved to web...icons Docs/Images/Attic/mysql-08.gif: Moved to web...icons Docs/Images/Attic/mysql-09.gif: Moved to web...icons Docs/Images/Attic/mysql-10.gif: Moved to web...icons Docs/Images/Attic/mysql-11.gif: Moved to web...icons Docs/Images/Attic/mysql-12.gif: Moved to web...icons Docs/Images/Attic/mysql-13.gif: Moved to web...icons Docs/Images/Attic/mysql-14.gif: Moved to web...icons Docs/Images/Attic/mysql-15.gif: Moved to web...icons Docs/Images/Attic/mysql-16.gif: Moved to web...icons Docs/Images/Attic/mysql-17.gif: Moved to web...icons Docs/Images/Attic/mysql-18.gif: Moved to web...icons Docs/Images/Attic/mysql-19.gif: Moved to web...icons Docs/Images/Attic/mysql-compatible.jpg: Moved to web...icons Docs/Images/Attic/mysql_anim-01.gif: Moved to web...icons Docs/Images/Attic/mysql_anim-02.gif: Moved to web...icons Docs/Images/Attic/mysql_anim-03.gif: Moved to web...icons Docs/Images/Attic/mysql_anim-04.gif: Moved to web...icons Docs/Images/Attic/mysql_anim-05.gif: Moved to web...icons Docs/Images/Attic/mysql_anim-06.gif: Moved to web...icons Docs/Images/Attic/powered-by-MySQL-transparent.gif: Moved to web...icons scripts/mysql_zap.sh: Fixes from the Debian maintainer Build-tools/Do-patch-file: Update at work myisam/TODO: Fixes for raid + other things regex/utils.h: Renamed some portability defines heap/make-ccc: First version isam/make-ccc: First version merge/make-ccc: First version myisam/make-ccc: First version myisammrg/make-ccc: First version mysys/make-ccc: First version regex/make-ccc: First version strings/make-ccc: First version sql/share/romanian/errmsg.sys: ***MISSING WEAVE*** Docs/manual-license-spanish.texi: Update to 3.23.13 BUILD/test-alpha-ccc: Bug patches from mailing list sql-bench/Results-win32/ATIS-mysql-win98: Bug patches from mailing list sql-bench/Results-win32/RUN-mysql-win98: Bug patches from mailing list sql-bench/Results-win32/alter-table-mysql-win98: Bug patches from mailing list sql-bench/Results-win32/big-tables-mysql-win98: Bug patches from mailing list sql-bench/Results-win32/connect-mysql-win98: Bug patches from mailing list sql-bench/Results-win32/create-mysql-win98: Bug patches from mailing list sql-bench/Results-win32/insert-mysql-win98: Bug patches from mailing list sql-bench/Results-win32/select-mysql-win98: Bug patches from mailing list sql-bench/Results-win32/wisconsin-mysql-win98: Bug patches from mailing list mit-pthreads/Changes-mysql: Updated for Linux mit-pthreads/config/config.h.in: Updated for Linux mit-pthreads/config/configure.in: Updated for Linux mit-pthreads/config/configure: Updated for Linux mit-pthreads/gen/ttyname.c: Updated for Linux mit-pthreads/machdep/syscall-i386-linux-2.0.S: Updated for Linux mit-pthreads/machdep/linux-2.0/__unistd.h: Updated for Linux mit-pthreads/net/Makefile.inc: Updated for Linux mit-pthreads/pthreads/fd.c: Updated for Linux mit-pthreads/pthreads/fd_kern.c: Updated for Linux mit-pthreads/pthreads/fd_sysv.c: Updated for Linux mit-pthreads/pthreads/signal.c: Updated for Linux mit-pthreads/pthreads/wrapper.c: Updated for Linux mit-pthreads/stdlib/getopt.c: Updated for Linux sql/share/charsets/cp1251.conf: Updates for 3.23.14 sql/share/charsets/croat.conf: Updates for 3.23.14 sql/share/charsets/danish.conf: Updates for 3.23.14 sql/share/charsets/dec8.conf: Updates for 3.23.14 sql/share/charsets/dos.conf: Updates for 3.23.14 sql/share/charsets/german1.conf: Updates for 3.23.14 sql/share/charsets/greek.conf: Updates for 3.23.14 sql/share/charsets/hebrew.conf: Updates for 3.23.14 sql/share/charsets/hp8.conf: Updates for 3.23.14 sql/share/charsets/hungarian.conf: Updates for 3.23.14 sql/share/charsets/koi8_ru.conf: Updates for 3.23.14 sql/share/charsets/koi8_ukr.conf: Updates for 3.23.14 sql/share/charsets/latin1.conf: Updates for 3.23.14 sql/share/charsets/latin2.conf: Updates for 3.23.14 sql/share/charsets/swe7.conf: Updates for 3.23.14 sql/share/charsets/usa7.conf: Updates for 3.23.14 sql/share/charsets/win1251.conf: Updates for 3.23.14 sql/share/charsets/win1251ukr.conf: Updates for 3.23.14 sql/Attic/mybinlogdump.cc: Fix for binary log include/Attic/m_ctype.h.in: Update for dynamic character sets strings/Attic/ct_init.c: Update for dynamic character sets strings/Attic/ctype-cp1251.c: Update for dynamic character sets strings/Attic/ctype-cp1257.c: Update for dynamic character sets strings/Attic/ctype-croat.c: Update for dynamic character sets strings/Attic/ctype-danish.c: Update for dynamic character sets strings/Attic/ctype-dec8.c: Update for dynamic character sets strings/Attic/ctype-dos.c: Update for dynamic character sets strings/Attic/ctype-estonia.c: Update for dynamic character sets strings/Attic/ctype-german1.c: Update for dynamic character sets strings/Attic/ctype-greek.c: Update for dynamic character sets strings/Attic/ctype-hebrew.c: Update for dynamic character sets strings/Attic/ctype-hp8.c: Update for dynamic character sets strings/Attic/ctype-hungarian.c: Update for dynamic character sets strings/Attic/ctype-koi8_ru.c: Update for dynamic character sets strings/Attic/ctype-koi8_ukr.c: Update for dynamic character sets strings/Attic/ctype-latin1.c: Update for dynamic character sets strings/Attic/ctype-latin2.c: Update for dynamic character sets strings/Attic/ctype-swe7.c: Update for dynamic character sets strings/Attic/ctype-usa7.c: Update for dynamic character sets strings/Attic/ctype-win1250.c: Update for dynamic character sets strings/Attic/ctype-win1251.c: Update for dynamic character sets strings/Attic/ctype-win1251ukr.c: Update for dynamic character sets mysys/.cvsignore: Update for dynamic character set handling client/Attic/libmysql.c: Update of new character sets. sql/share/charsets/Index: Update to 3.23.14 sql/share/charsets/README: Update to 3.23.14 sql/share/charsets/cp1257.conf: Update to 3.23.14 sql/share/charsets/estonia.conf: Update to 3.23.14 sql/share/charsets/win1250.conf: Update to 3.23.14 strings/.cvsignore: Update to 3.23.14 strings/Attic/bootstrap-ctype.c: Update to 3.23.14 strings/Attic/ctype.c.in: Update to 3.23.14 strings/ctype-ujis.c: Update to 3.23.14 BUILD/.cvsignore: Portability changes libmysql/.cvsignore: Portability changes mit-pthreads/GNUmakefile: Modifications to get MySQL 3.23.14 to build mit-pthreads/config.flags: ***MISSING WEAVE*** mit-pthreads/include/pthread/ac-types.h: Modifications to get MySQL 3.23.14 to build mit-pthreads/include/pthread/paths.h: Modifications to get MySQL 3.23.14 to build regex/main.c: Portability fixes sql/Attic/mini_client_errors.c: fixed up dependencies and symlinking in mini_client Build-tools/cvs-sanity-check: added a script to do a build from fresh CVS for sanity checking - make Tim, Tonu, and everybody else who has had problems with the stuff out of CVS not compiling happy include/t_ctype.h: Small updates by monty include/.cvsignore: Update to 3.23.15 include/mysql_version.h.in: Update to 3.23.15 isam/ChangeLog: Update to 3.23.15 sql-bench/limits/interbase.cfg: character sets patches + fix of order by sql-bench/Results-linux/ATIS-interbase-Linux_2.2.14_5.0_i686: ***MISSING WEAVE*** sql-bench/Results-linux/RUN-interbase-Linux_2.2.14_5.0_i686: ***MISSING WEAVE*** sql-bench/Results-linux/alter-table-interbase-Linux_2.2.14_5.0_i686: ***MISSING WEAVE*** sql-bench/Results-linux/big-tables-interbase-Linux_2.2.14_5.0_i686: ***MISSING WEAVE*** sql-bench/Results-linux/create-interbase-Linux_2.2.14_5.0_i686: ***MISSING WEAVE*** sql-bench/Results-linux/insert-interbase-Linux_2.2.14_5.0_i686: ***MISSING WEAVE*** sql-bench/Results-linux/select-interbase-Linux_2.2.14_5.0_i686: ***MISSING WEAVE*** sql-bench/Results-linux/wisconsin-interbase-Linux_2.2.14_5.0_i686: ***MISSING WEAVE*** Docs/net_doc.txt: Fixes for Win32 sql/share/Makefile.am: Update at work to get MySQL to configure include/Attic/mysql_com.h.in: Update of benchmarks and other small stuff sql-bench/Results-linux/ATIS-interbase-Linux_2.2.14_5.0_i686-cmp-interbase,mysql: ***MISSING WEAVE*** sql-bench/Results-linux/ATIS-mysql-Linux_2.2.14_5.0_i686-cmp-interbase,mysql: ***MISSING WEAVE*** sql-bench/Results-linux/RUN-interbase-Linux_2.2.14_5.0_i686-cmp-interbase,mysql: ***MISSING WEAVE*** sql-bench/Results-linux/RUN-mysql-Linux_2.2.14_5.0_i686-cmp-interbase,mysql: ***MISSING WEAVE*** sql-bench/Results-linux/alter-table-interbase-Linux_2.2.14_5.0_i686-cmp-interbase,mysql: ***MISSING WEAVE*** sql-bench/Results-linux/alter-table-mysql-Linux_2.2.14_5.0_i686-cmp-interbase,mysql: ***MISSING WEAVE*** sql-bench/Results-linux/big-tables-interbase-Linux_2.2.14_5.0_i686-cmp-interbase,mysql: ***MISSING WEAVE*** sql-bench/Results-linux/big-tables-mysql-Linux_2.2.14_5.0_i686-cmp-interbase,mysql: ***MISSING WEAVE*** sql-bench/Results-linux/connect-interbase-Linux_2.2.14_5.0_i686-cmp-interbase,mysql: ***MISSING WEAVE*** sql-bench/Results-linux/connect-interbase-Linux_2.2.14_5.0_i686: ***MISSING WEAVE*** sql-bench/Results-linux/connect-mysql-Linux_2.2.14_5.0_i686-cmp-interbase,mysql: ***MISSING WEAVE*** sql-bench/Results-linux/create-interbase-Linux_2.2.14_5.0_i686-cmp-interbase,mysql: ***MISSING WEAVE*** sql-bench/Results-linux/create-mysql-Linux_2.2.14_5.0_i686-cmp-interbase,mysql: ***MISSING WEAVE*** sql-bench/Results-linux/insert-interbase-Linux_2.2.14_5.0_i686-cmp-interbase,mysql: ***MISSING WEAVE*** sql-bench/Results-linux/insert-mysql-Linux_2.2.14_5.0_i686-cmp-interbase,mysql: ***MISSING WEAVE*** sql-bench/Results-linux/select-interbase-Linux_2.2.14_5.0_i686-cmp-interbase,mysql: ***MISSING WEAVE*** sql-bench/Results-linux/select-mysql-Linux_2.2.14_5.0_i686-cmp-interbase,mysql: ***MISSING WEAVE*** sql-bench/Results-linux/wisconsin-interbase-Linux_2.2.14_5.0_i686-cmp-interbase,mysql: ***MISSING WEAVE*** sql-bench/Results-linux/wisconsin-mysql-Linux_2.2.14_5.0_i686-cmp-interbase,mysql: ***MISSING WEAVE*** sql-bench/limits/mimer.cfg: Update of benchmarks and other small stuff sql/Attic/mini_client.c: Update to get Berkeley db to work. sql/Attic/net_serv.c: Update to get Berkeley db to work. sql/Attic/lex_hash.h: lex_hash.h is a pain in the neck for cvs diff scripts/mysql_convert_table_format.sh: Update for 3.23.16 include/getopt.h: Update for 3.23.16 Docs/Support/.cvsignore: Update for build scripts/mysqlhotcopy.sh: Update for 3.23.16 Docs/Attic/myisam.doc: Mirror addition, Broken Image fix, renamed myisam.doc -> myisam.txt (because it's really text. :). Docs/myisam.txt: Mirror addition, Broken Image fix, renamed myisam.doc -> myisam.txt (because it's really text. :). sql-bench/ChangeLog: Updates for 3.23.17 tests/big_record.pl: Updates for 3.23.17 tests/export.pl: Updates for 3.23.17 tests/fork2_test.pl: Updates for 3.23.17 tests/fork3_test.pl: Updates for 3.23.17 tests/fork_test.pl: Updates for 3.23.17 tests/grant.pl: Updates for 3.23.17 tests/insert_and_repair.pl: Updates for 3.23.17 tests/lock_test.pl: Updates for 3.23.17 tests/pmail.pl: Updates for 3.23.17 sql/.cvsignore: Update for 3.23.17 sql-bench/Results/Attic/ATIS-mysql-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/ATIS-mysql-Linux_2.2.1_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/ATIS-mysql_fast-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/ATIS-pg-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/ATIS-pg_fast-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/RUN-mysql-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/RUN-mysql-Linux_2.2.1_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/RUN-mysql_fast-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/RUN-pg-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/RUN-pg_fast-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/alter-table-mysql-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/alter-table-mysql-Linux_2.2.1_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/alter-table-mysql_fast-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/alter-table-pg-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/alter-table-pg_fast-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/big-tables-mysql-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/big-tables-mysql-Linux_2.2.1_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/big-tables-mysql_fast-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/big-tables-pg-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/big-tables-pg_fast-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/connect-mysql-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/connect-mysql-Linux_2.2.1_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/connect-mysql_fast-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/connect-pg-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/connect-pg_fast-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/create-mysql-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/create-mysql-Linux_2.2.1_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/create-mysql_fast-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/create-pg-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/create-pg_fast-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/insert-mysql-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/insert-mysql-Linux_2.2.1_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/insert-mysql_fast-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/insert-pg-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/insert-pg_fast-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/select-mysql-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/select-mysql-Linux_2.2.1_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/select-mysql_fast-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/select-pg-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/select-pg_fast-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/wisconsin-mysql-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/wisconsin-mysql-Linux_2.2.1_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/wisconsin-mysql_fast-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/wisconsin-pg-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/Attic/wisconsin-pg_fast-Linux_2.2.10_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/ATIS-pg-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/RUN-pg-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/alter-table-pg-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/big-tables-pg-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/connect-pg-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/create-pg-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/insert-pg-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/select-pg-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/wisconsin-pg-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** support-files/Attic/my-example.cnf.sh: Updates to 3.23.17 support-files/Attic/my-huge.cfg.sh: Update for 3.23.17 support-files/Attic/my-large.cfg.sh: Update for 3.23.17 support-files/Attic/my-medium.cfg.sh: Update for 3.23.17 support-files/Attic/my-small.cfg.sh: Update for 3.23.17 sql-bench/limits/pg.cfg: Updates to 3.23.17 support-files/my-small.cnf.sh: Updates to 3.23.17 dbug/dbug.c: update 3.23.17 for Monty mysys/getopt1.c: update 3.23.17 for Monty readline/complete.c: update 3.23.17 for Monty regex/regcomp.c: update 3.23.17 for Monty regex/regex2.h: update 3.23.17 for Monty regex/regexec.c: update 3.23.17 for Monty regex/regexp.c: update 3.23.17 for Monty sql-bench/Results/ATIS-mysql-win98: update 3.23.17 for Monty sql-bench/Results/RUN-mysql-win98: update 3.23.17 for Monty sql-bench/Results/alter-table-mysql-win98: update 3.23.17 for Monty sql-bench/Results/big-tables-mysql-win98: update 3.23.17 for Monty sql-bench/Results/connect-mysql-win98: update 3.23.17 for Monty sql-bench/Results/create-mysql-win98: update 3.23.17 for Monty sql-bench/Results/insert-mysql-win98: update 3.23.17 for Monty sql-bench/Results/select-mysql-win98: update 3.23.17 for Monty sql-bench/Results/wisconsin-mysql-win98: update 3.23.17 for Monty sql-bench/Results-linux/ATIS-mysql_fast-Linux_2.2.13_SMP_alpha: ***MISSING WEAVE*** sql-bench/Results-linux/alter-table-mysql_fast-Linux_2.2.13_SMP_alpha: ***MISSING WEAVE*** sql-bench/Results-linux/big-tables-mysql_fast-Linux_2.2.13_SMP_alpha: ***MISSING WEAVE*** sql-bench/Results-linux/create-mysql_fast-Linux_2.2.13_SMP_alpha: ***MISSING WEAVE*** sql-bench/Results-linux/insert-mysql_fast-Linux_2.2.13_SMP_alpha: ***MISSING WEAVE*** sql-bench/Results-linux/wisconsin-mysql_fast-Linux_2.2.13_SMP_alpha: ***MISSING WEAVE*** tests/test_delayed_insert.pl: update 3.23.17 for Monty vio/Vio.h: update 3.23.17 for Monty vio/VioPipe.h: update 3.23.17 for Monty vio/violite.h: update 3.23.17 for Monty sql-bench/limits/access.cfg: Update for 3.23.17 sql-bench/limits/ms-sql.cfg: Update for 3.23.17 sql-bench/limits/oracle.cfg: Update for 3.23.17 BUILD/compile-alpha-ccc: Update to 3.23.18 BUILD/compile-alpha-debug: Update to 3.23.18 BUILD/compile-alpha: Update to 3.23.18 BUILD/compile-pentium-gcov: Update to 3.23.18 BUILD/compile-pentium-myodbc: Update to 3.23.18 BUILD/compile-pentium: Update to 3.23.18 BUILD/compile-solaris-sparc-purify: Update to 3.23.18 BUILD/compile-solaris-sparc: Update to 3.23.18 client/Attic/net.c: Update to 3.23.18 sql-bench/Results/ATIS-mysql-Linux_2.2.14_i686_xeon: Update to 3.23.18 sql-bench/Results/RUN-mysql-Linux_2.2.14_i686_xeon: Update to 3.23.18 sql-bench/Results/alter-table-mysql-Linux_2.2.14_i686_xeon: Update to 3.23.18 sql-bench/Results/big-tables-mysql-Linux_2.2.14_i686_xeon: Update to 3.23.18 sql-bench/Results/connect-mysql-Linux_2.2.14_i686_xeon: Update to 3.23.18 sql-bench/Results/create-mysql-Linux_2.2.14_i686_xeon: Update to 3.23.18 sql-bench/Results/insert-mysql-Linux_2.2.14_i686_xeon: Update to 3.23.18 sql-bench/Results/select-mysql-Linux_2.2.14_i686_xeon: Update to 3.23.18 sql-bench/Results/wisconsin-mysql-Linux_2.2.14_i686_xeon: Update to 3.23.18 sql-bench/Results-linux/RUN-mysql_fast-Linux_2.2.13_SMP_alpha: ***MISSING WEAVE*** sql-bench/Results-linux/connect-mysql_fast-Linux_2.2.13_SMP_alpha: ***MISSING WEAVE*** sql-bench/Results-linux/select-mysql_fast-Linux_2.2.13_SMP_alpha: ***MISSING WEAVE*** mysql-test/mybin/mysql-test_install_db: Initial checkin of mysql-test subdir. mysql-test/mysql-test-run: Quick commit before I checkout a new tree. Docs/Tutorial-MySQL-final.txt: Update for 3.23.19-beta Build-tools/Do-rpm: Fix of wrong CVS update sql-bench/Results/ATIS-mysql-NT_4.0: Fix of wrong CVS update sql-bench/Results/RUN-mysql-NT_4.0: Fix of wrong CVS update sql-bench/Results/alter-table-mysql-NT_4.0: Fix of wrong CVS update sql-bench/Results/big-tables-mysql-NT_4.0: Fix of wrong CVS update sql-bench/Results/connect-mysql-NT_4.0: Fix of wrong CVS update sql-bench/Results/create-mysql-NT_4.0: Fix of wrong CVS update sql-bench/Results/insert-mysql-NT_4.0: Fix of wrong CVS update sql-bench/Results/select-mysql-NT_4.0: Fix of wrong CVS update sql-bench/Results/wisconsin-mysql-NT_4.0: Fix of wrong CVS update acconfig.h: Change of copyright to GPL/LGPL client/.cvsignore: Change of copyright to GPL/LGPL client/completion_hash.h: Change of copyright to GPL/LGPL client/connect_test.c: Change of copyright to GPL/LGPL client/errmsg.c: Change of copyright to GPL/LGPL client/insert_test.c: Change of copyright to GPL/LGPL client/list_test.c: Change of copyright to GPL/LGPL client/my_readline.h: Change of copyright to GPL/LGPL client/password.c: Change of copyright to GPL/LGPL client/readline.cc: Change of copyright to GPL/LGPL client/select_test.c: Change of copyright to GPL/LGPL client/showdb_test.c: Change of copyright to GPL/LGPL client/sql_string.cc: Change of copyright to GPL/LGPL client/sql_string.h: Change of copyright to GPL/LGPL client/ssl_test.c: Change of copyright to GPL/LGPL client/thread_test.c: Change of copyright to GPL/LGPL client/violite.c: Change of copyright to GPL/LGPL dbug/Makefile.am: Change of copyright to GPL/LGPL extra/comp_err.c: Change of copyright to GPL/LGPL extra/perror.c: Change of copyright to GPL/LGPL extra/replace.c: Change of copyright to GPL/LGPL extra/resolveip.c: Change of copyright to GPL/LGPL heap/Makefile.am: Change of copyright to GPL/LGPL heap/_check.c: Change of copyright to GPL/LGPL heap/_rectest.c: Change of copyright to GPL/LGPL heap/heapdef.h: Change of copyright to GPL/LGPL heap/hp_block.c: Change of copyright to GPL/LGPL heap/hp_clear.c: Change of copyright to GPL/LGPL heap/hp_close.c: Change of copyright to GPL/LGPL heap/hp_create.c: Change of copyright to GPL/LGPL heap/hp_delete.c: Change of copyright to GPL/LGPL heap/hp_extra.c: Change of copyright to GPL/LGPL heap/hp_hash.c: Change of copyright to GPL/LGPL heap/hp_info.c: Change of copyright to GPL/LGPL heap/hp_open.c: Change of copyright to GPL/LGPL heap/hp_panic.c: Change of copyright to GPL/LGPL heap/hp_rename.c: Change of copyright to GPL/LGPL heap/hp_rfirst.c: Change of copyright to GPL/LGPL heap/hp_rlast.c: Change of copyright to GPL/LGPL heap/hp_rnext.c: Change of copyright to GPL/LGPL heap/hp_rprev.c: Change of copyright to GPL/LGPL heap/hp_rrnd.c: Change of copyright to GPL/LGPL heap/hp_rsame.c: Change of copyright to GPL/LGPL heap/hp_scan.c: Change of copyright to GPL/LGPL heap/hp_static.c: Change of copyright to GPL/LGPL heap/hp_test1.c: Change of copyright to GPL/LGPL heap/hp_test2.c: Change of copyright to GPL/LGPL heap/hp_update.c: Change of copyright to GPL/LGPL heap/hp_write.c: Change of copyright to GPL/LGPL include/dbug.h: Change of copyright to GPL/LGPL include/hash.h: Change of copyright to GPL/LGPL include/heap.h: Change of copyright to GPL/LGPL include/m_ctype.h: Change of copyright to GPL/LGPL include/m_string.h: Change of copyright to GPL/LGPL include/merge.h: Change of copyright to GPL/LGPL include/my_alarm.h: Change of copyright to GPL/LGPL include/my_dir.h: Change of copyright to GPL/LGPL include/my_list.h: Change of copyright to GPL/LGPL include/my_net.h: Change of copyright to GPL/LGPL include/my_no_pthread.h: Change of copyright to GPL/LGPL include/my_nosys.h: Change of copyright to GPL/LGPL include/my_pthread.h: Change of copyright to GPL/LGPL include/my_sys.h: Change of copyright to GPL/LGPL include/my_tree.h: Change of copyright to GPL/LGPL include/myisammrg.h: Change of copyright to GPL/LGPL include/myisampack.h: Change of copyright to GPL/LGPL include/mysys_err.h: Change of copyright to GPL/LGPL include/nisam.h: Change of copyright to GPL/LGPL include/queues.h: Change of copyright to GPL/LGPL include/raid.h: Change of copyright to GPL/LGPL include/sslopt-case.h: Change of copyright to GPL/LGPL include/sslopt-longopts.h: Change of copyright to GPL/LGPL include/sslopt-usage.h: Change of copyright to GPL/LGPL include/sslopt-vars.h: Change of copyright to GPL/LGPL include/thr_alarm.h: Change of copyright to GPL/LGPL include/thr_lock.h: Change of copyright to GPL/LGPL include/violite.h: Change of copyright to GPL/LGPL isam/Makefile.am: Change of copyright to GPL/LGPL isam/_cache.c: Change of copyright to GPL/LGPL isam/_dynrec.c: Change of copyright to GPL/LGPL isam/_key.c: Change of copyright to GPL/LGPL isam/_locking.c: Change of copyright to GPL/LGPL isam/_packrec.c: Change of copyright to GPL/LGPL isam/_page.c: Change of copyright to GPL/LGPL isam/_search.c: Change of copyright to GPL/LGPL isam/_statrec.c: Change of copyright to GPL/LGPL isam/changed.c: Change of copyright to GPL/LGPL isam/close.c: Change of copyright to GPL/LGPL isam/create.c: Change of copyright to GPL/LGPL isam/delete.c: Change of copyright to GPL/LGPL isam/extra.c: Change of copyright to GPL/LGPL isam/isamchk.c: Change of copyright to GPL/LGPL isam/isamlog.c: Change of copyright to GPL/LGPL isam/log.c: Change of copyright to GPL/LGPL isam/open.c: Change of copyright to GPL/LGPL isam/pack_isam.c: Change of copyright to GPL/LGPL isam/panic.c: Change of copyright to GPL/LGPL isam/range.c: Change of copyright to GPL/LGPL isam/rfirst.c: Change of copyright to GPL/LGPL isam/rkey.c: Change of copyright to GPL/LGPL isam/rlast.c: Change of copyright to GPL/LGPL isam/rnext.c: Change of copyright to GPL/LGPL isam/rprev.c: Change of copyright to GPL/LGPL isam/rrnd.c: Change of copyright to GPL/LGPL isam/rsame.c: Change of copyright to GPL/LGPL isam/rsamepos.c: Change of copyright to GPL/LGPL isam/sort.c: Change of copyright to GPL/LGPL isam/static.c: Change of copyright to GPL/LGPL isam/test1.c: Change of copyright to GPL/LGPL isam/test3.c: Change of copyright to GPL/LGPL libmysql/Makefile.am: Change of copyright to GPL/LGPL libmysql/conf_to_src.c: Change of copyright to GPL/LGPL libmysql/dll.c: Change of copyright to GPL/LGPL libmysql/get_password.c: Change of copyright to GPL/LGPL libmysql/password.c: Change of copyright to GPL/LGPL libmysql/violite.c: Change of copyright to GPL/LGPL man/Makefile.am: Change of copyright to GPL/LGPL merge/Makefile.am: Change of copyright to GPL/LGPL merge/_locking.c: Change of copyright to GPL/LGPL merge/close.c: Change of copyright to GPL/LGPL merge/create.c: Change of copyright to GPL/LGPL merge/delete.c: Change of copyright to GPL/LGPL merge/extra.c: Change of copyright to GPL/LGPL merge/info.c: Change of copyright to GPL/LGPL merge/mrgdef.h: Change of copyright to GPL/LGPL merge/open.c: Change of copyright to GPL/LGPL merge/panic.c: Change of copyright to GPL/LGPL merge/rrnd.c: Change of copyright to GPL/LGPL merge/rsame.c: Change of copyright to GPL/LGPL merge/static.c: Change of copyright to GPL/LGPL merge/update.c: Change of copyright to GPL/LGPL myisam/ft_eval.c: Change of copyright to GPL/LGPL myisam/ft_eval.h: Change of copyright to GPL/LGPL myisam/ft_parser.c: Change of copyright to GPL/LGPL myisam/ft_static.c: Change of copyright to GPL/LGPL myisam/ft_stem.c: Change of copyright to GPL/LGPL myisam/ft_stopwords.c: Change of copyright to GPL/LGPL myisam/ft_test1.c: Change of copyright to GPL/LGPL myisam/ft_test1.h: Change of copyright to GPL/LGPL myisam/ftdefs.h: Change of copyright to GPL/LGPL myisam/fulltext.h: Change of copyright to GPL/LGPL myisam/mi_cache.c: Change of copyright to GPL/LGPL myisam/mi_changed.c: Change of copyright to GPL/LGPL myisam/mi_checksum.c: Change of copyright to GPL/LGPL myisam/mi_dbug.c: Change of copyright to GPL/LGPL myisam/mi_delete_all.c: Change of copyright to GPL/LGPL myisam/mi_delete_table.c: Change of copyright to GPL/LGPL myisam/mi_dynrec.c: Change of copyright to GPL/LGPL myisam/mi_info.c: Change of copyright to GPL/LGPL myisam/mi_key.c: Change of copyright to GPL/LGPL myisam/mi_packrec.c: Change of copyright to GPL/LGPL myisam/mi_page.c: Change of copyright to GPL/LGPL myisam/mi_range.c: Change of copyright to GPL/LGPL myisam/mi_rename.c: Change of copyright to GPL/LGPL myisam/mi_rfirst.c: Change of copyright to GPL/LGPL myisam/mi_rkey.c: Change of copyright to GPL/LGPL myisam/mi_rlast.c: Change of copyright to GPL/LGPL myisam/mi_rnext.c: Change of copyright to GPL/LGPL myisam/mi_rprev.c: Change of copyright to GPL/LGPL myisam/mi_rrnd.c: Change of copyright to GPL/LGPL myisam/mi_rsame.c: Change of copyright to GPL/LGPL myisam/mi_rsamepos.c: Change of copyright to GPL/LGPL myisam/mi_scan.c: Change of copyright to GPL/LGPL myisam/mi_static.c: Change of copyright to GPL/LGPL myisam/mi_statrec.c: Change of copyright to GPL/LGPL myisam/mi_test1.c: Change of copyright to GPL/LGPL myisam/mi_test2.c: Change of copyright to GPL/LGPL myisam/mi_test3.c: Change of copyright to GPL/LGPL myisam/mi_unique.c: Change of copyright to GPL/LGPL myisam/myisamlog.c: Change of copyright to GPL/LGPL myisam/sort.c: Change of copyright to GPL/LGPL myisammrg/Makefile.am: Change of copyright to GPL/LGPL myisammrg/mymrgdef.h: Change of copyright to GPL/LGPL myisammrg/myrg_close.c: Change of copyright to GPL/LGPL myisammrg/myrg_create.c: Change of copyright to GPL/LGPL myisammrg/myrg_delete.c: Change of copyright to GPL/LGPL myisammrg/myrg_extra.c: Change of copyright to GPL/LGPL myisammrg/myrg_info.c: Change of copyright to GPL/LGPL myisammrg/myrg_locking.c: Change of copyright to GPL/LGPL myisammrg/myrg_open.c: Change of copyright to GPL/LGPL myisammrg/myrg_panic.c: Change of copyright to GPL/LGPL myisammrg/myrg_rrnd.c: Change of copyright to GPL/LGPL myisammrg/myrg_rsame.c: Change of copyright to GPL/LGPL myisammrg/myrg_static.c: Change of copyright to GPL/LGPL myisammrg/myrg_update.c: Change of copyright to GPL/LGPL mysys/Makefile.am: Change of copyright to GPL/LGPL mysys/array.c: Change of copyright to GPL/LGPL mysys/charset.c: Change of copyright to GPL/LGPL mysys/checksum.c: Change of copyright to GPL/LGPL mysys/default.c: Change of copyright to GPL/LGPL mysys/errors.c: Change of copyright to GPL/LGPL mysys/getvar.c: Change of copyright to GPL/LGPL mysys/hash.c: Change of copyright to GPL/LGPL mysys/list.c: Change of copyright to GPL/LGPL mysys/make-conf.c: Change of copyright to GPL/LGPL mysys/mf_brkhant.c: Change of copyright to GPL/LGPL mysys/mf_cache.c: Change of copyright to GPL/LGPL mysys/mf_casecnv.c: Change of copyright to GPL/LGPL mysys/mf_dirname.c: Change of copyright to GPL/LGPL mysys/mf_fn_ext.c: Change of copyright to GPL/LGPL mysys/mf_format.c: Change of copyright to GPL/LGPL mysys/mf_getdate.c: Change of copyright to GPL/LGPL mysys/mf_iocache.c: Change of copyright to GPL/LGPL mysys/mf_keycache.c: Change of copyright to GPL/LGPL mysys/mf_loadpath.c: Change of copyright to GPL/LGPL mysys/mf_pack2.c: Change of copyright to GPL/LGPL mysys/mf_path.c: Change of copyright to GPL/LGPL mysys/mf_qsort.c: Change of copyright to GPL/LGPL mysys/mf_qsort2.c: Change of copyright to GPL/LGPL mysys/mf_radix.c: Change of copyright to GPL/LGPL mysys/mf_reccache.c: ***MISSING WEAVE*** mysys/mf_same.c: Change of copyright to GPL/LGPL mysys/mf_sleep.c: Change of copyright to GPL/LGPL mysys/mf_sort.c: Change of copyright to GPL/LGPL mysys/mf_soundex.c: Change of copyright to GPL/LGPL mysys/mf_stripp.c: Change of copyright to GPL/LGPL mysys/mf_unixpath.c: Change of copyright to GPL/LGPL mysys/mf_util.c: Change of copyright to GPL/LGPL mysys/mf_wcomp.c: Change of copyright to GPL/LGPL mysys/mf_wfile.c: Change of copyright to GPL/LGPL mysys/mulalloc.c: Change of copyright to GPL/LGPL mysys/my_alarm.c: Change of copyright to GPL/LGPL mysys/my_alloc.c: Change of copyright to GPL/LGPL mysys/my_append.c: Change of copyright to GPL/LGPL mysys/my_chsize.c: Change of copyright to GPL/LGPL mysys/my_clock.c: Change of copyright to GPL/LGPL mysys/my_compress.c: Change of copyright to GPL/LGPL mysys/my_copy.c: Change of copyright to GPL/LGPL mysys/my_create.c: Change of copyright to GPL/LGPL mysys/my_delete.c: Change of copyright to GPL/LGPL mysys/my_div.c: Change of copyright to GPL/LGPL mysys/my_error.c: Change of copyright to GPL/LGPL mysys/my_fopen.c: Change of copyright to GPL/LGPL mysys/my_fstream.c: Change of copyright to GPL/LGPL mysys/my_getwd.c: Change of copyright to GPL/LGPL mysys/my_init.c: Change of copyright to GPL/LGPL mysys/my_lib.c: Change of copyright to GPL/LGPL mysys/my_lock.c: Change of copyright to GPL/LGPL mysys/my_lockmem.c: Change of copyright to GPL/LGPL mysys/my_lread.c: Change of copyright to GPL/LGPL mysys/my_lwrite.c: Change of copyright to GPL/LGPL mysys/my_malloc.c: Change of copyright to GPL/LGPL mysys/my_messnc.c: Change of copyright to GPL/LGPL mysys/my_mkdir.c: Change of copyright to GPL/LGPL mysys/my_net.c: Change of copyright to GPL/LGPL mysys/my_once.c: Change of copyright to GPL/LGPL mysys/my_open.c: Change of copyright to GPL/LGPL mysys/my_pread.c: Change of copyright to GPL/LGPL mysys/my_pthread.c: Change of copyright to GPL/LGPL mysys/my_quick.c: Change of copyright to GPL/LGPL mysys/my_read.c: Change of copyright to GPL/LGPL mysys/my_realloc.c: Change of copyright to GPL/LGPL mysys/my_redel.c: Change of copyright to GPL/LGPL mysys/my_rename.c: Change of copyright to GPL/LGPL mysys/my_seek.c: Change of copyright to GPL/LGPL mysys/my_static.c: Change of copyright to GPL/LGPL mysys/my_static.h: Change of copyright to GPL/LGPL mysys/my_tempnam.c: Change of copyright to GPL/LGPL mysys/my_vsnprintf.c: Change of copyright to GPL/LGPL mysys/my_wincond.c: Change of copyright to GPL/LGPL mysys/my_winthread.c: Change of copyright to GPL/LGPL mysys/my_write.c: Change of copyright to GPL/LGPL mysys/mysys_priv.h: Change of copyright to GPL/LGPL mysys/ptr_cmp.c: Change of copyright to GPL/LGPL mysys/queues.c: Change of copyright to GPL/LGPL mysys/raid.cc: Change of copyright to GPL/LGPL mysys/safemalloc.c: Change of copyright to GPL/LGPL mysys/string.c: Change of copyright to GPL/LGPL mysys/test_charset.c: Change of copyright to GPL/LGPL mysys/test_dir.c: Change of copyright to GPL/LGPL mysys/test_fn.c: Change of copyright to GPL/LGPL mysys/test_vsnprintf.c: Change of copyright to GPL/LGPL mysys/testhash.c: Change of copyright to GPL/LGPL mysys/thr_alarm.c: Change of copyright to GPL/LGPL mysys/thr_lock.c: Change of copyright to GPL/LGPL mysys/thr_mutex.c: Change of copyright to GPL/LGPL mysys/thr_rwlock.c: Change of copyright to GPL/LGPL mysys/tree.c: Change of copyright to GPL/LGPL mysys/typelib.c: Change of copyright to GPL/LGPL regex/Makefile.am: Change of copyright to GPL/LGPL sql/cache_manager.cc: Change of copyright to GPL/LGPL sql/cache_manager.h: Change of copyright to GPL/LGPL sql/convert.cc: Change of copyright to GPL/LGPL sql/custom_conf.h: Change of copyright to GPL/LGPL sql/derror.cc: Change of copyright to GPL/LGPL sql/field_conv.cc: Change of copyright to GPL/LGPL sql/frm_crypt.cc: Change of copyright to GPL/LGPL sql/ha_heap.cc: Change of copyright to GPL/LGPL sql/ha_heap.h: Change of copyright to GPL/LGPL sql/ha_isam.cc: Change of copyright to GPL/LGPL sql/ha_isammrg.cc: Change of copyright to GPL/LGPL sql/hash_filo.cc: Change of copyright to GPL/LGPL sql/hash_filo.h: Change of copyright to GPL/LGPL sql/hostname.cc: Change of copyright to GPL/LGPL sql/init.cc: Change of copyright to GPL/LGPL sql/item_buff.cc: Change of copyright to GPL/LGPL sql/item_cmpfunc.h: Change of copyright to GPL/LGPL sql/item_create.cc: Change of copyright to GPL/LGPL sql/item_create.h: Change of copyright to GPL/LGPL sql/item_strfunc.cc: Change of copyright to GPL/LGPL sql/item_strfunc.h: Change of copyright to GPL/LGPL sql/item_sum.cc: Change of copyright to GPL/LGPL sql/item_sum.h: Change of copyright to GPL/LGPL sql/item_uniq.cc: Change of copyright to GPL/LGPL sql/item_uniq.h: Change of copyright to GPL/LGPL sql/key.cc: Change of copyright to GPL/LGPL sql/lex_symbol.h: Change of copyright to GPL/LGPL sql/lock.cc: Change of copyright to GPL/LGPL sql/matherr.c: Change of copyright to GPL/LGPL sql/mf_iocache.cc: Change of copyright to GPL/LGPL sql/mini_client.h: Change of copyright to GPL/LGPL sql/my_lock.c: Change of copyright to GPL/LGPL sql/opt_sum.cc: Change of copyright to GPL/LGPL sql/password.c: Change of copyright to GPL/LGPL sql/procedure.cc: Change of copyright to GPL/LGPL sql/procedure.h: Change of copyright to GPL/LGPL sql/sql_acl.h: Change of copyright to GPL/LGPL sql/sql_analyse.cc: Change of copyright to GPL/LGPL sql/sql_cache.cc: Change of copyright to GPL/LGPL sql/sql_crypt.cc: Change of copyright to GPL/LGPL sql/sql_crypt.h: Change of copyright to GPL/LGPL sql/sql_list.cc: Change of copyright to GPL/LGPL sql/sql_list.h: Change of copyright to GPL/LGPL sql/sql_map.cc: Change of copyright to GPL/LGPL sql/sql_map.h: Change of copyright to GPL/LGPL sql/sql_string.h: Change of copyright to GPL/LGPL sql/sql_test.cc: Change of copyright to GPL/LGPL sql/sql_udf.cc: Change of copyright to GPL/LGPL sql/sql_udf.h: Change of copyright to GPL/LGPL sql/thr_malloc.cc: Change of copyright to GPL/LGPL sql/udf_example.cc: Change of copyright to GPL/LGPL sql/unireg.cc: Change of copyright to GPL/LGPL sql/unireg.h: Change of copyright to GPL/LGPL sql/violite.c: Change of copyright to GPL/LGPL sql-bench/Makefile.am: Change of copyright to GPL/LGPL sql-bench/bench-init.pl.sh: Change of copyright to GPL/LGPL sql-bench/copy-db.sh: Change of copyright to GPL/LGPL sql-bench/run-all-tests.sh: Change of copyright to GPL/LGPL sql-bench/server-cfg.sh: Change of copyright to GPL/LGPL sql-bench/test-ATIS.sh: Change of copyright to GPL/LGPL sql-bench/test-alter-table.sh: Change of copyright to GPL/LGPL sql-bench/test-big-tables.sh: Change of copyright to GPL/LGPL sql-bench/test-connect.sh: Change of copyright to GPL/LGPL sql-bench/test-create.sh: Change of copyright to GPL/LGPL sql-bench/test-insert.sh: Change of copyright to GPL/LGPL sql-bench/test-select.sh: Change of copyright to GPL/LGPL sql-bench/test-wisconsin.sh: Change of copyright to GPL/LGPL sql-bench/Results/ATIS-mysql-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/ATIS-mysql_fast-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/ATIS-pg_fast-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/ATIS-pg_fast-Linux_2.2.14_5.0_i686: ***MISSING WEAVE*** sql-bench/Results/RUN-mysql-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/RUN-mysql_fast-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/RUN-pg_fast-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/RUN-pg_fast-Linux_2.2.14_5.0_i686: ***MISSING WEAVE*** sql-bench/Results/alter-table-mysql-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/alter-table-mysql_fast-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/alter-table-pg_fast-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/alter-table-pg_fast-Linux_2.2.14_5.0_i686: ***MISSING WEAVE*** sql-bench/Results/big-tables-mysql-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/big-tables-mysql_fast-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/big-tables-pg_fast-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/big-tables-pg_fast-Linux_2.2.14_5.0_i686: ***MISSING WEAVE*** sql-bench/Results/connect-mysql-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/connect-mysql_fast-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/connect-pg_fast-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/connect-pg_fast-Linux_2.2.14_5.0_i686: ***MISSING WEAVE*** sql-bench/Results/create-mysql-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/create-mysql_fast-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/create-pg_fast-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/create-pg_fast-Linux_2.2.14_5.0_i686: ***MISSING WEAVE*** sql-bench/Results/insert-mysql-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/insert-mysql_fast-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/insert-pg_fast-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/select-mysql-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/select-mysql_fast-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/select-pg_fast-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/wisconsin-mysql-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/wisconsin-mysql_fast-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** sql-bench/Results/wisconsin-pg_fast-Linux_2.2.14_5.0_i686-cmp-mysql,pg: ***MISSING WEAVE*** strings/Makefile.am: Change of copyright to GPL/LGPL strings/README: Change of copyright to GPL/LGPL strings/atof.c: Change of copyright to GPL/LGPL strings/bchange.c: Change of copyright to GPL/LGPL strings/bcmp.c: Change of copyright to GPL/LGPL strings/bcopy-duff.c: Change of copyright to GPL/LGPL strings/bmove512.c: Change of copyright to GPL/LGPL strings/bmove_upp-sparc.s: Change of copyright to GPL/LGPL strings/bmove_upp.c: Change of copyright to GPL/LGPL strings/conf_to_src.c: Change of copyright to GPL/LGPL strings/ctype-big5.c: Change of copyright to GPL/LGPL strings/ctype-euc_kr.c: Change of copyright to GPL/LGPL strings/ctype-gb2312.c: Change of copyright to GPL/LGPL strings/ctype-sjis.c: Change of copyright to GPL/LGPL strings/ctype.c: Change of copyright to GPL/LGPL strings/do_ctype.c: Change of copyright to GPL/LGPL strings/int2str.c: Change of copyright to GPL/LGPL strings/is_prefix.c: Change of copyright to GPL/LGPL strings/llstr.c: Change of copyright to GPL/LGPL strings/longlong2str-x86.s: Change of copyright to GPL/LGPL strings/longlong2str.c: Change of copyright to GPL/LGPL strings/macros.asm: Change of copyright to GPL/LGPL strings/memcmp.c: Change of copyright to GPL/LGPL strings/memcpy.c: Change of copyright to GPL/LGPL strings/ptr_cmp.asm: Change of copyright to GPL/LGPL strings/str2int.c: Change of copyright to GPL/LGPL strings/str_test.c: Change of copyright to GPL/LGPL strings/strappend-sparc.s: Change of copyright to GPL/LGPL strings/strappend.c: Change of copyright to GPL/LGPL strings/strcend.c: Change of copyright to GPL/LGPL strings/strcont.c: Change of copyright to GPL/LGPL strings/strend-sparc.s: Change of copyright to GPL/LGPL strings/strfill.c: Change of copyright to GPL/LGPL strings/strings-x86.s: Change of copyright to GPL/LGPL strings/strings.asm: Change of copyright to GPL/LGPL strings/strinstr-sparc.s: Change of copyright to GPL/LGPL strings/strinstr.c: Change of copyright to GPL/LGPL strings/strmake-sparc.s: Change of copyright to GPL/LGPL strings/strmake.c: Change of copyright to GPL/LGPL strings/strmov-sparc.s: Change of copyright to GPL/LGPL strings/strmov.c: Change of copyright to GPL/LGPL strings/strnmov-sparc.s: Change of copyright to GPL/LGPL strings/strnmov.c: Change of copyright to GPL/LGPL strings/strstr-sparc.s: Change of copyright to GPL/LGPL strings/strto.c: Change of copyright to GPL/LGPL strings/strtol.c: Change of copyright to GPL/LGPL strings/strtoll.c: Change of copyright to GPL/LGPL strings/strtoul.c: Change of copyright to GPL/LGPL strings/strtoull.c: Change of copyright to GPL/LGPL strings/strxmov-sparc.s: Change of copyright to GPL/LGPL strings/strxmov.asm: Change of copyright to GPL/LGPL strings/udiv.c: Change of copyright to GPL/LGPL support-files/Makefile.am: Change of copyright to GPL/LGPL tests/Makefile.am: Change of copyright to GPL/LGPL vio/Makefile.am: Change of copyright to GPL/LGPL isam/.cvsignore: Updates for 3.23.19 myisam/.cvsignore: Updates for 3.23.19 sql-bench/Results/insert-pg_fast-Linux_2.2.14_5.0_i686: ***MISSING WEAVE*** sql-bench/Results/select-pg_fast-Linux_2.2.14_5.0_i686: ***MISSING WEAVE*** sql-bench/Results/wisconsin-pg_fast-Linux_2.2.14_5.0_i686: ***MISSING WEAVE*** sql/sql_analyse.h: Fix bug when memory wasn't freed sql/mysqlbinlog.cc: Small fixes sql/share/romanian/errmsg.txt: ***MISSING WEAVE*** include/mysql_com.h: Replication update/LOAD TABLE FROM MASTER + other fixes client/mysql-test.c: ***MISSING WEAVE*** myisam/Attic/ft_global.h: This file is now in include/ extra/Attic/print_defaults.c: Updates for text search + ORDER BY extra/Makefile.am: Updates for text search + ORDER BY extra/my_print_defaults.c: Updates for text search + ORDER BY include/mysqld_error.h: Updates for text search + ORDER BY sql/item_cmpfunc.cc: Updates for text search + ORDER BY sql/opt_range.h: Updates for text search + ORDER BY sql/sql_lex.cc: Updates for text search + ORDER BY sql-bench/crash-me.sh: Updates for text search + ORDER BY sql-bench/limits/mysql.cfg: Updates for text search + ORDER BY sql/share/czech/errmsg.sys: Updates for text search + ORDER BY sql/share/czech/errmsg.txt: Updates for text search + ORDER BY sql/share/danish/errmsg.sys: Updates for text search + ORDER BY sql/share/danish/errmsg.txt: Updates for text search + ORDER BY sql/share/dutch/errmsg.sys: Updates for text search + ORDER BY sql/share/dutch/errmsg.txt: Updates for text search + ORDER BY sql/share/english/errmsg.sys: Updates for text search + ORDER BY sql/share/english/errmsg.txt: Updates for text search + ORDER BY sql/share/estonia/errmsg.sys: Updates for text search + ORDER BY sql/share/estonia/errmsg.txt: Updates for text search + ORDER BY sql/share/french/errmsg.sys: Updates for text search + ORDER BY sql/share/french/errmsg.txt: Updates for text search + ORDER BY sql/share/german/errmsg.sys: Updates for text search + ORDER BY sql/share/german/errmsg.txt: Updates for text search + ORDER BY sql/share/greek/errmsg.sys: Updates for text search + ORDER BY sql/share/greek/errmsg.txt: Updates for text search + ORDER BY sql/share/hungarian/errmsg.sys: Updates for text search + ORDER BY sql/share/hungarian/errmsg.txt: Updates for text search + ORDER BY sql/share/japanese/errmsg.sys: Updates for text search + ORDER BY sql/share/japanese/errmsg.txt: Updates for text search + ORDER BY sql/share/korean/errmsg.sys: Updates for text search + ORDER BY sql/share/korean/errmsg.txt: Updates for text search + ORDER BY sql/share/norwegian/errmsg.txt: Updates for text search + ORDER BY sql/share/norwegian-ny/errmsg.txt: Updates for text search + ORDER BY sql/share/polish/errmsg.sys: Updates for text search + ORDER BY sql/share/polish/errmsg.txt: Updates for text search + ORDER BY sql/share/portuguese/errmsg.sys: Updates for text search + ORDER BY sql/share/portuguese/errmsg.txt: Updates for text search + ORDER BY sql/share/romania/errmsg.sys: Updates for text search + ORDER BY sql/share/romania/errmsg.txt: Updates for text search + ORDER BY sql/share/russian/errmsg.sys: Updates for text search + ORDER BY sql/share/russian/errmsg.txt: Updates for text search + ORDER BY sql/share/slovak/errmsg.sys: Updates for text search + ORDER BY sql/share/slovak/errmsg.txt: Updates for text search + ORDER BY sql/share/spanish/errmsg.sys: Updates for text search + ORDER BY sql/share/spanish/errmsg.txt: Updates for text search + ORDER BY sql/share/swedish/errmsg.OLD: Updates for text search + ORDER BY sql/share/swedish/errmsg.sys: Updates for text search + ORDER BY sql/share/swedish/errmsg.txt: Updates for text search + ORDER BY support-files/mysql.server-sys5.sh: Updates for text search + ORDER BY extra/.cvsignore: Fix for update + BDB tables isam/_dbug.c: Fix for update + BDB tables myisam/mi_delete.c: Fix for update + BDB tables myisam/mi_rnext_same.c: Fix for update + BDB tables myisam/mi_search.c: Fix for update + BDB tables sql/table.cc: Fix of core dump bugs myisam/Makefile.am: Aded missing file sql/ha_berkeley.h: Fix DELETE FROM table_name problem Build-tools/Do-all-build-steps: Update to final 3.23.20 Build-tools/mysql-copyright-2: Update to final 3.23.20 Build-tools/mysql-copyright: Update to final 3.23.20 Docs/.cvsignore: Update to final 3.23.20 scripts/make_binary_distribution.sh: Update to final 3.23.20 Docs/internals.texi: Fix of licenses issues. sql/ha_isam.h: Added patch by Sergei for MATCH + some bug fixes. sql/ha_isammrg.h: Added patch by Sergei for MATCH + some bug fixes. sql/ha_myisammrg.h: Added patch by Sergei for MATCH + some bug fixes. myisam/ft_search.c: Fix of portability bug include/ft_global.h: Fix of portability bug sql/log_event.cc: One more safety fix sql/log_event.h: One more safety fix isam/test2.c: Update to 3.23.21 isam/update.c: Update to 3.23.21 myisam/ChangeLog: Update to 3.23.21 myisam/mi_test_all.sh: Update to 3.23.21 myisam/mi_update.c: Update to 3.23.21 myisam/mi_write.c: Update to 3.23.21 scripts/.cvsignore: Update to 3.23.21 scripts/mysql_config.sh: Update to 3.23.21 sql/filesort.cc: Update to 3.23.21 Docs/Support/texi2html: removed NOSAVE attrib from TABLE tags, non-standard HTML. include/Attic/config-win32.h: Made update log ASCII 0 safe myisam/mi_test_all: ***MISSING WEAVE*** sql/sql_acl.cc: Made update log ASCII 0 safe sql/sql_db.cc: Made update log ASCII 0 safe sql/sql_delete.cc: Made update log ASCII 0 safe sql/sql_insert.cc: Made update log ASCII 0 safe sql/sql_load.cc: Made update log ASCII 0 safe sql/sql_select.h: Made update log ASCII 0 safe sql/sql_update.cc: Made update log ASCII 0 safe sql/table.h: Made update log ASCII 0 safe strings/ctype-czech.c: Made update log ASCII 0 safe support-files/maxsql.spec.sh: Made update log ASCII 0 safe client/mysqlimport.c: Update to 3.23.21 client/mysqlshow.c: Update to 3.23.21 include/mysql.h: Added mysql_character_set_name() mit-pthreads/net/gethostname.c: Added mysql_character_set_name() scripts/Makefile.am: Added mysql_character_set_name() client/Makefile.am: portability fixes scripts/mysql_install_db.sh: portability fixes support-files/mysql.spec.sh: Added mysql_config config.h.in: ***MISSING WEAVE*** client/mysqldump.c: Small fixes heap/hp_rkey.c: Small fixes sql-bench/compare-results.sh: Small fixes tests/mail_to_db.pl: Small fixes acinclude.m4: Configure updates for 3.23.22 BUILD/compile-pentium-debug: Configure updates for 3.23.22 Docs/Makefile.am: Configure updates for 3.23.22 client/get_password.c: Configure updates for 3.23.22 client/mysqladmin.c: Configure updates for 3.23.22 include/Makefile.am: Configure updates for 3.23.22 include/my_global.h: ***MISSING WEAVE*** isam/info.c: Configure updates for 3.23.22 isam/isamdef.h: Configure updates for 3.23.22 isam/write.c: Configure updates for 3.23.22 sql/records.cc: Configure updates for 3.23.22 sql-bench/print-limit-table: Configure updates for 3.23.22 sql-bench/limits/mysql-3.23.cfg: Configure updates for 3.23.22 support-files/my-huge.cnf.sh: Configure updates for 3.23.22 support-files/my-large.cnf.sh: Configure updates for 3.23.22 support-files/my-medium.cnf.sh: Configure updates for 3.23.22 myisam/ft_update.c: This is to make ft-code to ignore keyseg.length at all and to index the whole VARCHAR/BLOB instead... Makefile.am: Fixed gen_lex_hash recursion myisam/myisampack.c: Fixes for 3.23.22 sql/ChangeLog: Fixes for 3.23.22 sql/nt_servc.cc: Fixes for 3.23.22 sql/sql_class.cc: Fixes for 3.23.22 include/my_base.h: Fix for BDB and MERGE tables sql/ha_myisammrg.cc: Fix for BDB and MERGE tables Docs/LICENSE: Update for 3.23.22 config.sub: Update for ia64 Build-tools/Do-compile-all: ***MISSING WEAVE*** scripts/safe_mysqld.sh: Small bug fixes for 3.23.22 support-files/.cvsignore: Small bug fixes for 3.23.22 scripts/mysql_find_rows.sh: Critical bug fixes sql/sql_class.h: SHOW SLAVE STATUS, change in SHOW MASTER STATUS repl-tests/include/master-slave.inc: Replication test cases repl-tests/test-dump/run.test: Replication test cases repl-tests/test-dump/table-dump-check.master: Replication test cases repl-tests/test-dump/table-dump-select.master: Replication test cases repl-tests/test-repl-ts/repl-timestamp.master: Replication test cases repl-tests/test-repl-ts/run.test: Replication test cases repl-tests/test-repl/foo-dump-master.master: Replication test cases repl-tests/test-repl/foo-dump-slave.master: Replication test cases repl-tests/test-repl/run.test: Replication test cases repl-tests/test-repl/sum-wlen-master.master: Replication test cases repl-tests/test-repl/sum-wlen-slave.master: Replication test cases Images/.cvsignore: Update of div reported bugs include/config-win.h: Update of div reported bugs mysys/mf_pack.c: Update of div reported bugs sql/field.cc: Update of div reported bugs sql/field.h: Update of div reported bugs sql/ha_myisam.h: Update of div reported bugs sql/handler.h: Update of div reported bugs sql/item.cc: Update of div reported bugs sql/item_func.h: Update of div reported bugs sql/item_timefunc.cc: Update of div reported bugs sql/item_timefunc.h: Update of div reported bugs sql/sql_string.cc: Update of div reported bugs sql/sql_table.cc: Update of div reported bugs sql/structs.h: Update of div reported bugs sql/time.cc: Update of div reported bugs strings/ctype-gbk.c: Update of div reported bugs strings/ctype-tis620.c: Update of div reported bugs strings/r_strinstr.c: Update of div reported bugs strings/strnlen.c: Update of div reported bugs support-files/mysql.server.sh: Update of div reported bugs myisam/mi_locking.c: Small bug fixes myisam/myisamdef.h: Small bug fixes mysys/my_thr_init.c: Small bug fixes myisam/mi_close.c: Changed mutex THR_lock_isam -> THR_lock_myisam myisam/mi_create.c: Changed mutex THR_lock_isam -> THR_lock_myisam myisam/mi_extra.c: Changed mutex THR_lock_isam -> THR_lock_myisam myisam/mi_log.c: Changed mutex THR_lock_isam -> THR_lock_myisam myisam/mi_open.c: Changed mutex THR_lock_isam -> THR_lock_myisam myisam/mi_panic.c: Changed mutex THR_lock_isam -> THR_lock_myisam myisam/myisamchk.c: Changed mutex THR_lock_isam -> THR_lock_myisam sql/item_func.cc: Don't let MySQL use ft-keys in non-ft way sql/opt_range.cc: Don't let MySQL use ft-keys in non-ft way sql-bench/Results-linux/ATIS-mysql-Linux_2.2.13_SMP_alpha: ***MISSING WEAVE*** sql-bench/Results-linux/RUN-mysql-Linux_2.2.13_SMP_alpha: ***MISSING WEAVE*** sql-bench/Results-linux/alter-table-mysql-Linux_2.2.13_SMP_alpha: ***MISSING WEAVE*** sql-bench/Results-linux/big-tables-mysql-Linux_2.2.13_SMP_alpha: ***MISSING WEAVE*** sql-bench/Results-linux/connect-mysql-Linux_2.2.13_SMP_alpha: ***MISSING WEAVE*** sql-bench/Results-linux/create-mysql-Linux_2.2.13_SMP_alpha: ***MISSING WEAVE*** sql-bench/Results-linux/insert-mysql-Linux_2.2.13_SMP_alpha: ***MISSING WEAVE*** sql-bench/Results-linux/select-mysql-Linux_2.2.13_SMP_alpha: ***MISSING WEAVE*** sql-bench/Results-linux/wisconsin-mysql-Linux_2.2.13_SMP_alpha: ***MISSING WEAVE*** sql/share/italian/errmsg.sys: new translated error messages sql/share/italian/errmsg.txt: new translated error messages libmysql/errmsg.c: Fix to get 'Too big packet' error + fixes for Ia64 libmysql/libmysql.c: Fix to get 'Too big packet' error + fixes for Ia64 libmysql/net.c: Fix to get 'Too big packet' error + fixes for Ia64 include/errmsg.h: Fix to get 'Too big packet' mysql.proj: Update for 3.23.22 client/mysql.cc: Fix for rehash on reconnect (By Jeremey) readline/rlstdc.h: portability fixes sql/Makefile.am: Hack to force lex_hash.h to be generated sql/ha_berkeley.cc: Fixes for Berekely DB sql/handler.cc: Fixes for Berekely DB sql/item.h: Small fixes for 3.23.22 sql/net_serv.cc: Small fixes for 3.23.22 client/completion_hash.cc: Fixes for Ia64 sql/mini_client.cc: Fixes for Ia64 sql/sql_select.cc: Fixes for Ia64 .cvsignore: Update at work for release myisam/mi_check.c: Fix bug in ANALYZE TABLE sql/ha_myisam.cc: Fix bug in ANALYZE TABLE include/myisam.h: Fix bug in ANALYZE TABLE configure.in: Fix for AIX 4.3 Build-tools/Do-compile: Fix for local perl libraries sql/sql_show.cc: Fix for show processlist on SCO include/global.h: Fix for AIX 4.3 BUILD/compile-ia64-O0-sgicc: Last minute updates for 3.23.22 BUILD/compile-ia64-O0: Last minute updates for 3.23.22 BUILD/compile-ia64-O2-sgicc: Last minute updates for 3.23.22 BUILD/compile-ia64-O2: Last minute updates for 3.23.22 BUILD/compile-ia64-O6: Last minute updates for 3.23.22 Docs/manual.texi: Added paragraph in introduction pointing to SQL and MySQL books, for newbies. sql/gen_lex_hash.cc: CHANGE MASTER TO and other fixes sql/lex.h: CHANGE MASTER TO and other fixes sql/log.cc: CHANGE MASTER TO and other fixes sql/mysql_priv.h: CHANGE MASTER TO and other fixes sql/mysqld.cc: CHANGE MASTER TO and other fixes sql/net_pkg.cc: CHANGE MASTER TO and other fixes sql/slave.cc: CHANGE MASTER TO and other fixes sql/sql_base.cc: CHANGE MASTER TO and other fixes sql/sql_lex.h: CHANGE MASTER TO and other fixes sql/sql_parse.cc: CHANGE MASTER TO and other fixes sql/sql_yacc.yy: CHANGE MASTER TO and other fixes
3248 lines
109 KiB
Bash
Executable file
3248 lines
109 KiB
Bash
Executable file
#!@PERL@
|
|
# ****************************
|
|
package MySQLaccess;
|
|
#use strict;
|
|
use POSIX qw(tmpnam);
|
|
use Fcntl;
|
|
|
|
BEGIN {
|
|
# ****************************
|
|
# static information...
|
|
$VERSION = "2.05, 17 Feb 2000";
|
|
$0 =~ m%/([^/]+)$%o;
|
|
$script = $1;
|
|
$script = 'MySQLAccess' unless $script;
|
|
$script_conf = "$script.conf";
|
|
$script_log = "~/$script.log";
|
|
|
|
# ****************************
|
|
# information on MySQL
|
|
$MYSQL = '@bindir@/mysql'; # path to mysql executable
|
|
$SERVER = '3.21';
|
|
$MYSQL_OPT = ' --batch --unbuffered';
|
|
$ACCESS_DB = 'mysql'; # name of DB with grant-tables
|
|
$ACCESS_H = 'host'; #
|
|
$ACCESS_U = 'user'; #
|
|
$ACCESS_D = 'db'; #
|
|
# Add/Edit privileges
|
|
$ACCESS_H_TMP = 'host_tmp';
|
|
$ACCESS_U_TMP = 'user_tmp';
|
|
$ACCESS_D_TMP = 'db_tmp';
|
|
$ACCESS_H_BCK = 'host_backup';
|
|
$ACCESS_U_BCK = 'user_backup';
|
|
$ACCESS_D_BCK = 'db_backup';
|
|
$DIFF = '/usr/bin/diff';
|
|
$TMP_PATH = '/tmp'; #path to writable tmp-directory
|
|
$MYSQLDUMP = '@bindir@/mysqldump';
|
|
#path to mysqldump executable
|
|
|
|
$MYSQLADMIN= 'http://foobar.com/MySQLadmin';
|
|
#URL of CGI for manipulating
|
|
#the temporary grant-tables
|
|
}
|
|
|
|
END {
|
|
unlink $MYSQL_CNF if defined $MYSQL_CNF and not $DEBUG;
|
|
}
|
|
|
|
$INFO = <<"_INFO";
|
|
--------------------------------------------------------------------------
|
|
mysqlaccess (Version $VERSION)
|
|
~~~~~~~~~~~
|
|
Copyright (C) 1997,1998 Yves.Carlier\@rug.ac.be
|
|
University of Ghent (RUG), Belgium
|
|
Administratieve Informatieverwerking (AIV)
|
|
|
|
report the access-privileges for a USER from a HOST to a DB
|
|
|
|
Many thanks go to <monty\@mysql.com> and <psmith\@BayNetworks.COM>
|
|
for their suggestions, debugging and patches.
|
|
|
|
use `$script -?' to get more information on available options.
|
|
|
|
From version 2.0x, $script can also be used through a WEB-browser
|
|
if it is ran as a CGI-script. (See the release-notes)
|
|
|
|
--------------------------------------------------------------------------
|
|
_INFO
|
|
|
|
$OPTIONS = <<_OPTIONS;
|
|
|
|
Usage: $script [host [user [db]]] OPTIONS
|
|
|
|
-?, --help display this helpscreen and exit
|
|
-v, --version print information on the program `$script'
|
|
|
|
-u, --user=# username for logging in to the db
|
|
-p, --password=# validate password for user
|
|
-h, --host=# name or IP-number of the host
|
|
-d, --db=# name of the database
|
|
|
|
-U, --superuser=# connect as superuser
|
|
-P, --spassword=# password for superuser
|
|
-H, --rhost=# remote MySQL-server to connect to
|
|
--old_server connect to old MySQL-server (before v3.21) which
|
|
does not yet know how to handle full where clauses.
|
|
|
|
-b, --brief single-line tabular report
|
|
-t, --table report in table-format
|
|
|
|
--relnotes print release-notes
|
|
--plan print suggestions/ideas for future releases
|
|
--howto some examples of how to run `$script'
|
|
--debug=N enter debuglevel N (0..3)
|
|
|
|
--copy reload temporary grant-tables from original ones
|
|
--preview show differences in privileges after making
|
|
changes in (temporary) grant-tables
|
|
--commit copy grant-rules from temporary tables to grant-tables
|
|
(!don't forget to do an mysqladmin reload)
|
|
--rollback undo the last changes to the grant-tables.
|
|
|
|
Note:
|
|
+ At least the user and the db must be given (even with wildcards)
|
|
+ If no host is given, `localhost' is assumed
|
|
+ Wilcards (*,?,%,_) are allowed for host, user and db, but be sure
|
|
to escape them from your shell!! (ie type \\* or '*')
|
|
_OPTIONS
|
|
|
|
$RELEASE = <<'_RELEASE';
|
|
|
|
Release Notes:
|
|
-------------
|
|
0.1-beta1: internal
|
|
- first trial.
|
|
|
|
0.1-beta2: (1997-02-27)
|
|
- complete rewrite of the granting-rules, based on the documentation
|
|
found in de FAQ.
|
|
- IP-number and name for a host are equiv.
|
|
|
|
0.1-beta3: (1997-03-10)
|
|
- more information
|
|
- 'localhost' and the name/ip of the local machine are now equiv.
|
|
|
|
0.1-beta4: (1997-03-11)
|
|
- inform the user if he has not enough priv. to read the mysql db
|
|
|
|
1.0-beta1: (1997-03-12)
|
|
suggestions by Monty:
|
|
- connect as superuser with superpassword.
|
|
- mysqlaccess could also notice if all tables are empty. This means
|
|
that all user have full access!
|
|
- It would be nice if one could optionally start mysqlaccess without
|
|
any options just the arguments 'user db' or 'host user db', where
|
|
host is 'localhost' if one uses only two arguments.
|
|
|
|
1.0-beta2: (1997-03-14)
|
|
- bugfix: translation to reg.expr of \_ and \%.
|
|
- bugfix: error in matching regular expression and string given
|
|
by user which resulted in
|
|
'test_123' being matched with 'test'
|
|
|
|
1.0-beta3: (1997-03-14)
|
|
- bugfix: the user-field should not be treated as a sql-regexpr,
|
|
but as a plain string.
|
|
- bugfix: the host-table should not be used if the host isn't empty in db
|
|
or if the host isn't emty in user
|
|
(Monty)
|
|
|
|
1.0-beta4: (1997-03-14)
|
|
- bugfix: in an expression "$i = $j or $k", the '=' binds tighter than the or
|
|
which results in problems...
|
|
(by Monty)
|
|
- running mysqlaccess with "perl -w" gives less warnings... ;-)
|
|
|
|
1.0-beta5: (1997-04-04)
|
|
- bugfix: The table sorting was only being applied to the "user" table; all
|
|
the tables need to be sorted. Rewrote the sort algorithm, and
|
|
the table walk algorithm (no temp file anymore), and various
|
|
other cleanups. I believe the access calculation is 100% correct.
|
|
(by Paul D. Smith <psmith\@baynetworks.com>)
|
|
- Allow the debug level to be set on the cmd line with --debug=N.
|
|
(by Paul D. Smith <psmith\@baynetworks.com>)
|
|
- More -w cleanups; should be totally -w-clean.
|
|
(by Paul D. Smith <psmith\@baynetworks.com>)
|
|
|
|
1.1-beta1: (1997-04-xx)
|
|
1.1-beta2: (1997-04-11)
|
|
- new options:
|
|
--all_users : report access-rights for all possible users
|
|
--all_dbs : report access-rights for all possible dbs
|
|
--all_hosts : report access-rights for all possible hosts
|
|
--brief : as brief as possible, don't mention notes,warnings and rules
|
|
--password : validate password for user
|
|
- layout: long messages are wrapped on the report.
|
|
- functionality:
|
|
more descriptive notes and warnings
|
|
wildcards (*,?) are allowed in the user,host and db options
|
|
setting xxxx=* is equiv to using option --all_xxxx
|
|
note: make sure you escape your wildcards, so they don't get
|
|
interpreted by the shell. use \* or '*'
|
|
- bugfix: Fieldnames which should be skipped on the output can now have
|
|
a first capital letter.
|
|
- bugfix: any option with a '.' (eg ip-number) was interpreted as
|
|
a wildcard-expression.
|
|
- bugfix: When no entry was found in the db-table, the default accessrights are
|
|
N, instead of the faulty Y in a previous version.
|
|
|
|
1.1-beta-3 : (1997-04-xx)
|
|
1.1-beta-4 : (1997-04-xx)
|
|
1.1-beta-5 : (1997-04-xx)
|
|
1.1 : (1997-04-28)
|
|
- new options:
|
|
--rhost : name of mysql-server to connect to
|
|
--plan : print suggestions/ideas for future releases
|
|
--relnotes : display release-notes
|
|
--howto : display examples on how to use mysqlaccess
|
|
--brief : single-line tabular output
|
|
- functionality/bugfix:
|
|
* removed options --all_users,--all_dbs,--all_hosts, which
|
|
were redundant with the wildcard-expressions for the corresponding
|
|
options. They made the processing of the commandline too painful
|
|
and confusing ;-)
|
|
(suggested by psmith)
|
|
* redefined the option --brief, which now gives a single-line
|
|
tabular output
|
|
* Now we check if the right version of the mysql-client is used,
|
|
since we might use an option not yet implemented in an
|
|
older version (--unbuffered, since 3.0.18)
|
|
Also the error-messages the mysql-client reports are
|
|
better interpreted ;-)
|
|
* Wildcards can now be given following the SQL-expression
|
|
(%,_) and the Regular-expression (*,?) syntax.
|
|
- speed: we now open a bidirectional pipe to the mysql-client, and keep
|
|
it open throughout the whole run. Queries are written to,
|
|
and the answers read from the pipe.
|
|
(suggested by monty)
|
|
- bugfixes:
|
|
* the Rules were not properly reset over iterations
|
|
* when in different tables the field-names were not identical,
|
|
eg. Select_priv and select_priv, they were considered as
|
|
definitions of 2 different access-rights.
|
|
* the IP-number of a host with a name containing wildcards should
|
|
not be searched for in Name2IP and IP2Name.
|
|
* various other small things, pointed out by <monty> and <psmith>
|
|
|
|
1.2 : (1997-05-13)
|
|
- bugfix:
|
|
* Fixed bug in acl with anonymous user: Now if one gets accepted by the
|
|
user table as a empty user name, the user name is set to '' when
|
|
checking against the 'db' and 'host' tables. (Bug fixed in MySQL3.20.19)
|
|
|
|
1.2-1 : (1997-xx-xx)
|
|
- bugfix:
|
|
* hashes should be initialized with () instead of {} <psmith>
|
|
* "my" variable $name masks earlier declaration in same scope,
|
|
using perl 5.004 <????>
|
|
|
|
1.2-2 : (1997-06-10)
|
|
|
|
2.0p1-3 : (1997-10-xx)
|
|
- new
|
|
* packages
|
|
* log-file for debug-output : /tmp/mysqlaccess.log
|
|
* default values are read from a configuration file $script.conf
|
|
first this file is looked for in the current directory; if not
|
|
found it is looked for in /etc/
|
|
Note that when default-values are given, these can't get overriden
|
|
by empty (blanc) values!
|
|
* CGI-BIN version with HTML and forms interface. Simply place the
|
|
script in an ScriptAliased directory, make the configuration file
|
|
available in the that directory or in /etc, and point your browser
|
|
to the right URL.
|
|
* copy the grant-rules to temporary tables, where you are safe to
|
|
play with them.
|
|
* preview changes in privileges after changing grant-rules,
|
|
before taking them into production
|
|
* copy the new grant-rules from the temporary tables back to the
|
|
grant-tables.
|
|
* Undo all changes made in the grant-tables (1-level undo).
|
|
-new options:
|
|
* --table : as opposite of the --brief option.
|
|
* --copy : (re)load temporary grant-tables from original ones.
|
|
* --preview : preview changes in privileges after changing
|
|
some or more entries in the grant-tables.
|
|
* --commit : copy grant-rules from temporary tables to grant-tables
|
|
(!don't forget to do an mysqladmin reload)
|
|
* --rollback: undo the last changes to the grant-tables.
|
|
|
|
- bugfix:
|
|
* if the table db is empty, mysqlaccess freezed
|
|
(by X Zhu <X.Zhu@Bradford.ac.uk>)
|
|
|
|
2.0 : (1997-10-09)
|
|
- fixed some "-w" warnings.
|
|
- complain when certain programs and paths can't be found.
|
|
|
|
2.01 : (1997-12-12)
|
|
- bugfix:
|
|
* rules for db-table where not calculated and reported correctly.
|
|
2.02 : (1998-01-xx)
|
|
- bugfix:
|
|
* Privileges of the user-table were not AND-ed properly with the
|
|
other privileges. (reported by monty)
|
|
- new option:
|
|
* --old_server: mysqlaccess will now use a full where clause when
|
|
retrieving information from the MySQL-server. If
|
|
you are connecting to an old server (before v3.21)
|
|
use the option --old_server.
|
|
2.03 : (1998-02-27)
|
|
- bugfix:
|
|
* in Host::MatchTemplate: incorrect match if host-field was left empty.
|
|
|
|
2.04-alpha1 : (2000-02-11)
|
|
Closes vulnerability due to former implementation requiring passwords
|
|
to be passed on the command line.
|
|
- functionality
|
|
Option values for --password -p -spassword -P may now be omitted from
|
|
command line, in which case the values will be prompted for.
|
|
(fix supplied by Steve Harvey <sgh@vex.net>)
|
|
|
|
2.05: (2000-02-17) Monty
|
|
Moved the log file from /tmp to ~
|
|
|
|
_RELEASE
|
|
|
|
$TODO = <<_TODO;
|
|
|
|
Plans:
|
|
-----
|
|
-a full where clause is use now. How can we handle older servers?
|
|
-add some more functionality for DNS.
|
|
-select the warnings more carefuly.
|
|
>> I think that the warnings should either be enhanced to _really_
|
|
>> understand and report real problems accurately, or restricted to
|
|
>> only printing things that it knows with 100% certainty. <psmith)
|
|
>> Why do I have both '%' and 'any_other_host' in there? Isn't that
|
|
>> the same thing? I think it's because I have an actual host '%' in
|
|
>> one of my tables. Probably the script should catch that and not
|
|
>> duplicate output. <psmith>
|
|
|
|
_TODO
|
|
|
|
# From the FAQ: the Grant-algorithm
|
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
# The host table is mainly to maintain a list of "secure" servers.
|
|
# At TCX hosts contain a list of all machines on local network. These are granted
|
|
# all privileges.
|
|
# Technically the user grant is calculated by:
|
|
#
|
|
# 1.First sort all entries by host by putting host without wildcards first,
|
|
# after this host with wildcards and entries with host = ".
|
|
# Under each host sort user by the same criterias.
|
|
# 2.Get grant for user from the "db" table.
|
|
# 3.If hostname is "empty" for the found entry, AND the privileges with
|
|
# the privileges for the host in "host" table.
|
|
# (Remove all which is not "Y" in both)
|
|
# 4.OR (add) the privileges for the user from the "user" table.
|
|
# (add all privileges which is "Y" in "user")
|
|
#
|
|
# When matching, use the first found match.
|
|
#
|
|
# -----------------------------------------------------------------------------------
|
|
|
|
$HOWTO = <<_HOWTO;
|
|
|
|
Examples of how to call $script:
|
|
~~~~~~~~
|
|
1)Calling $script with 2 arguments:
|
|
|
|
\$ $script root mysql
|
|
->report rights of user root logged on at the local host in db mysql
|
|
|
|
Access-rights
|
|
for USER 'root', from HOST 'localhost', to DB 'mysql'
|
|
+-----------------+---+ +-----------------+---+
|
|
| select_priv | Y | | drop_priv | Y |
|
|
| insert_priv | Y | | reload_priv | Y |
|
|
| update_priv | Y | | shutdown_priv | Y |
|
|
| delete_priv | Y | | process_priv | Y |
|
|
| create_priv | Y | | file_priv | Y |
|
|
+-----------------+---+ +-----------------+---+
|
|
BEWARE: Everybody can access your DB as user 'root'
|
|
: WITHOUT supplying a password. Be very careful about it!!
|
|
|
|
The following rules are used:
|
|
db : 'No matching rule'
|
|
host : 'Not processed: host-field is not empty in db-table.'
|
|
user : 'localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'
|
|
|
|
2)Calling $script with 3 arguments:
|
|
|
|
\$ $script foo.bar nobody Foo
|
|
->report rights of user root logged in at machine foobar to db Foo
|
|
|
|
Access-rights
|
|
for USER 'nobody', from HOST 'foo.bar', to DB 'Foo'
|
|
+-----------------+---+ +-----------------+---+
|
|
| select_priv | Y | | drop_priv | N |
|
|
| insert_priv | Y | | reload_priv | N |
|
|
| update_priv | Y | | shutdown_priv | N |
|
|
| delete_priv | Y | | process_priv | N |
|
|
| create_priv | N | | file_priv | N |
|
|
+-----------------+---+ +-----------------+---+
|
|
BEWARE: Everybody can access your DB as user 'nobody'
|
|
: WITHOUT supplying a password. Be very careful about it!!
|
|
|
|
The following rules are used:
|
|
db : 'foo.bar','Foo','nobody','Y','Y','Y','N','N','N'
|
|
host : 'Not processed: host-field is not empty in db-table.'
|
|
user : 'foo.bar','nobody','','N','N','N','Y','N','N','N','N','N','N'
|
|
|
|
3)Using wildcards:
|
|
|
|
\$ $script \\* nobody Foo --brief
|
|
->report access-rights of user nobody from all machines to db Foo,
|
|
and use a matrix-report.
|
|
|
|
Sel Ins Upd Del Crea Drop Reld Shut Proc File Host,User,DB
|
|
---- ---- ---- ---- ---- ---- ---- ---- ---- ---- --------------------
|
|
Y Y Y Y N N N N N N localhost,nobody,Foo
|
|
N N N N N N N N N N %,nobody,Foo
|
|
N N N N N N N N N N any_other_host,nobody,Foo
|
|
|
|
_HOWTO
|
|
|
|
|
|
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #
|
|
# START OF THE PROGRAM #
|
|
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #
|
|
|
|
use Getopt::Long;
|
|
use Sys::Hostname;
|
|
use IPC::Open3;
|
|
#use CGI; #moved to use of CGI by monty
|
|
|
|
|
|
# ****************************
|
|
# debugging flag
|
|
# can be set to 0,1,2,3
|
|
# a higher value gives more info
|
|
# ! this can also be set on the command-line
|
|
$DEBUG = 0;
|
|
|
|
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>8
|
|
# Normaly nothing should be changed beneeth this line
|
|
|
|
|
|
# ****************************
|
|
# no caching on STDOUT
|
|
$|=1;
|
|
|
|
$MYSQL_CNF = POSIX::tmpnam();
|
|
%MYSQL_CNF = (client => { },
|
|
mysql => { },
|
|
mysqldump => { },
|
|
);
|
|
|
|
|
|
|
|
$NEW_USER = 'ANY_NEW_USER';
|
|
$NEW_DB = 'ANY_NEW_DB' ;
|
|
|
|
|
|
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #
|
|
# mysqlaccess: #
|
|
# ~~~~~~~~~~~ #
|
|
# Lets get to it, #
|
|
# and start the program by processing the parameters #
|
|
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #
|
|
|
|
($CMD,$CGI) = GetMode();
|
|
|
|
# ****************************
|
|
# the copyright message should
|
|
# always be printed (once)
|
|
MySQLaccess::Report::Print_Header();
|
|
|
|
# *****************************
|
|
# Read configuration-file
|
|
MySQLaccess::Debug::Print(1, "Reading configuration file...");
|
|
if (-f "./$script_conf") {
|
|
require "./$script_conf";
|
|
}
|
|
elsif (-f "/etc/$script_conf") {
|
|
require "/etc/$script_conf";
|
|
}
|
|
|
|
# ****************************
|
|
# Read in all parameters
|
|
if ($MySQLaccess::CMD) { #command-line version
|
|
# ----------------------------
|
|
# Get options from commandline
|
|
$Getopt::Long::ignorecase=0; #case sensitive options
|
|
if ( grep(/\-\?/,@ARGV) ) { MySQLaccess::Report::Print_Usage(); exit 0; }
|
|
GetOptions("help" => \$Param{'help'}
|
|
,"host|h=s" => \$Param{'host'}
|
|
,"user|u=s" => \$Param{'user'}
|
|
,"password|p:s" => \$Param{'password'}
|
|
,"db|d=s" => \$Param{'db'}
|
|
,"superuser|U=s" => \$Param{'superuser'}
|
|
,"spassword|P:s" => \$Param{'spassword'}
|
|
,"rhost|H=s" => \$Param{'rhost'}
|
|
,"old_server" => \$Param{'old_server'}
|
|
,"debug=i" => \$Param{'DEBUG'}
|
|
,"brief|b" => \$Param{'brief'}
|
|
,"table|t" => \$Param{'table'}
|
|
,"relnotes" => \$Param{'relnotes'}
|
|
,"plan" => \$Param{'plan'}
|
|
,"howto" => \$Param{'howto'}
|
|
,"version|v" => \$Param{'version'}
|
|
,"preview" => \$Param{'preview'}
|
|
,"copy" => \$Param{'copy'}
|
|
,"commit" => \$Param{'commit'}
|
|
,'rollback' => \$Param{'rollback'}
|
|
);
|
|
|
|
# -----------------------------
|
|
# set DEBUG
|
|
$DEBUG = $Param{'DEBUG'} if ($Param{'DEBUG'}>=$DEBUG);
|
|
|
|
# -----------------------------
|
|
# check for things which aren't
|
|
# declared as options:
|
|
# 2 arguments: (user,db) -> ('localhost','user','db')
|
|
if ($#ARGV == 1) {
|
|
MySQLaccess::Debug::Print(2,"$script called with 2 arguments:");
|
|
$Param{'host'} = $Param{'host'} || 'localhost';
|
|
$Param{'user'} = $ARGV[0] || $Param{'user'};
|
|
$Param{'db'} = $ARGV[1] || $Param{'db'};
|
|
}
|
|
# 3 arguments: (host,user,db)
|
|
if ($#ARGV == 2) {
|
|
MySQLaccess::Debug::Print(2,"$script called with 3 arguments:");
|
|
$Param{'host'} = $ARGV[0] || $Param{'host'};
|
|
$Param{'user'} = $ARGV[1] || $Param{'user'};
|
|
$Param{'db'} = $ARGV[2] || $Param{'db'};
|
|
}
|
|
|
|
# -------------------------------------
|
|
# prompt for user password if requested
|
|
if ( defined($Param{'password'}) && length($Param{'password'}) == 0 ) {
|
|
$Param{'password'} = PromptPass(
|
|
"Password for MySQL user $Param{'user'}: ");
|
|
}
|
|
}
|
|
if ($MySQLaccess::CGI) { #CGI-version
|
|
use CGI;
|
|
$Q = new CGI;
|
|
$Param{'help'} = $Q->param('help') ;
|
|
$Param{'host'} = $Q->param('host') || $Q->param('h') || $Param{'host'};
|
|
$Param{'user'} = $Q->param('user') || $Q->param('u') || $Param{'user'};
|
|
$Param{'db'} = $Q->param('db') || $Q->param('d') || $Param{'db'};
|
|
$Param{'password'} = $Q->param('password') || $Q->param('p') || $Param{'password'};
|
|
$Param{'superuser'} = $Q->param('superuser') || $Q->param('U') || $Param{'superuser'};
|
|
$Param{'spassword'} = $Q->param('spassword') || $Q->param('P') || $Param{'spassword'};
|
|
$Param{'rhost'} = $Q->param('rhost') || $Q->param('H') || $Param{'rhost'};
|
|
$Param{'old_server'}= $Q->param('old_server')|| $Param{'old_server'};
|
|
$Param{'debug'} = $Q->param('debug') || $Param{'debug'};
|
|
$Param{'brief'} = $Q->param('brief') || $Param{'brief'};
|
|
$Param{'table'} = $Q->param('table') || $Param{'table'};
|
|
$Param{'relnotes'} = $Q->param('relnotes');
|
|
$Param{'plan'} = $Q->param('plan');
|
|
$Param{'howto'} = $Q->param('howto');
|
|
$Param{'version'} = $Q->param('version') ? $Q->param('version') : $Q->param('v');
|
|
$Param{'edit'} = $Q->param('edit');
|
|
$Param{'preview'} = $Q->param('preview');
|
|
$Param{'copy'} = $Q->param('copy');
|
|
$Param{'commit'} = $Q->param('commit');
|
|
$Param{'rollback'} = $Q->param('rollback');
|
|
# -----------------------------
|
|
# set DEBUG
|
|
$DEBUG = $Q->param('debug') if ($Q->param('debug')>=$DEBUG);
|
|
}
|
|
|
|
# ----------------------
|
|
# brief and table-format
|
|
# exclude each-other
|
|
# table-format is prefered
|
|
if (defined($Param{'table'})) { undef($Param{'brief'}); }
|
|
if (defined($Param{'preview'}) or
|
|
defined($Param{'copy'}) or
|
|
defined($Param{'commit'}) or
|
|
defined($Param{'rollback'}) ) { $Param{'edit'}='on'; }
|
|
|
|
|
|
# ----------------------
|
|
# if no host is given
|
|
# assume we mean 'localhost'
|
|
if (!defined($Param{'host'})) { $Param{'host'}='localhost'; }
|
|
|
|
# ----------------------
|
|
# perform some checks
|
|
# -> eliminate 'broken pipe' error
|
|
push(@MySQLaccess::Grant::Error,'not_found_mysql') if !(-x $MYSQL);
|
|
push(@MySQLaccess::Grant::Error,'not_found_diff') if !(-x $DIFF);
|
|
push(@MySQLaccess::Grant::Error,'not_found_mysqldump') if !(-x $MYSQLDUMP);
|
|
push(@MySQLaccess::Grant::Error,'not_found_tmp') if !(-d $TMP_PATH);
|
|
push(@MySQLaccess::Grant::Error,'write_err_tmp') if !(-w $TMP_PATH);
|
|
if (@MySQLaccess::Grant::Error) {
|
|
MySQLaccess::Report::Print_Error_Messages() ;
|
|
exit 0;
|
|
}
|
|
|
|
#-----------------------
|
|
# get info/help if necc.
|
|
$print_usage=1;
|
|
if ( defined($Param{'version'}) ) {
|
|
MySQLaccess::Report::Print_Version();
|
|
$print_usage=0;
|
|
MySQLaccess::Report::Print_Footer();
|
|
MySQLaccess::DB::CloseConnection();
|
|
exit 0;
|
|
# exit 0;
|
|
}
|
|
if ( defined($Param{'relnotes'}) ) {
|
|
MySQLaccess::Report::Print_Relnotes();
|
|
$print_usage=0;
|
|
MySQLaccess::Report::Print_Footer();
|
|
MySQLaccess::DB::CloseConnection();
|
|
exit 0;
|
|
# exit 0;
|
|
}
|
|
if ( defined($Param{'plan'}) ) {
|
|
MySQLaccess::Report::Print_Plans();
|
|
$print_usage=0;
|
|
MySQLaccess::Report::Print_Footer();
|
|
MySQLaccess::DB::CloseConnection();
|
|
exit 0;
|
|
# exit 0;
|
|
}
|
|
if ( defined($Param{'howto'}) ) {
|
|
MySQLaccess::Report::Print_HowTo();
|
|
$print_usage=0;
|
|
MySQLaccess::Report::Print_Footer();
|
|
MySQLaccess::DB::CloseConnection();
|
|
exit 0;
|
|
# exit 0;
|
|
}
|
|
|
|
# -----------------------------
|
|
# generate a help-screen in CMD-mode
|
|
# or a blanc form in CGI-mode
|
|
if ( defined($Param{'help'})
|
|
or !defined($Param{'user'})
|
|
or !defined($Param{'host'})
|
|
or !defined($Param{'db'})
|
|
) {
|
|
push(@MySQLaccess::Grant::Error,'user_required') unless defined($Param{'user'});
|
|
push(@MySQLaccess::Grant::Error,'db_required') unless defined($Param{'db'});
|
|
push(@MySQLaccess::Grant::Error,'host_required') unless defined($Param{'host'});
|
|
MySQLaccess::Report::Print_Usage() if $print_usage;
|
|
exit 0;
|
|
}
|
|
|
|
|
|
# ----------------------------
|
|
# get hostname and local-ip
|
|
# for localhost
|
|
$localhost = MySQLaccess::Host::LocalHost();
|
|
$local_ip = MySQLaccess::Host::Name2IP($localhost);
|
|
$MySQLaccess::Host::localhost = MySQLaccess::Host::LocalHost();
|
|
$MySQLaccess::Host::local_ip = MySQLaccess::Host::Name2IP($localhost);
|
|
MySQLaccess::Debug::Print(3, "localhost name=$localhost, ip=$local_ip");
|
|
|
|
#-----------------------------------
|
|
# version of MySQL-server to connect
|
|
# to determine use of full where clause
|
|
$MySQLaccess::Host::SERVER = $Param{'old_server'} ? '3.20' : $SERVER;
|
|
|
|
#---------------------------------
|
|
# create the config file for mysql and mysqldump
|
|
# to avoid passing authentication info on the command line
|
|
#
|
|
MergeConfigFiles();
|
|
die "Unsafe config file found: $unsafeConfig\n" if $unsafeConfig;
|
|
if (defined($Param{'superuser'})) {
|
|
$MYSQL_CNF{'mysql'}{'user'} = $Param{'superuser'};
|
|
$MYSQL_CNF{'mysqldump'}{'user'} = $Param{'superuser'};
|
|
}
|
|
if (defined($Param{'spassword'})) {
|
|
if ( $CMD && length($Param{'spassword'}) == 0 ) {
|
|
$Param{'spassword'} =
|
|
PromptPass("Password for MySQL superuser $Param{'superuser'}: ");
|
|
}
|
|
if ( length($Param{'spassword'}) > 0 ) {
|
|
$MYSQL_CNF{'mysql'}{'password'} = $Param{'spassword'};
|
|
$MYSQL_CNF{'mysqldump'}{'password'} = $Param{'spassword'};
|
|
}
|
|
}
|
|
WriteTempConfigFile();
|
|
|
|
#---------------------------------
|
|
# Inform user if he has not enough
|
|
# privileges to read the access-db
|
|
if ( $nerror=MySQLaccess::DB::OpenConnection() ) {
|
|
MySQLaccess::Report::Print_Error_Access($nerror);
|
|
exit 0;
|
|
}
|
|
|
|
# -----------------------
|
|
# Read MySQL ACL-files
|
|
if ($nerror=MySQLaccess::Grant::ReadTables()) {
|
|
MySQLaccess::Report::Print_Error_Access($nerror);
|
|
exit 0;
|
|
};
|
|
if ($Param{'edit'} and $nerror=MySQLaccess::Grant::ReadTables('tmp')) {
|
|
MySQLaccess::Report::Print_Error_Access($nerror);
|
|
exit 0;
|
|
}
|
|
|
|
#---------------------------------
|
|
# reload temporay grant-tables
|
|
# with data from original ones
|
|
if ( defined($Param{'copy'}) ) {
|
|
$nerror=MySQLaccess::DB::LoadTmpTables();
|
|
if ($nerror) {
|
|
MySQLaccess::Report::Print_Error_Access($nerror);
|
|
exit 0;
|
|
}
|
|
my $msg = "The grant-rules are copied from the grant-tables to\n"
|
|
. "the temporary tables.";
|
|
MySQLaccess::Report::Print_Message([$msg]);
|
|
# MySQLaccess::Report::Print_Footer();
|
|
# MySQLaccess::DB::CloseConnection();
|
|
# exit 0;
|
|
}
|
|
|
|
|
|
#---------------------------------
|
|
# preview result of changes in the
|
|
# grant-tables
|
|
if ( defined($Param{'preview'}) ) {
|
|
$aref=MySQLaccess::Grant::Diff_Privileges();
|
|
MySQLaccess::Report::Print_Diff_ACL($aref);
|
|
# MySQLaccess::Report::Print_Footer();
|
|
# MySQLaccess::DB::CloseConnection();
|
|
# exit 0;
|
|
}
|
|
|
|
|
|
#---------------------------------
|
|
# reload grant-tables
|
|
# with data from temporary tables
|
|
if ( defined($Param{'commit'}) ) {
|
|
if ($nerror = MySQLaccess::DB::CommitGrantTables()) {
|
|
MySQLaccess::Report::Print_Error_Access($nerror);
|
|
exit 0;
|
|
}
|
|
my $msg = "The grant-rules have been copied from the temporary tables\n"
|
|
. "to the grant-tables.";
|
|
my $msg1= "Don't forget to do an 'mysqladmin reload' before these\n"
|
|
. "changes take effect.";
|
|
my $msg2= "A backup-version of your original grant-rules are saved in the\n"
|
|
. "backup-tables, so you can always perform a 1-level rollback.";
|
|
MySQLaccess::Report::Print_Message([$msg,$msg1,$msg2]);
|
|
# MySQLaccess::Report::Print_Footer();
|
|
# MySQLaccess::DB::CloseConnection();
|
|
# exit 0;
|
|
}
|
|
|
|
#---------------------------------
|
|
# restore previous grant-rules
|
|
# with data from backup tables
|
|
if ( defined($Param{'rollback'}) ) {
|
|
if ($nerror = MySQLaccess::DB::RollbackGrantTables()) {
|
|
MySQLaccess::Report::Print_Error_Access($nerror);
|
|
exit 0;
|
|
}
|
|
my $msg = "The old grant-rules have been copied back from the backup tables\n"
|
|
. "to the grant-tables.";
|
|
my $msg1= "Don't forget to do an 'mysqladmin reload' before these\n"
|
|
. "changes take effect.";
|
|
MySQLaccess::Report::Print_Message([$msg,$msg1]);
|
|
# MySQLaccess::Report::Print_Footer();
|
|
# MySQLaccess::DB::CloseConnection();
|
|
# exit 0;
|
|
}
|
|
#----------------------------------
|
|
# show edit-taskbar
|
|
if ( defined($Param{'edit'})) {
|
|
if ($MySQLaccess::CGI ) {
|
|
MySQLaccess::Report::Print_Edit();
|
|
$print_usage=0;
|
|
MySQLaccess::Report::Print_Footer();
|
|
MySQLaccess::DB::CloseConnection();
|
|
exit 0;
|
|
}
|
|
else {
|
|
MySQLaccess::Report::Print_Edit();
|
|
$print_usage=0;
|
|
MySQLaccess::Report::Print_Footer();
|
|
MySQLaccess::DB::CloseConnection();
|
|
exit 0;
|
|
}
|
|
}
|
|
|
|
|
|
# -----------------------------
|
|
# Build list of users,dbs,hosts
|
|
# to process...
|
|
@all_dbs = @{MySQLaccess::DB::Get_All_dbs($Param{'db'})};
|
|
@all_users = @{MySQLaccess::DB::Get_All_users($Param{'user'})};
|
|
@all_hosts = @{MySQLaccess::DB::Get_All_hosts($Param{'host'})};
|
|
#if EDIT-mode
|
|
#@all_dbs_tmp = @{MySQLaccess::DB::Get_All_dbs($Param{'db'},'tmp')};
|
|
#@all_users_tmp = @{MySQLaccess::DB::Get_All_users($Param{'user'},'tmp')};
|
|
#@all_hosts_tmp = @{MySQLaccess::DB::Get_All_hosts($Param{'host'},'tmp')};
|
|
|
|
# -----------------------------
|
|
# Report access-rights for each
|
|
# tuple (host,user,db)
|
|
#$headers=0;
|
|
my %Access = ();
|
|
foreach $host (@all_hosts) {
|
|
foreach $user (@all_users) {
|
|
foreach $db (@all_dbs) {
|
|
MySQLaccess::Grant::Initialize();
|
|
%Access = MySQLaccess::Grant::Get_Access_Rights($host,$user,$db);
|
|
MySQLaccess::Report::Print_Access_rights($host,$user,$db,\%Access);
|
|
}
|
|
}
|
|
}
|
|
|
|
# -----------------------------
|
|
# End script
|
|
MySQLaccess::Report::Print_Footer();
|
|
MySQLaccess::DB::CloseConnection();
|
|
exit 0;
|
|
|
|
#############################################################
|
|
# FUNCTIONS #
|
|
###############
|
|
sub GetMode {
|
|
my $cmd=0;
|
|
my $cgi=0;
|
|
if (defined($ENV{'HTTP_HOST'})) { $cmd=0; $cgi=1; }
|
|
else { $cmd=1; $cgi=0; }
|
|
return ($cmd,$cgi);
|
|
}
|
|
|
|
# ================================
|
|
# sub PromptPass
|
|
# prompt tty for a password
|
|
# ================================
|
|
sub PromptPass {
|
|
my ($prompt) = @_;
|
|
my $password;
|
|
$ENV{PATH} = "/bin:/usr/bin";
|
|
$ENV{IFS} = " \t\n";
|
|
$ENV{SHELL} = "/bin/sh";
|
|
system "stty -echo";
|
|
print $prompt;
|
|
chomp($password = <STDIN>);
|
|
print "\n";
|
|
system "stty echo";
|
|
$password;
|
|
}
|
|
|
|
# =================================
|
|
# sub CheckUnsafeFile
|
|
# tell if a config file containing a password is unsafe
|
|
# =================================
|
|
sub CheckUnsafeFile {
|
|
my ($fname) = @_;
|
|
my ($dev, $ino, $mode, $nlink,
|
|
$uid, $gid, $rdev, $size,
|
|
$atime, $mtime, $ctime, $blksize, $blocks) = stat($fname);
|
|
|
|
if ( $uid != $< ) { # unsafe if owned by other than current user
|
|
return 1;
|
|
}
|
|
if ( $mode & 066 ) { # unsafe if accessible by other
|
|
return 1;
|
|
}
|
|
$fname =~ s#/[^/]+$##;
|
|
if ( (length $fname) > 0 ) {
|
|
return CheckUnsafeDir($fname);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
# =================================
|
|
# sub CheckUnsafeDir
|
|
# tell if a directory is unsafe
|
|
# =================================
|
|
sub CheckUnsafeDir {
|
|
my ($fname) = @_;
|
|
my ($dev, $ino, $mode, $nlink,
|
|
$uid, $gid, $rdev, $size,
|
|
$atime, $mtime, $ctime, $blksize, $blocks) = stat($fname);
|
|
|
|
# not owned by me or root
|
|
if ( ($uid != $<) && ($uid != 0) ) {
|
|
return 1;
|
|
}
|
|
if ( $mode & 022 ) { # unsafe if writable by other
|
|
return 1 unless $mode & 01000; # but sticky bit ok
|
|
}
|
|
$fname =~ s#/[^/]+$##;
|
|
if ( (length $fname) > 0 ) {
|
|
return CheckUnsafeDir($fname);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
# =================================
|
|
# sub MergeConfigFile
|
|
# merge data from .cnf file
|
|
# =================================
|
|
sub MergeConfigFile {
|
|
my ($fname) = @_;
|
|
my ($group, $item, $value);
|
|
if ( open CNF, $fname ) {
|
|
while (<CNF>) {
|
|
s/^\s+//;
|
|
next if /^[#;]/;
|
|
if ( /\[\s*(\w+)\s*]/ ) {
|
|
$group = $1;
|
|
$group =~ tr/A-Z/a-z/;
|
|
if ( !exists $MYSQL_CNF{$group} ) {
|
|
undef $group;
|
|
}
|
|
} elsif ( defined $group ) {
|
|
($item, $value) = /((?:\w|-)+)\s*=\s*(\S+)/;
|
|
# don't unquote backslashes as we just write it back out
|
|
if ( defined $item ) {
|
|
if ( $item =~ /^password$/ ) {
|
|
if ( CheckUnsafeFile($fname) ) {
|
|
$unsafeConfig = $fname;
|
|
}
|
|
}
|
|
if ( $group eq 'client' ) {
|
|
$MYSQL_CNF{'mysql'}{$item} = $value;
|
|
$MYSQL_CNF{'mysqldump'}{$item} = $value;
|
|
} else {
|
|
$MYSQL_CNF{$group}{$item} = $value;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
close(CNF);
|
|
}
|
|
}
|
|
|
|
# =================================
|
|
# sub MergeConfigFiles
|
|
# merge options from config files
|
|
# NOTE: really should do two separate merges for each
|
|
# client to exactly duplicate order of resulting argument lists
|
|
# =================================
|
|
sub MergeConfigFiles {
|
|
my ($name,$pass,$uid,$gid,$quota,$comment,$gcos,$dir,$shell) = getpwuid $<;
|
|
MergeConfigFile("/etc/my.cnf");
|
|
MergeConfigFile("$dir/.my.cnf");
|
|
}
|
|
|
|
# =================================
|
|
# sub WriteTempConfigFile
|
|
# write
|
|
# =================================
|
|
sub WriteTempConfigFile {
|
|
sysopen CNFFILE, $MYSQL_CNF, O_RDWR|O_CREAT|O_EXCL, 0700
|
|
or die "sysopen $MYSQL_CNF: $!";
|
|
|
|
# groups may be in any order, generic groups such as [client] assumed
|
|
# here to be empty
|
|
foreach $group (keys %MYSQL_CNF) {
|
|
print CNFFILE "[$group]\n";
|
|
foreach $item (keys %{$MYSQL_CNF{$group}}) {
|
|
if ( defined $MYSQL_CNF{$group}{$item} ) {
|
|
print CNFFILE "$item=$MYSQL_CNF{$group}{$item}\n";
|
|
} else {
|
|
print CNFFILE "$item\n";
|
|
}
|
|
}
|
|
print CNFFILE "\n";
|
|
}
|
|
close(CNFFILE);
|
|
}
|
|
|
|
######################################################################
|
|
package MySQLaccess::DB;
|
|
###########
|
|
BEGIN {
|
|
$DEBUG = 2;
|
|
$DEBUG = $MySQLaccess::DEBUG unless ($DEBUG);
|
|
# Error-messages from the MySQL client
|
|
%ACCESS_ERR= ('Access_denied' => 'Access denied'
|
|
,'Dbaccess_denied' => 'Access to database denied'
|
|
,'Unrecognized_option' => 'unrecognized option'
|
|
,'Unknown_table' => "Can't find file:"
|
|
,'unknown_error' => '^ERROR:'
|
|
);
|
|
}
|
|
# ######################################
|
|
# Connecting to the MYSQL DB
|
|
# ======================================
|
|
# sub OpenConnection
|
|
# Open an connection to the mysql-db
|
|
# questions to MYSQL_Q
|
|
# answers from MYSQL_A
|
|
# ======================================
|
|
sub OpenConnection {
|
|
my $pid;
|
|
MySQLaccess::Debug::Print(2,"OpenConnection:");
|
|
|
|
# check path to mysql-client executable
|
|
if (! -f $MySQLaccess::MYSQL) {
|
|
if ($MySQLaccess::CMD) { die "Could not find MySQL-client '$MySQLaccess::MYSQL'"; }
|
|
if ($MySQLaccess::CGI) {
|
|
print "<center>\n<font color=Red>\n";
|
|
print "ERROR: Could not find MySQL-client '$MySQLaccess::MYSQL'";
|
|
print "</center>\n</font>\n";
|
|
exit 0;
|
|
}
|
|
}
|
|
|
|
# path to mysql executable
|
|
my $connect = "$MySQLaccess::MYSQL --defaults-file=$MySQLaccess::MYSQL_CNF";
|
|
$connect .= " $MySQLaccess::MYSQL_OPT";
|
|
# superuser, spassword transmitted via defaults-file
|
|
if (defined($MySQLaccess::Param{'rhost'})) { $connect .= " --host=$MySQLaccess::Param{'rhost'}"; }
|
|
# other options??
|
|
|
|
# grant-database
|
|
$connect .= " $MySQLaccess::ACCESS_DB";
|
|
|
|
# open connection (not using /bin/sh -c)
|
|
MySQLaccess::Debug::Print(2,"Connecting to: $connect");
|
|
$pid=IPC::Open3::open3(\*MYSQL_Q,\*MYSQL_A,"",split /\s+/,$connect);
|
|
MySQLaccess::Debug::Print(2,"PID of open pipe: $pid");
|
|
|
|
# check connection
|
|
print MYSQL_Q "select 'ok';\n";
|
|
$answer = <MYSQL_A>; #answer from mysql
|
|
MySQLaccess::Debug::Print(2,"Answer: $answer\n");
|
|
foreach $nerror (sort(keys(%ACCESS_ERR))) {
|
|
MySQLaccess::Debug::Print(3,"check answer for error $ACCESS_ERR{$nerror}");
|
|
if (grep(/$ACCESS_ERR{$nerror}/i,$answer)) {
|
|
MySQLaccess::Debug::Print(2,"Answer contain error [$nerror]");
|
|
return $nerror;
|
|
}
|
|
}
|
|
|
|
if (0) {
|
|
# check server-version
|
|
print MYSQL_Q "select 'ok';\n";
|
|
$answer = <MYSQL_A>; #answer from mysql
|
|
MySQLaccess::Debug::Print(2,"Answer: $answer\n");
|
|
foreach $nerror (sort(keys(%ACCESS_ERR))) {
|
|
MySQLaccess::Debug::Print(3,"check answer for error $ACCESS_ERR{$nerror}");
|
|
if (grep(/$ACCESS_ERR{$nerror}/i,$answer)) {
|
|
MySQLaccess::Debug::Print(2,"Answer contain error [$nerror]");
|
|
return $nerror;
|
|
}
|
|
}
|
|
}
|
|
|
|
my $skip=<MYSQL_A>;
|
|
return 0;
|
|
}
|
|
|
|
# ======================================
|
|
# sub CloseConnection
|
|
# Close the connection to the mysql-db
|
|
# ======================================
|
|
sub CloseConnection {
|
|
close MYSQL_Q;
|
|
close MYSQL_A;
|
|
}
|
|
|
|
# ===========================================================
|
|
# sub CreateTable($table)
|
|
# Create temporary/backup table
|
|
# ===========================================================
|
|
sub CreateTable {
|
|
my $pid;
|
|
my ($table,$force) = @_;
|
|
my %tables = ( $MySQLaccess::ACCESS_U_TMP => $MySQLaccess::ACCESS_U,
|
|
$MySQLaccess::ACCESS_H_TMP => $MySQLaccess::ACCESS_H,
|
|
$MySQLaccess::ACCESS_D_TMP => $MySQLaccess::ACCESS_D,
|
|
$MySQLaccess::ACCESS_U_BCK => $MySQLaccess::ACCESS_U,
|
|
$MySQLaccess::ACCESS_H_BCK => $MySQLaccess::ACCESS_H,
|
|
$MySQLaccess::ACCESS_D_BCK => $MySQLaccess::ACCESS_D,
|
|
$MySQLaccess::ACCESS_U => $MySQLaccess::ACCESS_U_BCK,
|
|
$MySQLaccess::ACCESS_H => $MySQLaccess::ACCESS_H_BCK,
|
|
$MySQLaccess::ACCESS_D => $MySQLaccess::ACCESS_D_BCK,
|
|
);
|
|
my $tbl;
|
|
my $query="";
|
|
my $delim;
|
|
my $skip;
|
|
my $create;
|
|
my @known_tables=();
|
|
|
|
# print STDERR "CreateTable($table)\n";
|
|
MySQLaccess::Debug::Print(1,"CreateTable($table):");
|
|
|
|
## error-handling
|
|
return 'Unknown_table' unless defined($tables{$table});
|
|
|
|
## build list of known/existing tables;
|
|
## if 'force' existing table is dropped first
|
|
if (defined($force) and $force) {
|
|
@known_tables = Show_Tables();
|
|
if (grep(/^$table$/,@known_tables)) {
|
|
$query = "DROP TABLE $table;";
|
|
}
|
|
}
|
|
|
|
## path to mysqldump executable
|
|
my $connect = $MySQLaccess::MYSQLDUMP;
|
|
$connect .= " --defaults-file=$MySQLaccess::MYSQL_CNF --no-data";
|
|
# superuser, spassword transmitted via defaults-file
|
|
if (defined($MySQLaccess::Param{'rhost'})) { $connect .= " --host=$MySQLaccess::Param{'rhost'}"; }
|
|
$connect .= " $MySQLaccess::ACCESS_DB";
|
|
$connect .= " $tables{$table}";
|
|
|
|
|
|
## get creation-data for original table
|
|
$create = '';
|
|
my $mysqldump = $connect;
|
|
$mysqldump =~ s/ \$TABLE / $tbl /;
|
|
|
|
# open connection (not using /bin/sh -c)
|
|
MySQLaccess::Debug::Print(2,"Connecting to: $connect");
|
|
$pid=IPC::Open3::open3(\*DONTCARE,\*CREATE,"",split /\s+/,$mysqldump);
|
|
MySQLaccess::Debug::Print(2,"PID of open pipe: $pid");
|
|
#open(CREATE,"$mysqldump");
|
|
@create = <CREATE>;
|
|
$create = "@create";
|
|
foreach $nerror (sort(keys(%ACCESS_ERR))) {
|
|
MySQLaccess::Debug::Print(3,"check answer for error $ACCESS_ERR{$nerror}");
|
|
if (grep(/$ACCESS_ERR{$nerror}/i,$create)) {
|
|
MySQLaccess::Debug::Print(2,"Answer contain error [$nerror]");
|
|
return $nerror;
|
|
}
|
|
}
|
|
close(CREATE);
|
|
close(DONTCARE);
|
|
|
|
## manipulate result for creation-data for temporary table
|
|
$create =~ s/CREATE TABLE $tables{$table} \(/CREATE TABLE $table \(/;
|
|
|
|
## recreate temporary table
|
|
$query .= "$create\n";
|
|
$query .= "select 'ok';";
|
|
|
|
## execute query
|
|
print MYSQL_Q "$query\n";
|
|
# print STDERR $query;
|
|
|
|
$answer = <MYSQL_A>; #answer from mysql
|
|
# print STDERR "A>",$answer;
|
|
MySQLaccess::Debug::Print(2,"Answer: $answer\n");
|
|
foreach $nerror (sort(keys(%ACCESS_ERR))) {
|
|
# print STDERR "->$nerror?";
|
|
MySQLaccess::Debug::Print(3,"check answer for error $ACCESS_ERR{$nerror}");
|
|
if (grep(/$ACCESS_ERR{$nerror}/i,$answer)) {
|
|
# print STDERR "Yes!";
|
|
MySQLaccess::Debug::Print(2,"Answer contain error [$nerror]");
|
|
return $nerror;
|
|
}
|
|
}
|
|
|
|
$delim = <MYSQL_A>; # read header
|
|
if ($delim ne "ok\n") {
|
|
while (($line=<MYSQL_A>) ne "ok\n")
|
|
{ MySQLaccess::Debug::Print(3," A> $line"); }
|
|
$skip = <MYSQL_A>; # skip result 'ok'
|
|
}
|
|
# print STDERR "CreateTable done\n";
|
|
return 0;
|
|
}
|
|
|
|
|
|
# ===========================================================
|
|
# sub CopyTable()
|
|
# Copy the structure and the data of a table to another table
|
|
# ===========================================================
|
|
sub CopyTable {
|
|
my ($from,$to,$force) = @_;
|
|
my @known_tables = Show_Tables();
|
|
my $query = "";
|
|
my $nerror= 0;
|
|
my $skip;
|
|
|
|
# print STDERR "CopyTable($from,$to)\n";
|
|
MySQLaccess::Debug::Print(1,"MySQLaccess::DB::CopyTable($from,$to)");
|
|
|
|
## error-handling
|
|
if (!grep(/^$from$/,@known_tables)) { return 'Unknown_table'; }
|
|
|
|
## copy structure
|
|
## if forced
|
|
if (defined($force) and $force) {
|
|
return $nerror if ($nerror=CreateTable($to,$force));
|
|
# print STDERR "Structure copied\n";
|
|
}
|
|
|
|
## copy data
|
|
$query .= "DELETE FROM $to;";
|
|
$query .= "INSERT INTO $to SELECT * FROM $from;";
|
|
$query .= "SELECT 'ok';\n";
|
|
MySQLaccess::Debug::Print(2,"Query: $query");
|
|
|
|
## execute query
|
|
print MYSQL_Q "$query\n";
|
|
# print STDERR $query;
|
|
|
|
## check for errors...
|
|
my $answer = <MYSQL_A>; #answer from mysql
|
|
# print STDERR $answer;
|
|
MySQLaccess::Debug::Print(2,"Answer: $answer\n");
|
|
foreach $nerror (sort(keys(%ACCESS_ERR))) {
|
|
MySQLaccess::Debug::Print(3,"check answer for error $ACCESS_ERR{$nerror}");
|
|
if (grep(/$ACCESS_ERR{$nerror}/i,$answer)) {
|
|
MySQLaccess::Debug::Print(2,"Answer contain error [$nerror]");
|
|
return $nerror;
|
|
}
|
|
}
|
|
|
|
my $delim = <MYSQL_A>; # read header
|
|
# print STDERR $delim;
|
|
if ($delim ne "ok\n") {
|
|
while (($line=<MYSQL_A>) ne "ok\n")
|
|
{ MySQLaccess::Debug::Print(3," A> $line"); }
|
|
$skip = <MYSQL_A>; # skip result 'ok'
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
# ===========================================================
|
|
# sub LoadTmpTables()
|
|
# (Re)load temporary tables with entries of ACL-tables
|
|
# ===========================================================
|
|
sub LoadTmpTables {
|
|
my %tables = ( $MySQLaccess::ACCESS_U => $MySQLaccess::ACCESS_U_TMP,
|
|
$MySQLaccess::ACCESS_H => $MySQLaccess::ACCESS_H_TMP,
|
|
$MySQLaccess::ACCESS_D => $MySQLaccess::ACCESS_D_TMP,
|
|
);
|
|
my $tbl;
|
|
my $nerror;
|
|
|
|
# print STDERR "LoadTmpTables:\n";
|
|
MySQLaccess::Debug::Print(1,"LoadTmpTables():");
|
|
foreach $tbl (keys(%tables)) {
|
|
# print STDERR "$tbl -> $tables{$tbl}\n";
|
|
MySQLaccess::Debug::Print(2,"Loading table $tbl -> $tables{$tbl}.");
|
|
return $nerror if ($nerror=CopyTable($tbl,$tables{$tbl},'force'));
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
# ===========================================================
|
|
# sub BackupGrantTables()
|
|
# Make a backup of the original grant-tables
|
|
# ===========================================================
|
|
sub BackupGrantTables {
|
|
my %tables = ( $MySQLaccess::ACCESS_U => $MySQLaccess::ACCESS_U_BCK,
|
|
$MySQLaccess::ACCESS_H => $MySQLaccess::ACCESS_H_BCK,
|
|
$MySQLaccess::ACCESS_D => $MySQLaccess::ACCESS_D_BCK,
|
|
);
|
|
my $tbl;
|
|
my $nerror;
|
|
|
|
# print STDERR "BackupGrantTables:\n";
|
|
MySQLaccess::Debug::Print(1,"BackupGrantTables():");
|
|
foreach $tbl (keys(%tables)) {
|
|
# print STDERR "$tbl -> $tables{$tbl}\n";
|
|
MySQLaccess::Debug::Print(2,"Backup table $tbl -> $tables{$tbl}.");
|
|
return $nerror if ($nerror=CopyTable($tbl,$tables{$tbl},'force'));
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
# ===========================================================
|
|
# sub RollbackGrantTables()
|
|
# Rollback the backup of the grant-tables
|
|
# ===========================================================
|
|
sub RollbackGrantTables {
|
|
my %tables = ( $MySQLaccess::ACCESS_U_BCK => $MySQLaccess::ACCESS_U,
|
|
$MySQLaccess::ACCESS_H_BCK => $MySQLaccess::ACCESS_H,
|
|
$MySQLaccess::ACCESS_D_BCK => $MySQLaccess::ACCESS_D,
|
|
);
|
|
my $tbl;
|
|
my $nerror;
|
|
|
|
# print STDERR "RollbackGrantTables:\n";
|
|
MySQLaccess::Debug::Print(1,"RollbackGrantTables():");
|
|
foreach $tbl (keys(%tables)) {
|
|
# print STDERR "$tbl -> $tables{$tbl}\n";
|
|
MySQLaccess::Debug::Print(2,"Rollback table $tbl -> $tables{$tbl}.");
|
|
return $nerror if ($nerror=CopyTable($tbl,$tables{$tbl},'force'));
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
# ===========================================================
|
|
# sub CommitGrantTables()
|
|
# Copy grant-rules from temporary tables to the ACL-tables
|
|
# ===========================================================
|
|
sub CommitGrantTables {
|
|
my %tables = ( $MySQLaccess::ACCESS_U => $MySQLaccess::ACCESS_U_TMP,
|
|
$MySQLaccess::ACCESS_H => $MySQLaccess::ACCESS_H_TMP,
|
|
$MySQLaccess::ACCESS_D => $MySQLaccess::ACCESS_D_TMP,
|
|
);
|
|
my $tbl;
|
|
my $query;
|
|
my $delim;
|
|
my $skip;
|
|
my $create;
|
|
|
|
print STDERR "CommitGrantTables()\n";
|
|
MySQLaccess::Debug::Print(1,"CommitGrantTables():");
|
|
|
|
## Make backup of original grant-tables
|
|
MySQLaccess::Debug::Print(2,"Making backup of original grant-tables...");
|
|
BackupGrantTables();
|
|
|
|
## Copy data from temporay tables to grant-tables
|
|
foreach $tbl (keys(%tables)) {
|
|
print STDERR "$tbl -> $tables{$tbl}\n";
|
|
MySQLaccess::Debug::Print(2,"Loading data $tables{$tbl} -> $tbl.");
|
|
return $nerror if ($nerror=CopyTable($tables{$tbl},$tbl));
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
# ===========================================================
|
|
# sub Show_Fields($table):
|
|
# return (a reference to) a hash which holds the names
|
|
# of all relevant grant-fields, with their index in the record,
|
|
# and (a reference to) an array which holds the fieldnames.
|
|
# ===========================================================
|
|
sub Show_Fields {
|
|
my ($table) = @_;
|
|
my %skip = ('host' => [0,1]
|
|
,'user' => [0,1,2]
|
|
,'db' => [0,1,2]
|
|
);
|
|
my %Struct = ();
|
|
my @Struct = ();
|
|
my $query = "show fields from $table;select 'ok';\n";
|
|
my $i=0;
|
|
my $line;
|
|
|
|
#print STDERR $query;
|
|
MySQLaccess::Debug::Print(1,"Show_Fields($table):");
|
|
MySQLaccess::Debug::Print(2,"SQL: $query");
|
|
|
|
print MYSQL_Q "$query";
|
|
my $skip = <MYSQL_A>; #skip header
|
|
while (($line=<MYSQL_A>) ne "ok\n")
|
|
{
|
|
#print STDERR ">",$line;
|
|
chop($line);
|
|
MySQLaccess::Debug::Print(2," $table>: $line");
|
|
my ($field,$type,$null,$key,$default,$extra) = split(' ',$line);
|
|
$field = ucfirst($field);
|
|
MySQLaccess::Debug::Print(3, " <split: $field - $type - $null - $key - $default - $extra");
|
|
if (! grep(/$i/,@{$skip{$table}}) ){
|
|
$Struct{$field} = $i; #hash
|
|
push(@Struct,$field); #array
|
|
MySQLaccess::Debug::Print(3," ==> added column[$i]: $field ($Struct{$field})");
|
|
}
|
|
else {
|
|
MySQLaccess::Debug::Print(3," ==> skipped column[$i], value=[$field]");
|
|
}
|
|
$i++;
|
|
}
|
|
|
|
$skip=<MYSQL_A>; # Get ok row (found already ok header)
|
|
|
|
MySQLaccess::Debug::Print(2, "Array:");
|
|
foreach $field (@Struct) { MySQLaccess::Debug::Print(2,"+ $field"); }
|
|
MySQLaccess::Debug::Print(2,"Hash:");
|
|
foreach $field (keys(%Struct)) { MySQLaccess::Debug::Print(2,"+ $field -> $Struct{$field}"); }
|
|
|
|
return (\%Struct,\@Struct);
|
|
}
|
|
|
|
# ===========================================================
|
|
# sub Show_Tables():
|
|
# return (a reference to) an array which holds all
|
|
# known tables.
|
|
# ===========================================================
|
|
sub Show_Tables {
|
|
my @Tables = ();
|
|
my $query = "show tables;select 'ok';\n";
|
|
my $i=0;
|
|
my $line;
|
|
|
|
MySQLaccess::Debug::Print(1,"Show_Tables():");
|
|
MySQLaccess::Debug::Print(2,"SQL: $query");
|
|
|
|
print MYSQL_Q "$query";
|
|
my $skip = <MYSQL_A>; #skip header
|
|
while (($line=<MYSQL_A>) ne "ok\n")
|
|
{
|
|
chop($line);
|
|
push(@Tables,$line); #array
|
|
MySQLaccess::Debug::Print(3," ==> added table: $line");
|
|
}
|
|
|
|
$skip=<MYSQL_A>; # Get ok row (found already ok header)
|
|
|
|
MySQLaccess::Debug::Print(2, "Array:");
|
|
foreach $tbl (@Tables) { MySQLaccess::Debug::Print(2,"+ $tbl"); }
|
|
|
|
return @Tables;
|
|
}
|
|
|
|
# ======================================
|
|
# sub Validate_Password($passwd,$host,$user,$encpw)
|
|
# Validate the given password
|
|
# for user '$user'
|
|
# connecting from host '$host'
|
|
# ======================================
|
|
sub Validate_Password {
|
|
my ($password,$host,$user,$encpw) = @_;
|
|
my $valid=0;
|
|
|
|
MySQLaccess::Debug::Print(1,"Validate_Password($password,$host,$user,$encpw)");
|
|
my $sql = "select host,user,password from user having "
|
|
."host='$host' and user='$user' and password='$encpw' "
|
|
."and password=PASSWORD('$password');\n";
|
|
$sql .= "select 'ok';\n";
|
|
MySQLaccess::Debug::Print(2,"SQL = $sql");
|
|
print MYSQL_Q "$sql";
|
|
|
|
# if password is valid, at least 1 row returns before we read 'ok'
|
|
while ( ($line=<MYSQL_A>) ne "ok\n") {
|
|
MySQLaccess::Debug::Print(2," A> $line");
|
|
$valid = defined($line);
|
|
}
|
|
my $skip = <MYSQL_A>; # read 'ok'
|
|
|
|
return $valid;
|
|
}
|
|
|
|
|
|
# ==========================================================
|
|
# sub Sort_fields: (rewritten by psmith)
|
|
# Build the query for an ordered list of entries
|
|
# ==========================================================
|
|
sub Sort_fields {
|
|
my ($start, $end, $sofar, $this, @rest) = (@_);
|
|
my @where = ("((FIELD not like '\\%') AND (FIELD <> ''))",
|
|
"((FIELD like '%\\%%') OR (FIELD like '%\\_%'))",
|
|
"(FIELD = '')");
|
|
my $res = '';
|
|
|
|
$this or return ("$start $sofar $end");
|
|
|
|
$sofar .= ' AND ' if $sofar;
|
|
|
|
foreach $w (@where) {
|
|
my $f = $w;
|
|
$f =~ s/FIELD/$this/g;
|
|
|
|
$res .= Sort_fields($start, $end, "$sofar$f", @rest);
|
|
}
|
|
|
|
return ($res);
|
|
}
|
|
|
|
# ===========================================================
|
|
# sub Sort_table: (rewritten by psmith)
|
|
# return all entries in the given table,
|
|
# in an ordered fashion
|
|
# ===========================================================
|
|
sub Sort_table {
|
|
my ($tbl, @order) = @_;
|
|
my @res=();
|
|
|
|
# as long as there's no full where clause (Distrib 3.20)...
|
|
# use having :-(
|
|
# NOTE: this clause WILL NOT work on 3.21, because of the
|
|
# order of 'ORDER BY' and 'HAVING'
|
|
my $start = "SELECT *,UCASE(host) as ucase_host FROM $tbl ";
|
|
$start .= 'ORDER BY ' . join(',', @order) ." HAVING ";
|
|
my $end = ";\n";
|
|
|
|
# server version 3.21 has a full where clause :-)
|
|
if ($MySQLaccess::Host::SERVER >= '3.21') {
|
|
print "+++USING FULL WHERE CLAUSE+++\n";
|
|
$start = "SELECT *,UCASE(host) as ucase_host FROM $tbl WHERE ";
|
|
$end = ' ORDER BY ' . join(',', @order) . ";\n";
|
|
}
|
|
|
|
MySQLaccess::Debug::Print(1,"Sort_table():");
|
|
MySQLaccess::Debug::Print(2,"Sorting table $tbl by `@order'");
|
|
|
|
my $tmp;
|
|
foreach $tmp (@order)
|
|
{
|
|
$tmp="UCASE(host)" if ($tmp eq "ucase_host");
|
|
}
|
|
my $query = Sort_fields($start, $end, '', @order);
|
|
$query .= "select 'ok';\n";
|
|
MySQLaccess::Debug::Print(2,"Query: $query");
|
|
|
|
print MYSQL_Q "$query\n";
|
|
|
|
my $delim = <MYSQL_A>; # read header
|
|
MySQLaccess::Debug::Print(3," A> $delim");
|
|
if ($delim ne "ok\n") {
|
|
if ($delim =~ /^ERROR/) {
|
|
push(@MySQLaccess::Grant::Error,'use_old_server');
|
|
MySQLaccess::Report::Print_Error_Messages() ;
|
|
exit 1;
|
|
}
|
|
while (($line=<MYSQL_A>) ne "ok\n")
|
|
{
|
|
MySQLaccess::Debug::Print(3," A> $line");
|
|
push(@res,$line);
|
|
}
|
|
}
|
|
my $skip = <MYSQL_A>; # skip result 'ok'
|
|
|
|
# remove columnheaders from output
|
|
@res = grep(!/^\Q$delim\E$/, @res);
|
|
# remove trailing \n from each returned record
|
|
chomp(@res);
|
|
# each record has 1 field to much : ucase_host
|
|
@res = grep { /(.*)\t.*$/; $_ = $1; } @res;
|
|
|
|
MySQLaccess::Debug::Print(2,"Result of sorted table $tbl:");
|
|
foreach $line (@res) { MySQLaccess::Debug::Print(2," >>$line"); }
|
|
return @res;
|
|
}
|
|
|
|
# ===========================================================
|
|
# sub Get_All_db(template):
|
|
# return all db the grant-tables are working on,
|
|
# which conform to the template
|
|
# ===========================================================
|
|
sub Get_All_dbs {
|
|
my ($template,$tmp) = @_;
|
|
my @db=();
|
|
my $aref;
|
|
|
|
# working with temporary tables or production tables
|
|
if (defined($tmp) and $tmp) {
|
|
$aref = \@MySQLaccess::Grant::sorted_db_tmp_table ;
|
|
}
|
|
else {
|
|
$aref = \@MySQLaccess::Grant::sorted_db_table;
|
|
}
|
|
|
|
MySQLaccess::Debug::Print(1," template=[$template]");
|
|
|
|
# get all db for which access-rights can be calculated,
|
|
# which conform to the template.
|
|
# !! these db's don't have to exist yet, so it's not
|
|
# enough to look which db already exist on the system
|
|
$reg_expr = $template;
|
|
if ($template =~ /[\*\?]/) {
|
|
$reg_expr =~ tr/*?/%_/;
|
|
#$reg_expr = MySQLaccess::Wildcards::Wild2Reg($template);
|
|
}
|
|
$reg_expr = MySQLaccess::Wildcards::SQL2Reg("$reg_expr");
|
|
|
|
if ( ! ($template =~ /[\*\?%_]/) ) {
|
|
push(@db,$template);
|
|
return \@db;
|
|
}
|
|
|
|
MySQLaccess::Debug::Print(2,"#Reading db-table...");
|
|
foreach $record (@{$aref}) { #MySQLaccess::Grant::sorted_db_table) {
|
|
my @record=split(/\t/,$record);
|
|
my $db = $record[1];
|
|
MySQLaccess::Debug::Print(2,"> $db ");
|
|
if ( (!grep(/$db/i,@db)) and ($db =~/$reg_expr/i) ) {
|
|
push(@db,$db);
|
|
MySQLaccess::Debug::Print(2,"added");
|
|
}
|
|
else {
|
|
MySQLaccess::Debug::Print(2,"skipped");
|
|
}
|
|
}
|
|
# if no rule is found for a certain db in the db-table,
|
|
# the rights of the user are used, so we should inform
|
|
# the user for
|
|
if (!grep(/^%$/,@db)) { push(@db,"$MySQLaccess::NEW_DB"); }
|
|
return \@db;
|
|
}
|
|
|
|
# ===========================================================
|
|
# sub Get_All_users(template):
|
|
# return all users the grant-tables are working on,
|
|
# which conform to the template
|
|
# ===========================================================
|
|
sub Get_All_users {
|
|
($template,$tmp) = @_; # nog verder uitwerken!!!
|
|
my @user=();
|
|
my $aref;
|
|
|
|
# working with temporary tables or production tables
|
|
if (defined($tmp) and $tmp) {
|
|
$aref = \@MySQLaccess::Grant::sorted_user_tmp_table ;
|
|
}
|
|
else {
|
|
$aref = \@MySQLaccess::Grant::sorted_user_table;
|
|
}
|
|
|
|
MySQLaccess::Debug::Print(1,"Debug Get_All_users:");
|
|
# get all db for which access-rights can be calculated.
|
|
# !! these db's don't have to exist yet, so it's not
|
|
# enough to look which db already exist on the system
|
|
$reg_expr = $template;
|
|
if ($template =~ /[\*\?]/) {
|
|
$reg_expr =~ tr/*?/%_/;
|
|
#$reg_expr = MySQLaccess::Wildcards::Wild2Reg($template);
|
|
}
|
|
$reg_expr = MySQLaccess::Wildcards::SQL2Reg("$reg_expr");
|
|
|
|
if ( ! ($template =~ /[\*\?%_]/) ) {
|
|
push(@user,$template);
|
|
return \@user;
|
|
}
|
|
|
|
MySQLaccess::Debug::Print(2,"#Reading user-table...");
|
|
foreach $record (@{$aref}) { #MySQLaccess::Grant::sorted_user_table) {
|
|
my @record=split(/\t/,$record);
|
|
my $user = $record[1];
|
|
MySQLaccess::Debug::Print(2,"> $user ");
|
|
if ( (!grep(/$user/,@user)) and ($user=~/$reg_expr/)) {
|
|
push(@user,$user);
|
|
MySQLaccess::Debug::Print(2, "added");
|
|
}
|
|
else {
|
|
MySQLaccess::Debug::Print(2, "skipped");
|
|
}
|
|
}
|
|
# Any user means also:
|
|
# - the 'empty' user, ie without supplying a username
|
|
# - any user still to be defined/created
|
|
#push(@user,''); #without_suplying_a_username
|
|
push(@user,"$MySQLaccess::NEW_USER");
|
|
#push(@Warnings,'minimum_priv');
|
|
return \@user;
|
|
}
|
|
|
|
# ===========================================================
|
|
# sub Get_All_hosts(template):
|
|
# return all hosts the grant-tables are working on,
|
|
# which conform to the template
|
|
# ===========================================================
|
|
sub Get_All_hosts {
|
|
my ($template,$tmp) = @_;
|
|
my @host=();
|
|
my $aref;
|
|
my $aref1;
|
|
|
|
# working with temporary tables or production tables
|
|
if (defined($tmp) and $tmp) {
|
|
$aref = \@MySQLaccess::Grant::sorted_host_tmp_table ;
|
|
$aref1= \@MySQLaccess::Grant::sorted_db_tmp_table ;
|
|
}
|
|
else {
|
|
$aref = \@MySQLaccess::Grant::sorted_host_table;
|
|
$aref1= \@MySQLaccess::Grant::sorted_db_table ;
|
|
}
|
|
|
|
MySQLaccess::Debug::Print(1, "Debug Get_All_hosts:");
|
|
# get all db for which access-rights can be calculated.
|
|
# !! these db's don't have to exist yet, so it's not
|
|
# enough to look which db already exist on the system
|
|
$reg_expr = $template;
|
|
if ($template =~ /[\*\?]/) {
|
|
$reg_expr =~ tr/*?/%_/;
|
|
#$reg_expr = MySQLaccess::Wildcards::Wild2Reg($template);
|
|
}
|
|
$reg_expr = MySQLaccess::Wildcards::SQL2Reg("$reg_expr");
|
|
|
|
if ( ! ($template =~ /[\*\?%_]/) ) {
|
|
push(@host,$template);
|
|
return \@host;
|
|
}
|
|
|
|
MySQLaccess::Debug::Print(1, "#Reading db-table...");
|
|
foreach $record (@{$aref1}) { #MySQLaccess::Grant::sorted_db_table) {
|
|
my @record=split(/\t/,$record);
|
|
my $host = $record[0];
|
|
MySQLaccess::Debug::Print(2, "> $host ");
|
|
if (! grep(/$host/i,@host)) {
|
|
push(@host,$host);
|
|
MySQLaccess::Debug::Print(2, "added");
|
|
}
|
|
else {
|
|
MySQLaccess::Debug::Print(2, "skipped");
|
|
}
|
|
}
|
|
MySQLaccess::Debug::Print(1, "#Reading host-table...");
|
|
foreach $record (@{$aref}) {
|
|
my @record=split(/\t/,$record);
|
|
my $host = $record[0];
|
|
MySQLaccess::Debug::Print(2, "> $host ");
|
|
if ( (!grep(/$host/,@host)) and ($host=~/$reg_expr/)) {
|
|
push(@host,$host);
|
|
MySQLaccess::Debug::Print(2, "added");
|
|
}
|
|
else {
|
|
MySQLaccess::Debug::Print(2, "skipped");
|
|
}
|
|
}
|
|
# DOUBT:
|
|
#print "#Reading user-table...\n" if ($DEBUG>1);
|
|
#foreach $record (@MySQLaccess::Grant::sorted_user_table) {
|
|
# my @record=split(/\t/,$record);
|
|
# my $host = $record[0];
|
|
# print "> $host " if ($DEBUG>2);
|
|
# if ( (!grep(/$host/,@host)) and ($host=~/$reg_expr/)) {
|
|
# push(@host,$host);
|
|
# print "added\n" if ($DEBUG>2);
|
|
# }
|
|
# else {
|
|
# print "skipped\n" if ($DEBUG>2);
|
|
# }
|
|
#}
|
|
# Any host also means:
|
|
# - any host still to be defined/created
|
|
#push(@host,"any_other_host");
|
|
|
|
@host = sort(@host);
|
|
return \@host;
|
|
}
|
|
|
|
|
|
##########################################################################
|
|
package MySQLaccess::Grant;
|
|
##############
|
|
BEGIN {
|
|
$DEBUG = 0;
|
|
$DEBUG = $MySQLaccess::DEBUG unless ($DEBUG);
|
|
}
|
|
|
|
|
|
|
|
# ===========================================================
|
|
# sub Diff_Privileges()
|
|
# Calculate diff between temporary and original grant-tables
|
|
# ===========================================================
|
|
sub Diff_Privileges {
|
|
my @before=();
|
|
my @after =();
|
|
my @diffs =();
|
|
|
|
# -----------------------------
|
|
# Build list of users,dbs,hosts
|
|
# to process...
|
|
my @all_dbs = @{MySQLaccess::DB::Get_All_dbs('*')};
|
|
my @all_users = @{MySQLaccess::DB::Get_All_users('*')};
|
|
my @all_hosts = @{MySQLaccess::DB::Get_All_hosts('*')};
|
|
#if EDIT-mode
|
|
my @all_dbs_tmp = @{MySQLaccess::DB::Get_All_dbs('*','tmp')};
|
|
my @all_users_tmp = @{MySQLaccess::DB::Get_All_users('*','tmp')};
|
|
my @all_hosts_tmp = @{MySQLaccess::DB::Get_All_hosts('*','tmp')};
|
|
|
|
|
|
my %Access;
|
|
# ------------------------------------
|
|
# Build list of priv. for grant-tables
|
|
foreach $host (@all_hosts) {
|
|
foreach $user (@all_users) {
|
|
foreach $db (@all_dbs) {
|
|
MySQLaccess::Grant::Initialize();
|
|
%Access = MySQLaccess::Grant::Get_Access_Rights($host,$user,$db);
|
|
push(@before,MySQLaccess::Report::Raw_Report($host,$user,$db,\%Access));
|
|
}
|
|
}
|
|
}
|
|
|
|
# ----------------------------------
|
|
# Build list of priv. for tmp-tables
|
|
foreach $host (@all_hosts_tmp) {
|
|
foreach $user (@all_users_tmp) {
|
|
foreach $db (@all_dbs_tmp) {
|
|
MySQLaccess::Grant::Initialize('tmp');
|
|
%Access = MySQLaccess::Grant::Get_Access_Rights($host,$user,$db,'tmp');
|
|
push(@after,MySQLaccess::Report::Raw_Report($host,$user,$db,\%Access));
|
|
}
|
|
}
|
|
}
|
|
|
|
# ----------------------------------
|
|
# Write results to temp-file to make
|
|
# DIFF
|
|
@before = sort(@before);
|
|
@after = sort(@after);
|
|
|
|
$before = "$MySQLaccess::TMP_PATH/$MySQLaccess::script.before.$$";
|
|
$after = "$MySQLaccess::TMP_PATH/$MySQLaccess::script.after.$$";
|
|
#$after = "/tmp/t0";
|
|
open(BEFORE,"> $before") ||
|
|
push(@MySQLaccess::Report::Errors,"Can't open temporary file $before for writing");
|
|
open(AFTER,"> $after") ||
|
|
push(@MySQLaccess::Report::Errors,"Can't open temporary file $after for writing");
|
|
print BEFORE join("\n",@before);
|
|
print AFTER join("\n",@after);
|
|
close(BEFORE);
|
|
close(AFTER);
|
|
|
|
# ----------------------------------
|
|
# compute difference
|
|
my $cmd="$MySQLaccess::DIFF $before $after |";
|
|
open(DIFF,"$cmd");
|
|
@diffs = <DIFF>;
|
|
@diffs = grep(/[<>]/,@diffs);
|
|
chomp(@diffs);
|
|
close(DIFF);
|
|
|
|
# ----------------------------------
|
|
# cleanup temp. files
|
|
unlink(BEFORE);
|
|
unlink(AFTER);
|
|
|
|
return \@diffs;
|
|
}
|
|
|
|
# ===========================================================
|
|
# sub Initialize()
|
|
#
|
|
# ===========================================================
|
|
sub Initialize {
|
|
%MySQLaccess::Grant::Access = %{Default_Access_Rights()};
|
|
@MySQLaccess::Grant::Errors = ();
|
|
@MySQLaccess::Grant::Warnings = ();
|
|
@MySQLaccess::Grant::Notes = ();
|
|
# -----
|
|
# rules
|
|
$MySQLaccess::Grant::Rules{'user'} = 'no_rule_found';
|
|
$MySQLaccess::Grant::Rules{'db'} = 'no_rule_found';
|
|
$MySQLaccess::Grant::Rules{'host'} = 'no_equiv_host';
|
|
$MySQLaccess::Grant::full_access = 1;
|
|
|
|
$MySQLaccess::Grant::process_host_table = 0;
|
|
return 1;
|
|
}
|
|
|
|
# ===========================================================
|
|
# sub ReadTables()
|
|
#
|
|
# ===========================================================
|
|
sub ReadTables {
|
|
my ($tmp) = @_;
|
|
my ($HOST,$DB,$USER);
|
|
my @tables;
|
|
|
|
# build list of available tables
|
|
@tables = MySQLaccess::DB::Show_Tables();
|
|
|
|
# reading production grant-tables or temporary tables?
|
|
$tmp = (defined($tmp) and $tmp) ? 1 : 0;
|
|
if ($tmp) { #reading temporary tables
|
|
$HOST=$MySQLaccess::ACCESS_H_TMP;
|
|
$DB =$MySQLaccess::ACCESS_D_TMP;
|
|
$USER=$MySQLaccess::ACCESS_U_TMP;
|
|
|
|
# ----------------------------
|
|
# do tables exist?
|
|
if (!grep(/$HOST/,@tables)) { MySQLaccess::DB::CreateTable($HOST); }
|
|
if (!grep(/$USER/,@tables)) { MySQLaccess::DB::CreateTable($USER); }
|
|
if (!grep(/$DB/,@tables)) { MySQLaccess::DB::CreateTable($DB); }
|
|
|
|
MySQLaccess::Debug::Print(1,"Finding fields in tmp-ACL files:");
|
|
# -----------------------------
|
|
# Get record-layout
|
|
my ($h1,$h2) = MySQLaccess::DB::Show_Fields($HOST);
|
|
my ($d1,$d2) = MySQLaccess::DB::Show_Fields($DB);
|
|
my ($u1,$u2) = MySQLaccess::DB::Show_Fields($USER);
|
|
%MySQLaccess::Grant::H_tmp = %{$h1}; @MySQLaccess::Grant::H_tmp = @{$h2};
|
|
%MySQLaccess::Grant::D_tmp = %{$d1}; @MySQLaccess::Grant::D_tmp = @{$d2};
|
|
%MySQLaccess::Grant::U_tmp = %{$u1}; @MySQLaccess::Grant::U_tmp = @{$u2};
|
|
|
|
# @MySQLaccess::Grant::Privileges_tmp=@{Make_Privlist()};
|
|
#
|
|
MySQLaccess::Debug::Print(1, "Reading sorted temp-tables:");
|
|
@MySQLaccess::Grant::sorted_db_tmp_table = MySQLaccess::DB::Sort_table($DB, 'ucase_host', 'user', 'db');
|
|
@MySQLaccess::Grant::sorted_host_tmp_table= MySQLaccess::DB::Sort_table($HOST, 'ucase_host', 'db');
|
|
@MySQLaccess::Grant::sorted_user_tmp_table= defined($MySQLaccess::Param{'password'}) ?
|
|
MySQLaccess::DB::Sort_table($USER, 'ucase_host', 'user', 'password'):
|
|
MySQLaccess::DB::Sort_table($USER, 'ucase_host', 'user');
|
|
}
|
|
else { #reading production grant-tables
|
|
$HOST=$MySQLaccess::ACCESS_H;
|
|
$DB =$MySQLaccess::ACCESS_D;
|
|
$USER=$MySQLaccess::ACCESS_U;
|
|
|
|
MySQLaccess::Debug::Print(1,"Finding fields in ACL files:");
|
|
# -----------------------------
|
|
# Get record-layout
|
|
my ($h1,$h2) = MySQLaccess::DB::Show_Fields($HOST);
|
|
my ($d1,$d2) = MySQLaccess::DB::Show_Fields($DB);
|
|
my ($u1,$u2) = MySQLaccess::DB::Show_Fields($USER);
|
|
%MySQLaccess::Grant::H = %{$h1}; @MySQLaccess::Grant::H = @{$h2};
|
|
%MySQLaccess::Grant::D = %{$d1}; @MySQLaccess::Grant::D = @{$d2};
|
|
%MySQLaccess::Grant::U = %{$u1}; @MySQLaccess::Grant::U = @{$u2};
|
|
|
|
@MySQLaccess::Grant::Privileges=@{Make_Privlist()};
|
|
|
|
MySQLaccess::Debug::Print(1, "Reading sorted tables:");
|
|
@MySQLaccess::Grant::sorted_db_table = MySQLaccess::DB::Sort_table($DB, 'ucase_host', 'user', 'db');
|
|
@MySQLaccess::Grant::sorted_host_table= MySQLaccess::DB::Sort_table($HOST, 'ucase_host', 'db');
|
|
@MySQLaccess::Grant::sorted_user_table= defined($MySQLaccess::Param{'password'}) ?
|
|
MySQLaccess::DB::Sort_table($USER, 'ucase_host', 'user', 'password'):
|
|
MySQLaccess::DB::Sort_table($USER, 'ucase_host', 'user');
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
# ===========================================================
|
|
# sub Get_Access_Rights(host,user,db)
|
|
# report the access_rights for the tuple ($host,$user,$db).
|
|
# ===========================================================
|
|
sub Get_Access_Rights {
|
|
local ($host,$user,$db,$tmp) = @_;
|
|
|
|
my $aref_user;
|
|
my $aref_host;
|
|
my $aref_db;
|
|
# working with temporary tables or production tables
|
|
if (defined($tmp) and $tmp) {
|
|
$aref_user = \@MySQLaccess::Grant::sorted_user_tmp_table;
|
|
$aref_host = \@MySQLaccess::Grant::sorted_host_tmp_table;
|
|
$aref_db = \@MySQLaccess::Grant::sorted_db_tmp_table;
|
|
}
|
|
else {
|
|
$aref_user = \@MySQLaccess::Grant::sorted_user_table;
|
|
$aref_host = \@MySQLaccess::Grant::sorted_host_table;
|
|
$aref_db = \@MySQLaccess::Grant::sorted_db_table;
|
|
}
|
|
|
|
|
|
my ($refrecord,$refgrant);
|
|
my ($_host_,$_user_,$encpw_);
|
|
my %_Access_;
|
|
|
|
MySQLaccess::Debug::Print(1, "for ($host,$user,$db):");
|
|
|
|
# ******************************************************************************
|
|
# Create default access-rights
|
|
# default access-rights are no access at all!!
|
|
|
|
|
|
# ******************************************************************************
|
|
# get hostname for IP-address
|
|
# get IP-address for hostname
|
|
local $host_name = MySQLaccess::Host::IP2Name($host);
|
|
local $host_ip = MySQLaccess::Host::Name2IP($host);
|
|
|
|
MySQLaccess::Debug::Print(3,"host=$host, hostname=$host_name, host-ip =$host_ip");
|
|
MySQLaccess::Debug::Print(3,"user=$user");
|
|
MySQLaccess::Debug::Print(3,"db =$db");
|
|
|
|
# ***********************************************************************
|
|
# retrieve information on USER
|
|
# check all records in mysql::user for matches with the tuple (host,user)
|
|
# ***********************************************************************
|
|
# 4.OR (add) the privileges for the user from the "user" table.
|
|
# (add all privileges which is "Y" in "user")
|
|
($refrecord,$refgrant) = Get_grant_from_user($host,$user,$aref_user);
|
|
($_host_,$_user_,$encpw_) = @{$refrecord};
|
|
%_access_ = %{$refgrant};
|
|
|
|
foreach $field (keys(%U)) { ##only priv. set in user-table
|
|
$MySQLaccess::Grant::Access{$field} = ($MySQLaccess::Grant::Access{$field} or $_access_{$field});
|
|
}
|
|
|
|
if ($_user_ eq $MySQLaccess::NEW_USER) {
|
|
push(@Warnings,'minimum_priv');
|
|
}
|
|
if ($_user_ ne $user) {
|
|
$user=$_user_;
|
|
push(@Warnings,'anonymous_access');
|
|
}
|
|
|
|
# *******************************************************
|
|
# Validate password if this has been asked to do
|
|
# *******************************************************
|
|
if (defined($password)) {
|
|
$valid = Validate_Password($password,$_host_,$_user_,$_encpw_,$aref_user);
|
|
if (!$valid) { push(@Errors,'invalid_password'); }
|
|
else { push(@Notes,'valid_password'); }
|
|
}
|
|
|
|
# ******************************************************************************
|
|
# retrieve information on DB
|
|
# check all records in mysql::db for matches with the triple (host,db,user)
|
|
# first match is used.
|
|
# ******************************************************************************
|
|
# 2.Get grant for user from the "db" table.
|
|
|
|
($refrecord,$refgrant)=Get_grant_from_db($host,$db,$user,$aref_db); #set process_host_table
|
|
($_host_,$_user_,$encpw_) = @{$refrecord};
|
|
%_access_ = %{$refgrant};
|
|
|
|
foreach $field (keys(%D)) { ##only priv. set in db-table
|
|
$MySQLaccess::Grant::Access{$field} = ($MySQLaccess::Grant::Access{$field} or $_access_{$field});
|
|
}
|
|
|
|
# ***********************************************************************
|
|
# retrieve information on HOST
|
|
# check all records in mysql::host for matches with the tuple (host,db)
|
|
#
|
|
# ' The host table is mainly to maintain a list of "secure" servers. '
|
|
# ***********************************************************************
|
|
# 3.If hostname is "empty" for the found entry, AND the privileges with
|
|
# the privileges for the host in "host" table.
|
|
# (Remove all which is not "Y" in both)
|
|
|
|
if ($MySQLaccess::Grant::process_host_table) {
|
|
($refrecord,$refgrant)=Get_grant_from_host($host,$db,$aref_host);
|
|
($_host_,$_user_,$encpw_) = @{$refrecord};
|
|
%_access_ = %{$refgrant};
|
|
|
|
foreach $field (keys(%H)) { ##only priv. set in host-table
|
|
$MySQLaccess::Grant::Access{$field} = ($MySQLaccess::Grant::Access{$field} and $_access_{$field});
|
|
}
|
|
}
|
|
|
|
MySQLaccess::Debug::Print(1,"done for ($host,$user,$db)");
|
|
return %MySQLaccess::Grant::Access;
|
|
}
|
|
|
|
# ####################################
|
|
# FINDING THE RIGHT GRANT-RULE
|
|
# ==========================================================
|
|
# sub Get_grant_from_user:
|
|
# ==========================================================
|
|
sub Get_grant_from_user {
|
|
my ($host,$user,$aref) = @_;
|
|
|
|
MySQLaccess::Debug::Print(1, "");
|
|
MySQLaccess::Debug::Print(1, "(host=$host,user=$user)");
|
|
|
|
my %Access_user = %{Default_Access_Rights()};
|
|
|
|
my $rule_found=0;
|
|
my @record = ();
|
|
my $record;
|
|
|
|
foreach $record (@{$aref}) {
|
|
$MySQLaccess::Grant::full_access=0;
|
|
MySQLaccess::Debug::Print(3, "Record= $record");
|
|
@record=split(/\t/,$record);
|
|
|
|
# check host and db
|
|
# with possible wildcards in field
|
|
# replace mysql-wildcards by reg-wildcards
|
|
my $host_tpl = MySQLaccess::Wildcards::SQL2Reg($record[0]);
|
|
my $user_tpl = $record[1]; #user field isn't pattern-matched!!
|
|
my $passwd = $record[2];
|
|
|
|
MySQLaccess::Debug::Print(3, "=>host_tpl : read=$record[0] -> converted=$host_tpl");
|
|
MySQLaccess::Debug::Print(3, "=>user_tpl : read=$record[1] -> $user_tpl");
|
|
MySQLaccess::Debug::Print(3, "=>password : read=$record[2] -> $passwd");
|
|
|
|
|
|
if ( MySQLaccess::Host::MatchTemplate($host,$host_tpl) and
|
|
MySQLaccess::Wildcards::MatchTemplate($user_tpl,$user)
|
|
)
|
|
{
|
|
MySQLaccess::Debug::Print(2, "FOUND!!");
|
|
if ($passwd eq '') { push(@Warnings,'insecure_user'); }
|
|
else { push(@Notes,'password_required'); }
|
|
|
|
foreach $field (keys(%U)) {
|
|
$Access_user{$field} = $MySQLaccess::Report::Answer{$record[$U{$field}]};
|
|
}
|
|
#print "\n" if $DEBUG;
|
|
$MySQLaccess::Grant::Rules{'user'} = $record;
|
|
$rule_found=1;
|
|
last;
|
|
}
|
|
}
|
|
|
|
# -------------------------------
|
|
# setting privileges to user-priv
|
|
MySQLaccess::Debug::Print(2, "Rights after parsing user-table..:");
|
|
if (! $rule_found ) {
|
|
@record=();
|
|
MySQLaccess::Debug::Print(2, "NO record found in the user-table!!");
|
|
}
|
|
else {
|
|
MySQLaccess::Debug::Print(2, "Selected record=@record");
|
|
MySQLaccess::Debug::Print(2, "<=?=> $record");
|
|
}
|
|
|
|
MySQLaccess::Debug::Print(1, "returning @record");
|
|
|
|
return (\@record,\%Access_user); #matching record in user-table
|
|
}
|
|
|
|
# ==========================================================
|
|
# sub Get_grant_from_db:
|
|
# ==========================================================
|
|
sub Get_grant_from_db {
|
|
my ($host,$db,$user,$aref) = @_;
|
|
|
|
MySQLaccess::Debug::Print(1, "(host=$host,user=$user,db=$db)");
|
|
|
|
my %Access_db = %{Default_Access_Rights()};
|
|
my $rule_found=0;
|
|
|
|
foreach $record (@{$aref}) {
|
|
$full_access=0;
|
|
MySQLaccess::Debug::Print(2, "Read db: $record");
|
|
@record=split(/\t/,$record);
|
|
|
|
# check host and db
|
|
# with possible wildcards in field
|
|
# replace mysql-wildcards by reg-wildcards
|
|
my $host_tpl = MySQLaccess::Wildcards::SQL2Reg($record[0]);
|
|
my $db_tpl = MySQLaccess::Wildcards::SQL2Reg($record[1]);
|
|
my $user_tpl = $record[2]; #user field isn't pattern matched!!
|
|
MySQLaccess::Debug::Print(3, "=>host_tpl : read=$record[0] -> converted=$host_tpl");
|
|
MySQLaccess::Debug::Print(3, "=>db_tpl : read=$record[1] -> $db_tpl");
|
|
MySQLaccess::Debug::Print(3, "=>user_tpl : read=$record[2] -> $user_tpl");
|
|
|
|
if ( ( MySQLaccess::Host::Is_localhost($host_tpl)
|
|
or MySQLaccess::Wildcards::MatchTemplate($host_tpl,$host_name)
|
|
or MySQLaccess::Wildcards::MatchTemplate($host_tpl,$host_ip) )
|
|
and ( MySQLaccess::Wildcards::MatchTemplate($db_tpl,$db) )
|
|
and ( MySQLaccess::Wildcards::MatchTemplate($user_tpl,$user) ) ) {
|
|
|
|
$MySQLaccess::Grant::process_host_table = ($record[0] eq '');
|
|
|
|
if ($user_tpl eq '') { push(@Warnings,'public_database'); }
|
|
|
|
foreach $field (keys(%D)) {
|
|
$Access_db{$field} = $MySQLaccess::Report::Answer{$record[$D{$field}]};
|
|
}
|
|
$rule_found=1;
|
|
$MySQLaccess::Grant::Rules{'db'} = $record;
|
|
last;
|
|
}
|
|
}
|
|
|
|
# -------------------------------
|
|
# setting privileges to db-priv
|
|
MySQLaccess::Debug::Print(2, "Rights after parsing db-table..:");
|
|
if (! $rule_found ) {
|
|
MySQLaccess::Debug::Print(2, "NO rule found in db-table => no access granted!!");
|
|
}
|
|
|
|
return (\@record,\%Access_db);
|
|
}
|
|
|
|
# ==========================================================
|
|
# sub Get_grant_from_host:
|
|
# ==========================================================
|
|
sub Get_grant_from_host {
|
|
my ($host,$db,$aref) = @_;
|
|
|
|
MySQLaccess::Debug::Print(1, "Get_grant_from_host()");
|
|
|
|
my %Access_host = %{Default_Access_Rights()};
|
|
|
|
# the host-table doesn't have to be processed if the host-field
|
|
# in the db-table isn't empty
|
|
if (!$MySQLaccess::Grant::process_host_table) {
|
|
MySQLaccess::Debug::Print(2, ">> Host-table doesn't have to be processed!!");
|
|
$MySQLaccess::Grant::Rules{'host'} = 'no_equiv_host';
|
|
return ([],\%Access_host);
|
|
}
|
|
|
|
my $rule_found=0;
|
|
my @record = ();
|
|
|
|
foreach $record (@{$aref}) {
|
|
$full_access=0;
|
|
MySQLaccess::Debug::Print(2, "host: $record");
|
|
@record=split(/\t/,$record);
|
|
|
|
# check host and db
|
|
# with possible wildcards in field
|
|
# replace mysql-wildcards by reg-wildcards
|
|
my $host_tpl = MySQLaccess::Wildcards::SQL2Reg($record[0]);
|
|
my $db_tpl = MySQLaccess::Wildcards::SQL2Reg($record[1]);
|
|
MySQLaccess::Debug::Print(3, "=>host_tpl : $record[0] -> $host_tpl");
|
|
MySQLaccess::Debug::Print(3, "=>db_tpl : $record[1] -> $db_tpl");
|
|
|
|
if ( ( MySQLaccess::Host::Is_localhost($host_tpl)
|
|
or MySQLaccess::Wildcards::MatchTemplate($host_tpl,$host_name)
|
|
or MySQLaccess::Wildcards::MatchTemplate($host_tpl,$host_ip) )
|
|
and ( MySQLaccess::Wildcards::MatchTemplate($db_tpl,$db) ) ) {
|
|
|
|
$MySQLaccess::Grant::Rules{'host'} = $record;
|
|
$rule_found=1;
|
|
foreach $field (keys(%H)) {
|
|
$Access_host{$field} = $MySQLaccess::Report::Answer{$record[$H{$field}]};
|
|
}
|
|
last;
|
|
}
|
|
}
|
|
|
|
# -------------------------------
|
|
# setting privileges to host-priv
|
|
MySQLaccess::Debug::Print(2, "Rights after parsing host-table..:");
|
|
if (! $rule_found ) {
|
|
@record=();
|
|
MySQLaccess::Debug::Print(2, "NO restrictions found in the host-table!!");
|
|
}
|
|
|
|
# --------------------------------
|
|
# debugging access-rights in db
|
|
|
|
return (\@record,\%Access_host); #matching record in host-table
|
|
}
|
|
|
|
|
|
|
|
# ===========================================================
|
|
# sub Default_Access_Rights():
|
|
# return (a reference to) a hash which holds all default
|
|
# priviliges currently defined in the grant-tables.
|
|
# ===========================================================
|
|
sub Default_Access_Rights {
|
|
my %right = ();
|
|
|
|
MySQLaccess::Debug::Print(2, "Debug Default_Access_Rights():");
|
|
# add entry for all fields in the HOST-table
|
|
foreach $field (keys(%MySQLaccess::Grant::H)) {
|
|
$right{$field}='0' unless (defined($right{$field}));
|
|
}
|
|
# add entry for all fields in the DB-table
|
|
foreach $field (keys(%MySQLaccess::Grant::D)) {
|
|
$right{$field}='0' unless (defined($right{$field}));
|
|
}
|
|
# add entry for all fields in the USER-table
|
|
foreach $field (keys(%MySQLaccess::Grant::U)) {
|
|
$right{$field}='0' unless (defined($right{$field}));
|
|
}
|
|
# --------------
|
|
# debugging info
|
|
foreach $field (keys(%right)) { MySQLaccess::Debug::Print(3, sprintf("> %15s : %1s",$field,$right{$field})); }
|
|
|
|
return \%right;
|
|
}
|
|
|
|
# ======================================
|
|
# sub Make_Privlist
|
|
# Make an ordered list of the privileges
|
|
# that should be reported
|
|
# ======================================
|
|
sub Make_Privlist {
|
|
# layout:
|
|
#'select_priv', 'create_priv',
|
|
#'insert_priv', 'drop_priv',
|
|
#'update_priv', 'reload_priv',
|
|
#'delete_priv', 'process_priv',
|
|
#'file_priv', 'shutdown_priv');
|
|
my $right;
|
|
my @privlist=();
|
|
foreach $right (@U) {
|
|
if (! grep(/$right/,@privlist)) { push(@privlist,$right); }
|
|
};
|
|
foreach $right (@D) {
|
|
if (! grep(/$right/,@privlist)) { push(@privlist,$right); }
|
|
};
|
|
foreach $right (@H) {
|
|
if (! grep(/$right/,@privlist)) { push(@privlist,$right); }
|
|
};
|
|
# print "Privileges:\n";
|
|
# foreach $field (@privlist) { print " > $field\n"; }
|
|
return \@privlist;
|
|
}
|
|
|
|
|
|
|
|
########################################################################
|
|
package MySQLaccess::Report;
|
|
use Exporter ();
|
|
@EXPORT = qw(&Print_Header());
|
|
BEGIN {
|
|
$FORM = $ENV{'SCRIPT_NAME'};
|
|
$DEBUG = 0;
|
|
$DEBUG = $MySQLaccess::DEBUG unless ($DEBUG);
|
|
|
|
# translation-table for poss. answers
|
|
%Answer = ('Y' => 1 , 'N' => 0
|
|
, 1 => 'Y', 0 => 'N'
|
|
,'?' => '?', '' => '?'
|
|
);
|
|
$headers = 0;
|
|
$separator = 0;
|
|
|
|
# ****************************
|
|
# Notes and warnings
|
|
%MESSAGES = (
|
|
'insecure_user'
|
|
=> "Everybody can access your DB as user `\$user' from host `\$host'\n"
|
|
."WITHOUT supplying a password.\n"
|
|
."Be very careful about it!!"
|
|
,'password_required'
|
|
=> "A password is required for user `\$user' :-("
|
|
,'invalid_password'
|
|
=> "The password '\$password' for user `\$user' is invalid :-P"
|
|
, 'valid_password'
|
|
=> "You supplied the right password for user `\$user' :-)"
|
|
,'public_database'
|
|
=> "Any user with the appropriate permissions has access to your DB!\n"
|
|
."Check your users!"
|
|
,'full_access'
|
|
=> "All grant-tables are empty, which gives full access to ALL users !!"
|
|
,'no_rule_found'
|
|
=> "No matching rule"
|
|
,'no_equiv_host'
|
|
=> "Not processed: host-field is not empty in db-table."
|
|
,'least_priv'
|
|
=> "If the final priveliges of the user are more then you gave the user,\n"
|
|
."check the priveliges in the db-table `\$db'."
|
|
,'minimum_priv'
|
|
=> "The privileges for any new user are AT LEAST\n"
|
|
."the ones shown in the table above,\n"
|
|
."since these are the privileges of the db `\$db'.\n"
|
|
,'not_found_mysql'
|
|
=> "The MySQL client program <$MySQLaccess::MYSQL> could not be found.\n"
|
|
."+ Check your path, or\n"
|
|
."+ edit the source of this script to point \$MYSQL to the mysql client.\n"
|
|
,'not_found_mysqldump'
|
|
=> "The MySQL dump program <$MySQLaccess::MYSQLDUMP> could not be found.\n"
|
|
."+ Check your path, or\n"
|
|
."+ edit the source of this script to point \$MYSQLDUMP to the mysqldump program.\n"
|
|
,'not_found_diff'
|
|
=> "The diff program <$MySQLaccess::DIFF> could not be found.\n"
|
|
."+ Check your path, or\n"
|
|
."+ edit the source of this script to point \$DIFF to the diff program.\n"
|
|
,'not_found_tmp'
|
|
=> "The temporary directory <$MySQLaccess::TMP_PATH> could not be found.\n"
|
|
."+ create this directory (writeable!), or\n"
|
|
."+ edit the source of this script to point \$TMP_PATH to the right directory.\n"
|
|
,'write_err_tmp'
|
|
=> "The temporary directory <$MySQLaccess::TMP_PATH> is not writable.\n"
|
|
."+ make this directory writeable!, or\n"
|
|
."+ edit the source of this script to point \$TMP_PATH to another directory.\n"
|
|
,'Unrecognized_option'
|
|
=> "Sorry,\n"
|
|
."You are using an old version of the mysql-program,\n"
|
|
."which does not yet implement a neccessary option.\n"
|
|
."\n"
|
|
."You need at least Version 6.2 of the mysql-client,\n"
|
|
."which was build in MySQL v3.0.18, to use this version\n"
|
|
."of `$MySQLaccess::script'."
|
|
,'Access_denied'
|
|
=> "Sorry,\n"
|
|
."An error occured when trying to connect to the database\n"
|
|
."with the grant-tables:\n"
|
|
."* Maybe YOU do not have READ-access to this database?\n"
|
|
."* If you used the -U option, you may have supplied an invalid username?\n"
|
|
." for the superuser?\n"
|
|
."* If you used the -U option, it may be possible you have to supply\n"
|
|
." a superuser-password to, with the -P option?\n"
|
|
."* If you used the -P option, you may have supplied an invalid password?\n"
|
|
,'Dbaccess_denied'
|
|
=> "Sorry,\n"
|
|
."An error occured when trying to connect to the database\n"
|
|
."with the grant-tables. (dbaccess denied)\n"
|
|
,'Unknown_tmp_table'
|
|
=> "Sorry,\n"
|
|
."An error occured when trying to work with the temporary tables in the database\n"
|
|
."with the grant-tables. (One of the temporary tables does not exist)\n"
|
|
,'Unknown_table'
|
|
=> "Sorry,\n"
|
|
."An error occured when trying to work with some tables in the database\n"
|
|
."with the grant-tables. (table does not exist)\n"
|
|
,'use_old_server'
|
|
=> "Sorry,\n"
|
|
."An error occured when executing an SQL statement.\n"
|
|
."You might consider altering the use of the parameter `--old_server' when \n"
|
|
."calling `$MySQLaccess::script'."
|
|
,'unknown_error'
|
|
=> "Sorry,\n"
|
|
."An error occured when trying to connect to the database\n"
|
|
."with the grant-tables. (unknown error)\n"
|
|
,'anonymous_access'
|
|
=> "Accessing the db as an anonymous user.\n"
|
|
."Your username has no relevance\n"
|
|
,'user_required'
|
|
=> "You have to supply a userid."
|
|
,'db_required'
|
|
=> "You have to supply the name of a database."
|
|
,'host_required'
|
|
=> "You have to supply the name of a host."
|
|
);
|
|
|
|
|
|
}
|
|
# =====================================
|
|
# sub Print_Header:
|
|
# print header info
|
|
# =====================================
|
|
sub Print_Header {
|
|
if ($MySQLaccess::CMD) { #command-line mode
|
|
print "$MySQLaccess::script Version $MySQLaccess::VERSION\n"
|
|
."By RUG-AIV, by Yves Carlier (Yves.Carlier\@rug.ac.be)\n"
|
|
."Changes by Steve Harvey (sgh\@vex.net)\n"
|
|
."This software comes with ABSOLUTELY NO WARRANTY.\n";
|
|
}
|
|
if ($MySQLaccess::CGI) { #CGI-BIN mode
|
|
print "content-type: text/html\n\n"
|
|
. "<HTML>\n"
|
|
."<HEAD>\n"
|
|
."<TITLE>MySQLaccess</TITLE>\n"
|
|
."</HEAD>\n"
|
|
."<BODY>\n"
|
|
."<H1>$MySQLaccess::script Version $MySQLaccess::VERSION</H1>\n"
|
|
."<CENTER>\n<ADDRESS>\n"
|
|
."By RUG-AIV, by Yves Carlier (<a href=mailto:Yves.Carlier\@rug.ac.be>Yves.Carlier\@rug.ac.be</a>)<BR>\n"
|
|
."Changes by Steve Harvey (<a href=mailto:sgh\@vex.net>sgh\@vex.net</a>)<BR>\n"
|
|
."This software comes with ABSOLUTELY NO WARRANTY.<BR>\n"
|
|
."</ADDRESS>\n</CENTER>\n"
|
|
."<HR>\n";
|
|
Print_Taskbar();
|
|
print "<HR>\n";
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
# =====================================
|
|
# sub Print_Footer:
|
|
# print footer info
|
|
# =====================================
|
|
sub Print_Footer {
|
|
if ($MySQLaccess::CMD) { #command-line mode
|
|
print "\n"
|
|
."BUGs can be reported by email to Yves.Carlier\@rug.ac.be\n";
|
|
}
|
|
if ($MySQLaccess::CGI) { #CGI-BIN mode
|
|
if ($MySQLaccess::Param{'brief'}) {
|
|
print "</table>\n"; #close table in brief-output
|
|
}
|
|
print "<HR>\n"
|
|
."<ADDRESS>\n"
|
|
."BUGs can be reported by email to <a href=mailto:Yves.Carlier\@rug.ac.be>Yves.Carlier\@rug.ac.be</a><BR>\n"
|
|
# ."Don't forget to mention the version $VERSION!<BR>\n"
|
|
."</ADDRESS>\n"
|
|
."</BODY>\n"
|
|
."</HTML>\n";
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
# =====================================
|
|
# sub Print_Taskbar:
|
|
# print taskbar on STDOUT
|
|
# =====================================
|
|
sub Print_Taskbar {
|
|
print "<CENTER>\n"
|
|
."[<a href=$FORM?relnotes=on>Release Notes</a>] \n"
|
|
."[<a href=$FORM?version=on>Version</a>] \n"
|
|
."[<a href=$FORM?plan=on>Future Plans</a>] \n"
|
|
."[<a href=$FORM?howto=on>Examples</a>] \n"
|
|
."[<a href=$FORM?help=on>New check</a>] \n"
|
|
."[<a href=$FORM?edit=on>Change/edit ACL</a>] \n"
|
|
."</CENTER>\n";
|
|
return 1;
|
|
}
|
|
|
|
# =====================================
|
|
# sub Print_Form:
|
|
# print CGI-form
|
|
# =====================================
|
|
sub Print_Form {
|
|
print <<EOForm;
|
|
<center>
|
|
<!-- Quering -->
|
|
<FORM method=POST action=$FORM>
|
|
|
|
<table border width="100%" >
|
|
<tr>
|
|
<th>MySQL server</th>
|
|
<th>User information</th>
|
|
<th>Reports</th>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td valign=top>
|
|
<table>
|
|
<tr>
|
|
<td halign=right><b>Host</b><br><font size=-2>(Host on which MySQL-server resides.)</font></td>
|
|
<td valign=top><INPUT name=rhost type=text size=15 maxlength=15 value="$MySQLaccess::Param{'rhost'}"></td>
|
|
</tr>
|
|
<tr>
|
|
<td halign=right><b>Superuser</b><br><font size=-2>(User which has <font color="Red">read-access</font> to grant-tables.)</font></td>
|
|
<td valign=top><INPUT name=superuser type=text size=15 maxlength=15 value="$MySQLaccess::Param{'superuser'}"></td>
|
|
</tr>
|
|
<tr>
|
|
<td halign=right><b>Password</b><br><font size=-2>(of Superuser.)</font></td>
|
|
<td valign=top><INPUT name=spassword type=password size=15 maxlength=15 value="$MySQLaccess::Param{'spassword'}"></td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
|
|
<td valign=top>
|
|
<table>
|
|
<tr>
|
|
<td halign=right><b><font color=Red>User</font></b><br><font size=-2>(Userid used to connect to MySQL-database.)</font></td>
|
|
<td halign=top><INPUT name=user type=text size=15 maxlength=15 value="$MySQLaccess::Param{'user'}"></td>
|
|
</tr>
|
|
<tr>
|
|
<td halign=right><b>Password</b><br><font size=-2>(Password user has to give to get access to MySQL-database.)</font></td>
|
|
<td valign=top><INPUT name=password type=password size=15 maxlength=15 value="$MySQLaccess::Param{'password'}"></td>
|
|
</tr>
|
|
<tr>
|
|
<td halign=right><b><font color=Red>Database</font></b><br><font size=-2>(Name of MySQL-database user tries to connect to.</font><br><font size=-2>Wildcards <font color="Green">(*,?,%,_)</font> are allowed.)</font></td>
|
|
<td valign=top><INPUT name=db type=text size=15 maxlength=15 value="$MySQLaccess::Param{'db'}"></td>
|
|
</tr>
|
|
<tr>
|
|
<td halign=right><b>Host</b><br><font size=-2>(Host from where the user is trying to connect to MySQL-database.</font><br><font size=-2>Wildcards <font color="Green">(*,?,%,_)</font> are allowed.)</font></td>
|
|
<td valign=top><INPUT name=host type=text size=15 maxlength=15 value="$MySQLaccess::Param{'host'}"></td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
|
|
<td valign=center>
|
|
<table cellspacing=5 cellpadding=2 cols=1 height="100%">
|
|
<tr align=center>
|
|
<td halign=right><INPUT type=submit name=brief value="Brief"><br>
|
|
<INPUT type=submit name=table value="Tabular"></td>
|
|
</tr>
|
|
<tr align=center>
|
|
<td></td>
|
|
</tr>
|
|
<tr align=center>
|
|
<td halign=right><INPUT type=reset value="Clear"></td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
|
|
</table>
|
|
</form>
|
|
|
|
|
|
</BODY>
|
|
</HTML>
|
|
EOForm
|
|
return 1;
|
|
}
|
|
|
|
# =====================================
|
|
# sub Print_Usage:
|
|
# print some information on STDOUT
|
|
# =====================================
|
|
sub Print_Usage {
|
|
Print_Error_Messages();
|
|
if ($MySQLaccess::CMD) { #command-line mode
|
|
Print_Options();
|
|
}
|
|
if ($MySQLaccess::CGI) { #CGI-BIN mode
|
|
Print_Form();
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
# ======================================
|
|
# sub Print_Version:
|
|
# ======================================
|
|
sub Print_Version {
|
|
if ($MySQLaccess::CMD) {
|
|
print $MySQLaccess::INFO;
|
|
}
|
|
if ($MySQLaccess::CGI) {
|
|
print "<PRE>\n";
|
|
print $MySQLaccess::INFO;
|
|
print "</PRE>\n";
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
# ======================================
|
|
# sub Print_Relnotes:
|
|
# ======================================
|
|
sub Print_Relnotes {
|
|
if ($MySQLaccess::CMD) {
|
|
print $MySQLaccess::RELEASE;
|
|
}
|
|
if ($MySQLaccess::CGI) {
|
|
print "<PRE>\n";
|
|
print $MySQLaccess::RELEASE;
|
|
print "</PRE>\n";
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
# ======================================
|
|
# sub Print_Plans:
|
|
# ======================================
|
|
sub Print_Plans {
|
|
if ($MySQLaccess::CMD) {
|
|
print $MySQLaccess::TODO;
|
|
}
|
|
if ($MySQLaccess::CGI) {
|
|
print "<PRE>\n";
|
|
print $MySQLaccess::TODO;
|
|
print "</PRE>\n";
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
# ======================================
|
|
# sub Print_HowTo:
|
|
# ======================================
|
|
sub Print_HowTo {
|
|
if ($MySQLaccess::CMD) {
|
|
print $MySQLaccess::HOWTO;
|
|
}
|
|
if ($MySQLaccess::CGI) {
|
|
print "<PRE>\n";
|
|
print $MySQLaccess::HOWTO;
|
|
print "</PRE>\n";
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
# ======================================
|
|
# sub Print_Options:
|
|
# ======================================
|
|
sub Print_Options {
|
|
if ($MySQLaccess::CGI) { print "<PRE>\n"; }
|
|
print $MySQLaccess::OPTIONS;
|
|
if ($MySQLaccess::CGI) { print "</PRE>\n"; }
|
|
return 1;
|
|
}
|
|
|
|
# ======================================
|
|
# sub Print_Error_Access:
|
|
# ======================================
|
|
sub Print_Error_Access {
|
|
my ($error) = @_;
|
|
print "\n";
|
|
if ($MySQLaccess::CGI) { print "<font color=Red>\n<PRE>\n"; }
|
|
print $MESSAGES{$error};
|
|
if ($MySQLaccess::CGI) { print "</PRE>\n</font>\n"; }
|
|
print "\n";
|
|
return 1;
|
|
}
|
|
|
|
# ======================================
|
|
# sub Print_Error_Messages:
|
|
# ======================================
|
|
sub Print_Error_Messages {
|
|
# my ($error) = @_;
|
|
print "\n";
|
|
if ($MySQLaccess::CGI) { print "<font color=Red>\n<center>\n"; }
|
|
foreach $error (@MySQLaccess::Grant::Error) {
|
|
print $MESSAGES{$error};
|
|
print $MySQLaccess::CGI ? "<br>\n" : "\n";
|
|
}
|
|
if ($MySQLaccess::CGI) { print "</center>\n</font>\n"; }
|
|
print "\n";
|
|
return 1;
|
|
}
|
|
|
|
# ======================================
|
|
# sub Print_Message:
|
|
# ======================================
|
|
sub Print_Message {
|
|
my ($aref) = @_;
|
|
my @messages = @{$aref};
|
|
print "\n";
|
|
if ($MySQLaccess::CGI) { print "<font color=DarkGreen>\n<center>\n"; }
|
|
foreach $msg (@messages) {
|
|
print $msg;
|
|
print $MySQLaccess::CGI ? "<br>\n" : "\n";
|
|
}
|
|
if ($MySQLaccess::CGI) { print "</center>\n</font>\n"; }
|
|
print "\n";
|
|
return 1;
|
|
}
|
|
|
|
# ======================================
|
|
# sub Print_Edit:
|
|
# ======================================
|
|
sub Print_Edit {
|
|
print "\n";
|
|
if (!$MySQLaccess::CGI) {
|
|
print "Note: Editing the temporary tables is NOT supported in CMD-line mode!\n";
|
|
return 0;
|
|
}
|
|
print "<CENTER>\n"
|
|
."<form action=$FORM method=GET>\n"
|
|
."<table width=90% border>\n"
|
|
."<tr>\n"
|
|
." <td><input type=checkbox name=copy value=on> Copy grant-rules to temporary tables<br></td>\n"
|
|
." <td rowspan=5 align=center valign=center><input type=submit value=Go></td>\n"
|
|
."</tr>\n"
|
|
."<tr>\n"
|
|
." <td> Edit temporary tables with external application:<br>"
|
|
." <a href=\"$MySQLaccess::MYSQLADMIN\">$MySQLaccess::MYSQLADMIN</a></td>\n"
|
|
."</tr>\n"
|
|
."<tr>\n"
|
|
." <td><input type=checkbox name=preview value=on> Preview changes made in temporary tables</td>\n"
|
|
."</tr>\n"
|
|
."<tr>\n"
|
|
." <td><input type=checkbox name=commit value=on> Make changes permanent</td>\n"
|
|
."</tr>\n"
|
|
."<tr>\n"
|
|
." <td><input type=checkbox name=rollback value=on> Restore previous grand-rules</td>\n"
|
|
."</tr>\n"
|
|
."<tr>\n"
|
|
." <td colspan=2 align=center><font size=-2 color=Red>You need write,delete and drop-privileges to perform the above actions</font></td>\n"
|
|
."</tr>\n"
|
|
."</table>\n"
|
|
."</form>\n"
|
|
."</CENTER>\n";
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
# ======================================
|
|
# sub Print_Access_rights:
|
|
# print the access-rights on STDOUT
|
|
# ======================================
|
|
sub Print_Access_rights {
|
|
my ($host,$user,$db,$refhash) = @_;
|
|
|
|
if (defined($MySQLaccess::Param{'brief'})) {
|
|
# if ($MySQLaccess::CGI) { print "<PRE>\n"; }
|
|
Matrix_Report($host,$user,$db,$refhash);
|
|
# if ($MySQLaccess::CGI) { print "</PRE>\n"; }
|
|
}
|
|
else {
|
|
Tabular_Report($host,$user,$db,$refhash);
|
|
$MySQLaccess::Report::separator = $MySQLaccess::CGI ? "<hr>" : "-"x80;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
# ======================================
|
|
# sub Print_Diff_ACL:
|
|
# print the diff. in the grants before and after
|
|
# ======================================
|
|
sub Print_Diff_ACL {
|
|
my ($aref) = @_;
|
|
my @diffs = @{$aref};
|
|
my %block = ( '<' => 'Before',
|
|
'>' => 'After',
|
|
);
|
|
my %color = ( '<' => 'Green',
|
|
'>' => 'Red',
|
|
);
|
|
my $curblock = '';
|
|
|
|
# -----------------------------
|
|
# create column-headers
|
|
foreach $field (@MySQLaccess::Grant::Privileges) {
|
|
push(@headers,substr($field,0,4));
|
|
}
|
|
|
|
if ($MySQLaccess::CMD) {
|
|
print "\n";
|
|
print "Differences in access-rights BEFORE and AFTER changes in grant-tables\n";
|
|
# print "---------------------------------------------------------------------\n";
|
|
my $line1="";
|
|
my $line2="";
|
|
$line1 .= sprintf("| %-30s|",'Host,User,DB');
|
|
$line2 .= sprintf("+-%-30s+",'-' x 30);
|
|
foreach $header (@headers) {
|
|
$line1 .= sprintf("%-4s|",$header);
|
|
$line2 .= sprintf("%s+",'----');
|
|
}
|
|
print "$line2\n";
|
|
print "$line1\n";
|
|
print "$line2\n";
|
|
|
|
$format = "format STDOUT = \n"
|
|
. "^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< " . " @|||" x 10 ."\n"
|
|
. '$host_user_db,@priv' . "\n"
|
|
. ".\n";
|
|
#print $format;
|
|
eval $format;
|
|
}
|
|
if ($MySQLaccess::CGI) {
|
|
print "<table border width=100%>\n";
|
|
print "<tr>\n";
|
|
print "<th colspan=11>";
|
|
print "Differences in access-rights <font color=$color{'<'}>BEFORE</font> "
|
|
."and <font color=$color{'>'}>AFTER</font> changes to grant-tables</font>\n";
|
|
print "</th>";
|
|
print "</tr>\n";
|
|
print "<tr>\n";
|
|
$line1 .= sprintf("<th>%-20s</th>",'Host, User, DB');
|
|
foreach $header (@headers) {
|
|
$line1 .= sprintf("<th>%-4s</th>",$header);
|
|
}
|
|
print "$line1</tr>\n";
|
|
}
|
|
|
|
foreach $line (@diffs) {
|
|
$type = substr($line,0,1);
|
|
$line = substr($line,1);
|
|
($host,$user,$db,@priv) = split(/,/,$line);
|
|
if ($MySQLaccess::CMD) {
|
|
if ($type ne $curblock) {
|
|
$curblock = $type;
|
|
print $block{$curblock},":\n";
|
|
}
|
|
#print "$line\n";
|
|
write;
|
|
}
|
|
if ($MySQLaccess::CGI) {
|
|
if ($type ne $curblock) {
|
|
$curblock = $type;
|
|
print "<tr><td><b>$block{$curblock}<b></td></tr>\n";
|
|
}
|
|
$line1="<td><font color=$color{$type}>$host, $user, $db</font></td>";
|
|
foreach $field (@priv) {
|
|
$line1 .= sprintf("<td align=center><font color=$color{$type}>%-4s</font></td>",$field);
|
|
}
|
|
print "<tr>$line1</tr>\n";
|
|
}
|
|
}
|
|
print "\n";
|
|
if ($MySQLaccess::CMD) {
|
|
print "---------------------------------------------------------------------\n";
|
|
}
|
|
if ($MySQLaccess::CGI) {
|
|
print "</table><br>";
|
|
}
|
|
|
|
|
|
return 1;
|
|
}
|
|
|
|
# ======================================
|
|
# sub Tabular_Report
|
|
# Tabular report,
|
|
# suitable for 1 triple (host,db,user)
|
|
# ======================================
|
|
sub Tabular_Report {
|
|
my ($host,$user,$db,$a) = @_;
|
|
my $column=2;
|
|
|
|
# -----------------------------
|
|
# separator
|
|
if ($MySQLaccess::Report::separator) { print "$MySQLaccess::Report::separator\n"; }
|
|
|
|
# -----------------------------
|
|
# print table of access-rights
|
|
my $rows = int(@MySQLaccess::Grant::Privileges/2); #round up
|
|
my @table=();
|
|
$j=0;
|
|
for $i (0 .. $rows-1) {
|
|
$table[$j]=$MySQLaccess::Grant::Privileges[$i];
|
|
$j = $j+2;
|
|
}
|
|
$j=1;
|
|
for $i ($rows .. $#MySQLaccess::Grant::Privileges) {
|
|
$table[$j]=$MySQLaccess::Grant::Privileges[$i];
|
|
$j = $j+2;
|
|
}
|
|
if ($MySQLaccess::CMD) {
|
|
print "\n";
|
|
print "Access-rights\n";
|
|
print "for USER '$user', from HOST '$host', to DB '$db'\n";
|
|
}
|
|
if ($MySQLaccess::CGI) {
|
|
print "<table border width=100%>\n";
|
|
print "<tr>\n";
|
|
}
|
|
if ($MySQLaccess::CGI) {
|
|
print "<th colspan=5>";
|
|
print "<font color=Red>Access-rights</font>\n";
|
|
print "for USER '<font color=Green>$user</font>', from HOST '<font color=Green>$host</font>', to DB '<font color=Green>$db</font>'\n";
|
|
print "</th>";
|
|
print "</tr>\n";
|
|
print "<tr>\n";
|
|
}
|
|
if ($MySQLaccess::CMD) {
|
|
print "\t+-----------------+---+\t+-----------------+---+";
|
|
}
|
|
foreach $field (@table) {
|
|
if ($MySQLaccess::CMD) {
|
|
if ($column==2) { print "\n\t"; $column=1;}
|
|
else { print "\t"; $column=2;}
|
|
printf "| %-15s | %s |",$field,$Answer{$a->{$field}};
|
|
}
|
|
if ($MySQLaccess::CGI) {
|
|
if ($column==2) { print "</tr>\n<tr>\n"; $column=1;}
|
|
else { print "<td width=10%></td>"; $column=2;}
|
|
printf " <td width=35%><b>%-15s</b></td><td width=10%>%s</td>\n",$field,$Answer{$a->{$field}};
|
|
}
|
|
}
|
|
print "\n";
|
|
if ($MySQLaccess::CMD) {
|
|
print "\t+-----------------+---+\t+-----------------+---+\n";
|
|
}
|
|
if ($MySQLaccess::CGI) {
|
|
print "</tr>\n</table><br>";
|
|
}
|
|
|
|
# ---------------
|
|
# print notes:
|
|
foreach $note (@MySQLaccess::Grant::Notes) {
|
|
my $message = $MESSAGES{$note};
|
|
$message =~ s/\$user/$user/g;
|
|
$message =~ s/\$db/$db/g;
|
|
$message =~ s/\$host/$host/g;
|
|
$message =~ s/\$password/$password/g;
|
|
$PREFIX='NOTE';
|
|
if ($MySQLaccess::CMD) {
|
|
my @lines = split(/\n/,$message);
|
|
foreach $line (@lines) {
|
|
print "$PREFIX:\t $line\n";
|
|
$PREFIX=' ';
|
|
}
|
|
}
|
|
if ($MySQLaccess::CGI) {
|
|
print "<b>$PREFIX:</b> $message<br>\n";
|
|
}
|
|
}
|
|
|
|
# ---------------
|
|
# print warnings:
|
|
foreach $warning (@MySQLaccess::Grant::Warnings) {
|
|
my $message = $MESSAGES{$warning};
|
|
$message =~ s/\$user/$user/g;
|
|
$message =~ s/\$db/$db/g;
|
|
$message =~ s/\$host/$host/g;
|
|
$message =~ s/\$password/$password/g;
|
|
$PREFIX='BEWARE';
|
|
if ($MySQLaccess::CMD) {
|
|
my @lines = split(/\n/,$message);
|
|
foreach $line (@lines) {
|
|
print "$PREFIX:\t $line\n";
|
|
$PREFIX=' ';
|
|
}
|
|
}
|
|
if ($MySQLaccess::CGI) {
|
|
print "<b>$PREFIX:</b> $message<br>\n";
|
|
}
|
|
}
|
|
|
|
# ---------------
|
|
# print errors:
|
|
foreach $error (@MySQLaccess::Grant::Errors) {
|
|
my $message = $MESSAGES{$error};
|
|
$message =~ s/\$user/$user/g;
|
|
$message =~ s/\$db/$db/g;
|
|
$message =~ s/\$host/$host/g;
|
|
$message =~ s/\$password/$password/g;
|
|
$PREFIX='ERROR';
|
|
if ($MySQLaccess::CMD) {
|
|
my @lines = split(/\n/,$message);
|
|
foreach $line (@lines) {
|
|
print "$PREFIX:\t $line\n";
|
|
$PREFIX=' ';
|
|
}
|
|
}
|
|
if ($MySQLaccess::CGI) {
|
|
print "<b>$PREFIX:</b> $message<br>\n";
|
|
}
|
|
}
|
|
|
|
# ---------------
|
|
# inform if there are no rules ==> full access for everyone.
|
|
if ($MySQLaccess::Grant::full_access) { print "$MESSAGES{'full_access'}\n"; }
|
|
|
|
# ---------------
|
|
# print the rules used
|
|
print "\n";
|
|
if ($MySQLaccess::CMD) {
|
|
print "The following rules are used:\n";
|
|
foreach $field (sort(keys(%MySQLaccess::Grant::Rules))) {
|
|
my $rule = (defined($MESSAGES{$MySQLaccess::Grant::Rules{$field}}) ? $MESSAGES{$MySQLaccess::Grant::Rules{$field}} : $MySQLaccess::Grant::Rules{$field});
|
|
$rule =~ s/\t/','/g;
|
|
printf " %-5s : '%s'\n",$field,$rule;
|
|
}
|
|
}
|
|
if ($MySQLaccess::CGI) {
|
|
print "<br>\n";
|
|
print "<table border width=100%>\n";
|
|
print "<tr><th colspan=2>The following rules are used:</th></tr>\n";
|
|
foreach $field (sort(keys(%MySQLaccess::Grant::Rules))) {
|
|
my $rule = (defined($MESSAGES{$MySQLaccess::Grant::Rules{$field}}) ? $MESSAGES{$MySQLaccess::Grant::Rules{$field}} : $MySQLaccess::Grant::Rules{$field});
|
|
$rule =~ s/\t/','/g;
|
|
printf "<tr><th>%-5s</th><td>'%s'</td></tr>\n",$field,$rule;
|
|
}
|
|
print "</table>\n";
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
# ======================================
|
|
# sub Matrix_Report:
|
|
# single-line output foreach triple,
|
|
# no notes,warnings,...
|
|
# ======================================
|
|
sub Matrix_Report {
|
|
my ($host,$user,$db,$a) = @_;
|
|
my @headers = ();
|
|
|
|
if (! $headers) {
|
|
# -----------------------------
|
|
# create column-headers
|
|
foreach $field (@MySQLaccess::Grant::Privileges) {
|
|
push(@headers,substr($field,0,4));
|
|
}
|
|
|
|
# -----------------------------
|
|
# print column-headers
|
|
print "\n";
|
|
if ($MySQLaccess::CMD) {
|
|
my $line1="";
|
|
my $line2="";
|
|
foreach $header (@headers) {
|
|
$line1 .= sprintf("%-4s ",$header);
|
|
$line2 .= sprintf("%s ",'----');
|
|
}
|
|
$line1 .= sprintf("| %-20s",'Host,User,DB');
|
|
$line2 .= sprintf("+ %-20s",'-' x 20);
|
|
print "$line1\n";
|
|
print "$line2\n";
|
|
}
|
|
if ($MySQLaccess::CGI) {
|
|
print "<table width=100% border>\n";
|
|
my $line1="<tr>";
|
|
foreach $header (@headers) {
|
|
$line1 .= sprintf("<th>%-4s</th>",$header);
|
|
}
|
|
$line1 .= sprintf("<th>%-20s</th>",'Host, User, DB');
|
|
print "$line1</tr>\n";
|
|
}
|
|
|
|
# ----------------------------
|
|
# column-headers should only be
|
|
# printed once.
|
|
$MySQLaccess::Report::headers=1;
|
|
}
|
|
|
|
# ------------------------
|
|
# print access-information
|
|
if ($MySQLaccess::CMD) {
|
|
foreach $field (@MySQLaccess::Grant::Privileges) {
|
|
printf " %-2s ",$Answer{$a->{$field}};
|
|
}
|
|
printf "| %-20s",join(',',$host,$user,$db);
|
|
print "\n";
|
|
}
|
|
if ($MySQLaccess::CGI) {
|
|
print "<tr>";
|
|
foreach $field (@MySQLaccess::Grant::Privileges) {
|
|
printf "<td align=center>%-2s</td>",$Answer{$a->{$field}};
|
|
}
|
|
printf "<td><b>%-20s</b></td>",join(', ',$host,$user,$db);
|
|
print "</tr>\n";
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
# ======================================
|
|
# sub Raw_Report:
|
|
# single-line output foreach triple,
|
|
# no notes,warnings,...
|
|
# ======================================
|
|
sub Raw_Report {
|
|
my ($host,$user,$db,$a) = @_;
|
|
my @headers = ();
|
|
my $string = "";
|
|
|
|
# ------------------------
|
|
# print access-information
|
|
$string = "$host,$user,$db,";
|
|
foreach $field (@MySQLaccess::Grant::Privileges) {
|
|
$string .= $Answer{$a->{$field}} . ",";
|
|
}
|
|
return $string;
|
|
}
|
|
|
|
|
|
#######################################################################
|
|
package MySQLaccess::Wildcards;
|
|
BEGIN {
|
|
$DEBUG = 0;
|
|
$DEBUG = $MySQLaccess::DEBUG unless ($DEBUG);
|
|
}
|
|
# ############################################
|
|
# SQL, WILDCARDS and REGULAR EXPRESSIONS
|
|
# ============================================
|
|
# translage SQL-expressions to Reg-expressions
|
|
# ============================================
|
|
sub SQL2Reg {
|
|
my ($expr) = @_;
|
|
my $expr_o = $expr;
|
|
$expr =~ s/\./\\./g;
|
|
$expr =~ s/\\%/\002/g;
|
|
$expr =~ s/%/.*/g;
|
|
$expr =~ s/\002/%/g;
|
|
$expr =~ s/\\_/\002/g;
|
|
$expr =~ s/_/.+/g;
|
|
$expr =~ s/\002/_/g;
|
|
MySQLaccess::Debug::Print(2,"$expr_o --> $expr");
|
|
return $expr;
|
|
}
|
|
|
|
# translage WILDcards to Reg-expressions
|
|
# ============================================
|
|
sub Wild2Reg {
|
|
my ($expr) = @_;
|
|
my $expr_o = $expr;
|
|
$expr =~ s/\./\\./g;
|
|
$expr =~ s/\\\*/\002/g;
|
|
$expr =~ s/\*/.*/g;
|
|
$expr =~ s/\002/*/g;
|
|
$expr =~ s/\\\?/\002/g;
|
|
$expr =~ s/\?/.+/g;
|
|
$expr =~ s/\002/?/g;
|
|
MySQLaccess::Debug::Print(2,"$expr_o --> $expr");
|
|
return $expr;
|
|
}
|
|
|
|
# =============================================
|
|
# match a given string with a template
|
|
# =============================================
|
|
sub MatchTemplate {
|
|
my ($tpl,$string) = @_;
|
|
my $match=0;
|
|
if ($string=~ /^$tpl$/ or $tpl eq '') { $match=1; }
|
|
else { $match=0;}
|
|
MySQLaccess::Debug::Print(2,"($tpl,$string) --> $match");
|
|
return $match;
|
|
}
|
|
|
|
#######################################################################
|
|
package MySQLaccess::Host;
|
|
BEGIN {
|
|
$localhost = undef;
|
|
$DEBUG = 2;
|
|
$DEBUG = $MySQLaccess::DEBUG unless ($DEBUG);
|
|
}
|
|
# ======================================
|
|
# sub IP2Name
|
|
# return the Name with the corr. IP-nmbr
|
|
# (no aliases yet!!)
|
|
# ======================================
|
|
sub IP2Name {
|
|
my ($ip) = @_;
|
|
my $ip_o = $ip;
|
|
if ($ip !~ /([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/o) {
|
|
MySQLaccess::Debug::Print(3,"'$ip' is not an ip-number, returning IP=$ip");
|
|
return $ip;
|
|
}
|
|
MySQLaccess::Debug::Print(4,"IP=$ip split up => $1.$2.$3.$4");
|
|
$ip = pack "C4",$1,$2,$3,$4;
|
|
MySQLaccess::Debug::Print(4,"IP packed -> >>$ip<<\n");
|
|
my ($name,$aliases,$addrtype,$length,@addrs) = gethostbyaddr($ip, AF_INET);
|
|
MySQLaccess::Debug::Print(3,"IP=$ip_o => hostname=$name");
|
|
MySQLaccess::Debug::Print(4,"aliases=$aliases");
|
|
MySQLaccess::Debug::Print(4,"addrtype=$addrtype - length=$length");
|
|
return ($name || $ip);
|
|
#return ($name || undef);
|
|
}
|
|
|
|
# ======================================
|
|
# sub Name2IP
|
|
# return the IP-number of the host
|
|
# ======================================
|
|
sub Name2IP {
|
|
my ($name) = @_;
|
|
if ($name =~ /[%_]/) {
|
|
MySQLaccess::Debug::Print(3,"'$name' contains SQL-wildcards, returning name=$name");
|
|
return $name;
|
|
}
|
|
my ($_name,$aliases,$addrtype,$length,@addrs) = gethostbyname($name);
|
|
my ($a,$b,$c,$d) = unpack('C4',$addrs[0]);
|
|
my $ip = "$a.$b.$c.$d";
|
|
MySQLaccess::Debug::Print(3,"hostname=$name => IP=$ip");
|
|
MySQLaccess::Debug::Print(4,"aliases=$aliases");
|
|
MySQLaccess::Debug::Print(4,"addrtype=$addrtype - length=$length");
|
|
#if ($ip ne "") { return "$ip"; }
|
|
#else { return undef; }
|
|
return ($ip || $name);
|
|
}
|
|
|
|
# ========================================
|
|
# sub LocalHost
|
|
# some special action has to be taken for
|
|
# the localhost
|
|
# ========================================
|
|
sub LocalHost {
|
|
if (!defined($MySQLaccess::Host::localhost)) {
|
|
$MySQLaccess::Host::localhost = Sys::Hostname::hostname();
|
|
MySQLaccess::Debug::Print(3,"Setting package variable \$localhost=$MySQLaccess::Host::localhost");
|
|
}
|
|
my $host = $localhost;
|
|
MySQLaccess::Debug::Print(3,"localhost = $host");
|
|
return $host;
|
|
}
|
|
|
|
# ========================================
|
|
# check if the given hostname (or ip)
|
|
# corresponds with the localhost
|
|
# ========================================
|
|
sub Is_localhost {
|
|
my ($host_tpl) = @_;
|
|
my $isit = 0;
|
|
if (($MySQLaccess::host_name eq $localhost) or ($MySQLaccess::host_ip eq $local_ip)) {
|
|
MySQLaccess::Debug::Print(2,"Checking for localhost");
|
|
MySQLaccess::Debug::Print(3,"because ($MySQLaccess::host_name EQ $localhost) AND ($MySQLaccess::host_ip EQ $local_ip)");
|
|
$isit = ( 'localhost' =~ /$host_tpl/ ) ? 1 : 0;
|
|
MySQLaccess::Debug::Print(3," 'localhost' =?= $host_tpl -> $isit");
|
|
return $isit;
|
|
}
|
|
else {
|
|
MySQLaccess::Debug::Print(4,"Not checking for localhost");
|
|
MySQLaccess::Debug::Print(4,"because ($MySQLaccess::host_name != $localhost) AND ($MySQLaccess::host_ip != $local_ip)");
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
# =========================================
|
|
# check if host (IP or name) can be matched
|
|
# on the template.
|
|
# =========================================
|
|
sub MatchTemplate {
|
|
my ($host,$tpl) = @_;
|
|
my $match = 0;
|
|
|
|
MySQLaccess::Debug::Print(1, "($host) =?= ($tpl)");
|
|
|
|
my $host_name = IP2Name($host);
|
|
my $host_ip = Name2IP($host);
|
|
|
|
MySQLaccess::Debug::Print(2, "name=$host_name ; ip=$host_ip");
|
|
$match = (MySQLaccess::Wildcards::MatchTemplate($tpl,$host_name) or
|
|
MySQLaccess::Wildcards::MatchTemplate($tpl,$host_ip));
|
|
|
|
MySQLaccess::Debug::Print(2, "($host_name,$host_ip) =?= ($tpl): $ncount");
|
|
|
|
return $match;
|
|
}
|
|
|
|
########################################################################
|
|
package MySQLaccess::Debug;
|
|
BEGIN {
|
|
my $dbg_file = "$MySQLaccess::script_log";
|
|
open(DEBUG,"> $dbg_file") or warn "Could not open outputfile $dbg_file for debugging-info\n";
|
|
select DEBUG;
|
|
$| = 1;
|
|
select STDOUT;
|
|
}
|
|
# =========================================
|
|
# Print debugging information on STDERR
|
|
# =========================================
|
|
sub Print {
|
|
my ($level,$mesg) = @_;
|
|
my ($pack,$file,$line,$subname,$hasargs,$wantarray) = caller(1);
|
|
my ($PACK) = split('::',$subname);
|
|
my $DEBUG = ${$PACK."::DEBUG"} ? ${$PACK."::DEBUG"} : $MySQLaccess::DEBUG ;
|
|
my ($sec,$min,$hour) = localtime();
|
|
print DEBUG "[$hour:$min:$sec $subname] $mesg\n" if ($DEBUG>=$level);
|
|
}
|
|
|