Browse Source

Initial import

wbx 15 years ago
commit
219a6dab89
100 changed files with 18731 additions and 0 deletions
  1. 33 0
      BSDmakefile
  2. 7 0
      BUGS
  3. 339 0
      COPYING
  4. 1619 0
      Config.default
  5. 17 0
      Config.in
  6. 29 0
      GNUmakefile
  7. 38 0
      LICENCE
  8. 187 0
      Makefile
  9. 39 0
      README
  10. 9 0
      TODO
  11. 8 0
      config/Config.in
  12. 255 0
      config/Kconfig-language.txt
  13. 123 0
      config/Makefile
  14. 5 0
      config/Makefile.in
  15. 377 0
      config/checklist.c
  16. 161 0
      config/colors.h
  17. 601 0
      config/conf.c
  18. 449 0
      config/confdata.c
  19. 196 0
      config/dialog.h
  20. 1089 0
      config/expr.c
  21. 194 0
      config/expr.h
  22. 848 0
      config/glob.c
  23. 100 0
      config/glob.h
  24. 240 0
      config/inputbox.c
  25. 1 0
      config/lex.backup
  26. 113 0
      config/lkc.h
  27. 39 0
      config/lkc_proto.h
  28. 717 0
      config/mconf.c
  29. 436 0
      config/menu.c
  30. 438 0
      config/menubox.c
  31. 85 0
      config/msgbox.c
  32. 782 0
      config/symbol.c
  33. 556 0
      config/textbox.c
  34. 375 0
      config/util.c
  35. 118 0
      config/yesno.c
  36. 387 0
      config/zconf.l
  37. 2133 0
      config/zconf.output
  38. 693 0
      config/zconf.y
  39. 182 0
      mk/build.mk
  40. 98 0
      mk/buildhlp.mk
  41. 23 0
      mk/cpu.mk
  42. 83 0
      mk/fetch.mk
  43. 69 0
      mk/image.mk
  44. 61 0
      mk/kernel-build.mk
  45. 77 0
      mk/kernel.mk
  46. 11 0
      mk/linux.mk
  47. 147 0
      mk/mirrors.mk
  48. 1254 0
      mk/modules.mk
  49. 212 0
      mk/package.mk
  50. 212 0
      mk/pkg-bottom.mk
  51. 21 0
      mk/rootfs.mk
  52. 10 0
      mk/split-cfg.mk
  53. 6 0
      mk/toolchain.mk
  54. 6 0
      mk/tools.mk
  55. 120 0
      mk/vars.mk
  56. 13 0
      package/6tunnel/Config.in
  57. 29 0
      package/6tunnel/Makefile
  58. 4 0
      package/6tunnel/ipkg/6tunnel.control
  59. 489 0
      package/Config.in
  60. 391 0
      package/Depends.mk
  61. 450 0
      package/Makefile
  62. 12 0
      package/aiccu/Config.in
  63. 36 0
      package/aiccu/Makefile
  64. 51 0
      package/aiccu/extra/common/dn_skipname.c
  65. 27 0
      package/aiccu/files/aiccu.init
  66. 1 0
      package/aiccu/ipkg/aiccu.conffiles
  67. 5 0
      package/aiccu/ipkg/aiccu.control
  68. 3 0
      package/aiccu/ipkg/aiccu.postinst
  69. 30 0
      package/aiccu/patches/patch-common_resolver_c
  70. 27 0
      package/aiccu/patches/patch-unix-console_Makefile
  71. 16 0
      package/aircrack-ng/Config.in
  72. 35 0
      package/aircrack-ng/Makefile
  73. 5 0
      package/aircrack-ng/ipkg/aircrack-ng.control
  74. 189 0
      package/aircrack-ng/patches/patch-src_airbase-ng_c
  75. 41 0
      package/aircrack-ng/patches/patch-src_aircrack-ng_c
  76. 21 0
      package/aircrack-ng/patches/patch-src_aircrack-ptw-lib_c
  77. 42 0
      package/aircrack-ng/patches/patch-src_aireplay-ng_c
  78. 21 0
      package/aircrack-ng/patches/patch-src_airodump-ng_c
  79. 21 0
      package/aircrack-ng/patches/patch-src_airtun-ng_c
  80. 17 0
      package/aircrack-ng/patches/patch-src_osdep_linux_c
  81. 11 0
      package/aircrack-ng/patches/patch-src_version_h
  82. 7 0
      package/alsa-lib/Config.in
  83. 31 0
      package/alsa-lib/Makefile
  84. 4 0
      package/alsa-lib/ipkg/alsa-lib.control
  85. 4 0
      package/alsa-lib/ipkg/alsa-lib.postinst
  86. 7 0
      package/alsa-utils/Config.in
  87. 31 0
      package/alsa-utils/Makefile
  88. 30 0
      package/alsa-utils/files/amixer.init
  89. 4 0
      package/alsa-utils/ipkg/alsa-utils.control
  90. 4 0
      package/alsa-utils/ipkg/alsa-utils.postinst
  91. 21 0
      package/alsa-utils/patches/patch-alsactl_init_parse_c
  92. 12 0
      package/apr-util/Config.in
  93. 31 0
      package/apr-util/Makefile
  94. 5 0
      package/apr-util/ipkg/apr-util.control
  95. 19 0
      package/apr-util/patches/patch-uri_Makefile_in
  96. 21 0
      package/apr-util/patches/uri_delim.patch
  97. 16 0
      package/apr/Config.in
  98. 54 0
      package/apr/Makefile
  99. 4 0
      package/apr/ipkg/apr.control
  100. 11 0
      package/arpd/Config.in

+ 33 - 0
BSDmakefile

@@ -0,0 +1,33 @@
+# $Id$
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+TOPDIR=		${.CURDIR}
+PWD=		${.CURDIR}
+
+.if defined(package) && !empty(package)
+subdir:=	package/${package}
+.  if !make(clean)
+_subdir_dep:=	${TOPDIR}/.cfg/ADK_HAVE_DOT_CONFIG
+.  endif
+.endif
+
+.if defined(subdir) && !empty(subdir)
+_subdir:=	${.TARGETS}
+${.TARGETS}: _subdir
+
+_subdir: ${_subdir_dep}
+	@if test x"$$(umask 2>/dev/null | sed 's/00*22/OK/')" != x"OK"; then \
+		echo >&2 Error: you must build with “umask 022”, sorry.; \
+		exit 1; \
+	fi
+	cd ${.CURDIR}/${subdir} && TOPDIR=${.CURDIR} DEVELOPER=1 \
+	    gmake VERBOSE=1 ${.MFLAGS} ${_subdir}
+
+.  include "${.CURDIR}/prereq.mk"
+.  include "${.CURDIR}/mk/split-cfg.mk"
+.else
+.  include "${.CURDIR}/prereq.mk"
+.  include "${.CURDIR}/Makefile"
+.endif

+ 7 - 0
BUGS

@@ -0,0 +1,7 @@
+- lvm package and device-mapper combine and shared
+- use kmod-template for external kernel modules
+- optimize iptables package (libdirs depending on choosen kernel features)
+- checksum for toolchain packages
+- network scripts for wireless client / ap
+- x11 support completion
+- disable platforms zaurus / qemu etrax

+ 339 - 0
COPYING

@@ -0,0 +1,339 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.

+ 1619 - 0
Config.default

@@ -0,0 +1,1619 @@
+#
+# Automatically generated make config: don't edit
+#
+MODULES=y
+ADK_HAVE_DOT_CONFIG=y
+ADK_alix1c=y
+ADK_DEVICE="alix1c"
+
+#
+# Target system
+#
+ADK_LINUX_X86_ALIX1C=y
+# ADK_LINUX_CRIS_FOXBOARD is not set
+# ADK_LINUX_MIPS_RB411 is not set
+# ADK_LINUX_MIPS_RB433 is not set
+# ADK_LINUX_MIPS_RB532 is not set
+# ADK_LINUX_XSCALE_ZAURUS is not set
+# ADK_LINUX_X86_IBM_X40 is not set
+# ADK_LINUX_QEMU is not set
+ADK_KERNEL_NETWORK_FILESYSTEMS=y
+# ADK_KERNEL_IP_PNP is not set
+# ADK_KERNEL_IP_PNP_DHCP is not set
+# ADK_KERNEL_NFS_FS is not set
+# ADK_KERNEL_NFS_V3 is not set
+# ADK_KERNEL_ROOT_NFS is not set
+# ADK_KERNEL_LOCKD is not set
+# ADK_KERNEL_NFS_COMMON is not set
+# ADK_KERNEL_SUNRPC is not set
+ADK_KERNEL_EXT2_FS=y
+ADK_TARGET_LIB_UCLIBC=y
+# ADK_TARGET_LIB_GLIBC is not set
+# ADK_TARGET_ROOTFS_INITRAMFS is not set
+# ADK_TARGET_ROOTFS_SQUASHFS is not set
+# ADK_TARGET_ROOTFS_YAFFS is not set
+# ADK_TARGET_ROOTFS_NFSROOT is not set
+ADK_TARGET_ROOTFS_EXT2_CF=y
+# ADK_TARGET_ROOTFS_EXT2 is not set
+# ADK_SSP is not set
+# ADK_CXX is not set
+# ADK_IPV6 is not set
+# ADK_XORG is not set
+
+#
+# Package selection
+#
+
+#
+# Package categories
+#
+
+#
+# Applications
+#
+
+#
+# Basesystem
+#
+ADK_PACKAGE_BASE_FILES=y
+ADK_PACKAGE_CONFIG_IN_ETC=y
+ADK_PACKAGE_BUSYBOX=y
+
+#
+# Busybox Configuration
+#
+BUSYBOX_HAVE_DOT_CONFIG=y
+
+#
+# Busybox Settings
+#
+
+#
+# General Configuration
+#
+# BUSYBOX_DESKTOP is not set
+# BUSYBOX_EXTRA_COMPAT is not set
+# BUSYBOX_FEATURE_ASSUME_UNICODE is not set
+BUSYBOX_FEATURE_BUFFERS_USE_MALLOC=y
+# BUSYBOX_FEATURE_BUFFERS_GO_ON_STACK is not set
+# BUSYBOX_FEATURE_BUFFERS_GO_IN_BSS is not set
+BUSYBOX_SHOW_USAGE=y
+BUSYBOX_FEATURE_VERBOSE_USAGE=y
+BUSYBOX_FEATURE_COMPRESS_USAGE=y
+# BUSYBOX_FEATURE_INSTALLER is not set
+# BUSYBOX_LOCALE_SUPPORT is not set
+BUSYBOX_GETOPT_LONG=y
+BUSYBOX_FEATURE_DEVPTS=y
+# BUSYBOX_FEATURE_CLEAN_UP is not set
+# BUSYBOX_FEATURE_PIDFILE is not set
+BUSYBOX_FEATURE_SUID=y
+# BUSYBOX_FEATURE_SUID_CONFIG is not set
+# BUSYBOX_FEATURE_PREFER_APPLETS is not set
+BUSYBOX_BUSYBOX_EXEC_PATH="/proc/self/exe"
+BUSYBOX_FEATURE_SYSLOG=y
+# BUSYBOX_FEATURE_HAVE_RPC is not set
+
+#
+# Build Options
+#
+BUSYBOX_LFS=y
+BUSYBOX_CROSS_COMPILER_PREFIX=""
+
+#
+# Debugging Options
+#
+# BUSYBOX_DEBUG is not set
+# BUSYBOX_WERROR is not set
+BUSYBOX_NO_DEBUG_LIB=y
+# BUSYBOX_DMALLOC is not set
+# BUSYBOX_EFENCE is not set
+BUSYBOX_INCLUDE_SUSv2=y
+
+#
+# Installation Options
+#
+# BUSYBOX_INSTALL_NO_USR is not set
+BUSYBOX_INSTALL_APPLET_SYMLINKS=y
+# BUSYBOX_INSTALL_APPLET_HARDLINKS is not set
+# BUSYBOX_INSTALL_APPLET_SCRIPT_WRAPPERS is not set
+# BUSYBOX_INSTALL_APPLET_DONT is not set
+BUSYBOX_PREFIX="@IDIR@"
+
+#
+# Busybox Library Tuning
+#
+BUSYBOX_PASSWORD_MINLEN=6
+BUSYBOX_MD5_SIZE_VS_SPEED=2
+# BUSYBOX_FEATURE_FAST_TOP is not set
+# BUSYBOX_FEATURE_ETC_NETWORKS is not set
+BUSYBOX_FEATURE_EDITING=y
+BUSYBOX_FEATURE_EDITING_MAX_LEN=1024
+# BUSYBOX_FEATURE_EDITING_VI is not set
+BUSYBOX_FEATURE_EDITING_HISTORY=15
+# BUSYBOX_FEATURE_EDITING_SAVEHISTORY is not set
+BUSYBOX_FEATURE_TAB_COMPLETION=y
+# BUSYBOX_FEATURE_USERNAME_COMPLETION is not set
+# BUSYBOX_FEATURE_EDITING_FANCY_PROMPT is not set
+# BUSYBOX_FEATURE_VERBOSE_CP_MESSAGE is not set
+BUSYBOX_FEATURE_COPYBUF_KB=4
+BUSYBOX_MONOTONIC_SYSCALL=y
+BUSYBOX_IOCTL_HEX2STR_ERROR=y
+# BUSYBOX_FEATURE_HWIB is not set
+
+#
+# Applets
+#
+
+#
+# Archival Utilities
+#
+# BUSYBOX_FEATURE_SEAMLESS_LZMA is not set
+# BUSYBOX_FEATURE_SEAMLESS_BZ2 is not set
+# BUSYBOX_FEATURE_SEAMLESS_GZ is not set
+# BUSYBOX_FEATURE_SEAMLESS_Z is not set
+# BUSYBOX_AR is not set
+BUSYBOX_BUNZIP2=y
+# BUSYBOX_BZIP2 is not set
+BUSYBOX_CPIO=y
+# BUSYBOX_FEATURE_CPIO_O is not set
+# BUSYBOX_DPKG is not set
+# BUSYBOX_DPKG_DEB is not set
+BUSYBOX_GUNZIP=y
+BUSYBOX_GZIP=y
+BUSYBOX_IPKG=y
+# BUSYBOX_RPM2CPIO is not set
+# BUSYBOX_RPM is not set
+BUSYBOX_TAR=y
+# BUSYBOX_UNCOMPRESS is not set
+# BUSYBOX_UNLZMA is not set
+BUSYBOX_UNZIP=y
+
+#
+# Coreutils
+#
+BUSYBOX_BASENAME=y
+# BUSYBOX_CAL is not set
+BUSYBOX_CAT=y
+# BUSYBOX_CATV is not set
+BUSYBOX_CHGRP=y
+BUSYBOX_CHMOD=y
+BUSYBOX_CHOWN=y
+BUSYBOX_CHROOT=y
+BUSYBOX_CKSUM=y
+BUSYBOX_COMM=y
+BUSYBOX_CP=y
+BUSYBOX_CUT=y
+BUSYBOX_DATE=y
+BUSYBOX_FEATURE_DATE_ISOFMT=y
+BUSYBOX_DD=y
+BUSYBOX_FEATURE_DD_SIGNAL_HANDLING=y
+BUSYBOX_FEATURE_DD_IBS_OBS=y
+BUSYBOX_DF=y
+BUSYBOX_FEATURE_DF_FANCY=y
+BUSYBOX_DIRNAME=y
+BUSYBOX_DOS2UNIX=y
+BUSYBOX_UNIX2DOS=y
+BUSYBOX_DU=y
+BUSYBOX_FEATURE_DU_DEFAULT_BLOCKSIZE_1K=y
+BUSYBOX_ECHO=y
+BUSYBOX_FEATURE_FANCY_ECHO=y
+BUSYBOX_ENV=y
+# BUSYBOX_FEATURE_ENV_LONG_OPTIONS is not set
+# BUSYBOX_EXPAND is not set
+BUSYBOX_EXPR=y
+# BUSYBOX_EXPR_MATH_SUPPORT_64 is not set
+BUSYBOX_FALSE=y
+# BUSYBOX_FOLD is not set
+BUSYBOX_HEAD=y
+BUSYBOX_FEATURE_FANCY_HEAD=y
+# BUSYBOX_HOSTID is not set
+BUSYBOX_ID=y
+# BUSYBOX_INSTALL is not set
+# BUSYBOX_LENGTH is not set
+BUSYBOX_LN=y
+# BUSYBOX_LOGNAME is not set
+BUSYBOX_LS=y
+BUSYBOX_FEATURE_LS_FILETYPES=y
+BUSYBOX_FEATURE_LS_FOLLOWLINKS=y
+BUSYBOX_FEATURE_LS_RECURSIVE=y
+BUSYBOX_FEATURE_LS_SORTFILES=y
+BUSYBOX_FEATURE_LS_TIMESTAMPS=y
+BUSYBOX_FEATURE_LS_USERNAME=y
+# BUSYBOX_FEATURE_LS_COLOR is not set
+BUSYBOX_MD5SUM=y
+BUSYBOX_MKDIR=y
+# BUSYBOX_FEATURE_MKDIR_LONG_OPTIONS is not set
+BUSYBOX_MKFIFO=y
+BUSYBOX_MKNOD=y
+BUSYBOX_MV=y
+# BUSYBOX_FEATURE_MV_LONG_OPTIONS is not set
+BUSYBOX_NICE=y
+BUSYBOX_NOHUP=y
+# BUSYBOX_OD is not set
+# BUSYBOX_PRINTENV is not set
+BUSYBOX_PRINTF=y
+BUSYBOX_PWD=y
+BUSYBOX_READLINK=y
+BUSYBOX_FEATURE_READLINK_FOLLOW=y
+# BUSYBOX_REALPATH is not set
+BUSYBOX_RM=y
+# BUSYBOX_RMDIR is not set
+BUSYBOX_SEQ=y
+BUSYBOX_SHA1SUM=y
+BUSYBOX_SLEEP=y
+# BUSYBOX_FEATURE_FANCY_SLEEP is not set
+BUSYBOX_SORT=y
+BUSYBOX_FEATURE_SORT_BIG=y
+# BUSYBOX_SPLIT is not set
+# BUSYBOX_STAT is not set
+BUSYBOX_STTY=y
+# BUSYBOX_SUM is not set
+BUSYBOX_SYNC=y
+# BUSYBOX_TAC is not set
+BUSYBOX_TAIL=y
+# BUSYBOX_FEATURE_FANCY_TAIL is not set
+BUSYBOX_TEE=y
+# BUSYBOX_FEATURE_TEE_USE_BLOCK_IO is not set
+BUSYBOX_TEST=y
+# BUSYBOX_FEATURE_TEST_64 is not set
+BUSYBOX_TOUCH=y
+BUSYBOX_TR=y
+BUSYBOX_FEATURE_TR_CLASSES=y
+# BUSYBOX_FEATURE_TR_EQUIV is not set
+BUSYBOX_TRUE=y
+# BUSYBOX_TTY is not set
+BUSYBOX_UNAME=y
+# BUSYBOX_UNEXPAND is not set
+BUSYBOX_UNIQ=y
+# BUSYBOX_USLEEP is not set
+# BUSYBOX_UUDECODE is not set
+# BUSYBOX_UUENCODE is not set
+BUSYBOX_WC=y
+# BUSYBOX_FEATURE_WC_LARGE is not set
+BUSYBOX_WHO=y
+# BUSYBOX_WHOAMI is not set
+BUSYBOX_YES=y
+
+#
+# Common options for cp and mv
+#
+BUSYBOX_FEATURE_PRESERVE_HARDLINKS=y
+
+#
+# Common options for ls, more and telnet
+#
+BUSYBOX_FEATURE_AUTOWIDTH=y
+
+#
+# Common options for df, du, ls
+#
+BUSYBOX_FEATURE_HUMAN_READABLE=y
+
+#
+# Common options for md5sum, sha1sum
+#
+BUSYBOX_FEATURE_MD5_SHA1_SUM_CHECK=y
+
+#
+# Console Utilities
+#
+# BUSYBOX_CHVT is not set
+BUSYBOX_CLEAR=y
+# BUSYBOX_DEALLOCVT is not set
+# BUSYBOX_DUMPKMAP is not set
+# BUSYBOX_KBD_MODE is not set
+# BUSYBOX_LOADFONT is not set
+# BUSYBOX_LOADKMAP is not set
+# BUSYBOX_OPENVT is not set
+BUSYBOX_RESET=y
+# BUSYBOX_RESIZE is not set
+# BUSYBOX_SETCONSOLE is not set
+# BUSYBOX_SETFONT is not set
+# BUSYBOX_SETKEYCODES is not set
+# BUSYBOX_SETLOGCONS is not set
+# BUSYBOX_SHOWKEY is not set
+
+#
+# Debian Utilities
+#
+BUSYBOX_MKTEMP=y
+# BUSYBOX_PIPE_PROGRESS is not set
+BUSYBOX_RUN_PARTS=y
+# BUSYBOX_FEATURE_RUN_PARTS_LONG_OPTIONS is not set
+# BUSYBOX_FEATURE_RUN_PARTS_FANCY is not set
+# BUSYBOX_START_STOP_DAEMON is not set
+BUSYBOX_WHICH=y
+
+#
+# Editors
+#
+BUSYBOX_AWK=y
+BUSYBOX_FEATURE_AWK_LIBM=y
+# BUSYBOX_CMP is not set
+BUSYBOX_DIFF=y
+BUSYBOX_FEATURE_DIFF_BINARY=y
+BUSYBOX_FEATURE_DIFF_DIR=y
+# BUSYBOX_FEATURE_DIFF_MINIMAL is not set
+# BUSYBOX_ED is not set
+# BUSYBOX_PATCH is not set
+BUSYBOX_SED=y
+BUSYBOX_VI=y
+BUSYBOX_FEATURE_VI_MAX_LEN=4096
+BUSYBOX_FEATURE_VI_8BIT=y
+BUSYBOX_FEATURE_VI_COLON=y
+BUSYBOX_FEATURE_VI_YANKMARK=y
+BUSYBOX_FEATURE_VI_SEARCH=y
+BUSYBOX_FEATURE_VI_USE_SIGNALS=y
+BUSYBOX_FEATURE_VI_DOT_CMD=y
+BUSYBOX_FEATURE_VI_READONLY=y
+BUSYBOX_FEATURE_VI_SETOPTS=y
+BUSYBOX_FEATURE_VI_SET=y
+BUSYBOX_FEATURE_VI_WIN_RESIZE=y
+BUSYBOX_FEATURE_VI_OPTIMIZE_CURSOR=y
+BUSYBOX_FEATURE_ALLOW_EXEC=y
+
+#
+# Finding Utilities
+#
+BUSYBOX_FIND=y
+BUSYBOX_FEATURE_FIND_PRINT0=y
+BUSYBOX_FEATURE_FIND_MTIME=y
+BUSYBOX_FEATURE_FIND_MMIN=y
+BUSYBOX_FEATURE_FIND_PERM=y
+BUSYBOX_FEATURE_FIND_TYPE=y
+BUSYBOX_FEATURE_FIND_XDEV=y
+BUSYBOX_FEATURE_FIND_MAXDEPTH=y
+BUSYBOX_FEATURE_FIND_NEWER=y
+BUSYBOX_FEATURE_FIND_INUM=y
+BUSYBOX_FEATURE_FIND_EXEC=y
+BUSYBOX_FEATURE_FIND_USER=y
+BUSYBOX_FEATURE_FIND_GROUP=y
+BUSYBOX_FEATURE_FIND_NOT=y
+BUSYBOX_FEATURE_FIND_DEPTH=y
+BUSYBOX_FEATURE_FIND_PAREN=y
+BUSYBOX_FEATURE_FIND_SIZE=y
+BUSYBOX_FEATURE_FIND_PRUNE=y
+BUSYBOX_FEATURE_FIND_EMPTY=y
+BUSYBOX_FEATURE_FIND_DELETE=y
+BUSYBOX_FEATURE_FIND_PATH=y
+BUSYBOX_FEATURE_FIND_REGEX=y
+BUSYBOX_GREP=y
+BUSYBOX_FEATURE_GREP_EGREP_ALIAS=y
+BUSYBOX_FEATURE_GREP_FGREP_ALIAS=y
+BUSYBOX_FEATURE_GREP_CONTEXT=y
+BUSYBOX_XARGS=y
+# BUSYBOX_FEATURE_XARGS_SUPPORT_CONFIRMATION is not set
+# BUSYBOX_FEATURE_XARGS_SUPPORT_QUOTES is not set
+# BUSYBOX_FEATURE_XARGS_SUPPORT_TERMOPT is not set
+# BUSYBOX_FEATURE_XARGS_SUPPORT_ZERO_TERM is not set
+
+#
+# Init Utilities
+#
+BUSYBOX_INIT=y
+BUSYBOX_FEATURE_USE_INITTAB=y
+BUSYBOX_FEATURE_KILL_REMOVED=y
+BUSYBOX_FEATURE_KILL_DELAY=0
+# BUSYBOX_FEATURE_INIT_SCTTY is not set
+BUSYBOX_FEATURE_INIT_SYSLOG=y
+# BUSYBOX_FEATURE_EXTRA_QUIET is not set
+# BUSYBOX_FEATURE_INIT_COREDUMPS is not set
+# BUSYBOX_FEATURE_INITRD is not set
+BUSYBOX_HALT=y
+# BUSYBOX_MESG is not set
+
+#
+# Login/Password Management Utilities
+#
+BUSYBOX_FEATURE_SHADOWPASSWDS=y
+BUSYBOX_USE_BB_PWD_GRP=y
+BUSYBOX_USE_BB_SHADOW=y
+BUSYBOX_USE_BB_CRYPT=y
+BUSYBOX_ADDGROUP=y
+# BUSYBOX_FEATURE_ADDUSER_TO_GROUP is not set
+BUSYBOX_DELGROUP=y
+# BUSYBOX_FEATURE_DEL_USER_FROM_GROUP is not set
+# BUSYBOX_FEATURE_CHECK_NAMES is not set
+BUSYBOX_ADDUSER=y
+# BUSYBOX_FEATURE_ADDUSER_LONG_OPTIONS is not set
+BUSYBOX_DELUSER=y
+BUSYBOX_GETTY=y
+BUSYBOX_FEATURE_UTMP=y
+BUSYBOX_FEATURE_WTMP=y
+BUSYBOX_LOGIN=y
+# BUSYBOX_LOGIN_SCRIPTS is not set
+BUSYBOX_FEATURE_NOLOGIN=y
+BUSYBOX_FEATURE_SECURETTY=y
+BUSYBOX_PASSWD=y
+BUSYBOX_FEATURE_PASSWD_WEAK_CHECK=y
+# BUSYBOX_CRYPTPW is not set
+# BUSYBOX_CHPASSWD is not set
+BUSYBOX_SU=y
+BUSYBOX_FEATURE_SU_SYSLOG=y
+BUSYBOX_FEATURE_SU_CHECKS_SHELLS=y
+# BUSYBOX_SULOGIN is not set
+# BUSYBOX_VLOCK is not set
+
+#
+# Linux Ext2 FS Progs
+#
+# BUSYBOX_CHATTR is not set
+# BUSYBOX_FSCK is not set
+# BUSYBOX_LSATTR is not set
+
+#
+# Linux Module Utilities
+#
+BUSYBOX_DEFAULT_MODULES_DIR="/lib/modules"
+BUSYBOX_DEFAULT_DEPMOD_FILE="modules.dep"
+# BUSYBOX_MODPROBE_SMALL is not set
+BUSYBOX_INSMOD=y
+BUSYBOX_RMMOD=y
+BUSYBOX_LSMOD=y
+# BUSYBOX_FEATURE_LSMOD_PRETTY_2_6_OUTPUT is not set
+# BUSYBOX_MODPROBE is not set
+# BUSYBOX_DEPMOD is not set
+
+#
+# Options common to multiple modutils
+#
+# BUSYBOX_FEATURE_2_4_MODULES is not set
+BUSYBOX_FEATURE_CHECK_TAINTED_MODULE=y
+
+#
+# Linux System Utilities
+#
+BUSYBOX_BLKID=y
+BUSYBOX_DMESG=y
+BUSYBOX_FEATURE_DMESG_PRETTY=y
+# BUSYBOX_FBSET is not set
+# BUSYBOX_FDFLUSH is not set
+# BUSYBOX_FDFORMAT is not set
+BUSYBOX_FDISK=y
+BUSYBOX_FDISK_SUPPORT_LARGE_DISKS=y
+BUSYBOX_FEATURE_FDISK_WRITABLE=y
+# BUSYBOX_FEATURE_AIX_LABEL is not set
+# BUSYBOX_FEATURE_SGI_LABEL is not set
+# BUSYBOX_FEATURE_SUN_LABEL is not set
+# BUSYBOX_FEATURE_OSF_LABEL is not set
+# BUSYBOX_FEATURE_FDISK_ADVANCED is not set
+# BUSYBOX_FINDFS is not set
+# BUSYBOX_FREERAMDISK is not set
+# BUSYBOX_FSCK_MINIX is not set
+# BUSYBOX_MKFS_MINIX is not set
+# BUSYBOX_GETOPT is not set
+BUSYBOX_HEXDUMP=y
+# BUSYBOX_FEATURE_HEXDUMP_REVERSE is not set
+# BUSYBOX_HD is not set
+BUSYBOX_HWCLOCK=y
+# BUSYBOX_FEATURE_HWCLOCK_LONG_OPTIONS is not set
+BUSYBOX_FEATURE_HWCLOCK_ADJTIME_FHS=y
+BUSYBOX_IPCRM=y
+BUSYBOX_IPCS=y
+BUSYBOX_LOSETUP=y
+BUSYBOX_MDEV=y
+BUSYBOX_FEATURE_MDEV_CONF=y
+BUSYBOX_FEATURE_MDEV_RENAME=y
+BUSYBOX_FEATURE_MDEV_RENAME_REGEXP=y
+BUSYBOX_FEATURE_MDEV_EXEC=y
+BUSYBOX_FEATURE_MDEV_LOAD_FIRMWARE=y
+# BUSYBOX_MKSWAP is not set
+BUSYBOX_MORE=y
+BUSYBOX_FEATURE_USE_TERMIOS=y
+BUSYBOX_VOLUMEID=y
+# BUSYBOX_FEATURE_VOLUMEID_EXT is not set
+# BUSYBOX_FEATURE_VOLUMEID_REISERFS is not set
+# BUSYBOX_FEATURE_VOLUMEID_FAT is not set
+# BUSYBOX_FEATURE_VOLUMEID_HFS is not set
+# BUSYBOX_FEATURE_VOLUMEID_JFS is not set
+BUSYBOX_FEATURE_VOLUMEID_XFS=y
+# BUSYBOX_FEATURE_VOLUMEID_NTFS is not set
+# BUSYBOX_FEATURE_VOLUMEID_ISO9660 is not set
+# BUSYBOX_FEATURE_VOLUMEID_UDF is not set
+# BUSYBOX_FEATURE_VOLUMEID_LUKS is not set
+# BUSYBOX_FEATURE_VOLUMEID_LINUXSWAP is not set
+# BUSYBOX_FEATURE_VOLUMEID_CRAMFS is not set
+# BUSYBOX_FEATURE_VOLUMEID_ROMFS is not set
+# BUSYBOX_FEATURE_VOLUMEID_SYSV is not set
+# BUSYBOX_FEATURE_VOLUMEID_OCFS2 is not set
+# BUSYBOX_FEATURE_VOLUMEID_LINUXRAID is not set
+BUSYBOX_MOUNT=y
+# BUSYBOX_FEATURE_MOUNT_FAKE is not set
+# BUSYBOX_FEATURE_MOUNT_VERBOSE is not set
+BUSYBOX_FEATURE_MOUNT_HELPERS=y
+BUSYBOX_FEATURE_MOUNT_LABEL=y
+# BUSYBOX_FEATURE_MOUNT_NFS is not set
+# BUSYBOX_FEATURE_MOUNT_CIFS is not set
+BUSYBOX_FEATURE_MOUNT_FLAGS=y
+BUSYBOX_FEATURE_MOUNT_FSTAB=y
+# BUSYBOX_PIVOT_ROOT is not set
+BUSYBOX_RDATE=y
+# BUSYBOX_RDEV is not set
+# BUSYBOX_READPROFILE is not set
+# BUSYBOX_RTCWAKE is not set
+# BUSYBOX_SCRIPT is not set
+# BUSYBOX_SETARCH is not set
+# BUSYBOX_SWAPONOFF is not set
+# BUSYBOX_SWITCH_ROOT is not set
+BUSYBOX_UMOUNT=y
+# BUSYBOX_FEATURE_UMOUNT_ALL is not set
+
+#
+# Common options for mount/umount
+#
+BUSYBOX_FEATURE_MOUNT_LOOP=y
+# BUSYBOX_FEATURE_MTAB_SUPPORT is not set
+
+#
+# Miscellaneous Utilities
+#
+# BUSYBOX_ADJTIMEX is not set
+# BUSYBOX_BBCONFIG is not set
+# BUSYBOX_CHAT is not set
+# BUSYBOX_CHRT is not set
+BUSYBOX_CROND=y
+# BUSYBOX_FEATURE_CROND_D is not set
+# BUSYBOX_FEATURE_CROND_CALL_SENDMAIL is not set
+BUSYBOX_CRONTAB=y
+# BUSYBOX_DC is not set
+# BUSYBOX_DEVFSD is not set
+# BUSYBOX_FEATURE_DEVFS is not set
+# BUSYBOX_DEVMEM is not set
+# BUSYBOX_EJECT is not set
+# BUSYBOX_FBSPLASH is not set
+# BUSYBOX_INOTIFYD is not set
+# BUSYBOX_LAST is not set
+BUSYBOX_LESS=y
+BUSYBOX_FEATURE_LESS_MAXLINES=9999999
+# BUSYBOX_FEATURE_LESS_BRACKETS is not set
+# BUSYBOX_FEATURE_LESS_FLAGS is not set
+# BUSYBOX_FEATURE_LESS_DASHCMD is not set
+# BUSYBOX_FEATURE_LESS_MARKS is not set
+# BUSYBOX_FEATURE_LESS_REGEXP is not set
+BUSYBOX_FEATURE_LESS_WINCH=y
+# BUSYBOX_HDPARM is not set
+# BUSYBOX_MAKEDEVS is not set
+# BUSYBOX_MAN is not set
+# BUSYBOX_MICROCOM is not set
+# BUSYBOX_MOUNTPOINT is not set
+# BUSYBOX_MT is not set
+# BUSYBOX_RAIDAUTORUN is not set
+# BUSYBOX_READAHEAD is not set
+# BUSYBOX_RUNLEVEL is not set
+# BUSYBOX_RX is not set
+# BUSYBOX_SETSID is not set
+# BUSYBOX_STRINGS is not set
+# BUSYBOX_TASKSET is not set
+# BUSYBOX_TIME is not set
+# BUSYBOX_TTYSIZE is not set
+# BUSYBOX_WATCHDOG is not set
+
+#
+# Networking Utilities
+#
+# BUSYBOX_FEATURE_IPV6 is not set
+# BUSYBOX_VERBOSE_RESOLUTION_ERRORS is not set
+BUSYBOX_ARP=y
+BUSYBOX_ARPING=y
+# BUSYBOX_BRCTL is not set
+# BUSYBOX_DNSD is not set
+# BUSYBOX_ETHER_WAKE is not set
+# BUSYBOX_FAKEIDENTD is not set
+# BUSYBOX_FTPGET is not set
+# BUSYBOX_FTPPUT is not set
+BUSYBOX_HOSTNAME=y
+# BUSYBOX_HTTPD is not set
+BUSYBOX_IFCONFIG=y
+BUSYBOX_FEATURE_IFCONFIG_STATUS=y
+# BUSYBOX_FEATURE_IFCONFIG_SLIP is not set
+# BUSYBOX_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ is not set
+BUSYBOX_FEATURE_IFCONFIG_HW=y
+BUSYBOX_FEATURE_IFCONFIG_BROADCAST_PLUS=y
+# BUSYBOX_IFENSLAVE is not set
+BUSYBOX_IFUPDOWN=y
+BUSYBOX_IFUPDOWN_IFSTATE_PATH="/var/run/ifstate"
+BUSYBOX_FEATURE_IFUPDOWN_IP=y
+BUSYBOX_FEATURE_IFUPDOWN_IP_BUILTIN=y
+BUSYBOX_FEATURE_IFUPDOWN_IPV4=y
+# BUSYBOX_FEATURE_IFUPDOWN_MAPPING is not set
+# BUSYBOX_FEATURE_IFUPDOWN_EXTERNAL_DHCP is not set
+# BUSYBOX_INETD is not set
+BUSYBOX_IP=y
+BUSYBOX_FEATURE_IP_ADDRESS=y
+BUSYBOX_FEATURE_IP_LINK=y
+BUSYBOX_FEATURE_IP_ROUTE=y
+# BUSYBOX_FEATURE_IP_TUNNEL is not set
+# BUSYBOX_FEATURE_IP_RULE is not set
+# BUSYBOX_FEATURE_IP_SHORT_FORMS is not set
+# BUSYBOX_FEATURE_IP_RARE_PROTOCOLS is not set
+# BUSYBOX_IPCALC is not set
+# BUSYBOX_NAMEIF is not set
+BUSYBOX_NC=y
+BUSYBOX_NC_SERVER=y
+# BUSYBOX_NC_EXTRA is not set
+BUSYBOX_NETSTAT=y
+# BUSYBOX_FEATURE_NETSTAT_WIDE is not set
+BUSYBOX_FEATURE_NETSTAT_PRG=y
+BUSYBOX_NSLOOKUP=y
+BUSYBOX_PING=y
+BUSYBOX_FEATURE_FANCY_PING=y
+# BUSYBOX_PSCAN is not set
+BUSYBOX_ROUTE=y
+# BUSYBOX_SLATTACH is not set
+BUSYBOX_TELNET=y
+BUSYBOX_FEATURE_TELNET_TTYPE=y
+BUSYBOX_FEATURE_TELNET_AUTOLOGIN=y
+# BUSYBOX_TELNETD is not set
+# BUSYBOX_TFTP is not set
+# BUSYBOX_TFTPD is not set
+BUSYBOX_TRACEROUTE=y
+BUSYBOX_FEATURE_TRACEROUTE_VERBOSE=y
+# BUSYBOX_FEATURE_TRACEROUTE_SOURCE_ROUTE is not set
+BUSYBOX_FEATURE_TRACEROUTE_USE_ICMP=y
+# BUSYBOX_APP_UDHCPD is not set
+BUSYBOX_APP_UDHCPC=y
+BUSYBOX_FEATURE_UDHCPC_ARPING=y
+# BUSYBOX_FEATURE_UDHCP_PORT is not set
+# BUSYBOX_UDHCP_DEBUG is not set
+# BUSYBOX_FEATURE_UDHCP_RFC3397 is not set
+BUSYBOX_UDHCPC_DEFAULT_SCRIPT="/usr/share/udhcpc/default.script"
+BUSYBOX_UDHCPC_SLACK_FOR_BUGGY_SERVERS=80
+# BUSYBOX_VCONFIG is not set
+BUSYBOX_WGET=y
+# BUSYBOX_FEATURE_WGET_STATUSBAR is not set
+BUSYBOX_FEATURE_WGET_AUTHENTICATION=y
+# BUSYBOX_FEATURE_WGET_LONG_OPTIONS is not set
+# BUSYBOX_ZCIP is not set
+# BUSYBOX_TCPSVD is not set
+# BUSYBOX_UDPSVD is not set
+
+#
+# Print Utilities
+#
+# BUSYBOX_LPD is not set
+# BUSYBOX_LPR is not set
+# BUSYBOX_LPQ is not set
+
+#
+# Mail Utilities
+#
+# BUSYBOX_MAKEMIME is not set
+# BUSYBOX_POPMAILDIR is not set
+# BUSYBOX_REFORMIME is not set
+# BUSYBOX_SENDMAIL is not set
+
+#
+# Process Utilities
+#
+BUSYBOX_FREE=y
+BUSYBOX_FUSER=y
+BUSYBOX_KILL=y
+BUSYBOX_KILLALL=y
+# BUSYBOX_KILLALL5 is not set
+# BUSYBOX_NMETER is not set
+# BUSYBOX_PGREP is not set
+BUSYBOX_PIDOF=y
+# BUSYBOX_FEATURE_PIDOF_SINGLE is not set
+BUSYBOX_FEATURE_PIDOF_OMIT=y
+BUSYBOX_PKILL=y
+BUSYBOX_PS=y
+# BUSYBOX_FEATURE_PS_WIDE is not set
+# BUSYBOX_RENICE is not set
+BUSYBOX_BB_SYSCTL=y
+BUSYBOX_TOP=y
+BUSYBOX_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y
+BUSYBOX_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y
+# BUSYBOX_FEATURE_TOP_SMP_CPU is not set
+# BUSYBOX_FEATURE_TOP_DECIMALS is not set
+# BUSYBOX_FEATURE_TOP_SMP_PROCESS is not set
+# BUSYBOX_FEATURE_TOPMEM is not set
+BUSYBOX_UPTIME=y
+BUSYBOX_WATCH=y
+
+#
+# Runit Utilities
+#
+# BUSYBOX_RUNSV is not set
+# BUSYBOX_RUNSVDIR is not set
+# BUSYBOX_SV is not set
+# BUSYBOX_SVLOGD is not set
+# BUSYBOX_CHPST is not set
+# BUSYBOX_SETUIDGID is not set
+# BUSYBOX_ENVUIDGID is not set
+# BUSYBOX_ENVDIR is not set
+# BUSYBOX_SOFTLIMIT is not set
+
+#
+# Shells
+#
+BUSYBOX_FEATURE_SH_IS_ASH=y
+# BUSYBOX_FEATURE_SH_IS_HUSH is not set
+# BUSYBOX_FEATURE_SH_IS_MSH is not set
+# BUSYBOX_FEATURE_SH_IS_NONE is not set
+BUSYBOX_ASH=y
+
+#
+# Ash Shell Options
+#
+BUSYBOX_ASH_BASH_COMPAT=y
+BUSYBOX_ASH_JOB_CONTROL=y
+# BUSYBOX_ASH_READ_NCHARS is not set
+# BUSYBOX_ASH_READ_TIMEOUT is not set
+BUSYBOX_ASH_ALIAS=y
+BUSYBOX_ASH_MATH_SUPPORT=y
+# BUSYBOX_ASH_MATH_SUPPORT_64 is not set
+BUSYBOX_ASH_GETOPTS=y
+BUSYBOX_ASH_BUILTIN_ECHO=y
+BUSYBOX_ASH_BUILTIN_PRINTF=y
+BUSYBOX_ASH_BUILTIN_TEST=y
+# BUSYBOX_ASH_CMDCMD is not set
+# BUSYBOX_ASH_MAIL is not set
+BUSYBOX_ASH_OPTIMIZE_FOR_SIZE=y
+# BUSYBOX_ASH_RANDOM_SUPPORT is not set
+# BUSYBOX_ASH_EXPAND_PRMT is not set
+# BUSYBOX_HUSH is not set
+# BUSYBOX_LASH is not set
+# BUSYBOX_MSH is not set
+
+#
+# Bourne Shell Options
+#
+# BUSYBOX_FEATURE_SH_EXTRA_QUIET is not set
+# BUSYBOX_CTTYHACK is not set
+
+#
+# System Logging Utilities
+#
+BUSYBOX_SYSLOGD=y
+# BUSYBOX_FEATURE_ROTATE_LOGFILE is not set
+# BUSYBOX_FEATURE_REMOTE_LOG is not set
+# BUSYBOX_FEATURE_SYSLOGD_DUP is not set
+BUSYBOX_FEATURE_IPC_SYSLOG=y
+BUSYBOX_FEATURE_IPC_SYSLOG_BUFFER_SIZE=16
+BUSYBOX_LOGREAD=y
+BUSYBOX_FEATURE_LOGREAD_REDUCED_LOCKING=y
+BUSYBOX_KLOGD=y
+BUSYBOX_LOGGER=y
+ADK_PACKAGE_UCLIBC=y
+ADK_PACKAGE_CFGFS=y
+
+#
+# Bluetooth
+#
+# ADK_PACKAGE_BLUEZ_FIRMWARE is not set
+# ADK_PACKAGE_BLUEZ is not set
+# ADK_PACKAGE_MIAX is not set
+# ADK_PACKAGE_OBEXFTP is not set
+# ADK_PACKAGE_OPENOBEX is not set
+# ADK_PACKAGE_USSP_PUSH is not set
+
+#
+# Browser
+#
+# ADK_PACKAGE_LINKS is not set
+# ADK_PACKAGE_ELINKS is not set
+# ADK_PACKAGE_LYNX is not set
+
+#
+# Debugging / Analyzing
+#
+# ADK_COMPILE_EXMAP is not set
+# ADK_PACKAGE_EXMAP is not set
+# ADK_PACKAGE_EXMAPD is not set
+# ADK_PACKAGE_EXMAPSERVER is not set
+# ADK_PACKAGE_KMOD_EXMAP is not set
+# ADK_PACKAGE_GDB is not set
+# ADK_PACKAGE_GDBSERVER is not set
+# ADK_PACKAGE_STRACE is not set
+# ADK_PACKAGE_VALGRIND is not set
+
+#
+# Editors / Pager
+#
+# ADK_PACKAGE_LESS is not set
+# ADK_PACKAGE_NANO is not set
+# ADK_PACKAGE_VIM is not set
+
+#
+# Filesystem utilities
+#
+# ADK_PACKAGE_DEVICE_MAPPER is not set
+# ADK_PACKAGE_DOSFSTOOLS is not set
+# ADK_PACKAGE_E2FSPROGS is not set
+# ADK_COMPILE_FUSE is not set
+# ADK_PACKAGE_FUSE_UTILS is not set
+# ADK_PACKAGE_FDISK is not set
+# ADK_PACKAGE_LOSETUP is not set
+# ADK_PACKAGE_SWAP_UTILS is not set
+# ADK_PACKAGE_WDFS is not set
+# ADK_PACKAGE_XFSPROGS is not set
+
+#
+# Mail
+#
+# ADK_PACKAGE_DOVECOT is not set
+# ADK_PACKAGE_FETCHMAIL is not set
+# ADK_PACKAGE_MINI_SENDMAIL is not set
+# ADK_PACKAGE_MUTT is not set
+# ADK_PACKAGE_PROCMAIL is not set
+# ADK_PACKAGE_SSMTP is not set
+# ADK_PACKAGE_VILISTEXTUM is not set
+
+#
+# Misc
+#
+# ADK_PACKAGE_COLLECTD is not set
+# ADK_PACKAGE_DECO is not set
+# ADK_PACKAGE_DIGITEMP is not set
+# ADK_PACKAGE_GPM is not set
+# ADK_PACKAGE_LOGROTATE is not set
+# ADK_PACKAGE_MC is not set
+# ADK_PACKAGE_MGETTY is not set
+# ADK_PACKAGE_MONIT is not set
+# ADK_PACKAGE_MOTION is not set
+# ADK_PACKAGE_OSIRISD is not set
+# ADK_COMPILE_RRDTOOL is not set
+# ADK_PACKAGE_LIBRRD is not set
+# ADK_PACKAGE_RRDCGI is not set
+# ADK_PACKAGE_RRDTOOL is not set
+# ADK_PACKAGE_SANE_BACKENDS is not set
+# ADK_PACKAGE_SCREEN is not set
+# ADK_PACKAGE_SCSI_SPIN is not set
+# ADK_PACKAGE_SER2NET is not set
+# ADK_PACKAGE_SYSLOG_NG is not set
+# ADK_PACKAGE_TAR is not set
+
+#
+# Multimedia
+#
+# ADK_PACKAGE_ALSA_UTILS is not set
+# ADK_PACKAGE_ESOUND is not set
+# ADK_PACKAGE_ICECAST is not set
+# ADK_COMPILE_LAME is not set
+# ADK_PACKAGE_LAME is not set
+# ADK_PACKAGE_MADPLAY is not set
+# ADK_PACKAGE_MPD is not set
+# ADK_PACKAGE_MPLAYER is not set
+# ADK_PACKAGE_MT_DAAPD is not set
+# ADK_PACKAGE_PALANTIR is not set
+# ADK_PACKAGE_SETPWC is not set
+
+#
+# Shells
+#
+# ADK_PACKAGE_BASH is not set
+# ADK_PACKAGE_MKSH is not set
+# ADK_PACKAGE_ZSH is not set
+
+#
+# Security
+#
+# ADK_PACKAGE_CRYPTSETUP is not set
+# ADK_PACKAGE_GPG is not set
+# ADK_COMPILE_HEIMDAL is not set
+# ADK_COMPILE_KRB5 is not set
+# ADK_PACKAGE_OPENCT is not set
+# ADK_PACKAGE_OPENSC is not set
+ADK_COMPILE_OPENSSL=y
+ADK_PACKAGE_LIBOPENSSL=y
+# ADK_PACKAGE_OPENSSL_UTIL is not set
+# ADK_PACKAGE_CA_CERTS is not set
+# ADK_PACKAGE_OPENSSL_PKCS11 is not set
+
+#
+# Serial communications & terminal emulation
+#
+# ADK_PACKAGE_HEYU is not set
+# ADK_PACKAGE_LRZSZ is not set
+# ADK_PACKAGE_PICOCOM is not set
+# ADK_PACKAGE_SERDISPLIB is not set
+# ADK_PACKAGE_SETSERIAL is not set
+
+#
+# Telephony
+#
+# ADK_PACKAGE_ASTERISK is not set
+# ADK_PACKAGE_OPENSIPS is not set
+
+#
+# Utilities
+#
+# ADK_PACKAGE_BC is not set
+# ADK_PACKAGE_DC is not set
+# ADK_PACKAGE_COMGT is not set
+# ADK_PACKAGE_FBSET is not set
+# ADK_PACKAGE_FILE is not set
+# ADK_PACKAGE_HDPARM is not set
+# ADK_PACKAGE_LSUSB is not set
+# ADK_PACKAGE_PCIUTILS is not set
+# ADK_PACKAGE_PROCPS_META is not set
+# ADK_PACKAGE_PROCPS is not set
+# ADK_PACKAGE_SISPMCTL is not set
+# ADK_PACKAGE_STRESS is not set
+# ADK_PACKAGE_SYSSTAT is not set
+# ADK_PACKAGE_UDEV is not set
+# ADK_PACKAGE_WATCHDOG is not set
+
+#
+# Networking
+#
+
+#
+# Analyze / Debugging / Monitoring
+#
+# ADK_PACKAGE_BWM is not set
+# ADK_PACKAGE_DSNIFF is not set
+# ADK_PACKAGE_ETHTOOL is not set
+# ADK_PACKAGE_FPING is not set
+# ADK_PACKAGE_FPROBE is not set
+# ADK_PACKAGE_FPROBE_ULOG is not set
+# ADK_PACKAGE_HTTPING is not set
+# ADK_PACKAGE_IFTOP is not set
+# ADK_PACKAGE_IPCAD is not set
+# ADK_PACKAGE_IPTRAF is not set
+# ADK_PACKAGE_MTR is not set
+# ADK_PACKAGE_NETPERF is not set
+# ADK_PACKAGE_SIPSAK is not set
+# ADK_PACKAGE_SLURM is not set
+# ADK_PACKAGE_TCPDUMP is not set
+# ADK_PACKAGE_TTCP is not set
+
+#
+# DNS / DHCP
+#
+# ADK_PACKAGE_ATFTP is not set
+# ADK_PACKAGE_ATFTPD is not set
+# ADK_PACKAGE_AVAHI_DAEMON is not set
+# ADK_COMPILE_BIND is not set
+# ADK_DUMMY_BIND is not set
+# ADK_PACKAGE_DHCP_RELAY is not set
+# ADK_PACKAGE_DHCP_SERVER is not set
+# ADK_PACKAGE_DHCP_FORWARDER is not set
+# ADK_PACKAGE_DNSMASQ is not set
+# ADK_PACKAGE_EZIPUPDATE is not set
+# ADK_PACKAGE_MARADNS is not set
+# ADK_PACKAGE_UPDATEDD is not set
+
+#
+# HTTP / FTP
+#
+# ADK_PACKAGE_GATLING is not set
+# ADK_PACKAGE_LIGHTTPD is not set
+# ADK_PACKAGE_MINI_HTTPD is not set
+# ADK_PACKAGE_MINI_HTTPD_HTPASSWD is not set
+# ADK_PACKAGE_MINI_HTTPD_OPENSSL is not set
+# ADK_PACKAGE_VSFTPD is not set
+# ADK_PACKAGE_WPUT is not set
+
+#
+# IRC / ICQ / JABBER
+#
+# ADK_PACKAGE_BITLBEE is not set
+# ADK_PACKAGE_IRSSI is not set
+# ADK_PACKAGE_MIAU is not set
+# ADK_PACKAGE_REAIM is not set
+# ADK_PACKAGE_TMSNC is not set
+
+#
+# Firewall / Routing / Bridging
+#
+# ADK_PACKAGE_ARPD is not set
+# ADK_PACKAGE_BRIDGE_UTILS is not set
+# ADK_PACKAGE_CUTTER is not set
+# ADK_PACKAGE_ETHER_WAKE is not set
+# ADK_COMPILE_IPROUTE2 is not set
+# ADK_PACKAGE_IP is not set
+# ADK_PACKAGE_TC is not set
+# ADK_PACKAGE_IPSET is not set
+# ADK_PACKAGE_IPTABLES is not set
+# ADK_PACKAGE_IP6TABLES is not set
+# ADK_PACKAGE_IPTABLES_SNMP is not set
+# ADK_PACKAGE_KNOCK is not set
+# ADK_PACKAGE_KNOCKD is not set
+# ADK_PACKAGE_LINUX_ATM is not set
+# ADK_PACKAGE_MACCHANGER is not set
+# ADK_PACKAGE_NETSTAT_NAT is not set
+# ADK_PACKAGE_ULOGD is not set
+# ADK_PACKAGE_SHOREWALL is not set
+# ADK_PACKAGE_WOL is not set
+# ADK_PACKAGE_WONDERSHAPER is not set
+# ADK_PACKAGE_VRRPD is not set
+
+#
+# Misc
+#
+# ADK_PACKAGE_CUPS is not set
+# ADK_PACKAGE_FAKEIDENTD is not set
+# ADK_PACKAGE_GKRELLMD is not set
+# ADK_COMPILE_NET_SNMP is not set
+# ADK_PACKAGE_LIBNETSNMP is not set
+# ADK_PACKAGE_SNMP_UTILS is not set
+# ADK_PACKAGE_SNMPD is not set
+# ADK_PACKAGE_NUT is not set
+# ADK_COMPILE_OPENLDAP is not set
+# ADK_PACKAGE_P910ND is not set
+# ADK_PACKAGE_PIPACS is not set
+# ADK_PACKAGE_PORTMAP is not set
+# ADK_PACKAGE_RARPD is not set
+# ADK_PACKAGE_RSYNC is not set
+# ADK_PACKAGE_SCDP is not set
+# ADK_PACKAGE_SHAT is not set
+# ADK_PACKAGE_SOCAT is not set
+# ADK_PACKAGE_SUBVERSION is not set
+# ADK_PACKAGE_UDP_BROADCAST_RELAY is not set
+# ADK_PACKAGE_VGP is not set
+# ADK_PACKAGE_VNSTAT is not set
+# ADK_PACKAGE_VTUN is not set
+# ADK_PACKAGE_WCCPD is not set
+# ADK_PACKAGE_XINETD is not set
+
+#
+# Network Filesystems
+#
+# ADK_PACKAGE_DAVFS2 is not set
+# ADK_PACKAGE_NFS_UTILS is not set
+# ADK_PACKAGE_SAMBA is not set
+# ADK_PACKAGE_SAMBA_CLIENT is not set
+# ADK_PACKAGE_SAMBA_PASSWD is not set
+
+#
+# NTP
+#
+# ADK_PACKAGE_HTPDATE is not set
+# ADK_PACKAGE_NTPCLIENT is not set
+# ADK_PACKAGE_OPENNTPD is not set
+# ADK_PACKAGE_RDATE is not set
+
+#
+# P2P
+#
+
+#
+# PPP / PPTP / RADIUS
+#
+# ADK_PACKAGE_FREERADIUS is not set
+# ADK_PACKAGE_PPP is not set
+# ADK_PACKAGE_PPTP is not set
+# ADK_PACKAGE_PPTPD is not set
+# ADK_PACKAGE_PPPOE_CLIENT is not set
+# ADK_PACKAGE_PPPOE_RELAY is not set
+# ADK_PACKAGE_PPPOE_SERVER is not set
+# ADK_PACKAGE_PPPOE_SNIFF is not set
+# ADK_PACKAGE_RADDUMP is not set
+
+#
+# Proxy
+#
+# ADK_PACKAGE_IGMPPROXY is not set
+# ADK_PACKAGE_FRICKIN is not set
+# ADK_PACKAGE_PARPROUTED is not set
+# ADK_PACKAGE_PRIVOXY is not set
+# ADK_PACKAGE_SIPROXD is not set
+# ADK_PACKAGE_SQUID is not set
+# ADK_PACKAGE_SRELAY is not set
+# ADK_PACKAGE_TINYPROXY is not set
+# ADK_PACKAGE_TOR is not set
+# ADK_PACKAGE_VNC_REFLECTOR is not set
+
+#
+# Security
+#
+# ADK_PACKAGE_ARPWATCH is not set
+# ADK_PACKAGE_AUTOSSH is not set
+# ADK_PACKAGE_AXHTTPD is not set
+ADK_PACKAGE_DROPBEAR=y
+# ADK_PACKAGE_DBCONVERT is not set
+# ADK_PACKAGE_HTTPTUNNEL is not set
+# ADK_PACKAGE_L2TPNS is not set
+# ADK_COMPILE_OPENSSH is not set
+# ADK_PACKAGE_OPENSWAN is not set
+# ADK_PACKAGE_OPENVPN is not set
+# ADK_PACKAGE_PORTSENTRY is not set
+# ADK_PACKAGE_PTUNNEL is not set
+# ADK_PACKAGE_SCANLOGD is not set
+# ADK_PACKAGE_SNORT is not set
+# ADK_PACKAGE_SSLTUNNEL is not set
+# ADK_PACKAGE_TINC is not set
+# ADK_PACKAGE_VPNC is not set
+
+#
+# Wireless
+#
+# ADK_PACKAGE_AIRCRACK_NG is not set
+# ADK_PACKAGE_CHILLISPOT is not set
+# ADK_PACKAGE_HOSTAPD is not set
+# ADK_PACKAGE_IW is not set
+# ADK_PACKAGE_NOCATSPLASH is not set
+# ADK_PACKAGE_OLSRD is not set
+# ADK_PACKAGE_SNORT_WIRELESS is not set
+# ADK_PACKAGE_WIFIDOG is not set
+# ADK_DOWNLOAD_WIRELESS_FIRMWARE is not set
+# ADK_PACKAGE_WIRELESS_FIRMWARE_RT61 is not set
+# ADK_PACKAGE_WIRELESS_TOOLS is not set
+# ADK_PACKAGE_WPA_SUPPLICANT is not set
+
+#
+# Programming
+#
+# ADK_PACKAGE_BINUTILS is not set
+# ADK_PACKAGE_HASERL is not set
+# ADK_PACKAGE_JAMVM is not set
+# ADK_PACKAGE_LIBLUA is not set
+# ADK_PACKAGE_LUA is not set
+# ADK_PACKAGE_LUAC is not set
+# ADK_PACKAGE_LUA_EXAMPLES is not set
+# ADK_PACKAGE_MICROPERL is not set
+
+#
+# php.............................. PHP Hypertext preprocessor
+#
+# ADK_COMPILE_PHP is not set
+# ADK_PACKAGE_PHP_CLI is not set
+ADK_PACKAGE_PHP_FASTCGI=y
+# ADK_PACKAGE_RUBY is not set
+# ADK_PACKAGE_LIBFFI is not set
+# ADK_PACKAGE_TCL is not set
+
+#
+# Libraries
+#
+# ADK_PACKAGE_ALSA_LIB is not set
+# ADK_PACKAGE_APR is not set
+# ADK_PACKAGE_APR_UTIL is not set
+# ADK_PACKAGE_LIBAVAHI is not set
+# ADK_PACKAGE_LIBAXTLS is not set
+# ADK_PACKAGE_CGILIB is not set
+# ADK_PACKAGE_DBUS is not set
+# ADK_PACKAGE_GETTEXT is not set
+# ADK_PACKAGE_GLIB1 is not set
+# ADK_PACKAGE_GLIB2 is not set
+# ADK_PACKAGE_LIBAO is not set
+# ADK_PACKAGE_LIBAUDIOFILE is not set
+# ADK_PACKAGE_LIBART is not set
+# ADK_PACKAGE_LIBCLI is not set
+# ADK_PACKAGE_LIBCURL is not set
+# ADK_PACKAGE_LIBDAEMON is not set
+# ADK_PACKAGE_LIBDB is not set
+# ADK_PACKAGE_LIBDNET is not set
+# ADK_PACKAGE_LIBELF is not set
+# ADK_PACKAGE_LIBEVENT is not set
+# ADK_PACKAGE_LIBEXPAT is not set
+# ADK_PACKAGE_LIBFAAD2 is not set
+# ADK_PACKAGE_LIBFLAC is not set
+# ADK_PACKAGE_LIBFREETYPE is not set
+# ADK_PACKAGE_LIBGCRYPT is not set
+# ADK_PACKAGE_LIBGD is not set
+# ADK_PACKAGE_LIBGDBM is not set
+# ADK_PACKAGE_LIBGSSGLUE is not set
+# ADK_PACKAGE_LIBGMP is not set
+# ADK_PACKAGE_LIBGNUTLS is not set
+# ADK_PACKAGE_LIBGPG_ERROR is not set
+# ADK_PACKAGE_LIBGSM is not set
+# ADK_PACKAGE_LIBICONV is not set
+# ADK_PACKAGE_LIBID3TAG is not set
+# ADK_PACKAGE_LIBJPEG is not set
+# ADK_PACKAGE_LIBLAME is not set
+# ADK_PACKAGE_MPFR is not set
+# ADK_PACKAGE_LIBLTDL is not set
+# ADK_PACKAGE_LIBLZO is not set
+# ADK_PACKAGE_LIBMAD is not set
+# ADK_PACKAGE_LIBNCURSES is not set
+# ADK_PACKAGE_NEON is not set
+# ADK_PACKAGE_LIBNET is not set
+# ADK_PACKAGE_LIBNFSIDMAP is not set
+# ADK_PACKAGE_LIBNIDS is not set
+# ADK_PACKAGE_LIBNL is not set
+# ADK_PACKAGE_LIBOGG is not set
+# ADK_PACKAGE_LIBOL is not set
+# ADK_PACKAGE_LIBOPENCDK is not set
+# ADK_PACKAGE_LIBOSIP2 is not set
+# ADK_COMPILE_LIBOWFAT is not set
+# ADK_PACKAGE_LIBP11 is not set
+# ADK_PACKAGE_LIBPCAP is not set
+# ADK_PACKAGE_LIBPRI is not set
+# ADK_PACKAGE_LIBPCRE is not set
+# ADK_PACKAGE_LIBPNG is not set
+# ADK_PACKAGE_LIBPOPT is not set
+# ADK_PACKAGE_LIBPQ is not set
+# ADK_PACKAGE_LIBPTHREAD is not set
+# ADK_PACKAGE_LIBTHREAD_DB is not set
+# ADK_PACKAGE_RADIUSCLIENT_NG is not set
+# ADK_PACKAGE_LIBRADIUSCLIENT_NG is not set
+# ADK_PACKAGE_LIBREADLINE is not set
+# ADK_PACKAGE_LIBSASL2 is not set
+# ADK_PACKAGE_LIBSPEEX is not set
+# ADK_PACKAGE_LIBSQLITE is not set
+# ADK_PACKAGE_LIBRPCSECGSS is not set
+# ADK_PACKAGE_LIBSHOUT is not set
+# ADK_PACKAGE_LIBTASN1 is not set
+# ADK_PACKAGE_LIBTIFF is not set
+# ADK_PACKAGE_LIBTIRPC is not set
+# ADK_PACKAGE_LIBUPNP is not set
+# ADK_PACKAGE_LIBUSB is not set
+# ADK_PACKAGE_LIBVORBIS is not set
+# ADK_PACKAGE_LIBVORBISENC is not set
+# ADK_PACKAGE_LIBVORBISIDEC is not set
+# ADK_PACKAGE_LIBWRAP is not set
+# ADK_PACKAGE_LIBXML2 is not set
+# ADK_PACKAGE_LIBXSLT is not set
+ADK_PACKAGE_ZLIB=y
+
+#
+# Kernel configuration
+#
+
+#
+# Block devices support
+#
+# ADK_KERNEL_MD is not set
+# ADK_KERNEL_SWAP is not set
+# ADK_KERNEL_LBD is not set
+# ADK_KERNEL_BLK_DEV_IO_TRACE is not set
+# ADK_KERNEL_LSF is not set
+# ADK_KERNEL_IOSCHED_AS is not set
+# ADK_KERNEL_IOSCHED_DEADLINE is not set
+# ADK_KERNEL_IOSCHED_CFQ is not set
+ADK_KERNEL_SCSI=y
+# ADK_KPACKAGE_KMOD_BLK_DEV_LOOP is not set
+# ADK_KPACKAGE_KMOD_BLK_DEV_NBD is not set
+# ADK_KPACKAGE_KMOD_BLK_DEV_MD is not set
+# ADK_KPACKAGE_KMOD_BLK_DEV_DM is not set
+
+#
+# Filesystems support
+#
+# ADK_KERNEL_EXT3_FS_XATTR is not set
+ADK_KERNEL_FAT_DEFAULT_CODEPAGE=850
+ADK_KERNEL_FAT_DEFAULT_IOCHARSET="iso8859-1"
+# ADK_KPACKAGE_KMOD_EXT3_FS is not set
+# ADK_KPACKAGE_KMOD_HFSPLUS_FS is not set
+# ADK_PACKAGE_KMOD_FS_NTFS_3G is not set
+# ADK_KPACKAGE_KMOD_NTFS_FS is not set
+# ADK_KERNEL_FAT_FS is not set
+# ADK_KPACKAGE_KMOD_VFAT_FS is not set
+# ADK_KPACKAGE_KMOD_XFS_FS is not set
+# ADK_KPACKAGE_KMOD_FUSE_FS is not set
+# ADK_KERNEL_JOLIET is not set
+# ADK_KPACKAGE_KMOD_ISO9660_FS is not set
+# ADK_KPACKAGE_KMOD_UDF_FS is not set
+# ADK_KPACKAGE_KMOD_CIFS is not set
+# ADK_KPACKAGE_KMOD_CODA_FS is not set
+# ADK_KERNEL_NFS_V4 is not set
+# ADK_KERNEL_RPCSEC_GSS_KRB5 is not set
+# ADK_KPACKAGE_KMOD_NFS_FS is not set
+# ADK_KERNEL_NFSD_V3 is not set
+# ADK_KPACKAGE_KMOD_SUNRPC is not set
+# ADK_KPACKAGE_KMOD_SUNRPC_GSS is not set
+# ADK_KPACKAGE_KMOD_RPCSEC_GSS_KRB5 is not set
+
+#
+# Native Language support
+#
+ADK_KERNEL_NLS_DEFAULT="iso8859-1"
+# ADK_KPACKAGE_KMOD_NLS is not set
+
+#
+# Network devices support
+#
+ADK_KERNEL_NET_ETHERNET=y
+ADK_KERNEL_MII=y
+ADK_KERNEL_NET_PCI=y
+# ADK_KERNEL_NETDEV_1000 is not set
+
+#
+# Ethernet card support
+#
+# ADK_KPACKAGE_KMOD_NE2K_PCI is not set
+# ADK_KPACKAGE_KMOD_E100 is not set
+# ADK_KPACKAGE_KMOD_E1000 is not set
+# ADK_KERNEL_WIRELESS is not set
+# ADK_KERNEL_WIRELESS_EXT is not set
+# ADK_KERNEL_MAC80211_LEDS is not set
+# ADK_KERNEL_WLAN_80211 is not set
+# ADK_KERNEL_RT2X00 is not set
+# ADK_MOD_KERNEL_CFG80211 is not set
+# ADK_MOD_KERNEL_MAC80211 is not set
+
+#
+# Wireless card support
+#
+# ADK_KPACKAGE_KMOD_MAC80211 is not set
+# ADK_KPACKAGE_KMOD_RT2X00 is not set
+# ADK_PACKAGE_KMOD_MAC80211 is not set
+
+#
+# USB support
+#
+ADK_KERNEL_USB_DEVICEFS=y
+# ADK_KERNEL_USB_LIBUSUAL is not set
+# ADK_KERNEL_USB_SERIAL is not set
+ADK_KPACKAGE_KMOD_USB=y
+# ADK_KPACKAGE_KMOD_USB_UHCI_HCD is not set
+ADK_KPACKAGE_KMOD_USB_OHCI_HCD=y
+# ADK_KPACKAGE_KMOD_USB_ISP116X_HCD is not set
+# ADK_KPACKAGE_KMOD_USB_SL811_HCD is not set
+ADK_KPACKAGE_KMOD_USB_EHCI_HCD=y
+ADK_PACKAGE_KMOD_USB_CONTROLLER=y
+# ADK_KPACKAGE_KMOD_USB_ACM is not set
+# ADK_KPACKAGE_KMOD_USB_PEGASUS is not set
+# ADK_KPACKAGE_KMOD_USB_PRINTER is not set
+# ADK_KPACKAGE_KMOD_USB_SERIAL is not set
+# ADK_KPACKAGE_KMOD_USB_STORAGE is not set
+# ADK_KPACKAGE_KMOD_USB_ATM is not set
+# ADK_KPACKAGE_KMOD_USB_USBNET is not set
+# ADK_KPACKAGE_KMOD_USB_SISUSBVGA is not set
+
+#
+# Input devices
+#
+# ADK_KERNEL_INPUT is not set
+# ADK_KERNEL_INPUT_KEYBOARD is not set
+# ADK_KERNEL_HID_SUPPORT is not set
+# ADK_KERNEL_HID is not set
+# ADK_KPACKAGE_KMOD_USB_HID is not set
+# ADK_KPACKAGE_KMOD_KEYBOARD_ATKBD is not set
+# ADK_KPACKAGE_KMOD_INPUT_MOUSEDEV is not set
+
+#
+# PCMCIA/CardBus support
+#
+# ADK_KERNEL_CARDBUS is not set
+# ADK_KPACKAGE_KMOD_PCCARD is not set
+
+#
+# Network support
+#
+ADK_KERNEL_INET=y
+ADK_KERNEL_IP_FIB_HASH=y
+ADK_KERNEL_SYN_COOKIES=y
+# ADK_KERNEL_IP_PNP_BOOTP is not set
+# ADK_KERNEL_IP_PNP_RARP is not set
+# ADK_KERNEL_NET_IPGRE_BROADCAST is not set
+# ADK_KERNEL_PPP_ASYNC is not set
+# ADK_KERNEL_SLHC is not set
+# ADK_KERNEL_IMQ is not set
+# ADK_KERNEL_LLC is not set
+# ADK_KPACKAGE_KMOD_BRIDGE is not set
+# ADK_KPACKAGE_KMOD_NET_IPIP is not set
+# ADK_KPACKAGE_KMOD_NET_IPGRE is not set
+# ADK_KPACKAGE_KMOD_PPP is not set
+# ADK_KPACKAGE_KMOD_TUN is not set
+# ADK_KPACKAGE_KMOD_BONDING is not set
+
+#
+# QoS and/or fair queueing
+#
+# ADK_KERNEL_NET_SCH_CSZ is not set
+# ADK_KERNEL_NET_SCH_NETEM is not set
+# ADK_KERNEL_NET_QOS is not set
+# ADK_KERNEL_NET_ESTIMATOR is not set
+# ADK_KERNEL_NET_SCHED is not set
+
+#
+# Queueing/Scheduling
+#
+# ADK_KPACKAGE_KMOD_NET_SCH_CBQ is not set
+# ADK_KPACKAGE_KMOD_NET_SCH_HTB is not set
+# ADK_KPACKAGE_KMOD_NET_SCH_HFSC is not set
+# ADK_KPACKAGE_KMOD_NET_SCH_PRIO is not set
+# ADK_KPACKAGE_KMOD_NET_SCH_RED is not set
+# ADK_KPACKAGE_KMOD_NET_SCH_SFQ is not set
+# ADK_KPACKAGE_KMOD_NET_SCH_TBF is not set
+# ADK_KPACKAGE_KMOD_NET_SCH_GRED is not set
+# ADK_KPACKAGE_KMOD_NET_SCH_DSMARK is not set
+# ADK_KPACKAGE_KMOD_NET_SCH_INGRESS is not set
+
+#
+# Classification
+#
+# ADK_KERNEL_NET_CLS is not set
+# ADK_KPACKAGE_KMOD_NET_CLS_TCINDEX is not set
+# ADK_KPACKAGE_KMOD_NET_CLS_ROUTE4 is not set
+# ADK_KPACKAGE_KMOD_NET_CLS_FW is not set
+# ADK_KPACKAGE_KMOD_NET_CLS_U32 is not set
+
+#
+# Actions
+#
+# ADK_KERNEL_NET_CLS_ACT is not set
+
+#
+# Netfilter (Firewall/Filtering)
+#
+# ADK_KERNEL_NETFILTER is not set
+# ADK_KERNEL_NETFILTER_ADVANCED is not set
+# ADK_KERNEL_NETFILTER_XTABLES is not set
+# ADK_KERNEL_NETFILTER_DEBUG is not set
+# ADK_KERNEL_IP_NF_MATCH_LAYER7_DEBUG is not set
+# ADK_KERNEL_IP_NF_TARGET_MIRROR is not set
+# ADK_KERNEL_IP_NF_NAT_SNMP_BASIC is not set
+# ADK_KERNEL_IP_NF_TARGET_DSCP is not set
+# ADK_KERNEL_IP_NF_TARGET_MARK is not set
+# ADK_KERNEL_IP_NF_TARGET_CLASSIFY is not set
+# ADK_KERNEL_IP_NF_TARGET_IMQ is not set
+# ADK_KERNEL_IP_NF_TARGET_CONNMARK is not set
+# ADK_KERNEL_IP_NF_ARPTABLES is not set
+# ADK_KERNEL_IP_NF_COMPAT_IPCHAINS is not set
+# ADK_KERNEL_IP_NF_COMPAT_IPFWADM is not set
+# ADK_KERNEL_IP6_NF_QUEUE is not set
+# ADK_KERNEL_IP6_NF_IPTABLES is not set
+# ADK_KERNEL_IP_ROUTE_FWMARK is not set
+# ADK_KERNEL_IP_NF_QUEUE is not set
+# ADK_KERNEL_IP_NF_MATCH_TIME is not set
+# ADK_KERNEL_IP_NF_MATCH_CONDITION is not set
+# ADK_KERNEL_IP_NF_MATCH_DSCP is not set
+# ADK_KERNEL_IP_NF_MATCH_AH_ESP is not set
+# ADK_KERNEL_IP_NF_MATCH_LENGTH is not set
+# ADK_KERNEL_IP_NF_MATCH_HELPER is not set
+# ADK_KPACKAGE_KMOD_IP_NF_MATCH_STATE is not set
+# ADK_KPACKAGE_KMOD_NETFILTER_XT_MATCH_STATE is not set
+# ADK_KPACKAGE_KMOD_IP_NF_MATCH_CONNTRACK is not set
+# ADK_KERNEL_IP_NF_MATCH_CONNMARK is not set
+# ADK_KERNEL_IP_NF_MATCH_UNCLEAN is not set
+# ADK_KERNEL_IP_NF_MATCH_STRING is not set
+
+#
+# Core Netfilter Configuration
+#
+# ADK_KPACKAGE_KMOD_NF_CONNTRACK is not set
+# ADK_KPACKAGE_KMOD_NETFILTER_XT_TARGET_CLASSIFY is not set
+# ADK_KPACKAGE_KMOD_NETFILTER_XT_TARGET_CONNMARK is not set
+# ADK_KPACKAGE_KMOD_NETFILTER_XT_TARGET_MARK is not set
+# ADK_KPACKAGE_KMOD_NETFILTER_XT_TARGET_NFQUEUE is not set
+
+#
+# IP: Netfilter Configuration
+#
+# ADK_KPACKAGE_KMOD_NF_CONNTRACK_IPV4 is not set
+# ADK_KPACKAGE_KMOD_IP_NF_IPTABLES is not set
+
+#
+# IPVS support
+#
+# ADK_KPACKAGE_KMOD_IP_VS is not set
+
+#
+# Multimedia devices support
+#
+# ADK_KERNEL_SND_TIMER is not set
+# ADK_KERNEL_SND_PCM is not set
+# ADK_KERNEL_SND_HWDEP is not set
+# ADK_KERNEL_SND_MIXER_OSS is not set
+# ADK_KERNEL_SND_PCM_OSS is not set
+# ADK_KPACKAGE_KMOD_SOUND is not set
+# ADK_KPACKAGE_KMOD_SND is not set
+# ADK_KPACKAGE_KMOD_VIDEO_DEV is not set
+# ADK_KPACKAGE_KMOD_USB_PWC is not set
+
+#
+# Crypto kernel modules
+#
+# ADK_KERNEL_CRYPTO is not set
+# ADK_KERNEL_CRYPTO_HW is not set
+# ADK_KERNEL_OCF_FIPS is not set
+# ADK_KERNEL_OCF_CRYPTODEV is not set
+# ADK_KERNEL_OCF_OCF is not set
+
+#
+# Hardware cryptography
+#
+
+#
+# Hardware crypto devices
+#
+# ADK_KPACKAGE_KMOD_CRYPTO_DEV_GEODE is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_DEV_HIFN_795X is not set
+
+#
+# OpenBSD Cryptographic framework
+#
+# ADK_KPACKAGE_KMOD_OCF_HIFN is not set
+# ADK_KPACKAGE_KMOD_OCF_SAFE is not set
+
+#
+# Software cryptography
+#
+
+#
+# Crypto core / Block and Hash modes
+#
+# ADK_KPACKAGE_KMOD_CRYPTO_ALGAPI is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_AEAD is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_MANAGER is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_HASH is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_BLKCIPHER is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_CBC is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_ECB is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_HMAC is not set
+
+#
+# Digest algorithms
+#
+# ADK_KPACKAGE_KMOD_CRYPTO_MD4 is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_MD5 is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_SHA1 is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_SHA256 is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_SHA512 is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_WP512 is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_TGR192 is not set
+
+#
+# Cipher algoritms
+#
+# ADK_KPACKAGE_KMOD_CRYPTO_AES is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_ANUBIS is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_ARC4 is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_BLOWFISH is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_CAMELLIA is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_CAST5 is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_CAST6 is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_DES is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_FCRYPT is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_KHAZAD is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_SERPENT is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_TEA is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_TWOFISH is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_NULL is not set
+
+#
+# Compression
+#
+# ADK_KPACKAGE_KMOD_CRYPTO_DEFLATE is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_LZO is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_MICHAEL_MIC is not set
+# ADK_KPACKAGE_KMOD_CRYPTO_CRC32C is not set
+
+#
+# Bluetooth
+#
+# ADK_KPACKAGE_KMOD_BT is not set
+
+#
+# ISDN
+#
+# ADK_KERNEL_ISDN is not set
+# ADK_KERNEL_ISDN_I4L is not set
+# ADK_KERNEL_ISDN_DRV_AVMB1_VERBOSE_REASON is not set
+# ADK_KERNEL_CAPI_AVM is not set
+# ADK_KERNEL_CAPI_EICON is not set
+# ADK_KERNEL_HFCMULTI_PCIMEM is not set
+# ADK_KERNEL_ISDN_CAPI_MIDDLEWARE is not set
+# ADK_KERNEL_ISDN_CAPI_CAPI20 is not set
+# ADK_KPACKAGE_KMOD_ISDN_CAPI is not set
+
+#
+# Miscellaneous devices support
+#
+
+#
+# LEDS driver support
+#
+# ADK_KERNEL_NEW_LEDS is not set
+# ADK_KPACKAGE_KMOD_LEDS_CLASS is not set
+# ADK_KERNEL_WATCHDOG is not set
+# ADK_KPACKAGE_KMOD_SOFT_WATCHDOG is not set
+# ADK_KPACKAGE_KMOD_WD1100 is not set
+# ADK_KPACKAGE_KMOD_PARPORT is not set
+# ADK_KPACKAGE_KMOD_FW_LOADER is not set
+# ADK_KPACKAGE_KMOD_EEPROM_93CX6 is not set
+
+#
+# Library Routines
+#
+# ADK_KERNEL_CRC32 is not set
+# ADK_KPACKAGE_KMOD_CRC_ITU_T is not set
+# ADK_KPACKAGE_KMOD_CRC32 is not set
+# ADK_KPACKAGE_KMOD_LIBCRC32C is not set
+# ADK_KPACKAGE_KMOD_CRC_CCITT is not set
+
+#
+# Kernel debugging
+#
+# ADK_KERNEL_DEBUG_KERNEL is not set
+# ADK_KERNEL_DEBUG_INFO is not set
+# ADK_KERNEL_KGDB is not set
+# ADK_KERNEL_KGDB_SERIAL_CONSOLE is not set
+# ADK_KERNEL_FRAME_POINTER is not set
+ADK_KERNEL_MAGIC_SYSRQ=y
+# ADK_KERNEL_DEBUG_FS is not set
+# ADK_KERNEL_DEBUG_WITH_KGDB is not set

+ 17 - 0
Config.in

@@ -0,0 +1,17 @@
+# $Id$
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+mainmenu "OpenADK Configuration"
+
+config MODULES
+	bool
+	default y
+
+config ADK_HAVE_DOT_CONFIG
+	bool
+	default y
+
+source "target/Config.in"
+source "package/Config.in"

+ 29 - 0
GNUmakefile

@@ -0,0 +1,29 @@
+# $Id: GNUmakefile 255 2008-12-11 16:20:28Z wbx $
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+TOPDIR:=	$(shell pwd)
+PWD:=		${TOPDIR}
+
+ifneq (${package},)
+subdir:=	package/${package}
+_subdir_dep:=	${TOPDIR}/.cfg/ADK_HAVE_DOT_CONFIG
+endif
+
+ifneq (${subdir},)
+${MAKECMDGOALS}: _subdir
+
+_subdir: ${_subdir_dep}
+	@if test x"$$(umask 2>/dev/null | sed 's/00*22/OK/')" != x"OK"; then \
+		echo >&2 Error: you must build with “umask 022”, sorry.; \
+		exit 1; \
+	fi
+	cd ${subdir} && TOPDIR=${TOPDIR} DEVELOPER=1 \
+	    make VERBOSE=1 ${MAKEFLAGS} ${MAKECMDGOALS}
+
+include prereq.mk
+include mk/split-cfg.mk
+else
+include Makefile
+endif

+ 38 - 0
LICENCE

@@ -0,0 +1,38 @@
+$Id$
+
+OpenADK is Copyright © 2008 Waldemar Brodkorb
+All rights reserved.
+
+This licence file covers all of the OpenADK meta distribution
+source code (including Makefiles and documentation).
+
+Binary firmware images are composed of the meta distribution
+OpenADK and downloaded distfiles from third party sources,
+which may be covered by various differing licence terms, but
+since the firmware image only aggregates differently licenced
+packages on the same medium we believe it is redistributable
+as long as the licences of the different packages are honoured.
+
+
+OpenADK itself is developed by Waldemar Brodkorb and covered
+by the GNU General Public License, Version 2 or later, as shown
+in the file COPYING in this directory. Individual files may be
+covered by the LGPL or BSD-style licences instead. OpenADK also
+contains tools that are possibly covered by non-GPL-compatible,
+but OSD/DFSG-compliant, licences. Specifically, some of these
+components may require acknowledgements to be displayed in the
+advertising materials; these are listed here:
+‣ This product includes material provided by Thorsten Glaser.
+
+OpenADK is based upon several other projects which are listed
+below, in no particular order. If you think you should be li-
+sted here but we have forgotten you, please forgive and drop
+us an email.
+
+
+• The FreeWRT Project
+• The OpenWrt Project
+• uClibc Buildroot
+• The MirOS Project and contributors
+
+────────────────────────────────────────────────────────────────────────

+ 187 - 0
Makefile

@@ -0,0 +1,187 @@
+# $Id: Makefile 420 2009-05-08 19:31:15Z wbx $
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+GMAKE?=		$(PWD)/scripts/make
+GMAKE_FMK=	${GMAKE} -f $(PWD)/mk/build.mk
+GMAKE_INV=	${GMAKE_FMK} --no-print-directory
+
+all: .prereq_done
+	@${GMAKE_INV} all
+
+v: .prereq_done
+	@(echo; echo "Build started on $$(LC_ALL=C LANGUAGE=C date)"; \
+	    set -x; ${GMAKE_FMK} VERBOSE=1 all) 2>&1 | tee -a make.log
+
+help:
+	@echo '  switch DEV=device  - Backup current config and copy old saved device config'
+	@echo 'Cleaning targets:'
+	@echo '  clean        - Remove bin and build_dir directories'
+	@echo '  cleandevice  - Same as "clean", but also remove toolchain for device'
+	@echo '  cleandir     - Same as "clean", but also remove all built toolchains'
+	@echo '  cleankernel  - Remove kernel dir'
+	@echo '  distclean    - Same as "cleandir", but also remove downloaded'
+	@echo '                 distfiles and .config'
+	@echo ''
+	@echo 'Configuration targets:'
+	@echo '  config       - Update current config utilising a line-oriented program'
+	@echo '  menuconfig   - Update current config utilising a menu based program'
+	@echo '                 (default when .config does not exist)'
+	@echo '  oldconfig    - Update current config utilising a provided .configs base'
+	@echo '  wconfig      - Same as "oldconfig", but also writes out hidden symbols'
+	@echo '  allmodconfig - New config selecting all packages as modules when possible'
+	@echo '  allconfig    - New config selecting all packages when possible'
+	@echo '  allnoconfig  - New config where all options are answered with no'
+	@echo ''
+	@echo 'Help targets:'
+	@echo '  help         - Print this help text'
+	@echo '  pkg-help     - Print help about selectively compiling single packages'
+	@echo '  dev-help     - Print help for developers / package maintainers'
+	@echo ''
+	@echo 'Other generic targets:'
+	@echo '  all          - Build everything as specified in .config'
+	@echo '                 (default if .config exists)'
+	@echo '  v            - Same as "all" but with logging to make.log enabled'
+
+pkg-help:
+	@echo 'Package specific targets (use with "package=<pkg-name>" parameter):'
+	@echo '  fetch        - Download the necessary distfile'
+	@echo '  extract      - Same as "fetch", but also extract the distfile'
+	@echo '  patch        - Same as "extract", but also patch the source'
+	@echo '  build        - Same as "patch", but also build the binaries'
+	@echo '  fake         - Same as "build", but also install the binaries'
+	@echo '  package      - Same as "fake", but also create the ipkg package'
+	@echo '  clean        - Deinstall and remove the build area'
+	@echo '  distclean    - Same as "clean", but also remove the distfiles'
+	@echo ''
+	@echo 'Short package rebuilding guide:'
+	@echo '  run "make package=<pkgname> clean" to remove all generated binaries'
+	@echo '  run "make package=<pkgname> package" to build everything and create the ipkg'
+	@echo ''
+	@echo 'This does not automatically resolve package dependencies!'
+
+dev-help:
+	@echo 'Fast way of updating package patches:'
+	@echo '  run "make package=<pkgname> clean" to start with a good base'
+	@echo '  run "make package=<pkgname> patch" to fetch, unpack and patch the source'
+	@echo '  edit the package sources at build_dir/w-<pkgname>-*/<pkgname>-<version>'
+	@echo '  run "make package=<pkgname> update-patches to regenerate patch files'
+	@echo ''
+	@echo 'All changed patches will be opened with your $$EDITOR,'
+	@echo 'so you can add a description and verify the modifications.'
+
+clean: .prereq_done
+	-@rm -f nohup.out
+	@${GMAKE_INV} clean
+
+config: .prereq_done
+	@${GMAKE_INV} _config W=
+
+oldconfig: .prereq_done
+	@${GMAKE_INV} _config W=-o
+
+wconfig: .prereq_done
+	@${GMAKE_INV} _config W=-A
+
+download: .prereq_done
+	@${GMAKE_INV} toolchain/download
+	@${GMAKE_INV} package/download
+
+cleankernel: .prereq_done
+	-@${GMAKE_INV} cleankernel
+
+cleandir: .prereq_done
+	-@${GMAKE_INV} clean cleandir
+	@-rm -f make.log .prereq_done
+
+cleandevice: .prereq_done
+	-@${GMAKE_INV} clean cleandevice
+	@-rm -f make.log
+
+distclean: .prereq_done
+	-@${GMAKE_INV} clean cleandir distclean
+	@-rm -f make.log .prereq_done
+
+image: .prereq_done
+	@${GMAKE_INV} image
+
+switch: .prereq_done
+	@${GMAKE_INV} switch
+
+image_clean: .prereq_done
+	@${GMAKE_INV} image_clean
+
+menuconfig: .prereq_done
+	@${GMAKE_INV} menuconfig
+
+allnoconfig: .prereq_done
+	@${GMAKE_INV} _config W=-n
+
+allconfig: .prereq_done
+	@${GMAKE_INV} _mconfig W=-y RCONFIG=Config.in
+
+allmodconfig: .prereq_done
+	@${GMAKE_INV} _mconfig W=-o RCONFIG=Config.in
+
+package_index: .prereq_done
+	@${GMAKE_INV} package_index
+
+world: .prereq_done
+	@${GMAKE_INV} world
+
+prereq:
+	@rm -f .prereq_done
+	@${MAKE} .prereq_done --no-print-directory
+
+prereq-noerror:
+	@rm -f .prereq_done
+	@${MAKE} .prereq_done NO_ERROR=1
+
+NO_ERROR=0
+.prereq_done:
+	@-rm -rf .prereq_done
+	@if ! bash --version 2>&1 | fgrep 'GNU bash' >/dev/null 2>&1; then \
+		echo "GNU bash needs to be installed."; \
+		exit 1; \
+	fi
+	@if test x"$$(umask 2>/dev/null | sed 's/00*22/OK/')" != x"OK"; then \
+		echo >&2 Error: you must build with umask 022, sorry.; \
+		exit 1; \
+	fi
+	@echo "TOPDIR:=$$(readlink -nf . 2>/dev/null || pwd -P)" >prereq.mk
+	@echo "BASH:=$$(which bash)" >>prereq.mk
+	@if [ -z "$$(which gmake)" ]; then \
+		echo "GMAKE:=$$(which make)" >>prereq.mk ;\
+	else \
+		echo "GMAKE:=$$(which gmake)" >>prereq.mk ;\
+	fi
+	@echo "GNU_HOST_NAME:=$$(${CC} -dumpmachine)" >>prereq.mk
+	@echo "HOST_ARCH:=$$(${CC} -dumpmachine | sed -e s'/-.*//' \
+	    -e 's/sparc.*/sparc/' \
+	    -e 's/arm.*/arm/g' \
+	    -e 's/m68k.*/m68k/' \
+	    -e 's/ppc/powerpc/g' \
+	    -e 's/v850.*/v850/g' \
+	    -e 's/sh[234]/sh/' \
+	    -e 's/mips-.*/mips/' \
+	    -e 's/mipsel-.*/mipsel/' \
+	    -e 's/cris.*/cris/' \
+	    -e 's/i[3-9]86/i386/' \
+	    )" >>prereq.mk
+	@echo 'HOSTCC:=${CC}' >>prereq.mk
+	@echo 'HOSTCFLAGS:=-O2 -fwrapv' >>prereq.mk
+	@echo 'LANGUAGE:=C' >>prereq.mk
+	@echo 'LC_ALL:=C' >>prereq.mk
+	@echo 'MAKE:=$${GMAKE}' >>prereq.mk
+	@echo "OStype:=$$(env uname)" >>prereq.mk
+	@echo "_PATH:=$$PATH" >>prereq.mk
+	@echo "PATH:=\$${TOPDIR}/scripts:$$PATH" >>prereq.mk
+	@echo "SHELL:=$$(which bash)" >>prereq.mk
+	@env NO_ERROR=${NO_ERROR} BASH="$$(which bash)" \
+		CC='${CC}' CPPFLAGS='${CPPFLAGS}' \
+	    	bash scripts/scan-tools.sh
+	@echo '===> Prerequisites checked successfully.'
+	@touch $@
+
+.PHONY: prereq prereq-noerror

+ 39 - 0
README

@@ -0,0 +1,39 @@
+OpenADK - A GNU/Linux construction kit 
+======================================
+
+This is a menu based buildsystem for your home made embedded Linux system.
+
+Before you can start you need to install some tools: 
+- bash
+- gcc 
+- binutils 
+- GNU make
+- GNU tar
+- GNU awk
+- GNU sed
+- patch
+- gzip
+- bzip2
+- cpio 
+- wget
+- flex
+- bison
+- file
+- unzip
+- autoconf
+- automake
+- zlib-dev / libz-dev
+- libncurses5-dev
+- libc-dev
+
+There is a check for the required versions of these tools in advance, though
+(to re-issue the checks, use "make prereq").
+
+Please use "make menuconfig" to choose your embedded system and configure like you
+want to.
+
+Simply running 'make' will build the firmware for your embedded system.  The
+buildsystem will download all sources, build the toolchain, the kernel and all
+applications.
+
+Sunshine!

+ 9 - 0
TODO

@@ -0,0 +1,9 @@
+- eglibc support
+- glibc 2.10 support
+- rescue initramfs image (more archs, generic kernel config )
+  - replace ibm x40
+  - usb boot via stick
+- kernel 2.6.29.3
+- bind isc 9.6.1
+- asterisk 1.6
+- gcc 4.4.0

+ 8 - 0
config/Config.in

@@ -0,0 +1,8 @@
+#
+
+config ADK_PACKAGE_CONFIG
+	bool"config"
+	default n
+	help
+	  Add help text here.
+

+ 255 - 0
config/Kconfig-language.txt

@@ -0,0 +1,255 @@
+Introduction
+------------
+
+The configuration database is collection of configuration options
+organized in a tree structure:
+
+	+- Code maturity level options
+	|  +- Prompt for development and/or incomplete code/drivers
+	+- General setup
+	|  +- Networking support
+	|  +- System V IPC
+	|  +- BSD Process Accounting
+	|  +- Sysctl support
+	+- Loadable module support
+	|  +- Enable loadable module support
+	|     +- Set version information on all module symbols
+	|     +- Kernel module loader
+	+- ...
+
+Every entry has its own dependencies. These dependencies are used
+to determine the visible of an entry. Any child entry is only
+visible if its parent entry is also visible.
+
+Menu entries
+------------
+
+Most entries define a config option, all other entries help to organize
+them. A single configuration option is defined like this:
+
+config MODVERSIONS
+	bool "Set version information on all module symbols"
+	depends MODULES
+	help
+	  Usually, modules have to be recompiled whenever you switch to a new
+	  kernel.  ...
+
+Every line starts with a key word and can be followed by multiple
+arguments.  "config" starts a new config entry. The following lines
+define attributes for this config option. Attributes can be the type of
+the config option, input prompt, dependencies, help text and default
+values. A config option can be defined multiple times with the same
+name, but every definition can have only a single input prompt and the
+type must not conflict.
+
+Menu attributes
+---------------
+
+A menu entry can have a number of attributes. Not all of them are
+applicable everywhere (see syntax).
+
+- type definition: "bool"/"tristate"/"string"/"hex"/"integer"
+  Every config option must have a type. There are only two basic types:
+  tristate and string, the other types base on these two. The type
+  definition optionally accepts an input prompt, so these two examples
+  are equivalent:
+
+	bool "Networking support"
+  and
+	bool
+	prompt "Networking support"
+
+- input prompt: "prompt" <prompt> ["if" <expr>]
+  Every menu entry can have at most one prompt, which is used to display
+  to the user. Optionally dependencies only for this prompt can be added
+  with "if".
+
+- default value: "default" <symbol> ["if" <expr>]
+  A config option can have any number of default values. If multiple
+  default values are visible, only the first defined one is active.
+  Default values are not limited to the menu entry, where they are
+  defined, this means the default can be defined somewhere else or be
+  overriden by an earlier definition.
+  The default value is only assigned to the config symbol if no other
+  value was set by the user (via the input prompt above). If an input
+  prompt is visible the default value is presented to the user and can
+  be overridden by him.
+  Optionally dependencies only for this default value can be added with
+  "if".
+
+- dependencies: "depends on"/"requires" <expr>
+  This defines a dependency for this menu entry. If multiple
+  dependencies are defined they are connected with '&&'. Dependencies
+  are applied to all other options within this menu entry (which also
+  accept "if" expression), so these two examples are equivalent:
+
+	bool "foo" if BAR
+	default y if BAR
+  and
+	depends on BAR
+	bool "foo"
+	default y
+
+- help text: "help"
+  This defines a help text. The end of the help text is determined by
+  the level indentation, this means it ends at the first line which has
+  a smaller indentation than the first line of the help text.
+
+
+Menu dependencies
+-----------------
+
+Dependencies define the visibility of a menu entry and can also reduce
+the input range of tristate symbols. The tristate logic used in the
+expressions uses one more state than normal boolean logic to express the
+module state. Dependency expressions have the following syntax:
+
+<expr> ::= <symbol>                             (1)
+           <symbol> '=' <symbol>                (2)
+           <symbol> '!=' <symbol>               (3)
+           '(' <expr> ')'                       (4)
+           '!' <expr>                           (5)
+           <expr> '||' <expr>                   (6)
+           <expr> '&&' <expr>                   (7)
+
+Expressions are listed in decreasing order of precedence.
+
+(1) Convert the symbol into an expression. Boolean and tristate symbols
+    are simply converted into the respective expression values. All
+    other symbol types result in 'n'.
+(2) If the values of both symbols are equal, it returns 'y',
+    otherwise 'n'.
+(3) If the values of both symbols are equal, it returns 'n',
+    otherwise 'y'.
+(4) Returns the value of the expression. Used to override precedence.
+(5) Returns the result of (2-/expr/).
+(6) Returns the result of min(/expr/, /expr/).
+(7) Returns the result of max(/expr/, /expr/).
+
+An expression can have a value of 'n', 'm' or 'y' (or 0, 1, 2
+respectively for calculations). A menu entry becomes visible when it's
+expression evaluates to 'm' or 'y'.
+
+There are two type of symbols: constant and nonconstant symbols.
+Nonconstant symbols are the most common ones and are defined with the
+'config' statement. Nonconstant symbols consist entirely of alphanumeric
+characters or underscores.
+Constant symbols are only part of expressions. Constant symbols are
+always surrounded by single or double quotes. Within the quote any
+other character is allowed and the quotes can be escaped using '\'.
+
+Menu structure
+--------------
+
+The position of a menu entry in the tree is determined in two ways. First
+it can be specified explicitely:
+
+menu "Network device support"
+	depends NET
+
+config NETDEVICES
+	...
+
+endmenu
+
+All entries within the "menu" ... "endmenu" block become a submenu of
+"Network device support". All subentries inherit the dependencies from
+the menu entry, e.g. this means the dependency "NET" is added to the
+dependency list of the config option NETDEVICES.
+
+The other way to generate the menu structure is done by analyzing the
+dependencies. If a menu entry somehow depends on the previous entry, it
+can be made a submenu of it. First the the previous (parent) symbol must
+be part of the dependency list and then one of these two condititions
+must be true:
+- the child entry must become invisible, if the parent is set to 'n'
+- the child entry must only be visible, if the parent is visible
+
+config MODULES
+	bool "Enable loadable module support"
+
+config MODVERSIONS
+	bool "Set version information on all module symbols"
+	depends MODULES
+
+comment "module support disabled"
+	depends !MODULES
+
+MODVERSIONS directly depends on MODULES, this means it's only visible if
+MODULES is different from 'n'. The comment on the other hand is always
+visible when MODULES it's visible (the (empty) dependency of MODULES is
+also part of the comment dependencies).
+
+
+Kconfig syntax
+--------------
+
+The configuration file describes a series of menu entries, where every
+line starts with a keyword (except help texts). The following keywords
+end a menu entry:
+- config
+- choice/endchoice
+- comment
+- menu/endmenu
+- if/endif
+- source
+The first four also start the definition of a menu entry.
+
+config:
+
+	"config" <symbol>
+	<config options>
+
+This defines a config symbol <symbol> and accepts any of above
+attributes as options.
+
+choices:
+
+	"choice"
+	<choice options>
+	<choice block>
+	"endchoice"
+
+This defines a choice group and accepts any of above attributes as
+options. A choice can only be of type bool or tristate, while a boolean
+choice only allows a single config entry to be selected, a tristate
+choice also allows any number of config entries to be set to 'm'. This
+can be used if multiple drivers for a single hardware exists and only a
+single driver can be compiled/loaded into the kernel, but all drivers
+can be compiled as modules.
+A choice accepts another option "optional", which allows to set the
+choice to 'n' and no entry needs to be selected.
+
+comment:
+
+	"comment" <prompt>
+	<comment options>
+
+This defines a comment which is displayed to the user during the
+configuration process and is also echoed to the output files. The only
+possible options are dependencies.
+
+menu:
+
+	"menu" <prompt>
+	<menu options>
+	<menu block>
+	"endmenu"
+
+This defines a menu block, see "Menu structure" above for more
+information. The only possible options are dependencies.
+
+if:
+
+	"if" <expr>
+	<if block>
+	"endif"
+
+This defines an if block. The dependency expression <expr> is appended
+to all enclosed menu entries.
+
+source:
+
+	"source" <prompt>
+
+This reads the specified configuration file. This file is always parsed.

+ 123 - 0
config/Makefile

@@ -0,0 +1,123 @@
+# $Id: Makefile 185 2008-10-28 12:24:05Z wbx $
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+include ${TOPDIR}/rules.mk
+
+CP=cp -fpR
+
+all: ncurses conf mconf
+
+LIBS=		-lncurses
+ifeq (/usr/include/ncurses/ncurses.h, $(wildcard /usr/include/ncurses/ncurses.h))
+HOSTNCURSES+=	-I/usr/include/ncurses -DCURSES_LOC="<ncurses.h>"
+else
+ifeq (/usr/include/ncurses/curses.h, $(wildcard /usr/include/ncurses/curses.h))
+HOSTNCURSES+=	-I/usr/include/ncurses -DCURSES_LOC="<ncurses/curses.h>"
+else
+ifeq (/usr/local/include/ncurses/ncurses.h, $(wildcard /usr/local/include/ncurses/ncurses.h))
+HOSTCFLAGS+=	-I/usr/local/include/ncurses -DCURSES_LOC="<ncurses.h>"
+else
+ifeq (/usr/local/include/ncurses/curses.h, $(wildcard /usr/local/include/ncurses/curses.h))
+HOSTCFLAGS+=	-I/usr/local/include/ncurses -DCURSES_LOC="<ncurses/curses.h>"
+else
+ifeq (/usr/pkg/include/ncurses.h, $(wildcard /usr/pkg/include/ncurses.h))
+HOSTCFLAGS+=	-I/usr/pkg/include -DCURSES_LOC="<ncurses.h>"
+LIBS+=		-L/usr/pkg/lib -Wl,-rpath -Wl,/usr/pkg/lib
+else
+ifeq (/usr/include/ncurses.h, $(wildcard /usr/include/ncurses.h))
+HOSTNCURSES+=	-DCURSES_LOC="<ncurses.h>"
+else
+HOSTNCURSES+=	-DCURSES_LOC="<curses.h>"
+endif
+endif
+endif
+endif
+endif
+endif
+
+CONF_SRC  =conf.c
+MCONF_SRC =mconf.c checklist.c menubox.c textbox.c yesno.c inputbox.c util.c msgbox.c
+SHARED_SRC=zconf.tab.c glob.c
+SHARED_DEPS:=lkc.h lkc_proto.h lkc_defs.h expr.h zconf.tab.h glob.h
+CONF_OBJS =$(patsubst %.c,%.o, $(CONF_SRC))
+MCONF_OBJS=$(patsubst %.c,%.o, $(MCONF_SRC))
+SHARED_OBJS=$(patsubst %.c,%.o, $(SHARED_SRC))
+
+conf: $(CONF_OBJS) $(SHARED_OBJS)
+	$(HOSTCC) $(NATIVE_LDFLAGS) $^ -o $@
+
+mconf: $(MCONF_OBJS) $(SHARED_OBJS)
+	$(HOSTCC) $(NATIVE_LDFLAGS) $^ -o $@ $(LIBS)
+
+$(CONF_OBJS): %.o : %.c $(SHARED_DEPS)
+	$(HOSTCC) $(HOSTCFLAGS) -I. -c $< -o $@
+
+$(MCONF_OBJS): %.o : %.c $(SHARED_DEPS)
+	$(HOSTCC) $(HOSTCFLAGS) $(HOSTNCURSES) -I. -c $< -o $@
+
+glob.o: glob.c $(SHARED_DEPS)
+	$(HOSTCC) $(HOSTCFLAGS) -I. -c glob.c -o $@
+
+lkc_defs.h: lkc_proto.h
+	@sed < $< > $@ 's/P(\([^,]*\),.*/#define \1 (\*\1_p)/'
+
+###
+# The following requires flex/bison
+# By default we use the _shipped versions, uncomment the
+# following line if you are modifying the flex/bison src.
+LKC_GENPARSER:=	1
+
+ifdef LKC_GENPARSER
+
+%.tab.c %.tab.h: %.y
+	bison -t -d -v -b $* -p $(notdir $*) $<
+
+lex.%.c: %.l
+	flex -P$(notdir $*) -o$@ $<
+
+lex.zconf.o: lex.zconf.c $(SHARED_DEPS)
+	$(HOSTCC) $(HOSTCFLAGS) -I. -c $< -o $@
+
+zconf.tab.o: zconf.tab.c lex.zconf.c confdata.c expr.c symbol.c menu.c $(SHARED_DEPS)
+	$(HOSTCC) $(HOSTCFLAGS) -I. -c $< -o $@
+
+else
+
+lex.zconf.o: lex.zconf.c $(SHARED_DEPS)
+	$(HOSTCC) $(HOSTCFLAGS) -I. -c $< -o $@
+
+lex.zconf.c: lex.zconf.c_shipped
+	$(CP) lex.zconf.c_shipped lex.zconf.c
+
+zconf.tab.o: zconf.tab.c lex.zconf.c confdata.c expr.c symbol.c menu.c $(SHARED_DEPS)
+	$(HOSTCC) $(HOSTCFLAGS) -I. -c $< -o $@
+
+zconf.tab.c: zconf.tab.c_shipped
+	$(CP) zconf.tab.c_shipped zconf.tab.c
+
+zconf.tab.h: zconf.tab.h_shipped
+	$(CP) zconf.tab.h_shipped zconf.tab.h
+endif
+
+.PHONY: ncurses
+
+ncurses:
+	@echo "int main(void) { return -1; }" > lxtemp.c
+	@if $(HOSTCC) $(HOSTCFLAGS) lxtemp.c $(LIBS) ; then \
+		rm -f lxtemp.c a.out; \
+	else \
+		rm -f lxtemp.c; \
+		printf '\007'; \
+		echo ">> Unable to find the Ncurses libraries." ;\
+		echo ">>" ;\
+		echo ">> You must have Ncurses installed in order" ;\
+		echo ">> to use 'make menuconfig'" ;\
+		echo ;\
+		exit 1 ;\
+	fi
+
+clean:
+	rm -f *.o *~ core $(TARGETS) $(MCONF_OBJS) $(CONF_OBJS) \
+		conf mconf zconf.tab.c zconf.tab.h lex.zconf.c lkc_defs.h

+ 5 - 0
config/Makefile.in

@@ -0,0 +1,5 @@
+ifeq ($(strip $(ADK_PACKAGE_CONFIG)),y)
+TARGETS+=config
+endif
+
+include ${TOPDIR}/mk/pkg-bottom.mk

+ 377 - 0
config/checklist.c

@@ -0,0 +1,377 @@
+/*
+ *  checklist.c -- implements the checklist box
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *     Stuart Herbert - S.Herbert@sheffield.ac.uk: radiolist extension
+ *     Alessandro Rubini - rubini@ipvvis.unipv.it: merged the two
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "dialog.h"
+
+static int list_width, check_x, item_x, checkflag;
+
+/*
+ * Print list item
+ */
+static void
+print_item (WINDOW * win, const char *item, int status,
+	    int choice, int selected)
+{
+    int i;
+
+    /* Clear 'residue' of last item */
+    wattrset (win, menubox_attr);
+    wmove (win, choice, 0);
+    for (i = 0; i < list_width; i++)
+	waddch (win, ' ');
+
+    wmove (win, choice, check_x);
+    wattrset (win, selected ? check_selected_attr : check_attr);
+    if (checkflag == FLAG_CHECK)
+	wprintw (win, "[%c]", status ? 'X' : ' ');
+    else
+	wprintw (win, "(%c)", status ? 'X' : ' ');
+
+#if 0
+    wattrset (win, selected ? tag_selected_attr : tag_attr);
+    mvwaddch(win, choice, item_x, item[0]);
+    wattrset (win, selected ? item_selected_attr : item_attr);
+    waddstr (win, (char *)item+1);
+#else
+    wattrset (win, selected ? item_selected_attr : item_attr);
+    waddstr (win, item);
+#endif
+    if (selected) {
+    	wmove (win, choice, check_x+1);
+    	wrefresh (win);
+    }
+}
+
+/*
+ * Print the scroll indicators.
+ */
+static void
+print_arrows (WINDOW * win, int choice, int item_no, int scroll,
+		int y, int x, int height)
+{
+    wmove(win, y, x);
+
+    if (scroll > 0) {
+	wattrset (win, uarrow_attr);
+	waddch (win, ACS_UARROW);
+	waddstr (win, "(-)");
+    }
+    else {
+	wattrset (win, menubox_attr);
+	waddch (win, ACS_HLINE);
+	waddch (win, ACS_HLINE);
+	waddch (win, ACS_HLINE);
+	waddch (win, ACS_HLINE);
+    }
+
+   y = y + height + 1;
+   wmove(win, y, x);
+
+   if ((height < item_no) && (scroll + choice < item_no - 1)) {
+	wattrset (win, darrow_attr);
+	waddch (win, ACS_DARROW);
+	waddstr (win, "(+)");
+    }
+    else {
+	wattrset (win, menubox_border_attr);
+	waddch (win, ACS_HLINE);
+	waddch (win, ACS_HLINE);
+	waddch (win, ACS_HLINE);
+	waddch (win, ACS_HLINE);
+   }
+}
+
+/*
+ *  Display the termination buttons
+ */
+static void
+print_buttons( WINDOW *dialog, int height, int width, int selected)
+{
+    int x = width / 2 - 11;
+    int y = height - 2;
+
+    print_button (dialog, "Select", y, x, selected == 0);
+    print_button (dialog, " Help ", y, x + 14, selected == 1);
+
+    wmove(dialog, y, x+1 + 14*selected);
+    wrefresh (dialog);
+}
+
+/*
+ * Display a dialog box with a list of options that can be turned on or off
+ * The `flag' parameter is used to select between radiolist and checklist.
+ */
+int
+dialog_checklist (const char *title, const char *prompt, int height, int width,
+	int list_height, int item_no, struct dialog_list_item ** items,
+	int flag)
+
+{
+    int i, x, y, box_x, box_y;
+    int key = 0, button = 0, choice = 0, scroll = 0, max_choice, *status;
+    WINDOW *dialog, *list;
+
+    checkflag = flag;
+
+    /* Allocate space for storing item on/off status */
+    if ((status = malloc (sizeof (int) * item_no)) == NULL) {
+	endwin ();
+	fprintf (stderr,
+		 "\nCan't allocate memory in dialog_checklist().\n");
+	exit (-1);
+    }
+
+    /* Initializes status */
+    for (i = 0; i < item_no; i++) {
+	status[i] = (items[i]->selected == 1); /* ON */
+	if ((!choice && status[i]) || items[i]->selected == 2) /* SELECTED */
+            choice = i + 1;
+    }
+    if (choice)
+	    choice--;
+
+    max_choice = MIN (list_height, item_no);
+
+    /* center dialog box on screen */
+    x = (COLS - width) / 2;
+    y = (LINES - height) / 2;
+
+    draw_shadow (stdscr, y, x, height, width);
+
+    dialog = newwin (height, width, y, x);
+    keypad (dialog, TRUE);
+
+    draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
+    wattrset (dialog, border_attr);
+    mvwaddch (dialog, height-3, 0, ACS_LTEE);
+    for (i = 0; i < width - 2; i++)
+	waddch (dialog, ACS_HLINE);
+    wattrset (dialog, dialog_attr);
+    waddch (dialog, ACS_RTEE);
+
+    if (title != NULL && strlen(title) >= width-2 ) {
+	/* truncate long title -- mec */
+	char * title2 = malloc(width-2+1);
+	memcpy( title2, title, width-2 );
+	title2[width-2] = '\0';
+	title = title2;
+    }
+
+    if (title != NULL) {
+	wattrset (dialog, title_attr);
+	mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
+	waddstr (dialog, (char *)title);
+	waddch (dialog, ' ');
+    }
+
+    wattrset (dialog, dialog_attr);
+    print_autowrap (dialog, prompt, width - 2, 1, 3);
+
+    list_width = width - 6;
+    box_y = height - list_height - 5;
+    box_x = (width - list_width) / 2 - 1;
+
+    /* create new window for the list */
+    list = subwin (dialog, list_height, list_width, y+box_y+1, x+box_x+1);
+
+    keypad (list, TRUE);
+
+    /* draw a box around the list items */
+    draw_box (dialog, box_y, box_x, list_height + 2, list_width + 2,
+	      menubox_border_attr, menubox_attr);
+
+    /* Find length of longest item in order to center checklist */
+    check_x = 0;
+    for (i = 0; i < item_no; i++)
+	check_x = MAX (check_x, + strlen (items[i]->name) + 4);
+
+    check_x = (list_width - check_x) / 2;
+    item_x = check_x + 4;
+
+    if (choice >= list_height) {
+	scroll = choice - list_height + 1;
+	choice -= scroll;
+    }
+
+    /* Print the list */
+    for (i = 0; i < max_choice; i++) {
+	print_item (list, items[scroll + i]->name,
+		    status[i+scroll], i, i == choice);
+    }
+
+    print_arrows(dialog, choice, item_no, scroll,
+			box_y, box_x + check_x + 5, list_height);
+
+    print_buttons(dialog, height, width, 0);
+
+    wnoutrefresh (list);
+    wnoutrefresh (dialog);
+    doupdate ();
+
+    while (key != ESC) {
+	key = wgetch (dialog);
+
+    	for (i = 0; i < max_choice; i++)
+            if (toupper(key) == toupper(items[scroll + i]->name[0]))
+                break;
+
+
+	if ( i < max_choice || key == KEY_UP || key == KEY_DOWN ||
+	    key == '+' || key == '-' ) {
+	    if (key == KEY_UP || key == '-') {
+		if (!choice) {
+		    if (!scroll)
+			continue;
+		    /* Scroll list down */
+		    if (list_height > 1) {
+			/* De-highlight current first item */
+			print_item (list, items[scroll]->name,
+					status[scroll], 0, FALSE);
+			scrollok (list, TRUE);
+			wscrl (list, -1);
+			scrollok (list, FALSE);
+		    }
+		    scroll--;
+		    print_item (list, items[scroll]->name,
+				status[scroll], 0, TRUE);
+		    wnoutrefresh (list);
+
+    		    print_arrows(dialog, choice, item_no, scroll,
+				box_y, box_x + check_x + 5, list_height);
+
+		    wrefresh (dialog);
+
+		    continue;	/* wait for another key press */
+		} else
+		    i = choice - 1;
+	    } else if (key == KEY_DOWN || key == '+') {
+		if (choice == max_choice - 1) {
+		    if (scroll + choice >= item_no - 1)
+			continue;
+		    /* Scroll list up */
+		    if (list_height > 1) {
+			/* De-highlight current last item before scrolling up */
+			print_item (list, items[scroll + max_choice - 1]->name,
+				    status[scroll + max_choice - 1],
+				    max_choice - 1, FALSE);
+			scrollok (list, TRUE);
+			scroll (list);
+			scrollok (list, FALSE);
+		    }
+		    scroll++;
+		    print_item (list, items[scroll + max_choice - 1]->name,
+				status[scroll + max_choice - 1],
+				max_choice - 1, TRUE);
+		    wnoutrefresh (list);
+
+    		    print_arrows(dialog, choice, item_no, scroll,
+				box_y, box_x + check_x + 5, list_height);
+
+		    wrefresh (dialog);
+
+		    continue;	/* wait for another key press */
+		} else
+		    i = choice + 1;
+	    }
+	    if (i != choice) {
+		/* De-highlight current item */
+		print_item (list, items[scroll + choice]->name,
+			    status[scroll + choice], choice, FALSE);
+		/* Highlight new item */
+		choice = i;
+		print_item (list, items[scroll + choice]->name,
+			    status[scroll + choice], choice, TRUE);
+		wnoutrefresh (list);
+		wrefresh (dialog);
+	    }
+	    continue;		/* wait for another key press */
+	}
+	switch (key) {
+	case 'H':
+	case 'h':
+	case '?':
+	    for (i = 0; i < item_no; i++)
+		items[i]->selected = 0;
+	    items[scroll + choice]->selected = 1;
+	    delwin (dialog);
+	    free (status);
+	    return 1;
+	case TAB:
+	case KEY_LEFT:
+	case KEY_RIGHT:
+	    button = ((key == KEY_LEFT ? --button : ++button) < 0)
+			? 1 : (button > 1 ? 0 : button);
+
+	    print_buttons(dialog, height, width, button);
+	    wrefresh (dialog);
+	    break;
+	case 'S':
+	case 's':
+	case ' ':
+	case '\n':
+	    if (!button) {
+		if (flag == FLAG_CHECK) {
+		    status[scroll + choice] = !status[scroll + choice];
+		    wmove (list, choice, check_x);
+		    wattrset (list, check_selected_attr);
+		    wprintw (list, "[%c]", status[scroll + choice] ? 'X' : ' ');
+		} else {
+		    if (!status[scroll + choice]) {
+			for (i = 0; i < item_no; i++)
+			    status[i] = 0;
+			status[scroll + choice] = 1;
+			for (i = 0; i < max_choice; i++)
+			    print_item (list, items[scroll + i]->name,
+					status[scroll + i], i, i == choice);
+		    }
+		}
+		wnoutrefresh (list);
+		wrefresh (dialog);
+
+		for (i = 0; i < item_no; i++) {
+			items[i]->selected = status[i];
+		}
+            } else {
+		    for (i = 0; i < item_no; i++)
+			    items[i]->selected = 0;
+		    items[scroll + choice]->selected = 1;
+	    }
+	    delwin (dialog);
+	    free (status);
+	    return button;
+	case 'X':
+	case 'x':
+	    key = ESC;
+	case ESC:
+	    break;
+	}
+
+	/* Now, update everything... */
+	doupdate ();
+    }
+
+
+    delwin (dialog);
+    free (status);
+    return -1;			/* ESC pressed */
+}

+ 161 - 0
config/colors.h

@@ -0,0 +1,161 @@
+/*
+ *  colors.h -- color attribute definitions
+ *
+ *  AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+/*
+ *   Default color definitions
+ *
+ *   *_FG = foreground
+ *   *_BG = background
+ *   *_HL = highlight?
+ */
+#define SCREEN_FG                    COLOR_CYAN
+#define SCREEN_BG                    COLOR_BLUE
+#define SCREEN_HL                    TRUE
+
+#define SHADOW_FG                    COLOR_BLACK
+#define SHADOW_BG                    COLOR_BLACK
+#define SHADOW_HL                    TRUE
+
+#define DIALOG_FG                    COLOR_BLACK
+#define DIALOG_BG                    COLOR_WHITE
+#define DIALOG_HL                    FALSE
+
+#define TITLE_FG                     COLOR_YELLOW
+#define TITLE_BG                     COLOR_WHITE
+#define TITLE_HL                     TRUE
+
+#define BORDER_FG                    COLOR_WHITE
+#define BORDER_BG                    COLOR_WHITE
+#define BORDER_HL                    TRUE
+
+#define BUTTON_ACTIVE_FG             COLOR_WHITE
+#define BUTTON_ACTIVE_BG             COLOR_BLUE
+#define BUTTON_ACTIVE_HL             TRUE
+
+#define BUTTON_INACTIVE_FG           COLOR_BLACK
+#define BUTTON_INACTIVE_BG           COLOR_WHITE
+#define BUTTON_INACTIVE_HL           FALSE
+
+#define BUTTON_KEY_ACTIVE_FG         COLOR_WHITE
+#define BUTTON_KEY_ACTIVE_BG         COLOR_BLUE
+#define BUTTON_KEY_ACTIVE_HL         TRUE
+
+#define BUTTON_KEY_INACTIVE_FG       COLOR_RED
+#define BUTTON_KEY_INACTIVE_BG       COLOR_WHITE
+#define BUTTON_KEY_INACTIVE_HL       FALSE
+
+#define BUTTON_LABEL_ACTIVE_FG       COLOR_YELLOW
+#define BUTTON_LABEL_ACTIVE_BG       COLOR_BLUE
+#define BUTTON_LABEL_ACTIVE_HL       TRUE
+
+#define BUTTON_LABEL_INACTIVE_FG     COLOR_BLACK
+#define BUTTON_LABEL_INACTIVE_BG     COLOR_WHITE
+#define BUTTON_LABEL_INACTIVE_HL     TRUE
+
+#define INPUTBOX_FG                  COLOR_BLACK
+#define INPUTBOX_BG                  COLOR_WHITE
+#define INPUTBOX_HL                  FALSE
+
+#define INPUTBOX_BORDER_FG           COLOR_BLACK
+#define INPUTBOX_BORDER_BG           COLOR_WHITE
+#define INPUTBOX_BORDER_HL           FALSE
+
+#define SEARCHBOX_FG                 COLOR_BLACK
+#define SEARCHBOX_BG                 COLOR_WHITE
+#define SEARCHBOX_HL                 FALSE
+
+#define SEARCHBOX_TITLE_FG           COLOR_YELLOW
+#define SEARCHBOX_TITLE_BG           COLOR_WHITE
+#define SEARCHBOX_TITLE_HL           TRUE
+
+#define SEARCHBOX_BORDER_FG          COLOR_WHITE
+#define SEARCHBOX_BORDER_BG          COLOR_WHITE
+#define SEARCHBOX_BORDER_HL          TRUE
+
+#define POSITION_INDICATOR_FG        COLOR_YELLOW
+#define POSITION_INDICATOR_BG        COLOR_WHITE
+#define POSITION_INDICATOR_HL        TRUE
+
+#define MENUBOX_FG                   COLOR_BLACK
+#define MENUBOX_BG                   COLOR_WHITE
+#define MENUBOX_HL                   FALSE
+
+#define MENUBOX_BORDER_FG            COLOR_WHITE
+#define MENUBOX_BORDER_BG            COLOR_WHITE
+#define MENUBOX_BORDER_HL            TRUE
+
+#define ITEM_FG                      COLOR_BLACK
+#define ITEM_BG                      COLOR_WHITE
+#define ITEM_HL                      FALSE
+
+#define ITEM_SELECTED_FG             COLOR_WHITE
+#define ITEM_SELECTED_BG             COLOR_BLUE
+#define ITEM_SELECTED_HL             TRUE
+
+#define TAG_FG                       COLOR_YELLOW
+#define TAG_BG                       COLOR_WHITE
+#define TAG_HL                       TRUE
+
+#define TAG_SELECTED_FG              COLOR_YELLOW
+#define TAG_SELECTED_BG              COLOR_BLUE
+#define TAG_SELECTED_HL              TRUE
+
+#define TAG_KEY_FG                   COLOR_YELLOW
+#define TAG_KEY_BG                   COLOR_WHITE
+#define TAG_KEY_HL                   TRUE
+
+#define TAG_KEY_SELECTED_FG          COLOR_YELLOW
+#define TAG_KEY_SELECTED_BG          COLOR_BLUE
+#define TAG_KEY_SELECTED_HL          TRUE
+
+#define CHECK_FG                     COLOR_BLACK
+#define CHECK_BG                     COLOR_WHITE
+#define CHECK_HL                     FALSE
+
+#define CHECK_SELECTED_FG            COLOR_WHITE
+#define CHECK_SELECTED_BG            COLOR_BLUE
+#define CHECK_SELECTED_HL            TRUE
+
+#define UARROW_FG                    COLOR_GREEN
+#define UARROW_BG                    COLOR_WHITE
+#define UARROW_HL                    TRUE
+
+#define DARROW_FG                    COLOR_GREEN
+#define DARROW_BG                    COLOR_WHITE
+#define DARROW_HL                    TRUE
+
+/* End of default color definitions */
+
+#define C_ATTR(x,y)                  ((x ? A_BOLD : 0) | COLOR_PAIR((y)))
+#define COLOR_NAME_LEN               10
+#define COLOR_COUNT                  8
+
+/*
+ * Global variables
+ */
+
+typedef struct {
+    char name[COLOR_NAME_LEN];
+    int value;
+} color_names_st;
+
+extern color_names_st color_names[];
+extern int color_table[][3];

+ 601 - 0
config/conf.c

@@ -0,0 +1,601 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <time.h>
+#include <sys/stat.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+extern int output_mode;
+
+static void conf(struct menu *menu);
+static void check_conf(struct menu *menu);
+
+enum {
+	ask_all,
+	ask_new,
+	ask_silent,
+	set_default,
+	set_yes,
+	set_mod,
+	ask_mod,
+	set_no,
+	set_random
+} input_mode = ask_all;
+char *defconfig_file;
+
+static int indent = 1;
+static int valid_stdin = 1;
+static int conf_cnt;
+static int press_enter = 0;
+static char line[128];
+static struct menu *rootEntry;
+
+static char nohelp_text[] = "Sorry, no help available for this option yet.\n";
+
+static void strip(char *str)
+{
+	char *p = str;
+	int l;
+
+	while ((isspace(*p)))
+		p++;
+	l = strlen(p);
+	if (p != str)
+		memmove(str, p, l + 1);
+	if (!l)
+		return;
+	p = str + l - 1;
+	while ((isspace(*p)))
+		*p-- = 0;
+}
+
+static void check_stdin(void)
+{
+	if (!valid_stdin && input_mode == ask_silent && !press_enter) {
+		printf("aborted!\n\n");
+		printf("Console input/output is redirected. ");
+		printf("Run 'make oldconfig' to update configuration.\n\n");
+		exit(1);
+	}
+}
+
+static void conf_askvalue(struct symbol *sym, const char *def)
+{
+	enum symbol_type type = sym_get_type(sym);
+	tristate val;
+
+	if (!sym_has_value(sym))
+		printf("(NEW) ");
+
+	line[0] = '\n';
+	line[1] = 0;
+
+	if (!sym_is_changable(sym)) {
+		printf("%s\n", def);
+		line[0] = '\n';
+		line[1] = 0;
+		return;
+	}
+
+	switch (input_mode) {
+	case ask_new:
+	case ask_silent:
+		if (sym_has_value(sym) ||
+		    (output_mode && !(sym->flags & SYMBOL_WRITE))) {
+			printf("%s\n", def);
+			return;
+		}
+		check_stdin();
+	case ask_all:
+		fflush(stdout);
+		fgets(line, 128, stdin);
+		return;
+	case set_default:
+		printf("%s\n", def);
+		return;
+	default:
+		break;
+	}
+
+	switch (type) {
+	case S_INT:
+	case S_HEX:
+	case S_STRING:
+		printf("%s\n", def);
+		return;
+	default:
+		;
+	}
+	switch (input_mode) {
+	case set_yes:
+		if (sym_tristate_within_range(sym, yes)) {
+			line[0] = 'y';
+			line[1] = '\n';
+			line[2] = 0;
+			break;
+		}
+	case ask_mod:
+	case set_mod:
+		if (type == S_TRISTATE) {
+			if (sym_tristate_within_range(sym, mod)) {
+				line[0] = 'm';
+				line[1] = '\n';
+				line[2] = 0;
+				break;
+			}
+		} else {
+			if (sym_tristate_within_range(sym, yes)) {
+				line[0] = 'y';
+				line[1] = '\n';
+				line[2] = 0;
+				break;
+			}
+		}
+	case set_no:
+		if (sym_tristate_within_range(sym, no)) {
+			line[0] = 'n';
+			line[1] = '\n';
+			line[2] = 0;
+			break;
+		}
+	case set_random:
+		do {
+			val = (tristate)(random() % 3);
+		} while (!sym_tristate_within_range(sym, val));
+		switch (val) {
+		case no: line[0] = 'n'; break;
+		case mod: line[0] = 'm'; break;
+		case yes: line[0] = 'y'; break;
+		}
+		line[1] = '\n';
+		line[2] = 0;
+		break;
+	default:
+		break;
+	}
+	printf("%s", line);
+}
+
+int conf_string(struct menu *menu)
+{
+	struct symbol *sym = menu->sym;
+	const char *def, *help;
+
+	while (1) {
+		printf("%*s%s ", indent - 1, "", menu->prompt->text);
+		printf("(%s) ", sym->name);
+		def = sym_get_string_value(sym);
+		if (sym_get_string_value(sym))
+			printf("[%s] ", def);
+		conf_askvalue(sym, def);
+		switch (line[0]) {
+		case '\n':
+			break;
+		case '?':
+			/* print help */
+			if (line[1] == '\n') {
+				help = nohelp_text;
+				if (menu->sym->help)
+					help = menu->sym->help;
+				printf("\n%s\n", menu->sym->help);
+				def = NULL;
+				break;
+			}
+		default:
+			line[strlen(line)-1] = 0;
+			def = line;
+		}
+		if (def && sym_set_string_value(sym, def))
+			return 0;
+	}
+}
+
+static int conf_sym(struct menu *menu)
+{
+	struct symbol *sym = menu->sym;
+	int type;
+	tristate oldval, newval;
+	const char *help;
+
+	while (1) {
+		printf("%*s%s ", indent - 1, "", menu->prompt->text);
+		if (sym->name)
+			printf("(%s) ", sym->name);
+		type = sym_get_type(sym);
+		putchar('[');
+		oldval = sym_get_tristate_value(sym);
+		switch (oldval) {
+		case no:
+			putchar('N');
+			break;
+		case mod:
+			putchar('M');
+			break;
+		case yes:
+			putchar('Y');
+			break;
+		}
+		if (oldval != no && sym_tristate_within_range(sym, no))
+			printf("/n");
+		if (oldval != mod && sym_tristate_within_range(sym, mod))
+			printf("/m");
+		if (oldval != yes && sym_tristate_within_range(sym, yes))
+			printf("/y");
+		if (sym->help)
+			printf("/?");
+		printf("] ");
+		conf_askvalue(sym, sym_get_string_value(sym));
+		strip(line);
+
+		switch (line[0]) {
+		case 'n':
+		case 'N':
+			newval = no;
+			if (!line[1] || !strcmp(&line[1], "o"))
+				break;
+			continue;
+		case 'm':
+		case 'M':
+			newval = mod;
+			if (!line[1])
+				break;
+			continue;
+		case 'y':
+		case 'Y':
+			newval = yes;
+			if (!line[1] || !strcmp(&line[1], "es"))
+				break;
+			continue;
+		case 0:
+			newval = oldval;
+			break;
+		case '?':
+			goto help;
+		default:
+			continue;
+		}
+		if (sym_set_tristate_value(sym, newval))
+			return 0;
+help:
+		help = nohelp_text;
+		if (sym->help)
+			help = sym->help;
+		printf("\n%s\n", help);
+	}
+}
+
+static int conf_choice(struct menu *menu)
+{
+	struct symbol *sym, *def_sym;
+	struct menu *child;
+	int type;
+	bool is_new;
+
+	sym = menu->sym;
+	type = sym_get_type(sym);
+	is_new = !sym_has_value(sym);
+	if (sym_is_changable(sym)) {
+		conf_sym(menu);
+		sym_calc_value(sym);
+		switch (sym_get_tristate_value(sym)) {
+		case no:
+			return 1;
+		case mod:
+			return 0;
+		case yes:
+			break;
+		}
+	} else {
+		switch (sym_get_tristate_value(sym)) {
+		case no:
+			return 1;
+		case mod:
+			printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
+			return 0;
+		case yes:
+			break;
+		}
+	}
+
+	while (1) {
+		int cnt, def;
+
+		printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
+		def_sym = sym_get_choice_value(sym);
+		cnt = def = 0;
+		line[0] = '0';
+		line[1] = 0;
+		for (child = menu->list; child; child = child->next) {
+			if (!menu_is_visible(child))
+				continue;
+			if (!child->sym) {
+				printf("%*c %s\n", indent, '*', menu_get_prompt(child));
+				continue;
+			}
+			cnt++;
+			if (child->sym == def_sym) {
+				def = cnt;
+				printf("%*c", indent, '>');
+			} else
+				printf("%*c", indent, ' ');
+			printf(" %d. %s", cnt, menu_get_prompt(child));
+			if (child->sym->name)
+				printf(" (%s)", child->sym->name);
+			if (!sym_has_value(child->sym))
+				printf(" (NEW)");
+			printf("\n");
+		}
+		printf("%*schoice", indent - 1, "");
+		if (cnt == 1) {
+			printf("[1]: 1\n");
+			goto conf_childs;
+		}
+		printf("[1-%d", cnt);
+		if (sym->help)
+			printf("?");
+		printf("]: ");
+		switch (input_mode) {
+		case ask_new:
+		case ask_silent:
+			if (!is_new) {
+				cnt = def;
+				printf("%d\n", cnt);
+				break;
+			}
+			check_stdin();
+		case ask_all:
+			fflush(stdout);
+			fgets(line, 128, stdin);
+			strip(line);
+			if (line[0] == '?') {
+				printf("\n%s\n", menu->sym->help ?
+					menu->sym->help : nohelp_text);
+				continue;
+			}
+			if (!line[0])
+				cnt = def;
+			else if (isdigit(line[0]))
+				cnt = atoi(line);
+			else
+				continue;
+			break;
+		case set_random:
+			def = (random() % cnt) + 1;
+		case set_default:
+		case set_yes:
+		case set_mod:
+		case set_no:
+		case ask_mod:
+			cnt = def;
+			printf("%d\n", cnt);
+			break;
+		}
+
+	conf_childs:
+		for (child = menu->list; child; child = child->next) {
+			if (!child->sym || !menu_is_visible(child))
+				continue;
+			if (!--cnt)
+				break;
+		}
+		if (!child)
+			continue;
+		if (line[strlen(line) - 1] == '?') {
+			printf("\n%s\n", child->sym->help ?
+				child->sym->help : nohelp_text);
+			continue;
+		}
+		sym_set_choice_value(sym, child->sym);
+		if (child->list) {
+			indent += 2;
+			conf(child->list);
+			indent -= 2;
+		}
+		return 1;
+	}
+}
+
+static void conf(struct menu *menu)
+{
+	struct symbol *sym;
+	struct property *prop;
+	struct menu *child;
+
+	if (!menu_is_visible(menu))
+		return;
+
+	sym = menu->sym;
+	prop = menu->prompt;
+	if (prop) {
+		const char *prompt;
+
+		switch (prop->type) {
+		case P_MENU:
+			if (input_mode == ask_silent && rootEntry != menu) {
+				check_conf(menu);
+				return;
+			}
+		case P_COMMENT:
+			prompt = menu_get_prompt(menu);
+			if (prompt)
+				printf("%*c\n%*c %s\n%*c\n",
+					indent, '*',
+					indent, '*', prompt,
+					indent, '*');
+		default:
+			;
+		}
+	}
+
+	if (!sym)
+		goto conf_childs;
+
+	if (sym_is_choice(sym)) {
+		conf_choice(menu);
+		if (sym->curr.tri != mod)
+			return;
+		goto conf_childs;
+	}
+
+	switch (sym->type) {
+	case S_INT:
+	case S_HEX:
+	case S_STRING:
+		conf_string(menu);
+		break;
+	default:
+		conf_sym(menu);
+		break;
+	}
+
+conf_childs:
+	if (sym)
+		indent += 2;
+	for (child = menu->list; child; child = child->next)
+		conf(child);
+	if (sym)
+		indent -= 2;
+}
+
+static void check_conf(struct menu *menu)
+{
+	struct symbol *sym;
+	struct menu *child;
+
+	if (!menu_is_visible(menu))
+		return;
+
+	sym = menu->sym;
+	if (sym) {
+		if (sym_is_changable(sym) && !sym_has_value(sym)) {
+			if (!conf_cnt++)
+				printf("*\n* Restart config...\n*\n");
+			rootEntry = menu_get_parent_menu(menu);
+			conf(rootEntry);
+		}
+		if (sym_is_choice(sym) && sym_get_tristate_value(sym) != mod)
+			return;
+	}
+
+	for (child = menu->list; child; child = child->next)
+		check_conf(child);
+}
+
+int main(int ac, char **av)
+{
+	int i = 1;
+	const char *name;
+	struct stat tmpstat;
+
+	if (ac > i && av[i][0] == '-') {
+		switch (av[i++][1]) {
+		case 'A':
+			output_mode = 1;
+			/* FALLTHROUGH */
+		case 'o':
+			input_mode = ask_new;
+			break;
+		case 'a':
+			input_mode = ask_new;
+			press_enter = 1;
+			break;
+		case 's':
+			input_mode = ask_silent;
+			valid_stdin = isatty(0) && isatty(1) && isatty(2);
+			break;
+		case 'd':
+			input_mode = set_default;
+			break;
+		case 'D':
+			input_mode = set_default;
+			defconfig_file = av[i++];
+			if (!defconfig_file) {
+				printf("%s: No default config file specified\n",
+					av[0]);
+				exit(1);
+			}
+			break;
+		case 'n':
+			input_mode = set_no;
+			break;
+		case 'M':
+			input_mode = ask_mod;
+			break;
+		case 'm':
+			input_mode = set_mod;
+			break;
+		case 'y':
+			input_mode = set_yes;
+			break;
+		case 'r':
+			input_mode = set_random;
+			srandom(time(NULL));
+			break;
+		case 'h':
+		case '?':
+			printf("%s [-o|-s] config\n", av[0]);
+			exit(0);
+		}
+	}
+  	name = av[i];
+	if (!name) {
+		printf("%s: configuration file missing\n", av[0]);
+	}
+	conf_parse(name);
+	//zconfdump(stdout);
+	switch (input_mode) {
+	case set_default:
+		if (!defconfig_file)
+			defconfig_file = conf_get_default_confname();
+		if (conf_read(defconfig_file)) {
+			printf("***\n"
+				"*** Can't find default configuration \"%s\"!\n"
+				"***\n", defconfig_file);
+			exit(1);
+		}
+		break;
+	case ask_silent:
+		if (stat(".config", &tmpstat)) {
+			printf("***\n"
+				"*** You have not yet configured OpenADK!\n"
+				"***\n"
+				"*** Please run some configurator (e.g. \"make oldconfig\" or\n"
+				"*** \"make menuconfig\" or \"make config\").\n"
+				"***\n");
+			exit(1);
+		}
+	case ask_all:
+	case ask_new:
+	case ask_mod:
+		conf_read(NULL);
+		break;
+	default:
+		break;
+	}
+
+	if (input_mode != ask_silent) {
+		rootEntry = &rootmenu;
+		conf(&rootmenu);
+		if (input_mode == ask_all) {
+			input_mode = ask_silent;
+			valid_stdin = 1;
+		}
+	}
+	do {
+		conf_cnt = 0;
+		check_conf(&rootmenu);
+	} while (conf_cnt);
+	if (conf_write(NULL)) {
+		fprintf(stderr, "\n*** Error during writing of the OpenADK configuration.\n\n");
+		return 1;
+	}
+	return 0;
+}

+ 449 - 0
config/confdata.c

@@ -0,0 +1,449 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <sys/stat.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+int output_mode = 0;
+
+const char conf_def_filename[] = ".config";
+
+const char conf_defname[] = "Config.default";
+
+const char *conf_confnames[] = {
+	".config",
+	conf_defname,
+	NULL,
+};
+
+static char *conf_expand_value(const char *in)
+{
+	struct symbol *sym;
+	const char *src;
+	static char res_value[SYMBOL_MAXLENGTH];
+	char *dst, name[SYMBOL_MAXLENGTH];
+
+	res_value[0] = 0;
+	dst = name;
+	while ((src = strchr(in, '$'))) {
+		strncat(res_value, in, src - in);
+		src++;
+		dst = name;
+		while (isalnum(*src) || *src == '_')
+			*dst++ = *src++;
+		*dst = 0;
+		sym = sym_lookup(name, 0);
+		sym_calc_value(sym);
+		strcat(res_value, sym_get_string_value(sym));
+		in = src;
+	}
+	strcat(res_value, in);
+
+	return res_value;
+}
+
+char *conf_get_default_confname(void)
+{
+	struct stat buf;
+	static char fullname[PATH_MAX+1];
+	char *env, *name;
+
+	name = conf_expand_value(conf_defname);
+	env = getenv(SRCTREE);
+	if (env) {
+		sprintf(fullname, "%s/%s", env, name);
+		if (!stat(fullname, &buf))
+			return fullname;
+	}
+	return name;
+}
+
+int conf_read(const char *name)
+{
+	FILE *in = NULL;
+	char line[2048];
+	char *p, *p2;
+	int lineno = 0;
+	struct symbol *sym;
+	struct property *prop;
+	struct expr *e;
+	int i;
+
+	if (name) {
+		in = zconf_fopen(name);
+	} else {
+		const char **names = conf_confnames;
+		while ((name = *names++)) {
+			name = conf_expand_value(name);
+			in = zconf_fopen(name);
+			if (in) {
+				printf("#\n"
+				       "# using defaults found in %s\n"
+				       "#\n", name);
+				break;
+			}
+		}
+	}
+
+	if (!in)
+		return 1;
+
+	for_all_symbols(i, sym) {
+		sym->flags |= SYMBOL_NEW | SYMBOL_CHANGED;
+		sym->flags &= ~SYMBOL_VALID;
+		switch (sym->type) {
+		case S_INT:
+		case S_HEX:
+		case S_STRING:
+			if (sym->user.val)
+				free(sym->user.val);
+		default:
+			sym->user.val = NULL;
+			sym->user.tri = no;
+		}
+	}
+
+	while (fgets(line, sizeof(line), in)) {
+		lineno++;
+		sym = NULL;
+		switch (line[0]) {
+		case '#':
+			if (line[1]!=' ')
+				continue;
+			p = strchr(line + 2, ' ');
+			if (!p)
+				continue;
+			*p++ = 0;
+			if (strncmp(p, "is not set", 10))
+				continue;
+			sym = sym_find(line + 2);
+			if (!sym) {
+				fprintf(stderr, "%s:%d: trying to assign nonexistent symbol %s\n", name, lineno, line + 2);
+				break;
+			}
+			switch (sym->type) {
+			case S_BOOLEAN:
+			case S_TRISTATE:
+				sym->user.tri = no;
+				sym->flags &= ~SYMBOL_NEW;
+				break;
+			default:
+				;
+			}
+			break;
+
+		case 'A' ... 'Z':
+			p = strchr(line, '=');
+			if (!p)
+				continue;
+			*p++ = 0;
+			p2 = strchr(p, '\n');
+			if (p2)
+				*p2 = 0;
+			sym = sym_find(line);
+			if (!sym) {
+				fprintf(stderr, "%s:%d: trying to assign nonexistent symbol %s\n", name, lineno, line);
+				break;
+			}
+			switch (sym->type) {
+			case S_TRISTATE:
+				if (p[0] == 'm') {
+					sym->user.tri = mod;
+					sym->flags &= ~SYMBOL_NEW;
+					break;
+				}
+			case S_BOOLEAN:
+				if (p[0] == 'y') {
+					sym->user.tri = yes;
+					sym->flags &= ~SYMBOL_NEW;
+					break;
+				}
+				if (p[0] == 'n') {
+					sym->user.tri = no;
+					sym->flags &= ~SYMBOL_NEW;
+					break;
+				}
+				break;
+			case S_STRING:
+				if (*p++ != '"')
+					break;
+				for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) {
+					if (*p2 == '"') {
+						*p2 = 0;
+						break;
+					}
+					memmove(p2, p2 + 1, strlen(p2));
+				}
+				if (!p2) {
+					fprintf(stderr, "%s:%d: invalid string found\n", name, lineno);
+					exit(1);
+				}
+			case S_INT:
+			case S_HEX:
+				if (sym_string_valid(sym, p)) {
+					sym->user.val = strdup(p);
+					sym->flags &= ~SYMBOL_NEW;
+				} else {
+					fprintf(stderr, "%s:%d: symbol value '%s' invalid for %s\n", name, lineno, p, sym->name);
+					exit(1);
+				}
+				break;
+			default:
+				;
+			}
+			break;
+		case '\n':
+			break;
+		default:
+			continue;
+		}
+		if (sym && sym_is_choice_value(sym)) {
+			struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym));
+			switch (sym->user.tri) {
+			case no:
+				break;
+			case mod:
+				if (cs->user.tri == yes)
+					/* warn? */;
+				break;
+			case yes:
+				if (cs->user.tri != no)
+					/* warn? */;
+				cs->user.val = sym;
+				break;
+			}
+			cs->user.tri = E_OR(cs->user.tri, sym->user.tri);
+			cs->flags &= ~SYMBOL_NEW;
+		}
+	}
+	fclose(in);
+
+	if (modules_sym)
+		sym_calc_value(modules_sym);
+	for_all_symbols(i, sym) {
+		sym_calc_value(sym);
+		if (sym_has_value(sym) && !sym_is_choice_value(sym)) {
+			if (sym->visible == no)
+				sym->flags |= SYMBOL_NEW;
+			switch (sym->type) {
+			case S_STRING:
+			case S_INT:
+			case S_HEX:
+				if (!sym_string_within_range(sym, sym->user.val))
+					sym->flags |= SYMBOL_NEW;
+			default:
+				break;
+			}
+		}
+		if (!sym_is_choice(sym))
+			continue;
+		prop = sym_get_choice_prop(sym);
+		for (e = prop->expr; e; e = e->left.expr)
+			if (e->right.sym->visible != no)
+				sym->flags |= e->right.sym->flags & SYMBOL_NEW;
+	}
+
+	sym_change_count = 1;
+
+	return 0;
+}
+
+int conf_write(const char *name)
+{
+	FILE *out, *out_h;
+	struct symbol *sym;
+	struct menu *menu;
+	const char *basename;
+	char dirname[128], tmpname[128], newname[128];
+	int type, l;
+	const char *str;
+
+	dirname[0] = 0;
+	if (name && name[0]) {
+		struct stat st;
+		char *slash;
+
+		if (!stat(name, &st) && S_ISDIR(st.st_mode)) {
+			strcpy(dirname, name);
+			strcat(dirname, "/");
+			basename = conf_def_filename;
+		} else if ((slash = strrchr(name, '/'))) {
+			int size = slash - name + 1;
+			memcpy(dirname, name, size);
+			dirname[size] = 0;
+			if (slash[1])
+				basename = slash + 1;
+			else
+				basename = conf_def_filename;
+		} else
+			basename = name;
+	} else
+		basename = conf_def_filename;
+
+	sprintf(newname, "%s.tmpconfig.%d", dirname, getpid());
+	out = fopen(newname, "w");
+	if (!out)
+		return 1;
+	out_h = NULL;
+	if (!name) {
+		out_h = fopen(".tmpconfig.h", "w");
+		if (!out_h)
+			return 1;
+	}
+	fprintf(out, "#\n"
+		     "# Automatically generated make config: don't edit\n"
+		     "#\n");
+	if (out_h) {
+		fprintf(out_h, "/*\n"
+			     " * Automatically generated header file: don't edit\n"
+			     " */\n\n"
+			     "#define AUTOCONF_INCLUDED\n\n"
+			     "/* Version Number */\n"
+			     "#define BB_VER \"%s\"\n"
+			     "#define BB_BT \"%s\"\n",
+			     getenv("VERSION"),
+			     getenv("BUILDTIME"));
+		if (getenv("EXTRA_VERSION"))
+			fprintf(out_h, "#define BB_EXTRA_VERSION \"%s\"\n",
+				     getenv("EXTRA_VERSION"));
+		fprintf(out_h, "\n");
+	}
+
+	if (!sym_change_count)
+		sym_clear_all_valid();
+
+	menu = rootmenu.list;
+	while (menu) {
+		sym = menu->sym;
+		if (!sym) {
+			if (!menu_is_visible(menu))
+				goto next;
+			str = menu_get_prompt(menu);
+			fprintf(out, "\n"
+				     "#\n"
+				     "# %s\n"
+				     "#\n", str);
+			if (out_h)
+				fprintf(out_h, "\n"
+					       "/*\n"
+					       " * %s\n"
+					       " */\n", str);
+		} else if (!(sym->flags & SYMBOL_CHOICE)) {
+			sym_calc_value(sym);
+			if (!(sym->flags & SYMBOL_WRITE) && !output_mode)
+				goto next;
+			sym->flags &= ~SYMBOL_WRITE;
+			type = sym->type;
+			if (type == S_TRISTATE) {
+				sym_calc_value(modules_sym);
+				if (modules_sym->curr.tri == no)
+					type = S_BOOLEAN;
+			}
+			switch (type) {
+			case S_BOOLEAN:
+			case S_TRISTATE:
+				switch (sym_get_tristate_value(sym)) {
+				case no:
+					fprintf(out, "# %s is not set\n", sym->name);
+					if (out_h)
+						fprintf(out_h, "#undef %s\n", sym->name);
+					break;
+				case mod:
+					fprintf(out, "%s=m\n", sym->name);
+#if 0
+					if (out_h)
+						fprintf(out_h, "#define %s_MODULE 1\n", sym->name);
+#endif
+					break;
+				case yes:
+					fprintf(out, "%s=y\n", sym->name);
+					if (out_h)
+						fprintf(out_h, "#define %s 1\n", sym->name);
+					break;
+				}
+				break;
+			case S_STRING:
+				// fix me
+				str = sym_get_string_value(sym);
+				fprintf(out, "%s=\"", sym->name);
+				if (out_h)
+					fprintf(out_h, "#define %s \"", sym->name);
+				do {
+					l = strcspn(str, "\"\\");
+					if (l) {
+						fwrite(str, l, 1, out);
+						if (out_h)
+							fwrite(str, l, 1, out_h);
+					}
+					str += l;
+					while (*str == '\\' || *str == '"') {
+						fprintf(out, "\\%c", *str);
+						if (out_h)
+							fprintf(out_h, "\\%c", *str);
+						str++;
+					}
+				} while (*str);
+				fputs("\"\n", out);
+				if (out_h)
+					fputs("\"\n", out_h);
+				break;
+			case S_HEX:
+				str = sym_get_string_value(sym);
+				if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
+					fprintf(out, "%s=%s\n", sym->name, str);
+					if (out_h)
+						fprintf(out_h, "#define %s 0x%s\n", sym->name, str);
+					break;
+				}
+			case S_INT:
+				str = sym_get_string_value(sym);
+				fprintf(out, "%s=%s\n", sym->name, str);
+				if (out_h)
+					fprintf(out_h, "#define %s %s\n", sym->name, str);
+				break;
+			}
+		}
+
+	next:
+		if (menu->list) {
+			menu = menu->list;
+			continue;
+		}
+		if (menu->next)
+			menu = menu->next;
+		else while ((menu = menu->parent)) {
+			if (menu->next) {
+				menu = menu->next;
+				break;
+			}
+		}
+	}
+	fclose(out);
+	if (out_h) {
+		fclose(out_h);
+		rename(".tmpconfig.h", "include/config.h");
+		file_write_dep(NULL);
+	}
+	if (!name || basename != conf_def_filename) {
+		if (!name)
+			name = conf_def_filename;
+		sprintf(tmpname, "%s.old", name);
+		rename(name, tmpname);
+	}
+	sprintf(tmpname, "%s%s", dirname, basename);
+	if (rename(newname, tmpname))
+		return 1;
+
+	sym_change_count = 0;
+
+	return 0;
+}

+ 196 - 0
config/dialog.h

@@ -0,0 +1,196 @@
+
+/*
+ *  dialog.h -- common declarations for all dialog modules
+ *
+ *  AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <sys/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef CURSES_LOC
+#include CURSES_LOC
+
+/*
+ * Colors in ncurses 1.9.9e do not work properly since foreground and
+ * background colors are OR'd rather than separately masked.  This version
+ * of dialog was hacked to work with ncurses 1.9.9e, making it incompatible
+ * with standard curses.  The simplest fix (to make this work with standard
+ * curses) uses the wbkgdset() function, not used in the original hack.
+ * Turn it off if we're building with 1.9.9e, since it just confuses things.
+ */
+#if defined(NCURSES_VERSION) && defined(_NEED_WRAP) && !defined(GCC_PRINTFLIKE)
+#define OLD_NCURSES 1
+#undef  wbkgdset
+#define wbkgdset(w,p) /*nothing*/
+#else
+#define OLD_NCURSES 0
+#endif
+
+#define TR(params) _tracef params
+
+#define ESC 27
+#define TAB 9
+#define MAX_LEN 2048
+#define BUF_SIZE (10*1024)
+#define MIN(x,y) (x < y ? x : y)
+#define MAX(x,y) (x > y ? x : y)
+
+
+#ifndef ACS_ULCORNER
+#define ACS_ULCORNER '+'
+#endif
+#ifndef ACS_LLCORNER
+#define ACS_LLCORNER '+'
+#endif
+#ifndef ACS_URCORNER
+#define ACS_URCORNER '+'
+#endif
+#ifndef ACS_LRCORNER
+#define ACS_LRCORNER '+'
+#endif
+#ifndef ACS_HLINE
+#define ACS_HLINE '-'
+#endif
+#ifndef ACS_VLINE
+#define ACS_VLINE '|'
+#endif
+#ifndef ACS_LTEE
+#define ACS_LTEE '+'
+#endif
+#ifndef ACS_RTEE
+#define ACS_RTEE '+'
+#endif
+#ifndef ACS_UARROW
+#define ACS_UARROW '^'
+#endif
+#ifndef ACS_DARROW
+#define ACS_DARROW 'v'
+#endif
+
+/*
+ * Attribute names
+ */
+#define screen_attr                   attributes[0]
+#define shadow_attr                   attributes[1]
+#define dialog_attr                   attributes[2]
+#define title_attr                    attributes[3]
+#define border_attr                   attributes[4]
+#define button_active_attr            attributes[5]
+#define button_inactive_attr          attributes[6]
+#define button_key_active_attr        attributes[7]
+#define button_key_inactive_attr      attributes[8]
+#define button_label_active_attr      attributes[9]
+#define button_label_inactive_attr    attributes[10]
+#define inputbox_attr                 attributes[11]
+#define inputbox_border_attr          attributes[12]
+#define searchbox_attr                attributes[13]
+#define searchbox_title_attr          attributes[14]
+#define searchbox_border_attr         attributes[15]
+#define position_indicator_attr       attributes[16]
+#define menubox_attr                  attributes[17]
+#define menubox_border_attr           attributes[18]
+#define item_attr                     attributes[19]
+#define item_selected_attr            attributes[20]
+#define tag_attr                      attributes[21]
+#define tag_selected_attr             attributes[22]
+#define tag_key_attr                  attributes[23]
+#define tag_key_selected_attr         attributes[24]
+#define check_attr                    attributes[25]
+#define check_selected_attr           attributes[26]
+#define uarrow_attr                   attributes[27]
+#define darrow_attr                   attributes[28]
+
+/* number of attributes */
+#define ATTRIBUTE_COUNT               29
+
+/*
+ * Global variables
+ */
+extern bool use_colors;
+
+extern chtype attributes[];
+#endif
+
+extern char *backtitle;
+
+struct dialog_list_item {
+	char *name;
+	int namelen;
+	char *tag;
+	int selected; /* Set to 1 by dialog_*() function. */
+};
+
+/*
+ * Function prototypes
+ */
+
+void init_dialog (void);
+void end_dialog (void);
+void dialog_clear (void);
+#ifdef CURSES_LOC
+void attr_clear (WINDOW * win, int height, int width, chtype attr);
+void color_setup (void);
+void print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x);
+void print_button (WINDOW * win, const char *label, int y, int x, int selected);
+void draw_box (WINDOW * win, int y, int x, int height, int width, chtype box,
+		chtype border);
+void draw_shadow (WINDOW * win, int y, int x, int height, int width);
+#endif
+
+int first_alpha (const char *string, const char *exempt);
+int dialog_yesno (const char *title, const char *prompt, int height, int width);
+int dialog_msgbox (const char *title, const char *prompt, int height,
+		int width, int pause);
+int dialog_textbox (const char *title, const char *file, int height, int width);
+int dialog_menu (const char *title, const char *prompt, int height, int width,
+		int menu_height, const char *choice, int item_no,
+		struct dialog_list_item ** items);
+int dialog_checklist (const char *title, const char *prompt, int height,
+		int width, int list_height, int item_no,
+		struct dialog_list_item ** items, int flag);
+extern unsigned char dialog_input_result[];
+int dialog_inputbox (const char *title, const char *prompt, int height,
+		int width, const char *init);
+
+struct dialog_list_item *first_sel_item(int item_no,
+		struct dialog_list_item ** items);
+
+/*
+ * This is the base for fictitious keys, which activate
+ * the buttons.
+ *
+ * Mouse-generated keys are the following:
+ *   -- the first 32 are used as numbers, in addition to '0'-'9'
+ *   -- the lowercase are used to signal mouse-enter events (M_EVENT + 'o')
+ *   -- uppercase chars are used to invoke the button (M_EVENT + 'O')
+ */
+#ifdef CURSES_LOC
+#define M_EVENT (KEY_MAX+1)
+#endif
+
+
+/*
+ * The `flag' parameter in checklist is used to select between
+ * radiolist and checklist
+ */
+#define FLAG_CHECK 1
+#define FLAG_RADIO 0

+ 1089 - 0
config/expr.c

@@ -0,0 +1,1089 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+#define DEBUG_EXPR	0
+
+struct expr *expr_alloc_symbol(struct symbol *sym)
+{
+	struct expr *e = malloc(sizeof(*e));
+	memset(e, 0, sizeof(*e));
+	e->type = E_SYMBOL;
+	e->left.sym = sym;
+	return e;
+}
+
+struct expr *expr_alloc_one(enum expr_type type, struct expr *ce)
+{
+	struct expr *e = malloc(sizeof(*e));
+	memset(e, 0, sizeof(*e));
+	e->type = type;
+	e->left.expr = ce;
+	return e;
+}
+
+struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2)
+{
+	struct expr *e = malloc(sizeof(*e));
+	memset(e, 0, sizeof(*e));
+	e->type = type;
+	e->left.expr = e1;
+	e->right.expr = e2;
+	return e;
+}
+
+struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2)
+{
+	struct expr *e = malloc(sizeof(*e));
+	memset(e, 0, sizeof(*e));
+	e->type = type;
+	e->left.sym = s1;
+	e->right.sym = s2;
+	return e;
+}
+
+struct expr *expr_alloc_and(struct expr *e1, struct expr *e2)
+{
+	if (!e1)
+		return e2;
+	return e2 ? expr_alloc_two(E_AND, e1, e2) : e1;
+}
+
+struct expr *expr_alloc_or(struct expr *e1, struct expr *e2)
+{
+	if (!e1)
+		return e2;
+	return e2 ? expr_alloc_two(E_OR, e1, e2) : e1;
+}
+
+struct expr *expr_copy(struct expr *org)
+{
+	struct expr *e;
+
+	if (!org)
+		return NULL;
+
+	e = malloc(sizeof(*org));
+	memcpy(e, org, sizeof(*org));
+	switch (org->type) {
+	case E_SYMBOL:
+		e->left = org->left;
+		break;
+	case E_NOT:
+		e->left.expr = expr_copy(org->left.expr);
+		break;
+	case E_EQUAL:
+	case E_UNEQUAL:
+		e->left.sym = org->left.sym;
+		e->right.sym = org->right.sym;
+		break;
+	case E_AND:
+	case E_OR:
+	case E_CHOICE:
+		e->left.expr = expr_copy(org->left.expr);
+		e->right.expr = expr_copy(org->right.expr);
+		break;
+	default:
+		printf("can't copy type %d\n", e->type);
+		free(e);
+		e = NULL;
+		break;
+	}
+
+	return e;
+}
+
+void expr_free(struct expr *e)
+{
+	if (!e)
+		return;
+
+	switch (e->type) {
+	case E_SYMBOL:
+		break;
+	case E_NOT:
+		expr_free(e->left.expr);
+		return;
+	case E_EQUAL:
+	case E_UNEQUAL:
+		break;
+	case E_OR:
+	case E_AND:
+		expr_free(e->left.expr);
+		expr_free(e->right.expr);
+		break;
+	default:
+		printf("how to free type %d?\n", e->type);
+		break;
+	}
+	free(e);
+}
+
+static int trans_count;
+
+#define e1 (*ep1)
+#define e2 (*ep2)
+
+static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct expr **ep2)
+{
+	if (e1->type == type) {
+		__expr_eliminate_eq(type, &e1->left.expr, &e2);
+		__expr_eliminate_eq(type, &e1->right.expr, &e2);
+		return;
+	}
+	if (e2->type == type) {
+		__expr_eliminate_eq(type, &e1, &e2->left.expr);
+		__expr_eliminate_eq(type, &e1, &e2->right.expr);
+		return;
+	}
+	if (e1->type == E_SYMBOL && e2->type == E_SYMBOL &&
+	    e1->left.sym == e2->left.sym && (e1->left.sym->flags & (SYMBOL_YES|SYMBOL_NO)))
+		return;
+	if (!expr_eq(e1, e2))
+		return;
+	trans_count++;
+	expr_free(e1); expr_free(e2);
+	switch (type) {
+	case E_OR:
+		e1 = expr_alloc_symbol(&symbol_no);
+		e2 = expr_alloc_symbol(&symbol_no);
+		break;
+	case E_AND:
+		e1 = expr_alloc_symbol(&symbol_yes);
+		e2 = expr_alloc_symbol(&symbol_yes);
+		break;
+	default:
+		;
+	}
+}
+
+void expr_eliminate_eq(struct expr **ep1, struct expr **ep2)
+{
+	if (!e1 || !e2)
+		return;
+	switch (e1->type) {
+	case E_OR:
+	case E_AND:
+		__expr_eliminate_eq(e1->type, ep1, ep2);
+	default:
+		;
+	}
+	if (e1->type != e2->type) switch (e2->type) {
+	case E_OR:
+	case E_AND:
+		__expr_eliminate_eq(e2->type, ep1, ep2);
+	default:
+		;
+	}
+	e1 = expr_eliminate_yn(e1);
+	e2 = expr_eliminate_yn(e2);
+}
+
+#undef e1
+#undef e2
+
+int expr_eq(struct expr *e1, struct expr *e2)
+{
+	int res, old_count;
+
+	if (e1->type != e2->type)
+		return 0;
+	switch (e1->type) {
+	case E_EQUAL:
+	case E_UNEQUAL:
+		return e1->left.sym == e2->left.sym && e1->right.sym == e2->right.sym;
+	case E_SYMBOL:
+		return e1->left.sym == e2->left.sym;
+	case E_NOT:
+		return expr_eq(e1->left.expr, e2->left.expr);
+	case E_AND:
+	case E_OR:
+		e1 = expr_copy(e1);
+		e2 = expr_copy(e2);
+		old_count = trans_count;
+		expr_eliminate_eq(&e1, &e2);
+		res = (e1->type == E_SYMBOL && e2->type == E_SYMBOL &&
+		       e1->left.sym == e2->left.sym);
+		expr_free(e1);
+		expr_free(e2);
+		trans_count = old_count;
+		return res;
+	case E_CHOICE:
+	case E_RANGE:
+	case E_NONE:
+		/* panic */;
+	}
+
+	if (DEBUG_EXPR) {
+		expr_fprint(e1, stdout);
+		printf(" = ");
+		expr_fprint(e2, stdout);
+		printf(" ?\n");
+	}
+
+	return 0;
+}
+
+struct expr *expr_eliminate_yn(struct expr *e)
+{
+	struct expr *tmp;
+
+	if (e) switch (e->type) {
+	case E_AND:
+		e->left.expr = expr_eliminate_yn(e->left.expr);
+		e->right.expr = expr_eliminate_yn(e->right.expr);
+		if (e->left.expr->type == E_SYMBOL) {
+			if (e->left.expr->left.sym == &symbol_no) {
+				expr_free(e->left.expr);
+				expr_free(e->right.expr);
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_no;
+				e->right.expr = NULL;
+				return e;
+			} else if (e->left.expr->left.sym == &symbol_yes) {
+				free(e->left.expr);
+				tmp = e->right.expr;
+				*e = *(e->right.expr);
+				free(tmp);
+				return e;
+			}
+		}
+		if (e->right.expr->type == E_SYMBOL) {
+			if (e->right.expr->left.sym == &symbol_no) {
+				expr_free(e->left.expr);
+				expr_free(e->right.expr);
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_no;
+				e->right.expr = NULL;
+				return e;
+			} else if (e->right.expr->left.sym == &symbol_yes) {
+				free(e->right.expr);
+				tmp = e->left.expr;
+				*e = *(e->left.expr);
+				free(tmp);
+				return e;
+			}
+		}
+		break;
+	case E_OR:
+		e->left.expr = expr_eliminate_yn(e->left.expr);
+		e->right.expr = expr_eliminate_yn(e->right.expr);
+		if (e->left.expr->type == E_SYMBOL) {
+			if (e->left.expr->left.sym == &symbol_no) {
+				free(e->left.expr);
+				tmp = e->right.expr;
+				*e = *(e->right.expr);
+				free(tmp);
+				return e;
+			} else if (e->left.expr->left.sym == &symbol_yes) {
+				expr_free(e->left.expr);
+				expr_free(e->right.expr);
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_yes;
+				e->right.expr = NULL;
+				return e;
+			}
+		}
+		if (e->right.expr->type == E_SYMBOL) {
+			if (e->right.expr->left.sym == &symbol_no) {
+				free(e->right.expr);
+				tmp = e->left.expr;
+				*e = *(e->left.expr);
+				free(tmp);
+				return e;
+			} else if (e->right.expr->left.sym == &symbol_yes) {
+				expr_free(e->left.expr);
+				expr_free(e->right.expr);
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_yes;
+				e->right.expr = NULL;
+				return e;
+			}
+		}
+		break;
+	default:
+		;
+	}
+	return e;
+}
+
+/*
+ * bool FOO!=n => FOO
+ */
+struct expr *expr_trans_bool(struct expr *e)
+{
+	if (!e)
+		return NULL;
+	switch (e->type) {
+	case E_AND:
+	case E_OR:
+	case E_NOT:
+		e->left.expr = expr_trans_bool(e->left.expr);
+		e->right.expr = expr_trans_bool(e->right.expr);
+		break;
+	case E_UNEQUAL:
+		// FOO!=n -> FOO
+		if (e->left.sym->type == S_TRISTATE) {
+			if (e->right.sym == &symbol_no) {
+				e->type = E_SYMBOL;
+				e->right.sym = NULL;
+			}
+		}
+		break;
+	default:
+		;
+	}
+	return e;
+}
+
+/*
+ * e1 || e2 -> ?
+ */
+struct expr *expr_join_or(struct expr *e1, struct expr *e2)
+{
+	struct expr *tmp;
+	struct symbol *sym1, *sym2;
+
+	if (expr_eq(e1, e2))
+		return expr_copy(e1);
+	if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT)
+		return NULL;
+	if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT)
+		return NULL;
+	if (e1->type == E_NOT) {
+		tmp = e1->left.expr;
+		if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL)
+			return NULL;
+		sym1 = tmp->left.sym;
+	} else
+		sym1 = e1->left.sym;
+	if (e2->type == E_NOT) {
+		if (e2->left.expr->type != E_SYMBOL)
+			return NULL;
+		sym2 = e2->left.expr->left.sym;
+	} else
+		sym2 = e2->left.sym;
+	if (sym1 != sym2)
+		return NULL;
+	if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE)
+		return NULL;
+	if (sym1->type == S_TRISTATE) {
+		if (e1->type == E_EQUAL && e2->type == E_EQUAL &&
+		    ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) ||
+		     (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes))) {
+			// (a='y') || (a='m') -> (a!='n')
+			return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_no);
+		}
+		if (e1->type == E_EQUAL && e2->type == E_EQUAL &&
+		    ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) ||
+		     (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes))) {
+			// (a='y') || (a='n') -> (a!='m')
+			return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_mod);
+		}
+		if (e1->type == E_EQUAL && e2->type == E_EQUAL &&
+		    ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) ||
+		     (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod))) {
+			// (a='m') || (a='n') -> (a!='y')
+			return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_yes);
+		}
+	}
+	if (sym1->type == S_BOOLEAN && sym1 == sym2) {
+		if ((e1->type == E_NOT && e1->left.expr->type == E_SYMBOL && e2->type == E_SYMBOL) ||
+		    (e2->type == E_NOT && e2->left.expr->type == E_SYMBOL && e1->type == E_SYMBOL))
+			return expr_alloc_symbol(&symbol_yes);
+	}
+
+	if (DEBUG_EXPR) {
+		printf("optimize (");
+		expr_fprint(e1, stdout);
+		printf(") || (");
+		expr_fprint(e2, stdout);
+		printf(")?\n");
+	}
+	return NULL;
+}
+
+struct expr *expr_join_and(struct expr *e1, struct expr *e2)
+{
+	struct expr *tmp;
+	struct symbol *sym1, *sym2;
+
+	if (expr_eq(e1, e2))
+		return expr_copy(e1);
+	if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT)
+		return NULL;
+	if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT)
+		return NULL;
+	if (e1->type == E_NOT) {
+		tmp = e1->left.expr;
+		if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL)
+			return NULL;
+		sym1 = tmp->left.sym;
+	} else
+		sym1 = e1->left.sym;
+	if (e2->type == E_NOT) {
+		if (e2->left.expr->type != E_SYMBOL)
+			return NULL;
+		sym2 = e2->left.expr->left.sym;
+	} else
+		sym2 = e2->left.sym;
+	if (sym1 != sym2)
+		return NULL;
+	if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE)
+		return NULL;
+
+	if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_yes) ||
+	    (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_yes))
+		// (a) && (a='y') -> (a='y')
+		return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes);
+
+	if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_no) ||
+	    (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_no))
+		// (a) && (a!='n') -> (a)
+		return expr_alloc_symbol(sym1);
+
+	if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_mod) ||
+	    (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_mod))
+		// (a) && (a!='m') -> (a='y')
+		return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes);
+
+	if (sym1->type == S_TRISTATE) {
+		if (e1->type == E_EQUAL && e2->type == E_UNEQUAL) {
+			// (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b'
+			sym2 = e1->right.sym;
+			if ((e2->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST))
+				return sym2 != e2->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2)
+							     : expr_alloc_symbol(&symbol_no);
+		}
+		if (e1->type == E_UNEQUAL && e2->type == E_EQUAL) {
+			// (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b'
+			sym2 = e2->right.sym;
+			if ((e1->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST))
+				return sym2 != e1->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2)
+							     : expr_alloc_symbol(&symbol_no);
+		}
+		if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL &&
+			   ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) ||
+			    (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes)))
+			// (a!='y') && (a!='n') -> (a='m')
+			return expr_alloc_comp(E_EQUAL, sym1, &symbol_mod);
+
+		if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL &&
+			   ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) ||
+			    (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes)))
+			// (a!='y') && (a!='m') -> (a='n')
+			return expr_alloc_comp(E_EQUAL, sym1, &symbol_no);
+
+		if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL &&
+			   ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) ||
+			    (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod)))
+			// (a!='m') && (a!='n') -> (a='m')
+			return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes);
+
+		if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_mod) ||
+		    (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_mod) ||
+		    (e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_yes) ||
+		    (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_yes))
+			return NULL;
+	}
+
+	if (DEBUG_EXPR) {
+		printf("optimize (");
+		expr_fprint(e1, stdout);
+		printf(") && (");
+		expr_fprint(e2, stdout);
+		printf(")?\n");
+	}
+	return NULL;
+}
+
+static void expr_eliminate_dups1(enum expr_type type, struct expr **ep1, struct expr **ep2)
+{
+#define e1 (*ep1)
+#define e2 (*ep2)
+	struct expr *tmp;
+
+	if (e1->type == type) {
+		expr_eliminate_dups1(type, &e1->left.expr, &e2);
+		expr_eliminate_dups1(type, &e1->right.expr, &e2);
+		return;
+	}
+	if (e2->type == type) {
+		expr_eliminate_dups1(type, &e1, &e2->left.expr);
+		expr_eliminate_dups1(type, &e1, &e2->right.expr);
+		return;
+	}
+	if (e1 == e2)
+		return;
+
+	switch (e1->type) {
+	case E_OR: case E_AND:
+		expr_eliminate_dups1(e1->type, &e1, &e1);
+	default:
+		;
+	}
+
+	switch (type) {
+	case E_OR:
+		tmp = expr_join_or(e1, e2);
+		if (tmp) {
+			expr_free(e1); expr_free(e2);
+			e1 = expr_alloc_symbol(&symbol_no);
+			e2 = tmp;
+			trans_count++;
+		}
+		break;
+	case E_AND:
+		tmp = expr_join_and(e1, e2);
+		if (tmp) {
+			expr_free(e1); expr_free(e2);
+			e1 = expr_alloc_symbol(&symbol_yes);
+			e2 = tmp;
+			trans_count++;
+		}
+		break;
+	default:
+		;
+	}
+#undef e1
+#undef e2
+}
+
+static void expr_eliminate_dups2(enum expr_type type, struct expr **ep1, struct expr **ep2)
+{
+#define e1 (*ep1)
+#define e2 (*ep2)
+	struct expr *tmp, *tmp1, *tmp2;
+
+	if (e1->type == type) {
+		expr_eliminate_dups2(type, &e1->left.expr, &e2);
+		expr_eliminate_dups2(type, &e1->right.expr, &e2);
+		return;
+	}
+	if (e2->type == type) {
+		expr_eliminate_dups2(type, &e1, &e2->left.expr);
+		expr_eliminate_dups2(type, &e1, &e2->right.expr);
+	}
+	if (e1 == e2)
+		return;
+
+	switch (e1->type) {
+	case E_OR:
+		expr_eliminate_dups2(e1->type, &e1, &e1);
+		// (FOO || BAR) && (!FOO && !BAR) -> n
+		tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1)));
+		tmp2 = expr_copy(e2);
+		tmp = expr_extract_eq_and(&tmp1, &tmp2);
+		if (expr_is_yes(tmp1)) {
+			expr_free(e1);
+			e1 = expr_alloc_symbol(&symbol_no);
+			trans_count++;
+		}
+		expr_free(tmp2);
+		expr_free(tmp1);
+		expr_free(tmp);
+		break;
+	case E_AND:
+		expr_eliminate_dups2(e1->type, &e1, &e1);
+		// (FOO && BAR) || (!FOO || !BAR) -> y
+		tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1)));
+		tmp2 = expr_copy(e2);
+		tmp = expr_extract_eq_or(&tmp1, &tmp2);
+		if (expr_is_no(tmp1)) {
+			expr_free(e1);
+			e1 = expr_alloc_symbol(&symbol_yes);
+			trans_count++;
+		}
+		expr_free(tmp2);
+		expr_free(tmp1);
+		expr_free(tmp);
+		break;
+	default:
+		;
+	}
+#undef e1
+#undef e2
+}
+
+struct expr *expr_eliminate_dups(struct expr *e)
+{
+	int oldcount;
+	if (!e)
+		return e;
+
+	oldcount = trans_count;
+	while (1) {
+		trans_count = 0;
+		switch (e->type) {
+		case E_OR: case E_AND:
+			expr_eliminate_dups1(e->type, &e, &e);
+			expr_eliminate_dups2(e->type, &e, &e);
+		default:
+			;
+		}
+		if (!trans_count)
+			break;
+		e = expr_eliminate_yn(e);
+	}
+	trans_count = oldcount;
+	return e;
+}
+
+struct expr *expr_transform(struct expr *e)
+{
+	struct expr *tmp;
+
+	if (!e)
+		return NULL;
+	switch (e->type) {
+	case E_EQUAL:
+	case E_UNEQUAL:
+	case E_SYMBOL:
+	case E_CHOICE:
+		break;
+	default:
+		e->left.expr = expr_transform(e->left.expr);
+		e->right.expr = expr_transform(e->right.expr);
+	}
+
+	switch (e->type) {
+	case E_EQUAL:
+		if (e->left.sym->type != S_BOOLEAN)
+			break;
+		if (e->right.sym == &symbol_no) {
+			e->type = E_NOT;
+			e->left.expr = expr_alloc_symbol(e->left.sym);
+			e->right.sym = NULL;
+			break;
+		}
+		if (e->right.sym == &symbol_mod) {
+			printf("boolean symbol %s tested for 'm'? test forced to 'n'\n", e->left.sym->name);
+			e->type = E_SYMBOL;
+			e->left.sym = &symbol_no;
+			e->right.sym = NULL;
+			break;
+		}
+		if (e->right.sym == &symbol_yes) {
+			e->type = E_SYMBOL;
+			e->right.sym = NULL;
+			break;
+		}
+		break;
+	case E_UNEQUAL:
+		if (e->left.sym->type != S_BOOLEAN)
+			break;
+		if (e->right.sym == &symbol_no) {
+			e->type = E_SYMBOL;
+			e->right.sym = NULL;
+			break;
+		}
+		if (e->right.sym == &symbol_mod) {
+			printf("boolean symbol %s tested for 'm'? test forced to 'y'\n", e->left.sym->name);
+			e->type = E_SYMBOL;
+			e->left.sym = &symbol_yes;
+			e->right.sym = NULL;
+			break;
+		}
+		if (e->right.sym == &symbol_yes) {
+			e->type = E_NOT;
+			e->left.expr = expr_alloc_symbol(e->left.sym);
+			e->right.sym = NULL;
+			break;
+		}
+		break;
+	case E_NOT:
+		switch (e->left.expr->type) {
+		case E_NOT:
+			// !!a -> a
+			tmp = e->left.expr->left.expr;
+			free(e->left.expr);
+			free(e);
+			e = tmp;
+			e = expr_transform(e);
+			break;
+		case E_EQUAL:
+		case E_UNEQUAL:
+			// !a='x' -> a!='x'
+			tmp = e->left.expr;
+			free(e);
+			e = tmp;
+			e->type = e->type == E_EQUAL ? E_UNEQUAL : E_EQUAL;
+			break;
+		case E_OR:
+			// !(a || b) -> !a && !b
+			tmp = e->left.expr;
+			e->type = E_AND;
+			e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr);
+			tmp->type = E_NOT;
+			tmp->right.expr = NULL;
+			e = expr_transform(e);
+			break;
+		case E_AND:
+			// !(a && b) -> !a || !b
+			tmp = e->left.expr;
+			e->type = E_OR;
+			e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr);
+			tmp->type = E_NOT;
+			tmp->right.expr = NULL;
+			e = expr_transform(e);
+			break;
+		case E_SYMBOL:
+			if (e->left.expr->left.sym == &symbol_yes) {
+				// !'y' -> 'n'
+				tmp = e->left.expr;
+				free(e);
+				e = tmp;
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_no;
+				break;
+			}
+			if (e->left.expr->left.sym == &symbol_mod) {
+				// !'m' -> 'm'
+				tmp = e->left.expr;
+				free(e);
+				e = tmp;
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_mod;
+				break;
+			}
+			if (e->left.expr->left.sym == &symbol_no) {
+				// !'n' -> 'y'
+				tmp = e->left.expr;
+				free(e);
+				e = tmp;
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_yes;
+				break;
+			}
+			break;
+		default:
+			;
+		}
+		break;
+	default:
+		;
+	}
+	return e;
+}
+
+int expr_contains_symbol(struct expr *dep, struct symbol *sym)
+{
+	if (!dep)
+		return 0;
+
+	switch (dep->type) {
+	case E_AND:
+	case E_OR:
+		return expr_contains_symbol(dep->left.expr, sym) ||
+		       expr_contains_symbol(dep->right.expr, sym);
+	case E_SYMBOL:
+		return dep->left.sym == sym;
+	case E_EQUAL:
+	case E_UNEQUAL:
+		return dep->left.sym == sym ||
+		       dep->right.sym == sym;
+	case E_NOT:
+		return expr_contains_symbol(dep->left.expr, sym);
+	default:
+		;
+	}
+	return 0;
+}
+
+bool expr_depends_symbol(struct expr *dep, struct symbol *sym)
+{
+	if (!dep)
+		return false;
+
+	switch (dep->type) {
+	case E_AND:
+		return expr_depends_symbol(dep->left.expr, sym) ||
+		       expr_depends_symbol(dep->right.expr, sym);
+	case E_SYMBOL:
+		return dep->left.sym == sym;
+	case E_EQUAL:
+		if (dep->left.sym == sym) {
+			if (dep->right.sym == &symbol_yes || dep->right.sym == &symbol_mod)
+				return true;
+		}
+		break;
+	case E_UNEQUAL:
+		if (dep->left.sym == sym) {
+			if (dep->right.sym == &symbol_no)
+				return true;
+		}
+		break;
+	default:
+		;
+	}
+ 	return false;
+}
+
+struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2)
+{
+	struct expr *tmp = NULL;
+	expr_extract_eq(E_AND, &tmp, ep1, ep2);
+	if (tmp) {
+		*ep1 = expr_eliminate_yn(*ep1);
+		*ep2 = expr_eliminate_yn(*ep2);
+	}
+	return tmp;
+}
+
+struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2)
+{
+	struct expr *tmp = NULL;
+	expr_extract_eq(E_OR, &tmp, ep1, ep2);
+	if (tmp) {
+		*ep1 = expr_eliminate_yn(*ep1);
+		*ep2 = expr_eliminate_yn(*ep2);
+	}
+	return tmp;
+}
+
+void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2)
+{
+#define e1 (*ep1)
+#define e2 (*ep2)
+	if (e1->type == type) {
+		expr_extract_eq(type, ep, &e1->left.expr, &e2);
+		expr_extract_eq(type, ep, &e1->right.expr, &e2);
+		return;
+	}
+	if (e2->type == type) {
+		expr_extract_eq(type, ep, ep1, &e2->left.expr);
+		expr_extract_eq(type, ep, ep1, &e2->right.expr);
+		return;
+	}
+	if (expr_eq(e1, e2)) {
+		*ep = *ep ? expr_alloc_two(type, *ep, e1) : e1;
+		expr_free(e2);
+		if (type == E_AND) {
+			e1 = expr_alloc_symbol(&symbol_yes);
+			e2 = expr_alloc_symbol(&symbol_yes);
+		} else if (type == E_OR) {
+			e1 = expr_alloc_symbol(&symbol_no);
+			e2 = expr_alloc_symbol(&symbol_no);
+		}
+	}
+#undef e1
+#undef e2
+}
+
+struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym)
+{
+	struct expr *e1, *e2;
+
+	if (!e) {
+		e = expr_alloc_symbol(sym);
+		if (type == E_UNEQUAL)
+			e = expr_alloc_one(E_NOT, e);
+		return e;
+	}
+	switch (e->type) {
+	case E_AND:
+		e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym);
+		e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym);
+		if (sym == &symbol_yes)
+			e = expr_alloc_two(E_AND, e1, e2);
+		if (sym == &symbol_no)
+			e = expr_alloc_two(E_OR, e1, e2);
+		if (type == E_UNEQUAL)
+			e = expr_alloc_one(E_NOT, e);
+		return e;
+	case E_OR:
+		e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym);
+		e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym);
+		if (sym == &symbol_yes)
+			e = expr_alloc_two(E_OR, e1, e2);
+		if (sym == &symbol_no)
+			e = expr_alloc_two(E_AND, e1, e2);
+		if (type == E_UNEQUAL)
+			e = expr_alloc_one(E_NOT, e);
+		return e;
+	case E_NOT:
+		return expr_trans_compare(e->left.expr, type == E_EQUAL ? E_UNEQUAL : E_EQUAL, sym);
+	case E_UNEQUAL:
+	case E_EQUAL:
+		if (type == E_EQUAL) {
+			if (sym == &symbol_yes)
+				return expr_copy(e);
+			if (sym == &symbol_mod)
+				return expr_alloc_symbol(&symbol_no);
+			if (sym == &symbol_no)
+				return expr_alloc_one(E_NOT, expr_copy(e));
+		} else {
+			if (sym == &symbol_yes)
+				return expr_alloc_one(E_NOT, expr_copy(e));
+			if (sym == &symbol_mod)
+				return expr_alloc_symbol(&symbol_yes);
+			if (sym == &symbol_no)
+				return expr_copy(e);
+		}
+		break;
+	case E_SYMBOL:
+		return expr_alloc_comp(type, e->left.sym, sym);
+	case E_CHOICE:
+	case E_RANGE:
+	case E_NONE:
+		/* panic */;
+	}
+	return NULL;
+}
+
+tristate expr_calc_value(struct expr *e)
+{
+	tristate val1, val2;
+	const char *str1, *str2;
+
+	if (!e)
+		return yes;
+
+	switch (e->type) {
+	case E_SYMBOL:
+		sym_calc_value(e->left.sym);
+		return e->left.sym->curr.tri;
+	case E_AND:
+		val1 = expr_calc_value(e->left.expr);
+		val2 = expr_calc_value(e->right.expr);
+		return E_AND(val1, val2);
+	case E_OR:
+		val1 = expr_calc_value(e->left.expr);
+		val2 = expr_calc_value(e->right.expr);
+		return E_OR(val1, val2);
+	case E_NOT:
+		val1 = expr_calc_value(e->left.expr);
+		return E_NOT(val1);
+	case E_EQUAL:
+		sym_calc_value(e->left.sym);
+		sym_calc_value(e->right.sym);
+		str1 = sym_get_string_value(e->left.sym);
+		str2 = sym_get_string_value(e->right.sym);
+		return !strcmp(str1, str2) ? yes : no;
+	case E_UNEQUAL:
+		sym_calc_value(e->left.sym);
+		sym_calc_value(e->right.sym);
+		str1 = sym_get_string_value(e->left.sym);
+		str2 = sym_get_string_value(e->right.sym);
+		return !strcmp(str1, str2) ? no : yes;
+	default:
+		printf("expr_calc_value: %d?\n", e->type);
+		return no;
+	}
+}
+
+int expr_compare_type(enum expr_type t1, enum expr_type t2)
+{
+#if 0
+	return 1;
+#else
+	if (t1 == t2)
+		return 0;
+	switch (t1) {
+	case E_EQUAL:
+	case E_UNEQUAL:
+		if (t2 == E_NOT)
+			return 1;
+	case E_NOT:
+		if (t2 == E_AND)
+			return 1;
+	case E_AND:
+		if (t2 == E_OR)
+			return 1;
+	case E_OR:
+		if (t2 == E_CHOICE)
+			return 1;
+	case E_CHOICE:
+		if (t2 == 0)
+			return 1;
+	default:
+		return -1;
+	}
+	printf("[%dgt%d?]", t1, t2);
+	return 0;
+#endif
+}
+
+void expr_print(struct expr *e, void (*fn)(void *, const char *), void *data, int prevtoken)
+{
+	if (!e) {
+		fn(data, "y");
+		return;
+	}
+
+	if (expr_compare_type(prevtoken, e->type) > 0)
+		fn(data, "(");
+	switch (e->type) {
+	case E_SYMBOL:
+		if (e->left.sym->name)
+			fn(data, e->left.sym->name);
+		else
+			fn(data, "<choice>");
+		break;
+	case E_NOT:
+		fn(data, "!");
+		expr_print(e->left.expr, fn, data, E_NOT);
+		break;
+	case E_EQUAL:
+		fn(data, e->left.sym->name);
+		fn(data, "=");
+		fn(data, e->right.sym->name);
+		break;
+	case E_UNEQUAL:
+		fn(data, e->left.sym->name);
+		fn(data, "!=");
+		fn(data, e->right.sym->name);
+		break;
+	case E_OR:
+		expr_print(e->left.expr, fn, data, E_OR);
+		fn(data, " || ");
+		expr_print(e->right.expr, fn, data, E_OR);
+		break;
+	case E_AND:
+		expr_print(e->left.expr, fn, data, E_AND);
+		fn(data, " && ");
+		expr_print(e->right.expr, fn, data, E_AND);
+		break;
+	case E_CHOICE:
+		fn(data, e->right.sym->name);
+		if (e->left.expr) {
+			fn(data, " ^ ");
+			expr_print(e->left.expr, fn, data, E_CHOICE);
+		}
+		break;
+	case E_RANGE:
+		fn(data, "[");
+		fn(data, e->left.sym->name);
+		fn(data, " ");
+		fn(data, e->right.sym->name);
+		fn(data, "]");
+		break;
+	default:
+	  {
+		char buf[32];
+		sprintf(buf, "<unknown type %d>", e->type);
+		fn(data, buf);
+		break;
+	  }
+	}
+	if (expr_compare_type(prevtoken, e->type) > 0)
+		fn(data, ")");
+}
+
+static void expr_print_file_helper(void *data, const char *str)
+{
+	fwrite(str, strlen(str), 1, data);
+}
+
+void expr_fprint(struct expr *e, FILE *out)
+{
+	expr_print(e, expr_print_file_helper, out, E_NONE);
+}

+ 194 - 0
config/expr.h

@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#ifndef EXPR_H
+#define EXPR_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdio.h>
+#ifndef __cplusplus
+#include <stdbool.h>
+#endif
+
+struct file {
+	struct file *next;
+	struct file *parent;
+	char *name;
+	int lineno;
+	int flags;
+};
+
+#define FILE_BUSY		0x0001
+#define FILE_SCANNED		0x0002
+#define FILE_PRINTED		0x0004
+
+typedef enum tristate {
+	no, mod, yes
+} tristate;
+
+enum expr_type {
+	E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_CHOICE, E_SYMBOL, E_RANGE
+};
+
+union expr_data {
+	struct expr *expr;
+	struct symbol *sym;
+};
+
+struct expr {
+	enum expr_type type;
+	union expr_data left, right;
+};
+
+#define E_OR(dep1, dep2)	(((dep1)>(dep2))?(dep1):(dep2))
+#define E_AND(dep1, dep2)	(((dep1)<(dep2))?(dep1):(dep2))
+#define E_NOT(dep)		(2-(dep))
+
+struct expr_value {
+	struct expr *expr;
+	tristate tri;
+};
+
+struct symbol_value {
+	void *val;
+	tristate tri;
+};
+
+enum symbol_type {
+	S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING, S_OTHER
+};
+
+struct symbol {
+	struct symbol *next;
+	char *name;
+	char *help;
+	enum symbol_type type;
+	struct symbol_value curr, user;
+	tristate visible;
+	int flags;
+	struct property *prop;
+	struct expr *dep, *dep2;
+	struct expr_value rev_dep;
+	struct expr_value rev_dep_inv;
+};
+
+#define for_all_symbols(i, sym) for (i = 0; i < 257; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER)
+
+#define SYMBOL_YES		0x0001
+#define SYMBOL_MOD		0x0002
+#define SYMBOL_NO		0x0004
+#define SYMBOL_CONST		0x0007
+#define SYMBOL_CHECK		0x0008
+#define SYMBOL_CHOICE		0x0010
+#define SYMBOL_CHOICEVAL	0x0020
+#define SYMBOL_PRINTED		0x0040
+#define SYMBOL_VALID		0x0080
+#define SYMBOL_OPTIONAL		0x0100
+#define SYMBOL_WRITE		0x0200
+#define SYMBOL_CHANGED		0x0400
+#define SYMBOL_NEW		0x0800
+#define SYMBOL_AUTO		0x1000
+#define SYMBOL_CHECKED		0x2000
+#define SYMBOL_CHECK_DONE	0x4000
+#define SYMBOL_WARNED		0x8000
+
+#define SYMBOL_MAXLENGTH	256
+#define SYMBOL_HASHSIZE		257
+#define SYMBOL_HASHMASK		0xff
+
+enum prop_type {
+	P_UNKNOWN, P_PROMPT, P_COMMENT, P_MENU, P_DEFAULT, P_CHOICE, P_SELECT, P_SELECTNOT, P_RANGE
+};
+
+struct property {
+	struct property *next;
+	struct symbol *sym;
+	enum prop_type type;
+	const char *text;
+	struct expr_value visible;
+	struct expr *expr;
+	struct menu *menu;
+	struct file *file;
+	int lineno;
+};
+
+#define for_all_properties(sym, st, tok) \
+	for (st = sym->prop; st; st = st->next) \
+		if (st->type == (tok))
+#define for_all_defaults(sym, st) for_all_properties(sym, st, P_DEFAULT)
+#define for_all_choices(sym, st) for_all_properties(sym, st, P_CHOICE)
+#define for_all_prompts(sym, st) \
+	for (st = sym->prop; st; st = st->next) \
+		if (st->text)
+
+struct menu {
+	struct menu *next;
+	struct menu *parent;
+	struct menu *list;
+	struct symbol *sym;
+	struct property *prompt;
+	struct expr *dep;
+	unsigned int flags;
+	//char *help;
+	struct file *file;
+	int lineno;
+	void *data;
+};
+
+#define MENU_CHANGED		0x0001
+#define MENU_ROOT		0x0002
+
+#ifndef SWIG
+
+extern struct file *file_list;
+extern struct file *current_file;
+struct file *lookup_file(const char *name);
+
+extern struct symbol symbol_yes, symbol_no, symbol_mod;
+extern struct symbol *modules_sym;
+extern int cdebug;
+struct expr *expr_alloc_symbol(struct symbol *sym);
+struct expr *expr_alloc_one(enum expr_type type, struct expr *ce);
+struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2);
+struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2);
+struct expr *expr_alloc_and(struct expr *e1, struct expr *e2);
+struct expr *expr_alloc_or(struct expr *e1, struct expr *e2);
+struct expr *expr_copy(struct expr *org);
+void expr_free(struct expr *e);
+int expr_eq(struct expr *e1, struct expr *e2);
+void expr_eliminate_eq(struct expr **ep1, struct expr **ep2);
+tristate expr_calc_value(struct expr *e);
+struct expr *expr_eliminate_yn(struct expr *e);
+struct expr *expr_trans_bool(struct expr *e);
+struct expr *expr_eliminate_dups(struct expr *e);
+struct expr *expr_transform(struct expr *e);
+int expr_contains_symbol(struct expr *dep, struct symbol *sym);
+bool expr_depends_symbol(struct expr *dep, struct symbol *sym);
+struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2);
+struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2);
+void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2);
+struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym);
+
+void expr_fprint(struct expr *e, FILE *out);
+
+static inline int expr_is_yes(struct expr *e)
+{
+	return !e || (e->type == E_SYMBOL && e->left.sym == &symbol_yes);
+}
+
+static inline int expr_is_no(struct expr *e)
+{
+	return e && (e->type == E_SYMBOL && e->left.sym == &symbol_no);
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* EXPR_H */

+ 848 - 0
config/glob.c

@@ -0,0 +1,848 @@
+/*	$OpenBSD: glob.c,v 1.25 2005/08/08 08:05:34 espie Exp $ */
+/*
+ * Copyright (c) 1989, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Guido van Rossum.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * glob(3) -- a superset of the one defined in POSIX 1003.2.
+ *
+ * The [!...] convention to negate a range is supported (SysV, Posix, ksh).
+ *
+ * Optional extra services, controlled by flags not defined by POSIX:
+ *
+ * GLOB_QUOTE:
+ *	Escaping convention: \ inhibits any special meaning the following
+ *	character might have (except \ at end of string is retained).
+ * GLOB_MAGCHAR:
+ *	Set in gl_flags if pattern contained a globbing character.
+ * GLOB_NOMAGIC:
+ *	Same as GLOB_NOCHECK, but it will only append pattern if it did
+ *	not contain any magic characters.  [Used in csh style globbing]
+ * GLOB_ALTDIRFUNC:
+ *	Use alternately specified directory access functions.
+ * GLOB_TILDE:
+ *	expand ~user/foo to the /home/dir/of/user/foo
+ * GLOB_BRACE:
+ *	expand {1,2}{a,b} to 1a 1b 2a 2b
+ * gl_matchc:
+ *	Number of matches in the current invocation of glob.
+ */
+
+#ifdef __APPLE__
+#include <sys/param.h>
+#include <sys/stat.h>
+
+#include <ctype.h>
+#include <dirent.h>
+#include <errno.h>
+#include <glob.h>
+#include <pwd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#define	DOLLAR		'$'
+#define	DOT		'.'
+#define	EOS		'\0'
+#define	LBRACKET	'['
+#define	NOT		'!'
+#define	QUESTION	'?'
+#define	QUOTE		'\\'
+#define	RANGE		'-'
+#define	RBRACKET	']'
+#define	SEP		'/'
+#define	STAR		'*'
+#define	TILDE		'~'
+#define	UNDERSCORE	'_'
+#define	LBRACE		'{'
+#define	RBRACE		'}'
+#define	SLASH		'/'
+#define	COMMA		','
+
+#ifndef DEBUG
+
+#define	M_QUOTE		0x8000
+#define	M_PROTECT	0x4000
+#define	M_MASK		0xffff
+#define	M_ASCII		0x00ff
+
+typedef u_short Char;
+
+#else
+
+#define	M_QUOTE		0x80
+#define	M_PROTECT	0x40
+#define	M_MASK		0xff
+#define	M_ASCII		0x7f
+
+typedef char Char;
+
+#endif
+
+
+#define	CHAR(c)		((Char)((c)&M_ASCII))
+#define	META(c)		((Char)((c)|M_QUOTE))
+#define	M_ALL		META('*')
+#define	M_END		META(']')
+#define	M_NOT		META('!')
+#define	M_ONE		META('?')
+#define	M_RNG		META('-')
+#define	M_SET		META('[')
+#define	ismeta(c)	(((c)&M_QUOTE) != 0)
+
+
+static int	 compare(const void *, const void *);
+static int	 g_Ctoc(const Char *, char *, u_int);
+static int	 g_lstat(Char *, struct stat *, glob_t *);
+static DIR	*g_opendir(Char *, glob_t *);
+static const Char *g_strchr(const Char *, int);
+static int	 g_stat(Char *, struct stat *, glob_t *);
+static int	 glob0(const Char *, glob_t *);
+static int	 glob1(Char *, Char *, glob_t *, size_t *);
+static int	 glob2(Char *, Char *, Char *, Char *, Char *, Char *,
+		    glob_t *, size_t *);
+static int	 glob3(Char *, Char *, Char *, Char *, Char *, Char *,
+		    Char *, Char *, glob_t *, size_t *);
+static int	 globextend(const Char *, glob_t *, size_t *);
+static const Char *
+		 globtilde(const Char *, Char *, size_t, glob_t *);
+static int	 globexp1(const Char *, glob_t *);
+static int	 globexp2(const Char *, const Char *, glob_t *, int *);
+static int	 match(Char *, Char *, Char *);
+#ifdef DEBUG
+static void	 qprintf(const char *, Char *);
+#endif
+
+int
+glob(const char *pattern, int flags, int (*errfunc)(const char *, int),
+    glob_t *pglob)
+{
+	const u_char *patnext;
+	int c;
+	Char *bufnext, *bufend, patbuf[MAXPATHLEN];
+
+	patnext = (const u_char *) pattern;
+	if (!(flags & GLOB_APPEND)) {
+		pglob->gl_pathc = 0;
+		pglob->gl_pathv = NULL;
+		if (!(flags & GLOB_DOOFFS))
+			pglob->gl_offs = 0;
+	}
+	pglob->gl_flags = flags & ~GLOB_MAGCHAR;
+	pglob->gl_errfunc = errfunc;
+	pglob->gl_matchc = 0;
+
+	bufnext = patbuf;
+	bufend = bufnext + MAXPATHLEN - 1;
+	if (flags & GLOB_NOESCAPE)
+		while (bufnext < bufend && (c = *patnext++) != EOS)
+			*bufnext++ = c;
+	else {
+		/* Protect the quoted characters. */
+		while (bufnext < bufend && (c = *patnext++) != EOS)
+			if (c == QUOTE) {
+				if ((c = *patnext++) == EOS) {
+					c = QUOTE;
+					--patnext;
+				}
+				*bufnext++ = c | M_PROTECT;
+			} else
+				*bufnext++ = c;
+	}
+	*bufnext = EOS;
+
+	if (flags & GLOB_BRACE)
+		return globexp1(patbuf, pglob);
+	else
+		return glob0(patbuf, pglob);
+}
+
+/*
+ * Expand recursively a glob {} pattern. When there is no more expansion
+ * invoke the standard globbing routine to glob the rest of the magic
+ * characters
+ */
+static int
+globexp1(const Char *pattern, glob_t *pglob)
+{
+	const Char* ptr = pattern;
+	int rv;
+
+	/* Protect a single {}, for find(1), like csh */
+	if (pattern[0] == LBRACE && pattern[1] == RBRACE && pattern[2] == EOS)
+		return glob0(pattern, pglob);
+
+	while ((ptr = g_strchr(ptr, LBRACE)) != NULL)
+		if (!globexp2(ptr, pattern, pglob, &rv))
+			return rv;
+
+	return glob0(pattern, pglob);
+}
+
+
+/*
+ * Recursive brace globbing helper. Tries to expand a single brace.
+ * If it succeeds then it invokes globexp1 with the new pattern.
+ * If it fails then it tries to glob the rest of the pattern and returns.
+ */
+static int
+globexp2(const Char *ptr, const Char *pattern, glob_t *pglob, int *rv)
+{
+	int     i;
+	Char   *lm, *ls;
+	const Char *pe, *pm, *pl;
+	Char    patbuf[MAXPATHLEN];
+
+	/* copy part up to the brace */
+	for (lm = patbuf, pm = pattern; pm != ptr; *lm++ = *pm++)
+		;
+	*lm = EOS;
+	ls = lm;
+
+	/* Find the balanced brace */
+	for (i = 0, pe = ++ptr; *pe; pe++)
+		if (*pe == LBRACKET) {
+			/* Ignore everything between [] */
+			for (pm = pe++; *pe != RBRACKET && *pe != EOS; pe++)
+				;
+			if (*pe == EOS) {
+				/*
+				 * We could not find a matching RBRACKET.
+				 * Ignore and just look for RBRACE
+				 */
+				pe = pm;
+			}
+		} else if (*pe == LBRACE)
+			i++;
+		else if (*pe == RBRACE) {
+			if (i == 0)
+				break;
+			i--;
+		}
+
+	/* Non matching braces; just glob the pattern */
+	if (i != 0 || *pe == EOS) {
+		*rv = glob0(patbuf, pglob);
+		return 0;
+	}
+
+	for (i = 0, pl = pm = ptr; pm <= pe; pm++) {
+		switch (*pm) {
+		case LBRACKET:
+			/* Ignore everything between [] */
+			for (pl = pm++; *pm != RBRACKET && *pm != EOS; pm++)
+				;
+			if (*pm == EOS) {
+				/*
+				 * We could not find a matching RBRACKET.
+				 * Ignore and just look for RBRACE
+				 */
+				pm = pl;
+			}
+			break;
+
+		case LBRACE:
+			i++;
+			break;
+
+		case RBRACE:
+			if (i) {
+				i--;
+				break;
+			}
+			/* FALLTHROUGH */
+		case COMMA:
+			if (i && *pm == COMMA)
+				break;
+			else {
+				/* Append the current string */
+				for (lm = ls; (pl < pm); *lm++ = *pl++)
+					;
+
+				/*
+				 * Append the rest of the pattern after the
+				 * closing brace
+				 */
+				for (pl = pe + 1; (*lm++ = *pl++) != EOS; )
+					;
+
+				/* Expand the current pattern */
+#ifdef DEBUG
+				qprintf("globexp2:", patbuf);
+#endif
+				*rv = globexp1(patbuf, pglob);
+
+				/* move after the comma, to the next string */
+				pl = pm + 1;
+			}
+			break;
+
+		default:
+			break;
+		}
+	}
+	*rv = 0;
+	return 0;
+}
+
+
+
+/*
+ * expand tilde from the passwd file.
+ */
+static const Char *
+globtilde(const Char *pattern, Char *patbuf, size_t patbuf_len, glob_t *pglob)
+{
+	struct passwd *pwd;
+	char *h;
+	const Char *p;
+	Char *b, *eb;
+
+	if (*pattern != TILDE || !(pglob->gl_flags & GLOB_TILDE))
+		return pattern;
+
+	/* Copy up to the end of the string or / */
+	eb = &patbuf[patbuf_len - 1];
+	for (p = pattern + 1, h = (char *) patbuf;
+	    h < (char *)eb && *p && *p != SLASH; *h++ = *p++)
+		;
+
+	*h = EOS;
+
+#if 0
+	if (h == (char *)eb)
+		return what;
+#endif
+
+	if (((char *) patbuf)[0] == EOS) {
+		/*
+		 * handle a plain ~ or ~/ by expanding $HOME
+		 * first and then trying the password file
+		 */
+		if (issetugid() != 0 || (h = getenv("HOME")) == NULL) {
+			if ((pwd = getpwuid(getuid())) == NULL)
+				return pattern;
+			else
+				h = pwd->pw_dir;
+		}
+	} else {
+		/*
+		 * Expand a ~user
+		 */
+		if ((pwd = getpwnam((char*) patbuf)) == NULL)
+			return pattern;
+		else
+			h = pwd->pw_dir;
+	}
+
+	/* Copy the home directory */
+	for (b = patbuf; b < eb && *h; *b++ = *h++)
+		;
+
+	/* Append the rest of the pattern */
+	while (b < eb && (*b++ = *p++) != EOS)
+		;
+	*b = EOS;
+
+	return patbuf;
+}
+
+
+/*
+ * The main glob() routine: compiles the pattern (optionally processing
+ * quotes), calls glob1() to do the real pattern matching, and finally
+ * sorts the list (unless unsorted operation is requested).  Returns 0
+ * if things went well, nonzero if errors occurred.  It is not an error
+ * to find no matches.
+ */
+static int
+glob0(const Char *pattern, glob_t *pglob)
+{
+	const Char *qpatnext;
+	int c, err, oldpathc;
+	Char *bufnext, patbuf[MAXPATHLEN];
+	size_t limit = 0;
+
+	qpatnext = globtilde(pattern, patbuf, MAXPATHLEN, pglob);
+	oldpathc = pglob->gl_pathc;
+	bufnext = patbuf;
+
+	/* We don't need to check for buffer overflow any more. */
+	while ((c = *qpatnext++) != EOS) {
+		switch (c) {
+		case LBRACKET:
+			c = *qpatnext;
+			if (c == NOT)
+				++qpatnext;
+			if (*qpatnext == EOS ||
+			    g_strchr(qpatnext+1, RBRACKET) == NULL) {
+				*bufnext++ = LBRACKET;
+				if (c == NOT)
+					--qpatnext;
+				break;
+			}
+			*bufnext++ = M_SET;
+			if (c == NOT)
+				*bufnext++ = M_NOT;
+			c = *qpatnext++;
+			do {
+				*bufnext++ = CHAR(c);
+				if (*qpatnext == RANGE &&
+				    (c = qpatnext[1]) != RBRACKET) {
+					*bufnext++ = M_RNG;
+					*bufnext++ = CHAR(c);
+					qpatnext += 2;
+				}
+			} while ((c = *qpatnext++) != RBRACKET);
+			pglob->gl_flags |= GLOB_MAGCHAR;
+			*bufnext++ = M_END;
+			break;
+		case QUESTION:
+			pglob->gl_flags |= GLOB_MAGCHAR;
+			*bufnext++ = M_ONE;
+			break;
+		case STAR:
+			pglob->gl_flags |= GLOB_MAGCHAR;
+			/* collapse adjacent stars to one,
+			 * to avoid exponential behavior
+			 */
+			if (bufnext == patbuf || bufnext[-1] != M_ALL)
+				*bufnext++ = M_ALL;
+			break;
+		default:
+			*bufnext++ = CHAR(c);
+			break;
+		}
+	}
+	*bufnext = EOS;
+#ifdef DEBUG
+	qprintf("glob0:", patbuf);
+#endif
+
+	if ((err = glob1(patbuf, patbuf+MAXPATHLEN-1, pglob, &limit)) != 0)
+		return(err);
+
+	/*
+	 * If there was no match we are going to append the pattern
+	 * if GLOB_NOCHECK was specified or if GLOB_NOMAGIC was specified
+	 * and the pattern did not contain any magic characters
+	 * GLOB_NOMAGIC is there just for compatibility with csh.
+	 */
+	if (pglob->gl_pathc == oldpathc) {
+		if ((pglob->gl_flags & GLOB_NOCHECK) ||
+		    ((pglob->gl_flags & GLOB_NOMAGIC) &&
+		    !(pglob->gl_flags & GLOB_MAGCHAR)))
+			return(globextend(pattern, pglob, &limit));
+		else
+			return(GLOB_NOMATCH);
+	}
+	if (!(pglob->gl_flags & GLOB_NOSORT))
+		qsort(pglob->gl_pathv + pglob->gl_offs + oldpathc,
+		    pglob->gl_pathc - oldpathc, sizeof(char *), compare);
+	return(0);
+}
+
+static int
+compare(const void *p, const void *q)
+{
+	return(strcmp(*(char *const *)p, *(char *const *)q));
+}
+
+static int
+glob1(Char *pattern, Char *pattern_last, glob_t *pglob, size_t *limitp)
+{
+	Char pathbuf[MAXPATHLEN];
+
+	/* A null pathname is invalid -- POSIX 1003.1 sect. 2.4. */
+	if (*pattern == EOS)
+		return(0);
+	return(glob2(pathbuf, pathbuf+MAXPATHLEN-1,
+	    pathbuf, pathbuf+MAXPATHLEN-1,
+	    pattern, pattern_last, pglob, limitp));
+}
+
+/*
+ * The functions glob2 and glob3 are mutually recursive; there is one level
+ * of recursion for each segment in the pattern that contains one or more
+ * meta characters.
+ */
+static int
+glob2(Char *pathbuf, Char *pathbuf_last, Char *pathend, Char *pathend_last,
+    Char *pattern, Char *pattern_last, glob_t *pglob, size_t *limitp)
+{
+	struct stat sb;
+	Char *p, *q;
+	int anymeta;
+
+	/*
+	 * Loop over pattern segments until end of pattern or until
+	 * segment with meta character found.
+	 */
+	for (anymeta = 0;;) {
+		if (*pattern == EOS) {		/* End of pattern? */
+			*pathend = EOS;
+			if (g_lstat(pathbuf, &sb, pglob))
+				return(0);
+
+			if (((pglob->gl_flags & GLOB_MARK) &&
+			    pathend[-1] != SEP) && (S_ISDIR(sb.st_mode) ||
+			    (S_ISLNK(sb.st_mode) &&
+			    (g_stat(pathbuf, &sb, pglob) == 0) &&
+			    S_ISDIR(sb.st_mode)))) {
+				if (pathend+1 > pathend_last)
+					return (1);
+				*pathend++ = SEP;
+				*pathend = EOS;
+			}
+			++pglob->gl_matchc;
+			return(globextend(pathbuf, pglob, limitp));
+		}
+
+		/* Find end of next segment, copy tentatively to pathend. */
+		q = pathend;
+		p = pattern;
+		while (*p != EOS && *p != SEP) {
+			if (ismeta(*p))
+				anymeta = 1;
+			if (q+1 > pathend_last)
+				return (1);
+			*q++ = *p++;
+		}
+
+		if (!anymeta) {		/* No expansion, do next segment. */
+			pathend = q;
+			pattern = p;
+			while (*pattern == SEP) {
+				if (pathend+1 > pathend_last)
+					return (1);
+				*pathend++ = *pattern++;
+			}
+		} else
+			/* Need expansion, recurse. */
+			return(glob3(pathbuf, pathbuf_last, pathend,
+			    pathend_last, pattern, pattern_last,
+			    p, pattern_last, pglob, limitp));
+	}
+	/* NOTREACHED */
+}
+
+static int
+glob3(Char *pathbuf, Char *pathbuf_last, Char *pathend, Char *pathend_last,
+    Char *pattern, Char *pattern_last __attribute__((unused)), Char *restpattern,
+    Char *restpattern_last, glob_t *pglob, size_t *limitp)
+{
+	struct dirent *dp;
+	DIR *dirp;
+	int err;
+	char buf[MAXPATHLEN];
+
+	/*
+	 * The readdirfunc declaration can't be prototyped, because it is
+	 * assigned, below, to two functions which are prototyped in glob.h
+	 * and dirent.h as taking pointers to differently typed opaque
+	 * structures.
+	 */
+	struct dirent *(*readdirfunc)(void *);
+
+	if (pathend > pathend_last)
+		return (1);
+	*pathend = EOS;
+	errno = 0;
+
+	if ((dirp = g_opendir(pathbuf, pglob)) == NULL) {
+		/* TODO: don't call for ENOENT or ENOTDIR? */
+		if (pglob->gl_errfunc) {
+			if (g_Ctoc(pathbuf, buf, sizeof(buf)))
+				return(GLOB_ABORTED);
+			if (pglob->gl_errfunc(buf, errno) ||
+			    pglob->gl_flags & GLOB_ERR)
+				return(GLOB_ABORTED);
+		}
+		return(0);
+	}
+
+	err = 0;
+
+	/* Search directory for matching names. */
+	if (pglob->gl_flags & GLOB_ALTDIRFUNC)
+		readdirfunc = pglob->gl_readdir;
+	else
+		readdirfunc = (struct dirent *(*)(void *))readdir;
+	while ((dp = (*readdirfunc)(dirp))) {
+		u_char *sc;
+		Char *dc;
+
+		/* Initial DOT must be matched literally. */
+		if (dp->d_name[0] == DOT && *pattern != DOT)
+			continue;
+		dc = pathend;
+		sc = (u_char *) dp->d_name;
+		while (dc < pathend_last && (*dc++ = *sc++) != EOS)
+			;
+		if (dc >= pathend_last) {
+			*dc = EOS;
+			err = 1;
+			break;
+		}
+
+		if (!match(pathend, pattern, restpattern)) {
+			*pathend = EOS;
+			continue;
+		}
+		err = glob2(pathbuf, pathbuf_last, --dc, pathend_last,
+		    restpattern, restpattern_last, pglob, limitp);
+		if (err)
+			break;
+	}
+
+	if (pglob->gl_flags & GLOB_ALTDIRFUNC)
+		(*pglob->gl_closedir)(dirp);
+	else
+		closedir(dirp);
+	return(err);
+}
+
+
+/*
+ * Extend the gl_pathv member of a glob_t structure to accommodate a new item,
+ * add the new item, and update gl_pathc.
+ *
+ * This assumes the BSD realloc, which only copies the block when its size
+ * crosses a power-of-two boundary; for v7 realloc, this would cause quadratic
+ * behavior.
+ *
+ * Return 0 if new item added, error code if memory couldn't be allocated.
+ *
+ * Invariant of the glob_t structure:
+ *	Either gl_pathc is zero and gl_pathv is NULL; or gl_pathc > 0 and
+ *	gl_pathv points to (gl_offs + gl_pathc + 1) items.
+ */
+static int
+globextend(const Char *path, glob_t *pglob, size_t *limitp)
+{
+	char **pathv;
+	int i;
+	u_int newsize, len;
+	char *copy;
+	const Char *p;
+
+	newsize = sizeof(*pathv) * (2 + pglob->gl_pathc + pglob->gl_offs);
+	pathv = pglob->gl_pathv ? realloc((char *)pglob->gl_pathv, newsize) :
+	    malloc(newsize);
+	if (pathv == NULL) {
+		if (pglob->gl_pathv) {
+			free(pglob->gl_pathv);
+			pglob->gl_pathv = NULL;
+		}
+		return(GLOB_NOSPACE);
+	}
+
+	if (pglob->gl_pathv == NULL && pglob->gl_offs > 0) {
+		/* first time around -- clear initial gl_offs items */
+		pathv += pglob->gl_offs;
+		for (i = pglob->gl_offs; --i >= 0; )
+			*--pathv = NULL;
+	}
+	pglob->gl_pathv = pathv;
+
+	for (p = path; *p++;)
+		;
+	len = (size_t)(p - path);
+	*limitp += len;
+	if ((copy = malloc(len)) != NULL) {
+		if (g_Ctoc(path, copy, len)) {
+			free(copy);
+			return(GLOB_NOSPACE);
+		}
+		pathv[pglob->gl_offs + pglob->gl_pathc++] = copy;
+	}
+	pathv[pglob->gl_offs + pglob->gl_pathc] = NULL;
+
+	if ((pglob->gl_flags & GLOB_LIMIT) &&
+	    newsize + *limitp >= ARG_MAX) {
+		errno = 0;
+		return(GLOB_NOSPACE);
+	}
+
+	return(copy == NULL ? GLOB_NOSPACE : 0);
+}
+
+
+/*
+ * pattern matching function for filenames.  Each occurrence of the *
+ * pattern causes a recursion level.
+ */
+static int
+match(Char *name, Char *pat, Char *patend)
+{
+	int ok, negate_range;
+	Char c, k;
+
+	while (pat < patend) {
+		c = *pat++;
+		switch (c & M_MASK) {
+		case M_ALL:
+			if (pat == patend)
+				return(1);
+			do {
+			    if (match(name, pat, patend))
+				    return(1);
+			} while (*name++ != EOS);
+			return(0);
+		case M_ONE:
+			if (*name++ == EOS)
+				return(0);
+			break;
+		case M_SET:
+			ok = 0;
+			if ((k = *name++) == EOS)
+				return(0);
+			if ((negate_range = ((*pat & M_MASK) == M_NOT)) != EOS)
+				++pat;
+			while (((c = *pat++) & M_MASK) != M_END)
+				if ((*pat & M_MASK) == M_RNG) {
+					if (c <= k && k <= pat[1])
+						ok = 1;
+					pat += 2;
+				} else if (c == k)
+					ok = 1;
+			if (ok == negate_range)
+				return(0);
+			break;
+		default:
+			if (*name++ != c)
+				return(0);
+			break;
+		}
+	}
+	return(*name == EOS);
+}
+
+/* Free allocated data belonging to a glob_t structure. */
+void
+globfree(glob_t *pglob)
+{
+	int i;
+	char **pp;
+
+	if (pglob->gl_pathv != NULL) {
+		pp = pglob->gl_pathv + pglob->gl_offs;
+		for (i = pglob->gl_pathc; i--; ++pp)
+			if (*pp)
+				free(*pp);
+		free(pglob->gl_pathv);
+		pglob->gl_pathv = NULL;
+	}
+}
+
+static DIR *
+g_opendir(Char *str, glob_t *pglob)
+{
+	char buf[MAXPATHLEN];
+
+	if (!*str)
+		strlcpy(buf, ".", sizeof buf);
+	else {
+		if (g_Ctoc(str, buf, sizeof(buf)))
+			return(NULL);
+	}
+
+	if (pglob->gl_flags & GLOB_ALTDIRFUNC)
+		return((*pglob->gl_opendir)(buf));
+
+	return(opendir(buf));
+}
+
+static int
+g_lstat(Char *fn, struct stat *sb, glob_t *pglob)
+{
+	char buf[MAXPATHLEN];
+
+	if (g_Ctoc(fn, buf, sizeof(buf)))
+		return(-1);
+	if (pglob->gl_flags & GLOB_ALTDIRFUNC)
+		return((*pglob->gl_lstat)(buf, sb));
+	return(lstat(buf, sb));
+}
+
+static int
+g_stat(Char *fn, struct stat *sb, glob_t *pglob)
+{
+	char buf[MAXPATHLEN];
+
+	if (g_Ctoc(fn, buf, sizeof(buf)))
+		return(-1);
+	if (pglob->gl_flags & GLOB_ALTDIRFUNC)
+		return((*pglob->gl_stat)(buf, sb));
+	return(stat(buf, sb));
+}
+
+static const Char *
+g_strchr(const Char *str, int ch)
+{
+	do {
+		if (*str == ch)
+			return (str);
+	} while (*str++);
+	return (NULL);
+}
+
+static int
+g_Ctoc(const Char *str, char *buf, u_int len)
+{
+
+	while (len--) {
+		if ((*buf++ = *str++) == EOS)
+			return (0);
+	}
+	return (1);
+}
+
+#ifdef DEBUG
+static void
+qprintf(const char *str, Char *s)
+{
+	Char *p;
+
+	(void)printf("%s:\n", str);
+	for (p = s; *p; p++)
+		(void)printf("%c", CHAR(*p));
+	(void)printf("\n");
+	for (p = s; *p; p++)
+		(void)printf("%c", *p & M_PROTECT ? '"' : ' ');
+	(void)printf("\n");
+	for (p = s; *p; p++)
+		(void)printf("%c", ismeta(*p) ? '_' : ' ');
+	(void)printf("\n");
+}
+#endif
+#endif

+ 100 - 0
config/glob.h

@@ -0,0 +1,100 @@
+/*	$OpenBSD: glob.h,v 1.9 2004/10/07 16:56:11 millert Exp $	*/
+/*	$NetBSD: glob.h,v 1.5 1994/10/26 00:55:56 cgd Exp $	*/
+
+/*
+ * Copyright (c) 1989, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Guido van Rossum.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *	@(#)glob.h	8.1 (Berkeley) 6/2/93
+ */
+
+#ifndef __APPLE__
+#include_next <glob.h>
+#else
+#ifndef _GLOB_H_
+#define	_GLOB_H_
+
+#include <sys/cdefs.h>
+
+struct stat;
+typedef struct {
+	int gl_pathc;		/* Count of total paths so far. */
+	int gl_matchc;		/* Count of paths matching pattern. */
+	int gl_offs;		/* Reserved at beginning of gl_pathv. */
+	int gl_flags;		/* Copy of flags parameter to glob. */
+	char **gl_pathv;	/* List of paths matching pattern. */
+				/* Copy of errfunc parameter to glob. */
+	int (*gl_errfunc)(const char *, int);
+
+	/*
+	 * Alternate filesystem access methods for glob; replacement
+	 * versions of closedir(3), readdir(3), opendir(3), stat(2)
+	 * and lstat(2).
+	 */
+	void (*gl_closedir)(void *);
+	struct dirent *(*gl_readdir)(void *);	
+	void *(*gl_opendir)(const char *);
+	int (*gl_lstat)(const char *, struct stat *);
+	int (*gl_stat)(const char *, struct stat *);
+} glob_t;
+
+/* Flags */
+#define	GLOB_APPEND	0x0001	/* Append to output from previous call. */
+#define	GLOB_DOOFFS	0x0002	/* Use gl_offs. */
+#define	GLOB_ERR	0x0004	/* Return on error. */
+#define	GLOB_MARK	0x0008	/* Append / to matching directories. */
+#define	GLOB_NOCHECK	0x0010	/* Return pattern itself if nothing matches. */
+#define	GLOB_NOSORT	0x0020	/* Don't sort. */
+#define	GLOB_NOESCAPE	0x1000	/* Disable backslash escaping. */
+
+#ifndef _POSIX_SOURCE
+#define	GLOB_ALTDIRFUNC	0x0040	/* Use alternately specified directory funcs. */
+#define	GLOB_BRACE	0x0080	/* Expand braces ala csh. */
+#define	GLOB_MAGCHAR	0x0100	/* Pattern had globbing characters. */
+#define	GLOB_NOMAGIC	0x0200	/* GLOB_NOCHECK without magic chars (csh). */
+#define	GLOB_QUOTE	0x0400	/* Quote special chars with \. */
+#define	GLOB_TILDE	0x0800	/* Expand tilde names from the passwd file. */
+#define GLOB_LIMIT	0x2000	/* Limit pattern match output to ARG_MAX */
+#endif
+
+/* Error values returned by glob(3) */
+#define	GLOB_NOSPACE	(-1)	/* Malloc call failed. */
+#define	GLOB_ABORTED	(-2)	/* Unignored error. */
+#define	GLOB_NOMATCH	(-3)	/* No match and GLOB_NOCHECK not set. */
+#define	GLOB_NOSYS	(-4)	/* Function not supported. */
+#define GLOB_ABEND	GLOB_ABORTED
+
+__BEGIN_DECLS
+int	glob(const char *, int, int (*)(const char *, int), glob_t *);
+void	globfree(glob_t *);
+__END_DECLS
+
+#endif /* !_GLOB_H_ */
+#endif

+ 240 - 0
config/inputbox.c

@@ -0,0 +1,240 @@
+/*
+ *  inputbox.c -- implements the input box
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "dialog.h"
+
+unsigned char dialog_input_result[MAX_LEN + 1];
+
+/*
+ *  Print the termination buttons
+ */
+static void
+print_buttons(WINDOW *dialog, int height, int width, int selected)
+{
+    int x = width / 2 - 11;
+    int y = height - 2;
+
+    print_button (dialog, "  Ok  ", y, x, selected==0);
+    print_button (dialog, " Help ", y, x + 14, selected==1);
+
+    wmove(dialog, y, x+1+14*selected);
+    wrefresh(dialog);
+}
+
+/*
+ * Display a dialog box for inputing a string
+ */
+int
+dialog_inputbox (const char *title, const char *prompt, int height, int width,
+		 const char *init)
+{
+    int i, x, y, box_y, box_x, box_width;
+    int input_x = 0, scroll = 0, key = 0, button = -1;
+    char *instr = (char*)dialog_input_result;
+    WINDOW *dialog;
+
+    /* center dialog box on screen */
+    x = (COLS - width) / 2;
+    y = (LINES - height) / 2;
+
+
+    draw_shadow (stdscr, y, x, height, width);
+
+    dialog = newwin (height, width, y, x);
+    keypad (dialog, TRUE);
+
+    draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
+    wattrset (dialog, border_attr);
+    mvwaddch (dialog, height-3, 0, ACS_LTEE);
+    for (i = 0; i < width - 2; i++)
+	waddch (dialog, ACS_HLINE);
+    wattrset (dialog, dialog_attr);
+    waddch (dialog, ACS_RTEE);
+
+    if (title != NULL && strlen(title) >= width-2 ) {
+	/* truncate long title -- mec */
+	char * title2 = malloc(width-2+1);
+	memcpy( title2, title, width-2 );
+	title2[width-2] = '\0';
+	title = title2;
+    }
+
+    if (title != NULL) {
+	wattrset (dialog, title_attr);
+	mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
+	waddstr (dialog, (char *)title);
+	waddch (dialog, ' ');
+    }
+
+    wattrset (dialog, dialog_attr);
+    print_autowrap (dialog, prompt, width - 2, 1, 3);
+
+    /* Draw the input field box */
+    box_width = width - 6;
+    getyx (dialog, y, x);
+    box_y = y + 2;
+    box_x = (width - box_width) / 2;
+    draw_box (dialog, y + 1, box_x - 1, 3, box_width + 2,
+	      border_attr, dialog_attr);
+
+    print_buttons(dialog, height, width, 0);
+
+    /* Set up the initial value */
+    wmove (dialog, box_y, box_x);
+    wattrset (dialog, inputbox_attr);
+
+    if (!init)
+	instr[0] = '\0';
+    else
+	strcpy (instr, init);
+
+    input_x = strlen (instr);
+
+    if (input_x >= box_width) {
+	scroll = input_x - box_width + 1;
+	input_x = box_width - 1;
+	for (i = 0; i < box_width - 1; i++)
+	    waddch (dialog, instr[scroll + i]);
+    } else
+	waddstr (dialog, instr);
+
+    wmove (dialog, box_y, box_x + input_x);
+
+    wrefresh (dialog);
+
+    while (key != ESC) {
+	key = wgetch (dialog);
+
+	if (button == -1) {	/* Input box selected */
+	    switch (key) {
+	    case TAB:
+	    case KEY_UP:
+	    case KEY_DOWN:
+		break;
+	    case KEY_LEFT:
+		continue;
+	    case KEY_RIGHT:
+		continue;
+	    case KEY_BACKSPACE:
+	    case 127:
+		if (input_x || scroll) {
+		    wattrset (dialog, inputbox_attr);
+		    if (!input_x) {
+			scroll = scroll < box_width - 1 ?
+			    0 : scroll - (box_width - 1);
+			wmove (dialog, box_y, box_x);
+			for (i = 0; i < box_width; i++)
+			    waddch (dialog, instr[scroll + input_x + i] ?
+				    instr[scroll + input_x + i] : ' ');
+			input_x = strlen (instr) - scroll;
+		    } else
+			input_x--;
+		    instr[scroll + input_x] = '\0';
+		    mvwaddch (dialog, box_y, input_x + box_x, ' ');
+		    wmove (dialog, box_y, input_x + box_x);
+		    wrefresh (dialog);
+		}
+		continue;
+	    default:
+		if (key < 0x100 && isprint (key)) {
+		    if (scroll + input_x < MAX_LEN) {
+			wattrset (dialog, inputbox_attr);
+			instr[scroll + input_x] = key;
+			instr[scroll + input_x + 1] = '\0';
+			if (input_x == box_width - 1) {
+			    scroll++;
+			    wmove (dialog, box_y, box_x);
+			    for (i = 0; i < box_width - 1; i++)
+				waddch (dialog, instr[scroll + i]);
+			} else {
+			    wmove (dialog, box_y, input_x++ + box_x);
+			    waddch (dialog, key);
+			}
+			wrefresh (dialog);
+		    } else
+			flash ();	/* Alarm user about overflow */
+		    continue;
+		}
+	    }
+	}
+	switch (key) {
+	case 'O':
+	case 'o':
+	    delwin (dialog);
+	    return 0;
+	case 'H':
+	case 'h':
+	    delwin (dialog);
+	    return 1;
+	case KEY_UP:
+	case KEY_LEFT:
+	    switch (button) {
+	    case -1:
+		button = 1;	/* Indicates "Cancel" button is selected */
+		print_buttons(dialog, height, width, 1);
+		break;
+	    case 0:
+		button = -1;	/* Indicates input box is selected */
+		print_buttons(dialog, height, width, 0);
+		wmove (dialog, box_y, box_x + input_x);
+		wrefresh (dialog);
+		break;
+	    case 1:
+		button = 0;	/* Indicates "OK" button is selected */
+		print_buttons(dialog, height, width, 0);
+		break;
+	    }
+	    break;
+	case TAB:
+	case KEY_DOWN:
+	case KEY_RIGHT:
+	    switch (button) {
+	    case -1:
+		button = 0;	/* Indicates "OK" button is selected */
+		print_buttons(dialog, height, width, 0);
+		break;
+	    case 0:
+		button = 1;	/* Indicates "Cancel" button is selected */
+		print_buttons(dialog, height, width, 1);
+		break;
+	    case 1:
+		button = -1;	/* Indicates input box is selected */
+		print_buttons(dialog, height, width, 0);
+		wmove (dialog, box_y, box_x + input_x);
+		wrefresh (dialog);
+		break;
+	    }
+	    break;
+	case ' ':
+	case '\n':
+	    delwin (dialog);
+	    return (button == -1 ? 0 : button);
+	case 'X':
+	case 'x':
+	    key = ESC;
+	case ESC:
+	    break;
+	}
+    }
+
+    delwin (dialog);
+    return -1;			/* ESC pressed */
+}

+ 1 - 0
config/lex.backup

@@ -0,0 +1 @@
+No backing up.

+ 113 - 0
config/lkc.h

@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#ifndef LKC_H
+#define LKC_H
+
+#include "expr.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef LKC_DIRECT_LINK
+#define P(name,type,arg)	extern type name arg
+#else
+#include "lkc_defs.h"
+#define P(name,type,arg)	extern type (*name ## _p) arg
+#endif
+#include "lkc_proto.h"
+#undef P
+
+#define SRCTREE "srctree"
+
+int zconfparse(void);
+void zconfdump(FILE *out);
+
+extern int zconfdebug;
+void zconf_starthelp(void);
+FILE *zconf_fopen(const char *name);
+void zconf_initscan(const char *name);
+void zconf_nextfile(const char *name);
+int zconf_lineno(void);
+char *zconf_curname(void);
+
+/* confdata.c */
+extern const char conf_def_filename[];
+extern char conf_filename[];
+
+char *conf_get_default_confname(void);
+
+/* kconfig_load.c */
+void kconfig_load(void);
+
+/* menu.c */
+void menu_init(void);
+void menu_add_menu(void);
+void menu_end_menu(void);
+void menu_add_entry(struct symbol *sym);
+void menu_end_entry(void);
+void menu_add_dep(struct expr *dep);
+struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep);
+void menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep);
+void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep);
+void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep);
+void menu_finalize(struct menu *parent);
+void menu_set_type(int type);
+struct file *file_lookup(const char *name);
+int file_write_dep(const char *name);
+
+extern struct menu *current_entry;
+extern struct menu *current_menu;
+
+/* symbol.c */
+void sym_init(void);
+void sym_clear_all_valid(void);
+void sym_set_changed(struct symbol *sym);
+struct symbol *sym_check_deps(struct symbol *sym);
+struct property *prop_alloc(enum prop_type type, struct symbol *sym);
+struct symbol *prop_get_symbol(struct property *prop);
+
+static inline tristate sym_get_tristate_value(struct symbol *sym)
+{
+	return sym->curr.tri;
+}
+
+
+static inline struct symbol *sym_get_choice_value(struct symbol *sym)
+{
+	return (struct symbol *)sym->curr.val;
+}
+
+static inline bool sym_set_choice_value(struct symbol *ch, struct symbol *chval)
+{
+	return sym_set_tristate_value(chval, yes);
+}
+
+static inline bool sym_is_choice(struct symbol *sym)
+{
+	return sym->flags & SYMBOL_CHOICE ? true : false;
+}
+
+static inline bool sym_is_choice_value(struct symbol *sym)
+{
+	return sym->flags & SYMBOL_CHOICEVAL ? true : false;
+}
+
+static inline bool sym_is_optional(struct symbol *sym)
+{
+	return sym->flags & SYMBOL_OPTIONAL ? true : false;
+}
+
+static inline bool sym_has_value(struct symbol *sym)
+{
+	return sym->flags & SYMBOL_NEW ? false : true;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LKC_H */

+ 39 - 0
config/lkc_proto.h

@@ -0,0 +1,39 @@
+
+/* confdata.c */
+P(conf_parse,void,(const char *name));
+P(conf_read,int,(const char *name));
+P(conf_write,int,(const char *name));
+
+/* menu.c */
+P(rootmenu,struct menu,);
+
+P(menu_is_visible,bool,(struct menu *menu));
+P(menu_get_prompt,const char *,(struct menu *menu));
+P(menu_get_root_menu,struct menu *,(struct menu *menu));
+P(menu_get_parent_menu,struct menu *,(struct menu *menu));
+
+/* symbol.c */
+P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]);
+P(sym_change_count,int,);
+
+P(sym_lookup,struct symbol *,(const char *name, int isconst));
+P(sym_find,struct symbol *,(const char *name));
+P(sym_type_name,const char *,(enum symbol_type type));
+P(sym_calc_value,void,(struct symbol *sym));
+P(sym_get_type,enum symbol_type,(struct symbol *sym));
+P(sym_tristate_within_range,bool,(struct symbol *sym,tristate tri));
+P(sym_set_tristate_value,bool,(struct symbol *sym,tristate tri));
+P(sym_toggle_tristate_value,tristate,(struct symbol *sym));
+P(sym_string_valid,bool,(struct symbol *sym, const char *newval));
+P(sym_string_within_range,bool,(struct symbol *sym, const char *str));
+P(sym_set_string_value,bool,(struct symbol *sym, const char *newval));
+P(sym_is_changable,bool,(struct symbol *sym));
+P(sym_get_choice_prop,struct property *,(struct symbol *sym));
+P(sym_get_default_prop,struct property *,(struct symbol *sym));
+P(sym_get_string_value,const char *,(struct symbol *sym));
+
+P(prop_get_type_name,const char *,(enum prop_type type));
+
+/* expr.c */
+P(expr_compare_type,int,(enum expr_type t1, enum expr_type t2));
+P(expr_print,void,(struct expr *e, void (*fn)(void *, const char *), void *data, int prevtoken));

+ 717 - 0
config/mconf.c

@@ -0,0 +1,717 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ *
+ * Introduced single menu mode (show all sub-menus in one large tree).
+ * 2002-11-06 Petr Baudis <pasky@ucw.cz>
+ *
+ * Directly use liblxdialog library routines.
+ * 2002-11-14 Petr Baudis <pasky@ucw.cz>
+ */
+
+#include <sys/ioctl.h>
+#include <sys/wait.h>
+#include <sys/termios.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <signal.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <termios.h>
+#include <unistd.h>
+
+#include "dialog.h"
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+static char menu_backtitle[128];
+static const char menu_instructions[] =
+	"Arrow keys navigate the menu.  "
+	"<Enter> selects submenus --->.  "
+	"Highlighted letters are hotkeys.  "
+	"Pressing <Y> selectes a feature, while <N> will exclude a feature.  "
+	"Press <Esc><Esc> to exit, <?> for Help.  "
+	"Legend: [*] feature is selected  [ ] feature is excluded",
+radiolist_instructions[] =
+	"Use the arrow keys to navigate this window or "
+	"press the hotkey of the item you wish to select "
+	"followed by the <SPACE BAR>. "
+	"Press <?> for additional information about this option.",
+inputbox_instructions_int[] =
+	"Please enter a decimal value. "
+	"Fractions will not be accepted.  "
+	"Use the <TAB> key to move from the input field to the buttons below it.",
+inputbox_instructions_hex[] =
+	"Please enter a hexadecimal value. "
+	"Use the <TAB> key to move from the input field to the buttons below it.",
+inputbox_instructions_string[] =
+	"Please enter a string value. "
+	"Use the <TAB> key to move from the input field to the buttons below it.",
+setmod_text[] =
+	"This feature depends on another which has been configured as a module.\n"
+	"As a result, this feature will be built as a module.",
+nohelp_text[] =
+	"There is no help available for this option.\n",
+load_config_text[] =
+	"Enter the name of the configuration file you wish to load.  "
+	"Accept the name shown to restore the configuration you "
+	"last retrieved.  Leave blank to abort.",
+load_config_help[] =
+	"\n"
+	"For various reasons, one may wish to keep several different OpenADK\n"
+	"configurations available on a single machine.\n"
+	"\n"
+	"If you have saved a previous configuration in a file other than the\n"
+	"OpenADK's default, entering the name of the file here will allow you\n"
+	"to modify that configuration.\n"
+	"\n"
+	"If you are uncertain, then you have probably never used alternate\n"
+	"configuration files.  You should therefor leave this blank to abort.\n",
+save_config_text[] =
+	"Enter a filename to which this configuration should be saved "
+	"as an alternate.  Leave blank to abort.",
+save_config_help[] =
+	"\n"
+	"For various reasons, one may wish to keep different OpenADK\n"
+	"configurations available on a single machine.\n"
+	"\n"
+	"Entering a file name here will allow you to later retrieve, modify\n"
+	"and use the current configuration as an alternate to whatever\n"
+	"configuration options you have selected at that time.\n"
+	"\n"
+	"If you are uncertain what all this means then you should probably\n"
+	"leave this blank.\n",
+top_menu_help[] =
+	"\n"
+	"Use the Up/Down arrow keys (cursor keys) to highlight the item\n"
+	"you wish to change or submenu wish to select and press <Enter>.\n"
+	"Submenus are designated by \"--->\".\n"
+	"\n"
+	"Shortcut: Press the option's highlighted letter (hotkey).\n"
+	"\n"
+	"You may also use the <PAGE UP> and <PAGE DOWN> keys to scroll\n"
+	"unseen options into view.\n"
+;
+
+static char filename[PATH_MAX+1] = ".config";
+static int indent = 0;
+static struct termios ios_org;
+static int rows, cols;
+struct menu *current_menu;
+static int child_count;
+static int single_menu_mode;
+
+static struct dialog_list_item *items[16384]; /* FIXME: This ought to be dynamic. */
+static int item_no;
+
+static void conf(struct menu *menu);
+static void conf_choice(struct menu *menu);
+static void conf_string(struct menu *menu);
+static void conf_load(void);
+static void conf_save(void);
+static void show_textbox(const char *title, const char *text, int r, int c);
+static void show_helptext(const char *title, const char *text);
+static void show_help(struct menu *menu);
+static void show_readme(void);
+
+static void init_wsize(void)
+{
+	struct winsize ws;
+	char *env;
+
+	if (ioctl(1, TIOCGWINSZ, &ws) == -1) {
+		rows = 24;
+		cols = 80;
+	} else {
+		rows = ws.ws_row;
+		cols = ws.ws_col;
+		if (!rows) {
+			env = getenv("LINES");
+			if (env)
+				rows = atoi(env);
+			if (!rows)
+				rows = 24;
+		}
+		if (!cols) {
+			env = getenv("COLUMNS");
+			if (env)
+				cols = atoi(env);
+			if (!cols)
+				cols = 80;
+		}
+	}
+
+	if (rows < 19 || cols < 80) {
+		fprintf(stderr, "Your display is too small to run Menuconfig!\n");
+		fprintf(stderr, "It must be at least 19 lines by 80 columns.\n");
+		exit(1);
+	}
+
+	rows -= 4;
+	cols -= 5;
+}
+
+static void cinit(void)
+{
+	item_no = 0;
+}
+
+static void cmake(void)
+{
+	items[item_no] = malloc(sizeof(struct dialog_list_item));
+	memset(items[item_no], 0, sizeof(struct dialog_list_item));
+	items[item_no]->tag = malloc(32); items[item_no]->tag[0] = 0;
+	items[item_no]->name = malloc(512); items[item_no]->name[0] = 0;
+	items[item_no]->namelen = 0;
+	item_no++;
+}
+
+static int cprint_name(const char *fmt, ...)
+{
+	va_list ap;
+	int res;
+
+	if (!item_no)
+		cmake();
+	va_start(ap, fmt);
+	res = vsnprintf(items[item_no - 1]->name + items[item_no - 1]->namelen,
+			512 - items[item_no - 1]->namelen, fmt, ap);
+	if (res > 0)
+		items[item_no - 1]->namelen += res;
+	va_end(ap);
+
+	return res;
+}
+
+static int cprint_tag(const char *fmt, ...)
+{
+	va_list ap;
+	int res;
+
+	if (!item_no)
+		cmake();
+	va_start(ap, fmt);
+	res = vsnprintf(items[item_no - 1]->tag, 32, fmt, ap);
+	va_end(ap);
+
+	return res;
+}
+
+static void cdone(void)
+{
+	int i;
+
+	for (i = 0; i < item_no; i++) {
+		free(items[i]->tag);
+		free(items[i]->name);
+		free(items[i]);
+	}
+
+	item_no = 0;
+}
+
+static void build_conf(struct menu *menu)
+{
+	struct symbol *sym;
+	struct property *prop;
+	struct menu *child;
+	int type, tmp, doint = 2;
+	tristate val;
+	char ch;
+
+	if (!menu_is_visible(menu))
+		return;
+
+	sym = menu->sym;
+	prop = menu->prompt;
+	if (!sym) {
+		if (prop && menu != current_menu) {
+			const char *prompt = menu_get_prompt(menu);
+			switch (prop->type) {
+			case P_MENU:
+				child_count++;
+				cmake();
+				cprint_tag("m%p", menu);
+
+				if (single_menu_mode) {
+					cprint_name("%s%*c%s",
+						menu->data ? "-->" : "++>",
+						indent + 1, ' ', prompt);
+				} else {
+					cprint_name("   %*c%s  --->", indent + 1, ' ', prompt);
+				}
+
+				if (single_menu_mode && menu->data)
+					goto conf_childs;
+				return;
+			default:
+				if (prompt) {
+					child_count++;
+					cmake();
+					cprint_tag(":%p", menu);
+					cprint_name("---%*c%s", indent + 1, ' ', prompt);
+				}
+			}
+		} else
+			doint = 0;
+		goto conf_childs;
+	}
+
+	cmake();
+	type = sym_get_type(sym);
+	if (sym_is_choice(sym)) {
+		struct symbol *def_sym = sym_get_choice_value(sym);
+		struct menu *def_menu = NULL;
+
+		child_count++;
+		for (child = menu->list; child; child = child->next) {
+			if (menu_is_visible(child) && child->sym == def_sym)
+				def_menu = child;
+		}
+
+		val = sym_get_tristate_value(sym);
+		if (sym_is_changable(sym)) {
+			cprint_tag("t%p", menu);
+			switch (type) {
+			case S_BOOLEAN:
+				cprint_name("[%c]", val == no ? ' ' : '*');
+				break;
+			case S_TRISTATE:
+				switch (val) {
+				case yes: ch = '*'; break;
+				case mod: ch = 'M'; break;
+				default:  ch = ' '; break;
+				}
+				cprint_name("<%c>", ch);
+				break;
+			}
+		} else {
+			cprint_tag("%c%p", def_menu ? 't' : ':', menu);
+			cprint_name("   ");
+		}
+
+		cprint_name("%*c%s", indent + 1, ' ', menu_get_prompt(menu));
+		if (val == yes) {
+			if (def_menu) {
+				cprint_name(" (%s)", menu_get_prompt(def_menu));
+				cprint_name("  --->");
+				if (def_menu->list) {
+					indent += 2;
+					build_conf(def_menu);
+					indent -= 2;
+				}
+			}
+			return;
+		}
+	} else {
+                if (menu == current_menu) {
+                        cprint_tag(":%p", menu);
+                        cprint_name("---%*c%s", indent + 1, ' ', menu_get_prompt(menu));
+                        goto conf_childs;
+                }
+
+		child_count++;
+		val = sym_get_tristate_value(sym);
+		if (sym_is_choice_value(sym) && val == yes) {
+			cprint_tag(":%p", menu);
+			cprint_name("   ");
+		} else {
+			switch (type) {
+			case S_BOOLEAN:
+				cprint_tag("t%p", menu);
+				if (sym_is_changable(sym))
+					cprint_name("[%c]", val == no ? ' ' : '*');
+				else
+					cprint_name(val == no ? "_ _" : "-+-");
+				break;
+			case S_TRISTATE:
+				cprint_tag("t%p", menu);
+				switch (val) {
+				case yes: ch = '*'; break;
+				case mod: ch = 'M'; break;
+				default:  ch = ' '; break;
+				}
+				if (sym_is_changable(sym))
+					cprint_name("<%c>", ch);
+				else
+					cprint_name(val == no ? "_ _" : "-+-");
+				break;
+			default:
+				cprint_tag("s%p", menu);
+				tmp = cprint_name("(%s)", sym_get_string_value(sym));
+				tmp = indent - tmp + 4;
+				if (tmp < 0)
+					tmp = 0;
+				cprint_name("%*c%s%s", tmp, ' ', menu_get_prompt(menu),
+					(sym_has_value(sym) || !sym_is_changable(sym)) ?
+					"" : " (NEW)");
+				goto conf_childs;
+			}
+		}
+		cprint_name("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu),
+			(sym_has_value(sym) || !sym_is_changable(sym)) ?
+			"" : " (NEW)");
+		if (menu->prompt->type == P_MENU) {
+			cprint_name("  --->");
+			return;
+		}
+	}
+
+conf_childs:
+	indent += doint;
+	for (child = menu->list; child; child = child->next)
+		build_conf(child);
+	indent -= doint;
+}
+
+static void conf(struct menu *menu)
+{
+	struct dialog_list_item *active_item = NULL;
+	struct menu *submenu;
+	const char *prompt = menu_get_prompt(menu);
+	struct symbol *sym;
+	char active_entry[40];
+	int stat, type;
+
+	unlink("lxdialog.scrltmp");
+	active_entry[0] = 0;
+	while (1) {
+		indent = 0;
+		child_count = 0;
+  		current_menu = menu;
+		cdone(); cinit();
+		build_conf(menu);
+		if (!child_count)
+			break;
+		if (menu == &rootmenu) {
+			cmake(); cprint_tag(":"); cprint_name("--- ");
+			cmake(); cprint_tag("L"); cprint_name("Load an Alternate Configuration File");
+			cmake(); cprint_tag("S"); cprint_name("Save Configuration to an Alternate File");
+		}
+		dialog_clear();
+		stat = dialog_menu(prompt ? prompt : "Main Menu",
+				menu_instructions, rows, cols, rows - 10,
+				active_entry, item_no, items);
+		if (stat < 0)
+			return;
+
+		if (stat == 1 || stat == 255)
+			break;
+
+		active_item = first_sel_item(item_no, items);
+		if (!active_item)
+			continue;
+		active_item->selected = 0;
+		strncpy(active_entry, active_item->tag, sizeof(active_entry));
+		active_entry[sizeof(active_entry)-1] = 0;
+		type = active_entry[0];
+		if (!type)
+			continue;
+
+		sym = NULL;
+		submenu = NULL;
+		if (sscanf(active_entry + 1, "%p", &submenu) == 1)
+			sym = submenu->sym;
+
+		switch (stat) {
+		case 0:
+			switch (type) {
+			case 'm':
+				if (single_menu_mode)
+					submenu->data = (void *) (long) !submenu->data;
+				else
+					conf(submenu);
+				break;
+			case 't':
+				if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)
+					conf_choice(submenu);
+				else if (submenu->prompt->type == P_MENU)
+					conf(submenu);
+				break;
+			case 's':
+				conf_string(submenu);
+				break;
+			case 'L':
+				conf_load();
+				break;
+			case 'S':
+				conf_save();
+				break;
+			}
+			break;
+		case 2:
+			if (sym)
+				show_help(submenu);
+			else
+				show_readme();
+			break;
+		case 3:
+			if (type == 't') {
+				if (sym_set_tristate_value(sym, yes))
+					break;
+				if (sym_set_tristate_value(sym, mod))
+					show_textbox(NULL, setmod_text, 6, 74);
+			}
+			break;
+		case 4:
+			if (type == 't')
+				sym_set_tristate_value(sym, no);
+			break;
+		case 5:
+			if (type == 't')
+				sym_set_tristate_value(sym, mod);
+			break;
+		case 6:
+			if (type == 't')
+				sym_toggle_tristate_value(sym);
+			else if (type == 'm')
+				conf(submenu);
+			break;
+		}
+	}
+}
+
+static void show_textbox(const char *title, const char *text, int r, int c)
+{
+	int fd;
+
+	fd = creat(".help.tmp", 0777);
+	write(fd, text, strlen(text));
+	close(fd);
+	while (dialog_textbox(title, ".help.tmp", r, c) < 0)
+		;
+	unlink(".help.tmp");
+}
+
+static void show_helptext(const char *title, const char *text)
+{
+	show_textbox(title, text, rows, cols);
+}
+
+static void show_help(struct menu *menu)
+{
+	const char *help;
+	char *helptext;
+	struct symbol *sym = menu->sym;
+
+	help = sym->help;
+	if (!help)
+		help = nohelp_text;
+	if (sym->name) {
+		helptext = malloc(strlen(sym->name) + strlen(help) + 16);
+		sprintf(helptext, "%s:\n\n%s", sym->name, help);
+		show_helptext(menu_get_prompt(menu), helptext);
+		free(helptext);
+	} else
+		show_helptext(menu_get_prompt(menu), help);
+}
+
+static void show_readme(void)
+{
+	show_helptext("Help", top_menu_help);
+}
+
+static void conf_choice(struct menu *menu)
+{
+	const char *prompt = menu_get_prompt(menu);
+	struct menu *child;
+	struct symbol *active;
+
+	active = sym_get_choice_value(menu->sym);
+	while (1) {
+		current_menu = menu;
+		cdone(); cinit();
+		for (child = menu->list; child; child = child->next) {
+			if (!menu_is_visible(child))
+				continue;
+			cmake();
+			cprint_tag("%p", child);
+			cprint_name("%s", menu_get_prompt(child));
+			if (child->sym == sym_get_choice_value(menu->sym))
+				items[item_no - 1]->selected = 1; /* ON */
+			else if (child->sym == active)
+				items[item_no - 1]->selected = 2; /* SELECTED */
+			else
+				items[item_no - 1]->selected = 0; /* OFF */
+		}
+
+		switch (dialog_checklist(prompt ? prompt : "Main Menu",
+					radiolist_instructions, 15, 70, 6,
+					item_no, items, FLAG_RADIO)) {
+		case 0:
+			if (sscanf(first_sel_item(item_no, items)->tag, "%p", &child) != 1)
+				break;
+			sym_set_tristate_value(child->sym, yes);
+			return;
+		case 1:
+			if (sscanf(first_sel_item(item_no, items)->tag, "%p", &child) == 1) {
+				show_help(child);
+				active = child->sym;
+			} else
+				show_help(menu);
+			break;
+		case 255:
+			return;
+		}
+	}
+}
+
+static void conf_string(struct menu *menu)
+{
+	const char *prompt = menu_get_prompt(menu);
+
+	while (1) {
+		char *heading;
+
+		switch (sym_get_type(menu->sym)) {
+		case S_INT:
+			heading = (char *) inputbox_instructions_int;
+			break;
+		case S_HEX:
+			heading = (char *) inputbox_instructions_hex;
+			break;
+		case S_STRING:
+			heading = (char *) inputbox_instructions_string;
+			break;
+		default:
+			heading = "Internal mconf error!";
+			/* panic? */;
+		}
+
+		switch (dialog_inputbox(prompt ? prompt : "Main Menu",
+					heading, 10, 75,
+					sym_get_string_value(menu->sym))) {
+		case 0:
+			if (sym_set_string_value(menu->sym, (const char*)dialog_input_result))
+				return;
+			show_textbox(NULL, "You have made an invalid entry.", 5, 43);
+			break;
+		case 1:
+			show_help(menu);
+			break;
+		case 255:
+			return;
+		}
+	}
+}
+
+static void conf_load(void)
+{
+	while (1) {
+		switch (dialog_inputbox(NULL, load_config_text, 11, 55,
+					filename)) {
+		case 0:
+			if (!dialog_input_result[0])
+				return;
+			if (!conf_read((const char*)dialog_input_result))
+				return;
+			show_textbox(NULL, "File does not exist!", 5, 38);
+			break;
+		case 1:
+			show_helptext("Load Alternate Configuration", load_config_help);
+			break;
+		case 255:
+			return;
+		}
+	}
+}
+
+static void conf_save(void)
+{
+	while (1) {
+		switch (dialog_inputbox(NULL, save_config_text, 11, 55,
+					filename)) {
+		case 0:
+			if (!dialog_input_result[0])
+				return;
+			if (!conf_write((const char*)dialog_input_result))
+				return;
+			show_textbox(NULL, "Can't create file!  Probably a nonexistent directory.", 5, 60);
+			break;
+		case 1:
+			show_helptext("Save Alternate Configuration", save_config_help);
+			break;
+		case 255:
+			return;
+		}
+	}
+}
+
+static void conf_cleanup(void)
+{
+	tcsetattr(1, TCSAFLUSH, &ios_org);
+	unlink(".help.tmp");
+}
+
+static void winch_handler(int sig)
+{
+	struct winsize ws;
+
+	if (ioctl(1, TIOCGWINSZ, &ws) == -1) {
+		rows = 24;
+		cols = 80;
+	} else {
+		rows = ws.ws_row;
+		cols = ws.ws_col;
+	}
+
+	if (rows < 19 || cols < 80) {
+		end_dialog();
+		fprintf(stderr, "Your display is too small to run Menuconfig!\n");
+		fprintf(stderr, "It must be at least 19 lines by 80 columns.\n");
+		exit(1);
+	}
+
+	rows -= 4;
+	cols -= 5;
+
+}
+
+int main(int ac, char **av)
+{
+	int stat;
+	char *mode;
+	struct symbol *sym;
+
+	conf_parse(av[1]);
+	conf_read(NULL);
+
+	sym = sym_lookup("VERSION", 0);
+	sym_calc_value(sym);
+	snprintf(menu_backtitle, 128, "OpenADK v%s Configuration",
+		sym_get_string_value(sym));
+
+	mode = getenv("MENUCONFIG_MODE");
+	if (mode) {
+		if (!strcasecmp(mode, "single_menu"))
+			single_menu_mode = 1;
+	}
+
+	tcgetattr(1, &ios_org);
+	atexit(conf_cleanup);
+	init_wsize();
+	init_dialog();
+	signal(SIGWINCH, winch_handler);
+	conf(&rootmenu);
+	end_dialog();
+
+	/* Restart dialog to act more like when lxdialog was still separate */
+	init_dialog();
+	do {
+		stat = dialog_yesno(NULL,
+				"Do you wish to save your new OpenADK configuration?", 5, 60);
+	} while (stat < 0);
+	end_dialog();
+
+	if (stat == 0) {
+		conf_write(NULL);
+		printf("\n\n*** End of OpenADK configuration.\n");
+	} else
+		printf("\n\nYour OpenADK configuration changes were NOT saved.\n\n");
+
+	return 0;
+}

+ 436 - 0
config/menu.c

@@ -0,0 +1,436 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+struct menu rootmenu;
+struct menu *current_menu, *current_entry;
+static struct menu **last_entry_ptr;
+
+struct file *file_list;
+struct file *current_file;
+
+static void menu_warn(struct menu *menu, const char *fmt, ...)
+{
+	va_list ap;
+	va_start(ap, fmt);
+	fprintf(stderr, "%s:%d:warning: ", menu->file->name, menu->lineno);
+	vfprintf(stderr, fmt, ap);
+	fprintf(stderr, "\n");
+	va_end(ap);
+}
+
+static void prop_warn(struct property *prop, const char *fmt, ...)
+{
+	va_list ap;
+	va_start(ap, fmt);
+	fprintf(stderr, "%s:%d:warning: ", prop->file->name, prop->lineno);
+	vfprintf(stderr, fmt, ap);
+	fprintf(stderr, "\n");
+	va_end(ap);
+}
+
+void menu_init(void)
+{
+	current_entry = current_menu = &rootmenu;
+	last_entry_ptr = &rootmenu.list;
+}
+
+void menu_add_entry(struct symbol *sym)
+{
+	struct menu *menu;
+
+	menu = malloc(sizeof(*menu));
+	memset(menu, 0, sizeof(*menu));
+	menu->sym = sym;
+	menu->parent = current_menu;
+	menu->file = current_file;
+	menu->lineno = zconf_lineno();
+
+	*last_entry_ptr = menu;
+	last_entry_ptr = &menu->next;
+	current_entry = menu;
+}
+
+void menu_end_entry(void)
+{
+}
+
+void menu_add_menu(void)
+{
+	current_menu = current_entry;
+	last_entry_ptr = &current_entry->list;
+}
+
+void menu_end_menu(void)
+{
+	last_entry_ptr = &current_menu->next;
+	current_menu = current_menu->parent;
+}
+
+struct expr *menu_check_dep(struct expr *e)
+{
+	if (!e)
+		return e;
+
+	switch (e->type) {
+	case E_NOT:
+		e->left.expr = menu_check_dep(e->left.expr);
+		break;
+	case E_OR:
+	case E_AND:
+		e->left.expr = menu_check_dep(e->left.expr);
+		e->right.expr = menu_check_dep(e->right.expr);
+		break;
+	case E_SYMBOL:
+		/* change 'm' into 'm' && MODULES */
+		if (e->left.sym == &symbol_mod)
+			return expr_alloc_and(e, expr_alloc_symbol(modules_sym));
+		break;
+	default:
+		break;
+	}
+	return e;
+}
+
+void menu_add_dep(struct expr *dep)
+{
+	current_entry->dep = expr_alloc_and(current_entry->dep, menu_check_dep(dep));
+}
+
+void menu_set_type(int type)
+{
+	struct symbol *sym = current_entry->sym;
+
+	if (sym->type == type)
+		return;
+	if (sym->type == S_UNKNOWN) {
+		sym->type = type;
+		return;
+	}
+	menu_warn(current_entry, "type of '%s' redefined from '%s' to '%s'\n",
+	    sym->name ? sym->name : "<choice>",
+	    sym_type_name(sym->type), sym_type_name(type));
+}
+
+struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep)
+{
+	struct property *prop = prop_alloc(type, current_entry->sym);
+
+	prop->menu = current_entry;
+	prop->text = prompt;
+	prop->expr = expr;
+	prop->visible.expr = menu_check_dep(dep);
+
+	if (prompt) {
+		if (current_entry->prompt)
+			menu_warn(current_entry, "prompt redefined\n");
+		current_entry->prompt = prop;
+	}
+
+	return prop;
+}
+
+void menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep)
+{
+	menu_add_prop(type, prompt, NULL, dep);
+}
+
+void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep)
+{
+	menu_add_prop(type, NULL, expr, dep);
+}
+
+void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep)
+{
+	menu_add_prop(type, NULL, expr_alloc_symbol(sym), dep);
+}
+
+void sym_check_prop(struct symbol *sym)
+{
+	struct property *prop;
+	struct symbol *sym2;
+	for (prop = sym->prop; prop; prop = prop->next) {
+		switch (prop->type) {
+		case P_DEFAULT:
+			if ((sym->type == S_STRING || sym->type == S_INT || sym->type == S_HEX) &&
+			    prop->expr->type != E_SYMBOL)
+				prop_warn(prop,
+				    "default for config symbol '%'"
+				    " must be a single symbol", sym->name);
+			break;
+		case P_SELECT:
+		case P_SELECTNOT:
+			sym2 = prop_get_symbol(prop);
+			if (sym->type != S_BOOLEAN && sym->type != S_TRISTATE)
+				prop_warn(prop,
+				    "config symbol '%s' uses select, but is "
+				    "not boolean or tristate", sym->name);
+			else if (sym2->type == S_UNKNOWN)
+				prop_warn(prop,
+				    "'select' used by config symbol '%s' "
+				    "refer to undefined symbol '%s'",
+				    sym->name, sym2->name);
+			else if (sym2->type != S_BOOLEAN && sym2->type != S_TRISTATE)
+				prop_warn(prop,
+				    "'%s' has wrong type. 'select' only "
+				    "accept arguments of boolean and "
+				    "tristate type", sym2->name);
+			break;
+		case P_RANGE:
+			if (sym->type != S_INT && sym->type != S_HEX)
+				prop_warn(prop, "range is only allowed "
+				                "for int or hex symbols");
+			if (!sym_string_valid(sym, prop->expr->left.sym->name) ||
+			    !sym_string_valid(sym, prop->expr->right.sym->name))
+				prop_warn(prop, "range is invalid");
+			break;
+		default:
+			;
+		}
+	}
+}
+
+void menu_finalize(struct menu *parent)
+{
+	struct menu *menu, *last_menu;
+	struct symbol *sym;
+	struct property *prop;
+	struct expr *parentdep, *basedep, *dep, *dep2, **ep;
+
+	sym = parent->sym;
+	if (parent->list) {
+		if (sym && sym_is_choice(sym)) {
+			/* find the first choice value and find out choice type */
+			for (menu = parent->list; menu; menu = menu->next) {
+				if (menu->sym) {
+					current_entry = parent;
+					menu_set_type(menu->sym->type);
+					current_entry = menu;
+					menu_set_type(sym->type);
+					break;
+				}
+			}
+			parentdep = expr_alloc_symbol(sym);
+		} else if (parent->prompt)
+			parentdep = parent->prompt->visible.expr;
+		else
+			parentdep = parent->dep;
+
+		for (menu = parent->list; menu; menu = menu->next) {
+			basedep = expr_transform(menu->dep);
+			basedep = expr_alloc_and(expr_copy(parentdep), basedep);
+			basedep = expr_eliminate_dups(basedep);
+			menu->dep = basedep;
+			if (menu->sym)
+				prop = menu->sym->prop;
+			else
+				prop = menu->prompt;
+			for (; prop; prop = prop->next) {
+				if (prop->menu != menu)
+					continue;
+				dep = expr_transform(prop->visible.expr);
+				dep = expr_alloc_and(expr_copy(basedep), dep);
+				dep = expr_eliminate_dups(dep);
+				if (menu->sym && menu->sym->type != S_TRISTATE)
+					dep = expr_trans_bool(dep);
+				prop->visible.expr = dep;
+				if (prop->type == P_SELECT) {
+					struct symbol *es = prop_get_symbol(prop);
+					es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr,
+							expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep)));
+				} else if (prop->type == P_SELECTNOT) {
+					struct symbol *es = prop_get_symbol(prop);
+					es->rev_dep_inv.expr = expr_alloc_or(es->rev_dep_inv.expr,
+							expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep)));
+				}
+			}
+		}
+		for (menu = parent->list; menu; menu = menu->next)
+			menu_finalize(menu);
+	} else if (sym) {
+		basedep = parent->prompt ? parent->prompt->visible.expr : NULL;
+		basedep = expr_trans_compare(basedep, E_UNEQUAL, &symbol_no);
+		basedep = expr_eliminate_dups(expr_transform(basedep));
+		last_menu = NULL;
+		for (menu = parent->next; menu; menu = menu->next) {
+			dep = menu->prompt ? menu->prompt->visible.expr : menu->dep;
+			if (!expr_contains_symbol(dep, sym))
+				break;
+			if (expr_depends_symbol(dep, sym))
+				goto next;
+			dep = expr_trans_compare(dep, E_UNEQUAL, &symbol_no);
+			dep = expr_eliminate_dups(expr_transform(dep));
+			dep2 = expr_copy(basedep);
+			expr_eliminate_eq(&dep, &dep2);
+			expr_free(dep);
+			if (!expr_is_yes(dep2)) {
+				expr_free(dep2);
+				break;
+			}
+			expr_free(dep2);
+		next:
+			menu_finalize(menu);
+			menu->parent = parent;
+			last_menu = menu;
+		}
+		if (last_menu) {
+			parent->list = parent->next;
+			parent->next = last_menu->next;
+			last_menu->next = NULL;
+		}
+	}
+	for (menu = parent->list; menu; menu = menu->next) {
+		if (sym && sym_is_choice(sym) && menu->sym) {
+			menu->sym->flags |= SYMBOL_CHOICEVAL;
+			if (!menu->prompt)
+				menu_warn(menu, "choice value must have a prompt");
+			for (prop = menu->sym->prop; prop; prop = prop->next) {
+				if (prop->type == P_PROMPT && prop->menu != menu) {
+					prop_warn(prop, "choice values "
+					    "currently only support a "
+					    "single prompt");
+				}
+				if (prop->type == P_DEFAULT)
+					prop_warn(prop, "defaults for choice "
+					    "values not supported");
+			}
+			current_entry = menu;
+			menu_set_type(sym->type);
+			menu_add_symbol(P_CHOICE, sym, NULL);
+			prop = sym_get_choice_prop(sym);
+			for (ep = &prop->expr; *ep; ep = &(*ep)->left.expr)
+				;
+			*ep = expr_alloc_one(E_CHOICE, NULL);
+			(*ep)->right.sym = menu->sym;
+		}
+		if (menu->list && (!menu->prompt || !menu->prompt->text)) {
+			for (last_menu = menu->list; ; last_menu = last_menu->next) {
+				last_menu->parent = parent;
+				if (!last_menu->next)
+					break;
+			}
+			last_menu->next = menu->next;
+			menu->next = menu->list;
+			menu->list = NULL;
+		}
+	}
+
+	if (sym && !(sym->flags & SYMBOL_WARNED)) {
+		if (sym->type == S_UNKNOWN)
+			menu_warn(parent, "config symbol defined "
+			    "without type\n");
+
+		if (sym_is_choice(sym) && !parent->prompt)
+			menu_warn(parent, "choice must have a prompt\n");
+
+		/* Check properties connected to this symbol */
+		sym_check_prop(sym);
+		sym->flags |= SYMBOL_WARNED;
+	}
+
+	if (sym && !sym_is_optional(sym) && parent->prompt) {
+		sym->rev_dep.expr = expr_alloc_or(sym->rev_dep.expr,
+				expr_alloc_and(parent->prompt->visible.expr,
+					expr_alloc_symbol(&symbol_mod)));
+	}
+}
+
+bool menu_is_visible(struct menu *menu)
+{
+	struct menu *child;
+	struct symbol *sym;
+	tristate visible;
+
+	if (!menu->prompt)
+		return false;
+	sym = menu->sym;
+	if (sym) {
+		sym_calc_value(sym);
+		visible = menu->prompt->visible.tri;
+	} else
+		visible = menu->prompt->visible.tri = expr_calc_value(menu->prompt->visible.expr);
+
+	if (visible != no)
+		return true;
+	if (!sym || sym_get_tristate_value(menu->sym) == no)
+		return false;
+
+	for (child = menu->list; child; child = child->next)
+		if (menu_is_visible(child))
+			return true;
+	return false;
+}
+
+const char *menu_get_prompt(struct menu *menu)
+{
+	if (menu->prompt)
+		return menu->prompt->text;
+	else if (menu->sym)
+		return menu->sym->name;
+	return NULL;
+}
+
+struct menu *menu_get_root_menu(struct menu *menu)
+{
+	return &rootmenu;
+}
+
+struct menu *menu_get_parent_menu(struct menu *menu)
+{
+	enum prop_type type;
+
+	for (; menu != &rootmenu; menu = menu->parent) {
+		type = menu->prompt ? menu->prompt->type : 0;
+		if (type == P_MENU)
+			break;
+	}
+	return menu;
+}
+
+struct file *file_lookup(const char *name)
+{
+	struct file *file;
+
+	for (file = file_list; file; file = file->next) {
+		if (!strcmp(name, file->name))
+			return file;
+	}
+
+	file = malloc(sizeof(*file));
+	memset(file, 0, sizeof(*file));
+	file->name = strdup(name);
+	file->next = file_list;
+	file_list = file;
+	return file;
+}
+
+int file_write_dep(const char *name)
+{
+	struct file *file;
+	FILE *out;
+
+	if (!name)
+		name = ".config.cmd";
+	out = fopen(".config.tmp", "w");
+	if (!out)
+		return 1;
+	fprintf(out, "deps_config := \\\n");
+	for (file = file_list; file; file = file->next) {
+		if (file->next)
+			fprintf(out, "\t%s \\\n", file->name);
+		else
+			fprintf(out, "\t%s\n", file->name);
+	}
+	fprintf(out, "\n.config include/config.h: $(deps_config)\n\n$(deps_config):\n");
+	fclose(out);
+	rename(".config.tmp", name);
+	return 0;
+}
+

+ 438 - 0
config/menubox.c

@@ -0,0 +1,438 @@
+/*
+ *  menubox.c -- implements the menu box
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcapw@cfw.com)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*
+ *  Changes by Clifford Wolf (god@clifford.at)
+ *
+ *  [ 1998-06-13 ]
+ *
+ *    *)  A bugfix for the Page-Down problem
+ *
+ *    *)  Formerly when I used Page Down and Page Up, the cursor would be set
+ *        to the first position in the menu box.  Now lxdialog is a bit
+ *        smarter and works more like other menu systems (just have a look at
+ *        it).
+ *
+ *    *)  Formerly if I selected something my scrolling would be broken because
+ *        lxdialog is re-invoked by the Menuconfig shell script, can't
+ *        remember the last scrolling position, and just sets it so that the
+ *        cursor is at the bottom of the box.  Now it writes the temporary file
+ *        lxdialog.scrltmp which contains this information. The file is
+ *        deleted by lxdialog if the user leaves a submenu or enters a new
+ *        one, but it would be nice if Menuconfig could make another "rm -f"
+ *        just to be sure.  Just try it out - you will recognise a difference!
+ *
+ *  [ 1998-06-14 ]
+ *
+ *    *)  Now lxdialog is crash-safe against broken "lxdialog.scrltmp" files
+ *        and menus change their size on the fly.
+ *
+ *    *)  If for some reason the last scrolling position is not saved by
+ *        lxdialog, it sets the scrolling so that the selected item is in the
+ *        middle of the menu box, not at the bottom.
+ *
+ * 02 January 1999, Michael Elizabeth Chastain (mec@shout.net)
+ * Reset 'scroll' to 0 if the value from lxdialog.scrltmp is bogus.
+ * This fixes a bug in Menuconfig where using ' ' to descend into menus
+ * would leave mis-synchronized lxdialog.scrltmp files lying around,
+ * fscanf would read in 'scroll', and eventually that value would get used.
+ */
+
+#include "dialog.h"
+
+static int menu_width, item_x;
+
+/*
+ * Print menu item
+ */
+static void
+print_item (WINDOW * win, const char *item, int choice, int selected, int hotkey)
+{
+    int j;
+    char menu_item[menu_width+1];
+
+    strncpy(menu_item, item, menu_width);
+    menu_item[menu_width] = 0;
+    j = first_alpha(menu_item, "YyNnMm");
+
+    /* Clear 'residue' of last item */
+    wattrset (win, menubox_attr);
+    wmove (win, choice, 0);
+#if OLD_NCURSES
+    {
+        int i;
+        for (i = 0; i < menu_width; i++)
+	    waddch (win, ' ');
+    }
+#else
+    wclrtoeol(win);
+#endif
+    wattrset (win, selected ? item_selected_attr : item_attr);
+    mvwaddstr (win, choice, item_x, menu_item);
+#if 0
+    if (hotkey) {
+    	wattrset (win, selected ? tag_key_selected_attr : tag_key_attr);
+    	mvwaddch(win, choice, item_x+j, menu_item[j]);
+    }
+#endif
+    if (selected) {
+	wmove (win, choice, item_x+1);
+	wrefresh (win);
+    }
+}
+
+/*
+ * Print the scroll indicators.
+ */
+static void
+print_arrows (WINDOW * win, int item_no, int scroll,
+		int y, int x, int height)
+{
+    int cur_y, cur_x;
+
+    getyx(win, cur_y, cur_x);
+
+    wmove(win, y, x);
+
+    if (scroll > 0) {
+	wattrset (win, uarrow_attr);
+	waddch (win, ACS_UARROW);
+	waddstr (win, "(-)");
+    }
+    else {
+	wattrset (win, menubox_attr);
+	waddch (win, ACS_HLINE);
+	waddch (win, ACS_HLINE);
+	waddch (win, ACS_HLINE);
+	waddch (win, ACS_HLINE);
+    }
+
+   y = y + height + 1;
+   wmove(win, y, x);
+
+   if ((height < item_no) && (scroll + height < item_no)) {
+	wattrset (win, darrow_attr);
+	waddch (win, ACS_DARROW);
+	waddstr (win, "(+)");
+    }
+    else {
+	wattrset (win, menubox_border_attr);
+	waddch (win, ACS_HLINE);
+	waddch (win, ACS_HLINE);
+	waddch (win, ACS_HLINE);
+	waddch (win, ACS_HLINE);
+   }
+
+   wmove(win, cur_y, cur_x);
+}
+
+/*
+ * Display the termination buttons.
+ */
+static void
+print_buttons (WINDOW *win, int height, int width, int selected)
+{
+    int x = width / 2 - 16;
+    int y = height - 2;
+
+    print_button (win, "Select", y, x, selected == 0);
+    print_button (win, " Exit ", y, x + 12, selected == 1);
+    print_button (win, " Help ", y, x + 24, selected == 2);
+
+    wmove(win, y, x+1+12*selected);
+    wrefresh (win);
+}
+
+/*
+ * Display a menu for choosing among a number of options
+ */
+int
+dialog_menu (const char *title, const char *prompt, int height, int width,
+		int menu_height, const char *current, int item_no,
+		struct dialog_list_item ** items)
+{
+    int i, j, x, y, box_x, box_y;
+    int key = 0, button = 0, scroll = 0, choice = 0, first_item = 0, max_choice;
+    WINDOW *dialog, *menu;
+    FILE *f;
+
+    max_choice = MIN (menu_height, item_no);
+
+    /* center dialog box on screen */
+    x = (COLS - width) / 2;
+    y = (LINES - height) / 2;
+
+    draw_shadow (stdscr, y, x, height, width);
+
+    dialog = newwin (height, width, y, x);
+    keypad (dialog, TRUE);
+
+    draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
+    wattrset (dialog, border_attr);
+    mvwaddch (dialog, height - 3, 0, ACS_LTEE);
+    for (i = 0; i < width - 2; i++)
+	waddch (dialog, ACS_HLINE);
+    wattrset (dialog, dialog_attr);
+    wbkgdset (dialog, dialog_attr & A_COLOR);
+    waddch (dialog, ACS_RTEE);
+
+    if (title != NULL && strlen(title) >= width-2 ) {
+	/* truncate long title -- mec */
+	char * title2 = malloc(width-2+1);
+	memcpy( title2, title, width-2 );
+	title2[width-2] = '\0';
+	title = title2;
+    }
+
+    if (title != NULL) {
+	wattrset (dialog, title_attr);
+	mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
+	waddstr (dialog, (char *)title);
+	waddch (dialog, ' ');
+    }
+
+    wattrset (dialog, dialog_attr);
+    print_autowrap (dialog, prompt, width - 2, 1, 3);
+
+    menu_width = width - 6;
+    box_y = height - menu_height - 5;
+    box_x = (width - menu_width) / 2 - 1;
+
+    /* create new window for the menu */
+    menu = subwin (dialog, menu_height, menu_width,
+		y + box_y + 1, x + box_x + 1);
+    keypad (menu, TRUE);
+
+    /* draw a box around the menu items */
+    draw_box (dialog, box_y, box_x, menu_height + 2, menu_width + 2,
+	      menubox_border_attr, menubox_attr);
+
+    /*
+     * Find length of longest item in order to center menu.
+     * Set 'choice' to default item.
+     */
+    item_x = 0;
+    for (i = 0; i < item_no; i++) {
+	item_x = MAX (item_x, MIN(menu_width, strlen (items[i]->name) + 2));
+	if (strcmp(current, items[i]->tag) == 0) choice = i;
+    }
+
+    item_x = (menu_width - item_x) / 2;
+
+    /* get the scroll info from the temp file */
+    if ( (f=fopen("lxdialog.scrltmp","r")) != NULL ) {
+	if ( (fscanf(f,"%d\n",&scroll) == 1) && (scroll <= choice) &&
+	     (scroll+max_choice > choice) && (scroll >= 0) &&
+	     (scroll+max_choice <= item_no) ) {
+	    first_item = scroll;
+	    choice = choice - scroll;
+	    fclose(f);
+	} else {
+	    scroll=0;
+	    remove("lxdialog.scrltmp");
+	    fclose(f);
+	    f=NULL;
+	}
+    }
+    if ( (choice >= max_choice) || (f==NULL && choice >= max_choice/2) ) {
+	if (choice >= item_no-max_choice/2)
+	    scroll = first_item = item_no-max_choice;
+	else
+	    scroll = first_item = choice - max_choice/2;
+	choice = choice - scroll;
+    }
+
+    /* Print the menu */
+    for (i=0; i < max_choice; i++) {
+	print_item (menu, items[first_item + i]->name, i, i == choice,
+                    (items[first_item + i]->tag[0] != ':'));
+    }
+
+    wnoutrefresh (menu);
+
+    print_arrows(dialog, item_no, scroll,
+		 box_y, box_x+item_x+1, menu_height);
+
+    print_buttons (dialog, height, width, 0);
+    wmove (menu, choice, item_x+1);
+    wrefresh (menu);
+
+    while (key != ESC) {
+	key = wgetch(menu);
+
+	if (key < 256 && isalpha(key)) key = tolower(key);
+
+	if (strchr("ynm", key))
+		i = max_choice;
+	else {
+        for (i = choice+1; i < max_choice; i++) {
+		j = first_alpha(items[scroll + i]->name, "YyNnMm>");
+		if (key == tolower(items[scroll + i]->name[j]))
+                	break;
+	}
+	if (i == max_choice)
+       		for (i = 0; i < max_choice; i++) {
+			j = first_alpha(items[scroll + i]->name, "YyNnMm>");
+			if (key == tolower(items[scroll + i]->name[j]))
+                		break;
+		}
+	}
+
+	if (i < max_choice ||
+            key == KEY_UP || key == KEY_DOWN ||
+            key == '-' || key == '+' ||
+            key == KEY_PPAGE || key == KEY_NPAGE) {
+
+            print_item (menu, items[scroll + choice]->name, choice, FALSE,
+                       (items[scroll + choice]->tag[0] != ':'));
+
+	    if (key == KEY_UP || key == '-') {
+                if (choice < 2 && scroll) {
+	            /* Scroll menu down */
+                    scrollok (menu, TRUE);
+                    wscrl (menu, -1);
+                    scrollok (menu, FALSE);
+
+                    scroll--;
+
+                    print_item (menu, items[scroll]->name, 0, FALSE,
+                               (items[scroll]->tag[0] != ':'));
+		} else
+		    choice = MAX(choice - 1, 0);
+
+	    } else if (key == KEY_DOWN || key == '+')  {
+
+		print_item (menu, items[scroll + choice]->name, choice, FALSE,
+                                (items[scroll + choice]->tag[0] != ':'));
+
+                if ((choice > max_choice-3) &&
+                    (scroll + max_choice < item_no)
+                   ) {
+		    /* Scroll menu up */
+		    scrollok (menu, TRUE);
+                    scroll (menu);
+                    scrollok (menu, FALSE);
+
+                    scroll++;
+
+                    print_item (menu, items[scroll + max_choice - 1]->name,
+                               max_choice-1, FALSE,
+                               (items[scroll + max_choice - 1]->tag[0] != ':'));
+                } else
+                    choice = MIN(choice+1, max_choice-1);
+
+	    } else if (key == KEY_PPAGE) {
+	        scrollok (menu, TRUE);
+                for (i=0; (i < max_choice); i++) {
+                    if (scroll > 0) {
+                	wscrl (menu, -1);
+                	scroll--;
+                	print_item (menu, items[scroll]->name, 0, FALSE,
+                	(items[scroll]->tag[0] != ':'));
+                    } else {
+                        if (choice > 0)
+                            choice--;
+                    }
+                }
+                scrollok (menu, FALSE);
+
+            } else if (key == KEY_NPAGE) {
+                for (i=0; (i < max_choice); i++) {
+                    if (scroll+max_choice < item_no) {
+			scrollok (menu, TRUE);
+			scroll(menu);
+			scrollok (menu, FALSE);
+                	scroll++;
+                	print_item (menu, items[scroll + max_choice - 1]->name,
+			            max_choice-1, FALSE,
+			            (items[scroll + max_choice - 1]->tag[0] != ':'));
+		    } else {
+			if (choice+1 < max_choice)
+			    choice++;
+		    }
+                }
+
+            } else
+                choice = i;
+
+            print_item (menu, items[scroll + choice]->name, choice, TRUE,
+                       (items[scroll + choice]->tag[0] != ':'));
+
+            print_arrows(dialog, item_no, scroll,
+                         box_y, box_x+item_x+1, menu_height);
+
+            wnoutrefresh (dialog);
+            wrefresh (menu);
+
+	    continue;		/* wait for another key press */
+        }
+
+	switch (key) {
+	case KEY_LEFT:
+	case TAB:
+	case KEY_RIGHT:
+	    button = ((key == KEY_LEFT ? --button : ++button) < 0)
+			? 2 : (button > 2 ? 0 : button);
+
+	    print_buttons(dialog, height, width, button);
+	    wrefresh (menu);
+	    break;
+	case ' ':
+	case 's':
+	case 'y':
+	case 'n':
+	case 'm':
+	    /* save scroll info */
+	    if ( (f=fopen("lxdialog.scrltmp","w")) != NULL ) {
+		fprintf(f,"%d\n",scroll);
+		fclose(f);
+	    }
+	    delwin (dialog);
+            items[scroll + choice]->selected = 1;
+            switch (key) {
+            case 's': return 3;
+            case 'y': return 3;
+            case 'n': return 4;
+            case 'm': return 5;
+            case ' ': return 6;
+            }
+	    return 0;
+	case 'h':
+	case '?':
+	    button = 2;
+	case '\n':
+	    delwin (dialog);
+	    items[scroll + choice]->selected = 1;
+
+	    remove("lxdialog.scrltmp");
+	    return button;
+	case 'e':
+	case 'x':
+	    key = ESC;
+	case ESC:
+	    break;
+	}
+    }
+
+    delwin (dialog);
+    remove("lxdialog.scrltmp");
+    return -1;			/* ESC pressed */
+}

+ 85 - 0
config/msgbox.c

@@ -0,0 +1,85 @@
+/*
+ *  msgbox.c -- implements the message box and info box
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcapw@cfw.com)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "dialog.h"
+
+/*
+ * Display a message box. Program will pause and display an "OK" button
+ * if the parameter 'pause' is non-zero.
+ */
+int
+dialog_msgbox (const char *title, const char *prompt, int height, int width,
+		int pause)
+{
+    int i, x, y, key = 0;
+    WINDOW *dialog;
+
+    /* center dialog box on screen */
+    x = (COLS - width) / 2;
+    y = (LINES - height) / 2;
+
+    draw_shadow (stdscr, y, x, height, width);
+
+    dialog = newwin (height, width, y, x);
+    keypad (dialog, TRUE);
+
+    draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
+
+    if (title != NULL && strlen(title) >= width-2 ) {
+	/* truncate long title -- mec */
+	char * title2 = malloc(width-2+1);
+	memcpy( title2, title, width-2 );
+	title2[width-2] = '\0';
+	title = title2;
+    }
+
+    if (title != NULL) {
+	wattrset (dialog, title_attr);
+	mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
+	waddstr (dialog, (char *)title);
+	waddch (dialog, ' ');
+    }
+    wattrset (dialog, dialog_attr);
+    print_autowrap (dialog, prompt, width - 2, 1, 2);
+
+    if (pause) {
+	wattrset (dialog, border_attr);
+	mvwaddch (dialog, height - 3, 0, ACS_LTEE);
+	for (i = 0; i < width - 2; i++)
+	    waddch (dialog, ACS_HLINE);
+	wattrset (dialog, dialog_attr);
+	waddch (dialog, ACS_RTEE);
+
+	print_button (dialog, "  Ok  ",
+		      height - 2, width / 2 - 4, TRUE);
+
+	wrefresh (dialog);
+	while (key != ESC && key != '\n' && key != ' ' &&
+               key != 'O' && key != 'o' && key != 'X' && key != 'x')
+	    key = wgetch (dialog);
+    } else {
+	key = '\n';
+	wrefresh (dialog);
+    }
+
+    delwin (dialog);
+    return key == ESC ? -1 : 0;
+}

+ 782 - 0
config/symbol.c

@@ -0,0 +1,782 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <ctype.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/utsname.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+extern int output_mode;
+
+struct symbol symbol_yes = {
+	.name = "y",
+	.curr = { "y", yes },
+	.flags = SYMBOL_YES|SYMBOL_VALID,
+}, symbol_mod = {
+	.name = "m",
+	.curr = { "m", mod },
+	.flags = SYMBOL_MOD|SYMBOL_VALID,
+}, symbol_no = {
+	.name = "n",
+	.curr = { "n", no },
+	.flags = SYMBOL_NO|SYMBOL_VALID,
+}, symbol_empty = {
+	.name = "",
+	.curr = { "", no },
+	.flags = SYMBOL_VALID,
+};
+
+int sym_change_count;
+struct symbol *modules_sym;
+tristate modules_val;
+
+void sym_add_default(struct symbol *sym, const char *def)
+{
+	struct property *prop = prop_alloc(P_DEFAULT, sym);
+
+	prop->expr = expr_alloc_symbol(sym_lookup(def, 1));
+}
+
+void sym_init(void)
+{
+	struct symbol *sym;
+	char *p;
+	static bool inited = false;
+
+	if (inited)
+		return;
+	inited = true;
+
+	sym = sym_lookup("VERSION", 0);
+	sym->type = S_STRING;
+	sym->flags |= SYMBOL_AUTO;
+	p = getenv("VERSION");
+	if (p)
+		sym_add_default(sym, p);
+
+	sym = sym_lookup("TARGET_ARCH", 0);
+	sym->type = S_STRING;
+	sym->flags |= SYMBOL_AUTO;
+	p = getenv("TARGET_ARCH");
+	if (p)
+		sym_add_default(sym, p);
+
+}
+
+enum symbol_type sym_get_type(struct symbol *sym)
+{
+	enum symbol_type type = sym->type;
+
+	if (type == S_TRISTATE) {
+		if (sym_is_choice_value(sym) && sym->visible == yes)
+			type = S_BOOLEAN;
+		else if (modules_val == no)
+			type = S_BOOLEAN;
+	}
+	return type;
+}
+
+const char *sym_type_name(enum symbol_type type)
+{
+	switch (type) {
+	case S_BOOLEAN:
+		return "boolean";
+	case S_TRISTATE:
+		return "tristate";
+	case S_INT:
+		return "integer";
+	case S_HEX:
+		return "hex";
+	case S_STRING:
+		return "string";
+	case S_UNKNOWN:
+		return "unknown";
+	case S_OTHER:
+		break;
+	}
+	return "???";
+}
+
+struct property *sym_get_choice_prop(struct symbol *sym)
+{
+	struct property *prop;
+
+	for_all_choices(sym, prop)
+		return prop;
+	return NULL;
+}
+
+struct property *sym_get_default_prop(struct symbol *sym)
+{
+	struct property *prop;
+
+	for_all_defaults(sym, prop) {
+		prop->visible.tri = expr_calc_value(prop->visible.expr);
+		if (prop->visible.tri != no || output_mode)
+			return prop;
+	}
+	return NULL;
+}
+
+struct property *sym_get_range_prop(struct symbol *sym)
+{
+	struct property *prop;
+
+	for_all_properties(sym, prop, P_RANGE) {
+		prop->visible.tri = expr_calc_value(prop->visible.expr);
+		if (prop->visible.tri != no)
+			return prop;
+	}
+	return NULL;
+}
+
+static void sym_calc_visibility(struct symbol *sym)
+{
+	struct property *prop;
+	tristate tri;
+	bool deselected = false;
+
+	/* any prompt visible? */
+	tri = no;
+	for_all_prompts(sym, prop) {
+		prop->visible.tri = expr_calc_value(prop->visible.expr);
+		tri = E_OR(tri, prop->visible.tri);
+	}
+	if (tri == mod && (sym->type != S_TRISTATE || modules_val == no))
+		tri = yes;
+	if (sym->rev_dep_inv.expr && (expr_calc_value(sym->rev_dep_inv.expr) == yes)) {
+		tri = no;
+		deselected = true;
+	}
+	if (sym->visible != tri) {
+		sym->visible = tri;
+		sym_set_changed(sym);
+	}
+	if (sym_is_choice_value(sym) || deselected)
+		return;
+	tri = no;
+	if (sym->rev_dep.expr)
+		tri = expr_calc_value(sym->rev_dep.expr);
+	if (tri == mod && sym_get_type(sym) == S_BOOLEAN)
+		tri = yes;
+	if (sym->rev_dep.tri != tri) {
+		sym->rev_dep.tri = tri;
+		sym_set_changed(sym);
+	}
+}
+
+static struct symbol *sym_calc_choice(struct symbol *sym)
+{
+	struct symbol *def_sym;
+	struct property *prop;
+	struct expr *e;
+
+	/* is the user choice visible? */
+	def_sym = sym->user.val;
+	if (def_sym) {
+		sym_calc_visibility(def_sym);
+		if (def_sym->visible != no)
+			return def_sym;
+	}
+
+	/* any of the defaults visible? */
+	for_all_defaults(sym, prop) {
+		prop->visible.tri = expr_calc_value(prop->visible.expr);
+		if (prop->visible.tri == no)
+			continue;
+		def_sym = prop_get_symbol(prop);
+		sym_calc_visibility(def_sym);
+		if (def_sym->visible != no)
+			return def_sym;
+	}
+
+	/* just get the first visible value */
+	prop = sym_get_choice_prop(sym);
+	for (e = prop->expr; e; e = e->left.expr) {
+		def_sym = e->right.sym;
+		sym_calc_visibility(def_sym);
+		if (def_sym->visible != no)
+			return def_sym;
+	}
+
+	/* no choice? reset tristate value */
+	sym->curr.tri = no;
+	return NULL;
+}
+
+void sym_calc_value(struct symbol *sym)
+{
+	struct symbol_value newval, oldval;
+	struct property *prop;
+	struct expr *e;
+
+	if (!sym)
+		return;
+
+	if (sym->flags & SYMBOL_VALID)
+		return;
+	sym->flags |= SYMBOL_VALID;
+
+	oldval = sym->curr;
+
+	switch (sym->type) {
+	case S_INT:
+	case S_HEX:
+	case S_STRING:
+		newval = symbol_empty.curr;
+		break;
+	case S_BOOLEAN:
+	case S_TRISTATE:
+		newval = symbol_no.curr;
+		break;
+	default:
+		sym->curr.val = sym->name;
+		sym->curr.tri = no;
+		return;
+	}
+	if (!sym_is_choice_value(sym))
+		sym->flags &= ~SYMBOL_WRITE;
+
+	sym_calc_visibility(sym);
+
+	/* set default if recursively called */
+	sym->curr = newval;
+
+	switch (sym_get_type(sym)) {
+	case S_BOOLEAN:
+	case S_TRISTATE:
+		if (sym_is_choice_value(sym) && sym->visible == yes) {
+			prop = sym_get_choice_prop(sym);
+			newval.tri = (prop_get_symbol(prop)->curr.val == sym) ? yes : no;
+		} else if (sym->rev_dep_inv.expr && (expr_calc_value(sym->rev_dep_inv.expr) == yes)) {
+			newval.tri = no;
+		} else if (E_OR(sym->visible, sym->rev_dep.tri) != no) {
+			sym->flags |= SYMBOL_WRITE;
+			if (sym_has_value(sym))
+				newval.tri = sym->user.tri;
+			else if (!sym_is_choice(sym)) {
+				prop = sym_get_default_prop(sym);
+				if (prop)
+					newval.tri = expr_calc_value(prop->expr);
+			}
+			newval.tri = E_OR(E_AND(newval.tri, sym->visible), sym->rev_dep.tri);
+		} else if (!sym_is_choice(sym)) {
+			prop = sym_get_default_prop(sym);
+			if (prop) {
+				sym->flags |= SYMBOL_WRITE;
+				newval.tri = expr_calc_value(prop->expr);
+			}
+		}
+		if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN)
+			newval.tri = yes;
+		break;
+	case S_STRING:
+	case S_HEX:
+	case S_INT:
+		if (sym->visible != no) {
+			sym->flags |= SYMBOL_WRITE;
+			if (sym_has_value(sym)) {
+				newval.val = sym->user.val;
+				break;
+			}
+		}
+		prop = sym_get_default_prop(sym);
+		if (prop) {
+			struct symbol *ds = prop_get_symbol(prop);
+			if (ds) {
+				sym->flags |= SYMBOL_WRITE;
+				sym_calc_value(ds);
+				newval.val = ds->curr.val;
+			}
+		}
+		break;
+	default:
+		;
+	}
+
+	sym->curr = newval;
+	if (sym_is_choice(sym) && newval.tri == yes)
+		sym->curr.val = sym_calc_choice(sym);
+
+	if (memcmp(&oldval, &sym->curr, sizeof(oldval)))
+		sym_set_changed(sym);
+	if (modules_sym == sym)
+		modules_val = modules_sym->curr.tri;
+
+	if (sym_is_choice(sym)) {
+		int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE);
+		prop = sym_get_choice_prop(sym);
+		for (e = prop->expr; e; e = e->left.expr) {
+			e->right.sym->flags |= flags;
+			if (flags & SYMBOL_CHANGED)
+				sym_set_changed(e->right.sym);
+		}
+	}
+}
+
+void sym_clear_all_valid(void)
+{
+	struct symbol *sym;
+	int i;
+
+	for_all_symbols(i, sym)
+		sym->flags &= ~SYMBOL_VALID;
+	sym_change_count++;
+	if (modules_sym)
+		sym_calc_value(modules_sym);
+}
+
+void sym_set_changed(struct symbol *sym)
+{
+	struct property *prop;
+
+	sym->flags |= SYMBOL_CHANGED;
+	for (prop = sym->prop; prop; prop = prop->next) {
+		if (prop->menu)
+			prop->menu->flags |= MENU_CHANGED;
+	}
+}
+
+void sym_set_all_changed(void)
+{
+	struct symbol *sym;
+	int i;
+
+	for_all_symbols(i, sym)
+		sym_set_changed(sym);
+}
+
+bool sym_tristate_within_range(struct symbol *sym, tristate val)
+{
+	int type = sym_get_type(sym);
+
+	if (sym->visible == no)
+		return false;
+
+	if (type != S_BOOLEAN && type != S_TRISTATE)
+		return false;
+
+	if (type == S_BOOLEAN && val == mod)
+		return false;
+	if (sym->visible <= sym->rev_dep.tri)
+		return false;
+	if (sym_is_choice_value(sym) && sym->visible == yes)
+		return val == yes;
+	return val >= sym->rev_dep.tri && val <= sym->visible;
+}
+
+bool sym_set_tristate_value(struct symbol *sym, tristate val)
+{
+	tristate oldval = sym_get_tristate_value(sym);
+
+	if (oldval != val && !sym_tristate_within_range(sym, val))
+		return false;
+
+	if (sym->flags & SYMBOL_NEW) {
+		sym->flags &= ~SYMBOL_NEW;
+		sym_set_changed(sym);
+	}
+	if (sym_is_choice_value(sym) && val == yes) {
+		struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym));
+
+		cs->user.val = sym;
+		cs->flags &= ~SYMBOL_NEW;
+	}
+
+	sym->user.tri = val;
+	if (oldval != val) {
+		sym_clear_all_valid();
+		if (sym == modules_sym)
+			sym_set_all_changed();
+	}
+
+	return true;
+}
+
+tristate sym_toggle_tristate_value(struct symbol *sym)
+{
+	tristate oldval, newval;
+
+	oldval = newval = sym_get_tristate_value(sym);
+	do {
+		switch (newval) {
+		case no:
+			newval = mod;
+			break;
+		case mod:
+			newval = yes;
+			break;
+		case yes:
+			newval = no;
+			break;
+		}
+		if (sym_set_tristate_value(sym, newval))
+			break;
+	} while (oldval != newval);
+	return newval;
+}
+
+bool sym_string_valid(struct symbol *sym, const char *str)
+{
+	char ch;
+
+	switch (sym->type) {
+	case S_STRING:
+		return true;
+	case S_INT:
+		ch = *str++;
+		if (ch == '-')
+			ch = *str++;
+		if (!isdigit(ch))
+			return false;
+		if (ch == '0' && *str != 0)
+			return false;
+		while ((ch = *str++)) {
+			if (!isdigit(ch))
+				return false;
+		}
+		return true;
+	case S_HEX:
+		if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
+			str += 2;
+		ch = *str++;
+		do {
+			if (!isxdigit(ch))
+				return false;
+		} while ((ch = *str++));
+		return true;
+	case S_BOOLEAN:
+	case S_TRISTATE:
+		switch (str[0]) {
+		case 'y': case 'Y':
+		case 'm': case 'M':
+		case 'n': case 'N':
+			return true;
+		}
+		return false;
+	default:
+		return false;
+	}
+}
+
+bool sym_string_within_range(struct symbol *sym, const char *str)
+{
+	struct property *prop;
+	int val;
+
+	switch (sym->type) {
+	case S_STRING:
+		return sym_string_valid(sym, str);
+	case S_INT:
+		if (!sym_string_valid(sym, str))
+			return false;
+		prop = sym_get_range_prop(sym);
+		if (!prop)
+			return true;
+		val = strtol(str, NULL, 10);
+		return val >= strtol(prop->expr->left.sym->name, NULL, 10) &&
+		       val <= strtol(prop->expr->right.sym->name, NULL, 10);
+	case S_HEX:
+		if (!sym_string_valid(sym, str))
+			return false;
+		prop = sym_get_range_prop(sym);
+		if (!prop)
+			return true;
+		val = strtol(str, NULL, 16);
+		return val >= strtol(prop->expr->left.sym->name, NULL, 16) &&
+		       val <= strtol(prop->expr->right.sym->name, NULL, 16);
+	case S_BOOLEAN:
+	case S_TRISTATE:
+		switch (str[0]) {
+		case 'y': case 'Y':
+			return sym_tristate_within_range(sym, yes);
+		case 'm': case 'M':
+			return sym_tristate_within_range(sym, mod);
+		case 'n': case 'N':
+			return sym_tristate_within_range(sym, no);
+		}
+		return false;
+	default:
+		return false;
+	}
+}
+
+bool sym_set_string_value(struct symbol *sym, const char *newval)
+{
+	const char *oldval;
+	char *val;
+	int size;
+
+	switch (sym->type) {
+	case S_BOOLEAN:
+	case S_TRISTATE:
+		switch (newval[0]) {
+		case 'y': case 'Y':
+			return sym_set_tristate_value(sym, yes);
+		case 'm': case 'M':
+			return sym_set_tristate_value(sym, mod);
+		case 'n': case 'N':
+			return sym_set_tristate_value(sym, no);
+		}
+		return false;
+	default:
+		;
+	}
+
+	if (!sym_string_within_range(sym, newval))
+		return false;
+
+	if (sym->flags & SYMBOL_NEW) {
+		sym->flags &= ~SYMBOL_NEW;
+		sym_set_changed(sym);
+	}
+
+	oldval = sym->user.val;
+	size = strlen(newval) + 1;
+	if (sym->type == S_HEX && (newval[0] != '0' || (newval[1] != 'x' && newval[1] != 'X'))) {
+		size += 2;
+		sym->user.val = val = malloc(size);
+		*val++ = '0';
+		*val++ = 'x';
+	} else if (!oldval || strcmp(oldval, newval))
+		sym->user.val = val = malloc(size);
+	else
+		return true;
+
+	strcpy(val, newval);
+	free((void *)oldval);
+	sym_clear_all_valid();
+
+	return true;
+}
+
+const char *sym_get_string_value(struct symbol *sym)
+{
+	tristate val;
+
+	switch (sym->type) {
+	case S_BOOLEAN:
+	case S_TRISTATE:
+		val = sym_get_tristate_value(sym);
+		switch (val) {
+		case no:
+			return "n";
+		case mod:
+			return "m";
+		case yes:
+			return "y";
+		}
+		break;
+	default:
+		;
+	}
+	return (const char *)sym->curr.val;
+}
+
+bool sym_is_changable(struct symbol *sym)
+{
+	return sym->visible > sym->rev_dep.tri;
+}
+
+struct symbol *sym_lookup(const char *name, int isconst)
+{
+	struct symbol *symbol;
+	const char *ptr;
+	char *new_name;
+	int hash = 0;
+
+	if (name) {
+		if (name[0] && !name[1]) {
+			switch (name[0]) {
+			case 'y': return &symbol_yes;
+			case 'm': return &symbol_mod;
+			case 'n': return &symbol_no;
+			}
+		}
+		for (ptr = name; *ptr; ptr++)
+			hash += *ptr;
+		hash &= 0xff;
+
+		for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
+			if (!strcmp(symbol->name, name)) {
+				if ((isconst && symbol->flags & SYMBOL_CONST) ||
+				    (!isconst && !(symbol->flags & SYMBOL_CONST)))
+					return symbol;
+			}
+		}
+		new_name = strdup(name);
+	} else {
+		new_name = NULL;
+		hash = 256;
+	}
+
+	symbol = malloc(sizeof(*symbol));
+	memset(symbol, 0, sizeof(*symbol));
+	symbol->name = new_name;
+	symbol->type = S_UNKNOWN;
+	symbol->flags = SYMBOL_NEW;
+	if (isconst)
+		symbol->flags |= SYMBOL_CONST;
+
+	symbol->next = symbol_hash[hash];
+	symbol_hash[hash] = symbol;
+
+	return symbol;
+}
+
+struct symbol *sym_find(const char *name)
+{
+	struct symbol *symbol = NULL;
+	const char *ptr;
+	int hash = 0;
+
+	if (!name)
+		return NULL;
+
+	if (name[0] && !name[1]) {
+		switch (name[0]) {
+		case 'y': return &symbol_yes;
+		case 'm': return &symbol_mod;
+		case 'n': return &symbol_no;
+		}
+	}
+	for (ptr = name; *ptr; ptr++)
+		hash += *ptr;
+	hash &= 0xff;
+
+	for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
+		if (!strcmp(symbol->name, name) &&
+		    !(symbol->flags & SYMBOL_CONST))
+				break;
+	}
+
+	return symbol;
+}
+
+struct symbol *sym_check_deps(struct symbol *sym);
+
+static struct symbol *sym_check_expr_deps(struct expr *e)
+{
+	struct symbol *sym;
+
+	if (!e)
+		return NULL;
+	switch (e->type) {
+	case E_OR:
+	case E_AND:
+		sym = sym_check_expr_deps(e->left.expr);
+		if (sym)
+			return sym;
+		return sym_check_expr_deps(e->right.expr);
+	case E_NOT:
+		return sym_check_expr_deps(e->left.expr);
+	case E_EQUAL:
+	case E_UNEQUAL:
+		sym = sym_check_deps(e->left.sym);
+		if (sym)
+			return sym;
+		return sym_check_deps(e->right.sym);
+	case E_SYMBOL:
+		return sym_check_deps(e->left.sym);
+	default:
+		break;
+	}
+	printf("Oops! How to check %d?\n", e->type);
+	return NULL;
+}
+
+struct symbol *sym_check_deps(struct symbol *sym)
+{
+	struct symbol *sym2;
+	struct property *prop;
+
+	if (sym->flags & SYMBOL_CHECK_DONE)
+		return NULL;
+	if (sym->flags & SYMBOL_CHECK) {
+		printf("Warning! Found recursive dependency: %s", sym->name);
+		return sym;
+	}
+
+	sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED);
+	sym2 = sym_check_expr_deps(sym->rev_dep.expr);
+	if (sym2)
+		goto out;
+
+	for (prop = sym->prop; prop; prop = prop->next) {
+		if (prop->type == P_CHOICE || prop->type == P_SELECT || prop->type == P_SELECTNOT)
+			continue;
+		sym2 = sym_check_expr_deps(prop->visible.expr);
+		if (sym2)
+			goto out;
+		if (prop->type != P_DEFAULT || sym_is_choice(sym))
+			continue;
+		sym2 = sym_check_expr_deps(prop->expr);
+		if (sym2)
+			goto out;
+	}
+out:
+	if (sym2)
+		printf(" %s", sym->name);
+	sym->flags &= ~SYMBOL_CHECK;
+	return sym2;
+}
+
+struct property *prop_alloc(enum prop_type type, struct symbol *sym)
+{
+	struct property *prop;
+	struct property **propp;
+
+	prop = malloc(sizeof(*prop));
+	memset(prop, 0, sizeof(*prop));
+	prop->type = type;
+	prop->sym = sym;
+	prop->file = current_file;
+	prop->lineno = zconf_lineno();
+
+	/* append property to the prop list of symbol */
+	if (sym) {
+		for (propp = &sym->prop; *propp; propp = &(*propp)->next)
+			;
+		*propp = prop;
+	}
+
+	return prop;
+}
+
+struct symbol *prop_get_symbol(struct property *prop)
+{
+	if (prop->expr && (prop->expr->type == E_SYMBOL ||
+			   prop->expr->type == E_CHOICE))
+		return prop->expr->left.sym;
+	return NULL;
+}
+
+const char *prop_get_type_name(enum prop_type type)
+{
+	switch (type) {
+	case P_PROMPT:
+		return "prompt";
+	case P_COMMENT:
+		return "comment";
+	case P_MENU:
+		return "menu";
+	case P_DEFAULT:
+		return "default";
+	case P_CHOICE:
+		return "choice";
+	case P_SELECT:
+	case P_SELECTNOT:
+		return "select";
+	case P_RANGE:
+		return "range";
+	case P_UNKNOWN:
+		break;
+	}
+	return "unknown";
+}

+ 556 - 0
config/textbox.c

@@ -0,0 +1,556 @@
+/*
+ *  textbox.c -- implements the text box
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "dialog.h"
+
+static void back_lines (int n);
+static void print_page (WINDOW * win, int height, int width);
+static void print_line (WINDOW * win, int row, int width);
+static char *get_line (void);
+static void print_position (WINDOW * win, int height, int width);
+
+static int hscroll, fd, file_size, bytes_read;
+static int begin_reached = 1, end_reached, page_length;
+static char *buf, *page;
+
+/*
+ * Display text from a file in a dialog box.
+ */
+int
+dialog_textbox (const char *title, const char *file, int height, int width)
+{
+    int i, x, y, cur_x, cur_y, fpos, key = 0;
+    int passed_end;
+    char search_term[MAX_LEN + 1];
+    WINDOW *dialog, *text;
+
+    search_term[0] = '\0';	/* no search term entered yet */
+
+    /* Open input file for reading */
+    if ((fd = open (file, O_RDONLY)) == -1) {
+	endwin ();
+	fprintf (stderr,
+		 "\nCan't open input file in dialog_textbox().\n");
+	exit (-1);
+    }
+    /* Get file size. Actually, 'file_size' is the real file size - 1,
+       since it's only the last byte offset from the beginning */
+    if ((file_size = lseek (fd, 0, SEEK_END)) == -1) {
+	endwin ();
+	fprintf (stderr, "\nError getting file size in dialog_textbox().\n");
+	exit (-1);
+    }
+    /* Restore file pointer to beginning of file after getting file size */
+    if (lseek (fd, 0, SEEK_SET) == -1) {
+	endwin ();
+	fprintf (stderr, "\nError moving file pointer in dialog_textbox().\n");
+	exit (-1);
+    }
+    /* Allocate space for read buffer */
+    if ((buf = malloc (BUF_SIZE + 1)) == NULL) {
+	endwin ();
+	fprintf (stderr, "\nCan't allocate memory in dialog_textbox().\n");
+	exit (-1);
+    }
+    if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
+	endwin ();
+	fprintf (stderr, "\nError reading file in dialog_textbox().\n");
+	exit (-1);
+    }
+    buf[bytes_read] = '\0';	/* mark end of valid data */
+    page = buf;			/* page is pointer to start of page to be displayed */
+
+    /* center dialog box on screen */
+    x = (COLS - width) / 2;
+    y = (LINES - height) / 2;
+
+
+    draw_shadow (stdscr, y, x, height, width);
+
+    dialog = newwin (height, width, y, x);
+    keypad (dialog, TRUE);
+
+    /* Create window for text region, used for scrolling text */
+    text = subwin (dialog, height - 4, width - 2, y + 1, x + 1);
+    wattrset (text, dialog_attr);
+    wbkgdset (text, dialog_attr & A_COLOR);
+
+    keypad (text, TRUE);
+
+    /* register the new window, along with its borders */
+    draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
+
+    wattrset (dialog, border_attr);
+    mvwaddch (dialog, height-3, 0, ACS_LTEE);
+    for (i = 0; i < width - 2; i++)
+	waddch (dialog, ACS_HLINE);
+    wattrset (dialog, dialog_attr);
+    wbkgdset (dialog, dialog_attr & A_COLOR);
+    waddch (dialog, ACS_RTEE);
+
+    if (title != NULL && strlen(title) >= width-2 ) {
+	/* truncate long title -- mec */
+	char * title2 = malloc(width-2+1);
+	memcpy( title2, title, width-2 );
+	title2[width-2] = '\0';
+	title = title2;
+    }
+
+    if (title != NULL) {
+	wattrset (dialog, title_attr);
+	mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
+	waddstr (dialog, (char *)title);
+	waddch (dialog, ' ');
+    }
+    print_button (dialog, " Exit ", height - 2, width / 2 - 4, TRUE);
+    wnoutrefresh (dialog);
+    getyx (dialog, cur_y, cur_x);	/* Save cursor position */
+
+    /* Print first page of text */
+    attr_clear (text, height - 4, width - 2, dialog_attr);
+    print_page (text, height - 4, width - 2);
+    print_position (dialog, height, width);
+    wmove (dialog, cur_y, cur_x);	/* Restore cursor position */
+    wrefresh (dialog);
+
+    while ((key != ESC) && (key != '\n')) {
+	key = wgetch (dialog);
+	switch (key) {
+	case 'E':		/* Exit */
+	case 'e':
+	case 'X':
+	case 'x':
+	    delwin (dialog);
+	    free (buf);
+	    close (fd);
+	    return 0;
+	case 'g':		/* First page */
+	case KEY_HOME:
+	    if (!begin_reached) {
+		begin_reached = 1;
+		/* First page not in buffer? */
+		if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
+		    endwin ();
+		    fprintf (stderr,
+		      "\nError moving file pointer in dialog_textbox().\n");
+		    exit (-1);
+		}
+		if (fpos > bytes_read) {	/* Yes, we have to read it in */
+		    if (lseek (fd, 0, SEEK_SET) == -1) {
+			endwin ();
+			fprintf (stderr, "\nError moving file pointer in "
+				 "dialog_textbox().\n");
+			exit (-1);
+		    }
+		    if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
+			endwin ();
+			fprintf (stderr,
+			     "\nError reading file in dialog_textbox().\n");
+			exit (-1);
+		    }
+		    buf[bytes_read] = '\0';
+		}
+		page = buf;
+		print_page (text, height - 4, width - 2);
+		print_position (dialog, height, width);
+		wmove (dialog, cur_y, cur_x);	/* Restore cursor position */
+		wrefresh (dialog);
+	    }
+	    break;
+	case 'G':		/* Last page */
+	case KEY_END:
+
+	    end_reached = 1;
+	    /* Last page not in buffer? */
+	    if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
+		endwin ();
+		fprintf (stderr,
+		      "\nError moving file pointer in dialog_textbox().\n");
+		exit (-1);
+	    }
+	    if (fpos < file_size) {	/* Yes, we have to read it in */
+		if (lseek (fd, -BUF_SIZE, SEEK_END) == -1) {
+		    endwin ();
+		    fprintf (stderr,
+		      "\nError moving file pointer in dialog_textbox().\n");
+		    exit (-1);
+		}
+		if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
+		    endwin ();
+		    fprintf (stderr,
+			     "\nError reading file in dialog_textbox().\n");
+		    exit (-1);
+		}
+		buf[bytes_read] = '\0';
+	    }
+	    page = buf + bytes_read;
+	    back_lines (height - 4);
+	    print_page (text, height - 4, width - 2);
+	    print_position (dialog, height, width);
+	    wmove (dialog, cur_y, cur_x);	/* Restore cursor position */
+	    wrefresh (dialog);
+	    break;
+	case 'K':		/* Previous line */
+	case 'k':
+	case KEY_UP:
+	    if (!begin_reached) {
+		back_lines (page_length + 1);
+
+		/* We don't call print_page() here but use scrolling to ensure
+		   faster screen update. However, 'end_reached' and
+		   'page_length' should still be updated, and 'page' should
+		   point to start of next page. This is done by calling
+		   get_line() in the following 'for' loop. */
+		scrollok (text, TRUE);
+		wscrl (text, -1);	/* Scroll text region down one line */
+		scrollok (text, FALSE);
+		page_length = 0;
+		passed_end = 0;
+		for (i = 0; i < height - 4; i++) {
+		    if (!i) {
+			/* print first line of page */
+			print_line (text, 0, width - 2);
+			wnoutrefresh (text);
+		    } else
+			/* Called to update 'end_reached' and 'page' */
+			get_line ();
+		    if (!passed_end)
+			page_length++;
+		    if (end_reached && !passed_end)
+			passed_end = 1;
+		}
+
+		print_position (dialog, height, width);
+		wmove (dialog, cur_y, cur_x);	/* Restore cursor position */
+		wrefresh (dialog);
+	    }
+	    break;
+	case 'B':		/* Previous page */
+	case 'b':
+	case KEY_PPAGE:
+	    if (begin_reached)
+		break;
+	    back_lines (page_length + height - 4);
+	    print_page (text, height - 4, width - 2);
+	    print_position (dialog, height, width);
+	    wmove (dialog, cur_y, cur_x);
+	    wrefresh (dialog);
+	    break;
+	case 'J':		/* Next line */
+	case 'j':
+	case KEY_DOWN:
+	    if (!end_reached) {
+		begin_reached = 0;
+		scrollok (text, TRUE);
+		scroll (text);	/* Scroll text region up one line */
+		scrollok (text, FALSE);
+		print_line (text, height - 5, width - 2);
+		wnoutrefresh (text);
+		print_position (dialog, height, width);
+		wmove (dialog, cur_y, cur_x);	/* Restore cursor position */
+		wrefresh (dialog);
+	    }
+	    break;
+	case KEY_NPAGE:		/* Next page */
+	case ' ':
+	    if (end_reached)
+		break;
+
+	    begin_reached = 0;
+	    print_page (text, height - 4, width - 2);
+	    print_position (dialog, height, width);
+	    wmove (dialog, cur_y, cur_x);
+	    wrefresh (dialog);
+	    break;
+	case '0':		/* Beginning of line */
+	case 'H':		/* Scroll left */
+	case 'h':
+	case KEY_LEFT:
+	    if (hscroll <= 0)
+		break;
+
+	    if (key == '0')
+		hscroll = 0;
+	    else
+		hscroll--;
+	    /* Reprint current page to scroll horizontally */
+	    back_lines (page_length);
+	    print_page (text, height - 4, width - 2);
+	    wmove (dialog, cur_y, cur_x);
+	    wrefresh (dialog);
+	    break;
+	case 'L':		/* Scroll right */
+	case 'l':
+	case KEY_RIGHT:
+	    if (hscroll >= MAX_LEN)
+		break;
+	    hscroll++;
+	    /* Reprint current page to scroll horizontally */
+	    back_lines (page_length);
+	    print_page (text, height - 4, width - 2);
+	    wmove (dialog, cur_y, cur_x);
+	    wrefresh (dialog);
+	    break;
+	case ESC:
+	    break;
+	}
+    }
+
+    delwin (dialog);
+    free (buf);
+    close (fd);
+    return 1;			/* ESC pressed */
+}
+
+/*
+ * Go back 'n' lines in text file. Called by dialog_textbox().
+ * 'page' will be updated to point to the desired line in 'buf'.
+ */
+static void
+back_lines (int n)
+{
+    int i, fpos;
+
+    begin_reached = 0;
+    /* We have to distinguish between end_reached and !end_reached
+       since at end of file, the line is not ended by a '\n'.
+       The code inside 'if' basically does a '--page' to move one
+       character backward so as to skip '\n' of the previous line */
+    if (!end_reached) {
+	/* Either beginning of buffer or beginning of file reached? */
+	if (page == buf) {
+	    if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
+		endwin ();
+		fprintf (stderr, "\nError moving file pointer in "
+			 "back_lines().\n");
+		exit (-1);
+	    }
+	    if (fpos > bytes_read) {	/* Not beginning of file yet */
+		/* We've reached beginning of buffer, but not beginning of
+		   file yet, so read previous part of file into buffer.
+		   Note that we only move backward for BUF_SIZE/2 bytes,
+		   but not BUF_SIZE bytes to avoid re-reading again in
+		   print_page() later */
+		/* Really possible to move backward BUF_SIZE/2 bytes? */
+		if (fpos < BUF_SIZE / 2 + bytes_read) {
+		    /* No, move less then */
+		    if (lseek (fd, 0, SEEK_SET) == -1) {
+			endwin ();
+			fprintf (stderr, "\nError moving file pointer in "
+				 "back_lines().\n");
+			exit (-1);
+		    }
+		    page = buf + fpos - bytes_read;
+		} else {	/* Move backward BUF_SIZE/2 bytes */
+		    if (lseek (fd, -(BUF_SIZE / 2 + bytes_read), SEEK_CUR)
+			== -1) {
+			endwin ();
+			fprintf (stderr, "\nError moving file pointer "
+				 "in back_lines().\n");
+			exit (-1);
+		    }
+		    page = buf + BUF_SIZE / 2;
+		}
+		if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
+		    endwin ();
+		    fprintf (stderr, "\nError reading file in back_lines().\n");
+		    exit (-1);
+		}
+		buf[bytes_read] = '\0';
+	    } else {		/* Beginning of file reached */
+		begin_reached = 1;
+		return;
+	    }
+	}
+	if (*(--page) != '\n') {	/* '--page' here */
+	    /* Something's wrong... */
+	    endwin ();
+	    fprintf (stderr, "\nInternal error in back_lines().\n");
+	    exit (-1);
+	}
+    }
+    /* Go back 'n' lines */
+    for (i = 0; i < n; i++)
+	do {
+	    if (page == buf) {
+		if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
+		    endwin ();
+		    fprintf (stderr,
+			  "\nError moving file pointer in back_lines().\n");
+		    exit (-1);
+		}
+		if (fpos > bytes_read) {
+		    /* Really possible to move backward BUF_SIZE/2 bytes? */
+		    if (fpos < BUF_SIZE / 2 + bytes_read) {
+			/* No, move less then */
+			if (lseek (fd, 0, SEEK_SET) == -1) {
+			    endwin ();
+			    fprintf (stderr, "\nError moving file pointer "
+				     "in back_lines().\n");
+			    exit (-1);
+			}
+			page = buf + fpos - bytes_read;
+		    } else {	/* Move backward BUF_SIZE/2 bytes */
+			if (lseek (fd, -(BUF_SIZE / 2 + bytes_read),
+				   SEEK_CUR) == -1) {
+			    endwin ();
+			    fprintf (stderr, "\nError moving file pointer"
+				     " in back_lines().\n");
+			    exit (-1);
+			}
+			page = buf + BUF_SIZE / 2;
+		    }
+		    if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
+			endwin ();
+			fprintf (stderr, "\nError reading file in "
+				 "back_lines().\n");
+			exit (-1);
+		    }
+		    buf[bytes_read] = '\0';
+		} else {	/* Beginning of file reached */
+		    begin_reached = 1;
+		    return;
+		}
+	    }
+	} while (*(--page) != '\n');
+    page++;
+}
+
+/*
+ * Print a new page of text. Called by dialog_textbox().
+ */
+static void
+print_page (WINDOW * win, int height, int width)
+{
+    int i, passed_end = 0;
+
+    page_length = 0;
+    for (i = 0; i < height; i++) {
+	print_line (win, i, width);
+	if (!passed_end)
+	    page_length++;
+	if (end_reached && !passed_end)
+	    passed_end = 1;
+    }
+    wnoutrefresh (win);
+}
+
+/*
+ * Print a new line of text. Called by dialog_textbox() and print_page().
+ */
+static void
+print_line (WINDOW * win, int row, int width)
+{
+    int y, x;
+    char *line;
+
+    line = get_line ();
+    line += MIN (strlen (line), hscroll);	/* Scroll horizontally */
+    wmove (win, row, 0);	/* move cursor to correct line */
+    waddch (win, ' ');
+    waddnstr (win, line, MIN (strlen (line), width - 2));
+
+    getyx (win, y, x);
+    /* Clear 'residue' of previous line */
+#if OLD_NCURSES
+    {
+        int i;
+        for (i = 0; i < width - x; i++)
+	    waddch (win, ' ');
+    }
+#else
+    wclrtoeol(win);
+#endif
+}
+
+/*
+ * Return current line of text. Called by dialog_textbox() and print_line().
+ * 'page' should point to start of current line before calling, and will be
+ * updated to point to start of next line.
+ */
+static char *
+get_line (void)
+{
+    int i = 0, fpos;
+    static char line[MAX_LEN + 1];
+
+    end_reached = 0;
+    while (*page != '\n') {
+	if (*page == '\0') {
+	    /* Either end of file or end of buffer reached */
+	    if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
+		endwin ();
+		fprintf (stderr, "\nError moving file pointer in "
+			 "get_line().\n");
+		exit (-1);
+	    }
+	    if (fpos < file_size) {	/* Not end of file yet */
+		/* We've reached end of buffer, but not end of file yet,
+		   so read next part of file into buffer */
+		if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
+		    endwin ();
+		    fprintf (stderr, "\nError reading file in get_line().\n");
+		    exit (-1);
+		}
+		buf[bytes_read] = '\0';
+		page = buf;
+	    } else {
+		if (!end_reached)
+		    end_reached = 1;
+		break;
+	    }
+	} else if (i < MAX_LEN)
+	    line[i++] = *(page++);
+	else {
+	    /* Truncate lines longer than MAX_LEN characters */
+	    if (i == MAX_LEN)
+		line[i++] = '\0';
+	    page++;
+	}
+    }
+    if (i <= MAX_LEN)
+	line[i] = '\0';
+    if (!end_reached)
+	page++;			/* move pass '\n' */
+
+    return line;
+}
+
+/*
+ * Print current position
+ */
+static void
+print_position (WINDOW * win, int height, int width)
+{
+    int fpos, percent;
+
+    if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
+	endwin ();
+	fprintf (stderr, "\nError moving file pointer in print_position().\n");
+	exit (-1);
+    }
+    wattrset (win, position_indicator_attr);
+    wbkgdset (win, position_indicator_attr & A_COLOR);
+    percent = !file_size ?
+	100 : ((fpos - bytes_read + page - buf) * 100) / file_size;
+    wmove (win, height - 3, width - 9);
+    wprintw (win, "(%3d%%)", percent);
+}

+ 375 - 0
config/util.c

@@ -0,0 +1,375 @@
+/*
+ *  util.c
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "dialog.h"
+
+
+/* use colors by default? */
+bool use_colors = 1;
+
+char *backtitle = NULL;
+
+const char *dialog_result;
+
+/*
+ * Attribute values, default is for mono display
+ */
+chtype attributes[] =
+{
+    A_NORMAL,			/* screen_attr */
+    A_NORMAL,			/* shadow_attr */
+    A_NORMAL,			/* dialog_attr */
+    A_BOLD,			/* title_attr */
+    A_NORMAL,			/* border_attr */
+    A_REVERSE,			/* button_active_attr */
+    A_DIM,			/* button_inactive_attr */
+    A_REVERSE,			/* button_key_active_attr */
+    A_BOLD,			/* button_key_inactive_attr */
+    A_REVERSE,			/* button_label_active_attr */
+    A_NORMAL,			/* button_label_inactive_attr */
+    A_NORMAL,			/* inputbox_attr */
+    A_NORMAL,			/* inputbox_border_attr */
+    A_NORMAL,			/* searchbox_attr */
+    A_BOLD,			/* searchbox_title_attr */
+    A_NORMAL,			/* searchbox_border_attr */
+    A_BOLD,			/* position_indicator_attr */
+    A_NORMAL,			/* menubox_attr */
+    A_NORMAL,			/* menubox_border_attr */
+    A_NORMAL,			/* item_attr */
+    A_REVERSE,			/* item_selected_attr */
+    A_BOLD,			/* tag_attr */
+    A_REVERSE,			/* tag_selected_attr */
+    A_BOLD,			/* tag_key_attr */
+    A_REVERSE,			/* tag_key_selected_attr */
+    A_BOLD,			/* check_attr */
+    A_REVERSE,			/* check_selected_attr */
+    A_BOLD,			/* uarrow_attr */
+    A_BOLD			/* darrow_attr */
+};
+
+
+#include "colors.h"
+
+/*
+ * Table of color values
+ */
+int color_table[][3] =
+{
+    {SCREEN_FG, SCREEN_BG, SCREEN_HL},
+    {SHADOW_FG, SHADOW_BG, SHADOW_HL},
+    {DIALOG_FG, DIALOG_BG, DIALOG_HL},
+    {TITLE_FG, TITLE_BG, TITLE_HL},
+    {BORDER_FG, BORDER_BG, BORDER_HL},
+    {BUTTON_ACTIVE_FG, BUTTON_ACTIVE_BG, BUTTON_ACTIVE_HL},
+    {BUTTON_INACTIVE_FG, BUTTON_INACTIVE_BG, BUTTON_INACTIVE_HL},
+    {BUTTON_KEY_ACTIVE_FG, BUTTON_KEY_ACTIVE_BG, BUTTON_KEY_ACTIVE_HL},
+    {BUTTON_KEY_INACTIVE_FG, BUTTON_KEY_INACTIVE_BG, BUTTON_KEY_INACTIVE_HL},
+    {BUTTON_LABEL_ACTIVE_FG, BUTTON_LABEL_ACTIVE_BG, BUTTON_LABEL_ACTIVE_HL},
+    {BUTTON_LABEL_INACTIVE_FG, BUTTON_LABEL_INACTIVE_BG,
+     BUTTON_LABEL_INACTIVE_HL},
+    {INPUTBOX_FG, INPUTBOX_BG, INPUTBOX_HL},
+    {INPUTBOX_BORDER_FG, INPUTBOX_BORDER_BG, INPUTBOX_BORDER_HL},
+    {SEARCHBOX_FG, SEARCHBOX_BG, SEARCHBOX_HL},
+    {SEARCHBOX_TITLE_FG, SEARCHBOX_TITLE_BG, SEARCHBOX_TITLE_HL},
+    {SEARCHBOX_BORDER_FG, SEARCHBOX_BORDER_BG, SEARCHBOX_BORDER_HL},
+    {POSITION_INDICATOR_FG, POSITION_INDICATOR_BG, POSITION_INDICATOR_HL},
+    {MENUBOX_FG, MENUBOX_BG, MENUBOX_HL},
+    {MENUBOX_BORDER_FG, MENUBOX_BORDER_BG, MENUBOX_BORDER_HL},
+    {ITEM_FG, ITEM_BG, ITEM_HL},
+    {ITEM_SELECTED_FG, ITEM_SELECTED_BG, ITEM_SELECTED_HL},
+    {TAG_FG, TAG_BG, TAG_HL},
+    {TAG_SELECTED_FG, TAG_SELECTED_BG, TAG_SELECTED_HL},
+    {TAG_KEY_FG, TAG_KEY_BG, TAG_KEY_HL},
+    {TAG_KEY_SELECTED_FG, TAG_KEY_SELECTED_BG, TAG_KEY_SELECTED_HL},
+    {CHECK_FG, CHECK_BG, CHECK_HL},
+    {CHECK_SELECTED_FG, CHECK_SELECTED_BG, CHECK_SELECTED_HL},
+    {UARROW_FG, UARROW_BG, UARROW_HL},
+    {DARROW_FG, DARROW_BG, DARROW_HL},
+};				/* color_table */
+
+/*
+ * Set window to attribute 'attr'
+ */
+void
+attr_clear (WINDOW * win, int height, int width, chtype attr)
+{
+    int i, j;
+
+    wattrset (win, attr);
+    for (i = 0; i < height; i++) {
+	wmove (win, i, 0);
+	for (j = 0; j < width; j++)
+	    waddch (win, ' ');
+    }
+    touchwin (win);
+}
+
+void dialog_clear (void)
+{
+    attr_clear (stdscr, LINES, COLS, screen_attr);
+    /* Display background title if it exists ... - SLH */
+    if (backtitle != NULL) {
+        int i;
+
+        wattrset (stdscr, screen_attr);
+        mvwaddstr (stdscr, 0, 1, (char *)backtitle);
+        wmove (stdscr, 1, 1);
+        for (i = 1; i < COLS - 1; i++)
+            waddch (stdscr, ACS_HLINE);
+    }
+    wnoutrefresh (stdscr);
+}
+
+/*
+ * Do some initialization for dialog
+ */
+void
+init_dialog (void)
+{
+    initscr ();			/* Init curses */
+    keypad (stdscr, TRUE);
+    cbreak ();
+    noecho ();
+
+
+    if (use_colors)	/* Set up colors */
+	color_setup ();
+
+
+    dialog_clear ();
+}
+
+/*
+ * Setup for color display
+ */
+void
+color_setup (void)
+{
+    int i;
+
+    if (has_colors ()) {	/* Terminal supports color? */
+	start_color ();
+
+	/* Initialize color pairs */
+	for (i = 0; i < ATTRIBUTE_COUNT; i++)
+	    init_pair (i + 1, color_table[i][0], color_table[i][1]);
+
+	/* Setup color attributes */
+	for (i = 0; i < ATTRIBUTE_COUNT; i++)
+	    attributes[i] = C_ATTR (color_table[i][2], i + 1);
+    }
+}
+
+/*
+ * End using dialog functions.
+ */
+void
+end_dialog (void)
+{
+    endwin ();
+}
+
+
+/*
+ * Print a string of text in a window, automatically wrap around to the
+ * next line if the string is too long to fit on one line. Newline
+ * characters '\n' are replaced by spaces.  We start on a new line
+ * if there is no room for at least 4 nonblanks following a double-space.
+ */
+void
+print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x)
+{
+    int newl, cur_x, cur_y;
+    int i, prompt_len, room, wlen;
+    char tempstr[MAX_LEN + 1], *word, *sp, *sp2;
+
+    strcpy (tempstr, prompt);
+
+    prompt_len = strlen(tempstr);
+
+    /*
+     * Remove newlines
+     */
+    for(i=0; i<prompt_len; i++) {
+	if(tempstr[i] == '\n') tempstr[i] = ' ';
+    }
+
+    if (prompt_len <= width - x * 2) {	/* If prompt is short */
+	wmove (win, y, (width - prompt_len) / 2);
+	waddstr (win, tempstr);
+    } else {
+	cur_x = x;
+	cur_y = y;
+	newl = 1;
+	word = tempstr;
+	while (word && *word) {
+	    sp = index(word, ' ');
+	    if (sp)
+	        *sp++ = 0;
+
+	    /* Wrap to next line if either the word does not fit,
+	       or it is the first word of a new sentence, and it is
+	       short, and the next word does not fit. */
+	    room = width - cur_x;
+	    wlen = strlen(word);
+	    if (wlen > room ||
+	       (newl && wlen < 4 && sp && wlen+1+strlen(sp) > room
+		     && (!(sp2 = index(sp, ' ')) || wlen+1+(sp2-sp) > room))) {
+		cur_y++;
+		cur_x = x;
+	    }
+	    wmove (win, cur_y, cur_x);
+	    waddstr (win, word);
+	    getyx (win, cur_y, cur_x);
+	    cur_x++;
+	    if (sp && *sp == ' ') {
+	        cur_x++;	/* double space */
+		while (*++sp == ' ');
+		newl = 1;
+	    } else
+	        newl = 0;
+	    word = sp;
+	}
+    }
+}
+
+/*
+ * Print a button
+ */
+void
+print_button (WINDOW * win, const char *label, int y, int x, int selected)
+{
+    int i, temp;
+
+    wmove (win, y, x);
+    wattrset (win, selected ? button_active_attr : button_inactive_attr);
+    waddstr (win, "<");
+    temp = strspn (label, " ");
+    label += temp;
+    wattrset (win, selected ? button_label_active_attr
+	      : button_label_inactive_attr);
+    for (i = 0; i < temp; i++)
+	waddch (win, ' ');
+    wattrset (win, selected ? button_key_active_attr
+	      : button_key_inactive_attr);
+    waddch (win, label[0]);
+    wattrset (win, selected ? button_label_active_attr
+	      : button_label_inactive_attr);
+    waddstr (win, (char *)label + 1);
+    wattrset (win, selected ? button_active_attr : button_inactive_attr);
+    waddstr (win, ">");
+    wmove (win, y, x + temp + 1);
+}
+
+/*
+ * Draw a rectangular box with line drawing characters
+ */
+void
+draw_box (WINDOW * win, int y, int x, int height, int width,
+	  chtype box, chtype border)
+{
+    int i, j;
+
+    wattrset (win, 0);
+    for (i = 0; i < height; i++) {
+	wmove (win, y + i, x);
+	for (j = 0; j < width; j++)
+	    if (!i && !j)
+		waddch (win, border | ACS_ULCORNER);
+	    else if (i == height - 1 && !j)
+		waddch (win, border | ACS_LLCORNER);
+	    else if (!i && j == width - 1)
+		waddch (win, box | ACS_URCORNER);
+	    else if (i == height - 1 && j == width - 1)
+		waddch (win, box | ACS_LRCORNER);
+	    else if (!i)
+		waddch (win, border | ACS_HLINE);
+	    else if (i == height - 1)
+		waddch (win, box | ACS_HLINE);
+	    else if (!j)
+		waddch (win, border | ACS_VLINE);
+	    else if (j == width - 1)
+		waddch (win, box | ACS_VLINE);
+	    else
+		waddch (win, box | ' ');
+    }
+}
+
+/*
+ * Draw shadows along the right and bottom edge to give a more 3D look
+ * to the boxes
+ */
+void
+draw_shadow (WINDOW * win, int y, int x, int height, int width)
+{
+    int i;
+
+    if (has_colors ()) {	/* Whether terminal supports color? */
+	wattrset (win, shadow_attr);
+	wmove (win, y + height, x + 2);
+	for (i = 0; i < width; i++)
+	    waddch (win, winch (win) & A_CHARTEXT);
+	for (i = y + 1; i < y + height + 1; i++) {
+	    wmove (win, i, x + width);
+	    waddch (win, winch (win) & A_CHARTEXT);
+	    waddch (win, winch (win) & A_CHARTEXT);
+	}
+	wnoutrefresh (win);
+    }
+}
+
+/*
+ *  Return the position of the first alphabetic character in a string.
+ */
+int
+first_alpha(const char *string, const char *exempt)
+{
+	int i, in_paren=0, c;
+
+	for (i = 0; i < strlen(string); i++) {
+		c = tolower(string[i]);
+
+		if (strchr("<[(", c)) ++in_paren;
+		if (strchr(">])", c) && in_paren > 0) --in_paren;
+
+		if ((! in_paren) && isalpha(c) &&
+		     strchr(exempt, c) == 0)
+			return i;
+	}
+
+	return 0;
+}
+
+/*
+ * Get the first selected item in the dialog_list_item list.
+ */
+struct dialog_list_item *
+first_sel_item(int item_no, struct dialog_list_item ** items)
+{
+	int i;
+
+	for (i = 0; i < item_no; i++) {
+		if (items[i]->selected)
+			return items[i];
+	}
+
+	return NULL;
+}

+ 118 - 0
config/yesno.c

@@ -0,0 +1,118 @@
+/*
+ *  yesno.c -- implements the yes/no box
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "dialog.h"
+
+/*
+ * Display termination buttons
+ */
+static void
+print_buttons(WINDOW *dialog, int height, int width, int selected)
+{
+    int x = width / 2 - 10;
+    int y = height - 2;
+
+    print_button (dialog, " Yes ", y, x, selected == 0);
+    print_button (dialog, "  No  ", y, x + 13, selected == 1);
+
+    wmove(dialog, y, x+1 + 13*selected );
+    wrefresh (dialog);
+}
+
+/*
+ * Display a dialog box with two buttons - Yes and No
+ */
+int
+dialog_yesno (const char *title, const char *prompt, int height, int width)
+{
+    int i, x, y, key = 0, button = 0;
+    WINDOW *dialog;
+
+    /* center dialog box on screen */
+    x = (COLS - width) / 2;
+    y = (LINES - height) / 2;
+
+    draw_shadow (stdscr, y, x, height, width);
+
+    dialog = newwin (height, width, y, x);
+    keypad (dialog, TRUE);
+
+    draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
+    wattrset (dialog, border_attr);
+    mvwaddch (dialog, height-3, 0, ACS_LTEE);
+    for (i = 0; i < width - 2; i++)
+	waddch (dialog, ACS_HLINE);
+    wattrset (dialog, dialog_attr);
+    waddch (dialog, ACS_RTEE);
+
+    if (title != NULL && strlen(title) >= width-2 ) {
+	/* truncate long title -- mec */
+	char * title2 = malloc(width-2+1);
+	memcpy( title2, title, width-2 );
+	title2[width-2] = '\0';
+	title = title2;
+    }
+
+    if (title != NULL) {
+	wattrset (dialog, title_attr);
+	mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
+	waddstr (dialog, (char *)title);
+	waddch (dialog, ' ');
+    }
+
+    wattrset (dialog, dialog_attr);
+    print_autowrap (dialog, prompt, width - 2, 1, 3);
+
+    print_buttons(dialog, height, width, 0);
+
+    while (key != ESC) {
+	key = wgetch (dialog);
+	switch (key) {
+	case 'Y':
+	case 'y':
+	    delwin (dialog);
+	    return 0;
+	case 'N':
+	case 'n':
+	    delwin (dialog);
+	    return 1;
+
+	case TAB:
+	case KEY_LEFT:
+	case KEY_RIGHT:
+	    button = ((key == KEY_LEFT ? --button : ++button) < 0)
+			? 1 : (button > 1 ? 0 : button);
+
+	    print_buttons(dialog, height, width, button);
+	    wrefresh (dialog);
+	    break;
+	case ' ':
+	case '\n':
+	    delwin (dialog);
+	    return button;
+	case ESC:
+	    break;
+	}
+    }
+
+    delwin (dialog);
+    return -1;			/* ESC pressed */
+}

+ 387 - 0
config/zconf.l

@@ -0,0 +1,387 @@
+%option backup nostdinit noyywrap never-interactive full ecs
+%option 8bit backup nodefault perf-report perf-report
+%x COMMAND HELP STRING PARAM
+%{
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <glob.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+#define START_STRSIZE	16
+
+char *text;
+static char *text_ptr;
+static int text_size, text_asize;
+
+struct buffer {
+        struct buffer *parent;
+        YY_BUFFER_STATE state;
+};
+
+struct buffer *current_buf;
+
+static int last_ts, first_ts;
+
+static void zconf_endhelp(void);
+static struct buffer *zconf_endfile(void);
+
+void new_string(void)
+{
+	text = malloc(START_STRSIZE);
+	text_asize = START_STRSIZE;
+	text_ptr = text;
+	text_size = 0;
+	*text_ptr = 0;
+}
+
+void append_string(const char *str, int size)
+{
+	int new_size = text_size + size + 1;
+	if (new_size > text_asize) {
+		text = realloc(text, new_size);
+		text_asize = new_size;
+		text_ptr = text + text_size;
+	}
+	memcpy(text_ptr, str, size);
+	text_ptr += size;
+	text_size += size;
+	*text_ptr = 0;
+}
+
+void alloc_string(const char *str, int size)
+{
+	text = malloc(size + 1);
+	memcpy(text, str, size);
+	text[size] = 0;
+}
+%}
+
+ws	[ \n\t]
+n	[A-Za-z0-9_]
+
+%%
+	int str = 0;
+	int ts, i;
+
+[ \t]*#.*\n	current_file->lineno++;
+[ \t]*#.*
+
+[ \t]*\n	current_file->lineno++; return T_EOL;
+
+[ \t]+	{
+	BEGIN(COMMAND);
+}
+
+.	{
+	unput(yytext[0]);
+	BEGIN(COMMAND);
+}
+
+
+<COMMAND>{
+	"mainmenu"		BEGIN(PARAM); return T_MAINMENU;
+	"menu"			BEGIN(PARAM); return T_MENU;
+	"endmenu"		BEGIN(PARAM); return T_ENDMENU;
+	"source"		BEGIN(PARAM); return T_SOURCE;
+	"choice"		BEGIN(PARAM); return T_CHOICE;
+	"endchoice"		BEGIN(PARAM); return T_ENDCHOICE;
+	"comment"		BEGIN(PARAM); return T_COMMENT;
+	"config"		BEGIN(PARAM); return T_CONFIG;
+	"menuconfig"		BEGIN(PARAM); return T_MENUCONFIG;
+	"help"			BEGIN(PARAM); return T_HELP;
+	"if"			BEGIN(PARAM); return T_IF;
+	"endif"			BEGIN(PARAM); return T_ENDIF;
+	"depends"		BEGIN(PARAM); return T_DEPENDS;
+	"requires"		BEGIN(PARAM); return T_REQUIRES;
+	"optional"		BEGIN(PARAM); return T_OPTIONAL;
+	"default"		BEGIN(PARAM); return T_DEFAULT;
+	"prompt"		BEGIN(PARAM); return T_PROMPT;
+	"tristate"		BEGIN(PARAM); return T_TRISTATE;
+	"def_tristate"		BEGIN(PARAM); return T_DEF_TRISTATE;
+	"bool"			BEGIN(PARAM); return T_BOOLEAN;
+	"boolean"		BEGIN(PARAM); return T_BOOLEAN;
+	"def_bool"		BEGIN(PARAM); return T_DEF_BOOLEAN;
+	"def_boolean"		BEGIN(PARAM); return T_DEF_BOOLEAN;
+	"int"			BEGIN(PARAM); return T_INT;
+	"hex"			BEGIN(PARAM); return T_HEX;
+	"string"		BEGIN(PARAM); return T_STRING;
+	"select"		BEGIN(PARAM); return T_SELECT;
+	"enable"		BEGIN(PARAM); return T_SELECT;
+	"range"			BEGIN(PARAM); return T_RANGE;
+	{n}+	{
+		alloc_string(yytext, yyleng);
+		zconflval.string = text;
+		return T_WORD;
+	}
+	.
+	\n	current_file->lineno++; BEGIN(INITIAL);
+}
+
+<PARAM>{
+	"&&"	return T_AND;
+	"||"	return T_OR;
+	"("	return T_OPEN_PAREN;
+	")"	return T_CLOSE_PAREN;
+	"!"	return T_NOT;
+	"="	return T_EQUAL;
+	"!="	return T_UNEQUAL;
+	"if"	return T_IF;
+	"on"	return T_ON;
+	\"|\'	{
+		str = yytext[0];
+		new_string();
+		BEGIN(STRING);
+	}
+	\n	BEGIN(INITIAL); current_file->lineno++; return T_EOL;
+	---	/* ignore */
+	({n}|[-/.])+	{
+		alloc_string(yytext, yyleng);
+		zconflval.string = text;
+		return T_WORD;
+	}
+	#.*	/* comment */
+	\\\n	current_file->lineno++;
+	.
+	<<EOF>> {
+		BEGIN(INITIAL);
+	}
+}
+
+<STRING>{
+	[^'"\\\n]+/\n	{
+		append_string(yytext, yyleng);
+		zconflval.string = text;
+		return T_WORD_QUOTE;
+	}
+	[^'"\\\n]+	{
+		append_string(yytext, yyleng);
+	}
+	\\.?/\n	{
+		append_string(yytext + 1, yyleng - 1);
+		zconflval.string = text;
+		return T_WORD_QUOTE;
+	}
+	\\.?	{
+		append_string(yytext + 1, yyleng - 1);
+	}
+	\'|\"	{
+		if (str == yytext[0]) {
+			BEGIN(PARAM);
+			zconflval.string = text;
+			return T_WORD_QUOTE;
+		} else
+			append_string(yytext, 1);
+	}
+	\n	{
+		printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno());
+		current_file->lineno++;
+		BEGIN(INITIAL);
+		return T_EOL;
+	}
+	<<EOF>>	{
+		BEGIN(INITIAL);
+	}
+}
+
+<HELP>{
+	[ \t]+	{
+		ts = 0;
+		for (i = 0; i < yyleng; i++) {
+			if (yytext[i] == '\t')
+				ts = (ts & ~7) + 8;
+			else
+				ts++;
+		}
+		last_ts = ts;
+		if (first_ts) {
+			if (ts < first_ts) {
+				zconf_endhelp();
+				return T_HELPTEXT;
+			}
+			ts -= first_ts;
+			while (ts > 8) {
+				append_string("        ", 8);
+				ts -= 8;
+			}
+			append_string("        ", ts);
+		}
+	}
+	[ \t]*\n/[^ \t\n] {
+		current_file->lineno++;
+		zconf_endhelp();
+		return T_HELPTEXT;
+	}
+	[ \t]*\n	{
+		current_file->lineno++;
+		append_string("\n", 1);
+	}
+	[^ \t\n].* {
+		append_string(yytext, yyleng);
+		if (!first_ts)
+			first_ts = last_ts;
+	}
+	<<EOF>>	{
+		zconf_endhelp();
+		return T_HELPTEXT;
+	}
+}
+
+<<EOF>>	{
+	if (current_buf) {
+		zconf_endfile();
+		return T_EOF;
+	}
+	fclose(yyin);
+	yyterminate();
+}
+
+%%
+void zconf_starthelp(void)
+{
+	new_string();
+	last_ts = first_ts = 0;
+	BEGIN(HELP);
+}
+
+static void zconf_endhelp(void)
+{
+	zconflval.string = text;
+	BEGIN(INITIAL);
+}
+
+
+/*
+ * Try to open specified file with following names:
+ * ./name
+ * $(srctree)/name
+ * The latter is used when srctree is separate from objtree
+ * when compiling the kernel.
+ * Return NULL if file is not found.
+ */
+FILE *zconf_fopen(const char *name)
+{
+	char *env, fullname[PATH_MAX+1];
+	FILE *f;
+
+	f = fopen(name, "r");
+	if (!f && name[0] != '/') {
+		env = getenv(SRCTREE);
+		if (env) {
+			sprintf(fullname, "%s/%s", env, name);
+			f = fopen(fullname, "r");
+		}
+	}
+	return f;
+}
+
+void zconf_initscan(const char *name)
+{
+	yyin = zconf_fopen(name);
+	if (!yyin) {
+		printf("can't find file %s\n", name);
+		exit(1);
+	}
+
+	current_buf = malloc(sizeof(*current_buf));
+	memset(current_buf, 0, sizeof(*current_buf));
+
+	current_file = file_lookup(name);
+	current_file->lineno = 1;
+	current_file->flags = FILE_BUSY;
+}
+
+void zconf_nextfile(const char *name)
+{
+	size_t i;
+	int retval;
+	glob_t files;
+	char *filename;
+	struct file *file;
+	struct buffer *buf;
+
+	retval = glob(name, GLOB_ERR | GLOB_MARK, NULL, &files);
+	if (retval == GLOB_NOSPACE || retval == GLOB_ABORTED || retval == GLOB_NOMATCH) {
+		printf("%s:%d: glob failed: %s \"%s\"\n", zconf_curname(), zconf_lineno(),
+			retval == GLOB_NOSPACE ? "failed to allocate memory" :
+				retval == GLOB_ABORTED ? "read error" : "no match",
+			name);
+		exit(1);
+	}
+
+	for (i = files.gl_pathc-1; i != (size_t)-1; --i) {
+		filename = files.gl_pathv[i];
+
+		file = file_lookup(filename);
+		buf = malloc(sizeof(*buf));
+		memset(buf, 0, sizeof(*buf));
+		current_buf->state = YY_CURRENT_BUFFER;
+		zconfin = zconf_fopen(filename);
+		if (!zconfin) {
+			printf("%s:%d: can't open file \"%s\"\n",
+				zconf_curname(), zconf_lineno(), filename);
+			exit(1);
+		}
+		zconf_switch_to_buffer(zconf_create_buffer(zconfin,YY_BUF_SIZE));
+		buf->parent = current_buf;
+		current_buf = buf;
+
+		if (file->flags & FILE_BUSY) {
+			printf("recursive scan (%s)?\n", filename);
+			exit(1);
+		}
+		if (file->flags & FILE_SCANNED) {
+			printf("file %s already scanned?\n", filename);
+			exit(1);
+		}
+		file->flags |= FILE_BUSY;
+		file->lineno = 1;
+		file->parent = current_file;
+		current_file = file;
+	}
+}
+
+static struct buffer *zconf_endfile(void)
+{
+	struct buffer *parent;
+
+	current_file->flags |= FILE_SCANNED;
+	current_file->flags &= ~FILE_BUSY;
+	current_file = current_file->parent;
+
+	parent = current_buf->parent;
+	if (parent) {
+		fclose(yyin);
+		yy_delete_buffer(YY_CURRENT_BUFFER);
+		yy_switch_to_buffer(parent->state);
+	}
+	free(current_buf);
+	current_buf = parent;
+
+	return parent;
+}
+
+int zconf_lineno(void)
+{
+	if (current_buf)
+		return current_file->lineno - 1;
+	else
+		return 0;
+}
+
+char *zconf_curname(void)
+{
+	if (current_buf)
+		return current_file->name;
+	else
+		return "<none>";
+}

+ 2133 - 0
config/zconf.output

@@ -0,0 +1,2133 @@
+State 52 conflicts: 1 shift/reduce
+State 53 conflicts: 1 shift/reduce
+State 54 conflicts: 1 shift/reduce
+State 55 conflicts: 10 shift/reduce
+State 56 conflicts: 12 shift/reduce
+State 57 conflicts: 1 shift/reduce
+State 58 conflicts: 13 shift/reduce
+State 59 conflicts: 1 shift/reduce
+
+
+Grammar
+
+    0 $accept: input $end
+
+    1 input: /* empty */
+    2      | input block
+
+    3 block: common_block
+    4      | choice_stmt
+    5      | menu_stmt
+    6      | T_MAINMENU prompt nl_or_eof
+    7      | T_ENDMENU
+    8      | T_ENDIF
+    9      | T_ENDCHOICE
+   10      | error nl_or_eof
+
+   11 common_block: if_stmt
+   12             | comment_stmt
+   13             | config_stmt
+   14             | menuconfig_stmt
+   15             | source_stmt
+   16             | nl_or_eof
+
+   17 config_entry_start: T_CONFIG T_WORD T_EOL
+
+   18 config_stmt: config_entry_start config_option_list
+
+   19 menuconfig_entry_start: T_MENUCONFIG T_WORD T_EOL
+
+   20 menuconfig_stmt: menuconfig_entry_start config_option_list
+
+   21 config_option_list: /* empty */
+   22                   | config_option_list config_option
+   23                   | config_option_list depends
+   24                   | config_option_list help
+   25                   | config_option_list T_EOL
+
+   26 config_option: T_TRISTATE prompt_stmt_opt T_EOL
+   27              | T_DEF_TRISTATE expr if_expr T_EOL
+   28              | T_BOOLEAN prompt_stmt_opt T_EOL
+   29              | T_DEF_BOOLEAN expr if_expr T_EOL
+   30              | T_INT prompt_stmt_opt T_EOL
+   31              | T_HEX prompt_stmt_opt T_EOL
+   32              | T_STRING prompt_stmt_opt T_EOL
+   33              | T_PROMPT prompt if_expr T_EOL
+   34              | T_DEFAULT expr if_expr T_EOL
+   35              | T_SELECT T_WORD if_expr T_EOL
+   36              | T_SELECT T_NOT T_WORD if_expr T_EOL
+   37              | T_RANGE symbol symbol if_expr T_EOL
+
+   38 choice: T_CHOICE T_EOL
+
+   39 choice_entry: choice choice_option_list
+
+   40 choice_end: end
+
+   41 choice_stmt: choice_entry choice_block choice_end
+   42            | choice_entry choice_block
+
+   43 choice_option_list: /* empty */
+   44                   | choice_option_list choice_option
+   45                   | choice_option_list depends
+   46                   | choice_option_list help
+   47                   | choice_option_list T_EOL
+
+   48 choice_option: T_PROMPT prompt if_expr T_EOL
+   49              | T_TRISTATE prompt_stmt_opt T_EOL
+   50              | T_BOOLEAN prompt_stmt_opt T_EOL
+   51              | T_OPTIONAL T_EOL
+   52              | T_DEFAULT T_WORD if_expr T_EOL
+
+   53 choice_block: /* empty */
+   54             | choice_block common_block
+
+   55 if: T_IF expr T_EOL
+
+   56 if_end: end
+
+   57 if_stmt: if if_block if_end
+   58        | if if_block
+
+   59 if_block: /* empty */
+   60         | if_block common_block
+   61         | if_block menu_stmt
+   62         | if_block choice_stmt
+
+   63 menu: T_MENU prompt T_EOL
+
+   64 menu_entry: menu depends_list
+
+   65 menu_end: end
+
+   66 menu_stmt: menu_entry menu_block menu_end
+   67          | menu_entry menu_block
+
+   68 menu_block: /* empty */
+   69           | menu_block common_block
+   70           | menu_block menu_stmt
+   71           | menu_block choice_stmt
+   72           | menu_block error T_EOL
+
+   73 source: T_SOURCE prompt T_EOL
+
+   74 source_stmt: source
+
+   75 comment: T_COMMENT prompt T_EOL
+
+   76 comment_stmt: comment depends_list
+
+   77 help_start: T_HELP T_EOL
+
+   78 help: help_start T_HELPTEXT
+
+   79 depends_list: /* empty */
+   80             | depends_list depends
+   81             | depends_list T_EOL
+
+   82 depends: T_DEPENDS T_ON expr T_EOL
+   83        | T_DEPENDS expr T_EOL
+   84        | T_REQUIRES expr T_EOL
+
+   85 prompt_stmt_opt: /* empty */
+   86                | prompt if_expr
+
+   87 prompt: T_WORD
+   88       | T_WORD_QUOTE
+
+   89 end: T_ENDMENU nl_or_eof
+   90    | T_ENDCHOICE nl_or_eof
+   91    | T_ENDIF nl_or_eof
+
+   92 nl_or_eof: T_EOL
+   93          | T_EOF
+
+   94 if_expr: /* empty */
+   95        | T_IF expr
+
+   96 expr: symbol
+   97     | symbol T_EQUAL symbol
+   98     | symbol T_UNEQUAL symbol
+   99     | T_OPEN_PAREN expr T_CLOSE_PAREN
+  100     | T_NOT expr
+  101     | expr T_OR expr
+  102     | expr T_AND expr
+
+  103 symbol: T_WORD
+  104       | T_WORD_QUOTE
+
+
+Terminals, with rules where they appear
+
+$end (0) 0
+error (256) 10 72
+T_MAINMENU (258) 6
+T_MENU (259) 63
+T_ENDMENU (260) 7 89
+T_SOURCE (261) 73
+T_CHOICE (262) 38
+T_ENDCHOICE (263) 9 90
+T_COMMENT (264) 75
+T_CONFIG (265) 17
+T_MENUCONFIG (266) 19
+T_HELP (267) 77
+T_HELPTEXT (268) 78
+T_IF (269) 55 95
+T_ENDIF (270) 8 91
+T_DEPENDS (271) 82 83
+T_REQUIRES (272) 84
+T_OPTIONAL (273) 51
+T_PROMPT (274) 33 48
+T_DEFAULT (275) 34 52
+T_TRISTATE (276) 26 49
+T_DEF_TRISTATE (277) 27
+T_BOOLEAN (278) 28 50
+T_DEF_BOOLEAN (279) 29
+T_STRING (280) 32
+T_INT (281) 30
+T_HEX (282) 31
+T_WORD (283) 17 19 35 36 52 87 103
+T_WORD_QUOTE (284) 88 104
+T_UNEQUAL (285) 98
+T_EOF (286) 93
+T_EOL (287) 17 19 25 26 27 28 29 30 31 32 33 34 35 36 37 38 47 48 49
+    50 51 52 55 63 72 73 75 77 81 82 83 84 92
+T_CLOSE_PAREN (288) 99
+T_OPEN_PAREN (289) 99
+T_ON (290) 82
+T_SELECT (291) 35 36
+T_RANGE (292) 37
+T_OR (293) 101
+T_AND (294) 102
+T_EQUAL (295) 97
+T_NOT (296) 36 100
+
+
+Nonterminals, with rules where they appear
+
+$accept (42)
+    on left: 0
+input (43)
+    on left: 1 2, on right: 0 2
+block (44)
+    on left: 3 4 5 6 7 8 9 10, on right: 2
+common_block (45)
+    on left: 11 12 13 14 15 16, on right: 3 54 60 69
+config_entry_start (46)
+    on left: 17, on right: 18
+config_stmt (47)
+    on left: 18, on right: 13
+menuconfig_entry_start (48)
+    on left: 19, on right: 20
+menuconfig_stmt (49)
+    on left: 20, on right: 14
+config_option_list (50)
+    on left: 21 22 23 24 25, on right: 18 20 22 23 24 25
+config_option (51)
+    on left: 26 27 28 29 30 31 32 33 34 35 36 37, on right: 22
+choice (52)
+    on left: 38, on right: 39
+choice_entry (53)
+    on left: 39, on right: 41 42
+choice_end (54)
+    on left: 40, on right: 41
+choice_stmt (55)
+    on left: 41 42, on right: 4 62 71
+choice_option_list (56)
+    on left: 43 44 45 46 47, on right: 39 44 45 46 47
+choice_option (57)
+    on left: 48 49 50 51 52, on right: 44
+choice_block (58)
+    on left: 53 54, on right: 41 42 54
+if (59)
+    on left: 55, on right: 57 58
+if_end (60)
+    on left: 56, on right: 57
+if_stmt (61)
+    on left: 57 58, on right: 11
+if_block (62)
+    on left: 59 60 61 62, on right: 57 58 60 61 62
+menu (63)
+    on left: 63, on right: 64
+menu_entry (64)
+    on left: 64, on right: 66 67
+menu_end (65)
+    on left: 65, on right: 66
+menu_stmt (66)
+    on left: 66 67, on right: 5 61 70
+menu_block (67)
+    on left: 68 69 70 71 72, on right: 66 67 69 70 71 72
+source (68)
+    on left: 73, on right: 74
+source_stmt (69)
+    on left: 74, on right: 15
+comment (70)
+    on left: 75, on right: 76
+comment_stmt (71)
+    on left: 76, on right: 12
+help_start (72)
+    on left: 77, on right: 78
+help (73)
+    on left: 78, on right: 24 46
+depends_list (74)
+    on left: 79 80 81, on right: 64 76 80 81
+depends (75)
+    on left: 82 83 84, on right: 23 45 80
+prompt_stmt_opt (76)
+    on left: 85 86, on right: 26 28 30 31 32 49 50
+prompt (77)
+    on left: 87 88, on right: 6 33 48 63 73 75 86
+end (78)
+    on left: 89 90 91, on right: 40 56 65
+nl_or_eof (79)
+    on left: 92 93, on right: 6 10 16 89 90 91
+if_expr (80)
+    on left: 94 95, on right: 27 29 33 34 35 36 37 48 52 86
+expr (81)
+    on left: 96 97 98 99 100 101 102, on right: 27 29 34 55 82 83 84
+    95 99 100 101 102
+symbol (82)
+    on left: 103 104, on right: 37 96 97 98
+
+
+state 0
+
+    0 $accept: . input $end
+
+    $default  reduce using rule 1 (input)
+
+    input  go to state 1
+
+
+state 1
+
+    0 $accept: input . $end
+    2 input: input . block
+
+    $end          shift, and go to state 2
+    error         shift, and go to state 3
+    T_MAINMENU    shift, and go to state 4
+    T_MENU        shift, and go to state 5
+    T_ENDMENU     shift, and go to state 6
+    T_SOURCE      shift, and go to state 7
+    T_CHOICE      shift, and go to state 8
+    T_ENDCHOICE   shift, and go to state 9
+    T_COMMENT     shift, and go to state 10
+    T_CONFIG      shift, and go to state 11
+    T_MENUCONFIG  shift, and go to state 12
+    T_IF          shift, and go to state 13
+    T_ENDIF       shift, and go to state 14
+    T_EOF         shift, and go to state 15
+    T_EOL         shift, and go to state 16
+
+    block                   go to state 17
+    common_block            go to state 18
+    config_entry_start      go to state 19
+    config_stmt             go to state 20
+    menuconfig_entry_start  go to state 21
+    menuconfig_stmt         go to state 22
+    choice                  go to state 23
+    choice_entry            go to state 24
+    choice_stmt             go to state 25
+    if                      go to state 26
+    if_stmt                 go to state 27
+    menu                    go to state 28
+    menu_entry              go to state 29
+    menu_stmt               go to state 30
+    source                  go to state 31
+    source_stmt             go to state 32
+    comment                 go to state 33
+    comment_stmt            go to state 34
+    nl_or_eof               go to state 35
+
+
+state 2
+
+    0 $accept: input $end .
+
+    $default  accept
+
+
+state 3
+
+   10 block: error . nl_or_eof
+
+    T_EOF  shift, and go to state 15
+    T_EOL  shift, and go to state 16
+
+    nl_or_eof  go to state 36
+
+
+state 4
+
+    6 block: T_MAINMENU . prompt nl_or_eof
+
+    T_WORD        shift, and go to state 37
+    T_WORD_QUOTE  shift, and go to state 38
+
+    prompt  go to state 39
+
+
+state 5
+
+   63 menu: T_MENU . prompt T_EOL
+
+    T_WORD        shift, and go to state 37
+    T_WORD_QUOTE  shift, and go to state 38
+
+    prompt  go to state 40
+
+
+state 6
+
+    7 block: T_ENDMENU .
+
+    $default  reduce using rule 7 (block)
+
+
+state 7
+
+   73 source: T_SOURCE . prompt T_EOL
+
+    T_WORD        shift, and go to state 37
+    T_WORD_QUOTE  shift, and go to state 38
+
+    prompt  go to state 41
+
+
+state 8
+
+   38 choice: T_CHOICE . T_EOL
+
+    T_EOL  shift, and go to state 42
+
+
+state 9
+
+    9 block: T_ENDCHOICE .
+
+    $default  reduce using rule 9 (block)
+
+
+state 10
+
+   75 comment: T_COMMENT . prompt T_EOL
+
+    T_WORD        shift, and go to state 37
+    T_WORD_QUOTE  shift, and go to state 38
+
+    prompt  go to state 43
+
+
+state 11
+
+   17 config_entry_start: T_CONFIG . T_WORD T_EOL
+
+    T_WORD  shift, and go to state 44
+
+
+state 12
+
+   19 menuconfig_entry_start: T_MENUCONFIG . T_WORD T_EOL
+
+    T_WORD  shift, and go to state 45
+
+
+state 13
+
+   55 if: T_IF . expr T_EOL
+
+    T_WORD        shift, and go to state 46
+    T_WORD_QUOTE  shift, and go to state 47
+    T_OPEN_PAREN  shift, and go to state 48
+    T_NOT         shift, and go to state 49
+
+    expr    go to state 50
+    symbol  go to state 51
+
+
+state 14
+
+    8 block: T_ENDIF .
+
+    $default  reduce using rule 8 (block)
+
+
+state 15
+
+   93 nl_or_eof: T_EOF .
+
+    $default  reduce using rule 93 (nl_or_eof)
+
+
+state 16
+
+   92 nl_or_eof: T_EOL .
+
+    $default  reduce using rule 92 (nl_or_eof)
+
+
+state 17
+
+    2 input: input block .
+
+    $default  reduce using rule 2 (input)
+
+
+state 18
+
+    3 block: common_block .
+
+    $default  reduce using rule 3 (block)
+
+
+state 19
+
+   18 config_stmt: config_entry_start . config_option_list
+
+    $default  reduce using rule 21 (config_option_list)
+
+    config_option_list  go to state 52
+
+
+state 20
+
+   13 common_block: config_stmt .
+
+    $default  reduce using rule 13 (common_block)
+
+
+state 21
+
+   20 menuconfig_stmt: menuconfig_entry_start . config_option_list
+
+    $default  reduce using rule 21 (config_option_list)
+
+    config_option_list  go to state 53
+
+
+state 22
+
+   14 common_block: menuconfig_stmt .
+
+    $default  reduce using rule 14 (common_block)
+
+
+state 23
+
+   39 choice_entry: choice . choice_option_list
+
+    $default  reduce using rule 43 (choice_option_list)
+
+    choice_option_list  go to state 54
+
+
+state 24
+
+   41 choice_stmt: choice_entry . choice_block choice_end
+   42            | choice_entry . choice_block
+
+    $default  reduce using rule 53 (choice_block)
+
+    choice_block  go to state 55
+
+
+state 25
+
+    4 block: choice_stmt .
+
+    $default  reduce using rule 4 (block)
+
+
+state 26
+
+   57 if_stmt: if . if_block if_end
+   58        | if . if_block
+
+    $default  reduce using rule 59 (if_block)
+
+    if_block  go to state 56
+
+
+state 27
+
+   11 common_block: if_stmt .
+
+    $default  reduce using rule 11 (common_block)
+
+
+state 28
+
+   64 menu_entry: menu . depends_list
+
+    $default  reduce using rule 79 (depends_list)
+
+    depends_list  go to state 57
+
+
+state 29
+
+   66 menu_stmt: menu_entry . menu_block menu_end
+   67          | menu_entry . menu_block
+
+    $default  reduce using rule 68 (menu_block)
+
+    menu_block  go to state 58
+
+
+state 30
+
+    5 block: menu_stmt .
+
+    $default  reduce using rule 5 (block)
+
+
+state 31
+
+   74 source_stmt: source .
+
+    $default  reduce using rule 74 (source_stmt)
+
+
+state 32
+
+   15 common_block: source_stmt .
+
+    $default  reduce using rule 15 (common_block)
+
+
+state 33
+
+   76 comment_stmt: comment . depends_list
+
+    $default  reduce using rule 79 (depends_list)
+
+    depends_list  go to state 59
+
+
+state 34
+
+   12 common_block: comment_stmt .
+
+    $default  reduce using rule 12 (common_block)
+
+
+state 35
+
+   16 common_block: nl_or_eof .
+
+    $default  reduce using rule 16 (common_block)
+
+
+state 36
+
+   10 block: error nl_or_eof .
+
+    $default  reduce using rule 10 (block)
+
+
+state 37
+
+   87 prompt: T_WORD .
+
+    $default  reduce using rule 87 (prompt)
+
+
+state 38
+
+   88 prompt: T_WORD_QUOTE .
+
+    $default  reduce using rule 88 (prompt)
+
+
+state 39
+
+    6 block: T_MAINMENU prompt . nl_or_eof
+
+    T_EOF  shift, and go to state 15
+    T_EOL  shift, and go to state 16
+
+    nl_or_eof  go to state 60
+
+
+state 40
+
+   63 menu: T_MENU prompt . T_EOL
+
+    T_EOL  shift, and go to state 61
+
+
+state 41
+
+   73 source: T_SOURCE prompt . T_EOL
+
+    T_EOL  shift, and go to state 62
+
+
+state 42
+
+   38 choice: T_CHOICE T_EOL .
+
+    $default  reduce using rule 38 (choice)
+
+
+state 43
+
+   75 comment: T_COMMENT prompt . T_EOL
+
+    T_EOL  shift, and go to state 63
+
+
+state 44
+
+   17 config_entry_start: T_CONFIG T_WORD . T_EOL
+
+    T_EOL  shift, and go to state 64
+
+
+state 45
+
+   19 menuconfig_entry_start: T_MENUCONFIG T_WORD . T_EOL
+
+    T_EOL  shift, and go to state 65
+
+
+state 46
+
+  103 symbol: T_WORD .
+
+    $default  reduce using rule 103 (symbol)
+
+
+state 47
+
+  104 symbol: T_WORD_QUOTE .
+
+    $default  reduce using rule 104 (symbol)
+
+
+state 48
+
+   99 expr: T_OPEN_PAREN . expr T_CLOSE_PAREN
+
+    T_WORD        shift, and go to state 46
+    T_WORD_QUOTE  shift, and go to state 47
+    T_OPEN_PAREN  shift, and go to state 48
+    T_NOT         shift, and go to state 49
+
+    expr    go to state 66
+    symbol  go to state 51
+
+
+state 49
+
+  100 expr: T_NOT . expr
+
+    T_WORD        shift, and go to state 46
+    T_WORD_QUOTE  shift, and go to state 47
+    T_OPEN_PAREN  shift, and go to state 48
+    T_NOT         shift, and go to state 49
+
+    expr    go to state 67
+    symbol  go to state 51
+
+
+state 50
+
+   55 if: T_IF expr . T_EOL
+  101 expr: expr . T_OR expr
+  102     | expr . T_AND expr
+
+    T_EOL  shift, and go to state 68
+    T_OR   shift, and go to state 69
+    T_AND  shift, and go to state 70
+
+
+state 51
+
+   96 expr: symbol .
+   97     | symbol . T_EQUAL symbol
+   98     | symbol . T_UNEQUAL symbol
+
+    T_UNEQUAL  shift, and go to state 71
+    T_EQUAL    shift, and go to state 72
+
+    $default  reduce using rule 96 (expr)
+
+
+state 52
+
+   18 config_stmt: config_entry_start config_option_list .
+   22 config_option_list: config_option_list . config_option
+   23                   | config_option_list . depends
+   24                   | config_option_list . help
+   25                   | config_option_list . T_EOL
+
+    T_HELP          shift, and go to state 73
+    T_DEPENDS       shift, and go to state 74
+    T_REQUIRES      shift, and go to state 75
+    T_PROMPT        shift, and go to state 76
+    T_DEFAULT       shift, and go to state 77
+    T_TRISTATE      shift, and go to state 78
+    T_DEF_TRISTATE  shift, and go to state 79
+    T_BOOLEAN       shift, and go to state 80
+    T_DEF_BOOLEAN   shift, and go to state 81
+    T_STRING        shift, and go to state 82
+    T_INT           shift, and go to state 83
+    T_HEX           shift, and go to state 84
+    T_EOL           shift, and go to state 85
+    T_SELECT        shift, and go to state 86
+    T_RANGE         shift, and go to state 87
+
+    T_EOL     [reduce using rule 18 (config_stmt)]
+    $default  reduce using rule 18 (config_stmt)
+
+    config_option  go to state 88
+    help_start     go to state 89
+    help           go to state 90
+    depends        go to state 91
+
+
+state 53
+
+   20 menuconfig_stmt: menuconfig_entry_start config_option_list .
+   22 config_option_list: config_option_list . config_option
+   23                   | config_option_list . depends
+   24                   | config_option_list . help
+   25                   | config_option_list . T_EOL
+
+    T_HELP          shift, and go to state 73
+    T_DEPENDS       shift, and go to state 74
+    T_REQUIRES      shift, and go to state 75
+    T_PROMPT        shift, and go to state 76
+    T_DEFAULT       shift, and go to state 77
+    T_TRISTATE      shift, and go to state 78
+    T_DEF_TRISTATE  shift, and go to state 79
+    T_BOOLEAN       shift, and go to state 80
+    T_DEF_BOOLEAN   shift, and go to state 81
+    T_STRING        shift, and go to state 82
+    T_INT           shift, and go to state 83
+    T_HEX           shift, and go to state 84
+    T_EOL           shift, and go to state 85
+    T_SELECT        shift, and go to state 86
+    T_RANGE         shift, and go to state 87
+
+    T_EOL     [reduce using rule 20 (menuconfig_stmt)]
+    $default  reduce using rule 20 (menuconfig_stmt)
+
+    config_option  go to state 88
+    help_start     go to state 89
+    help           go to state 90
+    depends        go to state 91
+
+
+state 54
+
+   39 choice_entry: choice choice_option_list .
+   44 choice_option_list: choice_option_list . choice_option
+   45                   | choice_option_list . depends
+   46                   | choice_option_list . help
+   47                   | choice_option_list . T_EOL
+
+    T_HELP      shift, and go to state 73
+    T_DEPENDS   shift, and go to state 74
+    T_REQUIRES  shift, and go to state 75
+    T_OPTIONAL  shift, and go to state 92
+    T_PROMPT    shift, and go to state 93
+    T_DEFAULT   shift, and go to state 94
+    T_TRISTATE  shift, and go to state 95
+    T_BOOLEAN   shift, and go to state 96
+    T_EOL       shift, and go to state 97
+
+    T_EOL     [reduce using rule 39 (choice_entry)]
+    $default  reduce using rule 39 (choice_entry)
+
+    choice_option  go to state 98
+    help_start     go to state 89
+    help           go to state 99
+    depends        go to state 100
+
+
+state 55
+
+   41 choice_stmt: choice_entry choice_block . choice_end
+   42            | choice_entry choice_block .
+   54 choice_block: choice_block . common_block
+
+    T_ENDMENU     shift, and go to state 101
+    T_SOURCE      shift, and go to state 7
+    T_ENDCHOICE   shift, and go to state 102
+    T_COMMENT     shift, and go to state 10
+    T_CONFIG      shift, and go to state 11
+    T_MENUCONFIG  shift, and go to state 12
+    T_IF          shift, and go to state 13
+    T_ENDIF       shift, and go to state 103
+    T_EOF         shift, and go to state 15
+    T_EOL         shift, and go to state 16
+
+    T_ENDMENU     [reduce using rule 42 (choice_stmt)]
+    T_SOURCE      [reduce using rule 42 (choice_stmt)]
+    T_ENDCHOICE   [reduce using rule 42 (choice_stmt)]
+    T_COMMENT     [reduce using rule 42 (choice_stmt)]
+    T_CONFIG      [reduce using rule 42 (choice_stmt)]
+    T_MENUCONFIG  [reduce using rule 42 (choice_stmt)]
+    T_IF          [reduce using rule 42 (choice_stmt)]
+    T_ENDIF       [reduce using rule 42 (choice_stmt)]
+    T_EOF         [reduce using rule 42 (choice_stmt)]
+    T_EOL         [reduce using rule 42 (choice_stmt)]
+    $default      reduce using rule 42 (choice_stmt)
+
+    common_block            go to state 104
+    config_entry_start      go to state 19
+    config_stmt             go to state 20
+    menuconfig_entry_start  go to state 21
+    menuconfig_stmt         go to state 22
+    choice_end              go to state 105
+    if                      go to state 26
+    if_stmt                 go to state 27
+    source                  go to state 31
+    source_stmt             go to state 32
+    comment                 go to state 33
+    comment_stmt            go to state 34
+    end                     go to state 106
+    nl_or_eof               go to state 35
+
+
+state 56
+
+   57 if_stmt: if if_block . if_end
+   58        | if if_block .
+   60 if_block: if_block . common_block
+   61         | if_block . menu_stmt
+   62         | if_block . choice_stmt
+
+    T_MENU        shift, and go to state 5
+    T_ENDMENU     shift, and go to state 101
+    T_SOURCE      shift, and go to state 7
+    T_CHOICE      shift, and go to state 8
+    T_ENDCHOICE   shift, and go to state 102
+    T_COMMENT     shift, and go to state 10
+    T_CONFIG      shift, and go to state 11
+    T_MENUCONFIG  shift, and go to state 12
+    T_IF          shift, and go to state 13
+    T_ENDIF       shift, and go to state 103
+    T_EOF         shift, and go to state 15
+    T_EOL         shift, and go to state 16
+
+    T_MENU        [reduce using rule 58 (if_stmt)]
+    T_ENDMENU     [reduce using rule 58 (if_stmt)]
+    T_SOURCE      [reduce using rule 58 (if_stmt)]
+    T_CHOICE      [reduce using rule 58 (if_stmt)]
+    T_ENDCHOICE   [reduce using rule 58 (if_stmt)]
+    T_COMMENT     [reduce using rule 58 (if_stmt)]
+    T_CONFIG      [reduce using rule 58 (if_stmt)]
+    T_MENUCONFIG  [reduce using rule 58 (if_stmt)]
+    T_IF          [reduce using rule 58 (if_stmt)]
+    T_ENDIF       [reduce using rule 58 (if_stmt)]
+    T_EOF         [reduce using rule 58 (if_stmt)]
+    T_EOL         [reduce using rule 58 (if_stmt)]
+    $default      reduce using rule 58 (if_stmt)
+
+    common_block            go to state 107
+    config_entry_start      go to state 19
+    config_stmt             go to state 20
+    menuconfig_entry_start  go to state 21
+    menuconfig_stmt         go to state 22
+    choice                  go to state 23
+    choice_entry            go to state 24
+    choice_stmt             go to state 108
+    if                      go to state 26
+    if_end                  go to state 109
+    if_stmt                 go to state 27
+    menu                    go to state 28
+    menu_entry              go to state 29
+    menu_stmt               go to state 110
+    source                  go to state 31
+    source_stmt             go to state 32
+    comment                 go to state 33
+    comment_stmt            go to state 34
+    end                     go to state 111
+    nl_or_eof               go to state 35
+
+
+state 57
+
+   64 menu_entry: menu depends_list .
+   80 depends_list: depends_list . depends
+   81             | depends_list . T_EOL
+
+    T_DEPENDS   shift, and go to state 74
+    T_REQUIRES  shift, and go to state 75
+    T_EOL       shift, and go to state 112
+
+    T_EOL     [reduce using rule 64 (menu_entry)]
+    $default  reduce using rule 64 (menu_entry)
+
+    depends  go to state 113
+
+
+state 58
+
+   66 menu_stmt: menu_entry menu_block . menu_end
+   67          | menu_entry menu_block .
+   69 menu_block: menu_block . common_block
+   70           | menu_block . menu_stmt
+   71           | menu_block . choice_stmt
+   72           | menu_block . error T_EOL
+
+    error         shift, and go to state 114
+    T_MENU        shift, and go to state 5
+    T_ENDMENU     shift, and go to state 101
+    T_SOURCE      shift, and go to state 7
+    T_CHOICE      shift, and go to state 8
+    T_ENDCHOICE   shift, and go to state 102
+    T_COMMENT     shift, and go to state 10
+    T_CONFIG      shift, and go to state 11
+    T_MENUCONFIG  shift, and go to state 12
+    T_IF          shift, and go to state 13
+    T_ENDIF       shift, and go to state 103
+    T_EOF         shift, and go to state 15
+    T_EOL         shift, and go to state 16
+
+    $end          reduce using rule 67 (menu_stmt)
+    error         [reduce using rule 67 (menu_stmt)]
+    T_MAINMENU    reduce using rule 67 (menu_stmt)
+    T_MENU        [reduce using rule 67 (menu_stmt)]
+    T_ENDMENU     [reduce using rule 67 (menu_stmt)]
+    T_SOURCE      [reduce using rule 67 (menu_stmt)]
+    T_CHOICE      [reduce using rule 67 (menu_stmt)]
+    T_ENDCHOICE   [reduce using rule 67 (menu_stmt)]
+    T_COMMENT     [reduce using rule 67 (menu_stmt)]
+    T_CONFIG      [reduce using rule 67 (menu_stmt)]
+    T_MENUCONFIG  [reduce using rule 67 (menu_stmt)]
+    T_IF          [reduce using rule 67 (menu_stmt)]
+    T_ENDIF       [reduce using rule 67 (menu_stmt)]
+    T_EOF         [reduce using rule 67 (menu_stmt)]
+    T_EOL         [reduce using rule 67 (menu_stmt)]
+
+    common_block            go to state 115
+    config_entry_start      go to state 19
+    config_stmt             go to state 20
+    menuconfig_entry_start  go to state 21
+    menuconfig_stmt         go to state 22
+    choice                  go to state 23
+    choice_entry            go to state 24
+    choice_stmt             go to state 116
+    if                      go to state 26
+    if_stmt                 go to state 27
+    menu                    go to state 28
+    menu_entry              go to state 29
+    menu_end                go to state 117
+    menu_stmt               go to state 118
+    source                  go to state 31
+    source_stmt             go to state 32
+    comment                 go to state 33
+    comment_stmt            go to state 34
+    end                     go to state 119
+    nl_or_eof               go to state 35
+
+
+state 59
+
+   76 comment_stmt: comment depends_list .
+   80 depends_list: depends_list . depends
+   81             | depends_list . T_EOL
+
+    T_DEPENDS   shift, and go to state 74
+    T_REQUIRES  shift, and go to state 75
+    T_EOL       shift, and go to state 112
+
+    T_EOL     [reduce using rule 76 (comment_stmt)]
+    $default  reduce using rule 76 (comment_stmt)
+
+    depends  go to state 113
+
+
+state 60
+
+    6 block: T_MAINMENU prompt nl_or_eof .
+
+    $default  reduce using rule 6 (block)
+
+
+state 61
+
+   63 menu: T_MENU prompt T_EOL .
+
+    $default  reduce using rule 63 (menu)
+
+
+state 62
+
+   73 source: T_SOURCE prompt T_EOL .
+
+    $default  reduce using rule 73 (source)
+
+
+state 63
+
+   75 comment: T_COMMENT prompt T_EOL .
+
+    $default  reduce using rule 75 (comment)
+
+
+state 64
+
+   17 config_entry_start: T_CONFIG T_WORD T_EOL .
+
+    $default  reduce using rule 17 (config_entry_start)
+
+
+state 65
+
+   19 menuconfig_entry_start: T_MENUCONFIG T_WORD T_EOL .
+
+    $default  reduce using rule 19 (menuconfig_entry_start)
+
+
+state 66
+
+   99 expr: T_OPEN_PAREN expr . T_CLOSE_PAREN
+  101     | expr . T_OR expr
+  102     | expr . T_AND expr
+
+    T_CLOSE_PAREN  shift, and go to state 120
+    T_OR           shift, and go to state 69
+    T_AND          shift, and go to state 70
+
+
+state 67
+
+  100 expr: T_NOT expr .
+  101     | expr . T_OR expr
+  102     | expr . T_AND expr
+
+    $default  reduce using rule 100 (expr)
+
+
+state 68
+
+   55 if: T_IF expr T_EOL .
+
+    $default  reduce using rule 55 (if)
+
+
+state 69
+
+  101 expr: expr T_OR . expr
+
+    T_WORD        shift, and go to state 46
+    T_WORD_QUOTE  shift, and go to state 47
+    T_OPEN_PAREN  shift, and go to state 48
+    T_NOT         shift, and go to state 49
+
+    expr    go to state 121
+    symbol  go to state 51
+
+
+state 70
+
+  102 expr: expr T_AND . expr
+
+    T_WORD        shift, and go to state 46
+    T_WORD_QUOTE  shift, and go to state 47
+    T_OPEN_PAREN  shift, and go to state 48
+    T_NOT         shift, and go to state 49
+
+    expr    go to state 122
+    symbol  go to state 51
+
+
+state 71
+
+   98 expr: symbol T_UNEQUAL . symbol
+
+    T_WORD        shift, and go to state 46
+    T_WORD_QUOTE  shift, and go to state 47
+
+    symbol  go to state 123
+
+
+state 72
+
+   97 expr: symbol T_EQUAL . symbol
+
+    T_WORD        shift, and go to state 46
+    T_WORD_QUOTE  shift, and go to state 47
+
+    symbol  go to state 124
+
+
+state 73
+
+   77 help_start: T_HELP . T_EOL
+
+    T_EOL  shift, and go to state 125
+
+
+state 74
+
+   82 depends: T_DEPENDS . T_ON expr T_EOL
+   83        | T_DEPENDS . expr T_EOL
+
+    T_WORD        shift, and go to state 46
+    T_WORD_QUOTE  shift, and go to state 47
+    T_OPEN_PAREN  shift, and go to state 48
+    T_ON          shift, and go to state 126
+    T_NOT         shift, and go to state 49
+
+    expr    go to state 127
+    symbol  go to state 51
+
+
+state 75
+
+   84 depends: T_REQUIRES . expr T_EOL
+
+    T_WORD        shift, and go to state 46
+    T_WORD_QUOTE  shift, and go to state 47
+    T_OPEN_PAREN  shift, and go to state 48
+    T_NOT         shift, and go to state 49
+
+    expr    go to state 128
+    symbol  go to state 51
+
+
+state 76
+
+   33 config_option: T_PROMPT . prompt if_expr T_EOL
+
+    T_WORD        shift, and go to state 37
+    T_WORD_QUOTE  shift, and go to state 38
+
+    prompt  go to state 129
+
+
+state 77
+
+   34 config_option: T_DEFAULT . expr if_expr T_EOL
+
+    T_WORD        shift, and go to state 46
+    T_WORD_QUOTE  shift, and go to state 47
+    T_OPEN_PAREN  shift, and go to state 48
+    T_NOT         shift, and go to state 49
+
+    expr    go to state 130
+    symbol  go to state 51
+
+
+state 78
+
+   26 config_option: T_TRISTATE . prompt_stmt_opt T_EOL
+
+    T_WORD        shift, and go to state 37
+    T_WORD_QUOTE  shift, and go to state 38
+
+    $default  reduce using rule 85 (prompt_stmt_opt)
+
+    prompt_stmt_opt  go to state 131
+    prompt           go to state 132
+
+
+state 79
+
+   27 config_option: T_DEF_TRISTATE . expr if_expr T_EOL
+
+    T_WORD        shift, and go to state 46
+    T_WORD_QUOTE  shift, and go to state 47
+    T_OPEN_PAREN  shift, and go to state 48
+    T_NOT         shift, and go to state 49
+
+    expr    go to state 133
+    symbol  go to state 51
+
+
+state 80
+
+   28 config_option: T_BOOLEAN . prompt_stmt_opt T_EOL
+
+    T_WORD        shift, and go to state 37
+    T_WORD_QUOTE  shift, and go to state 38
+
+    $default  reduce using rule 85 (prompt_stmt_opt)
+
+    prompt_stmt_opt  go to state 134
+    prompt           go to state 132
+
+
+state 81
+
+   29 config_option: T_DEF_BOOLEAN . expr if_expr T_EOL
+
+    T_WORD        shift, and go to state 46
+    T_WORD_QUOTE  shift, and go to state 47
+    T_OPEN_PAREN  shift, and go to state 48
+    T_NOT         shift, and go to state 49
+
+    expr    go to state 135
+    symbol  go to state 51
+
+
+state 82
+
+   32 config_option: T_STRING . prompt_stmt_opt T_EOL
+
+    T_WORD        shift, and go to state 37
+    T_WORD_QUOTE  shift, and go to state 38
+
+    $default  reduce using rule 85 (prompt_stmt_opt)
+
+    prompt_stmt_opt  go to state 136
+    prompt           go to state 132
+
+
+state 83
+
+   30 config_option: T_INT . prompt_stmt_opt T_EOL
+
+    T_WORD        shift, and go to state 37
+    T_WORD_QUOTE  shift, and go to state 38
+
+    $default  reduce using rule 85 (prompt_stmt_opt)
+
+    prompt_stmt_opt  go to state 137
+    prompt           go to state 132
+
+
+state 84
+
+   31 config_option: T_HEX . prompt_stmt_opt T_EOL
+
+    T_WORD        shift, and go to state 37
+    T_WORD_QUOTE  shift, and go to state 38
+
+    $default  reduce using rule 85 (prompt_stmt_opt)
+
+    prompt_stmt_opt  go to state 138
+    prompt           go to state 132
+
+
+state 85
+
+   25 config_option_list: config_option_list T_EOL .
+
+    $default  reduce using rule 25 (config_option_list)
+
+
+state 86
+
+   35 config_option: T_SELECT . T_WORD if_expr T_EOL
+   36              | T_SELECT . T_NOT T_WORD if_expr T_EOL
+
+    T_WORD  shift, and go to state 139
+    T_NOT   shift, and go to state 140
+
+
+state 87
+
+   37 config_option: T_RANGE . symbol symbol if_expr T_EOL
+
+    T_WORD        shift, and go to state 46
+    T_WORD_QUOTE  shift, and go to state 47
+
+    symbol  go to state 141
+
+
+state 88
+
+   22 config_option_list: config_option_list config_option .
+
+    $default  reduce using rule 22 (config_option_list)
+
+
+state 89
+
+   78 help: help_start . T_HELPTEXT
+
+    T_HELPTEXT  shift, and go to state 142
+
+
+state 90
+
+   24 config_option_list: config_option_list help .
+
+    $default  reduce using rule 24 (config_option_list)
+
+
+state 91
+
+   23 config_option_list: config_option_list depends .
+
+    $default  reduce using rule 23 (config_option_list)
+
+
+state 92
+
+   51 choice_option: T_OPTIONAL . T_EOL
+
+    T_EOL  shift, and go to state 143
+
+
+state 93
+
+   48 choice_option: T_PROMPT . prompt if_expr T_EOL
+
+    T_WORD        shift, and go to state 37
+    T_WORD_QUOTE  shift, and go to state 38
+
+    prompt  go to state 144
+
+
+state 94
+
+   52 choice_option: T_DEFAULT . T_WORD if_expr T_EOL
+
+    T_WORD  shift, and go to state 145
+
+
+state 95
+
+   49 choice_option: T_TRISTATE . prompt_stmt_opt T_EOL
+
+    T_WORD        shift, and go to state 37
+    T_WORD_QUOTE  shift, and go to state 38
+
+    $default  reduce using rule 85 (prompt_stmt_opt)
+
+    prompt_stmt_opt  go to state 146
+    prompt           go to state 132
+
+
+state 96
+
+   50 choice_option: T_BOOLEAN . prompt_stmt_opt T_EOL
+
+    T_WORD        shift, and go to state 37
+    T_WORD_QUOTE  shift, and go to state 38
+
+    $default  reduce using rule 85 (prompt_stmt_opt)
+
+    prompt_stmt_opt  go to state 147
+    prompt           go to state 132
+
+
+state 97
+
+   47 choice_option_list: choice_option_list T_EOL .
+
+    $default  reduce using rule 47 (choice_option_list)
+
+
+state 98
+
+   44 choice_option_list: choice_option_list choice_option .
+
+    $default  reduce using rule 44 (choice_option_list)
+
+
+state 99
+
+   46 choice_option_list: choice_option_list help .
+
+    $default  reduce using rule 46 (choice_option_list)
+
+
+state 100
+
+   45 choice_option_list: choice_option_list depends .
+
+    $default  reduce using rule 45 (choice_option_list)
+
+
+state 101
+
+   89 end: T_ENDMENU . nl_or_eof
+
+    T_EOF  shift, and go to state 15
+    T_EOL  shift, and go to state 16
+
+    nl_or_eof  go to state 148
+
+
+state 102
+
+   90 end: T_ENDCHOICE . nl_or_eof
+
+    T_EOF  shift, and go to state 15
+    T_EOL  shift, and go to state 16
+
+    nl_or_eof  go to state 149
+
+
+state 103
+
+   91 end: T_ENDIF . nl_or_eof
+
+    T_EOF  shift, and go to state 15
+    T_EOL  shift, and go to state 16
+
+    nl_or_eof  go to state 150
+
+
+state 104
+
+   54 choice_block: choice_block common_block .
+
+    $default  reduce using rule 54 (choice_block)
+
+
+state 105
+
+   41 choice_stmt: choice_entry choice_block choice_end .
+
+    $default  reduce using rule 41 (choice_stmt)
+
+
+state 106
+
+   40 choice_end: end .
+
+    $default  reduce using rule 40 (choice_end)
+
+
+state 107
+
+   60 if_block: if_block common_block .
+
+    $default  reduce using rule 60 (if_block)
+
+
+state 108
+
+   62 if_block: if_block choice_stmt .
+
+    $default  reduce using rule 62 (if_block)
+
+
+state 109
+
+   57 if_stmt: if if_block if_end .
+
+    $default  reduce using rule 57 (if_stmt)
+
+
+state 110
+
+   61 if_block: if_block menu_stmt .
+
+    $default  reduce using rule 61 (if_block)
+
+
+state 111
+
+   56 if_end: end .
+
+    $default  reduce using rule 56 (if_end)
+
+
+state 112
+
+   81 depends_list: depends_list T_EOL .
+
+    $default  reduce using rule 81 (depends_list)
+
+
+state 113
+
+   80 depends_list: depends_list depends .
+
+    $default  reduce using rule 80 (depends_list)
+
+
+state 114
+
+   72 menu_block: menu_block error . T_EOL
+
+    T_EOL  shift, and go to state 151
+
+
+state 115
+
+   69 menu_block: menu_block common_block .
+
+    $default  reduce using rule 69 (menu_block)
+
+
+state 116
+
+   71 menu_block: menu_block choice_stmt .
+
+    $default  reduce using rule 71 (menu_block)
+
+
+state 117
+
+   66 menu_stmt: menu_entry menu_block menu_end .
+
+    $default  reduce using rule 66 (menu_stmt)
+
+
+state 118
+
+   70 menu_block: menu_block menu_stmt .
+
+    $default  reduce using rule 70 (menu_block)
+
+
+state 119
+
+   65 menu_end: end .
+
+    $default  reduce using rule 65 (menu_end)
+
+
+state 120
+
+   99 expr: T_OPEN_PAREN expr T_CLOSE_PAREN .
+
+    $default  reduce using rule 99 (expr)
+
+
+state 121
+
+  101 expr: expr . T_OR expr
+  101     | expr T_OR expr .
+  102     | expr . T_AND expr
+
+    T_AND  shift, and go to state 70
+
+    $default  reduce using rule 101 (expr)
+
+
+state 122
+
+  101 expr: expr . T_OR expr
+  102     | expr . T_AND expr
+  102     | expr T_AND expr .
+
+    $default  reduce using rule 102 (expr)
+
+
+state 123
+
+   98 expr: symbol T_UNEQUAL symbol .
+
+    $default  reduce using rule 98 (expr)
+
+
+state 124
+
+   97 expr: symbol T_EQUAL symbol .
+
+    $default  reduce using rule 97 (expr)
+
+
+state 125
+
+   77 help_start: T_HELP T_EOL .
+
+    $default  reduce using rule 77 (help_start)
+
+
+state 126
+
+   82 depends: T_DEPENDS T_ON . expr T_EOL
+
+    T_WORD        shift, and go to state 46
+    T_WORD_QUOTE  shift, and go to state 47
+    T_OPEN_PAREN  shift, and go to state 48
+    T_NOT         shift, and go to state 49
+
+    expr    go to state 152
+    symbol  go to state 51
+
+
+state 127
+
+   83 depends: T_DEPENDS expr . T_EOL
+  101 expr: expr . T_OR expr
+  102     | expr . T_AND expr
+
+    T_EOL  shift, and go to state 153
+    T_OR   shift, and go to state 69
+    T_AND  shift, and go to state 70
+
+
+state 128
+
+   84 depends: T_REQUIRES expr . T_EOL
+  101 expr: expr . T_OR expr
+  102     | expr . T_AND expr
+
+    T_EOL  shift, and go to state 154
+    T_OR   shift, and go to state 69
+    T_AND  shift, and go to state 70
+
+
+state 129
+
+   33 config_option: T_PROMPT prompt . if_expr T_EOL
+
+    T_IF  shift, and go to state 155
+
+    $default  reduce using rule 94 (if_expr)
+
+    if_expr  go to state 156
+
+
+state 130
+
+   34 config_option: T_DEFAULT expr . if_expr T_EOL
+  101 expr: expr . T_OR expr
+  102     | expr . T_AND expr
+
+    T_IF   shift, and go to state 155
+    T_OR   shift, and go to state 69
+    T_AND  shift, and go to state 70
+
+    $default  reduce using rule 94 (if_expr)
+
+    if_expr  go to state 157
+
+
+state 131
+
+   26 config_option: T_TRISTATE prompt_stmt_opt . T_EOL
+
+    T_EOL  shift, and go to state 158
+
+
+state 132
+
+   86 prompt_stmt_opt: prompt . if_expr
+
+    T_IF  shift, and go to state 155
+
+    $default  reduce using rule 94 (if_expr)
+
+    if_expr  go to state 159
+
+
+state 133
+
+   27 config_option: T_DEF_TRISTATE expr . if_expr T_EOL
+  101 expr: expr . T_OR expr
+  102     | expr . T_AND expr
+
+    T_IF   shift, and go to state 155
+    T_OR   shift, and go to state 69
+    T_AND  shift, and go to state 70
+
+    $default  reduce using rule 94 (if_expr)
+
+    if_expr  go to state 160
+
+
+state 134
+
+   28 config_option: T_BOOLEAN prompt_stmt_opt . T_EOL
+
+    T_EOL  shift, and go to state 161
+
+
+state 135
+
+   29 config_option: T_DEF_BOOLEAN expr . if_expr T_EOL
+  101 expr: expr . T_OR expr
+  102     | expr . T_AND expr
+
+    T_IF   shift, and go to state 155
+    T_OR   shift, and go to state 69
+    T_AND  shift, and go to state 70
+
+    $default  reduce using rule 94 (if_expr)
+
+    if_expr  go to state 162
+
+
+state 136
+
+   32 config_option: T_STRING prompt_stmt_opt . T_EOL
+
+    T_EOL  shift, and go to state 163
+
+
+state 137
+
+   30 config_option: T_INT prompt_stmt_opt . T_EOL
+
+    T_EOL  shift, and go to state 164
+
+
+state 138
+
+   31 config_option: T_HEX prompt_stmt_opt . T_EOL
+
+    T_EOL  shift, and go to state 165
+
+
+state 139
+
+   35 config_option: T_SELECT T_WORD . if_expr T_EOL
+
+    T_IF  shift, and go to state 155
+
+    $default  reduce using rule 94 (if_expr)
+
+    if_expr  go to state 166
+
+
+state 140
+
+   36 config_option: T_SELECT T_NOT . T_WORD if_expr T_EOL
+
+    T_WORD  shift, and go to state 167
+
+
+state 141
+
+   37 config_option: T_RANGE symbol . symbol if_expr T_EOL
+
+    T_WORD        shift, and go to state 46
+    T_WORD_QUOTE  shift, and go to state 47
+
+    symbol  go to state 168
+
+
+state 142
+
+   78 help: help_start T_HELPTEXT .
+
+    $default  reduce using rule 78 (help)
+
+
+state 143
+
+   51 choice_option: T_OPTIONAL T_EOL .
+
+    $default  reduce using rule 51 (choice_option)
+
+
+state 144
+
+   48 choice_option: T_PROMPT prompt . if_expr T_EOL
+
+    T_IF  shift, and go to state 155
+
+    $default  reduce using rule 94 (if_expr)
+
+    if_expr  go to state 169
+
+
+state 145
+
+   52 choice_option: T_DEFAULT T_WORD . if_expr T_EOL
+
+    T_IF  shift, and go to state 155
+
+    $default  reduce using rule 94 (if_expr)
+
+    if_expr  go to state 170
+
+
+state 146
+
+   49 choice_option: T_TRISTATE prompt_stmt_opt . T_EOL
+
+    T_EOL  shift, and go to state 171
+
+
+state 147
+
+   50 choice_option: T_BOOLEAN prompt_stmt_opt . T_EOL
+
+    T_EOL  shift, and go to state 172
+
+
+state 148
+
+   89 end: T_ENDMENU nl_or_eof .
+
+    $default  reduce using rule 89 (end)
+
+
+state 149
+
+   90 end: T_ENDCHOICE nl_or_eof .
+
+    $default  reduce using rule 90 (end)
+
+
+state 150
+
+   91 end: T_ENDIF nl_or_eof .
+
+    $default  reduce using rule 91 (end)
+
+
+state 151
+
+   72 menu_block: menu_block error T_EOL .
+
+    $default  reduce using rule 72 (menu_block)
+
+
+state 152
+
+   82 depends: T_DEPENDS T_ON expr . T_EOL
+  101 expr: expr . T_OR expr
+  102     | expr . T_AND expr
+
+    T_EOL  shift, and go to state 173
+    T_OR   shift, and go to state 69
+    T_AND  shift, and go to state 70
+
+
+state 153
+
+   83 depends: T_DEPENDS expr T_EOL .
+
+    $default  reduce using rule 83 (depends)
+
+
+state 154
+
+   84 depends: T_REQUIRES expr T_EOL .
+
+    $default  reduce using rule 84 (depends)
+
+
+state 155
+
+   95 if_expr: T_IF . expr
+
+    T_WORD        shift, and go to state 46
+    T_WORD_QUOTE  shift, and go to state 47
+    T_OPEN_PAREN  shift, and go to state 48
+    T_NOT         shift, and go to state 49
+
+    expr    go to state 174
+    symbol  go to state 51
+
+
+state 156
+
+   33 config_option: T_PROMPT prompt if_expr . T_EOL
+
+    T_EOL  shift, and go to state 175
+
+
+state 157
+
+   34 config_option: T_DEFAULT expr if_expr . T_EOL
+
+    T_EOL  shift, and go to state 176
+
+
+state 158
+
+   26 config_option: T_TRISTATE prompt_stmt_opt T_EOL .
+
+    $default  reduce using rule 26 (config_option)
+
+
+state 159
+
+   86 prompt_stmt_opt: prompt if_expr .
+
+    $default  reduce using rule 86 (prompt_stmt_opt)
+
+
+state 160
+
+   27 config_option: T_DEF_TRISTATE expr if_expr . T_EOL
+
+    T_EOL  shift, and go to state 177
+
+
+state 161
+
+   28 config_option: T_BOOLEAN prompt_stmt_opt T_EOL .
+
+    $default  reduce using rule 28 (config_option)
+
+
+state 162
+
+   29 config_option: T_DEF_BOOLEAN expr if_expr . T_EOL
+
+    T_EOL  shift, and go to state 178
+
+
+state 163
+
+   32 config_option: T_STRING prompt_stmt_opt T_EOL .
+
+    $default  reduce using rule 32 (config_option)
+
+
+state 164
+
+   30 config_option: T_INT prompt_stmt_opt T_EOL .
+
+    $default  reduce using rule 30 (config_option)
+
+
+state 165
+
+   31 config_option: T_HEX prompt_stmt_opt T_EOL .
+
+    $default  reduce using rule 31 (config_option)
+
+
+state 166
+
+   35 config_option: T_SELECT T_WORD if_expr . T_EOL
+
+    T_EOL  shift, and go to state 179
+
+
+state 167
+
+   36 config_option: T_SELECT T_NOT T_WORD . if_expr T_EOL
+
+    T_IF  shift, and go to state 155
+
+    $default  reduce using rule 94 (if_expr)
+
+    if_expr  go to state 180
+
+
+state 168
+
+   37 config_option: T_RANGE symbol symbol . if_expr T_EOL
+
+    T_IF  shift, and go to state 155
+
+    $default  reduce using rule 94 (if_expr)
+
+    if_expr  go to state 181
+
+
+state 169
+
+   48 choice_option: T_PROMPT prompt if_expr . T_EOL
+
+    T_EOL  shift, and go to state 182
+
+
+state 170
+
+   52 choice_option: T_DEFAULT T_WORD if_expr . T_EOL
+
+    T_EOL  shift, and go to state 183
+
+
+state 171
+
+   49 choice_option: T_TRISTATE prompt_stmt_opt T_EOL .
+
+    $default  reduce using rule 49 (choice_option)
+
+
+state 172
+
+   50 choice_option: T_BOOLEAN prompt_stmt_opt T_EOL .
+
+    $default  reduce using rule 50 (choice_option)
+
+
+state 173
+
+   82 depends: T_DEPENDS T_ON expr T_EOL .
+
+    $default  reduce using rule 82 (depends)
+
+
+state 174
+
+   95 if_expr: T_IF expr .
+  101 expr: expr . T_OR expr
+  102     | expr . T_AND expr
+
+    T_OR   shift, and go to state 69
+    T_AND  shift, and go to state 70
+
+    $default  reduce using rule 95 (if_expr)
+
+
+state 175
+
+   33 config_option: T_PROMPT prompt if_expr T_EOL .
+
+    $default  reduce using rule 33 (config_option)
+
+
+state 176
+
+   34 config_option: T_DEFAULT expr if_expr T_EOL .
+
+    $default  reduce using rule 34 (config_option)
+
+
+state 177
+
+   27 config_option: T_DEF_TRISTATE expr if_expr T_EOL .
+
+    $default  reduce using rule 27 (config_option)
+
+
+state 178
+
+   29 config_option: T_DEF_BOOLEAN expr if_expr T_EOL .
+
+    $default  reduce using rule 29 (config_option)
+
+
+state 179
+
+   35 config_option: T_SELECT T_WORD if_expr T_EOL .
+
+    $default  reduce using rule 35 (config_option)
+
+
+state 180
+
+   36 config_option: T_SELECT T_NOT T_WORD if_expr . T_EOL
+
+    T_EOL  shift, and go to state 184
+
+
+state 181
+
+   37 config_option: T_RANGE symbol symbol if_expr . T_EOL
+
+    T_EOL  shift, and go to state 185
+
+
+state 182
+
+   48 choice_option: T_PROMPT prompt if_expr T_EOL .
+
+    $default  reduce using rule 48 (choice_option)
+
+
+state 183
+
+   52 choice_option: T_DEFAULT T_WORD if_expr T_EOL .
+
+    $default  reduce using rule 52 (choice_option)
+
+
+state 184
+
+   36 config_option: T_SELECT T_NOT T_WORD if_expr T_EOL .
+
+    $default  reduce using rule 36 (config_option)
+
+
+state 185
+
+   37 config_option: T_RANGE symbol symbol if_expr T_EOL .
+
+    $default  reduce using rule 37 (config_option)

+ 693 - 0
config/zconf.y

@@ -0,0 +1,693 @@
+%{
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <ctype.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+
+#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
+
+#define PRINTD		0x0001
+#define DEBUG_PARSE	0x0002
+
+int cdebug = PRINTD;
+
+extern int zconflex(void);
+static void zconfprint(const char *err, ...);
+static void zconferror(const char *err);
+static bool zconf_endtoken(int token, int starttoken, int endtoken);
+
+struct symbol *symbol_hash[257];
+
+#define YYERROR_VERBOSE
+%}
+%expect 40
+
+%union
+{
+	int token;
+	char *string;
+	struct symbol *symbol;
+	struct expr *expr;
+	struct menu *menu;
+}
+
+%token T_MAINMENU
+%token T_MENU
+%token T_ENDMENU
+%token T_SOURCE
+%token T_CHOICE
+%token T_ENDCHOICE
+%token T_COMMENT
+%token T_CONFIG
+%token T_MENUCONFIG
+%token T_HELP
+%token <string> T_HELPTEXT
+%token T_IF
+%token T_ENDIF
+%token T_DEPENDS
+%token T_REQUIRES
+%token T_OPTIONAL
+%token T_PROMPT
+%token T_DEFAULT
+%token T_TRISTATE
+%token T_DEF_TRISTATE
+%token T_BOOLEAN
+%token T_DEF_BOOLEAN
+%token T_STRING
+%token T_INT
+%token T_HEX
+%token <string> T_WORD
+%token <string> T_WORD_QUOTE
+%token T_UNEQUAL
+%token T_EOF
+%token T_EOL
+%token T_CLOSE_PAREN
+%token T_OPEN_PAREN
+%token T_ON
+%token T_SELECT
+%token T_RANGE
+
+%left T_OR
+%left T_AND
+%left T_EQUAL T_UNEQUAL
+%nonassoc T_NOT
+
+%type <string> prompt
+%type <string> source
+%type <symbol> symbol
+%type <expr> expr
+%type <expr> if_expr
+%type <token> end
+
+%{
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+%}
+%%
+input:	  /* empty */
+	| input block
+;
+
+block:	  common_block
+	| choice_stmt
+	| menu_stmt
+	| T_MAINMENU prompt nl_or_eof
+	| T_ENDMENU		{ zconfprint("unexpected 'endmenu' statement"); }
+	| T_ENDIF		{ zconfprint("unexpected 'endif' statement"); }
+	| T_ENDCHOICE		{ zconfprint("unexpected 'endchoice' statement"); }
+	| error nl_or_eof	{ zconfprint("syntax error"); yyerrok; }
+;
+
+common_block:
+	  if_stmt
+	| comment_stmt
+	| config_stmt
+	| menuconfig_stmt
+	| source_stmt
+	| nl_or_eof
+;
+
+
+/* config/menuconfig entry */
+
+config_entry_start: T_CONFIG T_WORD T_EOL
+{
+	struct symbol *sym = sym_lookup($2, 0);
+	sym->flags |= SYMBOL_OPTIONAL;
+	menu_add_entry(sym);
+	printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), $2);
+};
+
+config_stmt: config_entry_start config_option_list
+{
+	menu_end_entry();
+	printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
+};
+
+menuconfig_entry_start: T_MENUCONFIG T_WORD T_EOL
+{
+	struct symbol *sym = sym_lookup($2, 0);
+	sym->flags |= SYMBOL_OPTIONAL;
+	menu_add_entry(sym);
+	printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), $2);
+};
+
+menuconfig_stmt: menuconfig_entry_start config_option_list
+{
+	if (current_entry->prompt)
+		current_entry->prompt->type = P_MENU;
+	else
+		zconfprint("warning: menuconfig statement without prompt");
+	menu_end_entry();
+	printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
+};
+
+config_option_list:
+	  /* empty */
+	| config_option_list config_option
+	| config_option_list depends
+	| config_option_list help
+	| config_option_list T_EOL
+;
+
+config_option: T_TRISTATE prompt_stmt_opt T_EOL
+{
+	menu_set_type(S_TRISTATE);
+	printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_DEF_TRISTATE expr if_expr T_EOL
+{
+	menu_add_expr(P_DEFAULT, $2, $3);
+	menu_set_type(S_TRISTATE);
+	printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_BOOLEAN prompt_stmt_opt T_EOL
+{
+	menu_set_type(S_BOOLEAN);
+	printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_DEF_BOOLEAN expr if_expr T_EOL
+{
+	menu_add_expr(P_DEFAULT, $2, $3);
+	menu_set_type(S_BOOLEAN);
+	printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_INT prompt_stmt_opt T_EOL
+{
+	menu_set_type(S_INT);
+	printd(DEBUG_PARSE, "%s:%d:int\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_HEX prompt_stmt_opt T_EOL
+{
+	menu_set_type(S_HEX);
+	printd(DEBUG_PARSE, "%s:%d:hex\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_STRING prompt_stmt_opt T_EOL
+{
+	menu_set_type(S_STRING);
+	printd(DEBUG_PARSE, "%s:%d:string\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_PROMPT prompt if_expr T_EOL
+{
+	menu_add_prompt(P_PROMPT, $2, $3);
+	printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_DEFAULT expr if_expr T_EOL
+{
+	menu_add_expr(P_DEFAULT, $2, $3);
+	printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_SELECT T_WORD if_expr T_EOL
+{
+	menu_add_symbol(P_SELECT, sym_lookup($2, 0), $3);
+	printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_SELECT T_NOT T_WORD if_expr T_EOL
+{
+	menu_add_symbol(P_SELECTNOT, sym_lookup($3, 0), $4);
+	printd(DEBUG_PARSE, "%s:%d:selectnot\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_RANGE symbol symbol if_expr T_EOL
+{
+	menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,$2, $3), $4);
+	printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno());
+};
+
+/* choice entry */
+
+choice: T_CHOICE T_EOL
+{
+	struct symbol *sym = sym_lookup(NULL, 0);
+	sym->flags |= SYMBOL_CHOICE;
+	menu_add_entry(sym);
+	menu_add_expr(P_CHOICE, NULL, NULL);
+	printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
+};
+
+choice_entry: choice choice_option_list
+{
+	menu_end_entry();
+	menu_add_menu();
+};
+
+choice_end: end
+{
+	if (zconf_endtoken($1, T_CHOICE, T_ENDCHOICE)) {
+		menu_end_menu();
+		printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno());
+	}
+};
+
+choice_stmt:
+	  choice_entry choice_block choice_end
+	| choice_entry choice_block
+{
+	printf("%s:%d: missing 'endchoice' for this 'choice' statement\n", current_menu->file->name, current_menu->lineno);
+	zconfnerrs++;
+};
+
+choice_option_list:
+	  /* empty */
+	| choice_option_list choice_option
+	| choice_option_list depends
+	| choice_option_list help
+	| choice_option_list T_EOL
+;
+
+choice_option: T_PROMPT prompt if_expr T_EOL
+{
+	menu_add_prompt(P_PROMPT, $2, $3);
+	printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
+};
+
+choice_option: T_TRISTATE prompt_stmt_opt T_EOL
+{
+	menu_set_type(S_TRISTATE);
+	printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno());
+};
+
+choice_option: T_BOOLEAN prompt_stmt_opt T_EOL
+{
+	menu_set_type(S_BOOLEAN);
+	printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno());
+};
+
+choice_option: T_OPTIONAL T_EOL
+{
+	current_entry->sym->flags |= SYMBOL_OPTIONAL;
+	printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno());
+};
+
+choice_option: T_DEFAULT T_WORD if_expr T_EOL
+{
+	menu_add_symbol(P_DEFAULT, sym_lookup($2, 0), $3);
+	printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno());
+};
+
+choice_block:
+	  /* empty */
+	| choice_block common_block
+;
+
+/* if entry */
+
+if: T_IF expr T_EOL
+{
+	printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
+	menu_add_entry(NULL);
+	menu_add_dep($2);
+	menu_end_entry();
+	menu_add_menu();
+};
+
+if_end: end
+{
+	if (zconf_endtoken($1, T_IF, T_ENDIF)) {
+		menu_end_menu();
+		printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
+	}
+};
+
+if_stmt:
+	  if if_block if_end
+	| if if_block
+{
+	printf("%s:%d: missing 'endif' for this 'if' statement\n", current_menu->file->name, current_menu->lineno);
+	zconfnerrs++;
+};
+
+if_block:
+	  /* empty */
+	| if_block common_block
+	| if_block menu_stmt
+	| if_block choice_stmt
+;
+
+/* menu entry */
+
+menu: T_MENU prompt T_EOL
+{
+	menu_add_entry(NULL);
+	menu_add_prop(P_MENU, $2, NULL, NULL);
+	printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno());
+};
+
+menu_entry: menu depends_list
+{
+	menu_end_entry();
+	menu_add_menu();
+};
+
+menu_end: end
+{
+	if (zconf_endtoken($1, T_MENU, T_ENDMENU)) {
+		menu_end_menu();
+		printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno());
+	}
+};
+
+menu_stmt:
+	  menu_entry menu_block menu_end
+	| menu_entry menu_block
+{
+	printf("%s:%d: missing 'endmenu' for this 'menu' statement\n", current_menu->file->name, current_menu->lineno);
+	zconfnerrs++;
+};
+
+menu_block:
+	  /* empty */
+	| menu_block common_block
+	| menu_block menu_stmt
+	| menu_block choice_stmt
+	| menu_block error T_EOL		{ zconfprint("invalid menu option"); yyerrok; }
+;
+
+source: T_SOURCE prompt T_EOL
+{
+	$$ = $2;
+	printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), $2);
+};
+
+source_stmt: source
+{
+	zconf_nextfile($1);
+};
+
+/* comment entry */
+
+comment: T_COMMENT prompt T_EOL
+{
+	menu_add_entry(NULL);
+	menu_add_prop(P_COMMENT, $2, NULL, NULL);
+	printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno());
+};
+
+comment_stmt: comment depends_list
+{
+	menu_end_entry();
+};
+
+/* help option */
+
+help_start: T_HELP T_EOL
+{
+	printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno());
+	zconf_starthelp();
+};
+
+help: help_start T_HELPTEXT
+{
+	current_entry->sym->help = $2;
+};
+
+/* depends option */
+
+depends_list:	  /* empty */
+		| depends_list depends
+		| depends_list T_EOL
+;
+
+depends: T_DEPENDS T_ON expr T_EOL
+{
+	menu_add_dep($3);
+	printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
+}
+	| T_DEPENDS expr T_EOL
+{
+	menu_add_dep($2);
+	printd(DEBUG_PARSE, "%s:%d:depends\n", zconf_curname(), zconf_lineno());
+}
+	| T_REQUIRES expr T_EOL
+{
+	menu_add_dep($2);
+	printd(DEBUG_PARSE, "%s:%d:requires\n", zconf_curname(), zconf_lineno());
+};
+
+/* prompt statement */
+
+prompt_stmt_opt:
+	  /* empty */
+	| prompt if_expr
+{
+	menu_add_prop(P_PROMPT, $1, NULL, $2);
+};
+
+prompt:	  T_WORD
+	| T_WORD_QUOTE
+;
+
+end:	  T_ENDMENU nl_or_eof	{ $$ = T_ENDMENU; }
+	| T_ENDCHOICE nl_or_eof	{ $$ = T_ENDCHOICE; }
+	| T_ENDIF nl_or_eof	{ $$ = T_ENDIF; }
+;
+
+nl_or_eof:
+	T_EOL | T_EOF;
+
+if_expr:  /* empty */			{ $$ = NULL; }
+	| T_IF expr			{ $$ = $2; }
+;
+
+expr:	  symbol				{ $$ = expr_alloc_symbol($1); }
+	| symbol T_EQUAL symbol			{ $$ = expr_alloc_comp(E_EQUAL, $1, $3); }
+	| symbol T_UNEQUAL symbol		{ $$ = expr_alloc_comp(E_UNEQUAL, $1, $3); }
+	| T_OPEN_PAREN expr T_CLOSE_PAREN	{ $$ = $2; }
+	| T_NOT expr				{ $$ = expr_alloc_one(E_NOT, $2); }
+	| expr T_OR expr			{ $$ = expr_alloc_two(E_OR, $1, $3); }
+	| expr T_AND expr			{ $$ = expr_alloc_two(E_AND, $1, $3); }
+;
+
+symbol:	  T_WORD	{ $$ = sym_lookup($1, 0); free($1); }
+	| T_WORD_QUOTE	{ $$ = sym_lookup($1, 1); free($1); }
+;
+
+%%
+
+void conf_parse(const char *name)
+{
+	struct symbol *sym;
+	int i;
+
+	zconf_initscan(name);
+
+	sym_init();
+	menu_init();
+	modules_sym = sym_lookup("MODULES", 0);
+	rootmenu.prompt = menu_add_prop(P_MENU, "OpenADK Configuration", NULL, NULL);
+
+	//zconfdebug = 1;
+	zconfparse();
+	if (zconfnerrs)
+		exit(1);
+	menu_finalize(&rootmenu);
+	for_all_symbols(i, sym) {
+                if (!(sym->flags & SYMBOL_CHECKED) && sym_check_deps(sym))
+                        printf("\n");
+		else
+			sym->flags |= SYMBOL_CHECK_DONE;
+        }
+
+	sym_change_count = 1;
+}
+
+const char *zconf_tokenname(int token)
+{
+	switch (token) {
+	case T_MENU:		return "menu";
+	case T_ENDMENU:		return "endmenu";
+	case T_CHOICE:		return "choice";
+	case T_ENDCHOICE:	return "endchoice";
+	case T_IF:		return "if";
+	case T_ENDIF:		return "endif";
+	}
+	return "<token>";
+}
+
+static bool zconf_endtoken(int token, int starttoken, int endtoken)
+{
+	if (token != endtoken) {
+		zconfprint("unexpected '%s' within %s block", zconf_tokenname(token), zconf_tokenname(starttoken));
+		zconfnerrs++;
+		return false;
+	}
+	if (current_menu->file != current_file) {
+		zconfprint("'%s' in different file than '%s'", zconf_tokenname(token), zconf_tokenname(starttoken));
+		zconfprint("location of the '%s'", zconf_tokenname(starttoken));
+		zconfnerrs++;
+		return false;
+	}
+	return true;
+}
+
+static void zconfprint(const char *err, ...)
+{
+	va_list ap;
+
+	fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno() + 1);
+	va_start(ap, err);
+	vfprintf(stderr, err, ap);
+	va_end(ap);
+	fprintf(stderr, "\n");
+}
+
+static void zconferror(const char *err)
+{
+	fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err);
+}
+
+void print_quoted_string(FILE *out, const char *str)
+{
+	const char *p;
+	int len;
+
+	putc('"', out);
+	while ((p = strchr(str, '"'))) {
+		len = p - str;
+		if (len)
+			fprintf(out, "%.*s", len, str);
+		fputs("\\\"", out);
+		str = p + 1;
+	}
+	fputs(str, out);
+	putc('"', out);
+}
+
+void print_symbol(FILE *out, struct menu *menu)
+{
+	struct symbol *sym = menu->sym;
+	struct property *prop;
+
+	if (sym_is_choice(sym))
+		fprintf(out, "choice\n");
+	else
+		fprintf(out, "config %s\n", sym->name);
+	switch (sym->type) {
+	case S_BOOLEAN:
+		fputs("  boolean\n", out);
+		break;
+	case S_TRISTATE:
+		fputs("  tristate\n", out);
+		break;
+	case S_STRING:
+		fputs("  string\n", out);
+		break;
+	case S_INT:
+		fputs("  integer\n", out);
+		break;
+	case S_HEX:
+		fputs("  hex\n", out);
+		break;
+	default:
+		fputs("  ???\n", out);
+		break;
+	}
+	for (prop = sym->prop; prop; prop = prop->next) {
+		if (prop->menu != menu)
+			continue;
+		switch (prop->type) {
+		case P_PROMPT:
+			fputs("  prompt ", out);
+			print_quoted_string(out, prop->text);
+			if (!expr_is_yes(prop->visible.expr)) {
+				fputs(" if ", out);
+				expr_fprint(prop->visible.expr, out);
+			}
+			fputc('\n', out);
+			break;
+		case P_DEFAULT:
+			fputs( "  default ", out);
+			expr_fprint(prop->expr, out);
+			if (!expr_is_yes(prop->visible.expr)) {
+				fputs(" if ", out);
+				expr_fprint(prop->visible.expr, out);
+			}
+			fputc('\n', out);
+			break;
+		case P_CHOICE:
+			fputs("  #choice value\n", out);
+			break;
+		default:
+			fprintf(out, "  unknown prop %d!\n", prop->type);
+			break;
+		}
+	}
+	if (sym->help) {
+		int len = strlen(sym->help);
+		while (sym->help[--len] == '\n')
+			sym->help[len] = 0;
+		fprintf(out, "  help\n%s\n", sym->help);
+	}
+	fputc('\n', out);
+}
+
+void zconfdump(FILE *out)
+{
+	struct property *prop;
+	struct symbol *sym;
+	struct menu *menu;
+
+	menu = rootmenu.list;
+	while (menu) {
+		if ((sym = menu->sym))
+			print_symbol(out, menu);
+		else if ((prop = menu->prompt)) {
+			switch (prop->type) {
+			case P_COMMENT:
+				fputs("\ncomment ", out);
+				print_quoted_string(out, prop->text);
+				fputs("\n", out);
+				break;
+			case P_MENU:
+				fputs("\nmenu ", out);
+				print_quoted_string(out, prop->text);
+				fputs("\n", out);
+				break;
+			default:
+				;
+			}
+			if (!expr_is_yes(prop->visible.expr)) {
+				fputs("  depends ", out);
+				expr_fprint(prop->visible.expr, out);
+				fputc('\n', out);
+			}
+			fputs("\n", out);
+		}
+
+		if (menu->list)
+			menu = menu->list;
+		else if (menu->next)
+			menu = menu->next;
+		else while ((menu = menu->parent)) {
+			if (menu->prompt && menu->prompt->type == P_MENU)
+				fputs("\nendmenu\n", out);
+			if (menu->next) {
+				menu = menu->next;
+				break;
+			}
+		}
+	}
+}
+
+#include "lex.zconf.c"
+#include "confdata.c"
+#include "expr.c"
+#include "symbol.c"
+#include "menu.c"

+ 182 - 0
mk/build.mk

@@ -0,0 +1,182 @@
+# $Id$
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+TOPDIR=$(shell pwd)
+export TOPDIR
+
+ifneq ($(shell umask 2>/dev/null | sed 's/0*022/OK/'),OK)
+$(error your umask is not 022)
+endif
+
+CONFIG_CONFIG_IN = Config.in
+CONFIG = config
+
+noconfig_targets:=	menuconfig \
+			_config \
+			_mconfig \
+			tags
+
+MAKECLEAN_SYMBOLS=	ADK_TARGET_LIB_UCLIBC ADK_TARGET_LIB_GLIBC ADK_SSP ADK_IPV6 ADK_CXX
+POSTCONFIG=		-@\
+	if [ -f .config.old ];then \
+	if [ -d .cfg ];then \
+	what=cleandevice; \
+	for symbol in ${MAKECLEAN_SYMBOLS}; do \
+		newval=$$(grep -e "^$$symbol=" -e "^\# $$symbol " .config); \
+		oldval=$$(cat .cfg/"$$symbol" 2>&-); \
+		[[ $$newval = $$oldval ]] && continue; \
+		echo; \
+		echo >&2 "WARNING: Toolchain related options have changed, 'make" \
+		    "$$what' might be required!"; \
+		break; \
+	done; \
+	fi; \
+	if [ "$$(grep ^BUSYBOX .config|md5sum)" != "$$(grep ^BUSYBOX .config.old|md5sum)" ];then \
+		if [ -f build_$(CPU_ARCH)/w-busybox*/busybox*/.configure_done ];then \
+			rm build_$(CPU_ARCH)/w-busybox*/busybox*/.configure_done; \
+		fi; \
+	fi; \
+	fi
+
+# Pull in the user's configuration file
+ifeq ($(filter $(noconfig_targets),$(MAKECMDGOALS)),)
+-include $(TOPDIR)/.config
+endif
+
+ifeq ($(strip $(ADK_HAVE_DOT_CONFIG)),y)
+include $(TOPDIR)/rules.mk
+include ${TOPDIR}/mk/split-cfg.mk
+
+all: world
+
+.NOTPARALLEL:
+.PHONY: all world clean cleandevice cleandir distclean image_clean
+
+world: $(DISTDIR) $(BUILD_DIR) $(TARGET_DIR) $(PACKAGE_DIR) ${TOPDIR}/.cfg/ADK_HAVE_DOT_CONFIG
+	${BASH} ${TOPDIR}/scripts/scan-pkgs.sh
+	$(MAKE) -f mk/build.mk toolchain/install target/config-prepare target/compile package/compile root_clean package/install package_index target/install
+
+package_index:
+	-cd ${PACKAGE_DIR} && \
+	    ${BASH} ${TOPDIR}/scripts/ipkg-make-index.sh . >Packages
+
+$(DISTDIR):
+	mkdir -p $(DISTDIR)
+
+$(BUILD_DIR):
+	mkdir -p $(BUILD_DIR)
+
+$(TARGET_DIR):
+	mkdir -p $(TARGET_DIR)
+
+$(PACKAGE_DIR):
+	mkdir -p ${PACKAGE_DIR}/.stamps
+
+${STAGING_DIR} ${STAGING_DIR}/etc ${STAGING_TOOLS}:
+	mkdir -p ${STAGING_DIR}/{bin,etc,include,lib,usr} \
+		${STAGING_TOOLS}/{bin,lib}
+	cd ${STAGING_DIR}/usr; ln -s ../include include
+
+${STAGING_DIR}/etc/ipkg.conf: ${STAGING_DIR}/etc
+	echo "dest root /" >${STAGING_DIR}/etc/ipkg.conf
+	echo "option offline_root ${TARGET_DIR}" >>$(STAGING_DIR)/etc/ipkg.conf
+
+package/%: ${TOPDIR}/.cfg/ADK_HAVE_DOT_CONFIG ${STAGING_DIR}/etc/ipkg.conf
+	$(MAKE) -C package $(patsubst package/%,%,$@)
+
+target/%: ${TOPDIR}/.cfg/ADK_HAVE_DOT_CONFIG
+	$(MAKE) -C target $(patsubst target/%,%,$@)
+
+toolchain/%: ${STAGING_DIR}
+	$(MAKE) -C toolchain $(patsubst toolchain/%,%,$@)
+
+image:
+	$(MAKE) -C target image
+
+switch:
+	echo "Saving configuration for device: ${DEVICE}"
+	cp .config .config.${DEVICE}
+	if [ -f .config.${DEV} ];then cp .config.${DEV} .config; \
+	cp .config.${DEV} .config.old; \
+	echo "Setting configuration to device: ${DEV}"; \
+	else echo "No old device config found";mv .config .config.bak;fi
+
+#############################################################
+#
+# Cleanup and misc junk
+#
+#############################################################
+root_clean:
+	@$(TRACE) root_clean
+	rm -rf $(TARGET_DIR)
+
+clean:
+	@$(TRACE) clean
+	$(MAKE) -C $(CONFIG) clean
+	rm -rf $(BUILD_DIR) $(BIN_DIR) $(TARGET_DIR) ${TOPDIR}/.cfg
+	rm -f ${TOPDIR}/package/*/info.mk
+
+cleankernel:
+	@$(TRACE) cleankernel
+	rm -rf $(TOOLCHAIN_BUILD_DIR)/linux* $(BUILD_DIR)/linux
+
+cleandir:
+	@$(TRACE) cleandir
+	$(MAKE) -C $(CONFIG) clean
+	rm -rf $(BUILD_DIR_PFX) $(BIN_DIR_PFX) $(TARGET_DIR_PFX) ${TOPDIR}/.cfg
+	rm -rf $(TOOLCHAIN_BUILD_DIR_PFX) $(STAGING_PARENT_PFX) $(TOOLS_BUILD_DIR)
+	rm -f .tmpconfig.h ${TOPDIR}/package/*/info.mk
+
+cleandevice:
+	@$(TRACE) cleandevice
+	$(MAKE) -C $(CONFIG) clean
+	rm -rf $(BUILD_DIR) $(BIN_DIR) $(TARGET_DIR) ${TOPDIR}/.cfg
+	rm -rf $(TOOLCHAIN_BUILD_DIR) $(STAGING_PARENT)
+	rm -f .tmpconfig.h ${TOPDIR}/package/*/info.mk
+
+distclean:
+	@$(TRACE) distclean
+	$(MAKE) -C $(CONFIG) clean
+	rm -rf $(BUILD_DIR_PFX) $(BIN_DIR_PFX) $(TARGET_DIR_PFX) $(DISTDIR) ${TOPDIR}/.cfg
+	rm -rf $(TOOLCHAIN_BUILD_DIR_PFX) $(STAGING_PARENT_PFX) $(TOOLS_BUILD_DIR)
+	rm -f .config* .tmpconfig.h ${TOPDIR}/package/*/info.mk
+
+else # ifeq ($(strip $(ADK_HAVE_DOT_CONFIG)),y)
+
+include $(TOPDIR)/prereq.mk
+
+all: menuconfig
+	@echo "Start the build with \"make\" or with \"make v\" to be verbose"
+
+# configuration
+# ---------------------------------------------------------------------------
+
+$(CONFIG)/conf:
+	@$(MAKE) -C $(CONFIG) conf
+
+$(CONFIG)/mconf:
+	@$(MAKE) -C $(CONFIG)
+
+menuconfig: $(CONFIG)/mconf
+	@$(CONFIG)/mconf $(CONFIG_CONFIG_IN)
+	${POSTCONFIG}
+
+_config: $(CONFIG)/conf
+	-@touch .config
+	@$(CONFIG)/conf ${W} $(CONFIG_CONFIG_IN) >/dev/null
+	${POSTCONFIG}
+
+.NOTPARALLEL: _mconfig
+_mconfig: ${CONFIG}/conf _mconfig2 _config
+_mconfig2: ${CONFIG}/conf
+	@${CONFIG}/conf -M ${RCONFIG} >/dev/null
+
+distclean:
+	@$(MAKE) -C $(CONFIG) clean
+	rm -rf $(BUILD_DIR) $(TOOLS_BUILD_DIR) $(BIN_DIR) $(DISTDIR) ${TOPDIR}/.cfg
+	rm -rf $(TOOLCHAIN_BUILD_DIR) $(STAGING_PARENT) $(TARGET_DIR)
+	rm -f .config* .tmpconfig.h ${TOPDIR}/package/*/info.mk
+
+endif # ifeq ($(strip $(ADK_HAVE_DOT_CONFIG)),y)

+ 98 - 0
mk/buildhlp.mk

@@ -0,0 +1,98 @@
+# $Id$
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+ifneq ($(strip ${MASTER_SITES}),)
+ifeq ($(strip ${DISTFILES}),)
+DISTFILES:=		${PKG_NAME}-${PKG_VERSION}.tar.gz
+endif
+endif
+
+# This is where all package operation is done in
+WRKDIR?=		${WRKDIR_BASE}/w-${PKG_NAME}-${PKG_VERSION}-${PKG_RELEASE}
+# This is where source code is extracted and patched
+WRKDIST?=		${WRKDIR}/${PKG_NAME}-${PKG_VERSION}
+# This is where the configure script is seeked (localed)
+WRKSRC?=		${WRKDIST}
+# This is where configure, make and make install (fake) run from
+WRKBUILD?=		${WRKSRC}
+# This is where make install (fake) writes to
+WRKINST?=		${WRKDIR}/fake-${ARCH}/root
+
+ifeq ($(strip ${NO_CHECKSUM}),)
+_CHECKSUM_COOKIE=	${WRKDIR}/.checksum_done
+else
+_CHECKSUM_COOKIE=
+endif
+
+post-extract:
+
+ifeq ($(strip ${NO_DISTFILES}),1)
+${WRKDIST}/.extract_done:
+	rm -rf ${WRKDIST} ${WRKSRC} ${WRKBUILD}
+	mkdir -p ${WRKDIR} ${WRKDIST}
+	${MAKE} do-extract
+	@${MAKE} post-extract
+	touch $@
+
+fetch refetch checksum do-extract:
+
+__use_generic_patch_target:=42
+else ifneq ($(strip ${DISTFILES}),)
+include ${TOPDIR}/mk/fetch.mk
+
+${WRKDIST}/.extract_done: ${_CHECKSUM_COOKIE}
+ifeq (${_CHECKSUM_COOKIE},)
+	rm -rf ${WRKDIST} ${WRKSRC} ${WRKBUILD}
+endif
+	${EXTRACT_CMD}
+	@${MAKE} post-extract
+	touch $@
+
+__use_generic_patch_target:=42
+else ifeq ($(strip ${_IN_PACKAGE}),1)
+$(warning This package does not use the generic extraction and patch target; it's most likely to fail.)
+endif
+
+ifeq ($(strip ${__use_generic_patch_target}),42)
+post-patch:
+${WRKDIST}/.prepared: ${WRKDIST}/.extract_done
+	[ ! -d ./patches ] || ${PREVENT_PATCH} ${PATCH} ${WRKDIST} ./patches \
+	    '{patch-!(*.orig),*.patch}' $(MAKE_TRACE)
+	[ ! -d ./extra ] || (cd extra; $(PREVENT_PATCH) cp -Rp . ${WRKDIST}/) \
+		$(MAKE_TRACE)
+	@${MAKE} post-patch $(MAKE_TRACE)
+	touch $@
+endif
+
+update-patches:
+	@test ! -d ${WRKDIR}.orig || rm -rf ${WRKDIR}.orig
+	@test ! -d ${WRKDIR}.orig
+ifeq ($(strip ${_IN_PACKAGE})$(strip ${_IN_CVTC}),1)
+	@$(MAKE) -s V=0 patch WRKDIR=${WRKDIR}.orig PREVENT_PATCH=: NO_CHECKSUM=1
+else
+	@$(MAKE) -s V=0 prepare WRKDIR=${WRKDIR}.orig PREVENT_PATCH=: NO_CHECKSUM=1
+endif
+	@# restore config.sub/config.guess
+	@for i in $$(find ${WRKDIR} -name config.sub);do \
+		if [ -f $$i.bak ];then \
+			mv $$i.bak $$i; \
+		fi;\
+	done
+	@for i in $$(find ${WRKDIR} -name config.guess);do \
+		if [ -f $$i.bak ];then \
+			mv $$i.bak $$i; \
+		fi;\
+	done
+	@toedit=$$(WRKDIST='${WRKDIST}' CURDIR=$$(pwd) \
+	    PATCH_LIST='patch-* *.patch' WRKDIR1='${WRKDIR}' \
+	    ${BASH} ${TOPDIR}/scripts/update-patches); \
+	    if [[ -n $$toedit && $$toedit != FAIL ]]; then \
+		echo -n 'edit patches: '; read i; \
+		cd patches && $${VISUAL:-$${EDITOR:-/usr/bin/vi}} $$toedit; \
+	    fi; \
+	    rm -rf ${WRKDIR}.orig; \
+	    [[ $$toedit != FAIL ]]
+
+.PHONY: update-patches

+ 23 - 0
mk/cpu.mk

@@ -0,0 +1,23 @@
+# $Id$
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+# 
+# optimization configure options for CPU features
+
+ifeq ($(DEVICE),alix1c)
+CONFIGURE_CPU_OPTS:=	--disable-ssse3 \
+			--disable-sse \
+			--enable-amd3dnow \
+			--enable-amd3dnowext \
+			--enable-mmx \
+			--enable-mmx2
+else
+CONFIGURE_CPU_OPTS:=	--disable-ssse3 \
+			--disable-sse \
+			--disable-mmxext \
+			--disable-amd3dnow \
+			--disable-amd3dnowext \
+			--disable-mmx \
+			--disable-mmx2
+endif

+ 83 - 0
mk/fetch.mk

@@ -0,0 +1,83 @@
+# $Id$
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+#-
+
+ifneq ($(strip ${DIST_SUBDIR}),)
+FULLDISTDIR?=		${DISTDIR}/${DIST_SUBDIR}
+else
+FULLDISTDIR?=		${DISTDIR}
+endif
+
+FULLDISTFILES=		$(patsubst %,${FULLDISTDIR}/%,${DISTFILES})
+
+FETCH_STYLE?=		auto
+#pre-fetch:
+do-fetch:
+#post-fetch:
+fetch:
+#	@${MAKE} pre-fetch
+ifneq ($(filter auto,${FETCH_STYLE}),)
+	${MAKE} ${FULLDISTFILES}
+else
+	${MAKE} do-fetch
+endif
+#	@${MAKE} post-fetch
+
+refetch:
+	-rm -f ${FULLDISTFILES}
+	${MAKE} fetch
+
+# XXX for now
+_CHECKSUM_COOKIE?=	${WRKDIR}/.checksum_done
+checksum: ${_CHECKSUM_COOKIE}
+ifeq ($(strip ${NO_CHECKSUM}),)
+${_CHECKSUM_COOKIE}: ${FULLDISTFILES}
+	rm -rf ${WRKDIR}
+	@OK=n; \
+	(md5sum ${FULLDISTFILES}; echo exit) | while read sum name; do \
+		if [[ $$sum = exit ]]; then \
+			[[ $$OK = n ]] && echo >&2 "==> No distfile found!" || :; \
+			[[ $$OK = 1 ]] || exit 1; \
+			break; \
+		fi; \
+		if [[ $$sum = "$(strip ${PKG_MD5SUM})" ]]; then \
+			[[ $$OK = 0 ]] || OK=1; \
+			continue; \
+		fi; \
+		echo >&2 "==> Checksum mismatch for $${name##*/} (MD5)"; \
+		echo >&2 ":---> should be '$(strip ${PKG_MD5SUM})'"; \
+		echo >&2 ":---> really is '$$sum'"; \
+		OK=0; \
+	done
+	mkdir -p ${WRKDIR}
+	touch ${_CHECKSUM_COOKIE}
+endif
+
+# GNU make's poor excuse for loops
+define FETCH_template
+$(1):
+	@fullname='$(1)'; \
+	subname=$$$${fullname##$${DISTDIR}/}; \
+	filename=$$$${fullname##*/}; \
+	i='$${LOCAL_DISTDIR}'; \
+	if [[ -n $$$$i && -e $$$$i/$$$$subname ]]; then \
+		cd "$$$$i"; \
+		echo pax -rw "$$$$subname" '$${DISTDIR}/'; \
+		exec pax -rw "$$$$subname" '$${DISTDIR}/'; \
+	fi; \
+	mkdir -p "$$$${fullname%%/$$$$filename}"; \
+	cd "$$$${fullname%%/$$$$filename}"; \
+	for site in $${MASTER_SITES} $${MASTER_SITE_BACKUP}; do \
+		: echo "$${FETCH_CMD} $$$$site$$$$filename"; \
+		rm -f "$$$$filename"; \
+		if $${FETCH_CMD} $$$$site$$$$filename; then \
+			: check the size here; \
+			[[ ! -e $$$$filename ]] || exit 0; \
+		fi; \
+	done; \
+	exit 1
+endef
+
+$(foreach distfile,${FULLDISTFILES},$(eval $(call FETCH_template,$(distfile))))

+ 69 - 0
mk/image.mk

@@ -0,0 +1,69 @@
+# $Id$
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+imageprepare: kernel-install image-prepare-post
+
+image-prepare-post:
+	rng=/dev/arandom; test -e $$rng || rng=/dev/urandom; \
+	    dd if=$$rng bs=512 count=1 >>${TARGET_DIR}/etc/.rnd 2>/dev/null; \
+	    chmod 600 ${TARGET_DIR}/etc/.rnd
+	# Sanity checks
+	@cd ${TARGET_DIR}; ls=; ln=; li=; x=1; md5sum $$(find . -type f) | \
+	    sed -e "s/*//" | \
+	    while read sum name; do \
+		inode=$$(ls -i "$$name"); \
+		echo "$$sum $${inode%% *} $$name"; \
+	    done | sort | while read sum inode name; do \
+		if [[ $$sum = $$ls ]]; then \
+			[[ $$li = $$inode ]] && continue; \
+			case $$x in \
+			1)	echo 'WARNING: duplicate files found' \
+				    'in filesystem! Please fix them.' >&2; \
+				echo -n "> $$ln "; \
+				;; \
+			2)	echo -n "> $$ln "; \
+				;; \
+			3)	echo -n ' '; \
+				;; \
+			esac; \
+			echo -n "$$name"; \
+			x=3; \
+		else \
+			case $$x in \
+			3)	echo; \
+				x=2; \
+				;; \
+			esac; \
+		fi; \
+		ls=$$sum; \
+		ln=$$name; \
+		li=$$inode; \
+	done
+	chmod 4511 ${TARGET_DIR}/bin/busybox
+	chmod 1777 ${TARGET_DIR}/tmp
+
+INITRAMFS=	${DEVICE}-${ARCH}-${FS}
+ROOTFSSQUASHFS=	${DEVICE}-${ARCH}-${FS}.fimage
+ROOTFSTARBALL=	${DEVICE}-${ARCH}-${FS}.tar.gz
+
+${BIN_DIR}/${ROOTFSTARBALL}: ${TARGET_DIR}
+	cd ${TARGET_DIR}; tar -cf - --owner=0 --group=0 . | gzip -n9 >$@
+
+${BIN_DIR}/${INITRAMFS}: ${TARGET_DIR}
+	cd ${TARGET_DIR}; find . | sed -n '/^\.\//s///p' | sort | \
+	    cpio -R 0:0 --quiet -oC512 -Mdist -Hnewc | gzip -n9 >$@
+
+${BIN_DIR}/${ROOTFSSQUASHFS}: ${TARGET_DIR}
+	PATH='${TARGET_PATH}' \
+	mksquashfs ${TARGET_DIR} ${BUILD_DIR}/root.squashfs \
+		-nopad -noappend -root-owned -le $(MAKE_TRACE)
+	# padding of images is required
+	cat ${BIN_DIR}/${DEVICE}-${ARCH}-kernel ${BUILD_DIR}/root.squashfs > \
+		${BUILD_DIR}/${ROOTFSSQUASHFS}
+	dd if=${BUILD_DIR}/${ROOTFSSQUASHFS} of=${BIN_DIR}/${ROOTFSSQUASHFS} \
+		bs=4063232 conv=sync $(MAKE_TRACE)
+
+imageclean:
+	rm -f $(BIN_DIR)/$(DEVICE)-*

+ 61 - 0
mk/kernel-build.mk

@@ -0,0 +1,61 @@
+# $Id$
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+include $(TOPDIR)/rules.mk
+include $(TOPDIR)/mk/linux.mk
+include ${TOPDIR}/mk/buildhlp.mk
+
+KERNEL_IDIR:=$(LINUX_BUILD_DIR)/kernel-ipkg
+
+$(TOOLCHAIN_BUILD_DIR)/linux-$(KERNEL_VERSION)/.patched:
+	$(TRACE) target/$(DEVICE)-kernel-patch
+	$(PATCH) $(TOOLCHAIN_BUILD_DIR)/linux-$(KERNEL_VERSION) ../linux/patches *.patch $(MAKE_TRACE)
+	$(PATCH) $(TOOLCHAIN_BUILD_DIR)/linux-$(KERNEL_VERSION) ../linux/patches/$(KERNEL_VERSION) *.patch $(MAKE_TRACE)
+	$(PATCH) $(TOOLCHAIN_BUILD_DIR)/linux-$(KERNEL_VERSION) ../$(DEVICE)/patches *.patch $(MAKE_TRACE)
+	touch $@
+
+$(LINUX_DIR)/.prepared: $(TOOLCHAIN_BUILD_DIR)/linux-$(KERNEL_VERSION)/.patched
+	$(TRACE) target/$(DEVICE)-kernel-prepare
+	ln -sf $(TOOLCHAIN_BUILD_DIR)/linux-$(KERNEL_VERSION) $(LINUX_DIR)
+	mkdir -p $(LINUX_BUILD_DIR)/kmod-control
+	touch $@
+
+$(LINUX_DIR)/.config: $(LINUX_DIR)/.prepared $(BUILD_DIR)/.kernelconfig
+	$(TRACE) target/$(DEVICE)-kernel-configure
+	for f in $(TARGETS);do if [ -f $$f ];then rm $$f;fi;done $(MAKE_TRACE)
+	$(CP) $(BUILD_DIR)/.kernelconfig $(LINUX_DIR)/.config
+	echo N | $(MAKE) -C $(LINUX_DIR) CROSS_COMPILE="$(KERNEL_CROSS)" ARCH=$(ARCH) CC="$(TARGET_CC)" oldconfig $(MAKE_TRACE)
+	$(MAKE) -C $(LINUX_DIR) V=1 CROSS_COMPILE="$(KERNEL_CROSS)" ARCH=$(ARCH) CC="$(TARGET_CC)" prepare scripts $(MAKE_TRACE)
+	touch -c $(LINUX_DIR)/.config
+
+$(LINUX_DIR)/vmlinux: $(LINUX_DIR)/.config
+	$(TRACE) target/$(DEVICE)-kernel-compile
+	$(MAKE) -C $(LINUX_DIR) V=1 CROSS_COMPILE="$(KERNEL_CROSS)" ARCH=$(ARCH) CC="$(TARGET_CC)" $(MAKE_TRACE)
+	$(TRACE) target/$(DEVICE)-kernel-modules-install
+	rm -rf $(LINUX_BUILD_DIR)/modules
+	$(MAKE) -C "$(LINUX_DIR)" V=1 CROSS_COMPILE="$(KERNEL_CROSS)" ARCH=$(ARCH) DEPMOD=true INSTALL_MOD_PATH=$(LINUX_BUILD_DIR)/modules modules_install $(MAKE_TRACE)
+	$(TRACE) target/$(DEVICE)-create-packages
+	$(MAKE) $(KERNEL_IPKG) $(TARGETS) 
+	touch -c $(LINUX_DIR)/vmlinux
+
+$(KERNEL_IPKG):
+	$(TRACE) target/$(DEVICE)-create-kernel-package
+	rm -rf $(KERNEL_IDIR)
+	@mkdir -p $(KERNEL_IDIR)/etc
+	${BASH} ${SCRIPT_DIR}/make-ipkg-dir.sh ${KERNEL_IDIR} \
+	    ../linux/kernel.control ${DEVICE}-${KERNEL_VERSION} ${ARCH}
+	$(IPKG_BUILD) $(KERNEL_IDIR) $(PACKAGE_DIR) $(MAKE_TRACE)
+
+prepare:
+compile: $(LINUX_DIR)/vmlinux
+install: compile
+ifneq ($(strip $(INSTALL_TARGETS)),)
+	$(TRACE) target/${DEVICE}-modules-install
+	$(IPKG) install $(INSTALL_TARGETS) $(MAKE_TRACE)
+endif
+
+clean:
+	rm -rf $(LINUX_BUILD_DIR)
+	rm -f $(TARGETS)

+ 77 - 0
mk/kernel.mk

@@ -0,0 +1,77 @@
+# $Id$
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+
+LINUX_KMOD_SUFFIX=ko
+MODULES_SUBDIR := lib/modules/$(KERNEL_VERSION)
+LINUX_BUILD_DIR := $(BUILD_DIR)/linux-$(ARCH)-$(DEVICE)
+KMOD_BUILD_DIR := $(LINUX_BUILD_DIR)/linux-modules
+MODULES_DIR := $(LINUX_BUILD_DIR)/modules/$(MODULES_SUBDIR)
+TARGET_MODULES_DIR := $(LINUX_TARGET_DIR)/$(MODULES_SUBDIR)
+
+KERNEL_IPKG:=$(PACKAGE_DIR)/kernel_$(DEVICE)-$(KERNEL_VERSION)_$(ARCH).ipk
+INSTALL_TARGETS:= $(KERNEL_IPKG)
+NOINSTALL_TARGETS:=
+TARGETS:=
+
+# KMOD_template
+#
+# Adds a target for creating a package containing
+# the specified (kernel-provided) modules.
+# Parameters:
+# 1: the config symbol name (without leading 'ADK_[K,]PACKAGE_KMOD_')
+#    this _must_ be equal to the kernel config symbol name
+# 2: the name for the package, should be unique
+# 3: actual modules to add; absolute path inside $(MODULES_DIR)
+#    OMIT THE KERNEL-SPECIFIC EXTENSION!
+# 4: order of module loading at system startup; the modules in $(3) are (in their order)
+#    added to this file, if $(6) is non-empty
+# 5: the kmod packages this package depends on
+#
+define KMOD_template
+
+IDEPENDK_$(1):=kernel ($(DEVICE)-$(KERNEL_VERSION)) $(foreach pkg,$(5),", $(pkg)")
+
+PKG_$(1) := $(PACKAGE_DIR)/kmod-$(2)_$(DEVICE)-$(KERNEL_VERSION)-$(KERNEL_RELEASE)_$(ARCH).ipk
+I_$(1) := $(KMOD_BUILD_DIR)/ipkg/$(2)
+
+ifeq ($$(ADK_KPACKAGE_KMOD_$(1)),m)
+TARGETS+=$$(PKG_$(1))
+endif
+ifeq ($$(ADK_KPACKAGE_KMOD_$(1)),y)
+TARGETS+=$$(PKG_$(1))
+INSTALL_TARGETS+=$$(PKG_$(1))
+endif
+
+$$(PKG_$(1)):
+	rm -rf $$(I_$(1))
+	echo "Package: kmod-$(2)" > $(LINUX_BUILD_DIR)/kmod-control/kmod-$(2).control
+	echo "Priority: optional" >> $(LINUX_BUILD_DIR)/kmod-control/kmod-$(2).control
+	echo "Section: sys" >> $(LINUX_BUILD_DIR)/kmod-control/kmod-$(2).control
+	echo "Description: kernel module $(2)" >> $(LINUX_BUILD_DIR)/kmod-control/kmod-$(2).control
+	${BASH} ${SCRIPT_DIR}/make-ipkg-dir.sh $$(I_$(1)) \
+	    $(LINUX_BUILD_DIR)/kmod-control/kmod-$(2).control \
+	    $(DEVICE)-$(KERNEL_VERSION)-$(KERNEL_RELEASE) $(ARCH)
+	echo "Depends: $$(IDEPENDK_$(1))" >> $$(I_$(1))/CONTROL/control
+ifneq ($(strip $(3)),)
+	mkdir -p $$(I_$(1))/lib/modules/$(KERNEL_VERSION)
+	$(CP) $(foreach mod,$(3),$(mod).$(LINUX_KMOD_SUFFIX)) $$(I_$(1))/lib/modules/$(KERNEL_VERSION)
+ifneq ($(4),)
+	mkdir -p $$(I_$(1))/etc/modules.d
+	for module in $(notdir $(3)); do \
+		echo $$$$module >> $$(I_$(1))/etc/modules.d/$(4)-$(2); \
+	done
+	echo "#!/bin/sh" >> $$(I_$(1))/CONTROL/postinst
+	echo "if [ -z \"\$$$${IPKG_INSTROOT}\" ]; then" >> $$(I_$(1))/CONTROL/postinst
+	echo ". /etc/functions.sh" >> $$(I_$(1))/CONTROL/postinst
+	echo "load_modules /etc/modules.d/$(4)-$(2)" >> $$(I_$(1))/CONTROL/postinst
+	echo "fi" >> $$(I_$(1))/CONTROL/postinst
+	chmod 0755 $$(I_$(1))/CONTROL/postinst
+endif
+endif
+	$(IPKG_BUILD) $$(I_$(1)) $(PACKAGE_DIR) $(MAKE_TRACE)
+endef
+
+include $(BUILD_DIR)/.kernelconfig

+ 11 - 0
mk/linux.mk

@@ -0,0 +1,11 @@
+# $Id$
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+PKG_NAME:=	linux
+PKG_VERSION:=	$(KERNEL_VERSION)
+PKG_RELEASE:=	$(KERNEL_RELEASE)
+PKG_MD5SUM=	$(KERNEL_MD5SUM)
+DISTFILES=	$(PKG_NAME)-$(PKG_VERSION).tar.bz2
+MASTER_SITES=  	${MASTER_SITE_KERNEL:=kernel/v2.6/}

+ 147 - 0
mk/mirrors.mk

@@ -0,0 +1,147 @@
+# $Id$
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+MASTER_SITE_BACKUP?=	${MASTER_SITE_OPENADK}
+
+MASTER_SITE_OPENADK?=	\
+	http://www.openadk.org/distfiles/ \
+
+MASTER_SITE_MIRBSD?=	\
+	http://www.mirbsd.org/MirOS/distfiles/ \
+	http://pub.allbsd.org/MirOS/distfiles/ \
+
+MASTER_SITE_KERNEL?=	\
+	http://www.de.kernel.org/pub/linux/ \
+	http://www.fi.kernel.org/pub/linux/ \
+	http://www.fr.kernel.org/pub/linux/ \
+	http://www.kernel.org/pub/linux/ \
+
+MASTER_SITE_XORG?=	\
+	http://ftp.gwdg.de/pub/x11/x.org/pub/X11R7.4/src/everything/ \
+	http://xorg.freedesktop.org/releases/X11R7.4/src/everything/ \
+	http://xorg.freedesktop.org/releases/individual/lib/ \
+	
+MASTER_SITE_GNU?=	\
+	http://ftp.gnu.org/gnu/ \
+	ftp://ftp.gnu.org/gnu/ \
+	ftp://ftp.funet.fi/pub/gnu/prep/ \
+	ftp://mirrors.usc.edu/pub/gnu/ \
+	ftp://ftp.cs.tu-berlin.de/pub/gnu/ \
+	ftp://aeneas.mit.edu/pub/gnu/ \
+	ftp://mirrors.dotsrc.org/gnu/ \
+	ftp://ftp.wustl.edu/pub/gnu/ \
+	ftp://ftp.kddilabs.jp/GNU/ \
+	ftp://ftp.mirror.ac.uk/sites/ftp.gnu.org/gnu/ \
+	ftp://sunsite.org.uk/package/gnu/ \
+	ftp://ftp.informatik.hu-berlin.de/pub/gnu/ \
+	ftp://ftp.rediris.es/mirror/gnu/gnu/ \
+	ftp://ftp.cs.univ-paris8.fr/mirrors/ftp.gnu.org/ \
+	ftp://ftp.chg.ru/pub/gnu/ \
+	ftp://ftp.uvsq.fr/pub/gnu/ \
+  	ftp://ftp.sunet.se/pub/gnu/ \
+
+MASTER_SITE_SOURCEFORGE?=	\
+	http://easynews.dl.sourceforge.net/sourceforge/ \
+	http://puzzle.dl.sourceforge.net/sourceforge/ \
+	http://optusnet.dl.sourceforge.net/sourceforge/ \
+	http://heanet.dl.sourceforge.net/sourceforge/ \
+	http://jaist.dl.sourceforge.net/sourceforge/ \
+	http://nchc.dl.sourceforge.net/sourceforge/ \
+	http://switch.dl.sourceforge.net/sourceforge/ \
+	http://kent.dl.sourceforge.net/sourceforge/ \
+	http://internap.dl.sourceforge.net/sourceforge/ \
+	http://mesh.dl.sourceforge.net/sourceforge/ \
+	http://ovh.dl.sourceforge.net/sourceforge/ \
+	http://surfnet.dl.sourceforge.net/sourceforge/ \
+	http://ufpr.dl.sourceforge.net/sourceforge/ \
+
+MASTER_SITE_MYSQL?=		\
+	ftp://ftp.fu-berlin.de/unix/databases/mysql/ \
+	http://sunsite.informatik.rwth-aachen.de/mysql/ \
+	http://mysql.easynet.be/ \
+	http://mysql.blic.net/ \
+	http://mysql.online.bg/ \
+	http://mysql.mirrors.cybercity.dk/ \
+	http://mirrors.dotsrc.org/mysql/ \
+	http://mysql.tonnikala.org/ \
+	ftp://ftp.inria.fr/pub/MySQL/ \
+	http://mirrors.ircam.fr/pub/mysql/ \
+	http://mirrors.ee.teiath.gr/mysql/ \
+	http://mysql.sote.hu/ \
+	http://mysql.mirrors.crysys.hit.bme.hu/ \
+	http://na.mirror.garr.it/mirrors/MySQL/ \
+	http://mysql.bst.lt/ \
+	http://mysql.proserve.nl/ \
+	http://mirror.hostfuss.com/mysql/ \
+	http://mysql.mirrors.webazilla.nl/ \
+	http://mirror.dinpris.com/mysql/ \
+	http://mysql.nfsi.pt/ \
+	http://lisa.gov.pt/ftp/mysql/ \
+	ftp://mirrors.fibernet.ro/1/MySQL/ \
+	http://mysql.ran.ro/ \
+	http://mysql.directnet.ru/ \
+	ftp://ftp.dn.ru/pub/MySQL/ \
+	http://mysql.dn.ru/ \
+	http://mysql.mix.su/ \
+	http://www.fastmirrors.org/mysql/ \
+	http://mirrors.bevc.net/mysql/ \
+	http://www.wsection.com/mysql/ \
+	http://mysql.paknet.org/ \
+	http://mysql.rediris.es/ \
+	http://mysql.dataphone.se/ \
+	http://mirror.switch.ch/ftp/mirror/mysql/ \
+	ftp://ftp.solnet.ch/mirror/mysql/ \
+	http://mysql.net.ua/ \
+	ftp://ftp.tlk-l.net/pub/mirrors/mysql.com/ \
+	http://mysql.infocom.ua/ \
+	http://www.mirrorservice.org/sites/ftp.mysql.com/ \
+	http://mirrors.dedipower.com/www.mysql.com/ \
+	http://www.mirror.ac.uk/mirror/www.mysql.org/ \
+	http://mysql.mirror.rafal.ca/ \
+	http://mysql.serenitynet.com/ \
+	ftp://mirror.mcs.anl.gov/pub/mysql/ \
+	http://mirror.services.wisc.edu/mysql/ \
+	http://mysql.orst.edu/ \
+	http://mysql.he.net/ \
+	http://mysql.mirrors.pair.com/ \
+	http://mysql.mirror.redwire.net/ \
+	http://mysql.mirrors.hoobly.com/ \
+	http://mirror.trouble-free.net/mysql_mirror/ \
+	http://mirrors.24-7-solutions.net/pub/mysql/ \
+	http://www.stathy.com/mysql/ \
+	http://mirror.x10.com/mirror/mysql/ \
+	http://mysql.localhost.net.ar/ \
+	http://mirrors.uol.com.br/pub/mysql/ \
+	http://mysql.vision.cl/ \
+	http://mysql.tecnoera.com/ \
+	http://mysql.mirrors.arminco.com/ \
+	http://mysqlmirror.netandhost.in/ \
+	http://mirror.mysql-partners-jp.biz/ \
+	http://ftp.iij.ad.jp/pub/db/mysql/ \
+	http://mysql.oss.eznetsols.org/ \
+	http://mysql.holywar.net/ \
+	http://mysql.new21.com/ \
+	http://mysql.byungsoo.net/ \
+	http://mysql.isu.edu.tw/ \
+	http://mysql.cdpa.nsysu.edu.tw/ \
+	http://mysql.cs.pu.edu.tw/ \
+	http://ftp.stu.edu.tw/pub/Unix/Database/Mysql/ \
+	http://mysql.ntu.edu.tw/ \
+	http://mysql.planetmirror.com/ \
+	http://mysql.mirrors.ilisys.com.au/ \
+	http://mysql.inspire.net.nz/ \
+	http://mysql.mirror.ac.za/ \
+
+MASTER_SITE_GNOME+=	\
+	ftp://ftp.acc.umu.se/pub/GNOME/sources/	\
+	ftp://ftp.rpmfind.net/linux/gnome.org/sources/ \
+	ftp://ftp.unina.it/pub/linux/GNOME/sources/ \
+	ftp://ftp.belnet.be/mirror/ftp.gnome.org/sources/ \
+	ftp://ftp.dit.upm.es/linux/gnome/sources/ \
+	ftp://ftp.dataplus.se/pub/linux/gnome/sources/ \
+	ftp://ftp.cse.buffalo.edu/pub/Gnome/sources/ \
+	ftp://ftp.linux.org.uk/mirrors/ftp.gnome.org/sources/ \
+	ftp://ftp.gnome.org/pub/GNOME/sources/ \
+

+ 1254 - 0
mk/modules.mk

@@ -0,0 +1,1254 @@
+# $Id$
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+#
+# Ethernet network devices
+# 
+$(eval $(call KMOD_template,NE2K_PCI,ne2k-pci,\
+	$(MODULES_DIR)/kernel/drivers/net/8390 \
+	$(MODULES_DIR)/kernel/drivers/net/ne2k-pci \
+,20))
+
+$(eval $(call KMOD_template,E100,e100,\
+	$(MODULES_DIR)/kernel/drivers/net/e100 \
+,20))
+
+$(eval $(call KMOD_template,E1000,e1000,\
+	$(MODULES_DIR)/kernel/drivers/net/e1000/e1000 \
+,20))
+
+# 
+# Wireless network devices
+#
+$(eval $(call KMOD_template,MAC80211,mac80211,\
+	$(MODULES_DIR)/kernel/net/wireless/cfg80211 \
+	$(MODULES_DIR)/kernel/net/mac80211/mac80211 \
+,15, kmod-crypto-aes kmod-crypto-arc4 kmod-crypto-ecb kmod-crc32))
+
+$(eval $(call KMOD_template,ATH5K,mac80211-ath5k,\
+	$(MODULES_DIR)/kernel/drivers/net/wireless/ath5k/ath5k \
+,20, kmod-led-class))
+
+$(eval $(call KMOD_template,RT2X00,mac80211-rt2x00,\
+	$(MODULES_DIR)/kernel/drivers/net/wireless/rt2x00/rt2x00lib \
+	$(MODULES_DIR)/kernel/drivers/net/wireless/rt2x00/rt2x00pci \
+,17))
+
+$(eval $(call KMOD_template,RT2400PCI,mac80211-rt2400pci,\
+	$(MODULES_DIR)/kernel/drivers/net/wireless/rt2x00/rt2400pci \
+,20, kmod-led-class kmod-mac80211-rt2x00))
+
+$(eval $(call KMOD_template,RT2500PCI,mac80211-rt2500pci,\
+	$(MODULES_DIR)/kernel/drivers/net/wireless/rt2x00/rt2500pci \
+,20, kmod-led-class kmod-mac80211-rt2x00))
+
+$(eval $(call KMOD_template,RT61PCI,mac80211-rt61pci,\
+	$(MODULES_DIR)/kernel/drivers/net/wireless/rt2x00/rt61pci \
+,20, kmod-led-class kmod-mac80211-rt2x00))
+
+#
+# Networking
+#
+$(eval $(call KMOD_template,ATM,atm,\
+	$(MODULES_DIR)/kernel/net/atm/atm \
+,50))
+
+$(eval $(call KMOD_template,BRIDGE,bridge,\
+	$(MODULES_DIR)/kernel/net/llc/llc \
+	$(MODULES_DIR)/kernel/net/bridge/bridge \
+,10))
+
+$(eval $(call KMOD_template,NET_IPGRE,gre,\
+	$(MODULES_DIR)/kernel/net/ipv4/ip_gre \
+,50))
+
+$(eval $(call KMOD_template,NET_IPIP,ipip,\
+	$(MODULES_DIR)/kernel/net/ipv4/tunnel4 \
+	$(MODULES_DIR)/kernel/net/ipv4/ipip \
+,60))
+
+$(eval $(call KMOD_template,IPV6,ipv6,\
+	$(MODULES_DIR)/kernel/net/ipv6/ipv6 \
+,20))
+
+$(eval $(call KMOD_template,IPV6_SIT,ipv6-sit,\
+	$(MODULES_DIR)/kernel/net/ipv6/sit \
+,25))
+
+$(eval $(call KMOD_template,PPP,ppp,\
+	$(MODULES_DIR)/kernel/drivers/net/slhc \
+	$(MODULES_DIR)/kernel/drivers/net/ppp_generic \
+	$(MODULES_DIR)/kernel/drivers/net/ppp_async \
+	$(MODULES_DIR)/kernel/drivers/net/pppox \
+,50))
+
+$(eval $(call KMOD_template,MPPE,mppe,\
+	$(MODULES_DIR)/kernel/drivers/net/ppp_mppe_mppc \
+,55))
+
+$(eval $(call KMOD_template,PPPOATM,pppoatm,\
+	$(MODULES_DIR)/kernel/net/atm/pppoatm \
+,60))
+
+$(eval $(call KMOD_template,PPPOE,pppoe,\
+	$(MODULES_DIR)/kernel/drivers/net/pppoe \
+,60))
+
+$(eval $(call KMOD_template,TUN,tun,\
+	$(MODULES_DIR)/kernel/drivers/net/tun \
+,20))
+
+$(eval $(call KMOD_template,BONDING,bonding,\
+	$(MODULES_DIR)/kernel/drivers/net/bonding/bonding \
+,20))
+
+#
+# Traffic scheduling
+#
+$(eval $(call KMOD_template,NET_SCH_CBQ,net-sched-cbq,\
+	$(MODULES_DIR)/kernel/net/sched/sch_cbq \
+,40))
+
+$(eval $(call KMOD_template,NET_SCH_HTB,net-sched-htb,\
+	$(MODULES_DIR)/kernel/net/sched/sch_htb \
+,40))
+
+$(eval $(call KMOD_template,NET_SCH_HFSC,net-sched-hfsc,\
+	$(MODULES_DIR)/kernel/net/sched/sch_hfsc \
+,40))
+
+$(eval $(call KMOD_template,NET_SCH_ATM,net-sched-atm,\
+	$(MODULES_DIR)/kernel/net/sched/sch_atm \
+,40))
+
+$(eval $(call KMOD_template,NET_SCH_PRIO,net-sched-prio,\
+	$(MODULES_DIR)/kernel/net/sched/sch_prio \
+,40))
+
+$(eval $(call KMOD_template,NET_SCH_RED,net-sched-red,\
+	$(MODULES_DIR)/kernel/net/sched/sch_red \
+,40))
+
+$(eval $(call KMOD_template,NET_SCH_SFQ,net-sched-sfq,\
+	$(MODULES_DIR)/kernel/net/sched/sch_sfq \
+,40))
+
+# busybox netapps crash, when module loaded
+#$(eval $(call KMOD_template,NET_SCH_TEQL,net-sched-teql,\
+#	$(MODULES_DIR)/kernel/net/sched/sch_teql \
+#,40))
+
+$(eval $(call KMOD_template,NET_SCH_TBF,net-sched-tbf,\
+	$(MODULES_DIR)/kernel/net/sched/sch_tbf \
+,40))
+
+$(eval $(call KMOD_template,NET_SCH_GRED,net-sched-gred,\
+	$(MODULES_DIR)/kernel/net/sched/sch_gred \
+,40))
+
+$(eval $(call KMOD_template,NET_SCH_DSMARK,net-sched-dsmark,\
+	$(MODULES_DIR)/kernel/net/sched/sch_dsmark \
+,40))
+
+$(eval $(call KMOD_template,NET_SCH_INGRESS,net-sched-ingress,\
+	$(MODULES_DIR)/kernel/net/sched/sch_ingress \
+,40))
+
+#
+# classifications
+#
+$(eval $(call KMOD_template,NET_CLS_BASIC,net-cls-basic,\
+	$(MODULES_DIR)/kernel/net/sched/cls_basic \
+,40))
+
+$(eval $(call KMOD_template,NET_CLS_TCINDEX,net-cls-tcindex,\
+	$(MODULES_DIR)/kernel/net/sched/cls_tcindex \
+,40))
+
+$(eval $(call KMOD_template,NET_CLS_ROUTE4,net-cls-route,\
+	$(MODULES_DIR)/kernel/net/sched/cls_route \
+,40))
+
+$(eval $(call KMOD_template,NET_CLS_FW,net-cls-fw,\
+	$(MODULES_DIR)/kernel/net/sched/cls_fw \
+,40))
+
+$(eval $(call KMOD_template,NET_CLS_U32,net-cls-u32,\
+	$(MODULES_DIR)/kernel/net/sched/cls_u32 \
+,40))
+
+#
+# actions
+#
+$(eval $(call KMOD_template,NET_ACT_POLICE,net-act-police,\
+	$(MODULES_DIR)/kernel/net/sched/act_police \
+,45))
+
+$(eval $(call KMOD_template,NET_ACT_GACT,net-act-gact,\
+	$(MODULES_DIR)/kernel/net/sched/act_gact \
+,45))
+
+$(eval $(call KMOD_template,NET_ACT_MIRRED,net-act-mirred,\
+	$(MODULES_DIR)/kernel/net/sched/act_mirred \
+,45))
+
+$(eval $(call KMOD_template,NET_ACT_IPT,net-act-ipt,\
+	$(MODULES_DIR)/kernel/net/sched/act_ipt \
+,45))
+
+$(eval $(call KMOD_template,NET_ACT_PEDIT,net-act-pedit,\
+	$(MODULES_DIR)/kernel/net/sched/act_pedit \
+,45))
+
+##
+## Filtering / Firewalling
+##
+#
+# Netfilter Core
+#
+$(eval $(call KMOD_template,NETFILTER_XT_TARGET_CLASSIFY,nf-classify,\
+	$(MODULES_DIR)/kernel/net/netfilter/xt_CLASSIFY \
+,50))
+
+$(eval $(call KMOD_template,NETFILTER_XT_TARGET_CONNMARK,nf-connmark,\
+	$(MODULES_DIR)/kernel/net/netfilter/xt_CONNMARK \
+,50))
+
+$(eval $(call KMOD_template,NETFILTER_XT_TARGET_MARK,nf-mark,\
+	$(MODULES_DIR)/kernel/net/netfilter/xt_MARK \
+,50))
+
+$(eval $(call KMOD_template,NETFILTER_XT_TARGET_NFQUEUE,nf-queue,\
+	$(MODULES_DIR)/kernel/net/netfilter/xt_NFQUEUE \
+,50))
+
+$(eval $(call KMOD_template,NETFILTER_XT_TARGET_NOTRACK,nf-notrack,\
+	$(MODULES_DIR)/kernel/net/netfilter/xt_NOTRACK \
+,50))
+
+#
+# IP: Netfilter
+#
+$(eval $(call KMOD_template,NF_CONNTRACK,nf-conntrack,\
+	$(MODULES_DIR)/kernel/net/netfilter/nf_conntrack \
+,50))
+
+$(eval $(call KMOD_template,NF_CONNTRACK_IPV4,nf-conntrack-ipv4,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/nf_defrag_ipv4 \
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/nf_conntrack_ipv4 \
+,51))
+
+$(eval $(call KMOD_template,IP_NF_FTP,nf-ip-conntrack-ftp,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ip_conntrack_ftp \
+,55))
+
+$(eval $(call KMOD_template,IP_NF_IRC,nf-ip-conntrack-irc,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ip_conntrack_irc \
+,55))
+
+$(eval $(call KMOD_template,IP_NF_NETBIOS_NS,nf-ip-conntrack-netbios-ns,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ip_conntrack_netbios_ns \
+,55))
+
+$(eval $(call KMOD_template,IP_NF_TFTP,nf-ip-conntrack-tftp,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ip_conntrack_tftp \
+,55))
+
+$(eval $(call KMOD_template,IP_NF_AMANDA,nf-ip-conntrack-amanda,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ip_conntrack_amanda \
+,55))
+
+$(eval $(call KMOD_template,IP_NF_PPTP,nf-ip-conntrack-pptp,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ip_conntrack_pptp \
+,55))
+
+$(eval $(call KMOD_template,IP_NF_H323,nf-ip-conntrack-h323,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ip_conntrack_h323 \
+,55))
+
+$(eval $(call KMOD_template,IP_NF_SIP,nf-ip-conntrack-sip,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ip_conntrack_sip \
+,55))
+
+$(eval $(call KMOD_template,IP_NF_IPTABLES,nf-ip-iptables,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ip_tables \
+,50))
+
+$(eval $(call KMOD_template,IP_NF_MATCH_IPRANGE,nf-ip-match-iprange,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ipt_iprange \
+,55))
+
+$(eval $(call KMOD_template,IP_NF_MATCH_TOS,nf-ip-match-tos,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ipt_tos \
+,55))
+
+$(eval $(call KMOD_template,IP_NF_MATCH_RECENT,nf-ip-match-recent,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ipt_recent \
+,55))
+
+$(eval $(call KMOD_template,IP_NF_MATCH_ECN,nf-ip-match-ecn,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ipt_ecn \
+,55))
+
+$(eval $(call KMOD_template,IP_NF_MATCH_AH,nf-ip-match-ah,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ipt_ah \
+,55))
+
+$(eval $(call KMOD_template,IP_NF_MATCH_TTL,nf-ip-match-ttl,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ipt_ttl \
+,55))
+
+$(eval $(call KMOD_template,IP_NF_MATCH_OWNER,nf-ip-match-owner,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ipt_owner \
+,55))
+
+$(eval $(call KMOD_template,IP_NF_MATCH_ADDRTYPE,nf-ip-match-addrtype,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ipt_addrtype \
+,55))
+
+$(eval $(call KMOD_template,IP_NF_MATCH_HASHLIMIT,nf-ip-match-hashlimit,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ipt_hashlimit \
+,55))
+
+$(eval $(call KMOD_template,IP_NF_MATCH_STATE,nf-ip-match-state,\
+	$(MODULES_DIR)/kernel/net/netfilter/xt_state \
+,55))
+
+$(eval $(call KMOD_template,IP_NF_MATCH_MULTIPORT,nf-ip-match-multiport,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ipt_multiport \
+,55))
+
+#
+# Filtering
+#
+$(eval $(call KMOD_template,IP_NF_FILTER,nf-ip-filter,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/iptable_filter \
+,55))
+
+$(eval $(call KMOD_template,IP_NF_TARGET_REJECT,nf-ip-target-reject,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ipt_REJECT \
+,60))
+
+$(eval $(call KMOD_template,IP_NF_TARGET_LOG,nf-ip-target-log,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ipt_LOG \
+,60))
+
+$(eval $(call KMOD_template,IP_NF_TARGET_ULOG,nf-ip-target-ulog,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ipt_ULOG \
+,60))
+
+$(eval $(call KMOD_template,IP_NF_TARGET_TCPMSS,nf-ip-target-tcpmss,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ipt_TCPMSS \
+,60))
+
+$(eval $(call KMOD_template,NF_NAT,nf-nat,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/nf_nat \
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/iptable_nat \
+,60))
+
+$(eval $(call KMOD_template,IP_NF_PPTP,nf-ip-nat-pptp,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ip_nat_pptp \
+,65))
+
+$(eval $(call KMOD_template,IP_NF_TFTP,nf-ip-nat-tftp,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ip_nat_tftp \
+,65))
+
+$(eval $(call KMOD_template,IP_NF_FTP,nf-ip-nat-ftp,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ip_nat_ftp \
+,65))
+
+$(eval $(call KMOD_template,IP_NF_IRC,nf-ip-nat-irc,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ip_nat_irc \
+,65))
+
+$(eval $(call KMOD_template,IP_NF_AMANDA,nf-ip-nat-amanda,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ip_nat_amanda \
+,65))
+
+$(eval $(call KMOD_template,IP_NF_SIP,nf-ip-nat-sip,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ip_nat_sip \
+,65))
+
+$(eval $(call KMOD_template,IP_NF_H323,nf-ip-nat-h323,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ip_nat_h323 \
+,65))
+
+$(eval $(call KMOD_template,IP_NF_TARGET_MASQUERADE,nf-ip-target-masquerade,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ipt_MASQUERADE \
+,65))
+
+$(eval $(call KMOD_template,IP_NF_TARGET_REDIRECT,nf-ip-target-redirect,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ipt_REDIRECT \
+,65))
+
+$(eval $(call KMOD_template,IP_NF_TARGET_NETMAP,nf-ip-target-netmap,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ipt_NETMAP \
+,65))
+
+$(eval $(call KMOD_template,IP_NF_TARGET_SAME,nf-ip-target-same,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ipt_SAME \
+,65))
+
+#
+# Mangle
+#
+$(eval $(call KMOD_template,IP_NF_MANGLE,nf-ip-mangle,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/iptable_mangle \
+,60))
+
+$(eval $(call KMOD_template,IP_NF_TARGET_TOS,nf-ip-target-tos,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ipt_TOS \
+,65))
+
+$(eval $(call KMOD_template,IP_NF_TARGET_ECN,nf-ip-target-ecn,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ipt_ECN \
+,65))
+
+$(eval $(call KMOD_template,IP_NF_TARGET_TTL,nf-ip-target-ttl,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ipt_TTL \
+,65))
+
+#
+# IPVS
+#
+
+IPVSPATH=$(MODULES_DIR)/kernel/net/netfilter/ipvs
+
+$(eval $(call KMOD_template,IP_VS,ip-vs,\
+	$(IPVSPATH)/ip_vs \
+,55))
+
+$(eval $(call KMOD_template,IP_VS_RR,ip-vs-rr,\
+	$(IPVSPATH)/ip_vs_rr \
+,55))
+
+$(eval $(call KMOD_template,IP_VS_WRR,ip-vs-wrr,\
+	$(IPVSPATH)/ip_vs_wrr \
+,55))
+
+$(eval $(call KMOD_template,IP_VS_LC,ip-vs-lc,\
+	$(IPVSPATH)/ip_vs_lc \
+,55))
+
+$(eval $(call KMOD_template,IP_VS_WLC,ip-vs-wlc,\
+	$(IPVSPATH)/ip_vs_wlc \
+,55))
+
+$(eval $(call KMOD_template,IP_VS_LBLC,ip-vs-lblc,\
+	$(IPVSPATH)/ip_vs_lblc \
+,55))
+
+$(eval $(call KMOD_template,IP_VS_LBLCR,ip-vs-lblcr,\
+	$(IPVSPATH)/ip_vs_lblcr \
+,55))
+
+$(eval $(call KMOD_template,IP_VS_DH,ip-vs-dh,\
+	$(IPVSPATH)/ip_vs_dh \
+,55))
+
+$(eval $(call KMOD_template,IP_VS_SH,ip-vs-sh,\
+	$(IPVSPATH)/ip_vs_sh \
+,55))
+
+$(eval $(call KMOD_template,IP_VS_SED,ip-vs-sed,\
+	$(IPVSPATH)/ip_vs_sed \
+,55))
+
+$(eval $(call KMOD_template,IP_VS_NQ,ip-vs-nq,\
+	$(IPVSPATH)/ip_vs_nq \
+,55))
+
+$(eval $(call KMOD_template,IP_VS_FTP,ip-vs-ftp,\
+	$(IPVSPATH)/ip_vs_ftp \
+,55))
+
+#
+# Block devices
+#
+$(eval $(call KMOD_template,BLK_DEV_LOOP,loop,\
+    $(MODULES_DIR)/kernel/drivers/block/loop \
+,20))
+
+$(eval $(call KMOD_template,BLK_DEV_NBD,nbd,\
+    $(MODULES_DIR)/kernel/drivers/block/nbd \
+,20))
+
+$(eval $(call KMOD_template,SCSI,scsi,\
+    $(MODULES_DIR)/kernel/drivers/scsi/scsi_wait_scan \
+,20))
+
+$(eval $(call KMOD_template,BLK_DEV_SD,scsi-disk,\
+    $(MODULES_DIR)/kernel/drivers/scsi/sd_mod \
+,25))
+
+$(eval $(call KMOD_template,BLK_DEV_SR,scsi-cdrom,\
+    $(MODULES_DIR)/kernel/drivers/cdrom/cdrom \
+    $(MODULES_DIR)/kernel/drivers/scsi/sr_mod \
+,25))
+
+#
+# RAID
+#
+$(eval $(call KMOD_template,BLK_DEV_MD,md,\
+    $(MODULES_DIR)/kernel/drivers/md/md-mod \
+,30))
+
+$(eval $(call KMOD_template,MD_RAID0,md-raid0,\
+    $(MODULES_DIR)/kernel/drivers/md/raid0 \
+,35))
+
+$(eval $(call KMOD_template,MD_RAID1,md-raid1,\
+    $(MODULES_DIR)/kernel/drivers/md/raid1 \
+,35))
+
+$(eval $(call KMOD_template,MD_RAID456,md-raid456,\
+    $(MODULES_DIR)/kernel/drivers/md/raid456 \
+,35))
+
+#
+# Device Mapper
+#
+$(eval $(call KMOD_template,BLK_DEV_DM,dm-mod,\
+    $(MODULES_DIR)/kernel/drivers/md/dm-mod \
+,35))
+
+$(eval $(call KMOD_template,DM_CRYPT,dm-crypt,\
+    $(MODULES_DIR)/kernel/drivers/md/dm-crypt \
+,40))
+
+$(eval $(call KMOD_template,DM_MIRROR,dm-mirror,\
+    $(MODULES_DIR)/kernel/drivers/md/dm-mirror \
+,40))
+
+$(eval $(call KMOD_template,DM_SNAPSHOT,dm-snapshot,\
+    $(MODULES_DIR)/kernel/drivers/md/dm-snapshot \
+,40))
+
+
+#
+# Crypto
+#
+
+$(eval $(call KMOD_template,CRYPTO_DEV_GEODE,crypto-hw-geode,\
+    $(MODULES_DIR)/kernel/drivers/crypto/geode-aes \
+,10))
+
+$(eval $(call KMOD_template,CRYPTO_ALGAPI,crypto-algapi,\
+    $(MODULES_DIR)/kernel/crypto/crypto_algapi \
+,03))
+
+$(eval $(call KMOD_template,CRYPTO_AEAD,crypto-aead,\
+    $(MODULES_DIR)/kernel/crypto/aead \
+,04))
+
+$(eval $(call KMOD_template,CRYPTO_BLKCIPHER,crypto-blkcipher,\
+    $(MODULES_DIR)/kernel/crypto/crypto_blkcipher \
+    $(MODULES_DIR)/kernel/crypto/rng \
+    $(MODULES_DIR)/kernel/crypto/krng \
+    $(MODULES_DIR)/kernel/crypto/eseqiv \
+    $(MODULES_DIR)/kernel/crypto/chainiv \
+,05))
+
+$(eval $(call KMOD_template,CRYPTO_HASH,crypto-hash,\
+    $(MODULES_DIR)/kernel/crypto/crypto_hash \
+,05))
+
+$(eval $(call KMOD_template,CRYPTO_MANAGER,crypto-manager,\
+    $(MODULES_DIR)/kernel/crypto/cryptomgr \
+,06))
+
+$(eval $(call KMOD_template,CRYPTO_HMAC,crypto-hmac,\
+    $(MODULES_DIR)/kernel/crypto/hmac \
+,11))
+
+$(eval $(call KMOD_template,CRYPTO_NULL,crypto-null,\
+    $(MODULES_DIR)/kernel/crypto/crypto_null \
+,11))
+
+$(eval $(call KMOD_template,CRYPTO_MD4,crypto-md4,\
+    $(MODULES_DIR)/kernel/crypto/md4 \
+,11))
+
+$(eval $(call KMOD_template,CRYPTO_MD5,crypto-md5,\
+    $(MODULES_DIR)/kernel/crypto/md5 \
+,11))
+
+$(eval $(call KMOD_template,CRYPTO_SHA1,crypto-sha1,\
+    $(MODULES_DIR)/kernel/crypto/sha1_generic \
+,11))
+
+$(eval $(call KMOD_template,CRYPTO_SHA256,crypto-sha256,\
+    $(MODULES_DIR)/kernel/crypto/sha256_generic \
+,11))
+
+$(eval $(call KMOD_template,CRYPTO_SHA512,crypto-sha512,\
+    $(MODULES_DIR)/kernel/crypto/sha512_generic \
+,11))
+
+$(eval $(call KMOD_template,CRYPTO_WP512,crypto-whirlpool,\
+    $(MODULES_DIR)/kernel/crypto/wp512 \
+,11))
+
+$(eval $(call KMOD_template,CRYPTO_TGR192,crypto-tiger,\
+    $(MODULES_DIR)/kernel/crypto/tgr192 \
+,11))
+
+$(eval $(call KMOD_template,CRYPTO_ECB,crypto-ecb,\
+    $(MODULES_DIR)/kernel/crypto/ecb \
+,10))
+
+$(eval $(call KMOD_template,CRYPTO_CBC,crypto-cbc,\
+    $(MODULES_DIR)/kernel/crypto/cbc \
+,10))
+
+$(eval $(call KMOD_template,CRYPTO_DES,crypto-des,\
+    $(MODULES_DIR)/kernel/crypto/des_generic \
+,10))
+
+$(eval $(call KMOD_template,CRYPTO_BLOWFISH,crypto-blowfish,\
+    $(MODULES_DIR)/kernel/crypto/blowfish \
+,11))
+
+$(eval $(call KMOD_template,CRYPTO_TWOFISH,crypto-twofish,\
+    $(MODULES_DIR)/kernel/crypto/twofish_common \
+    $(MODULES_DIR)/kernel/crypto/twofish \
+,11))
+
+$(eval $(call KMOD_template,CRYPTO_TWOFISH_586,crypto-twofish-i586,\
+    $(MODULES_DIR)/kernel/arch/x86/crypto/twofish-i586 \
+,12))
+
+$(eval $(call KMOD_template,CRYPTO_SERPENT,crypto-serpent,\
+    $(MODULES_DIR)/kernel/crypto/serpent \
+,11))
+
+$(eval $(call KMOD_template,CRYPTO_AES,crypto-aes,\
+    $(MODULES_DIR)/kernel/crypto/aes_generic \
+,10))
+
+$(eval $(call KMOD_template,CRYPTO_AES_586,crypto-aes-i586,\
+    $(MODULES_DIR)/kernel/arch/x86/crypto/aes-i586 \
+,11))
+
+$(eval $(call KMOD_template,CRYPTO_CAST5,crypto-cast5,\
+    $(MODULES_DIR)/kernel/crypto/cast5 \
+,11))
+
+$(eval $(call KMOD_template,CRYPTO_CAST6,crypto-cast6,\
+    $(MODULES_DIR)/kernel/crypto/cast6 \
+,11))
+
+$(eval $(call KMOD_template,CRYPTO_TEA,crypto-tea,\
+    $(MODULES_DIR)/kernel/crypto/tea \
+,11))
+
+$(eval $(call KMOD_template,CRYPTO_ARC4,crypto-arc4,\
+    $(MODULES_DIR)/kernel/crypto/arc4 \
+,11))
+
+$(eval $(call KMOD_template,CRYPTO_KHAZAD,crypto-khazad,\
+    $(MODULES_DIR)/kernel/crypto/khazad \
+,11))
+
+$(eval $(call KMOD_template,CRYPTO_ANUBIS,crypto-anubis,\
+    $(MODULES_DIR)/kernel/crypto/anubis \
+,11))
+
+$(eval $(call KMOD_template,CRYPTO_CAMELLIA,crypto-camellia,\
+    $(MODULES_DIR)/kernel/crypto/camellia \
+,11))
+
+$(eval $(call KMOD_template,CRYPTO_FCRYPT,crypto-fcrypt,\
+    $(MODULES_DIR)/kernel/crypto/fcrypt \
+,11))
+
+$(eval $(call KMOD_template,CRYPTO_DEFLATE,crypto-deflate,\
+    $(MODULES_DIR)/kernel/crypto/deflate \
+,10))
+
+$(eval $(call KMOD_template,CRYPTO_LZO,crypto-lzo,\
+    $(MODULES_DIR)/kernel/crypto/lzo \
+,10))
+
+$(eval $(call KMOD_template,CRYPTO_MICHAEL_MIC,crypto-michael-mic,\
+    $(MODULES_DIR)/kernel/crypto/michael_mic \
+,11))
+
+$(eval $(call KMOD_template,CRYPTO_CRC32C,crypto-crc32c,\
+    $(MODULES_DIR)/kernel/crypto/crc32c \
+,11))
+
+$(eval $(call KMOD_template,OCF_CRYPTOSOFT,cryptodev-cryptosoft,\
+    ${MODULES_DIR}/kernel/crypto/ocf/cryptosoft \
+,12))
+
+$(eval $(call KMOD_template,OCF_SAFE,cryptodev-safe,\
+    ${MODULES_DIR}/kernel/crypto/ocf/safe/safe \
+,12))
+
+$(eval $(call KMOD_template,OCF_IXP4XX,cryptodev-ixp4xx,\
+    ${MODULES_DIR}/kernel/crypto/ocf/ixp4xx/ixp4xx \
+,12))
+
+$(eval $(call KMOD_template,OCF_HIFN,cryptodev-hifn,\
+    ${MODULES_DIR}/kernel/crypto/ocf/hifn/hifn7751 \
+,12))
+
+$(eval $(call KMOD_template,OCF_TALITOS,cryptodev-talitos,\
+    ${MODULES_DIR}/kernel/crypto/ocf/talitos/talitos \
+,12))
+
+#
+# Filesystems
+#
+$(eval $(call KMOD_template,CIFS,fs-cifs,\
+	$(MODULES_DIR)/kernel/fs/cifs/cifs \
+,30))
+
+$(eval $(call KMOD_template,CODA_FS,fs-coda,\
+	$(MODULES_DIR)/kernel/fs/coda/coda \
+,30))
+
+ifneq ($(ADK_KERNEL_EXT2_FS),y)
+$(eval $(call KMOD_template,EXT2_FS,fs-ext2,\
+	$(MODULES_DIR)/kernel/fs/ext2/ext2 \
+,30))
+endif
+
+$(eval $(call KMOD_template,EXT3_FS,fs-ext3,\
+	$(MODULES_DIR)/kernel/fs/jbd/jbd \
+	$(MODULES_DIR)/kernel/fs/ext3/ext3 \
+,30))
+
+$(eval $(call KMOD_template,FUSE_FS,fs-fuse,\
+	$(MODULES_DIR)/kernel/fs/fuse/fuse \
+,30))
+
+$(eval $(call KMOD_template,HFSPLUS_FS,fs-hfsplus,\
+	$(MODULES_DIR)/kernel/fs/hfsplus/hfsplus \
+,30))
+
+$(eval $(call KMOD_template,SUNRPC,fs-rpc,\
+	$(MODULES_DIR)/kernel/net/sunrpc/sunrpc \
+,24))
+
+$(eval $(call KMOD_template,SUNRPC_GSS,fs-rpcgss,\
+	$(MODULES_DIR)/kernel/net/sunrpc/auth_gss/auth_rpcgss \
+,25))
+
+$(eval $(call KMOD_template,RPCSEC_GSS_KRB5,fs-rpcsec-krb5,\
+	$(MODULES_DIR)/kernel/net/sunrpc/auth_gss/rpcsec_gss_krb5 \
+,26))
+
+ifneq ($(ADK_KERNEL_NFS_FS),y)
+$(eval $(call KMOD_template,NFS_FS,fs-nfs,\
+	$(MODULES_DIR)/kernel/fs/lockd/lockd \
+	$(MODULES_DIR)/kernel/fs/nfs/nfs \
+,30))
+endif
+
+$(eval $(call KMOD_template,EXPORTFS,fs-exportfs,\
+	$(MODULES_DIR)/kernel/fs/exportfs/exportfs \
+,20))
+
+$(eval $(call KMOD_template,NFSD,fs-nfsd,\
+        $(MODULES_DIR)/kernel/fs/nfsd/nfsd \
+,30))
+
+$(eval $(call KMOD_template,NTFS_FS,fs-ntfs,\
+	$(MODULES_DIR)/kernel/fs/ntfs/ntfs \
+,30))
+
+$(eval $(call KMOD_template,VFAT_FS,fs-vfat,\
+	$(MODULES_DIR)/kernel/fs/fat/fat \
+	$(MODULES_DIR)/kernel/fs/fat/vfat \
+,30))
+
+$(eval $(call KMOD_template,XFS_FS,fs-xfs,\
+	$(MODULES_DIR)/kernel/fs/xfs/xfs \
+,30))
+
+$(eval $(call KMOD_template,YAFFS_FS,fs-yaffs,\
+	$(MODULES_DIR)/kernel/fs/yaffs2/yaffs \
+,30))
+
+$(eval $(call KMOD_template,REISERFS_FS,fs-reiserfs,\
+	$(MODULES_DIR)/kernel/fs/reiserfs/reiserfs \
+,30))
+
+$(eval $(call KMOD_template,ISO9660_FS,fs-iso9660,\
+	$(MODULES_DIR)/kernel/fs/isofs/isofs \
+,30))
+
+$(eval $(call KMOD_template,UDF_FS,fs-udf,\
+	$(MODULES_DIR)/kernel/fs/udf/udf \
+,30))
+
+#
+# Multimedia
+#
+$(eval $(call KMOD_template,SOUND,soundcore,\
+	$(MODULES_DIR)/kernel/sound/soundcore \
+,30))
+
+$(eval $(call KMOD_template,SND,sound-alsa,\
+	$(MODULES_DIR)/kernel/sound/core/snd-page-alloc \
+	$(MODULES_DIR)/kernel/sound/core/snd \
+	$(MODULES_DIR)/kernel/sound/core/snd-timer \
+	$(MODULES_DIR)/kernel/sound/core/snd-pcm \
+,40))
+
+$(eval $(call KMOD_template,SND_OSSEMUL,sound-alsa-oss-emul,\
+	$(MODULES_DIR)/kernel/sound/core/oss/snd-mixer-oss \
+	$(MODULES_DIR)/kernel/sound/core/oss/snd-pcm-oss \
+,45))
+
+$(eval $(call KMOD_template,SND_AC97_CODEC,sound-alsa-ac97-codec,\
+	$(MODULES_DIR)/kernel/sound/ac97_bus \
+	$(MODULES_DIR)/kernel/sound/pci/ac97/snd-ac97-codec \
+,50))
+
+$(eval $(call KMOD_template,SND_VIA82XX,sound-alsa-via82xx,\
+	$(MODULES_DIR)/kernel/sound/drivers/mpu401/snd-mpu401-uart \
+	$(MODULES_DIR)/kernel/sound/pci/snd-via82xx \
+,55))
+
+$(eval $(call KMOD_template,SND_CS5535AUDIO,sound-alsa-cs5535,\
+	$(MODULES_DIR)/kernel/sound/pci/cs5535audio/snd-cs5535audio \
+,55))
+
+$(eval $(call KMOD_template,VIDEODEV,videodev,\
+	$(MODULES_DIR)/kernel/drivers/media/video/videodev \
+,65))
+
+$(eval $(call KMOD_template,PWC,pwc,\
+	$(MODULES_DIR)/kernel/drivers/usb/pwc \
+,70))
+
+
+#
+# PCMCIA/CardBus
+#
+
+$(eval $(call KMOD_template,PCCARD,pccard,\
+	$(MODULES_DIR)/kernel/drivers/pcmcia/pcmcia_core \
+,40))
+
+$(eval $(call KMOD_template,PCMCIA,pcmcia,\
+	$(MODULES_DIR)/kernel/drivers/pcmcia/pcmcia \
+,50))
+
+$(eval $(call KMOD_template,CARDBUS,cardbus,\
+	$(MODULES_DIR)/kernel/drivers/pcmcia/rsrc_nonstatic \
+	$(MODULES_DIR)/kernel/drivers/pcmcia/yenta_socket \
+,50))
+
+$(eval $(call KMOD_template,PCMCIA_SERIAL_CS,pcmcia-serial,\
+	$(MODULES_DIR)/kernel/drivers/serial/serial_cs \
+,55))
+
+#
+# Input
+#
+
+$(eval $(call KMOD_template,KEYBOARD_ATKBD,input-keyboard,\
+	$(MODULES_DIR)/kernel/drivers/input/keyboard/atkbd \
+,45))
+
+$(eval $(call KMOD_template,INPUT_MOUSEDEV,input-mouse,\
+	$(MODULES_DIR)/kernel/drivers/input/mousedev \
+,45))
+
+#
+# USB
+#
+USB_CORE_MODULE = drivers/usb/core/usbcore
+USB_OHCI_MODULE = drivers/usb/host/ohci-hcd
+USB_UHCI_MODULE = drivers/usb/host/uhci-hcd
+USB_OHCI_SYMBOL = USB_OHCI_HCD
+USB_UHCI_SYMBOL = USB_UHCI_HCD
+
+ifeq ($(ADK_LINUX_CRIS_FOXBOARD),)
+$(eval $(call KMOD_template,USB,usb-core,\
+	$(MODULES_DIR)/kernel/$(USB_CORE_MODULE) \
+,50))
+endif
+
+$(eval $(call KMOD_template,$(USB_OHCI_SYMBOL),usb-ohci,\
+	$(MODULES_DIR)/kernel/$(USB_OHCI_MODULE) \
+,60))
+
+$(eval $(call KMOD_template,$(USB_UHCI_SYMBOL),usb-uhci,\
+	$(MODULES_DIR)/kernel/$(USB_UHCI_MODULE) \
+,60))
+
+$(eval $(call KMOD_template,USB_EHCI_HCD,usb-ehci,\
+	$(MODULES_DIR)/kernel/drivers/usb/host/ehci-hcd \
+,60))
+
+USB_ACM_MODULES = drivers/usb/class/cdc-acm
+USB_PRINTER_MODULES = drivers/usb/class/usblp
+
+$(eval $(call KMOD_template,USB_ACM,usb-acm,\
+	$(foreach mod,$(USB_ACM_MODULES),$(MODULES_DIR)/kernel/$(mod)) \
+,70))
+
+$(eval $(call KMOD_template,USB_HID,usb-hid,\
+	$(MODULES_DIR)/kernel/drivers/hid/usbhid/usbhid \
+,60))
+
+$(eval $(call KMOD_template,USB_PRINTER,usb-printer,\
+	$(foreach mod,$(USB_PRINTER_MODULES),$(MODULES_DIR)/kernel/$(mod)) \
+,60))
+
+$(eval $(call KMOD_template,USB_SERIAL,usb-serial,\
+	$(MODULES_DIR)/kernel/drivers/usb/serial/usbserial \
+,60))
+
+$(eval $(call KMOD_template,USB_SERIAL_BELKIN,usb-serial-belkin,\
+	$(MODULES_DIR)/kernel/drivers/usb/serial/belkin_sa \
+,61))
+
+$(eval $(call KMOD_template,USB_SERIAL_FTDI_SIO,usb-serial-ftdi,\
+	$(MODULES_DIR)/kernel/drivers/usb/serial/ftdi_sio \
+,61))
+
+$(eval $(call KMOD_template,USB_SERIAL_MCT_U232,usb-serial-mct-u232,\
+	$(MODULES_DIR)/kernel/drivers/usb/serial/mct_u232 \
+,61))
+
+$(eval $(call KMOD_template,USB_SERIAL_PL2303,usb-serial-pl2303,\
+	$(MODULES_DIR)/kernel/drivers/usb/serial/pl2303 \
+,61))
+
+$(eval $(call KMOD_template,USB_SERIAL_VISOR,usb-serial-visor,\
+	$(MODULES_DIR)/kernel/drivers/usb/serial/visor \
+,61))
+
+$(eval $(call KMOD_template,USB_STORAGE,usb-storage,\
+	$(MODULES_DIR)/kernel/drivers/usb/storage/usb-storage \
+,65))
+
+$(eval $(call KMOD_template,USB_PEGASUS,usb-pegasus,\
+	$(MODULES_DIR)/kernel/drivers/net/usb/pegasus \
+,65))
+
+#
+# Bluetooth
+#
+BLUETOOTH_PREFIX = BT
+BLUETOOTH = bluetooth
+
+$(eval $(call KMOD_template,$(BLUETOOTH_PREFIX),bluetooth,\
+	$(MODULES_DIR)/kernel/net/bluetooth/$(BLUETOOTH) \
+,70))
+
+$(eval $(call KMOD_template,$(BLUETOOTH_PREFIX)_HCIUSB,bluetooth-hci-usb,\
+	$(MODULES_DIR)/kernel/drivers/bluetooth/hci_usb \
+,75))
+
+$(eval $(call KMOD_template,$(BLUETOOTH_PREFIX)_HCIUART,bluetooth-hci-uart,\
+	$(MODULES_DIR)/kernel/drivers/bluetooth/hci_uart \
+,75))
+
+$(eval $(call KMOD_template,$(BLUETOOTH_PREFIX)_L2CAP,bluetooth-l2cap,\
+	$(MODULES_DIR)/kernel/net/bluetooth/l2cap \
+,80))
+
+$(eval $(call KMOD_template,$(BLUETOOTH_PREFIX)_SCO,bluetooth-sco,\
+	$(MODULES_DIR)/kernel/net/bluetooth/sco \
+,85))
+
+$(eval $(call KMOD_template,$(BLUETOOTH_PREFIX)_BNEP,bluetooth-bnep,\
+	$(MODULES_DIR)/kernel/net/bluetooth/bnep/bnep \
+,85))
+
+$(eval $(call KMOD_template,$(BLUETOOTH_PREFIX)_RFCOMM,bluetooth-rfcomm,\
+	$(MODULES_DIR)/kernel/net/bluetooth/rfcomm/rfcomm \
+,85))
+
+#
+# Misc devices
+#
+SOFTDOG_MODULES = drivers/char/watchdog/softdog
+
+$(eval $(call KMOD_template,SOFTDOG,softdog,\
+	$(foreach mod,$(SOFTDOG_MODULES),$(MODULES_DIR)/kernel/$(mod)) \
+,95))
+
+$(eval $(call KMOD_template,FW_LOADER,fw-loader,\
+	$(MODULES_DIR)/kernel/drivers/base/firmware_class \
+,01))
+
+$(eval $(call KMOD_template,EEPROM_93CX6,eeprom-93cx6,\
+	$(MODULES_DIR)/kernel/drivers/misc/eeprom/eeprom_93cx6 \
+,05))
+
+$(eval $(call KMOD_template,LEDS_CLASS,led-class,\
+	$(MODULES_DIR)/kernel/drivers/leds/led-class \
+,05))
+
+#
+# NLS
+#
+$(eval $(call KMOD_template,NLS,nls-base,\
+	$(MODULES_DIR)/kernel/fs/nls/nls_base \
+,10))
+
+$(eval $(call KMOD_template,NLS_CODEPAGE_437,nls-cp437,\
+	$(MODULES_DIR)/kernel/fs/nls/nls_cp437 \
+,20))
+
+$(eval $(call KMOD_template,NLS_CODEPAGE_737,nls-cp737,\
+	$(MODULES_DIR)/kernel/fs/nls/nls_cp737 \
+,20))
+
+$(eval $(call KMOD_template,NLS_CODEPAGE_775,nls-cp775,\
+	$(MODULES_DIR)/kernel/fs/nls/nls_cp775 \
+,20))
+
+$(eval $(call KMOD_template,NLS_CODEPAGE_850,nls-cp850,\
+	$(MODULES_DIR)/kernel/fs/nls/nls_cp850 \
+,20))
+
+$(eval $(call KMOD_template,NLS_CODEPAGE_852,nls-cp852,\
+	$(MODULES_DIR)/kernel/fs/nls/nls_cp852 \
+,20))
+
+$(eval $(call KMOD_template,NLS_CODEPAGE_857,nls-cp857,\
+	$(MODULES_DIR)/kernel/fs/nls/nls_cp857 \
+,20))
+
+$(eval $(call KMOD_template,NLS_CODEPAGE_860,nls-cp860,\
+	$(MODULES_DIR)/kernel/fs/nls/nls_cp860 \
+,20))
+
+$(eval $(call KMOD_template,NLS_CODEPAGE_861,nls-cp861,\
+	$(MODULES_DIR)/kernel/fs/nls/nls_cp861 \
+,20))
+
+$(eval $(call KMOD_template,NLS_CODEPAGE_862,nls-cp862,\
+	$(MODULES_DIR)/kernel/fs/nls/nls_cp862 \
+,20))
+
+$(eval $(call KMOD_template,NLS_CODEPAGE_863,nls-cp863,\
+	$(MODULES_DIR)/kernel/fs/nls/nls_cp863 \
+,20))
+
+$(eval $(call KMOD_template,NLS_CODEPAGE_864,nls-cp864,\
+	$(MODULES_DIR)/kernel/fs/nls/nls_cp864 \
+,20))
+
+$(eval $(call KMOD_template,NLS_CODEPAGE_865,nls-cp865,\
+	$(MODULES_DIR)/kernel/fs/nls/nls_cp865 \
+,20))
+
+$(eval $(call KMOD_template,NLS_CODEPAGE_866,nls-cp866,\
+	$(MODULES_DIR)/kernel/fs/nls/nls_cp866 \
+,20))
+
+$(eval $(call KMOD_template,NLS_CODEPAGE_869,nls-cp869,\
+	$(MODULES_DIR)/kernel/fs/nls/nls_cp869 \
+,20))
+
+NLS_CODEPAGE_874_MODULES := fs/nls/nls_cp874
+
+$(eval $(call KMOD_template,NLS_CODEPAGE_874,nls-cp874,\
+	$(foreach mod,$(NLS_CODEPAGE_874_MODULES),$(MODULES_DIR)/kernel/$(mod)) \
+,20))
+
+NLS_CODEPAGE_932_MODULES := fs/nls/nls_cp932
+NLS_CODEPAGE_932_MODULES += fs/nls/nls_euc-jp
+
+$(eval $(call KMOD_template,NLS_CODEPAGE_932,nls-cp932,\
+	$(foreach mod,$(NLS_CODEPAGE_932_MODULES),$(MODULES_DIR)/kernel/$(mod)) \
+,20))
+
+NLS_CODEPAGE_936_MODULES := fs/nls/nls_cp936
+
+$(eval $(call KMOD_template,NLS_CODEPAGE_936,nls-cp936,\
+	$(foreach mod,$(NLS_CODEPAGE_936_MODULES),$(MODULES_DIR)/kernel/$(mod)) \
+,20))
+
+NLS_CODEPAGE_949_MODULES := fs/nls/nls_cp949
+
+$(eval $(call KMOD_template,NLS_CODEPAGE_949,nls-cp949,\
+	$(foreach mod,$(NLS_CODEPAGE_949_MODULES),$(MODULES_DIR)/kernel/$(mod)) \
+,20))
+
+NLS_CODEPAGE_950_MODULES := fs/nls/nls_cp950
+
+$(eval $(call KMOD_template,NLS_CODEPAGE_950,nls-cp950,\
+	$(foreach mod,$(NLS_CODEPAGE_950_MODULES),$(MODULES_DIR)/kernel/$(mod)) \
+,20))
+
+$(eval $(call KMOD_template,NLS_CODEPAGE_1250,nls-cp1250,\
+	$(MODULES_DIR)/kernel/fs/nls/nls_cp1250 \
+,20))
+
+$(eval $(call KMOD_template,NLS_CODEPAGE_1251,nls-cp1251,\
+	$(MODULES_DIR)/kernel/fs/nls/nls_cp1251 \
+,20))
+
+$(eval $(call KMOD_template,NLS_ASCII,nls-ascii, \
+	$(MODULES_DIR)/kernel/fs/nls/nls_ascii \
+,20))
+
+$(eval $(call KMOD_template,NLS_ISO8859_1,nls-iso8859-1, \
+	$(MODULES_DIR)/kernel/fs/nls/nls_iso8859-1 \
+,20))
+
+$(eval $(call KMOD_template,NLS_ISO8859_2,nls-iso8859-2, \
+	$(MODULES_DIR)/kernel/fs/nls/nls_iso8859-2 \
+,20))
+
+$(eval $(call KMOD_template,NLS_ISO8859_3,nls-iso8859-3, \
+	$(MODULES_DIR)/kernel/fs/nls/nls_iso8859-3 \
+,20))
+
+$(eval $(call KMOD_template,NLS_ISO8859_4,nls-iso8859-4, \
+	$(MODULES_DIR)/kernel/fs/nls/nls_iso8859-4 \
+,20))
+
+$(eval $(call KMOD_template,NLS_ISO8859_5,nls-iso8859-5, \
+	$(MODULES_DIR)/kernel/fs/nls/nls_iso8859-5 \
+,20))
+
+$(eval $(call KMOD_template,NLS_ISO8859_6,nls-iso8859-6, \
+	$(MODULES_DIR)/kernel/fs/nls/nls_iso8859-6 \
+,20))
+
+$(eval $(call KMOD_template,NLS_ISO8859_7,nls-iso8859-7, \
+	$(MODULES_DIR)/kernel/fs/nls/nls_iso8859-7 \
+,20))
+
+NLS_ISO8859_8_MODULES := fs/nls/nls_cp1255
+
+$(eval $(call KMOD_template,NLS_ISO8859_8,nls-iso8859-8, \
+	$(foreach mod,$(NLS_ISO8859_8_MODULES),$(MODULES_DIR)/kernel/$(mod)) \
+,20))
+
+$(eval $(call KMOD_template,NLS_ISO8859_9,nls-iso8859-9, \
+	$(MODULES_DIR)/kernel/fs/nls/nls_iso8859-9 \
+,20))
+
+$(eval $(call KMOD_template,NLS_ISO8859_13,nls-iso8859-13, \
+	$(MODULES_DIR)/kernel/fs/nls/nls_iso8859-13 \
+,20))
+
+$(eval $(call KMOD_template,NLS_ISO8859_14,nls-iso8859-14, \
+	$(MODULES_DIR)/kernel/fs/nls/nls_iso8859-14 \
+,20))
+
+$(eval $(call KMOD_template,NLS_ISO8859_15,nls-iso8859-15, \
+	$(MODULES_DIR)/kernel/fs/nls/nls_iso8859-15 \
+,20))
+
+$(eval $(call KMOD_template,NLS_KOI8_R,nls-koi8-r, \
+	$(MODULES_DIR)/kernel/fs/nls/nls_koi8-r \
+,20))
+
+$(eval $(call KMOD_template,NLS_KOI8_U,nls-koi8-u, \
+	$(MODULES_DIR)/kernel/fs/nls/nls_koi8-u \
+	$(MODULES_DIR)/kernel/fs/nls/nls_koi8-ru \
+,20))
+
+$(eval $(call KMOD_template,NLS_UTF8,nls-utf8, \
+	$(MODULES_DIR)/kernel/fs/nls/nls_utf8 \
+,20))
+
+# ISDN
+ISDN_MODULES=drivers/isdn/i4l/isdn
+
+$(eval $(call KMOD_template,ISDN,isdn, \
+	$(foreach mod,$(ISDN_MODULES),$(MODULES_DIR)/kernel/$(mod)) \
+,60))
+
+$(eval $(call KMOD_template,ISDN_CAPI,isdn-capi, \
+	$(MODULES_DIR)/kernel/drivers/isdn/capi/kernelcapi \
+	$(MODULES_DIR)/kernel/drivers/isdn/capi/capi \
+,60))
+
+$(eval $(call KMOD_template,SLHC,slhc, \
+	$(MODULES_DIR)/kernel/drivers/net/slhc \
+,65))
+
+$(eval $(call KMOD_template,HISAX,hisax, \
+	$(MODULES_DIR)/kernel/drivers/isdn/hisax/hisax \
+,70))
+
+MISDN_MODULES=drivers/isdn/hardware/mISDN/mISDN_core
+MISDN_MODULES+=drivers/isdn/hardware/mISDN/mISDN_l1
+MISDN_MODULES+=drivers/isdn/hardware/mISDN/mISDN_l2
+MISDN_MODULES+=drivers/isdn/hardware/mISDN/mISDN_dsp
+MISDN_MODULES+=drivers/isdn/hardware/mISDN/mISDN_dtmf
+MISDN_MODULES+=drivers/isdn/hardware/mISDN/mISDN_isac
+MISDN_MODULES+=drivers/isdn/hardware/mISDN/mISDN_x25dte
+MISDN_MODULES+=drivers/isdn/hardware/mISDN/l3udss1
+
+$(eval $(call KMOD_template,MISDN_DRV,misdn, \
+	$(foreach mod, $(MISDN_MODULES),$(MODULES_DIR)/kernel/$(mod)) \
+,75))
+
+$(eval $(call KMOD_template,MISDN_AVM_FRITZ,misdn-avm, \
+	$(MODULES_DIR)/kernel/drivers/isdn/hardware/mISDN/avmfritz \
+,80))
+
+$(eval $(call KMOD_template,MISDN_HFCPCI,misdn-hfc-pci, \
+	$(MODULES_DIR)/kernel/drivers/isdn/hardware/mISDN/hfcpci \
+,80))
+
+$(eval $(call KMOD_template,MISDN_HFCMULTI,misdn-hfc-multi, \
+	$(MODULES_DIR)/kernel/drivers/isdn/hardware/mISDN/hfcmulti \
+,80))
+
+$(eval $(call KMOD_template,MISDN_HFCMINI,misdn-hfc-minipci, \
+	$(MODULES_DIR)/kernel/drivers/isdn/hardware/mISDN/hfcsmini \
+,80))
+
+$(eval $(call KMOD_template,MISDN_XHFC,misdn-xhfc, \
+	$(MODULES_DIR)/kernel/drivers/isdn/hardware/mISDN/xhfc \
+,80))
+
+$(eval $(call KMOD_template,MISDN_SPEEDFAX,misdn-speedfax, \
+	$(MODULES_DIR)/kernel/drivers/isdn/hardware/mISDN/sedlfax \
+,80))
+
+# Library modules
+$(eval $(call KMOD_template,CRC_CCITT,crc-ccitt, \
+	$(MODULES_DIR)/kernel/lib/crc-ccitt \
+,01))
+
+$(eval $(call KMOD_template,CRC_ITU_T,crc-itu-t, \
+	$(MODULES_DIR)/kernel/lib/crc-itu-t \
+,01))
+
+$(eval $(call KMOD_template,CRC32,crc32, \
+	$(MODULES_DIR)/kernel/lib/crc32 \
+,01))
+
+$(eval $(call KMOD_template,LIBCRC32C,libcrc32c, \
+	$(MODULES_DIR)/kernel/lib/libcrc32c \
+,01))
+
+#
+# parallel port support
+
+$(eval $(call KMOD_template,LP,lp,\
+	$(MODULES_DIR)/kernel/drivers/char/lp \
+,60))
+
+$(eval $(call KMOD_template,PPDEV,ppdev,\
+	$(MODULES_DIR)/kernel/drivers/char/ppdev \
+,60))
+
+$(eval $(call KMOD_template,PARPORT,parport,\
+	$(MODULES_DIR)/kernel/drivers/parport/parport \
+,50))
+
+$(eval $(call KMOD_template,PLIP,plip,\
+	$(MODULES_DIR)/kernel/drivers/net/plip \
+,51))

+ 212 - 0
mk/package.mk

@@ -0,0 +1,212 @@
+# $Id$
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+all: build-all-ipkgs
+
+TCFLAGS:=		${TARGET_CFLAGS}
+TCXXFLAGS:=		${TARGET_CFLAGS}
+TCPPFLAGS:=		${TARGET_CPPFLAGS}
+ifneq ($(DEBUG),1)
+TCPPFLAGS+=		-DNDEBUG
+endif
+TLDFLAGS:=		${TARGET_LDFLAGS} -Wl,-rpath -Wl,/usr/lib \
+			-Wl,-rpath-link -Wl,${STAGING_DIR}/usr/lib \
+			-L${STAGING_DIR}/lib -L${STAGING_DIR}/usr/lib
+ifeq ($(DEBUG),1)
+CONFIGURE_ARGS+=	--enable-debug
+else
+CONFIGURE_ARGS+=	--disable-debug
+endif
+ifeq ($(ADK_IPV6),y)
+CONFIGURE_ARGS+=	--enable-ipv6
+else
+CONFIGURE_ARGS+=	--disable-ipv6
+endif
+CONFIGURE_ENV+=		${TARGET_CONFIGURE_OPTS} \
+			${HOST_CONFIGURE_OPTS} \
+			CC='${TARGET_CC}' CXX='${TARGET_CXX}' \
+			CFLAGS='$(strip ${TCFLAGS})' \
+			CXXFLAGS='$(strip ${TCXXFLAGS})' \
+			CPPFLAGS='$(strip ${TCPPFLAGS})' \
+			LDFLAGS='$(strip ${TLDFLAGS})' \
+			PKG_CONFIG_PATH='${STAGING_DIR}/usr/lib/pkgconfig' \
+			PKG_CONFIG_LIBDIR=/dev/null \
+			CONFIG_SHELL='$(strip ${SHELL})' \
+			ac_cv_func_realloc_0_nonnull=yes \
+			ac_cv_func_malloc_0_nonnull=yes
+MAKE_FILE?=		Makefile
+# this is environment for 'make all' and 'make install'
+MAKE_ENV?=
+# this is arguments for 'make all' and 'make install'
+XAKE_FLAGS?=
+# this is arguments for 'make all' ONLY
+MAKE_FLAGS?=
+# this is arguments for 'make install' ONLY
+FAKE_FLAGS?=
+ALL_TARGET?=		all
+INSTALL_TARGET?=	install
+MAKE_ENV+=		PATH='${TARGET_PATH}' \
+			${HOST_CONFIGURE_OPTS} \
+			WRKDIR='${WRKDIR}' WRKDIST='${WRKDIST}' \
+			WRKSRC='${WRKSRC}' WRKBUILD='${WRKBUILD}' \
+			PKG_CONFIG_PATH='${STAGING_DIR}/usr/lib/pkgconfig' \
+			PKG_CONFIG_LIBDIR=/dev/null \
+			CC='${TARGET_CC}' CXX='${TARGET_CXX}' \
+			AR='${TARGET_CROSS}ar' RANLIB='${TARGET_CROSS}ranlib' \
+			NM='${TARGET_CROSS}nm' \
+			CFLAGS='$(strip ${TCFLAGS})' \
+			CXXFLAGS='$(strip ${TCXXFLAGS})' \
+			CPPFLAGS='$(strip ${TCPPFLAGS})' \
+			LDFLAGS='$(strip ${TLDFLAGS})'
+MAKE_FLAGS+=		${XAKE_FLAGS}
+FAKE_FLAGS+=		${XAKE_FLAGS}
+
+ifeq ($(strip ${WRKDIR_BSD}),)
+WRKDIR_BASE:=		${BUILD_DIR}
+else
+WRKDIR_BASE:=		$(shell pwd)
+endif
+
+_EXTRACT_COOKIE=	${WRKDIST}/.extract_done
+_PATCH_COOKIE=		${WRKDIST}/.prepared
+_CONFIGURE_COOKIE=	${WRKBUILD}/.configure_done
+_BUILD_COOKIE=		${WRKBUILD}/.build_done
+_FAKE_COOKIE=		${WRKINST}/.fake_done
+_IPKGS_COOKIE=		${PACKAGE_DIR}/.stamps/${PKG_NAME}${PKG_VERSION}-${PKG_RELEASE}
+
+_IN_PACKAGE:=		1
+include ${TOPDIR}/mk/buildhlp.mk
+-include info.mk
+
+# defined in buildhlp.mk ('extract' can fail, use 'patch' then)
+extract: ${_EXTRACT_COOKIE}
+patch: ${_PATCH_COOKIE}
+
+# defined below (will be moved to pkg-bottom.mk!)
+configure: ${_CONFIGURE_COOKIE}
+build: ${_BUILD_COOKIE}
+fake: ${_FAKE_COOKIE}
+
+# our recursive build entry point
+build-all-ipkgs: ${_IPKGS_COOKIE}
+
+define PKG_template
+IPKG_$(1)=	$(PACKAGE_DIR)/$(2)_$(3)_$(4).ipk
+IDIR_$(1)=	$(WRKDIR)/fake-${ARCH}/ipkg-$(2)
+ifneq (${ADK_PACKAGE_$(1)}${DEVELOPER},)
+ALL_IPKGS+=	$$(IPKG_$(1))
+ALL_IDIRS+=	$${IDIR_$(1)}
+endif
+INFO_$(1)=	$(IPKG_STATE_DIR)/info/$(2).list
+
+ifeq ($(ADK_PACKAGE_$(1)),y)
+install-targets: $$(INFO_$(1))
+endif
+
+IDEPEND_$(1):=	$$(strip $(5))
+
+_ALL_CONTROLS+=	$$(IDIR_$(1))/CONTROL/control
+ICONTROL_$(1)?=	ipkg/$(2).control
+$$(IDIR_$(1))/CONTROL/control: ${_PATCH_COOKIE}
+	${BASH} ${SCRIPT_DIR}/make-ipkg-dir.sh $${IDIR_$(1)} $${ICONTROL_$(1)} $(3) $(4)
+	@adeps='$$(strip $${IDEPEND_$(1)})'; if [[ -n $$$$adeps ]]; then \
+		comma=; \
+		deps=; \
+		last=; \
+		for dep in $$$$adeps; do \
+			if [[ $$$$last = kernel && $$$$dep = \(* ]]; then \
+				deps="$$$$deps $$$$dep"; \
+			else \
+				deps="$$$$deps$$$$comma$$$$dep"; \
+			fi; \
+			comma=", "; \
+			last=$$$$dep; \
+		done; \
+		echo "Depends: $$$$deps" >>$${IDIR_$(1)}/CONTROL/control; \
+	fi
+	for file in conffiles preinst postinst prerm postrm; do \
+		[ ! -f ./ipkg/$(2).$$$$file ] || cp ./ipkg/$(2).$$$$file $$(IDIR_$(1))/CONTROL/$$$$file; \
+	done
+ifneq ($(strip $${ICONTROL_ADDON_$(1)}),)
+	echo $${ICONTROL_ADDON_$(1)} >> $${IDIR_$(1)}/CONTROL/control
+endif
+
+$$(IPKG_$(1)): $$(IDIR_$(1))/CONTROL/control $${_FAKE_COOKIE}
+ifneq ($(DEBUG),1)
+	$${RSTRIP} $${IDIR_$(1)} $(MAKE_TRACE)
+endif
+	cd $${IDIR_$(1)}; for script in etc/init.d/*; do \
+		[[ -e $$$$script ]] || continue; \
+		chmod 0755 "$$$$script"; \
+	done
+	@mkdir -p $${PACKAGE_DIR} '$${STAGING_PARENT}/pkg' \
+	    '$${STAGING_DIR}/scripts'
+	@if test -s '$${STAGING_PARENT}/pkg/$(1)'; then \
+		cd '$${STAGING_DIR}'; \
+		while read fn; do \
+			rm -f "$$$$fn"; \
+		done <'$${STAGING_PARENT}/pkg/$(1)'; \
+	fi
+	@rm -f '$${STAGING_PARENT}/pkg/$(1)'
+	@cd $${IDIR_$(1)}; \
+	    x=$$$$(find tmp var -mindepth 1 2>/dev/null); if [[ -n $$$$x ]]; then \
+		echo 'WARNING: $${IPKG_$(1)} installs files into a' \
+		    'ramdisk location:' >&2; \
+		echo "$$$$x" | sed 's/^/- /' >&2; \
+	    fi; \
+	    if [ "${PKG_NAME}" != "uClibc" -a "${PKG_NAME}" != "glibc" -a "${PKG_NAME}" != "libpthread" -a "${PKG_NAME}" != "libstdcxx" -a "${PKG_NAME}" != "libthread-db" ];then \
+	    find lib \( -name lib\*.so\* -o -name lib\*.a \) \
+	    	-exec echo 'WARNING: $${IPKG_$(1)} installs files in /lib -' \
+		' fix this!' >&2 \; -quit 2>/dev/null; fi; \
+	    find usr ! -type d 2>/dev/null | \
+	    grep -v -e '^usr/share' -e '^usr/man' -e '^usr/info' | \
+	    tee '$${STAGING_PARENT}/pkg/$(1)' | \
+	    cpio -apdlmu --quiet '$${STAGING_DIR}'
+	@cd '$${STAGING_DIR}'; grep 'usr/lib/.*\.la$$$$' \
+	    '$${STAGING_PARENT}/pkg/$(1)' | while read fn; do \
+		chmod u+w $$$$fn; \
+		printf '%s\nwq\n' '/^libdir='\''*/s##&${STAGING_DIR}#' | \
+		    ed -s $$$$fn; \
+	done; grep 'usr/s*bin/' '$${STAGING_PARENT}/pkg/$(1)' | \
+	    while read fn; do \
+		b="$$$$(dd if="$$$$fn" bs=2 count=1 2>/dev/null)"; \
+		[[ $$$$b = '#!' ]] || continue; \
+		cp "$$$$fn" scripts/; \
+		echo "scripts/$$$$(basename "$$$$fn")" \
+		    >>'$${STAGING_PARENT}/pkg/$(1)'; \
+	done
+	$${IPKG_BUILD} $${IDIR_$(1)} $${PACKAGE_DIR} $(MAKE_TRACE)
+
+clean-targets: clean-dev-$(1)
+
+clean-dev-$(1):
+	@if test -s '$${STAGING_PARENT}/pkg/$(1)'; then \
+		cd '$${STAGING_DIR}'; \
+		while read fn; do \
+			rm -f "$$$$fn"; \
+		done <'$${STAGING_PARENT}/pkg/$(1)'; \
+	fi
+	@rm -f '$${STAGING_PARENT}/pkg/$(1)'
+
+$$(INFO_$(1)): $$(IPKG_$(1))
+	$(IPKG) install $$(IPKG_$(1))
+endef
+
+install-targets:
+install:
+	@$(CMD_TRACE) "installing... "
+	@$(MAKE) install-targets $(MAKE_TRACE)
+
+clean-targets:
+clean:
+	@$(CMD_TRACE) "cleaning... "
+	@$(MAKE) clean-targets $(MAKE_TRACE)
+	rm -rf ${WRKDIR} ${ALL_IPKGS} ${PACKAGE_DIR}/.stamps/${PKG_NAME}*
+
+distclean: clean
+	rm -f ${FULLDISTFILES}
+
+.PHONY:	all refetch extract patch configure \
+	build fake package install clean build-all-ipkgs

+ 212 - 0
mk/pkg-bottom.mk

@@ -0,0 +1,212 @@
+# $Id$
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+#-
+# Comments:
+# * pre/do/post-foo are always defined here, but empty. This is so
+#   that we can call it (BSD make has .if target(foo) but GNU not)
+#   and it won't error out.
+# * ${_foo_COOKIE} are the actual targets
+# * default is "manual" -> define a do-foo: target in the Makefile
+# * if you have a style -> define a pre-foo: and post-foo: if they
+#   are required, but the do-foo: magic is done here
+# * we want to use styles (configure:gnu, build/install:auto), for
+#   making the Makefiles of the packages more clear
+
+#--- configure
+pre-configure:
+do-configure:
+post-configure:
+${_CONFIGURE_COOKIE}: ${_PATCH_COOKIE}
+	mkdir -p ${WRKBUILD}
+	@${MAKE} pre-configure $(MAKE_TRACE)
+
+ifneq ($(filter autotool,${CONFIGURE_STYLE}),)
+	cd ${WRKBUILD}; \
+	    autoreconf -vif $(MAKE_TRACE)
+endif
+ifneq ($(filter autoconf,${CONFIGURE_STYLE}),)
+	cd ${WRKBUILD}; \
+	    autoconf $(MAKE_TRACE)
+endif
+ifneq ($(filter gnu,${CONFIGURE_STYLE}),)
+	@$(CMD_TRACE) "configuring... "
+	@cd ${WRKBUILD}; \
+	    for i in $$(find . -name config.sub);do \
+		if [ -f $$i ]; then \
+			${CP} $$i $$i.bak; \
+			${CP} ${SCRIPT_DIR}/config.sub $$i; \
+		fi; \
+	    done; \
+	    for i in $$(find . -name config.guess);do \
+		if [ -f $$i ]; then \
+			${CP} $$i $$i.bak; \
+			${CP} ${SCRIPT_DIR}/config.guess $$i; \
+		fi; \
+	    done;
+	cd ${WRKBUILD}; rm -f config.{cache,status}; \
+	    env ${CONFIGURE_ENV} \
+	    ${BASH} ${WRKSRC}/configure \
+	    --build=${GNU_HOST_NAME} \
+	    --host=${GNU_TARGET_NAME} \
+	    --target=${GNU_TARGET_NAME} \
+	    --program-prefix= \
+	    --program-suffix= \
+	    --prefix=/usr \
+	    --datadir=/usr/share \
+	    --mandir=/usr/share/man \
+	    --libexecdir=/usr/sbin \
+	    --localstatedir=/var \
+	    --sysconfdir=/etc \
+	    --disable-nls \
+	    --enable-shared \
+	    --enable-static \
+	    --disable-dependency-tracking \
+	    --disable-libtool-lock \
+	    ${CONFIGURE_ARGS} $(MAKE_TRACE)
+else ifeq ($(filter-out manual,${CONFIGURE_STYLE}),)
+	env ${CONFIGURE_ENV} ${MAKE} do-configure $(MAKE_TRACE)
+else
+	@echo "Invalid CONFIGURE_STYLE '${CONFIGURE_STYLE}'" >&2
+	@exit 1
+endif
+	@${MAKE} post-configure $(MAKE_TRACE)
+	touch $@
+
+#--- build
+pre-build:
+do-build:
+post-build:
+${_BUILD_COOKIE}: ${_CONFIGURE_COOKIE}
+	@env ${MAKE_ENV} ${MAKE} pre-build $(MAKE_TRACE)
+	@$(CMD_TRACE) "compiling... "
+ifneq ($(filter auto,${BUILD_STYLE}),)
+	cd ${WRKBUILD} && env ${MAKE_ENV} ${MAKE} -f ${MAKE_FILE} \
+	    ${MAKEJOBS} ${MAKE_FLAGS} ${ALL_TARGET} $(MAKE_TRACE)
+else ifneq ($(filter manual,${BUILD_STYLE}),)
+	env ${MAKE_ENV} ${MAKE} do-build $(MAKE_TRACE)
+else ifeq ($(strip ${BUILD_STYLE}),)
+	env ${MAKE_ENV} ${MAKE} do-build $(MAKE_TRACE)
+else
+	@echo "Invalid BUILD_STYLE '${BUILD_STYLE}'" >&2
+	@exit 1
+endif
+	@env ${MAKE_ENV} ${MAKE} post-build $(MAKE_TRACE)
+	touch $@
+
+#--- fake
+pre-install:
+do-install:
+post-install:
+${_FAKE_COOKIE}: ${_BUILD_COOKIE}
+	-rm -f ${_ALL_CONTROLS}
+	@mkdir -p '${STAGING_PARENT}/pkg' ${WRKINST} '${STAGING_DIR}/scripts'
+	@${MAKE} ${_ALL_CONTROLS} $(MAKE_TRACE)
+	@env ${MAKE_ENV} ${MAKE} pre-install $(MAKE_TRACE)
+ifneq ($(filter auto,${INSTALL_STYLE}),)
+	cd ${WRKBUILD} && env ${MAKE_ENV} ${MAKE} -f ${MAKE_FILE} \
+	    DESTDIR='${WRKINST}' ${FAKE_FLAGS} ${INSTALL_TARGET} $(MAKE_TRACE)
+else ifneq ($(filter manual,${INSTALL_STYLE}),)
+	env ${MAKE_ENV} ${MAKE} do-install $(MAKE_TRACE)
+else ifeq ($(strip ${INSTALL_STYLE}),)
+	env ${MAKE_ENV} ${MAKE} do-install $(MAKE_TRACE)
+else
+	@echo "Invalid INSTALL_STYLE '${INSTALL_STYLE}'" >&2
+	@exit 1
+endif
+ifneq ($(filter confprog,${INSTALL_STYLE}),)
+	for a in ${WRKINST}/usr/{bin/*-config,lib/pkgconfig/*.pc}; do \
+		[[ -e $$a ]] || continue; \
+		$(SED) "s,^prefix=.*,prefix=${STAGING_DIR}/usr," $$a; \
+	done
+endif
+	@env ${MAKE_ENV} ${MAKE} post-install $(MAKE_TRACE)
+	@if test -s '${STAGING_PARENT}/pkg/${PKG_NAME}'; then \
+		cd '${STAGING_DIR}'; \
+		while read fn; do \
+			rm -f "$$fn"; \
+		done <'${STAGING_PARENT}/pkg/${PKG_NAME}'; \
+	fi
+	@rm -f '${STAGING_PARENT}/pkg/${PKG_NAME}'
+	@cd ${WRKINST}; \
+	    if [ "${PKG_NAME}" != "uClibc" -a "${PKG_NAME}" != "glibc" -a "${PKG_NAME}" != "libpthread" -a "${PKG_NAME}" != "libstdcxx" -a "${PKG_NAME}" != "libthread-db" ];then \
+	    find lib \( -name lib\*.so\* -o -name lib\*.a \) \
+	    	-exec echo 'WARNING: ${PKG_NAME} installs files in /lib -' \
+		' fix this!' >&2 \; -quit 2>/dev/null; fi;\
+	    find usr ! -type d 2>/dev/null | \
+	    grep -v -e '^usr/share' -e '^usr/man' -e '^usr/info' | \
+	    tee '${STAGING_PARENT}/pkg/${PKG_NAME}' | \
+	    cpio -apdlmu --quiet '${STAGING_DIR}'
+	@cd '${STAGING_DIR}'; grep 'usr/lib/.*\.la$$' \
+	    '${STAGING_PARENT}/pkg/${PKG_NAME}' | while read fn; do \
+		chmod u+w $$fn; \
+		$(SED) "s,\(^libdir='\| \|-L\|^dependency_libs='\)/usr/lib,\1$(STAGING_DIR)/usr/lib,g" $$fn; \
+	done; grep 'usr/s*bin/' '${STAGING_PARENT}/pkg/${PKG_NAME}' | \
+	    while read fn; do \
+		b="$$(dd if="$$fn" bs=2 count=1 2>/dev/null)"; \
+		[[ $$b = '#!' ]] || continue; \
+		cp "$$fn" scripts/; \
+		echo "scripts/$$(basename "$$fn")" \
+		    >>'${STAGING_PARENT}/pkg/${PKG_NAME}'; \
+	done
+	touch $@
+
+#--- package
+${_IPKGS_COOKIE}:
+	@clean=0; \
+	for f in ${ALL_IPKGS}; do \
+		[[ -e $$f ]] && clean=1; \
+	done; \
+	[[ $$clean = 0 ]] || ${MAKE} clean
+	exec ${MAKE} package
+
+package: ${ALL_IPKGS}
+	@cd ${WRKDIR}/fake-${ARCH} || exit 1; \
+	y=; sp=; for x in ${ALL_IDIRS}; do \
+		y="$$y$$sp$${x#$(WRKDIR)/fake-${ARCH}/}"; \
+		sp=' '; \
+	done; ls=; ln=; x=1; [[ -z $$y ]] || \
+	    md5sum $$(find $$y -type f) | sed -e "s/*//" | \
+	    while read sum name; do \
+		inode=$$(ls -i "$$name"); \
+		echo "$$sum $${inode%% *} $$name"; \
+	    done | sort | while read sum inode name; do \
+		if [[ $$sum = $$ls ]]; then \
+			[[ $$li = $$inode ]] && continue; \
+			case $$x in \
+			1)	echo 'WARNING: duplicate files found in' \
+				    'package "${PKG_NAME}"! Fix them.' >&2; \
+				echo -n "> $$ln "; \
+				;; \
+			2)	echo -n "> $$ln "; \
+				;; \
+			3)	echo -n ' '; \
+				;; \
+			esac; \
+			echo -n "$$name"; \
+			x=3; \
+		else \
+			case $$x in \
+			3)	echo; \
+				x=2; \
+				;; \
+			esac; \
+		fi; \
+		ls=$$sum; \
+		ln=$$name; \
+		li=$$inode; \
+	done
+	touch ${_IPKGS_COOKIE}
+
+#--- clean
+clean-targets: clean-dev-generic
+
+clean-dev-generic:
+	@if test -s '${STAGING_PARENT}/pkg/${PKG_NAME}'; then \
+		cd '${STAGING_DIR}'; \
+		while read fn; do \
+			rm -f "$$fn"; \
+		done <'${STAGING_PARENT}/pkg/${PKG_NAME}'; \
+	fi
+	@rm -f '${STAGING_PARENT}/pkg/${PKG_NAME}'

+ 21 - 0
mk/rootfs.mk

@@ -0,0 +1,21 @@
+# $Id$
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+define rootfs_template
+ifeq ($(ADK_TARGET_ROOTFS_$(2)),y)
+FS:=$(1)
+FS_CMDLINE:=$(3)
+endif
+endef
+
+$(eval $(call rootfs_template,ext2-cf,EXT2_CF))
+$(eval $(call rootfs_template,ext2-mmc,EXT2_MMC))
+$(eval $(call rootfs_template,ext2,EXT2))
+$(eval $(call rootfs_template,initramfs,INITRAMFS))
+$(eval $(call rootfs_template,squashfs,SQUASHFS))
+$(eval $(call rootfs_template,yaffs,YAFFS))
+$(eval $(call rootfs_template,nfsroot,NFSROOT,root=/dev/nfs ip=dhcp))
+
+export FS

+ 10 - 0
mk/split-cfg.mk

@@ -0,0 +1,10 @@
+# $Id$
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+#-
+# must work with both BSD and GNU make
+
+${TOPDIR}/.cfg/ADK_HAVE_DOT_CONFIG: ${TOPDIR}/.config \
+    ${TOPDIR}/mk/split-cfg.mk ${TOPDIR}/scripts/split-cfg.sh
+	${BASH} ${TOPDIR}/scripts/split-cfg.sh '${TOPDIR}'

+ 6 - 0
mk/toolchain.mk

@@ -0,0 +1,6 @@
+prepare: ${WRKDIST}/.prepared $(WRKBUILD)/.headers
+configure: ${WRKBUILD}/.configure_done
+compile: $(WRKBUILD)/.compiled
+install: $(WRKBUILD)/.installed
+clean:
+	rm -rf $(WRKDIR)

+ 6 - 0
mk/tools.mk

@@ -0,0 +1,6 @@
+prepare: ${WRKDIST}/.prepared
+configure: ${WRKBUILD}/.configure_done
+compile: $(WRKBUILD)/.compiled
+install: $(WRKBUILD)/.installed
+clean:
+	rm -rf $(WRKDIR)

+ 120 - 0
mk/vars.mk

@@ -0,0 +1,120 @@
+# $Id$
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+CP=			cp -fpR
+INSTALL_DIR=		install -d -m0755
+INSTALL_DATA=		install -m0644
+INSTALL_BIN=		install -m0755
+INSTALL_SCRIPT=		install -m0755
+MAKEFLAGS=		$(EXTRA_MAKEFLAGS)
+BUILD_USER=		$(shell id -un)
+BUILD_GROUP=		$(shell id -gn)
+ifeq ($(DEBUG),1)
+TARGET_DEBUGGING:=	-g -O0 -fno-omit-frame-pointer
+else
+TARGET_DEBUGGING:=	-fomit-frame-pointer
+endif
+ifeq ($(ADK_SSP),y)
+TARGET_SSP:=		-fstack-protector-all
+endif
+TARGET_CFLAGS:=		$(TARGET_OPTIMIZATION) $(TARGET_CFLAGS_ARCH) $(TARGET_DEBUGGING) $(TARGET_SSP)
+
+BASE_DIR:=		$(TOPDIR)
+DISTDIR?=		${BASE_DIR}/dl
+BUILD_DIR:=		${BASE_DIR}/build_${CPU_ARCH}
+BUILD_DIR_PFX:=		$(BASE_DIR)/build_*
+STAGING_PARENT:=	${BASE_DIR}/cross_${CPU_ARCH}
+STAGING_PARENT_PFX:=	${BASE_DIR}/cross_*
+STAGING_TOOLS:=		${STAGING_PARENT}/host
+STAGING_DIR:=		${STAGING_PARENT}/target
+TOOLCHAIN_BUILD_DIR=	$(BASE_DIR)/toolchain_build_${CPU_ARCH}
+TOOLCHAIN_BUILD_DIR_PFX=$(BASE_DIR)/toolchain_build_*
+TOOLS_BUILD_DIR=	$(BASE_DIR)/tools_build
+SCRIPT_DIR:=		$(BASE_DIR)/scripts
+BIN_DIR:=		$(BASE_DIR)/bin_${DEVICE}
+BIN_DIR_PFX:=		$(BASE_DIR)/bin_*
+PACKAGE_DIR:=		$(BIN_DIR)/packages
+TARGET_DIR:=		$(BASE_DIR)/root_${DEVICE}
+TARGET_DIR_PFX:=	$(BASE_DIR)/root_*
+TARGET_PATH=		${SCRIPT_DIR}:${STAGING_TOOLS}/bin:${STAGING_DIR}/scripts:${_PATH}
+ifeq ($(ADK_TARGET_LIB_GLIBC),y)
+REAL_GNU_TARGET_NAME=	$(CPU_ARCH)-linux-gnu
+GNU_TARGET_NAME=	$(CPU_ARCH)-linux
+KERNEL_CROSS:=		$(STAGING_TOOLS)/bin/$(CPU_ARCH)-linux-gnu-
+TARGET_CROSS:=		$(STAGING_TOOLS)/bin/$(CPU_ARCH)-linux-gnu-
+else
+REAL_GNU_TARGET_NAME=	$(CPU_ARCH)-linux-uclibc
+GNU_TARGET_NAME=	$(CPU_ARCH)-linux
+KERNEL_CROSS:=		$(STAGING_TOOLS)/bin/$(CPU_ARCH)-linux-uclibc-
+TARGET_CROSS:=		$(STAGING_TOOLS)/bin/$(CPU_ARCH)-linux-uclibc-
+endif
+TOOLCHAIN_SYSROOT:=	$(TOOLCHAIN_BUILD_DIR)/libc_dev
+TARGET_COMPILER_PREFIX?=${TARGET_CROSS}
+TARGET_CC:=		${TARGET_COMPILER_PREFIX}gcc
+TARGET_CXX:=		${TARGET_COMPILER_PREFIX}g++
+TARGET_CPPFLAGS+=	-I${STAGING_DIR}/usr/include
+TARGET_LDFLAGS+=	-Wl,-O2
+PATCH=			${BASH} $(SCRIPT_DIR)/patch.sh
+SED:=			sed -i -e
+LINUX_DIR:=		$(BUILD_DIR)/linux
+
+TARGET_CONFIGURE_OPTS=	PATH='${TARGET_PATH}' \
+			AR=$(TARGET_CROSS)ar \
+			AS=$(TARGET_CROSS)as \
+			LD=$(TARGET_CROSS)ld \
+			NM=$(TARGET_CROSS)nm \
+			CC="$(TARGET_CC)" \
+			GCC="$(TARGET_CC)" \
+			CXX="$(TARGET_CXX)" \
+			RANLIB=$(TARGET_CROSS)ranlib
+HOST_CONFIGURE_OPTS=	CC_FOR_BUILD='${HOSTCC}' \
+			CFLAGS_FOR_BUILD='${HOSTCFLAGS}' \
+			CPPFLAGS_FOR_BUILD='${HOSTCPPFLAGS}' \
+			LDFLAGS_FOR_BUILD='${HOSTLDFLAGS}'
+
+# invoke ipkg-build with some default options
+IPKG_BUILD:=		PATH='${TARGET_PATH}' ${BASH} \
+			    ${TOPDIR}/scripts/ipkg-build -c -o 0 -g 0
+# where to build (and put) .ipk packages
+IPKG_TARGET_DIR:=	$(PACKAGE_DIR)
+IPKG:=			IPKG_TMP=$(BUILD_DIR)/tmp \
+			IPKG_INSTROOT=$(TARGET_DIR) \
+			IPKG_CONF_DIR=$(STAGING_DIR)/etc \
+			IPKG_OFFLINE_ROOT=$(TARGET_DIR) \
+			${BASH} ${SCRIPT_DIR}/ipkg -force-defaults -force-depends
+IPKG_STATE_DIR:=	$(TARGET_DIR)/usr/lib/ipkg
+
+RSTRIP:=		prefix='${TARGET_CROSS}' ${BASH} ${SCRIPT_DIR}/rstrip.sh
+
+EXTRACT_CMD=		mkdir -p ${WRKDIR}; \
+			cd ${WRKDIR} && \
+			for file in ${FULLDISTFILES}; do case $$file in \
+			*.cpio) \
+				cat $$file | cpio -i -d --quiet ;; \
+			*.tar) \
+				tar -xf $$file ;; \
+			*.cpio.Z | *.cpio.gz | *.cgz | *.mcz) \
+				gzip -dc $$file | cpio -i -d --quiet ;; \
+			*.tar.Z | *.tar.gz | *.taz | *.tgz) \
+				gzip -dc $$file | tar -xf - ;; \
+			*.cpio.bz2 | *.cbz) \
+				bzip2 -dc $$file | cpio -i -d --quiet ;; \
+			*.tar.bz2 | *.tbz | *.tbz2) \
+				bzip2 -dc $$file | tar -xf - ;; \
+			*.zip) \
+				unzip -d ${WRKDIR} $$file ;; \
+			*) \
+				echo "Cannot extract '$$file'" >&2; \
+				false ;; \
+			esac; done
+
+ifeq ($(VERBOSE),1)
+QUIET:=
+else
+QUIET:=			--quiet
+endif
+FETCH_CMD?=		wget -t1 --timeout=30 $(QUIET)
+
+include $(TOPDIR)/mk/mirrors.mk

+ 13 - 0
package/6tunnel/Config.in

@@ -0,0 +1,13 @@
+config ADK_PACKAGE_6TUNNEL
+	prompt "6tunnel........................... IPv4 / IPv6 tunnel proxy"
+	depends on ADK_IPV6
+	tristate
+	default n
+	select ADK_KPACKAGE_KMOD_IPV6
+	help
+	  6tunnel allows you to use services provided by IPv6 hosts with IPv4-only 
+	  applications and vice-versa. It can bind to any of your IPv4 (default) 
+	  or IPv6 addresses and forward all data to IPv4 or IPv6 (default) host.
+	  
+	  http://toxygen.net/6tunnel/
+

+ 29 - 0
package/6tunnel/Makefile

@@ -0,0 +1,29 @@
+# $Id$
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=		6tunnel
+PKG_VERSION:=		0.11rc1
+PKG_RELEASE:=		1
+PKG_MD5SUM:=		b325fa9d238e32195fbb3fc3646b0d28
+MASTER_SITES:=		http://toxygen.net/6tunnel/
+WRKDIST=		${WRKDIR}/$(PKG_NAME)-0.11
+
+include $(TOPDIR)/mk/package.mk
+
+$(eval $(call PKG_template,6TUNNEL,6tunnel,$(PKG_VERSION)-$(PKG_RELEASE),$(ARCH)))
+
+CONFIGURE_STYLE=	gnu
+CONFIGURE_ENV+=		ac_cv_path_STRIP=$(STRIP) \
+			ac_cv_func_vsnprintf=yes
+ALL_TARGET=		default
+BUILD_STYLE=		auto
+
+post-install:
+	$(INSTALL_DIR) $(IDIR_6TUNNEL)/usr/sbin
+	$(INSTALL_BIN) $(WRKBUILD)/6tunnel $(IDIR_6TUNNEL)/usr/sbin/
+
+include ${TOPDIR}/mk/pkg-bottom.mk

+ 4 - 0
package/6tunnel/ipkg/6tunnel.control

@@ -0,0 +1,4 @@
+Package: 6tunnel
+Priority: optional
+Section: net
+Description: An IPv4/IPv6 tunnel proxy

+ 489 - 0
package/Config.in

@@ -0,0 +1,489 @@
+# $Id$
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+menu "Package selection"
+
+comment "Package categories"
+
+
+menu "Applications"
+
+menu "Basesystem"
+source "package/base-files/Config.in"
+source "package/busybox/Config.in"
+source "package/uclibc/Config.in"
+source "package/cfgfs/Config.in"
+source "package/glibc/Config.in"
+endmenu
+
+menu "Bluetooth"
+source "package/bluez-firmware/Config.in"
+source "package/bluez/Config.in"
+source "package/miax/Config.in"
+source "package/obexftp/Config.in"
+source "package/openobex/Config.in"
+source "package/ussp-push/Config.in"
+endmenu
+
+menu "Browser"
+source "package/links/Config.in"
+source "package/elinks/Config.in"
+source "package/lynx/Config.in"
+endmenu
+
+menu "Debugging / Analyzing"
+source "package/exmap/Config.in"
+source "package/gdb/Config.in"
+source "package/gdbserver/Config.in"
+source "package/oprofile/Config.in"
+source "package/strace/Config.in"
+source "package/valgrind/Config.in"
+endmenu
+
+menu "Editors / Pager"
+source "package/less/Config.in"
+source "package/nano/Config.in"
+source "package/vim/Config.in"
+endmenu
+
+menu "Filesystem utilities"
+source "package/device-mapper/Config.in"
+source "package/dosfstools/Config.in"
+source "package/e2fsprogs/Config.in"
+source "package/fuse/Config.in"
+source "package/lvm/Config.in"
+source "package/util-linux/Config.in"
+source "package/wdfs/Config.in"
+source "package/xfsprogs/Config.in"
+endmenu
+
+
+menu "Mail"
+source "package/bogofilter/Config.in"
+source "package/dovecot/Config.in"
+source "package/fetchmail/Config.in"
+source "package/mini_sendmail/Config.in"
+source "package/mutt/Config.in"
+source "package/procmail/Config.in"
+source "package/ssmtp/Config.in"
+source "package/vilistextum/Config.in"
+endmenu
+
+menu "Misc"
+source "package/collectd/Config.in"
+source "package/deco/Config.in"
+source "package/digitemp/Config.in"
+source "package/gpm/Config.in"
+source "package/gpsd/Config.in"
+source "package/logrotate/Config.in"
+source "package/mc/Config.in"
+source "package/mgetty/Config.in"
+source "package/monit/Config.in"
+source "package/motion/Config.in"
+source "package/mysql/Config.in"
+source "package/osiris/Config.in"
+source "package/rrdtool/Config.in"
+source "package/rrdcollect/Config.in"
+source "package/sane-backends/Config.in"
+source "package/screen/Config.in"
+source "package/scsi-spin/Config.in"
+source "package/ser2net/Config.in"
+source "package/syslog-ng/Config.in"
+source "package/tar/Config.in"
+endmenu
+
+menu "Multimedia"
+source "package/alsa-utils/Config.in"
+source "package/esound/Config.in"
+source "package/ffmpeg/Config.in"
+source "package/gmediaserver/Config.in"
+source "package/icecast/Config.in"
+source "package/lame/Config.in"
+source "package/madplay/Config.in"
+source "package/moc/Config.in"
+source "package/mpd/Config.in"
+source "package/mplayer/Config.in"
+source "package/mt-daapd/Config.in"
+source "package/palantir/Config.in"
+source "package/setpwc/Config.in"
+endmenu
+
+menu "Shells"
+source "package/bash/Config.in"
+source "package/mksh/Config.in"
+source "package/zsh/Config.in"
+endmenu
+
+menu "Security"
+source "package/cryptsetup/Config.in"
+source "package/gpg/Config.in"
+source "package/heimdal/Config.in"
+source "package/krb5/Config.in"
+source "package/openct/Config.in"
+source "package/opensc/Config.in"
+source "package/openssl/Config.in"  # libopenssl
+source "package/openssl-pkcs11/Config.in"
+endmenu
+
+menu "Serial communications & terminal emulation"
+source "package/heyu/Config.in"
+source "package/lrzsz/Config.in"
+source "package/picocom/Config.in"
+source "package/serdisplib/Config.in"
+source "package/setserial/Config.in"
+endmenu
+
+menu "Telephony"
+source "package/asterisk/Config.in"
+source "package/opensips/Config.in"
+endmenu
+
+menu "Utilities"
+source "package/bc/Config.in"
+source "package/comgt/Config.in"
+source "package/fbset/Config.in"
+source "package/file/Config.in"
+source "package/hdparm/Config.in"
+source "package/usbutils/Config.in"  # lsusb
+source "package/pciutils/Config.in"
+source "package/procps/Config.in"
+source "package/sispmctl/Config.in"
+source "package/stress/Config.in"
+source "package/sysstat/Config.in"
+source "package/udev/Config.in"
+source "package/watchdog/Config.in"
+endmenu
+
+
+endmenu
+
+menu "Networking"
+
+menu "Analyze / Debugging / Monitoring"
+source "package/bwm/Config.in"
+source "package/dsniff/Config.in"
+source "package/ethtool/Config.in"
+source "package/fping/Config.in"
+source "package/fprobe/Config.in"
+source "package/fprobe-ulog/Config.in"
+source "package/httping/Config.in"
+source "package/iftop/Config.in"
+source "package/ipcad/Config.in"
+source "package/iperf/Config.in"
+source "package/iptraf/Config.in"
+source "package/mtr/Config.in"
+source "package/netperf/Config.in"
+source "package/nmap/Config.in"
+source "package/sipsak/Config.in"
+source "package/slurm/Config.in"
+source "package/tcpdump/Config.in"
+#source "package/trafshow/Config.in"
+source "package/ttcp/Config.in"
+endmenu
+
+menu "DNS / DHCP"
+source "package/atftp/Config.in"
+source "package/avahi/Config.in"
+source "package/bind/Config.in"
+source "package/dhcp/Config.in"
+source "package/dhcp-forwarder/Config.in"
+source "package/dnsmasq/Config.in"
+source "package/ez-ipupdate/Config.in"
+source "package/maradns/Config.in"
+source "package/updatedd/Config.in"
+endmenu
+
+menu "HTTP / FTP"
+source "package/gatling/Config.in"
+source "package/lighttpd/Config.in"
+source "package/mini_httpd/Config.in"
+source "package/tntnet/Config.in"
+source "package/vsftpd/Config.in"
+source "package/wput/Config.in"
+endmenu
+
+menu "IPv6"
+depends ADK_IPV6
+source "package/6tunnel/Config.in"
+source "package/aiccu/Config.in"
+source "package/dhcp6/Config.in"
+source "package/miredo/Config.in"
+source "package/mrd6/Config.in"
+source "package/ndisc/Config.in"
+source "package/radvd/Config.in"
+endmenu
+
+
+menu "IRC / ICQ / JABBER"
+source "package/bitlbee/Config.in"
+source "package/irssi/Config.in"
+source "package/miau/Config.in"
+source "package/reaim/Config.in"
+source "package/tmsnc/Config.in"
+endmenu
+
+
+menu "Firewall / Routing / Bridging"
+source "package/arpd/Config.in"
+source "package/bridge-utils/Config.in"
+source "package/cutter/Config.in"
+source "package/ether-wake/Config.in"
+source "package/iproute2/Config.in"
+source "package/ipset/Config.in"
+source "package/iptables/Config.in"
+source "package/iptables-snmp/Config.in"
+source "package/knock/Config.in"
+source "package/linux-atm/Config.in"
+source "package/macchanger/Config.in"
+source "package/netstat-nat/Config.in"
+source "package/quagga/Config.in"
+source "package/ulogd/Config.in"
+source "package/shorewall-common/Config.in"
+source "package/shorewall-shell/Config.in"
+source "package/wol/Config.in"
+source "package/wondershaper/Config.in"
+source "package/vrrpd/Config.in"
+endmenu
+
+menu "Misc"
+source "package/cups/Config.in"
+source "package/fakeidentd/Config.in"
+source "package/gkrellmd/Config.in"
+source "package/net-snmp/Config.in"
+source "package/nut/Config.in"
+source "package/openldap/Config.in"
+source "package/p910nd/Config.in"
+source "package/pipacs/Config.in"
+#source "package/pmacct/Config.in"
+source "package/portmap/Config.in"
+source "package/rarpd/Config.in"
+source "package/rrs/Config.in"
+source "package/rsync/Config.in"
+source "package/scdp/Config.in"
+source "package/shat/Config.in"
+source "package/socat/Config.in"
+source "package/subversion/Config.in"
+source "package/swconfig/Config.in"
+source "package/udp-broadcast-relay/Config.in"
+source "package/vgp/Config.in"
+source "package/vnstat/Config.in"
+source "package/vtun/Config.in"
+source "package/wccpd/Config.in"
+source "package/xinetd/Config.in"
+endmenu
+
+menu "Network Filesystems"
+source "package/davfs2/Config.in"
+source "package/nfs-utils/Config.in"
+source "package/samba/Config.in"
+endmenu
+
+menu "NTP"
+source "package/htpdate/Config.in"
+source "package/ntpclient/Config.in"
+source "package/openntpd/Config.in"
+source "package/rdate/Config.in"
+endmenu
+
+menu "P2P"
+source "package/cbtt/Config.in"
+source "package/ctorrent/Config.in"
+source "package/rtorrent/Config.in"
+endmenu
+
+menu "PPP / PPTP / RADIUS"
+source "package/freeradius/Config.in"
+source "package/ppp/Config.in"
+source "package/pptp/Config.in"
+source "package/pptpd/Config.in"
+source "package/rp-pppoe/Config.in"
+source "package/raddump/Config.in"
+endmenu
+
+menu "Proxy"
+source "package/igmpproxy/Config.in"
+source "package/frickin/Config.in"
+source "package/parprouted/Config.in"
+source "package/privoxy/Config.in"
+source "package/siproxd/Config.in"
+source "package/squid/Config.in"
+source "package/srelay/Config.in"
+source "package/tinyproxy/Config.in"
+source "package/tor/Config.in"
+source "package/vnc-reflector/Config.in"
+endmenu
+
+menu "Security"
+source "package/arpwatch/Config.in"
+source "package/autossh/Config.in"
+source "package/axtls/Config.in"
+source "package/dropbear/Config.in"
+source "package/httptunnel/Config.in"
+source "package/ipsec-tools/Config.in"
+source "package/l2tpns/Config.in"
+source "package/openssh/Config.in"
+source "package/openswan/Config.in"
+source "package/openvpn/Config.in"
+source "package/portsentry/Config.in"
+source "package/ptunnel/Config.in"
+source "package/scanlogd/Config.in"
+source "package/snort/Config.in"
+source "package/ssltunnel/Config.in"
+source "package/tinc/Config.in"
+source "package/vpnc/Config.in"
+endmenu
+
+menu "Wireless"
+source "package/aircrack-ng/Config.in"
+source "package/chillispot/Config.in"
+source "package/hostapd/Config.in"
+source "package/iw/Config.in"
+source "package/kismet/Config.in"
+source "package/nocatsplash/Config.in"
+source "package/olsrd/Config.in"
+source "package/snort-wireless/Config.in"
+source "package/wifidog/Config.in"
+source "package/wireless-firmware/Config.in"
+source "package/wireless-tools/Config.in"
+source "package/wpa_supplicant/Config.in"
+endmenu
+
+endmenu
+
+menu "Programming"
+source "package/binutils/Config.in"
+source "package/cxxtools/Config.in"
+#source "package/gcc/Config.in"
+source "package/haserl/Config.in"
+source "package/jamvm/Config.in"
+source "package/lua/Config.in"
+source "package/microperl/Config.in"
+source "package/php/Config.in"
+source "package/ruby/Config.in"
+source "package/libffi/Config.in"
+source "package/tcl/Config.in"
+endmenu
+
+
+
+menu "Libraries"
+source "package/alsa-lib/Config.in"
+source "package/apr/Config.in"
+source "package/apr-util/Config.in"
+source "package/avahi/Config.in.lib"
+source "package/axtls/Config.in.lib"
+source "package/cgilib/Config.in"
+source "package/dbus/Config.in"
+source "package/gettext/Config.in"
+source "package/glib/Config.in"
+source "package/glib2/Config.in"
+source "package/id3lib/Config.in"
+source "package/libao/Config.in"
+source "package/libaudiofile/Config.in"
+source "package/libart/Config.in"
+source "package/libcli/Config.in"
+source "package/curl/Config.in" # libcurl
+source "package/libdaemon/Config.in"
+source "package/libdb/Config.in"
+source "package/libdnet/Config.in"
+source "package/libelf/Config.in"
+source "package/libevent/Config.in"
+source "package/expat/Config.in" # libexpat
+source "package/faad2/Config.in"  # libfaad2
+source "package/flac/Config.in"  # libflac
+source "package/freetype/Config.in"  # libfreetype
+source "package/libgcrypt/Config.in"
+source "package/libgd/Config.in"
+source "package/libgdbm/Config.in"
+source "package/libgssglue/Config.in"
+source "package/gmp/Config.in"  # libgmp
+source "package/gnutls/Config.in" ## libgnutls
+source "package/libgpg-error/Config.in"
+source "package/gsm/Config.in" # libgsm
+source "package/libiconv/Config.in"
+source "package/libid3tag/Config.in"
+source "package/jpeg/Config.in"  # libjpeg
+source "package/lame/Config.in.lib"  # libltdl
+source "package/mpfr/Config.in"
+source "package/libtool/Config.in"  # libltdl
+source "package/openldap/Config.in.lib"
+source "package/liblzo/Config.in"
+source "package/libmad/Config.in"
+source "package/ncurses/Config.in"  # libncurses
+source "package/neon/Config.in"
+source "package/libnet/Config.in"
+source "package/libnfsidmap/Config.in"
+source "package/libnids/Config.in"
+source "package/libnl/Config.in"
+source "package/libogg/Config.in"
+source "package/libol/Config.in"
+source "package/opencdk/Config.in"  # libopencdk
+source "package/libosip2/Config.in"
+source "package/libowfat/Config.in"
+source "package/libp11/Config.in"
+source "package/libpcap/Config.in"
+source "package/libpri/Config.in"
+source "package/pcre/Config.in"  # libpcre
+source "package/libpng/Config.in"
+source "package/popt/Config.in"  # libpopt
+source "package/postgresql/Config.in"  # libpq
+source "package/libpthread/Config.in"
+source "package/libthread_db/Config.in"
+source "package/radiusclient-ng/Config.in" #libradiusclient-ng
+source "package/readline/Config.in"  # libreadline
+source "package/cyrus-sasl/Config.in"  # libsasl2
+source "package/speex/Config.in" # libspeex
+source "package/sqlite/Config.in" # libsqlite
+source "package/librpcsecgss/Config.in"
+source "package/libshout/Config.in"
+source "package/libsigc++/Config.in"
+source "package/libstdcxx/Config.in"
+source "package/libtasn1/Config.in"
+source "package/libtiff/Config.in"
+source "package/libtirpc/Config.in"
+source "package/libtorrent/Config.in"
+source "package/libupnp/Config.in"
+source "package/libusb/Config.in"
+source "package/libvorbis/Config.in"
+source "package/libvorbisidec/Config.in"
+source "package/tcp_wrappers/Config.in"
+source "package/libxml2/Config.in"
+source "package/libxslt/Config.in"
+source "package/uclibc++/Config.in"
+source "package/ustl/Config.in"
+source "package/zlib/Config.in"
+endmenu
+
+menu "X"
+depends ADK_XORG
+source "package/xorg-server/Config.in"
+
+menu "X Libraries"
+source "package/libICE/Config.in"
+source "package/libSM/Config.in"
+source "package/libX11/Config.in"
+source "package/libXdmcp/Config.in"
+source "package/libXext/Config.in"
+source "package/libXfont/Config.in"
+source "package/libfontenc/Config.in"
+source "package/libpciaccess/Config.in"
+source "package/libxkbfile/Config.in"
+source "package/libXau/Config.in"
+source "package/libXaw/Config.in"
+source "package/libXmu/Config.in"
+source "package/libXpm/Config.in"
+source "package/libXt/Config.in"
+source "package/pixman/Config.in"
+source "package/xf86dga/Config.in"
+source "package/xproto/Config.in"
+endmenu
+endmenu
+
+endmenu
+
+menu "Kernel configuration"
+source "target/linux/Config.in"
+endmenu
+

+ 391 - 0
package/Depends.mk

@@ -0,0 +1,391 @@
+# $Id$
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+aircrack-ng-compile: openssl-compile libpcap-compile
+apr-util-compile: expat-compile apr-compile
+arpd-compile: libpcap-compile libdnet-compile libevent-compile
+arpwatch-compile: libpcap-compile
+atftp-compile: readline-compile ncurses-compile
+avahi-compile: libdaemon-compile expat-compile libgdbm-compile
+bind-compile: openssl-compile
+bitlbee-compile: libiconv-compile openssl-compile glib2-compile
+bluez-compile: libusb-compile dbus-compile
+bogofilter-compile: libiconv-compile libdb-compile
+ifeq (${ADK_COMPILE_CBTT_WITH_UCLIBCXX},y)
+cbtt-compile: uclibc++-compile
+endif
+cbtt-compile: mysql-compile zlib-compile
+collectd-compile: libpthread-compile
+cryptsetup-compile: libgcrypt-compile popt-compile e2fsprogs-compile device-mapper-compile
+ifeq (${ADK_COMPILE_CTORRENT_WITH_UCLIBCXX},y)
+ctorrent-compile: uclibc++-compile
+endif
+ctorrent-compile: openssl-compile
+cups-compile: zlib-compile
+curl-compile: openssl-compile zlib-compile
+cxxtools-compile: libiconv-compile
+ifeq (${ADK_COMPILE_CXXTOOLS_WITH_UCLIBCXX},y)
+cxxtools-compile: uclibc++-compile
+endif
+cyrus-sasl-compile: openssl-compile
+ifneq (${ADK_PACKAGE_DAVFS2_FUSE}${ADK_PACKAGE_DAVFS2_BOTH},)
+davfs2-compile: fuse-compile
+endif
+davfs2-compile: libiconv-compile neon-compile
+dbus-compile: expat-compile
+deco-compile: ncurses-compile
+dhcp6-compile: ncurses-compile
+digitemp-compile: libusb-compile
+dsniff-compile: libnids-compile openssl-compile libgdbm-compile
+elinks-compile: openssl-compile
+esound-compile: libaudiofile-compile
+ettercap-compile: pcap-compile libnet-compile
+exmap-compile: glib2-compile readline-compile
+fprobe-compile: libpcap-compile
+freetype-compile: zlib-compile
+gatling-compile: libowfat-compile libiconv-compile
+gcc-compile: gmp-compile mpfr-compile
+gdb-compile: ncurses-compile readline-compile
+gettext-compile: libiconv-compile libpthread-compile
+gkrellmd-compile: glib-compile
+glib2-compile: gettext-compile libiconv-compile
+gmediaserver-compile: id3lib-compile libupnp-compile
+gnutls-compile: libgcrypt-compile liblzo-compile libtasn1-compile opencdk-compile zlib-compile
+ifeq (${ADK_COMPILE_GPSD_WITH_UCLIBCXX},y)
+gpsd-compile: uclibc++-compile
+endif
+gpsd-compile: ncurses-compile
+ifeq (${ADK_COMPILE_HEIMDAL_WITH_DB_BDB},y)
+heimdal-compile: libdb-compile
+endif
+ifeq (${ADK_COMPILE_HEIMDAL_WITH_DB_LDAP},y)
+heimdal-compile: openldap-compile
+endif
+heimdal-compile: openssl-compile ncurses-compile
+httping-compile: openssl-compile
+icecast-compile: curl-compile libvorbis-compile libxml2-compile libxslt-compile
+ifeq (${ADK_COMPILE_ID3LIB_WITH_UCLIBCXX},y)
+id3lib-compile: uclibc++-compile 
+endif
+id3lib-compile: zlib-compile libiconv-compile
+iftop-compile: libpcap-compile libpthread-compile ncurses-compile
+ipcad-compile: libpcap-compile
+ifeq (${ADK_COMPILE_IPERF_WITH_UCLIBCXX},y)
+iperf-compile: uclibc++-compile
+endif
+ipsec-tools-compile: openssl-compile
+iptables-snmp-compile: net-snmp-compile
+iptraf-compile: ncurses-compile
+irssi-compile: glib2-compile ncurses-compile
+iw-compile: libnl-compile
+jamvm-compile: libffi-compile zlib-compile
+ifeq (${ADK_COMPILE_KISMET_WITH_UCLIBCXX},y)
+kismet-compile: uclibc++-compile 
+endif
+kismet-compile: libpcap-compile ncurses-compile
+knock-compile: libpcap-compile
+krb5-compile: ncurses-compile
+l2tpns-compile: libcli-compile
+less-compile: ncurses-compile
+libgcrypt-compile: libgpg-error-compile
+libgd-compile: libpng-compile jpeg-compile
+libid3tag-compile: zlib-compile
+libnet-compile: libpcap-compile
+libnids-compile: libnet-compile
+libp11-compile: openssl-compile libtool-compile
+libpng-compile: zlib-compile
+libshout-compile: libvorbis-compile
+libtorrent-compile: openssl-compile libsigc++-compile
+libvorbis-compile: libogg-compile
+libfontenc-compile: xproto-compile zlib-compile
+libSM-compile: libICE-compile
+libXt-compile: libSM-compile
+libXmu-compile: libXt-compile
+libXaw-compile: libXext-compile libXmu-compile libXpm-compile
+libX11-compile: xproto-compile xextproto-compile xtrans-compile libXdmcp-compile \
+	libXau-compile libXaw-compile xcmiscproto-compile bigreqsproto-compile kbproto-compile \
+	inputproto-compile
+libXfont-compile: freetype-compile fontcacheproto-compile fontsproto-compile libfontenc-compile
+libxml2-compile: zlib-compile
+libxslt-compile: libxml2-compile
+ifeq (${ADK_COMPILE_LIGHTTPD_WITH_OPENSSL},y)
+lighttpd-compile: openssl-compile
+endif
+lighttpd-compile: pcre-compile libxml2-compile sqlite-compile
+links-compile: openssl-compile libpng-compile jpeg-compile gpm-compile
+logrotate-compile: popt-compile
+lynx-compile: ncurses-compile openssl-compile
+madplay-compile: libid3tag-compile libmad-compile
+maradns-compile: libpthread-compile
+mc-compile: glib-compile ncurses-compile
+miax-compile: bluez-compile
+ifeq (${ADK_COMPILE_MIREDO_WITH_UCLIBCXX},y)
+miredo-compile: uclibc++-compile
+endif
+moc-compile: libvorbis-compile curl-compile libmad-compile flac-compile ffmpeg-compile
+monit-compile: openssl-compile
+ifeq (${ADK_COMPILE_MRD6_WITH_UCLIBCXX},y)
+mrd6-compile: uclibc++-compile
+endif
+mt-daapd-compile: libgdbm-compile libid3tag-compile
+mtr-compile: ncurses-compile
+mutt-compile: ncurses-compile openssl-compile
+mysql-compile: ncurses-compile zlib-compile
+nano-compile: ncurses-compile
+neon-compile: libpthread-compile libxml2-compile openssl-compile zlib-compile
+net-snmp-compile: libelf-compile
+ifeq (${ADK_COMPILE_NFS_UTILS_WITH_KRB5},y)
+nfs-utils-compile: libnfsidmap-compile krb5-compile libevent-compile libgssglue-compile librpcsecgss-compile
+endif
+ifeq (${ADK_COMPILE_NFS_UTILS_WITH_HEIMDAL},y)
+nfs-utils-compile: libnfsidmap-compile heimdal-compile libevent-compile librpcsecgss-compile
+endif
+ifeq (${ADK_IPV6},y)
+nfs-utils-compile: libtirpc-compile
+endif
+ifeq (${ADK_COMPILE_NMAP_WITH_UCLIBCXX},y)
+nmap-compile: uclibc++-compile
+endif
+nmap-compile: pcre-compile libpcap-compile
+nocatsplash-compile: glib-compile
+obexftp-compile: openobex-compile libiconv-compile
+opencdk-compile: libgcrypt-compile libgpg-error-compile zlib-compile
+openct-compile: libtool-compile libusb-compile
+openldap-compile: cyrus-sasl-compile openssl-compile libdb-compile
+opensips-compile: openssl-compile
+ifeq (${ADK_COMPILE_OPENSSH_WITH_KRB5},y)
+openssh-compile: krb5-compile
+endif
+ifeq (${ADK_COMPILE_OPENSSH_WITH_HEIMDAL},y)
+openssh-compile: heimdal-compile
+endif
+openssh-compile: zlib-compile openssl-compile
+openssl-compile: zlib-compile
+openssl-pkcs11-compile: libp11-compile
+openswan-compile: gmp-compile
+oprofile-compile: popt-compile
+osiris-compile: openssl-compile
+palantir-compile: jpeg-compile
+pciutils-compile: zlib-compile
+ifneq ($(strip ${ADK_PACKAGE_PORTMAP_LIBWRAP}),)
+portmap-compile: tcp_wrappers-compile
+endif
+postgresql-compile: zlib-compile
+privoxy-compile: pcre-compile
+procps-compile: ncurses-compile
+ptunnel-compile: libpcap-compile
+quagga-compile: readline-compile ncurses-compile
+raddump-compile: openssl-compile libpcap-compile
+radiusclient-ng-compile: openssl-compile
+rarpd-compile: libnet-compile
+readline-compile: ncurses-compile
+rrdcollect-compile: rrdtool-compile
+rrdtool-compile: libxml2-compile cgilib-compile freetype-compile libart-compile libpng-compile
+rsync-compile: popt-compile
+rtorrent-compile: ncurses-compile libtorrent-compile curl-compile
+sane-backends-compile: libpthread-compile libusb-compile
+scanlogd-compile: libpcap-compile libnids-compile libnet-compile
+scdp-compile: libnet-compile
+screen-compile: ncurses-compile
+serdisplib-compile: libgd-compile libusb-compile
+siproxd-compile: libosip2-compile
+sipsak-compile: openssl-compile
+sispmctl-compile: libusb-compile
+snort-compile: libnet-compile libpcap-compile pcre-compile
+snort-wireless-compile: libnet-compile libpcap-compile pcre-compile
+socat-compile: openssl-compile
+sqlite-compile: ncurses-compile readline-compile
+squid-compile: openssl-compile
+ssltunnel-compile: openssl-compile ppp-compile
+subversion-compile: apr-util-compile expat-compile apr-compile zlib-compile libiconv-compile
+swconfig-compile: libnl-compile
+syslog-ng-compile: libol-compile tcp_wrappers-compile
+tcpdump-compile: libpcap-compile
+tinc-compile: zlib-compile openssl-compile liblzo-compile
+tntnet-compile: cxxtools-compile zlib-compile
+ifneq (${ADK_COMPILE_TNTNET_WITH_OPENSSL},)
+tntnet-compile: openssl-compile
+else ifneq (${ADK_COMPILE_TNTNET_WITH_GNUTLS},)
+tntnet-compile: gnutls-compile
+endif
+tor-compile: libevent-compile openssl-compile zlib-compile
+trafshow: ncurses-compile libpcap-compile
+usbutils-compile: libusb-compile
+ussp-push-compile: openobex-compile
+vilistextum-compile: libiconv-compile
+vim-compile: ncurses-compile
+vnc-reflector-compile: jpeg-compile zlib-compile
+vpnc-compile: libgcrypt-compile libgpg-error-compile
+vtun-compile: zlib-compile openssl-compile liblzo-compile
+wdfs-compile: openssl-compile fuse-compile neon-compile glib2-compile
+weechat-compile: ncurses-compile gnutls-compile lua-compile libiconv-compile
+wknock-compile: libpcap-compile
+ifeq (${ADK_COMPILE_WPA_SUPPLICANT_WITH_OPENSSL},y)
+wpa_supplicant-compile: openssl-compile 
+endif
+wx200d-compile: postgresql-compile
+xfsprogs-compile: e2fsprogs-compile
+libXxf86dga-compile: xf86dgaproto-compile
+xf86dga-compile: libXxf86dga-compile
+xorg-server-compile: libX11-compile randrproto-compile renderproto-compile fixesproto-compile \
+	damageproto-compile scrnsaverproto-compile resourceproto-compile \
+	fontsproto-compile videoproto-compile compositeproto-compile \
+	evieext-compile libxkbfile-compile libXfont-compile pixman-compile \
+	libpciaccess-compile openssl-compile xf86dga-compile
+
+ifeq ($(ADK_PACKAGE_APR_THREADING),y)
+apr-compile: libpthread-compile
+endif
+
+asterisk-compile: ncurses-compile openssl-compile zlib-compile curl-compile popt-compile
+ifneq ($(ADK_PACKAGE_ASTERISK_CHAN_BLUETOOTH),)
+asterisk-compile: bluez-compile
+endif
+ifneq ($(ADK_PACKAGE_ASTERISK_CODEC_SPEEX),)
+asterisk-compile: speex-compile
+endif
+ifneq ($(ADK_PACKAGE_ASTERISK_PGSQL),)
+asterisk-compile: postgresql-compile
+endif
+ifneq ($(ADK_PACKAGE_ASTERISK_MYSQL),)
+asterisk-compile: mysql-compile
+endif
+ifneq ($(ADK_PACKAGE_ASTERISK_SQLITE),)
+asterisk-compile: sqlite-compile
+endif
+
+
+freeradius-compile: libtool-compile openssl-compile
+ifneq ($(ADK_PACKAGE_FREERADIUS_MOD_LDAP),)
+freeradius-compile: openldap-compile
+endif
+ifneq ($(ADK_PACKAGE_FREERADIUS_MOD_SQL_MYSQL),)
+freeradius-compile: mysql-compile
+endif
+ifneq ($(ADK_PACKAGE_FREERADIUS_MOD_SQL_PGSQL),)
+freeradius-compile: postgresql-compile
+endif
+
+hostapd-compile: libnl-compile openssl-compile
+
+ifneq ($(ADK_PACKAGE_MINI_HTTPD_OPENSSL),)
+mini_httpd-compile: openssl-compile
+endif
+
+ifneq ($(ADK_PACKAGE_MOTION),)
+motion-compile: jpeg-compile
+endif
+
+mplayer-compile: alsa-lib-compile libmad-compile libvorbis-compile faad2-compile ncurses-compile zlib-compile
+
+mpd-compile: alsa-lib-compile glib2-compile curl-compile
+ifneq ($(ADK_PACKAGE_MPD_MP3),)
+mpd-compile: libid3tag-compile libmad-compile
+endif
+ifneq ($(ADK_PACKAGE_MPD_MP4),)
+mpd-compile: libfaad2
+endif
+ifneq ($(ADK_COMPILE_MPD_WITH_OGG),)
+mpd-compile: libvorbis-compile
+endif
+ifneq ($(ADK_COMPILE_MPD_WITH_TREMOR),)
+mpd-compile: libvorbisidec-compile
+endif
+ifneq ($(ADK_PACKAGE_MPD_FLAC),)
+mpd-compile: flac-compile
+endif
+ifneq ($(ADK_COMPILE_MPD_WITH_SHOUT),)
+mpd-compile: lame-compile
+endif
+
+ifneq (${ADK_PACKAGE_NUT_SSL},)
+nut-compile: openssl-compile
+endif
+ifneq (${ADK_PACKAGE_NUT_USB},)
+nut-compile: libusb-compile
+endif
+ifneq (${ADK_PACKAGE_NUT_SNMP},)
+nut-compile: net-snmp-compile
+endif
+
+ifeq ($(ADK_PACKAGE_LIBOPENSSL),y)
+openvpn-compile: openssl-compile
+endif
+ifeq ($(ADK_PACKAGE_OPENVPN_LZO),y)
+openvpn-compile: liblzo-compile
+endif
+
+php-compile: openssl-compile zlib-compile
+ifneq ($(ADK_PACKAGE_PHP_MOD_CURL),)
+php-compile: curl-compile
+endif
+ifneq ($(ADK_PACKAGE_PHP_MOD_GD),)
+php-compile: libgd-compile libpng-compile
+endif
+ifneq ($(ADK_PACKAGE_PHP_MOD_GMP),)
+php-compile: gmp-compile
+endif
+ifneq ($(ADK_PACKAGE_PHP_MOD_LDAP),)
+php-compile: openldap-compile
+endif
+ifneq ($(ADK_PACKAGE_PHP_MOD_MYSQL),)
+php-compile: mysql-compile
+endif
+ifneq ($(ADK_PACKAGE_PHP_MOD_PCRE),)
+php-compile: pcre-compile
+endif
+ifneq ($(ADK_PACKAGE_PHP_MOD_PGSQL),)
+php-compile: postgresql-compile
+endif
+ifneq ($(ADK_PACKAGE_PHP_MOD_SQLITE),)
+php-compile: sqlite-compile
+endif
+ifneq ($(ADK_PACKAGE_PHP_MOD_XML),)
+php-compile: expat-compile
+endif
+
+pmacct-compile: libpcap-compile
+ifneq ($(ADK_COMPILE_PMACCT_MYSQL),)
+pmacct-compile: mysql-compile
+endif
+ifneq ($(ADK_COMPILE_PMACCT_PGSQL),)
+pmacct-compile: postgresql-compile
+endif
+ifneq ($(ADK_COMPILE_PMACCT_SQLITE),)
+pmacct-compile: sqlite-compile
+endif
+
+ifeq (${ADK_COMPILE_RRS_WITH_UCLIBCXX},y)
+rrs-compile: uclibc++-compile 
+endif
+rrs-compile: zlib-compile
+ifneq ($(ADK_PACKAGE_RRS),)
+rrs-compile: openssl-compile
+endif
+
+ifneq ($(ADK_PACKAGE_SUBVERSION_NEON),)
+subversion-compile: neon-compile
+endif
+
+ulogd-compile: iptables-compile
+ifneq ($(ADK_PACKAGE_ULOGD_MOD_MYSQL),)
+ulogd-compile: mysql-compile
+endif
+ifneq ($(ADK_PACKAGE_ULOGD_MOD_PCAP),)
+ulogd-compile: libpcap-compile
+endif
+ifneq ($(ADK_PACKAGE_ULOGD_MOD_PGSQL),)
+ulogd-compile: postgresql-compile
+endif
+ifneq ($(ADK_PACKAGE_ULOGD_MOD_SQLITE),)
+ulogd-compile: sqlite-compile
+endif
+ifeq (${ADK_PACKAGE_FETCHMAIL_SSL},y)
+fetchmail-compile: openssl-compile
+endif
+ifeq (${ADK_PACKAGE_IRSSI_SSL},y)
+irssi-compile: openssl-compile
+endif
+

+ 450 - 0
package/Makefile

@@ -0,0 +1,450 @@
+# $Id$
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+# Main makefile for the packages
+
+include $(TOPDIR)/rules.mk
+include $(TOPDIR)/package/Depends.mk
+
+ifneq (${ADK_PACKAGE_CGILIB},)
+ADK_COMPILE_CGILIB=${ADK_PACKAGE_CGILIB}
+else
+ifneq (${ADK_COMPILE_RRDTOOL},)
+ADK_COMPILE_CGILIB=m
+else
+ADK_COMPILE_CGILIB=
+endif
+endif
+
+package-$(ADK_PACKAGE_6TUNNEL) += 6tunnel
+package-$(ADK_PACKAGE_AICCU) += aiccu
+package-$(ADK_PACKAGE_AIRCRACK_NG) += aircrack-ng
+package-$(ADK_PACKAGE_ALSA_LIB) += alsa-lib
+package-$(ADK_PACKAGE_ALSA_UTILS) += alsa-utils
+package-$(ADK_PACKAGE_APR) += apr
+package-$(ADK_PACKAGE_APR_UTIL) += apr-util
+package-$(ADK_PACKAGE_ARPD) += arpd
+package-$(ADK_PACKAGE_ARPWATCH) += arpwatch
+package-$(ADK_PACKAGE_ASTERISK) += asterisk
+package-$(ADK_COMPILE_ATFTP) += atftp
+package-$(ADK_PACKAGE_AUTOSSH) += autossh
+package-$(ADK_COMPILE_AVAHI) += avahi
+package-$(ADK_COMPILE_AXTLS) += axtls
+package-$(ADK_PACKAGE_BASH) += bash
+package-$(ADK_COMPILE_BC) += bc
+package-$(ADK_PACKAGE_CFGFS) += cfgfs
+package-$(ADK_PACKAGE_BIGREQSPROTO) += bigreqsproto
+package-$(ADK_COMPILE_BIND) += bind
+package-$(ADK_PACKAGE_BINUTILS) += binutils
+package-$(ADK_PACKAGE_BITLBEE) += bitlbee
+package-$(ADK_PACKAGE_BOGOFILTER) += bogofilter
+package-$(ADK_PACKAGE_BLUEZ_FIRMWARE) += bluez-firmware
+package-$(ADK_PACKAGE_BLUEZ) += bluez
+package-$(ADK_PACKAGE_BRIDGE_UTILS) += bridge-utils
+package-$(ADK_PACKAGE_BUSYBOX) += busybox
+package-$(ADK_PACKAGE_BWM) += bwm
+package-$(ADK_PACKAGE_CBTT) += cbtt
+package-$(ADK_COMPILE_CGILIB) += cgilib
+package-$(ADK_PACKAGE_CHILLISPOT) += chillispot
+package-$(ADK_PACKAGE_CLICK) += click
+package-$(ADK_PACKAGE_COLLECTD) += collectd
+package-$(ADK_PACKAGE_COMGT) += comgt
+package-$(ADK_PACKAGE_COMPOSITEPROTO) += compositeproto
+package-$(ADK_PACKAGE_CTORRENT) += ctorrent
+package-$(ADK_PACKAGE_CUPS) += cups
+package-$(ADK_COMPILE_CURL) += curl
+package-$(ADK_PACKAGE_CUTTER) += cutter
+package-$(ADK_PACKAGE_CRYPTSETUP) += cryptsetup
+package-$(ADK_COMPILE_CYRUS_SASL) += cyrus-sasl
+package-$(ADK_PACKAGE_CXXTOOLS) += cxxtools
+package-$(ADK_PACKAGE_DAMAGEPROTO) += damageproto
+package-$(ADK_PACKAGE_DAVFS2) += davfs2
+package-$(ADK_PACKAGE_DBUS) += dbus
+package-$(ADK_PACKAGE_DECO) += deco
+package-$(ADK_PACKAGE_DEVICE_MAPPER) += device-mapper
+package-$(ADK_COMPILE_DHCP) += dhcp
+package-$(ADK_PACKAGE_DHCP_FORWARDER) += dhcp-forwarder
+package-$(ADK_PACKAGE_DHCP6) += dhcp6
+package-$(ADK_PACKAGE_DIGITEMP) += digitemp
+package-$(ADK_PACKAGE_DNSMASQ) += dnsmasq
+package-$(ADK_PACKAGE_DOSFSTOOLS) += dosfstools
+package-$(ADK_PACKAGE_DOVECOT) += dovecot
+package-$(ADK_PACKAGE_DROPBEAR) += dropbear
+package-$(ADK_PACKAGE_DSNIFF) += dsniff
+package-$(ADK_PACKAGE_E2FSPROGS) += e2fsprogs
+package-$(ADK_PACKAGE_LIBUUID) += e2fsprogs
+package-$(ADK_PACKAGE_ELINKS) += elinks
+package-$(ADK_PACKAGE_ESOUND) += esound
+package-$(ADK_PACKAGE_ETHER_WAKE) += ether-wake
+package-$(ADK_PACKAGE_ETHTOOL) += ethtool
+package-$(ADK_PACKAGE_EVIEEXT) += evieext
+package-$(ADK_COMPILE_EXPAT) += expat
+package-$(ADK_COMPILE_EXMAP) += exmap
+package-$(ADK_PACKAGE_EZIPUPDATE) += ez-ipupdate
+package-$(ADK_COMPILE_FAAD2) += faad2
+package-$(ADK_PACKAGE_FAKEIDENTD) += fakeidentd
+package-$(ADK_PACKAGE_FBSET) += fbset
+package-$(ADK_PACKAGE_FETCHMAIL) += fetchmail
+package-$(ADK_PACKAGE_FFMPEG) += ffmpeg
+package-$(ADK_PACKAGE_FILE) += file
+package-$(ADK_PACKAGE_FIXESPROTO) += fixesproto
+package-$(ADK_COMPILE_FLAC) += flac
+package-$(ADK_PACKAGE_FONTSPROTO) += fontsproto
+package-$(ADK_PACKAGE_FONTCACHEPROTO) += fontcacheproto
+package-$(ADK_PACKAGE_FPING) += fping
+package-$(ADK_PACKAGE_FPROBE) += fprobe
+package-$(ADK_PACKAGE_FPROBE_ULOG) += fprobe-ulog
+package-$(ADK_PACKAGE_FREERADIUS) += freeradius
+package-$(ADK_COMPILE_FREETYPE) += freetype
+package-$(ADK_PACKAGE_FRICKIN) += frickin
+package-$(ADK_COMPILE_FUSE) += fuse
+package-$(ADK_PACKAGE_GATLING) += gatling
+package-$(ADK_PACKAGE_GCC) += gcc
+package-$(ADK_PACKAGE_GDB) += gdb
+package-$(ADK_PACKAGE_GDBSERVER) += gdbserver
+package-$(ADK_PACKAGE_GETTEXT) += gettext
+package-$(ADK_PACKAGE_GKRELLMD) += gkrellmd
+package-$(ADK_COMPILE_GLIB) += glib
+package-$(ADK_PACKAGE_GLIB2) += glib2
+ifeq (${ADK_TARGET_LIB_GLIBC},y)
+package-$(ADK_PACKAGE_GLIBC) += glibc
+endif
+package-$(ADK_PACKAGE_GMEDIASERVER) += gmediaserver
+package-$(ADK_COMPILE_GMP) += gmp
+package-$(ADK_COMPILE_GNUTLS) += gnutls
+package-$(ADK_PACKAGE_GPG) += gpg
+package-$(ADK_PACKAGE_GPM) += gpm
+package-$(ADK_PACKAGE_GPSD) += gpsd
+package-$(ADK_COMPILE_GSM) += gsm
+package-$(ADK_PACKAGE_HASERL) += haserl
+package-$(ADK_PACKAGE_HDPARM) += hdparm
+package-$(ADK_COMPILE_HEIMDAL) += heimdal
+package-$(ADK_PACKAGE_HEYU) += heyu
+package-$(ADK_COMPILE_HOSTAPD) += hostapd
+package-$(ADK_PACKAGE_HTPDATE) += htpdate
+package-$(ADK_PACKAGE_HTTPING) += httping
+package-$(ADK_PACKAGE_HTTPTUNNEL) += httptunnel
+package-$(ADK_PACKAGE_ICECAST) += icecast
+package-$(ADK_PACKAGE_ID3LIB) += id3lib
+package-$(ADK_PACKAGE_IFTOP) += iftop
+package-$(ADK_PACKAGE_IGMPPROXY) += igmpproxy
+package-$(ADK_PACKAGE_INPUTPROTO) += inputproto
+package-$(ADK_PACKAGE_IPCAD) += ipcad
+package-$(ADK_PACKAGE_IPERF) += iperf
+package-$(ADK_COMPILE_IPROUTE2) += iproute2
+package-$(ADK_PACKAGE_IPSEC_TOOLS) += ipsec-tools
+package-$(ADK_PACKAGE_IPSET) += ipset
+package-$(ADK_COMPILE_IPTABLES) += iptables
+package-$(ADK_PACKAGE_IPTABLES_SNMP) += iptables-snmp
+package-$(ADK_PACKAGE_IPTRAF) += iptraf
+package-$(ADK_PACKAGE_IRSSI) += irssi
+package-$(ADK_PACKAGE_IW) += iw
+package-$(ADK_PACKAGE_JAMVM) += jamvm
+package-$(ADK_COMPILE_JPEG) += jpeg
+package-$(ADK_PACKAGE_KBPROTO) += kbproto
+package-$(ADK_COMPILE_KISMET) += kismet
+package-$(ADK_COMPILE_KNOCK) += knock
+package-$(ADK_COMPILE_KRB5) += krb5
+package-$(ADK_PACKAGE_L2TPNS) += l2tpns
+package-$(ADK_COMPILE_LAME) += lame
+package-$(ADK_PACKAGE_LESS) += less
+package-$(ADK_PACKAGE_LIBAO) += libao
+package-$(ADK_PACKAGE_LIBART) += libart
+package-$(ADK_PACKAGE_LIBAUDIOFILE) += libaudiofile
+package-$(ADK_PACKAGE_LIBCLI) += libcli
+package-$(ADK_PACKAGE_LIBDAEMON) += libdaemon
+package-$(ADK_COMPILE_DB) += libdb
+package-$(ADK_PACKAGE_LIBDNET) += libdnet
+package-$(ADK_PACKAGE_LIBELF) += libelf
+package-$(ADK_PACKAGE_LIBEVENT) += libevent
+package-$(ADK_PACKAGE_LIBFFI) += libffi
+package-$(ADK_PACKAGE_LIBFONTENC) += libfontenc
+package-$(ADK_PACKAGE_LIBGCRYPT) += libgcrypt
+package-$(ADK_PACKAGE_LIBGD) += libgd
+package-$(ADK_PACKAGE_LIBGDBM) += libgdbm
+package-$(ADK_PACKAGE_LIBGPG_ERROR) += libgpg-error
+package-$(ADK_PACKAGE_LIBGSSGLUE) += libgssglue
+package-$(ADK_PACKAGE_LIBICONV) += libiconv
+package-$(ADK_PACKAGE_LIBID3TAG) += libid3tag
+package-$(ADK_PACKAGE_LIBLZO) += liblzo
+package-$(ADK_PACKAGE_LIBMAD) += libmad
+package-$(ADK_PACKAGE_LIBNET) += libnet
+package-$(ADK_PACKAGE_LIBNFSIDMAP) += libnfsidmap
+package-$(ADK_PACKAGE_LIBNIDS) += libnids
+package-$(ADK_PACKAGE_LIBNL) += libnl
+package-$(ADK_PACKAGE_LIBOGG) += libogg
+package-$(ADK_PACAKGE_LIBOL) += libol
+package-$(ADK_PACKAGE_LIBOSIP2) += libosip2
+package-$(ADK_COMPILE_LIBOWFAT) += libowfat
+package-$(ADK_PACKAGE_LIBP11) += libp11
+package-$(ADK_PACKAGE_LIBPCAP) += libpcap
+package-$(ADK_PACKAGE_LIBPCIACCESS) += libpciaccess
+package-$(ADK_PACKAGE_LIBPNG) += libpng
+package-$(ADK_PACKAGE_LIBPRI) += libpri
+package-$(ADK_PACKAGE_LIBPTHREAD) += libpthread
+package-$(ADK_COMPILE_LIBSHOUT) += libshout
+package-$(ADK_PACKAGE_LIBSIGCXX) += libsigc++
+package-$(ADK_PACKAGE_LIBSTDCXX) += libstdcxx
+package-$(ADK_PACKAGE_LIBRPCSECGSS) += librpcsecgss
+package-$(ADK_PACKAGE_LIBTASN1) += libtasn1
+package-$(ADK_PACKAGE_LIBTHREAD_DB) += libthread_db
+package-$(ADK_PACKAGE_LIBTIFF) += libtiff
+package-$(ADK_PACKAGE_LIBTIRPC) += libtirpc
+package-$(ADK_PACKAGE_LIBTORRENT) += libtorrent
+package-$(ADK_COMPILE_LIBTOOL) += libtool
+package-$(ADK_PACKAGE_LIBUPNP) += libupnp
+package-$(ADK_PACKAGE_LIBUSB) += libusb
+package-$(ADK_PACKAGE_LIBVORBIS) += libvorbis
+package-$(ADK_PACKAGE_LIBVORBISIDEC) += libvorbisidec
+package-$(ADK_PACKAGE_LIBICE) += libICE
+package-$(ADK_PACKAGE_LIBSM) += libSM
+package-$(ADK_PACKAGE_LIBX11) += libX11
+package-$(ADK_PACKAGE_LIBXAU) += libXau
+package-$(ADK_PACKAGE_LIBXAW) += libXaw
+package-$(ADK_PACKAGE_LIBXPM) += libXpm
+package-$(ADK_PACKAGE_LIBXDMCP) += libXdmcp
+package-$(ADK_PACKAGE_LIBXEXT) += libXext
+package-$(ADK_PACKAGE_LIBXFONT) += libXfont
+package-$(ADK_PACKAGE_LIBXKBFILE) += libxkbfile
+package-$(ADK_PACKAGE_LIBXML2) += libxml2
+package-$(ADK_PACKAGE_LIBXMU) += libXmu
+package-$(ADK_PACKAGE_LIBXSLT) += libxslt
+package-$(ADK_PACKAGE_LIBXT) += libXt
+package-$(ADK_PACKAGE_LIGHTTPD) += lighttpd
+package-$(ADK_PACKAGE_LINKS) += links
+package-$(ADK_PACKAGE_LINUX_ATM) += linux-atm
+package-$(ADK_PACKAGE_LOGROTATE) += logrotate
+package-$(ADK_PACKAGE_LRZSZ) += lrzsz
+package-${ADK_PACKAGE_LYNX} += lynx
+package-$(ADK_COMPILE_LUA) += lua
+package-$(ADK_PACKAGE_LVM) += lvm
+package-$(ADK_PACKAGE_MACCHANGER) += macchanger
+package-$(ADK_PACKAGE_MADPLAY) += madplay
+package-$(ADK_PACKAGE_MARADNS) += maradns
+package-$(ADK_PACKAGE_MGETTY) += mgetty
+package-$(ADK_PACKAGE_MC) += mc
+package-$(ADK_PACKAGE_MIAU) += miau
+package-$(ADK_PACKAGE_MIAX) += miax
+package-$(ADK_PACKAGE_MICROPERL) += microperl
+package-$(ADK_COMPILE_MINI_HTTPD) += mini_httpd
+package-$(ADK_PACKAGE_MINI_SENDMAIL) += mini_sendmail
+package-$(ADK_COMPILE_MIREDO) += miredo
+package-$(ADK_PACKAGE_MKSH) += mksh
+package-$(ADK_PACKAGE_MOC) += moc
+package-$(ADK_PACKAGE_MONIT) += monit
+package-$(ADK_PACKAGE_MOTION) += motion
+package-$(ADK_PACKAGE_MPD) += mpd
+package-$(ADK_PACKAGE_MPFR) += mpfr
+package-$(ADK_PACKAGE_MPLAYER) += mplayer
+package-$(ADK_PACKAGE_MRD6) += mrd6
+package-$(ADK_PACKAGE_MT_DAAPD) += mt-daapd
+package-$(ADK_PACKAGE_MTD) += mtd
+package-$(ADK_PACKAGE_MTR) += mtr
+package-$(ADK_PACKAGE_MUTT) += mutt
+package-$(ADK_COMPILE_MYSQL) += mysql
+package-$(ADK_PACKAGE_NANO) += nano
+package-$(ADK_COMPILE_NCURSES) += ncurses
+package-$(ADK_PACKAGE_NUT) += nut
+package-$(ADK_PACKAGE_LIBNCURSES) += ncurses
+package-$(ADK_COMPILE_NDISC6) += ndisc
+package-$(ADK_PACKAGE_NEON) += neon
+package-$(ADK_COMPILE_NET_SNMP) += net-snmp
+package-$(ADK_PACKAGE_NETPERF) += netperf
+package-$(ADK_PACKAGE_NETSTAT_NAT) += netstat-nat
+package-$(ADK_PACKAGE_NFS_UTILS) += nfs-utils
+package-$(ADK_PACKAGE_NFS_KERNEL_NFSD) += nfs-utils
+package-$(ADK_PACKAGE_NMAP) += nmap
+package-$(ADK_PACKAGE_NOCATSPLASH) += nocatsplash
+package-$(ADK_PACKAGE_NTPCLIENT) += ntpclient
+package-$(ADK_PACKAGE_OBEXFTP) += obexftp
+package-$(ADK_PACKAGE_OLSRD) += olsrd
+package-$(ADK_COMPILE_OPENCDK) += opencdk
+package-$(ADK_PACKAGE_OPENCT) += openct
+package-$(ADK_PACKAGE_OPENOBEX) += openobex
+package-$(ADK_COMPILE_OPENLDAP) += openldap
+package-$(ADK_PACKAGE_OPENNTPD) += openntpd
+package-$(ADK_PACKAGE_OPENSC) += opensc
+package-$(ADK_PACKAGE_OPENSIPS) += opensips
+package-$(ADK_COMPILE_OPENSSH) += openssh
+package-$(ADK_COMPILE_OPENSSL) += openssl
+package-$(ADK_PACKAGE_OPENSSL_PKCS11) += openssl-pkcs11
+package-$(ADK_PACKAGE_OPENSWAN) += openswan
+package-$(ADK_PACKAGE_OPENVPN) += openvpn
+package-$(ADK_PACKAGE_OPROFILE) += oprofile
+package-$(ADK_COMPILE_OSIRIS) += osiris
+package-$(ADK_PACKAGE_OWFS) += owfs
+package-$(ADK_PACKAGE_P910ND) += p910nd
+package-$(ADK_PACKAGE_PALANTIR) += palantir
+package-$(ADK_PACKAGE_PARPROUTED) += parprouted
+package-$(ADK_PACKAGE_PCIUTILS) += pciutils
+package-$(ADK_COMPILE_PCRE) += pcre
+package-$(ADK_COMPILE_PHP) += php
+package-$(ADK_PACKAGE_PICOCOM) += picocom
+package-$(ADK_PACKAGE_PIPACS) += pipacs
+package-$(ADK_PACKAGE_PIXMAN) += pixman
+package-$(ADK_COMPILE_PMACCT) += pmacct
+package-$(ADK_COMPILE_POPT) += popt
+package-$(ADK_PACKAGE_PORTMAP) += portmap
+package-$(ADK_PACKAGE_PORTSENTRY) += portsentry
+package-$(ADK_COMPILE_POSTGRESQL) += postgresql
+package-$(ADK_PACKAGE_PPP) += ppp
+package-$(ADK_PACKAGE_PPTP) += pptp
+package-$(ADK_PACKAGE_PPTPD) += pptpd
+package-$(ADK_PACKAGE_PRIVOXY) += privoxy
+package-$(ADK_PACKAGE_PROCMAIL) += procmail
+package-$(ADK_PACKAGE_PROCPS) += procps
+package-$(ADK_PACKAGE_PTUNNEL) += ptunnel
+package-$(ADK_PACKAGE_QUAGGA) += quagga
+package-$(ADK_COMPILE_RADIUSCLIENT_NG) += radiusclient-ng
+package-$(ADK_PACKAGE_RADDUMP) += raddump
+package-$(ADK_PACKAGE_RADVD) += radvd
+package-$(ADK_PACKAGE_RANDRPROTO) += randrproto
+package-$(ADK_PACKAGE_RARPD) += rarpd
+package-$(ADK_PACKAGE_RDATE) += rdate
+package-$(ADK_COMPILE_READLINE) += readline
+package-$(ADK_PACKAGE_REAIM) += reaim
+package-$(ADK_PACKAGE_RENDERPROTO) += renderproto
+package-$(ADK_PACKAGE_RESOURCEPROTO) += resourceproto
+package-$(ADK_COMPILE_RP_PPPOE) += rp-pppoe
+package-$(ADK_PACKAGE_RRDCOLLECT) += rrdcollect
+package-$(ADK_COMPILE_RRDTOOL) += rrdtool
+package-$(ADK_PACKAGE_RUBY) += ruby
+package-$(ADK_COMPILE_RRS) += rrs
+package-$(ADK_PACKAGE_RSYNC) += rsync
+package-$(ADK_PACKAGE_RTORRENT) += rtorrent
+package-$(ADK_COMPILE_SAMBA) += samba
+package-$(ADK_PACKAGE_SANE_BACKENDS) += sane-backends
+package-$(ADK_PACKAGE_SCANLOGD) += scanlogd
+package-$(ADK_PACKAGE_SCDP) += scdp
+package-$(ADK_PACKAGE_SCREEN) += screen
+package-$(ADK_PACKAGE_SCRNSAVERPROTO) += scrnsaverproto
+package-$(ADK_PACKAGE_SCSI_SPIN) += scsi-spin
+package-$(ADK_PACKAGE_SER2NET) += ser2net
+package-$(ADK_PACKAGE_SERDISPLIB) += serdisplib
+package-$(ADK_PACKAGE_SETPWC) += setpwc
+package-$(ADK_PACKAGE_SETSERIAL) += setserial
+package-$(ADK_PACKAGE_SHAT) += shat
+package-$(ADK_PACKAGE_SHOREWALL) += shorewall-common
+package-${ADK_PACKAGE_SHOREWALL_SHELL} += shorewall-shell
+package-$(ADK_PACKAGE_SIPROXD) += siproxd
+package-$(ADK_PACKAGE_SIPSAK) += sipsak
+package-$(ADK_PACKAGE_SISPMCTL) += sispmctl
+package-$(ADK_PACKAGE_SLURM) += slurm
+package-$(ADK_COMPILE_SNORT) += snort
+package-$(ADK_COMPILE_SNORT_WIRELESS) += snort-wireless
+package-$(ADK_PACKAGE_SOCAT) += socat
+package-$(ADK_COMPILE_SPEEX) += speex
+package-$(ADK_COMPILE_SQLITE) += sqlite
+package-$(ADK_PACKAGE_SQUID) += squid
+package-$(ADK_PACKAGE_SRELAY) += srelay
+package-$(ADK_PACKAGE_SSLTUNNEL) += ssltunnel
+package-$(ADK_PACKAGE_SSMTP) += ssmtp
+package-$(ADK_PACKAGE_STRACE) += strace
+package-$(ADK_PACKAGE_STRESS) += stress
+package-$(ADK_PACKAGE_STRONGSWAN) += strongswan
+package-$(ADK_PACKAGE_SUBVERSION) += subversion
+package-$(ADK_PACKAGE_SWCONFIG) += swconfig
+package-$(ADK_PACKAGE_SYSLOG_NG) += syslog-ng
+package-$(ADK_PACKAGE_SYSSTAT) += sysstat
+package-${ADK_PACKAGE_TCL} += tcl
+package-$(ADK_PACKAGE_LIBWRAP) += tcp_wrappers
+package-$(ADK_PACKAGE_TAR) += tar
+package-$(ADK_PACKAGE_TCPDUMP) += tcpdump
+package-$(ADK_PACKAGE_TINC) += tinc
+package-$(ADK_PACKAGE_TINYPROXY) += tinyproxy
+package-$(ADK_PACKAGE_TMSNC) += tmsnc
+package-$(ADK_PACKAGE_TNTNET) += tntnet
+package-$(ADK_PACKAGE_TOR) += tor
+package-$(ADK_PACKAGE_TRAFSHOW) += trafshow
+package-$(ADK_PACKAGE_TTCP) += ttcp
+ifneq (${ADK_TARGET_LIB_GLIBC},y)
+package-$(ADK_PACKAGE_UCLIBC) += uclibc
+package-$(ADK_PACKAGE_UCLIBCXX) += uclibc++
+endif
+package-$(ADK_PACKAGE_UDEV) += udev
+package-$(ADK_PACKAGE_UDP_BROADCAST_RELAY) += udp-broadcast-relay
+package-$(ADK_PACKAGE_ULOGD) += ulogd
+package-$(ADK_PACKAGE_UPDATEDD) += updatedd
+package-$(ADK_COMPILE_USBUTILS) += usbutils
+package-$(ADK_PACKAGE_USSP_PUSH) += ussp-push
+package-$(ADK_PACKAGE_USTL) += ustl
+package-$(ADK_COMPILE_UTIL_LINUX) += util-linux
+package-$(ADK_PACKAGE_VALGRIND) += valgrind
+package-$(ADK_PACKAGE_VGP) += vgp
+package-$(ADK_PACKAGE_VIDEOPROTO) += videoproto
+package-$(ADK_PACKAGE_VILISTEXTUM) += vilistextum
+package-$(ADK_PACKAGE_VIM) += vim
+package-$(ADK_PACKAGE_VNC_REFLECTOR) += vnc-reflector
+package-$(ADK_PACKAGE_VNSTAT) += vnstat
+package-$(ADK_PACKAGE_VPNC) += vpnc
+package-$(ADK_PACKAGE_VRRPD) += vrrpd
+package-$(ADK_PACKAGE_VSFTPD) += vsftpd
+package-$(ADK_PACKAGE_VTUN) += vtun
+package-$(ADK_PACKAGE_WATCHDOG) += watchdog
+package-$(ADK_PACKAGE_WCCPD) += wccpd
+package-$(ADK_PACKAGE_WDFS) += wdfs
+package-$(ADK_PACKAGE_WEECHAT) += weechat
+package-$(ADK_PACKAGE_WIFIDOG) += wifidog
+package-$(ADK_DOWNLOAD_WIRELESS_FIRMWARE) += wireless-firmware
+package-$(ADK_PACKAGE_WIRELESS_TOOLS) += wireless-tools
+package-$(ADK_PACKAGE_WOL) += wol
+package-$(ADK_PACKAGE_WONDERSHAPER) += wondershaper
+package-$(ADK_PACKAGE_WPA_SUPPLICANT) += wpa_supplicant
+package-$(ADK_PACKAGE_WPUT) += wput
+package-$(ADK_PACKAGE_XFSPROGS) += xfsprogs
+package-$(ADK_PACKAGE_XINETD) += xinetd
+package-$(ADK_PACKAGE_XCMISCPROTO) += xcmiscproto
+package-$(ADK_PACKAGE_XEXTPROTO) += xextproto
+package-$(ADK_PACKAGE_XF86DGA) += xf86dga
+package-$(ADK_PACKAGE_XF86DGAPROTO) += xf86dgaproto
+package-$(ADK_PACKAGE_XPROTO) += xproto
+package-$(ADK_PACKAGE_XORG_SERVER) += xorg-server
+package-$(ADK_PACKAGE_XTRANS) += xtrans
+package-$(ADK_PACKAGE_ZLIB) += zlib
+package-$(ADK_PACKAGE_ZSH) += zsh
+# kernel addon packages
+package-$(ADK_PACKAGE_KMOD_EM28XX) += em28xx
+package-$(ADK_PACKAGE_KMOD_MAC80211) += mac80211
+package-$(ADK_PACKAGE_KMOD_FS_NTFS_3G) += ntfs-3g
+
+DOWNLOAD:=$(patsubst %,%-download,$(package-y) $(package-m))
+COMPILE_PACKAGES:=$(patsubst %,%-compile,$(package-y) $(package-m))
+INSTALL_PACKAGES:=$(patsubst %,%-install,$(package-y))
+
+all: compile
+clean: $(patsubst %,%-clean,$(package-) $(package-y) $(package-m) base-files)
+compile: base-files-compile $(COMPILE_PACKAGES)
+install: base-files-install $(INSTALL_PACKAGES)
+download: $(DOWNLOAD)
+
+$(COMPILE_PACKAGES): base-files-compile
+$(INSTALL_PACKAGES): base-files-install
+
+$(TARGET_DIR):
+	mkdir -p $(TARGET_DIR)
+
+%-download:
+	$(START_TRACE) "package/$(patsubst %-download,%,$@)-download: "
+	$(MAKE) -C $(patsubst %-download,%,$@) fetch
+	$(CMD_TRACE) " done"
+	$(END_TRACE)
+
+%-compile:
+	$(START_TRACE) "package/$(patsubst %-compile,%,$@)-compile: "
+	$(MAKE) -C $(patsubst %-compile,%,$@) fake build-all-ipkgs
+	$(CMD_TRACE) " done"
+	$(END_TRACE)
+
+%-install: %-compile
+	@$(START_TRACE) "package/$(patsubst %-install,%,$@)-install: "
+	@$(MAKE) -C $(patsubst %-install,%,$@) install
+	@$(CMD_TRACE) " done"
+	@$(END_TRACE)
+
+%-clean:
+	@$(START_TRACE) "package/$(patsubst %-clean,%,$@)-clean: "
+	@$(MAKE) -C $(patsubst %-clean,%,$@) clean
+	@$(CMD_TRACE) " done"
+	@$(END_TRACE)

+ 12 - 0
package/aiccu/Config.in

@@ -0,0 +1,12 @@
+config ADK_PACKAGE_AICCU
+	prompt "aiccu............................. SixXS Automatic IPv6 Connectivity Client Utility"
+	depends on ADK_IPV6
+	tristate
+	default n
+	select ADK_KPACKAGE_KMOD_IPV6
+	select ADK_PACKAGE_LIBPTHREAD
+	help
+	  SixXS Automatic IPv6 Connectivity Client Utility
+	  
+	  For more information about SixXS check http://www.sixxs.net/
+

+ 36 - 0
package/aiccu/Makefile

@@ -0,0 +1,36 @@
+# $Id$
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=		aiccu
+PKG_VERSION:=		20070115
+PKG_RELEASE:=		7
+PKG_MD5SUM:=		c9bcc83644ed788e22a7c3f3d4021350
+
+MASTER_SITES:=		http://www.sixxs.net/archive/sixxs/aiccu/unix/
+DISTFILES:=		$(PKG_NAME)_$(PKG_VERSION).tar.gz
+
+WRKDIST=		${WRKDIR}/$(PKG_NAME)
+
+include $(TOPDIR)/mk/package.mk
+
+$(eval $(call PKG_template,AICCU,aiccu,$(PKG_VERSION)-$(PKG_RELEASE),$(ARCH)))
+
+TCFLAGS+=	-D_REENTRANT -D_GNU_SOURCE -DAICCU_CONSOLE \
+		-D_LINUX -DHAS_IFHEAD -DAICCU_TYPE=\"linux\"
+TLDFLAGS+=	-lpthread -lresolv
+BUILD_STYLE=	auto
+MAKE_FLAGS+=	CC='${TARGET_CC}' CFLAGS='${TCFLAGS}' LDFLAGS='${TLDFLAGS}'
+
+do-install:
+	$(INSTALL_DIR) $(IDIR_AICCU)/usr/sbin
+	$(INSTALL_DIR) $(IDIR_AICCU)/etc/init.d
+	$(INSTALL_BIN) $(WRKBUILD)/unix-console/aiccu $(IDIR_AICCU)/usr/sbin/
+	$(INSTALL_BIN) ./files/aiccu.init \
+		$(IDIR_AICCU)/etc/init.d/aiccu
+	$(INSTALL_DATA) $(WRKBUILD)/doc/aiccu.conf $(IDIR_AICCU)/etc/aiccu.conf
+
+include ${TOPDIR}/mk/pkg-bottom.mk

+ 51 - 0
package/aiccu/extra/common/dn_skipname.c

@@ -0,0 +1,51 @@
+#include <errno.h>
+#include <resolv.h>
+
+/* Ripped from glibc 2.4 sources. */
+
+/*
+ * ns_name_skip(ptrptr, eom)
+ *      Advance *ptrptr to skip over the compressed name it points at.
+ * return:
+ *      0 on success, -1 (with errno set) on failure.
+ */
+int ns_name_skip(const u_char **ptrptr, const u_char *eom)
+{
+	const u_char *cp;
+	u_int n;
+
+	cp = *ptrptr;
+	while (cp < eom && (n = *cp++) != 0)
+	{
+		/* Check for indirection. */
+		switch (n & NS_CMPRSFLGS) {
+		case 0:                 /* normal case, n == len */
+			cp += n;
+			continue;
+		case NS_CMPRSFLGS:      /* indirection */
+			cp++;
+			break;
+		default:                /* illegal type */
+			errno = EMSGSIZE;
+			return (-1);
+		}
+		break;
+	}
+	if (cp > eom)
+	{
+		errno = EMSGSIZE;
+		return (-1);
+	}
+	*ptrptr = cp;
+	return (0);
+}
+
+int dn_skipname(const u_char *ptr, const u_char *eom)
+{
+	const u_char *saveptr = ptr;
+
+	if(ns_name_skip(&ptr, eom) == -1)
+		return (-1);
+	return (ptr - saveptr);
+}
+

+ 27 - 0
package/aiccu/files/aiccu.init

@@ -0,0 +1,27 @@
+#!/bin/sh
+#FWINIT 60
+. /etc/rc.conf
+
+case $1 in
+autostop) ;;
+autostart)
+	test x"${aiccu:-NO}" = x"NO" && exit 0
+	exec sh $0 start
+	;;
+start)
+	aiccu start	
+	;;
+stop)
+	aiccu stop
+	;;
+
+restart)
+	sh $0 stop
+	sh $0 start
+	;;
+*)
+	echo "Usage: $0 {start | stop | restart}"
+	exit 1
+	;;
+esac
+exit $?

+ 1 - 0
package/aiccu/ipkg/aiccu.conffiles

@@ -0,0 +1 @@
+/etc/aiccu.conf

+ 5 - 0
package/aiccu/ipkg/aiccu.control

@@ -0,0 +1,5 @@
+Package: aiccu
+Priority: optional
+Section: net
+Depends: kmod-ipv6, libpthread
+Description: SixXS Automatic IPv6 Connectivity Client Utility

+ 3 - 0
package/aiccu/ipkg/aiccu.postinst

@@ -0,0 +1,3 @@
+#!/bin/sh
+. $IPKG_INSTROOT/etc/functions.sh
+add_rcconf aiccu aiccu NO

+ 30 - 0
package/aiccu/patches/patch-common_resolver_c

@@ -0,0 +1,30 @@
+$Id$
+--- aiccu.orig/common/resolver.c	Sun Jul 23 14:54:51 2006
++++ aiccu/common/resolver.c	Mon Jun 25 13:18:22 2007
+@@ -26,7 +26,7 @@
+ 
+ int getrrs(const char *label, int rrtype, void gotrec(unsigned int num, int type, const char *record))
+ {
+-#ifdef _LINUX
++#if defined(_LINUX) && !defined(__UCLIBC__)
+ 	struct __res_state	res;
+ #endif
+ 	unsigned char		answer[8192];
+@@ -38,7 +38,7 @@ int getrrs(const char *label, int rrtype
+ 	uint16_t		type = 0, class = 0;
+ 	uint32_t		ttl = 0;
+ 
+-#ifdef _LINUX
++#if defined(_LINUX) && !defined(__UCLIBC__)
+ 	memset(&res, 0, sizeof(res));
+ 	res.options = RES_DEBUG;
+ 	res_ninit(&res);
+@@ -47,7 +47,7 @@ int getrrs(const char *label, int rrtype
+ #endif
+ 
+ 	memset(answer, 0, sizeof(answer));
+-#ifdef _LINUX
++#if defined(_LINUX) && !defined(__UCLIBC__)
+ 	ret = res_nquery(&res, label, C_IN, rrtype, answer, sizeof(answer));
+ #else
+ 	ret = res_query(label, C_IN, rrtype, answer, sizeof(answer));

+ 27 - 0
package/aiccu/patches/patch-unix-console_Makefile

@@ -0,0 +1,27 @@
+$Id$
+--- aiccu.orig/unix-console/Makefile	Mon Jan 15 11:04:04 2007
++++ aiccu/unix-console/Makefile	Mon Jun 25 13:19:42 2007
+@@ -10,9 +10,9 @@
+ #  $Date: 2007-01-15 11:04:27 $
+ # **********************************************************/
+ 
+-SRCS	= main.c ../common/tun.c ../common/aiccu.c ../common/hash_md5.c ../common/hash_sha1.c ../common/common.c ../common/heartbeat.c ../common/tic.c ../common/ayiya.c ../common/aiccu_test.c ../common/resolver.c
++SRCS	= main.c ../common/tun.c ../common/aiccu.c ../common/hash_md5.c ../common/hash_sha1.c ../common/common.c ../common/heartbeat.c ../common/tic.c ../common/ayiya.c ../common/aiccu_test.c ../common/resolver.c ../common/dn_skipname.c
+ INCS	= ../common/tun.h ../common/aiccu.h ../common/hash_md5.h ../common/hash_sha1.h ../common/common.h ../common/heartbeat.h ../common/tic.h ../common/ayiya.h ../common/resolver.h
+-OBJS	= main.o ../common/tun.o ../common/aiccu.o ../common/hash_md5.o ../common/hash_sha1.o ../common/common.o ../common/heartbeat.o ../common/tic.o ../common/ayiya.o ../common/aiccu_test.o ../common/resolver.o
++OBJS	= main.o ../common/tun.o ../common/aiccu.o ../common/hash_md5.o ../common/hash_sha1.o ../common/common.o ../common/heartbeat.o ../common/tic.o ../common/ayiya.o ../common/aiccu_test.o ../common/resolver.o ../common/dn_skipname.o
+ 
+ # New features not fully implemented and thus disabled for now
+ #CFLAGS	+= -D NEWSTUFF_TSP -D NEWSTUFF_TEEPEE
+@@ -145,11 +145,6 @@ all: aiccu
+ 
+ aiccu:	$(OBJS) ${SRCS} ${INCS}
+ 	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJS)
+-ifeq ($(shell echo $(CFLAGS) | grep -c "DEBUG"),0)
+-ifeq ($(shell echo "$(RPM_OPT_FLAGS)" | wc -c),1)
+-	strip $@
+-endif
+-endif
+ 
+ clean:
+ 	$(RM) -f $(OBJS) aiccu

+ 16 - 0
package/aircrack-ng/Config.in

@@ -0,0 +1,16 @@
+config ADK_PACKAGE_AIRCRACK_NG
+	prompt "aircrack-ng....................... A set of tools for auditing wireless networks"
+	tristate
+	default n
+	select ADK_PACKAGE_LIBPTHREAD
+	select ADK_PACKAGE_LIBPCAP
+	select ADK_PACKAGE_LIBOPENSSL
+	help
+	  aircrack-ng is a set of tools for auditing wireless networks:
+	  
+	  * aircrack-ng: a program that cracks WEP and WPA (bruteforce) keys
+	  * airdecap-ng: decrypts WEP or WPA encrypted capture files with known key
+	  * airmon-ng: responsible for placing different cards in monitor mode
+	  * aireplay-ng: responsible for packet injection
+	  * airodump-ng: places all air traffic into .cap file and shows information on networks
+	  http://www.aircrack-ng.org

+ 35 - 0
package/aircrack-ng/Makefile

@@ -0,0 +1,35 @@
+# $Id$
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=		aircrack-ng
+PKG_VERSION:=		1.0-rc3
+PKG_RELEASE:=		1
+PKG_MD5SUM:=		37884de939af82eab60d3e7d165b40ad
+MASTER_SITES:=		http://download.aircrack-ng.org/
+
+include $(TOPDIR)/mk/package.mk
+
+$(eval $(call PKG_template,AIRCRACK_NG,aircrack-ng,$(PKG_VERSION)-$(PKG_RELEASE),$(ARCH)))
+
+BUILD_STYLE=	auto
+INSTALL_STYLE=	auto
+XAKE_FLAGS+=	CC="$(TARGET_CC)" \
+		CFLAGS="$(TARGET_CFLAGS) -Wall" \
+		CROSS="$(TARGET_CROSS)" OSNAME="Linux" \
+		prefix="/usr"
+
+post-install:
+	$(INSTALL_DIR) $(IDIR_AIRCRACK_NG)/usr/bin
+	$(INSTALL_DIR) $(IDIR_AIRCRACK_NG)/usr/sbin
+	$(INSTALL_BIN) $(WRKINST)/usr/bin/aircrack-ng $(IDIR_AIRCRACK_NG)/usr/bin/
+	$(INSTALL_BIN) $(WRKINST)/usr/bin/airdecap-ng $(IDIR_AIRCRACK_NG)/usr/bin/
+	$(INSTALL_BIN) $(WRKINST)/usr/bin/packetforge-ng $(IDIR_AIRCRACK_NG)/usr/bin/
+	$(INSTALL_BIN) $(WRKINST)/usr/sbin/aireplay-ng $(IDIR_AIRCRACK_NG)/usr/sbin/
+	$(INSTALL_BIN) $(WRKINST)/usr/sbin/airodump-ng $(IDIR_AIRCRACK_NG)/usr/sbin/
+	$(INSTALL_BIN) $(WRKINST)/usr/sbin/airtun-ng $(IDIR_AIRCRACK_NG)/usr/sbin/
+
+include ${TOPDIR}/mk/pkg-bottom.mk

+ 5 - 0
package/aircrack-ng/ipkg/aircrack-ng.control

@@ -0,0 +1,5 @@
+Package: aircrack-ng
+Priority: optional
+Section: net
+Depends: libpthread, libopenssl, libpcap
+Description: A set of tools for auditing wireless networks

+ 189 - 0
package/aircrack-ng/patches/patch-src_airbase-ng_c

@@ -0,0 +1,189 @@
+$Id: update-patches 24 2008-08-31 14:56:13Z wbx $
+--- aircrack-ng-1.0-rc3.orig/src/airbase-ng.c	2009-03-26 22:01:02.000000000 +0100
++++ aircrack-ng-1.0-rc3/src/airbase-ng.c	2009-05-01 15:54:30.000000000 +0200
+@@ -627,7 +627,7 @@ int addFrag(unsigned char* packet, unsig
+     if(rFragment == NULL)
+         return -1;
+ 
+-    bzero(frame, 4096);
++    memset(frame, 0, 4096);
+     memcpy(frame, packet, len);
+ 
+     z = ( ( frame[1] & 3 ) != 3 ) ? 24 : 30;
+@@ -1683,7 +1683,7 @@ int intercept(uchar* packet, int length)
+     uchar K[128];
+     int z=0;
+ 
+-    bzero(buf, 4096);
++    memset(buf, 0, 4096);
+ 
+     z = ( ( packet[1] & 3 ) != 3 ) ? 24 : 30;
+ 
+@@ -1784,7 +1784,7 @@ int packet_xmit(uchar* packet, int lengt
+ 
+         if((opt.external & EXT_OUT))
+         {
+-            bzero(buf, 4096);
++            memset(buf, 0, 4096);
+             memcpy(buf+14, h80211, length2);
+             //mark it as outgoing packet
+             buf[12] = 0xFF;
+@@ -1823,7 +1823,7 @@ int packet_xmit_external(uchar* packet, 
+     if(length < 40 || length > 3000)
+         return 1;
+ 
+-    bzero(buf, 4096);
++    memset(buf, 0, 4096);
+     if(memcmp(packet, buf, 11) != 0)
+     {
+ //         printf("wrong header...\n");
+@@ -2099,13 +2099,13 @@ int addCF(uchar* packet, int length)
+     if(opt.cf_count >= 100)
+         return 1;
+ 
+-    bzero(clear, 4096);
+-    bzero(final, 4096);
+-    bzero(flip, 4096);
+-    bzero(frag1, 128);
+-    bzero(frag2, 128);
+-    bzero(frag3, 128);
+-    bzero(keystream, 128);
++    memset(clear, 0, 4096);
++    memset(final, 0, 4096);
++    memset(flip, 0, 4096);
++    memset(frag1, 0, 128);
++    memset(frag2, 0, 128);
++    memset(frag3, 0, 128);
++    memset(keystream, 0, 128);
+ 
+     switch( packet[1] & 3 )
+     {
+@@ -2364,7 +2364,7 @@ int addarp(uchar* packet, int length)
+     if(opt.nb_arp >= opt.ringbuffer)
+         return -1;
+ 
+-    bzero(flip, 4096);
++    memset(flip, 0, 4096);
+ 
+     flip[49-z-4] ^= ((rand() % 255)+1); //flip random bits in last byte of sender MAC
+     flip[53-z-4] ^= ((rand() % 255)+1); //flip random bits in last byte of sender IP
+@@ -2519,7 +2519,7 @@ int packet_recv(uchar* packet, int lengt
+     struct ST_info *st_prv = NULL;
+ 
+ 	reasso = 0; fixed = 0;
+-    bzero(essid, 256);
++    memset(essid, 0, 256);
+ 
+     pthread_mutex_lock( &mx_cap );
+     if(opt.record_data)
+@@ -2643,7 +2643,7 @@ int packet_recv(uchar* packet, int lengt
+             st_cur->ssid_length[i] = 0;
+         }
+ 
+-        bzero(st_cur->essid, 256);
++        memset(st_cur->essid, 0, 256);
+         st_cur->essid_length = 0;
+ 
+         st_cur->wpatype = 0;
+@@ -2769,7 +2769,7 @@ int packet_recv(uchar* packet, int lengt
+                     len += 8;
+ 
+                     //eapol
+-                    bzero(h80211+len, 99);
++                    memset(h80211+len, 0, 99);
+                     h80211[len]    = 0x01;//version
+                     h80211[len+1]  = 0x03;//type
+                     h80211[len+2]  = 0x00;
+@@ -2818,7 +2818,7 @@ int packet_recv(uchar* packet, int lengt
+                     h80211[len+7] = 0x00;
+                     h80211[len+8] = 0x20; //keylen
+ 
+-                    bzero(h80211+len+9, 90);
++                    memset(h80211+len+9, 0, 90);
+                     memcpy(h80211+len+17, st_cur->wpa.anonce, 32);
+ 
+                     len+=99;
+@@ -2944,7 +2944,7 @@ int packet_recv(uchar* packet, int lengt
+         if(length < 60)
+         {
+             trailer = 60 - length;
+-            bzero(h80211 + length, trailer);
++            memset(h80211 + length, 0, trailer);
+             length += trailer;
+         }
+ 
+@@ -2961,7 +2961,7 @@ int packet_recv(uchar* packet, int lengt
+             {
+                 if( opt.promiscuous || !opt.f_essid || gotESSID((char*)tag, len) == 1)
+                 {
+-                    bzero(essid, 256);
++                    memset(essid, 0, 256);
+                     memcpy(essid, tag, len);
+ 
+                     /* store probes */
+@@ -3355,11 +3355,11 @@ skip_probe:
+                 printf("\n");
+             }
+ 
+-            bzero(st_cur->essid, 256);
++            memset(st_cur->essid, 0, 256);
+             memcpy(st_cur->essid, essid, 255);
+             st_cur->essid_length = strlen(essid);
+ 
+-            bzero(essid, 256);
++            memset(essid, 0, 256);
+ 
+             /* either specified or determined */
+             if( (opt.sendeapol && ( opt.wpa1type || opt.wpa2type ) ) || (st_cur->wpatype && st_cur->wpahash) )
+@@ -3391,7 +3391,7 @@ skip_probe:
+                 len += 8;
+ 
+                 //eapol
+-                bzero(h80211+len, 99);
++                memset(h80211+len, 0, 99);
+                 h80211[len]    = 0x01;//version
+                 h80211[len+1]  = 0x03;//type
+                 h80211[len+2]  = 0x00;
+@@ -3440,7 +3440,7 @@ skip_probe:
+                 h80211[len+7] = 0x00;
+                 h80211[len+8] = 0x20; //keylen
+ 
+-                bzero(h80211+len+9, 90);
++                memset(h80211+len+9, 0, 90);
+                 memcpy(h80211+len+17, st_cur->wpa.anonce, 32);
+ 
+                 len+=99;
+@@ -3729,7 +3729,7 @@ int cfrag_fuzz(unsigned char *packet, in
+     else
+         smac = packet + 24;
+ 
+-    bzero(overlay, 4096);
++    memset(overlay, 0, 4096);
+ 
+     smac[4] ^= rnd[0];
+     smac[5] ^= rnd[1];
+@@ -3902,19 +3902,19 @@ int main( int argc, char *argv[] )
+     memset( &apc, 0, sizeof( struct AP_conf ));
+ 
+     rESSID = (pESSID_t) malloc(sizeof(struct ESSID_list));
+-    bzero(rESSID, sizeof(struct ESSID_list));
++    memset(rESSID, 0, sizeof(struct ESSID_list));
+ 
+     rFragment = (pFrag_t) malloc(sizeof(struct Fragment_list));
+-    bzero(rFragment, sizeof(struct Fragment_list));
++    memset(rFragment, 0, sizeof(struct Fragment_list));
+ 
+     rClient = (pMAC_t) malloc(sizeof(struct MAC_list));
+-    bzero(rClient, sizeof(struct MAC_list));
++    memset(rClient, 0, sizeof(struct MAC_list));
+ 
+     rBSSID = (pMAC_t) malloc(sizeof(struct MAC_list));
+-    bzero(rBSSID, sizeof(struct MAC_list));
++    memset(rBSSID, 0, sizeof(struct MAC_list));
+ 
+     rCF = (pCF_t) malloc(sizeof(struct CF_packet));
+-    bzero(rCF, sizeof(struct CF_packet));
++    memset(rCF, 0, sizeof(struct CF_packet));
+ 
+     pthread_mutex_init( &mx_cf, NULL );
+     pthread_mutex_init( &mx_cap, NULL );

+ 41 - 0
package/aircrack-ng/patches/patch-src_aircrack-ng_c

@@ -0,0 +1,41 @@
+$Id: update-patches 24 2008-08-31 14:56:13Z wbx $
+--- aircrack-ng-1.0-rc3.orig/src/aircrack-ng.c	2009-03-26 22:01:02.000000000 +0100
++++ aircrack-ng-1.0-rc3/src/aircrack-ng.c	2009-05-01 15:53:30.000000000 +0200
+@@ -245,7 +245,7 @@ void clean_exit(int ret)
+ 	int child_pid;
+ 
+ 	char tmpbuf[128];
+-	bzero(tmpbuf, 128);
++	memset(tmpbuf, 0, 128);
+ 
+ 	if(ret && !opt.is_quiet)
+ 	{
+@@ -738,7 +738,7 @@ void read_thread( void *arg )
+ 	memset( &rb, 0, sizeof( rb ) );
+ 	ap_cur = NULL;
+ 
+-	bzero(&pfh, sizeof(struct pcap_file_header));
++	memset(&pfh, 0, sizeof(struct pcap_file_header));
+ 
+ 	if( ( buffer = (uchar *) malloc( 65536 ) ) == NULL )
+ 	{
+@@ -1401,8 +1401,8 @@ void read_thread( void *arg )
+                                     dlen -=6;
+                                 }
+ 
+-				bzero(weight, sizeof(weight));
+-				bzero(clear, sizeof(clear));
++				memset(weight, 0, sizeof(weight));
++				memset(clear, 0, sizeof(clear));
+ 
+ 				/* calculate keystream */
+ 				k = known_clear(clear, &clearsize, weight, h80211, dlen);
+@@ -4525,7 +4525,7 @@ int main( int argc, char *argv[] )
+ 
+ 	/*
+ 	all_ivs = malloc( (256*256*256) * sizeof(used_iv));
+-	bzero(all_ivs, (256*256*256)*sizeof(used_iv));
++	memset(all_ivs, 0, (256*256*256)*sizeof(used_iv));
+ 	*/
+ 
+ 	forceptw = 0;

+ 21 - 0
package/aircrack-ng/patches/patch-src_aircrack-ptw-lib_c

@@ -0,0 +1,21 @@
+$Id: update-patches 24 2008-08-31 14:56:13Z wbx $
+--- aircrack-ng-1.0-rc3.orig/src/aircrack-ptw-lib.c	2009-03-26 22:01:02.000000000 +0100
++++ aircrack-ng-1.0-rc3/src/aircrack-ptw-lib.c	2009-05-01 15:52:04.000000000 +0200
+@@ -454,7 +454,7 @@ int PTW_computeKey(PTW_attackstate * sta
+ 	{
+ 		// Try the original klein attack first
+ 		for (i = 0; i < keylen; i++) {
+-			bzero(&table[i][0], sizeof(PTW_tableentry) * n);
++			memset(&table[i][0], 0, sizeof(PTW_tableentry) * n);
+ 			for (j = 0; j < n; j++) {
+ 				table[i][j].b = j;
+ 			}
+@@ -602,7 +602,7 @@ PTW_attackstate * PTW_newattackstate() {
+ 	if (state == NULL) {
+ 		return NULL;
+ 	}
+-	bzero(state, sizeof(PTW_attackstate));
++	memset(state, 0, sizeof(PTW_attackstate));
+ 	for (i = 0; i < PTW_KEYHSBYTES; i++) {
+                 for (k = 0; k < n; k++) {
+                         state->table[i][k].b = k;

+ 42 - 0
package/aircrack-ng/patches/patch-src_aireplay-ng_c

@@ -0,0 +1,42 @@
+$Id: update-patches 24 2008-08-31 14:56:13Z wbx $
+--- aircrack-ng-1.0-rc3.orig/src/aireplay-ng.c	2009-03-26 22:01:02.000000000 +0100
++++ aircrack-ng-1.0-rc3/src/aireplay-ng.c	2009-05-01 15:52:04.000000000 +0200
+@@ -2908,7 +2908,7 @@ add_arp:
+                     return( 1 );
+                 }
+ 
+-                bzero(flip, 4096);
++                memset(flip, 0, 4096);
+ 
+ //                 flip[49-24-4] ^= ((rand() % 255)+1); //flip random bits in last byte of sender MAC
+ //                 flip[53-24-4] ^= ((rand() % 255)+1); //flip random bits in last byte of sender IP
+@@ -3086,13 +3086,13 @@ read_packets:
+             break;
+     }
+ 
+-    bzero(clear, 4096);
+-    bzero(final, 4096);
+-    bzero(flip, 4096);
+-    bzero(frag1, 128);
+-    bzero(frag2, 128);
+-    bzero(frag3, 128);
+-    bzero(keystream, 128);
++    memset(clear, 0, 4096);
++    memset(final, 0, 4096);
++    memset(flip, 0, 4096);
++    memset(frag1, 0, 128);
++    memset(frag2, 0, 128);
++    memset(frag3, 0, 128);
++    memset(keystream, 0, 128);
+ 
+     /* check if it's a potential ARP request */
+ 
+@@ -3378,7 +3378,7 @@ int do_attack_chopchop( void )
+     if( opt.r_smac_set == 1 )
+     {
+         //handle picky APs (send one valid packet before all the invalid ones)
+-        bzero(packet, sizeof(packet));
++        memset(packet, 0, sizeof(packet));
+ 
+         memcpy( packet, NULL_DATA, 24 );
+         memcpy( packet +  4, "\xFF\xFF\xFF\xFF\xFF\xFF", 6 );

+ 21 - 0
package/aircrack-ng/patches/patch-src_airodump-ng_c

@@ -0,0 +1,21 @@
+$Id: update-patches 24 2008-08-31 14:56:13Z wbx $
+--- aircrack-ng-1.0-rc3.orig/src/airodump-ng.c	2009-03-26 22:01:02.000000000 +0100
++++ aircrack-ng-1.0-rc3/src/airodump-ng.c	2009-05-01 15:52:04.000000000 +0200
+@@ -4325,7 +4325,7 @@ int detect_frequencies(struct wif *wi)
+     printf("Checking available frequencies, this could take few seconds.\n");
+ 
+     frequencies = (int*) malloc((max_freq_num+1) * sizeof(int)); //field for frequencies supported
+-    bzero(frequencies, (max_freq_num+1) * sizeof(int));
++    memset(frequencies, 0, (max_freq_num+1) * sizeof(int));
+     for(freq=start_freq; freq<=end_freq; freq+=5)
+     {
+         if(wi_set_freq(wi, freq) == 0)
+@@ -4388,7 +4388,7 @@ int rearrange_frequencies()
+     pos = 0;
+ 
+     freqs = malloc(sizeof(int) * (count + 1));
+-    bzero(freqs, sizeof(int) * (count + 1));
++    memset(freqs, 0, sizeof(int) * (count + 1));
+     round_done = 0;
+ 
+     while(left > 0)

+ 21 - 0
package/aircrack-ng/patches/patch-src_airtun-ng_c

@@ -0,0 +1,21 @@
+$Id: update-patches 24 2008-08-31 14:56:13Z wbx $
+--- aircrack-ng-1.0-rc3.orig/src/airtun-ng.c	2009-03-26 22:01:02.000000000 +0100
++++ aircrack-ng-1.0-rc3/src/airtun-ng.c	2009-05-01 15:52:04.000000000 +0200
+@@ -222,7 +222,7 @@ int addFrag(unsigned char* packet, unsig
+     if(rFragment == NULL)
+         return -1;
+ 
+-    bzero(frame, 4096);
++    memset(frame, 0, 4096);
+     memcpy(frame, packet, len);
+ 
+     z = ( ( frame[1] & 3 ) != 3 ) ? 24 : 30;
+@@ -1029,7 +1029,7 @@ int main( int argc, char *argv[] )
+     memset( &dev, 0, sizeof( dev ) );
+ 
+     rFragment = (pFrag_t) malloc(sizeof(struct Fragment_list));
+-    bzero(rFragment, sizeof(struct Fragment_list));
++    memset(rFragment, 0, sizeof(struct Fragment_list));
+ 
+     opt.r_nbpps = 100;
+     opt.tods    = 0;

+ 17 - 0
package/aircrack-ng/patches/patch-src_osdep_linux_c

@@ -0,0 +1,17 @@
+$Id: update-patches 24 2008-08-31 14:56:13Z wbx $
+--- aircrack-ng-1.0-rc3.orig/src/osdep/linux.c	2009-03-26 22:01:02.000000000 +0100
++++ aircrack-ng-1.0-rc3/src/osdep/linux.c	2009-05-01 15:52:04.000000000 +0200
+@@ -1639,11 +1639,11 @@ static int do_linux_open(struct wif *wi,
+ 
+         //use name in buf as new iface and set original iface as main iface
+         dev->main_if = (char*) malloc(strlen(iface)+1);
+-        bzero(dev->main_if, strlen(iface)+1);
++        memset(dev->main_if, 0, strlen(iface)+1);
+         strncpy(dev->main_if, iface, strlen(iface));
+ 
+         iface=(char*)malloc(strlen(buf)+1);
+-        bzero(iface, strlen(buf)+1);
++        memset(iface, 0, strlen(buf)+1);
+         strncpy(iface, buf, strlen(buf));
+     }
+ 

+ 11 - 0
package/aircrack-ng/patches/patch-src_version_h

@@ -0,0 +1,11 @@
+$Id: update-patches 24 2008-08-31 14:56:13Z wbx $
+--- aircrack-ng-1.0-rc3.orig/src/version.h	2009-03-26 22:01:02.000000000 +0100
++++ aircrack-ng-1.0-rc3/src/version.h	2009-05-01 15:56:37.000000000 +0200
+@@ -1,6 +1,7 @@
+ #define _MAJ 1
+ #define _MIN 0
+ #define _SUB_MIN 0
++#define _REVISION 1
+ #define _BETA 0
+ #define _RC 3
+ #define WEBSITE "http://www.aircrack-ng.org"

+ 7 - 0
package/alsa-lib/Config.in

@@ -0,0 +1,7 @@
+config ADK_PACKAGE_ALSA_LIB
+	prompt "alsa-lib............................ alsa library"
+	tristate
+	default n
+	help
+	  
+	  http://www.alsa-project.org/

+ 31 - 0
package/alsa-lib/Makefile

@@ -0,0 +1,31 @@
+# $Id$
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+include ${TOPDIR}/rules.mk
+
+PKG_NAME:=		alsa-lib
+PKG_VERSION:=		1.0.19
+PKG_RELEASE:=		1
+PKG_MD5SUM:=		73db3666c211e5fb023bb77450cf430d
+MASTER_SITES:=		ftp://ftp.task.gda.pl/pub/linux/misc/alsa/lib/ \
+			ftp://ftp.alsa-project.org/pub/lib/
+DISTFILES:=             ${PKG_NAME}-${PKG_VERSION}.tar.bz2
+
+include ${TOPDIR}/mk/package.mk
+
+$(eval $(call PKG_template,ALSA_LIB,alsa-lib,${PKG_VERSION}-${PKG_RELEASE},${ARCH}))
+
+CONFIGURE_STYLE=	gnu
+CONFIGURE_ARGS+=	--disable-python
+BUILD_STYLE=		auto
+INSTALL_STYLE=		auto confprog
+
+post-install:
+	${INSTALL_DIR} ${IDIR_ALSA_LIB}/usr/lib
+	${INSTALL_DIR} ${IDIR_ALSA_LIB}/usr/share/alsa
+	${CP} ${WRKINST}/usr/lib/libasound.so.* ${IDIR_ALSA_LIB}/usr/lib/
+	${CP} ${WRKINST}/usr/share/alsa/* ${IDIR_ALSA_LIB}/usr/share/alsa/
+
+include ${TOPDIR}/mk/pkg-bottom.mk

+ 4 - 0
package/alsa-lib/ipkg/alsa-lib.control

@@ -0,0 +1,4 @@
+Package: alsa-lib
+Priority: optional
+Section: libs
+Description: ALSA sound library

+ 4 - 0
package/alsa-lib/ipkg/alsa-lib.postinst

@@ -0,0 +1,4 @@
+#!/bin/sh
+. $IPKG_INSTROOT/etc/functions.sh
+gid=$(get_next_gid)
+add_group audio $gid

+ 7 - 0
package/alsa-utils/Config.in

@@ -0,0 +1,7 @@
+config ADK_PACKAGE_ALSA_UTILS
+	prompt "alsa-utils........................ ALSA utilities / mixer"
+	tristate
+	default n
+	help
+	  
+	  http://www.alsa-project.org/

+ 31 - 0
package/alsa-utils/Makefile

@@ -0,0 +1,31 @@
+# $Id$
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+include ${TOPDIR}/rules.mk
+
+PKG_NAME:=		alsa-utils
+PKG_VERSION:=		1.0.19
+PKG_RELEASE:=		2
+PKG_MD5SUM:=		5ff0379c707c1a29083233edc9ab4e06
+MASTER_SITES:=		ftp://ftp.task.gda.pl/pub/linux/misc/alsa/utils/ \
+			ftp://ftp.alsa-project.org/pub/utils/
+DISTFILES:=             ${PKG_NAME}-${PKG_VERSION}.tar.bz2
+
+include ${TOPDIR}/mk/package.mk
+
+$(eval $(call PKG_template,ALSA_UTILS,alsa-utils,${PKG_VERSION}-${PKG_RELEASE},${ARCH}))
+
+CONFIGURE_STYLE=	gnu
+CONFIGURE_ARGS+=	--disable-alsamixer
+BUILD_STYLE=		auto
+INSTALL_STYLE=		auto
+
+post-install:
+	${INSTALL_DIR} ${IDIR_ALSA_UTILS}/etc/init.d
+	${INSTALL_BIN} ./files/amixer.init ${IDIR_ALSA_UTILS}/etc/init.d/amixer
+	${INSTALL_DIR} ${IDIR_ALSA_UTILS}/usr/bin
+	${CP} ${WRKINST}/usr/bin/amixer ${IDIR_ALSA_UTILS}/usr/bin/
+
+include ${TOPDIR}/mk/pkg-bottom.mk

+ 30 - 0
package/alsa-utils/files/amixer.init

@@ -0,0 +1,30 @@
+#!/bin/sh
+#FWINIT 60
+. /etc/rc.conf
+
+case $1 in
+autostop) ;;
+autostart)
+	test x"${amixer:-NO}" = x"NO" && exit 0
+	exec sh $0 start
+	;;
+start)
+	amixer set Master on
+	amixer set PCM on
+	amixer set Master 75%
+	amixer set PCM 75%
+	;;
+stop)
+	amixer set Master off
+	amixer set PCM off
+	;;
+restart)
+	sh $0 stop
+	sh $0 start
+	;;
+*)
+	echo "Usage: $0 {start | stop | restart}"
+	exit 1
+	;;
+esac
+exit $?

+ 4 - 0
package/alsa-utils/ipkg/alsa-utils.control

@@ -0,0 +1,4 @@
+Package: alsa-utils
+Priority: optional
+Section: libs
+Description: ALSA utilities

+ 4 - 0
package/alsa-utils/ipkg/alsa-utils.postinst

@@ -0,0 +1,4 @@
+#!/bin/sh
+. $IPKG_INSTROOT/etc/functions.sh
+add_rcconf amixer
+

+ 21 - 0
package/alsa-utils/patches/patch-alsactl_init_parse_c

@@ -0,0 +1,21 @@
+$Id: update-patches 24 2008-08-31 14:56:13Z wbx $
+--- alsa-utils-1.0.19.orig/alsactl/init_parse.c	2009-01-19 12:17:19.000000000 +0100
++++ alsa-utils-1.0.19/alsactl/init_parse.c	2009-05-09 04:56:45.000000000 +0200
+@@ -381,7 +381,7 @@ static int set_ctl_value(struct space *s
+ 				snd_ctl_elem_value_set_integer(space->ctl_value, idx, val);
+ 			} else if (items > 2 && value[items-2] == 'd' && value[items-1] == 'B') {
+ 				val = strtol(value, NULL, 0) * 100;
+-				if ((pos2 = index(value, '.')) != NULL) {
++				if ((pos2 = strchr(value, '.')) != NULL) {
+ 					if (isdigit(*(pos2-1)) && isdigit(*(pos2-2))) {
+ 						if (val < 0)
+ 							val -= strtol(pos2 + 1, NULL, 0);
+@@ -1253,7 +1253,7 @@ static char *new_root_dir(const char *fi
+ 
+ 	res = strdup(filename);
+ 	if (res) {
+-		tmp = rindex(res, '/');
++		tmp = strrchr(res, '/');
+ 		if (tmp)
+ 			*tmp = '\0';
+ 	}

+ 12 - 0
package/apr-util/Config.in

@@ -0,0 +1,12 @@
+config ADK_PACKAGE_APR_UTIL
+	prompt "apr-util.......................... Apache Portable Runtime (utils)"
+	tristate
+	default n
+	select ADK_PACKAGE_LIBEXPAT
+	select ADK_PACKAGE_APR
+	help
+	  Apache Portable Runtime
+
+	  http://apr.apache.org
+
+

+ 31 - 0
package/apr-util/Makefile

@@ -0,0 +1,31 @@
+# $Id$
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+include ${TOPDIR}/rules.mk
+
+PKG_NAME:=              apr-util
+PKG_VERSION:=           0.9.15
+PKG_RELEASE:=           1
+PKG_MD5SUM:=            dc772ae295f49ddb8ee8e69a9716c53b
+MASTER_SITES:=		http://apache.mirror.clusters.cc/apr/
+
+include ${TOPDIR}/mk/package.mk
+
+$(eval $(call PKG_template,APR_UTIL,$(PKG_NAME),${PKG_VERSION}-${PKG_RELEASE},${ARCH}))
+
+CONFIGURE_STYLE:=       gnu
+CONFIGURE_ARGS+=	--without-berkeley-db
+CONFIGURE_ARGS+=	--with-apr=${STAGING_DIR}/usr
+CONFIGURE_ARGS+=	--with-expat=${STAGING_DIR}/usr
+BUILD_STYLE:=           auto
+INSTALL_STYLE:=         auto
+XAKE_FLAGS+=		apr_builddir=${STAGING_DIR}/usr/share/build \
+			apr_builders=${STAGING_DIR}/usr/share/build
+
+post-install:
+	${INSTALL_DIR} ${IDIR_APR_UTIL}/usr/lib
+	${CP} ${WRKINST}/usr/lib/libaprutil-0.so* ${IDIR_APR_UTIL}/usr/lib/
+
+include ${TOPDIR}/mk/pkg-bottom.mk

+ 5 - 0
package/apr-util/ipkg/apr-util.control

@@ -0,0 +1,5 @@
+Package: apr-util
+Priority: optional
+Section: lib
+Description: Apache Portable Runtime
+Depends: libexpat, apr

+ 19 - 0
package/apr-util/patches/patch-uri_Makefile_in

@@ -0,0 +1,19 @@
+$Id$
+--- apr-util-0.9.13.orig/uri/Makefile.in	2004-11-25 00:45:40.000000000 +0100
++++ apr-util-0.9.13/uri/Makefile.in	2007-02-07 12:55:37.000000000 +0100
+@@ -3,7 +3,7 @@ VPATH = @srcdir@
+ INCLUDES = @APRUTIL_PRIV_INCLUDES@ @APR_INCLUDES@ @APRUTIL_INCLUDES@ -I.
+ 
+ TARGETS = uri_delims.h apr_uri.lo
+-CLEAN_TARGETS = gen_uri_delims uri_delims.h
++CLEAN_TARGETS = gen_uri_delims
+ 
+ # bring in rules.mk for standard functionality
+ @INCLUDE_RULES@
+@@ -13,6 +13,3 @@ gen_uri_delims: $(gen_uri_delims_OBJECTS
+ 	$(LINK) $(EXTRA_LDFLAGS) $(gen_uri_delims_OBJECTS) $(EXTRA_LIBS)
+ 
+ apr_uri.lo: uri_delims.h apr_uri.c
+-
+-uri_delims.h: gen_uri_delims
+-	./gen_uri_delims > uri_delims.h

+ 21 - 0
package/apr-util/patches/uri_delim.patch

@@ -0,0 +1,21 @@
+diff -Nur apr-util-0.9.13/uri/uri_delims.h build_mipsel/w-apr-util-0.9.13-1/apr-util-0.9.13/uri/uri_delims.h
+--- apr-util-0.9.13/uri/uri_delims.h    1970-01-01 01:00:00.000000000 +0100
++++ build_mipsel/w-apr-util-0.9.13-1/apr-util-0.9.13/uri/uri_delims.h   2007-02-07 13:06:56.000000000 +0100
+@@ -0,0 +1,16 @@
++/* this file is automatically generated by gen_uri_delims, do not edit */
++static const unsigned char uri_delims[256] = {
++    T_NUL,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
++    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,T_HASH,0,0,0,0,
++    0,0,0,0,0,0,0,T_SLASH,0,0,0,0,0,0,0,0,0,0,T_COLON,0,
++    0,0,0,T_QUESTION,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
++    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
++    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
++    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
++    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
++    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
++    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
++    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
++    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
++    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
++};
+

+ 16 - 0
package/apr/Config.in

@@ -0,0 +1,16 @@
+config ADK_PACKAGE_APR
+	prompt "apr............................... Apache Portable Runtime"
+	tristate
+	default n
+	help
+	  Apache Portable Runtime
+
+	  http://apr.apache.org
+
+config ADK_PACKAGE_APR_THREADING
+        prompt "  Enable threading support"
+        bool
+        default n
+        depends ADK_PACKAGE_APR
+        help
+	  Enable threading support in APR.

+ 54 - 0
package/apr/Makefile

@@ -0,0 +1,54 @@
+# $Id$
+#-
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+include ${TOPDIR}/rules.mk
+
+PKG_NAME:=		apr
+PKG_VERSION:=		0.9.17
+PKG_RELEASE:=		1
+PKG_MD5SUM:=		ca1e22d98081a03a33c2a0b8684eb192
+MASTER_SITES:=		http://gd.tuwien.ac.at/infosys/servers/http/apache/dist/${PKG_NAME}/
+
+include ${TOPDIR}/mk/package.mk
+
+$(eval $(call PKG_template,APR,${PKG_NAME},${PKG_VERSION}-${PKG_RELEASE},${ARCH}))
+
+CONFIGURE_STYLE:=	gnu
+CONFIGURE_ENV+=		ac_cv_func_setpgrp_void=no
+CONFIGURE_ENV+=		ac_cv_sizeof_size_t=4
+CONFIGURE_ENV+=		ac_cv_sizeof_ssize_t=4
+CONFIGURE_ENV+=		ac_cv_file__dev_zero=yes
+CONFIGURE_ENV+=		apr_cv_process_shared_works=no
+CONFIGURE_ARGS+=	--with-devrandom=/dev/urandom
+
+ifeq (${ADK_PACKAGE_APR_THREADING},y)
+CONFIGURE_ARGS+=	--enable-threads
+else
+CONFIGURE_ARGS+=	--disable-threads
+endif
+
+BUILD_STYLE:=		auto
+INSTALL_STYLE:=		auto
+
+post-install:
+	${INSTALL_DIR} ${IDIR_APR}/usr/lib
+	${CP} ${WRKINST}/usr/lib/libapr-0.so* ${IDIR_APR}/usr/lib/
+
+	${INSTALL_DIR} ${STAGING_DIR}/usr/share/build
+	${CP} ${WRKINST}/usr/share/build/* ${STAGING_DIR}/usr/share/build/
+
+	# we need to patch paths to get apr-util compiling
+	printf '%s\n%s\n%s\n%s\n%s\nwq\n' \
+	    '/^installbuilddir="/s##&${STAGING_DIR}/#' \
+	    '/^libdir="/s##&${STAGING_DIR}/#' \
+	    '/^datadir="/s##&${STAGING_DIR}/#' \
+	    '/^includedir="/s##&${STAGING_DIR}/#' \
+	    '/^bindir="/s##&${STAGING_DIR}/#' | \
+	    ed -s ${WRKINST}/usr/bin/apr-config
+ifeq (${ADK_PACKAGE_APR_THREADING},y)
+	echo 'Depends: libpthread' >> ${IDIR_APR}/CONTROL/control
+endif
+
+include ${TOPDIR}/mk/pkg-bottom.mk

+ 4 - 0
package/apr/ipkg/apr.control

@@ -0,0 +1,4 @@
+Package: apr
+Priority: optional
+Section: lib
+Description: Apache Portable Runtime

+ 11 - 0
package/arpd/Config.in

@@ -0,0 +1,11 @@
+config ADK_PACKAGE_ARPD
+	prompt "arpd.............................. A daemon to fake ARP replies"
+	tristate
+	default n
+	select ADK_PACKAGE_LIBPCAP
+	select ADK_PACKAGE_LIBDNET
+	select ADK_PACKAGE_LIBEVENT
+	help
+	  Generates ARP responses for (locally unused) IP addresses
+	  
+	  http://www.honeyd.org/tools.php

Some files were not shown because too many files changed in this diff