From a3bdc1fe3486078e9a17b126751633f6627c4911 Mon Sep 17 00:00:00 2001 From: Neale Pickett Date: Tue, 13 Sep 2011 15:50:40 -0600 Subject: [PATCH 01/25] add sshd to inferno --- packages/inferno/service/sshd/log/run | 3 +++ packages/inferno/service/sshd/rsa.key | Bin 0 -> 427 bytes packages/inferno/service/sshd/run | 4 ++++ 3 files changed, 7 insertions(+) create mode 100755 packages/inferno/service/sshd/log/run create mode 100644 packages/inferno/service/sshd/rsa.key create mode 100755 packages/inferno/service/sshd/run diff --git a/packages/inferno/service/sshd/log/run b/packages/inferno/service/sshd/log/run new file mode 100755 index 0000000..1e7bd9d --- /dev/null +++ b/packages/inferno/service/sshd/log/run @@ -0,0 +1,3 @@ +#! /bin/sh + +exec svlogd -tt $PWD diff --git a/packages/inferno/service/sshd/rsa.key b/packages/inferno/service/sshd/rsa.key new file mode 100644 index 0000000000000000000000000000000000000000..6c75997537a558589f82fc79b5e41c72e922b475 GIT binary patch literal 427 zcmV;c0aX3~000Mbb7(Dcb724g00RL40RR91g8;H#Pn(3)JWM9|u;EO(&Zt;|jnCa| zC}j8m6WoR8K$-~9w8NAGK_*-}y;W1CAdl??A8p0RozsTtJ7<@}A0F1sBpD)}8yl(a zhU)h~4mCpkgMR)YDS84EGSoVGb zN;50;Le=oLHlBpf1^wAAg9fij@!l<9-=PV(O1qy;`zV8ejbM2M{@SfawO8mHHOZjU z0000&0PEf5(c$XX`q|`m2h`S+nnrtwAUwu{Fy^EU9~2WBP5IEk+A6uHa&~cB^jwIj V_Jd|r(c+HDs$zv-`tJE+6DelX#8?0T literal 0 HcmV?d00001 diff --git a/packages/inferno/service/sshd/run b/packages/inferno/service/sshd/run new file mode 100755 index 0000000..e60e68b --- /dev/null +++ b/packages/inferno/service/sshd/run @@ -0,0 +1,4 @@ +#! /bin/sh + +exec 2>&1 +exec dropbear -r ./rsa.key -E -F From 860bf604c4d24500ee4cbf6c3542122dd70038d0 Mon Sep 17 00:00:00 2001 From: Neale Pickett Date: Tue, 11 Oct 2011 15:38:34 -0600 Subject: [PATCH 02/25] add sh4pwn build stuff --- sh4pwn/README | 1 + sh4pwn/buildroot.config | 919 ++++++++++++++ sh4pwn/busybox.config | 990 +++++++++++++++ sh4pwn/cleanup.sh | 26 + sh4pwn/linux.config | 1645 +++++++++++++++++++++++++ sh4pwn/skeleton/etc/hosts | 1 + sh4pwn/skeleton/etc/issue | 2 + sh4pwn/skeleton/etc/passwd | 1 + sh4pwn/skeleton/etc/profile | 6 + sh4pwn/skeleton/home/.empty | 0 sh4pwn/skeleton/mnt/.empty | 0 sh4pwn/skeleton/opt/.empty | 0 sh4pwn/skeleton/proc/.empty | 0 sh4pwn/skeleton/sbin/init | 55 + sh4pwn/skeleton/sbin/mkrw | 17 + sh4pwn/skeleton/sbin/runit-signal | 69 ++ sh4pwn/skeleton/sbin/udhcpc.script | 39 + sh4pwn/skeleton/service/eth0/finish | 3 + sh4pwn/skeleton/service/eth0/run | 6 + sh4pwn/skeleton/service/lo/finish | 3 + sh4pwn/skeleton/service/lo/run | 7 + sh4pwn/skeleton/service/telnetd/issue | 8 + sh4pwn/skeleton/service/telnetd/run | 3 + sh4pwn/skeleton/service/tty1/run | 6 + sh4pwn/skeleton/service/tty2/run | 1 + sh4pwn/skeleton/service/tty3/run | 1 + sh4pwn/skeleton/service/tty4/run | 1 + sh4pwn/skeleton/sys/.empty | 0 sh4pwn/skeleton/tmp/.empty | 0 sh4pwn/target_device_table.txt | 42 + 30 files changed, 3852 insertions(+) create mode 100644 sh4pwn/README create mode 100644 sh4pwn/buildroot.config create mode 100644 sh4pwn/busybox.config create mode 100755 sh4pwn/cleanup.sh create mode 100644 sh4pwn/linux.config create mode 100644 sh4pwn/skeleton/etc/hosts create mode 100644 sh4pwn/skeleton/etc/issue create mode 100644 sh4pwn/skeleton/etc/passwd create mode 100644 sh4pwn/skeleton/etc/profile create mode 100644 sh4pwn/skeleton/home/.empty create mode 100644 sh4pwn/skeleton/mnt/.empty create mode 100644 sh4pwn/skeleton/opt/.empty create mode 100644 sh4pwn/skeleton/proc/.empty create mode 100755 sh4pwn/skeleton/sbin/init create mode 100755 sh4pwn/skeleton/sbin/mkrw create mode 100755 sh4pwn/skeleton/sbin/runit-signal create mode 100755 sh4pwn/skeleton/sbin/udhcpc.script create mode 100755 sh4pwn/skeleton/service/eth0/finish create mode 100755 sh4pwn/skeleton/service/eth0/run create mode 100755 sh4pwn/skeleton/service/lo/finish create mode 100755 sh4pwn/skeleton/service/lo/run create mode 100644 sh4pwn/skeleton/service/telnetd/issue create mode 100755 sh4pwn/skeleton/service/telnetd/run create mode 100755 sh4pwn/skeleton/service/tty1/run create mode 120000 sh4pwn/skeleton/service/tty2/run create mode 120000 sh4pwn/skeleton/service/tty3/run create mode 120000 sh4pwn/skeleton/service/tty4/run create mode 100644 sh4pwn/skeleton/sys/.empty create mode 100644 sh4pwn/skeleton/tmp/.empty create mode 100644 sh4pwn/target_device_table.txt diff --git a/sh4pwn/README b/sh4pwn/README new file mode 100644 index 0000000..b486b0c --- /dev/null +++ b/sh4pwn/README @@ -0,0 +1 @@ +This is the stuff you need to make a pwnable image. You build it just like dbtl. diff --git a/sh4pwn/buildroot.config b/sh4pwn/buildroot.config new file mode 100644 index 0000000..4d1dd41 --- /dev/null +++ b/sh4pwn/buildroot.config @@ -0,0 +1,919 @@ +# +# Automatically generated make config: don't edit +# Buildroot 2011.08 Configuration +# Fri Oct 7 15:50:09 2011 +# +BR2_HAVE_DOT_CONFIG=y +# BR2_arm is not set +# BR2_armeb is not set +# BR2_avr32 is not set +# BR2_bfin is not set +# BR2_i386 is not set +# BR2_mips is not set +# BR2_mipsel is not set +# BR2_powerpc is not set +BR2_sh=y +# BR2_sh64 is not set +# BR2_sparc is not set +# BR2_x86_64 is not set +# BR2_xtensa is not set +# BR2_sh2 is not set +# BR2_sh2a is not set +# BR2_sh3 is not set +# BR2_sh3eb is not set +BR2_sh4=y +# BR2_sh4eb is not set +# BR2_sh4a is not set +# BR2_sh4aeb is not set +BR2_ARCH="sh4" +BR2_ENDIAN="LITTLE" + +# +# Build options +# + +# +# Commands +# +BR2_WGET="wget --passive-ftp -nd -t 3" +BR2_SVN="svn" +BR2_BZR="bzr" +BR2_GIT="git" +BR2_ZCAT="gzip -d -c" +BR2_BZCAT="bzcat" +BR2_XZCAT="xzcat" +BR2_TAR_OPTIONS="" +BR2_DL_DIR="$(TOPDIR)/dl" +BR2_HOST_DIR="$(BASE_DIR)/host" + +# +# Mirrors and Download locations +# +BR2_PRIMARY_SITE="" +BR2_BACKUP_SITE="http://sources.buildroot.net/" +BR2_SOURCEFORGE_MIRROR="kent" +BR2_KERNEL_MIRROR="http://www.kernel.org/pub/" +BR2_GNU_MIRROR="http://ftp.gnu.org/pub/gnu" +BR2_DEBIAN_MIRROR="http://ftp.debian.org" +BR2_JLEVEL=2 +# BR2_CCACHE is not set +# BR2_DEPRECATED is not set +# BR2_ENABLE_DEBUG is not set +BR2_STRIP_strip=y +# BR2_STRIP_sstrip is not set +# BR2_STRIP_none is not set +# BR2_OPTIMIZE_0 is not set +# BR2_OPTIMIZE_1 is not set +# BR2_OPTIMIZE_2 is not set +# BR2_OPTIMIZE_3 is not set +BR2_OPTIMIZE_S=y +# BR2_PREFER_STATIC_LIB is not set +# BR2_HAVE_DOCUMENTATION is not set +# BR2_HAVE_DEVFILES is not set + +# +# Toolchain +# +BR2_TOOLCHAIN_BUILDROOT=y +# BR2_TOOLCHAIN_EXTERNAL is not set +# BR2_TOOLCHAIN_CTNG is not set + +# +# Kernel Header Options +# +# BR2_KERNEL_HEADERS_2_6_35 is not set +# BR2_KERNEL_HEADERS_2_6_36 is not set +# BR2_KERNEL_HEADERS_2_6_37 is not set +# BR2_KERNEL_HEADERS_2_6_38 is not set +BR2_KERNEL_HEADERS_2_6_39=y +# BR2_KERNEL_HEADERS_3_0 is not set +# BR2_KERNEL_HEADERS_VERSION is not set +# BR2_KERNEL_HEADERS_SNAP is not set +BR2_DEFAULT_KERNEL_HEADERS="2.6.39.4" + +# +# uClibc Options +# +BR2_UCLIBC_VERSION_0_9_31=y +# BR2_UCLIBC_VERSION_SNAPSHOT is not set +BR2_UCLIBC_VERSION_STRING="0.9.31.1" +BR2_UCLIBC_CONFIG="toolchain/uClibc/uClibc-0.9.31.config" +# BR2_PTHREAD_DEBUG is not set +# BR2_UCLIBC_INSTALL_TEST_SUITE is not set + +# +# Binutils Options +# +# BR2_BINUTILS_VERSION_2_20 is not set +# BR2_BINUTILS_VERSION_2_20_1 is not set +BR2_BINUTILS_VERSION_2_21=y +BR2_BINUTILS_VERSION="2.21" +BR2_BINUTILS_EXTRA_CONFIG_OPTIONS="" + +# +# GCC Options +# +# BR2_GCC_VERSION_4_2_4 is not set +# BR2_GCC_VERSION_4_3_X is not set +# BR2_GCC_VERSION_4_4_X is not set +BR2_GCC_VERSION_4_5_X=y +# BR2_GCC_VERSION_4_6_X is not set +# BR2_GCC_VERSION_SNAP is not set +BR2_GCC_SUPPORTS_FINEGRAINEDMTUNE=y +BR2_GCC_VERSION="4.5.3" +BR2_EXTRA_GCC_CONFIG_OPTIONS="--with-multilib-list=m4,m4-nofpu" +# BR2_INSTALL_OBJC is not set +# BR2_INSTALL_FORTRAN is not set +BR2_GCC_SHARED_LIBGCC=y +# BR2_GCC_ENABLE_OPENMP is not set + +# +# Gdb Options +# + +# +# Gdb debugger for the target needs WCHAR support in toolchain +# +# BR2_PACKAGE_GDB_SERVER is not set +# BR2_PACKAGE_GDB_HOST is not set +BR2_INET_IPV6=y +BR2_TOOLCHAIN_HAS_THREADS=y +BR2_TOOLCHAIN_HAS_SHADOW_PASSWORDS=y +# BR2_ENABLE_LOCALE_PURGE is not set +BR2_NEEDS_GETTEXT=y +BR2_USE_MMU=y +BR2_TARGET_OPTIMIZATION="-pipe" +BR2_TARGET_LDFLAGS="" + +# +# Toolchain Options +# +# BR2_TOOLCHAIN_BUILDROOT_LARGEFILE is not set +BR2_TOOLCHAIN_BUILDROOT_INET_IPV6=y +# BR2_TOOLCHAIN_BUILDROOT_INET_RPC is not set +# BR2_TOOLCHAIN_BUILDROOT_WCHAR is not set +# BR2_TOOLCHAIN_BUILDROOT_LOCALE is not set +# BR2_TOOLCHAIN_BUILDROOT_CXX is not set +# BR2_TOOLCHAIN_BUILDROOT_USE_SSP is not set +# BR2_PTHREADS_NONE is not set +# BR2_PTHREADS is not set +BR2_PTHREADS_OLD=y +# BR2_ELF2FLT is not set + +# +# System configuration +# +BR2_TARGET_GENERIC_HOSTNAME="" +BR2_TARGET_GENERIC_ISSUE="" +BR2_ROOTFS_DEVICE_CREATION_STATIC=y +# BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_DEVTMPFS is not set +# BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_MDEV is not set +# BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_UDEV is not set +BR2_ROOTFS_DEVICE_TABLE="sh4pwn/target_device_table.txt" +BR2_ROOTFS_STATIC_DEVICE_TABLE="sh4pwn/target_device_table.txt" +# BR2_ROOTFS_SKELETON_DEFAULT is not set +BR2_ROOTFS_SKELETON_CUSTOM=y +BR2_ROOTFS_SKELETON_CUSTOM_PATH="sh4pwn/skeleton" +BR2_ROOTFS_POST_BUILD_SCRIPT="sh4pwn/cleanup.sh" + +# +# Package Selection for the target +# +BR2_PACKAGE_BUSYBOX=y +# BR2_BUSYBOX_VERSION_1_16_X is not set +# BR2_BUSYBOX_VERSION_1_17_X is not set +BR2_BUSYBOX_VERSION_1_18_X=y +# BR2_PACKAGE_BUSYBOX_SNAPSHOT is not set +BR2_BUSYBOX_VERSION="1.18.5" +BR2_PACKAGE_BUSYBOX_CONFIG="sh4pwn/busybox.config" +# BR2_PACKAGE_BUSYBOX_SHOW_OTHERS is not set +# BR2_PACKAGE_CUSTOMIZE is not set + +# +# Audio and video libraries and applications +# +# BR2_PACKAGE_ALSA_LIB is not set + +# +# alsa-utils requires a toolchain with LARGEFILE support +# +# BR2_PACKAGE_AUMIX is not set +# BR2_PACKAGE_FAAD2 is not set +# BR2_PACKAGE_FLAC is not set + +# +# ffmpeg requires a toolchain with LARGEFILE and IPV6 support +# + +# +# gstreamer requires a toolchain with WCHAR support +# + +# +# gst-ffmpeg requires a toolchain with LARGEFILE and IPV6 support +# +# BR2_PACKAGE_LAME is not set +# BR2_PACKAGE_LIBAO is not set +# BR2_PACKAGE_LIBCDAUDIO is not set +# BR2_PACKAGE_LIBCUE is not set +# BR2_PACKAGE_LIBCUEFILE is not set + +# +# libdvdread requires a toolchain with LARGEFILE support +# + +# +# libdvdnav requires a toolchain with LARGEFILE support +# +# BR2_PACKAGE_LIBID3TAG is not set +# BR2_PACKAGE_LIBMAD is not set + +# +# libmms requires a toolchain with WCHAR support +# + +# +# libmpd requires a toolchain with WCHAR support +# +# BR2_PACKAGE_LIBMPEG2 is not set +# BR2_PACKAGE_LIBOGG is not set +# BR2_PACKAGE_LIBREPLAYGAIN is not set +# BR2_PACKAGE_LIBSAMPLERATE is not set +# BR2_PACKAGE_LIBSNDFILE is not set +# BR2_PACKAGE_LIBTHEORA is not set +# BR2_PACKAGE_LIBVORBIS is not set + +# +# Live555 needs C++ compiler +# +# BR2_PACKAGE_MADPLAY is not set + +# +# mpd requires a toolchain with C++ and WCHAR support +# +# BR2_PACKAGE_MPG123 is not set +# BR2_PACKAGE_MPLAYER is not set +# BR2_PACKAGE_MUSEPACK is not set +# BR2_PACKAGE_SPEEX is not set + +# +# swfdec requires a toolchain with WCHAR and C++ support +# + +# +# taglib requires a toolchain with C++ support enabled +# +# BR2_PACKAGE_TREMOR is not set +# BR2_PACKAGE_VORBIS_TOOLS is not set +# BR2_PACKAGE_WAVPACK is not set + +# +# Compressors and decompressors +# +# BR2_PACKAGE_BZIP2 is not set +# BR2_PACKAGE_LZOP is not set +# BR2_PACKAGE_XZ is not set + +# +# Debugging, profiling and benchmark +# + +# +# bonnie++ requires a toolchain with C++ support enabled +# +# BR2_PACKAGE_DHRYSTONE is not set +# BR2_PACKAGE_DMALLOC is not set +# BR2_PACKAGE_KEXEC is not set + +# +# lmbench requires a toolchain with RPC support +# + +# +# lsof requires a toolchain with RPC support +# +# BR2_PACKAGE_LTP_TESTSUITE is not set +# BR2_PACKAGE_MEMSTAT is not set +# BR2_PACKAGE_NETPERF is not set + +# +# oprofile requires a toolchain with C++ support enabled +# +# BR2_PACKAGE_STRACE is not set +# BR2_PACKAGE_WHETSTONE is not set + +# +# Development tools +# +# BR2_PACKAGE_AUTOCONF is not set +# BR2_PACKAGE_AUTOMAKE is not set +# BR2_PACKAGE_BINUTILS is not set + +# +# bison requires a toolchain with WCHAR support +# +# BR2_PACKAGE_BSDIFF is not set +# BR2_PACKAGE_CCACHE is not set +# BR2_PACKAGE_DISTCC is not set +# BR2_PACKAGE_FLEX is not set + +# +# gcc needs development files in target filesystem +# + +# +# gettext requires a toolchain with WCHAR support +# +# BR2_PACKAGE_GMP is not set + +# +# gperf requires a toolchain with C++ support enabled +# +# BR2_PACKAGE_MAKE is not set +# BR2_PACKAGE_MPC is not set +# BR2_PACKAGE_MPFR is not set +# BR2_PACKAGE_LIBTOOL is not set + +# +# m4 requires a toolchain with WCHAR support +# + +# +# pkg-config requires a toolchain with WCHAR support +# +# BR2_PACKAGE_SSTRIP is not set + +# +# Games +# +# BR2_PACKAGE_GNUCHESS is not set +# BR2_PACKAGE_PRBOOM is not set + +# +# Graphic libraries and applications (graphic/text) +# + +# +# Graphic applications +# + +# +# rrdtool requires a toolchain with WCHAR support +# + +# +# graphic libraries +# +# BR2_PACKAGE_DIRECTFB is not set +# BR2_PACKAGE_FBDUMP is not set +# BR2_PACKAGE_FBGRAB is not set +# BR2_PACKAGE_FBV is not set +# BR2_PACKAGE_IMAGEMAGICK is not set +# BR2_PACKAGE_LINUX_FUSION is not set +# BR2_PACKAGE_SDL is not set + +# +# other GUIs +# + +# +# qt requires a toolchain with C++ support enabled +# + +# +# X.org requires a toolchain with WCHAR support +# + +# +# X libraries and helper libraries +# +# BR2_PACKAGE_LIBERATION is not set + +# +# X Window managers +# + +# +# X applications +# + +# +# gob2 requires a toolchain with WCHAR support +# + +# +# midori requires C++, WCHAR in toolchain and libgtk2 +# + +# +# Hardware handling +# + +# +# cdrkit requires a toolchain with LARGEFILE support +# +# BR2_PACKAGE_CRAMFS is not set + +# +# dbus not available (need expat or libxml2) +# + +# +# dmraid requires a toolchain with LARGEFILE support +# + +# +# dosfstools requires a toolchain with LARGEFILE support +# + +# +# e2fsprogs requires a toolchain with LARGEFILE + WCHAR support +# +# BR2_PACKAGE_EEPROG is not set +# BR2_PACKAGE_FCONFIG is not set +# BR2_PACKAGE_FIS is not set +# BR2_PACKAGE_GADGETFS_TEST is not set + +# +# gdisk requires a toolchain with LARGEFILE/WCHAR/C++ support enabled +# +# BR2_PACKAGE_GENEXT2FS is not set +# BR2_PACKAGE_GENROMFS is not set +# BR2_PACKAGE_GPSD is not set + +# +# gvfs requires a toolchain with LARGEFILE and WCHAR support +# +# BR2_PACKAGE_HWDATA is not set +# BR2_PACKAGE_I2C_TOOLS is not set +# BR2_PACKAGE_INPUT_EVENT_DAEMON is not set +# BR2_PACKAGE_INPUT_TOOLS is not set +# BR2_PACKAGE_IOSTAT is not set +# BR2_PACKAGE_IRDA_UTILS is not set +# BR2_PACKAGE_KBD is not set + +# +# libv4l requires a toolchain with LARGEFILE support +# +# BR2_PACKAGE_LM_SENSORS is not set +# BR2_PACKAGE_LSUIO is not set + +# +# lvm2 requires a toolchain with LARGEFILE support +# +# BR2_PACKAGE_MAKEDEVS is not set +# BR2_PACKAGE_MDADM is not set + +# +# memtester requires a toolchain with LARGEFILE support +# +# BR2_PACKAGE_MTD is not set + +# +# ntfs-3g requires a toolchain with LARGEFILE and WCHAR support +# + +# +# ntfsprogs requires a toolchain with WCHAR and LARGEFILE support +# +# BR2_PACKAGE_PCIUTILS is not set +# BR2_PACKAGE_RNG_TOOLS is not set +# BR2_PACKAGE_SDPARM is not set +# BR2_PACKAGE_SETSERIAL is not set + +# +# smartmontools requires a toolchain with C++ support enabled +# + +# +# squashfs requires a toolchain with LARGEFILE support +# +# BR2_PACKAGE_SREDIRD is not set + +# +# sshfs requires a toolchain with LARGEFILE and WCHAR support +# +# BR2_PACKAGE_STATSERIAL is not set +# BR2_PACKAGE_SYSSTAT is not set +# BR2_PACKAGE_TI_UTILS is not set +# BR2_PACKAGE_UBOOT_TOOLS is not set + +# +# udev requires /dev mgmnt set to udev under System configuration +# +# BR2_PACKAGE_USB_MODESWITCH is not set +# BR2_PACKAGE_USBUTILS is not set +# BR2_PACKAGE_WIPE is not set + +# +# xfsprogs requires a toolchain with LARGEFILE + WCHAR support +# + +# +# Interpreter languages and scripting +# +# BR2_PACKAGE_HASERL is not set +# BR2_PACKAGE_LUA is not set +# BR2_PACKAGE_MICROPERL is not set +# BR2_PACKAGE_PHP is not set + +# +# python requires a toolchain with WCHAR support +# + +# +# ruby requires a toolchain with WCHAR support +# +# BR2_PACKAGE_TCL is not set + +# +# Libraries +# + +# +# Compression and decompression +# + +# +# libarchive requires a toolchain with WCHAR support +# +# BR2_PACKAGE_LZO is not set +# BR2_PACKAGE_ZLIB is not set + +# +# Crypto +# +# BR2_PACKAGE_BEECRYPT is not set +# BR2_PACKAGE_GNUTLS is not set +# BR2_PACKAGE_LIBGCRYPT is not set +# BR2_PACKAGE_LIBGPG_ERROR is not set + +# +# libnss requires a toolchain with LARGEFILE support +# +# BR2_PACKAGE_OPENSSL is not set + +# +# Database +# +# BR2_PACKAGE_BERKELEYDB is not set + +# +# Mysql client requires a toolchain with C++ support enabled +# +# BR2_PACKAGE_SQLITE is not set + +# +# Filesystem +# + +# +# gamin requires a toolchain with WCHAR support +# +# BR2_PACKAGE_LIBCONFIG is not set +# BR2_PACKAGE_LIBCONFUSE is not set + +# +# libfuse requires a toolchain with LARGEFILE support +# +# BR2_PACKAGE_LIBLOCKFILE is not set +# BR2_PACKAGE_LIBSYSFS is not set + +# +# Graphics +# + +# +# atk requires a toolchain with WCHAR support +# +# BR2_PACKAGE_CAIRO is not set +# BR2_PACKAGE_FONTCONFIG is not set +# BR2_PACKAGE_FREETYPE is not set +# BR2_PACKAGE_JPEG is not set +# BR2_PACKAGE_LIBART is not set +# BR2_PACKAGE_LIBEXIF is not set + +# +# libgtk2 requires a toolchain with WCHAR and C++ support +# +# BR2_PACKAGE_LIBPNG is not set + +# +# libraw requires a toolchain with C++ support enabled +# +# BR2_PACKAGE_LIBSVGTINY is not set +# BR2_PACKAGE_LIBUNGIF is not set + +# +# pango requires a toolchain with WCHAR and C++ support +# +# BR2_PACKAGE_PIXMAN is not set +# BR2_PACKAGE_TIFF is not set + +# +# webkit requires C++, WCHAR in toolchain and libgtk2 +# + +# +# Hardware handling +# +# BR2_PACKAGE_LIBAIO is not set +# BR2_PACKAGE_LIBRAW1394 is not set +# BR2_PACKAGE_TSLIB is not set +# BR2_PACKAGE_LIBHID is not set +# BR2_PACKAGE_LIBIQRF is not set +# BR2_PACKAGE_LIBUSB is not set + +# +# Networking +# +# BR2_PACKAGE_LIBCGI is not set + +# +# libcgicc requires a toolchain with C++ support enabled +# +# BR2_PACKAGE_LIBCURL is not set +# BR2_PACKAGE_LIBDNET is not set +# BR2_PACKAGE_LIBEXOSIP2 is not set +# BR2_PACKAGE_LIBIDN is not set +# BR2_PACKAGE_LIBMICROHTTPD is not set +# BR2_PACKAGE_NEON is not set + +# +# libmnl requires a toolchain with LARGEFILE support +# +# BR2_PACKAGE_LIBNL is not set +# BR2_PACKAGE_LIBPCAP is not set +# BR2_PACKAGE_LIBOSIP2 is not set +# BR2_PACKAGE_LIBRSYNC is not set + +# +# libsoup requires a toolchain with WCHAR support +# + +# +# libupnp requires a toolchain with LARGEFILE support +# + +# +# Other +# +# BR2_PACKAGE_LIBARGTABLE2 is not set +# BR2_PACKAGE_ARGP_STANDALONE is not set +# BR2_PACKAGE_LIBATOMIC_OPS is not set +# BR2_PACKAGE_LIBCAP is not set +# BR2_PACKAGE_LIBDAEMON is not set +# BR2_PACKAGE_LIBELF is not set +# BR2_PACKAGE_LIBEVENT is not set +# BR2_PACKAGE_LIBFFI is not set + +# +# libglib2 requires a toolchain with WCHAR support +# + +# +# libnspr requires a toolchain with LARGEFILE support +# + +# +# libsigc++ requires a toolchain with C++ support enabled +# +# BR2_PACKAGE_ORC is not set + +# +# Text and terminal handling +# + +# +# enchant requires a toolchain with C++ and WCHAR support enabled +# + +# +# icu requires a toolchain with C++ support and WCHAR enabled +# +# BR2_PACKAGE_LIBICONV is not set +# BR2_PACKAGE_NCURSES is not set +# BR2_PACKAGE_NEWT is not set +# BR2_PACKAGE_PCRE is not set +# BR2_PACKAGE_POPT is not set +# BR2_PACKAGE_READLINE is not set +# BR2_PACKAGE_SLANG is not set + +# +# JSON/XML +# +# BR2_PACKAGE_EXPAT is not set +# BR2_PACKAGE_EZXML is not set +# BR2_PACKAGE_LIBROXML is not set +# BR2_PACKAGE_LIBXML2 is not set +# BR2_PACKAGE_LIBXSLT is not set +# BR2_PACKAGE_LIBYAML is not set +# BR2_PACKAGE_MXML is not set + +# +# xerces-c++ requires a toolchain with C++ and WCHAR support enabled +# +# BR2_PACKAGE_YAJL is not set + +# +# Miscellaneous +# + +# +# shared-mime-info requires a toolchain with WCHAR support +# + +# +# Networking applications +# +# BR2_PACKAGE_ARGUS is not set +# BR2_PACKAGE_AVAHI is not set +# BR2_PACKAGE_AXEL is not set + +# +# bind requires a toolchain with LARGEFILE support +# +# BR2_PACKAGE_BMON is not set +# BR2_PACKAGE_BRIDGE is not set +# BR2_PACKAGE_BWM_NG is not set +# BR2_PACKAGE_CAN_UTILS is not set + +# +# ctorrent requires a toolchain with C++ support enabled +# +# BR2_PACKAGE_CUPS is not set +# BR2_PACKAGE_DHCPDUMP is not set +# BR2_PACKAGE_DNSMASQ is not set +# BR2_PACKAGE_DROPBEAR is not set +# BR2_PACKAGE_EBTABLES is not set +# BR2_PACKAGE_ETHTOOL is not set +# BR2_PACKAGE_HOSTAPD is not set +# BR2_PACKAGE_IFPLUGD is not set + +# +# iperf requires a toolchain with C++ support enabled +# +# BR2_PACKAGE_IPROUTE2 is not set +# BR2_PACKAGE_IPSEC_TOOLS is not set + +# +# ipset requires a toolchain with LARGEFILE support +# +# BR2_PACKAGE_IPTABLES is not set +# BR2_PACKAGE_IW is not set + +# +# Kismet requires a toolchain with C++ support enabled +# +# BR2_PACKAGE_XL2TP is not set +# BR2_PACKAGE_LINKS is not set +# BR2_PACKAGE_LRZSZ is not set +# BR2_PACKAGE_MII_DIAG is not set +# BR2_PACKAGE_MROUTED is not set + +# +# mutt requires a toolchain with WCHAR support +# + +# +# nbd requires a toolchain with WCHAR support +# + +# +# ncftp requires a toolchain with LARGEFILE support +# +# BR2_PACKAGE_NETPLUG is not set +# BR2_PACKAGE_NETSNMP is not set +# BR2_PACKAGE_NETSTAT_NAT is not set + +# +# nfs-utils requires a toolchain with RPC and LARGEFILE support +# +# BR2_PACKAGE_NGIRCD is not set +# BR2_PACKAGE_NTP is not set +# BR2_PACKAGE_NUTTCP is not set +# BR2_PACKAGE_OLSR is not set +# BR2_PACKAGE_OPENNTPD is not set +# BR2_PACKAGE_OPENSSH is not set +# BR2_PACKAGE_OPENVPN is not set + +# +# portmap requires a toolchain with 'Enable RPC' selected +# +# BR2_PACKAGE_PPPD is not set +# BR2_PACKAGE_RADVD is not set +# BR2_PACKAGE_PPTP_LINUX is not set +# BR2_PACKAGE_PROFTPD is not set +# BR2_PACKAGE_QUAGGA is not set +# BR2_PACKAGE_RSH_REDONE is not set +# BR2_PACKAGE_RSYNC is not set +# BR2_PACKAGE_SAMBA is not set +# BR2_PACKAGE_SER2NET is not set +# BR2_PACKAGE_SOCAT is not set +# BR2_PACKAGE_SPAWN_FCGI is not set + +# +# Squid requires a toolchain with C++ and IPv6 support enabled +# +# BR2_PACKAGE_STUNNEL is not set +# BR2_PACKAGE_TCPDUMP is not set +# BR2_PACKAGE_TCPREPLAY is not set +# BR2_PACKAGE_TN5250 is not set +# BR2_PACKAGE_TTCP is not set + +# +# udpcast requires a toolchain with LARGEFILE support +# +# BR2_PACKAGE_VPNC is not set +# BR2_PACKAGE_VSFTPD is not set +# BR2_PACKAGE_VTUN is not set +# BR2_PACKAGE_WIRELESS_TOOLS is not set +# BR2_PACKAGE_WPA_SUPPLICANT is not set + +# +# Package managers +# +# BR2_PACKAGE_IPKG is not set + +# +# Shell and utilities +# +# BR2_PACKAGE_AT is not set +# BR2_PACKAGE_DIALOG is not set +# BR2_PACKAGE_FILE is not set + +# +# inotify-tools requires a toolchain with LARGEFILE support +# +# BR2_PACKAGE_LOCKFILE_PROGS is not set + +# +# logrotate requires a toolchain with WCHAR support +# +# BR2_PACKAGE_SCREEN is not set +# BR2_PACKAGE_SUDO is not set +# BR2_PACKAGE_WHICH is not set +# BR2_PACKAGE_XMLSTARLET is not set + +# +# System tools +# + +# +# acl requires a toolchain with LARGEFILE support +# + +# +# attr requires a toolchain with LARGEFILE support +# +# BR2_PACKAGE_HTOP is not set + +# +# util-linux requires a toolchain with LARGEFILE + WCHAR support +# + +# +# Text editors and viewers +# +# BR2_PACKAGE_ED is not set +# BR2_PACKAGE_NANO is not set +# BR2_PACKAGE_UEMACS is not set + +# +# Filesystem images +# +# BR2_TARGET_ROOTFS_CRAMFS is not set +# BR2_TARGET_ROOTFS_CLOOP is not set +# BR2_TARGET_ROOTFS_EXT2 is not set +# BR2_TARGET_ROOTFS_JFFS2 is not set +# BR2_TARGET_ROOTFS_UBIFS is not set +# BR2_TARGET_ROOTFS_SQUASHFS is not set +# BR2_TARGET_ROOTFS_TAR is not set +# BR2_TARGET_ROOTFS_CPIO is not set +BR2_TARGET_ROOTFS_INITRAMFS=y +# BR2_TARGET_ROOTFS_ROMFS is not set + +# +# Bootloaders +# +# BR2_TARGET_BAREBOX is not set +# BR2_TARGET_UBOOT is not set + +# +# Kernel +# +BR2_LINUX_KERNEL=y +BR2_LINUX_KERNEL_2_6_39=y +# BR2_LINUX_KERNEL_SAME_AS_HEADERS is not set +# BR2_LINUX_KERNEL_CUSTOM_VERSION is not set +# BR2_LINUX_KERNEL_CUSTOM_TARBALL is not set +# BR2_LINUX_KERNEL_CUSTOM_GIT is not set +BR2_LINUX_KERNEL_VERSION="2.6.39.4" +BR2_LINUX_KERNEL_PATCH="" +# BR2_LINUX_KERNEL_USE_DEFCONFIG is not set +BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y +BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="sh4pwn/linux.config" +# BR2_LINUX_KERNEL_UIMAGE is not set +BR2_LINUX_KERNEL_ZIMAGE=y +# BR2_LINUX_KERNEL_VMLINUX_BIN is not set +# BR2_LINUX_KERNEL_IMAGE_TARGET_CUSTOM is not set diff --git a/sh4pwn/busybox.config b/sh4pwn/busybox.config new file mode 100644 index 0000000..bc5dbba --- /dev/null +++ b/sh4pwn/busybox.config @@ -0,0 +1,990 @@ +# +# Automatically generated make config: don't edit +# Busybox version: 1.18.5 +# Fri Sep 9 12:29:48 2011 +# +CONFIG_HAVE_DOT_CONFIG=y + +# +# Busybox Settings +# + +# +# General Configuration +# +CONFIG_DESKTOP=y +# CONFIG_EXTRA_COMPAT is not set +# CONFIG_INCLUDE_SUSv2 is not set +# CONFIG_USE_PORTABLE_CODE is not set +CONFIG_PLATFORM_LINUX=y +CONFIG_FEATURE_BUFFERS_USE_MALLOC=y +# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set +# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set +CONFIG_SHOW_USAGE=y +CONFIG_FEATURE_VERBOSE_USAGE=y +# CONFIG_FEATURE_COMPRESS_USAGE is not set +CONFIG_FEATURE_INSTALLER=y +CONFIG_INSTALL_NO_USR=y +# CONFIG_LOCALE_SUPPORT is not set +CONFIG_UNICODE_SUPPORT=y +# CONFIG_UNICODE_USING_LOCALE is not set +# CONFIG_FEATURE_CHECK_UNICODE_IN_ENV is not set +CONFIG_SUBST_WCHAR=63 +CONFIG_LAST_SUPPORTED_WCHAR=767 +# CONFIG_UNICODE_COMBINING_WCHARS is not set +# CONFIG_UNICODE_WIDE_WCHARS is not set +# CONFIG_UNICODE_BIDI_SUPPORT is not set +# CONFIG_UNICODE_NEUTRAL_TABLE is not set +# CONFIG_UNICODE_PRESERVE_BROKEN is not set +CONFIG_LONG_OPTS=y +CONFIG_FEATURE_DEVPTS=y +CONFIG_FEATURE_CLEAN_UP=y +# CONFIG_FEATURE_WTMP is not set +# CONFIG_FEATURE_UTMP is not set +# CONFIG_FEATURE_PIDFILE is not set +CONFIG_FEATURE_SUID=y +# CONFIG_FEATURE_SUID_CONFIG is not set +# CONFIG_FEATURE_SUID_CONFIG_QUIET is not set +# CONFIG_SELINUX is not set +# CONFIG_FEATURE_PREFER_APPLETS is not set +CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe" +CONFIG_FEATURE_SYSLOG=y +# CONFIG_FEATURE_HAVE_RPC is not set + +# +# Build Options +# +# CONFIG_STATIC is not set +# CONFIG_PIE is not set +# CONFIG_NOMMU is not set +# CONFIG_BUILD_LIBBUSYBOX is not set +# CONFIG_FEATURE_INDIVIDUAL is not set +# CONFIG_FEATURE_SHARED_BUSYBOX is not set +CONFIG_LFS=y +CONFIG_CROSS_COMPILER_PREFIX="" +CONFIG_EXTRA_CFLAGS="" + +# +# Debugging Options +# +# CONFIG_DEBUG is not set +# CONFIG_DEBUG_PESSIMIZE is not set +# CONFIG_WERROR is not set +CONFIG_NO_DEBUG_LIB=y +# CONFIG_DMALLOC is not set +# CONFIG_EFENCE is not set + +# +# Installation Options ("make install" behavior) +# +CONFIG_INSTALL_APPLET_SYMLINKS=y +# CONFIG_INSTALL_APPLET_HARDLINKS is not set +# CONFIG_INSTALL_APPLET_SCRIPT_WRAPPERS is not set +# CONFIG_INSTALL_APPLET_DONT is not set +# CONFIG_INSTALL_SH_APPLET_SYMLINK is not set +# CONFIG_INSTALL_SH_APPLET_HARDLINK is not set +# CONFIG_INSTALL_SH_APPLET_SCRIPT_WRAPPER is not set +CONFIG_PREFIX="./_install" + +# +# Busybox Library Tuning +# +CONFIG_PASSWORD_MINLEN=6 +CONFIG_MD5_SIZE_VS_SPEED=2 +# CONFIG_FEATURE_FAST_TOP is not set +# CONFIG_FEATURE_ETC_NETWORKS is not set +CONFIG_FEATURE_USE_TERMIOS=y +CONFIG_FEATURE_EDITING=y +CONFIG_FEATURE_EDITING_MAX_LEN=1024 +CONFIG_FEATURE_EDITING_VI=y +CONFIG_FEATURE_EDITING_HISTORY=999 +CONFIG_FEATURE_EDITING_SAVEHISTORY=y +CONFIG_FEATURE_TAB_COMPLETION=y +# CONFIG_FEATURE_USERNAME_COMPLETION is not set +CONFIG_FEATURE_EDITING_FANCY_PROMPT=y +# CONFIG_FEATURE_EDITING_ASK_TERMINAL is not set +CONFIG_FEATURE_NON_POSIX_CP=y +# CONFIG_FEATURE_VERBOSE_CP_MESSAGE is not set +CONFIG_FEATURE_COPYBUF_KB=4 +CONFIG_MONOTONIC_SYSCALL=y +CONFIG_IOCTL_HEX2STR_ERROR=y +# CONFIG_FEATURE_HWIB is not set + +# +# Applets +# + +# +# Archival Utilities +# +# CONFIG_FEATURE_SEAMLESS_XZ is not set +# CONFIG_FEATURE_SEAMLESS_LZMA is not set +# CONFIG_FEATURE_SEAMLESS_BZ2 is not set +# CONFIG_FEATURE_SEAMLESS_GZ is not set +# CONFIG_FEATURE_SEAMLESS_Z is not set +CONFIG_AR=y +# CONFIG_FEATURE_AR_LONG_FILENAMES is not set +CONFIG_FEATURE_AR_CREATE=y +CONFIG_BUNZIP2=y +# CONFIG_BZIP2 is not set +CONFIG_CPIO=y +# CONFIG_FEATURE_CPIO_O is not set +# CONFIG_FEATURE_CPIO_P is not set +# CONFIG_DPKG is not set +# CONFIG_DPKG_DEB is not set +# CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY is not set +CONFIG_GUNZIP=y +CONFIG_GZIP=y +# CONFIG_FEATURE_GZIP_LONG_OPTIONS is not set +# CONFIG_LZOP is not set +# CONFIG_LZOP_COMPR_HIGH is not set +# CONFIG_RPM2CPIO is not set +# CONFIG_RPM is not set +CONFIG_TAR=y +CONFIG_FEATURE_TAR_CREATE=y +# CONFIG_FEATURE_TAR_AUTODETECT is not set +CONFIG_FEATURE_TAR_FROM=y +# CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY is not set +# CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY is not set +CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y +CONFIG_FEATURE_TAR_LONG_OPTIONS=y +CONFIG_FEATURE_TAR_TO_COMMAND=y +# CONFIG_FEATURE_TAR_UNAME_GNAME is not set +# CONFIG_FEATURE_TAR_NOPRESERVE_TIME is not set +# CONFIG_FEATURE_TAR_SELINUX is not set +# CONFIG_UNCOMPRESS is not set +CONFIG_UNLZMA=y +# CONFIG_FEATURE_LZMA_FAST is not set +CONFIG_LZMA=y +CONFIG_UNXZ=y +CONFIG_XZ=y +CONFIG_UNZIP=y + +# +# Coreutils +# +CONFIG_BASENAME=y +CONFIG_CAT=y +CONFIG_DATE=y +CONFIG_FEATURE_DATE_ISOFMT=y +# CONFIG_FEATURE_DATE_NANO is not set +CONFIG_FEATURE_DATE_COMPAT=y +CONFIG_TEST=y +CONFIG_FEATURE_TEST_64=y +CONFIG_TR=y +CONFIG_FEATURE_TR_CLASSES=y +CONFIG_FEATURE_TR_EQUIV=y +CONFIG_BASE64=y +# CONFIG_CAL is not set +CONFIG_CATV=y +CONFIG_CHGRP=y +CONFIG_CHMOD=y +CONFIG_CHOWN=y +# CONFIG_FEATURE_CHOWN_LONG_OPTIONS is not set +CONFIG_CHROOT=y +CONFIG_CKSUM=y +# CONFIG_COMM is not set +CONFIG_CP=y +# CONFIG_FEATURE_CP_LONG_OPTIONS is not set +CONFIG_CUT=y +CONFIG_DD=y +CONFIG_FEATURE_DD_SIGNAL_HANDLING=y +# CONFIG_FEATURE_DD_THIRD_STATUS_LINE is not set +CONFIG_FEATURE_DD_IBS_OBS=y +CONFIG_DF=y +# CONFIG_FEATURE_DF_FANCY is not set +CONFIG_DIRNAME=y +CONFIG_DOS2UNIX=y +CONFIG_UNIX2DOS=y +CONFIG_DU=y +CONFIG_FEATURE_DU_DEFAULT_BLOCKSIZE_1K=y +CONFIG_ECHO=y +CONFIG_FEATURE_FANCY_ECHO=y +CONFIG_ENV=y +# CONFIG_FEATURE_ENV_LONG_OPTIONS is not set +# CONFIG_EXPAND is not set +# CONFIG_FEATURE_EXPAND_LONG_OPTIONS is not set +CONFIG_EXPR=y +CONFIG_EXPR_MATH_SUPPORT_64=y +CONFIG_FALSE=y +CONFIG_FOLD=y +CONFIG_FSYNC=y +CONFIG_HEAD=y +CONFIG_FEATURE_FANCY_HEAD=y +CONFIG_HOSTID=y +CONFIG_ID=y +CONFIG_INSTALL=y +CONFIG_FEATURE_INSTALL_LONG_OPTIONS=y +CONFIG_LENGTH=y +CONFIG_LN=y +CONFIG_LOGNAME=y +CONFIG_LS=y +CONFIG_FEATURE_LS_FILETYPES=y +CONFIG_FEATURE_LS_FOLLOWLINKS=y +CONFIG_FEATURE_LS_RECURSIVE=y +CONFIG_FEATURE_LS_SORTFILES=y +CONFIG_FEATURE_LS_TIMESTAMPS=y +CONFIG_FEATURE_LS_USERNAME=y +CONFIG_FEATURE_LS_COLOR=y +CONFIG_FEATURE_LS_COLOR_IS_DEFAULT=y +CONFIG_MD5SUM=y +CONFIG_MKDIR=y +CONFIG_FEATURE_MKDIR_LONG_OPTIONS=y +CONFIG_MKFIFO=y +CONFIG_MKNOD=y +CONFIG_MV=y +CONFIG_FEATURE_MV_LONG_OPTIONS=y +CONFIG_NICE=y +CONFIG_NOHUP=y +CONFIG_OD=y +CONFIG_PRINTENV=y +CONFIG_PRINTF=y +CONFIG_PWD=y +CONFIG_READLINK=y +CONFIG_FEATURE_READLINK_FOLLOW=y +CONFIG_REALPATH=y +CONFIG_RM=y +CONFIG_RMDIR=y +# CONFIG_FEATURE_RMDIR_LONG_OPTIONS is not set +CONFIG_SEQ=y +CONFIG_SHA1SUM=y +CONFIG_SHA256SUM=y +CONFIG_SHA512SUM=y +CONFIG_SLEEP=y +CONFIG_FEATURE_FANCY_SLEEP=y +CONFIG_FEATURE_FLOAT_SLEEP=y +CONFIG_SORT=y +CONFIG_FEATURE_SORT_BIG=y +# CONFIG_SPLIT is not set +# CONFIG_FEATURE_SPLIT_FANCY is not set +# CONFIG_STAT is not set +# CONFIG_FEATURE_STAT_FORMAT is not set +CONFIG_STTY=y +# CONFIG_SUM is not set +CONFIG_SYNC=y +CONFIG_TAC=y +CONFIG_TAIL=y +CONFIG_FEATURE_FANCY_TAIL=y +CONFIG_TEE=y +CONFIG_FEATURE_TEE_USE_BLOCK_IO=y +CONFIG_TOUCH=y +CONFIG_TRUE=y +CONFIG_TTY=y +CONFIG_UNAME=y +# CONFIG_UNEXPAND is not set +# CONFIG_FEATURE_UNEXPAND_LONG_OPTIONS is not set +CONFIG_UNIQ=y +CONFIG_USLEEP=y +CONFIG_UUDECODE=y +CONFIG_UUENCODE=y +CONFIG_WC=y +# CONFIG_FEATURE_WC_LARGE is not set +# CONFIG_WHO is not set +CONFIG_WHOAMI=y +CONFIG_YES=y + +# +# Common options for cp and mv +# +CONFIG_FEATURE_PRESERVE_HARDLINKS=y + +# +# Common options for ls, more and telnet +# +CONFIG_FEATURE_AUTOWIDTH=y + +# +# Common options for df, du, ls +# +CONFIG_FEATURE_HUMAN_READABLE=y + +# +# Common options for md5sum, sha1sum, sha256sum, sha512sum +# +CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y + +# +# Console Utilities +# +CONFIG_CHVT=y +# CONFIG_FGCONSOLE is not set +CONFIG_CLEAR=y +CONFIG_DEALLOCVT=y +CONFIG_DUMPKMAP=y +# CONFIG_KBD_MODE is not set +CONFIG_LOADFONT=y +CONFIG_LOADKMAP=y +CONFIG_OPENVT=y +CONFIG_RESET=y +CONFIG_RESIZE=y +CONFIG_FEATURE_RESIZE_PRINT=y +CONFIG_SETCONSOLE=y +# CONFIG_FEATURE_SETCONSOLE_LONG_OPTIONS is not set +# CONFIG_SETFONT is not set +# CONFIG_FEATURE_SETFONT_TEXTUAL_MAP is not set +CONFIG_DEFAULT_SETFONT_DIR="" +CONFIG_SETKEYCODES=y +CONFIG_SETLOGCONS=y +# CONFIG_SHOWKEY is not set + +# +# Common options for loadfont and setfont +# +CONFIG_FEATURE_LOADFONT_PSF2=y +CONFIG_FEATURE_LOADFONT_RAW=y + +# +# Debian Utilities +# +CONFIG_MKTEMP=y +# CONFIG_PIPE_PROGRESS is not set +# CONFIG_RUN_PARTS is not set +# CONFIG_FEATURE_RUN_PARTS_LONG_OPTIONS is not set +# CONFIG_FEATURE_RUN_PARTS_FANCY is not set +# CONFIG_START_STOP_DAEMON is not set +# CONFIG_FEATURE_START_STOP_DAEMON_FANCY is not set +# CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS is not set +# CONFIG_WHICH is not set + +# +# Editors +# +CONFIG_PATCH=y +CONFIG_AWK=y +# CONFIG_FEATURE_AWK_LIBM is not set +CONFIG_CMP=y +CONFIG_DIFF=y +# CONFIG_FEATURE_DIFF_LONG_OPTIONS is not set +CONFIG_FEATURE_DIFF_DIR=y +# CONFIG_ED is not set +CONFIG_SED=y +CONFIG_VI=y +CONFIG_FEATURE_VI_MAX_LEN=4096 +CONFIG_FEATURE_VI_8BIT=y +CONFIG_FEATURE_VI_COLON=y +CONFIG_FEATURE_VI_YANKMARK=y +CONFIG_FEATURE_VI_SEARCH=y +CONFIG_FEATURE_VI_USE_SIGNALS=y +CONFIG_FEATURE_VI_DOT_CMD=y +CONFIG_FEATURE_VI_READONLY=y +CONFIG_FEATURE_VI_SETOPTS=y +CONFIG_FEATURE_VI_SET=y +CONFIG_FEATURE_VI_WIN_RESIZE=y +CONFIG_FEATURE_VI_ASK_TERMINAL=y +CONFIG_FEATURE_VI_OPTIMIZE_CURSOR=y +CONFIG_FEATURE_ALLOW_EXEC=y + +# +# Finding Utilities +# +CONFIG_FIND=y +CONFIG_FEATURE_FIND_PRINT0=y +CONFIG_FEATURE_FIND_MTIME=y +CONFIG_FEATURE_FIND_MMIN=y +CONFIG_FEATURE_FIND_PERM=y +CONFIG_FEATURE_FIND_TYPE=y +CONFIG_FEATURE_FIND_XDEV=y +CONFIG_FEATURE_FIND_MAXDEPTH=y +CONFIG_FEATURE_FIND_NEWER=y +# CONFIG_FEATURE_FIND_INUM is not set +CONFIG_FEATURE_FIND_EXEC=y +CONFIG_FEATURE_FIND_USER=y +CONFIG_FEATURE_FIND_GROUP=y +CONFIG_FEATURE_FIND_NOT=y +CONFIG_FEATURE_FIND_DEPTH=y +CONFIG_FEATURE_FIND_PAREN=y +CONFIG_FEATURE_FIND_SIZE=y +CONFIG_FEATURE_FIND_PRUNE=y +# CONFIG_FEATURE_FIND_DELETE is not set +CONFIG_FEATURE_FIND_PATH=y +CONFIG_FEATURE_FIND_REGEX=y +# CONFIG_FEATURE_FIND_CONTEXT is not set +# CONFIG_FEATURE_FIND_LINKS is not set +CONFIG_GREP=y +CONFIG_FEATURE_GREP_EGREP_ALIAS=y +CONFIG_FEATURE_GREP_FGREP_ALIAS=y +CONFIG_FEATURE_GREP_CONTEXT=y +CONFIG_XARGS=y +# CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION is not set +CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y +CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT=y +CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM=y + +# +# Init Utilities +# +# CONFIG_BOOTCHARTD is not set +# CONFIG_FEATURE_BOOTCHARTD_BLOATED_HEADER is not set +# CONFIG_FEATURE_BOOTCHARTD_CONFIG_FILE is not set +CONFIG_HALT=y +# CONFIG_FEATURE_CALL_TELINIT is not set +CONFIG_TELINIT_PATH="" +# CONFIG_INIT is not set +# CONFIG_FEATURE_USE_INITTAB is not set +# CONFIG_FEATURE_KILL_REMOVED is not set +CONFIG_FEATURE_KILL_DELAY=0 +# CONFIG_FEATURE_INIT_SCTTY is not set +# CONFIG_FEATURE_INIT_SYSLOG is not set +# CONFIG_FEATURE_EXTRA_QUIET is not set +# CONFIG_FEATURE_INIT_COREDUMPS is not set +# CONFIG_FEATURE_INITRD is not set +CONFIG_INIT_TERMINAL_TYPE="" +CONFIG_MESG=y + +# +# Login/Password Management Utilities +# +# CONFIG_ADD_SHELL is not set +# CONFIG_REMOVE_SHELL is not set +CONFIG_FEATURE_SHADOWPASSWDS=y +# CONFIG_USE_BB_PWD_GRP is not set +# CONFIG_USE_BB_SHADOW is not set +CONFIG_USE_BB_CRYPT=y +# CONFIG_USE_BB_CRYPT_SHA is not set +CONFIG_ADDUSER=y +# CONFIG_FEATURE_ADDUSER_LONG_OPTIONS is not set +# CONFIG_FEATURE_CHECK_NAMES is not set +CONFIG_FIRST_SYSTEM_ID=100 +CONFIG_LAST_SYSTEM_ID=999 +CONFIG_ADDGROUP=y +# CONFIG_FEATURE_ADDGROUP_LONG_OPTIONS is not set +# CONFIG_FEATURE_ADDUSER_TO_GROUP is not set +CONFIG_DELUSER=y +CONFIG_DELGROUP=y +# CONFIG_FEATURE_DEL_USER_FROM_GROUP is not set +CONFIG_GETTY=y +CONFIG_LOGIN=y +# CONFIG_PAM is not set +# CONFIG_LOGIN_SCRIPTS is not set +# CONFIG_FEATURE_NOLOGIN is not set +# CONFIG_FEATURE_SECURETTY is not set +CONFIG_PASSWD=y +CONFIG_FEATURE_PASSWD_WEAK_CHECK=y +# CONFIG_CRYPTPW is not set +CONFIG_CHPASSWD=y +# CONFIG_SU is not set +# CONFIG_FEATURE_SU_SYSLOG is not set +# CONFIG_FEATURE_SU_CHECKS_SHELLS is not set +CONFIG_SULOGIN=y +# CONFIG_VLOCK is not set + +# +# Linux Ext2 FS Progs +# +CONFIG_CHATTR=y +CONFIG_FSCK=y +CONFIG_LSATTR=y +CONFIG_TUNE2FS=y + +# +# Linux Module Utilities +# +# CONFIG_MODINFO is not set +# CONFIG_MODPROBE_SMALL is not set +# CONFIG_FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE is not set +# CONFIG_FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED is not set +# CONFIG_INSMOD is not set +# CONFIG_RMMOD is not set +# CONFIG_LSMOD is not set +# CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT is not set +# CONFIG_MODPROBE is not set +# CONFIG_FEATURE_MODPROBE_BLACKLIST is not set +# CONFIG_DEPMOD is not set + +# +# Options common to multiple modutils +# +# CONFIG_FEATURE_2_4_MODULES is not set +# CONFIG_FEATURE_INSMOD_TRY_MMAP is not set +# CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set +# CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set +# CONFIG_FEATURE_INSMOD_LOADINKMEM is not set +# CONFIG_FEATURE_INSMOD_LOAD_MAP is not set +# CONFIG_FEATURE_INSMOD_LOAD_MAP_FULL is not set +# CONFIG_FEATURE_CHECK_TAINTED_MODULE is not set +# CONFIG_FEATURE_MODUTILS_ALIAS is not set +# CONFIG_FEATURE_MODUTILS_SYMBOLS is not set +CONFIG_DEFAULT_MODULES_DIR="" +CONFIG_DEFAULT_DEPMOD_FILE="" + +# +# Linux System Utilities +# +# CONFIG_BLOCKDEV is not set +CONFIG_REV=y +# CONFIG_ACPID is not set +# CONFIG_FEATURE_ACPID_COMPAT is not set +CONFIG_BLKID=y +CONFIG_DMESG=y +CONFIG_FEATURE_DMESG_PRETTY=y +# CONFIG_FBSET is not set +# CONFIG_FEATURE_FBSET_FANCY is not set +# CONFIG_FEATURE_FBSET_READMODE is not set +CONFIG_FDFLUSH=y +CONFIG_FDFORMAT=y +CONFIG_FDISK=y +CONFIG_FDISK_SUPPORT_LARGE_DISKS=y +CONFIG_FEATURE_FDISK_WRITABLE=y +# CONFIG_FEATURE_AIX_LABEL is not set +# CONFIG_FEATURE_SGI_LABEL is not set +# CONFIG_FEATURE_SUN_LABEL is not set +# CONFIG_FEATURE_OSF_LABEL is not set +# CONFIG_FEATURE_GPT_LABEL is not set +# CONFIG_FEATURE_FDISK_ADVANCED is not set +CONFIG_FINDFS=y +CONFIG_FLOCK=y +CONFIG_FREERAMDISK=y +# CONFIG_FSCK_MINIX is not set +CONFIG_MKFS_EXT2=y +# CONFIG_MKFS_MINIX is not set +# CONFIG_FEATURE_MINIX2 is not set +# CONFIG_MKFS_REISER is not set +CONFIG_MKFS_VFAT=y +CONFIG_GETOPT=y +CONFIG_FEATURE_GETOPT_LONG=y +CONFIG_HEXDUMP=y +CONFIG_FEATURE_HEXDUMP_REVERSE=y +CONFIG_HD=y +CONFIG_HWCLOCK=y +CONFIG_FEATURE_HWCLOCK_LONG_OPTIONS=y +CONFIG_FEATURE_HWCLOCK_ADJTIME_FHS=y +CONFIG_IPCRM=y +CONFIG_IPCS=y +CONFIG_LOSETUP=y +CONFIG_LSPCI=y +CONFIG_LSUSB=y +CONFIG_MDEV=y +CONFIG_FEATURE_MDEV_CONF=y +# CONFIG_FEATURE_MDEV_RENAME is not set +# CONFIG_FEATURE_MDEV_RENAME_REGEXP is not set +CONFIG_FEATURE_MDEV_EXEC=y +# CONFIG_FEATURE_MDEV_LOAD_FIRMWARE is not set +CONFIG_MKSWAP=y +# CONFIG_FEATURE_MKSWAP_UUID is not set +CONFIG_MORE=y +CONFIG_MOUNT=y +# CONFIG_FEATURE_MOUNT_FAKE is not set +# CONFIG_FEATURE_MOUNT_VERBOSE is not set +# CONFIG_FEATURE_MOUNT_HELPERS is not set +CONFIG_FEATURE_MOUNT_LABEL=y +# CONFIG_FEATURE_MOUNT_NFS is not set +# CONFIG_FEATURE_MOUNT_CIFS is not set +CONFIG_FEATURE_MOUNT_FLAGS=y +# CONFIG_FEATURE_MOUNT_FSTAB is not set +# CONFIG_PIVOT_ROOT is not set +CONFIG_RDATE=y +# CONFIG_RDEV is not set +CONFIG_READPROFILE=y +# CONFIG_RTCWAKE is not set +# CONFIG_SCRIPT is not set +# CONFIG_SCRIPTREPLAY is not set +# CONFIG_SETARCH is not set +CONFIG_SWAPONOFF=y +# CONFIG_FEATURE_SWAPON_PRI is not set +# CONFIG_SWITCH_ROOT is not set +CONFIG_UMOUNT=y +CONFIG_FEATURE_UMOUNT_ALL=y + +# +# Common options for mount/umount +# +CONFIG_FEATURE_MOUNT_LOOP=y +CONFIG_FEATURE_MOUNT_LOOP_CREATE=y +# CONFIG_FEATURE_MTAB_SUPPORT is not set +CONFIG_VOLUMEID=y + +# +# Filesystem/Volume identification +# +CONFIG_FEATURE_VOLUMEID_EXT=y +CONFIG_FEATURE_VOLUMEID_BTRFS=y +CONFIG_FEATURE_VOLUMEID_REISERFS=y +CONFIG_FEATURE_VOLUMEID_FAT=y +CONFIG_FEATURE_VOLUMEID_HFS=y +CONFIG_FEATURE_VOLUMEID_JFS=y +CONFIG_FEATURE_VOLUMEID_XFS=y +CONFIG_FEATURE_VOLUMEID_NTFS=y +CONFIG_FEATURE_VOLUMEID_ISO9660=y +CONFIG_FEATURE_VOLUMEID_UDF=y +CONFIG_FEATURE_VOLUMEID_LUKS=y +CONFIG_FEATURE_VOLUMEID_LINUXSWAP=y +CONFIG_FEATURE_VOLUMEID_CRAMFS=y +CONFIG_FEATURE_VOLUMEID_ROMFS=y +CONFIG_FEATURE_VOLUMEID_SYSV=y +CONFIG_FEATURE_VOLUMEID_OCFS2=y +CONFIG_FEATURE_VOLUMEID_LINUXRAID=y + +# +# Miscellaneous Utilities +# +# CONFIG_CONSPY is not set +# CONFIG_NANDWRITE is not set +# CONFIG_NANDDUMP is not set +# CONFIG_UBIATTACH is not set +# CONFIG_UBIDETACH is not set +# CONFIG_ADJTIMEX is not set +# CONFIG_BBCONFIG is not set +# CONFIG_FEATURE_COMPRESS_BBCONFIG is not set +# CONFIG_BEEP is not set +CONFIG_FEATURE_BEEP_FREQ=0 +CONFIG_FEATURE_BEEP_LENGTH_MS=0 +# CONFIG_CHAT is not set +# CONFIG_FEATURE_CHAT_NOFAIL is not set +# CONFIG_FEATURE_CHAT_TTY_HIFI is not set +# CONFIG_FEATURE_CHAT_IMPLICIT_CR is not set +# CONFIG_FEATURE_CHAT_SWALLOW_OPTS is not set +# CONFIG_FEATURE_CHAT_SEND_ESCAPES is not set +# CONFIG_FEATURE_CHAT_VAR_ABORT_LEN is not set +# CONFIG_FEATURE_CHAT_CLR_ABORT is not set +CONFIG_CHRT=y +# CONFIG_CROND is not set +# CONFIG_FEATURE_CROND_D is not set +# CONFIG_FEATURE_CROND_CALL_SENDMAIL is not set +CONFIG_FEATURE_CROND_DIR="" +# CONFIG_CRONTAB is not set +CONFIG_DC=y +# CONFIG_FEATURE_DC_LIBM is not set +# CONFIG_DEVFSD is not set +# CONFIG_DEVFSD_MODLOAD is not set +# CONFIG_DEVFSD_FG_NP is not set +# CONFIG_DEVFSD_VERBOSE is not set +# CONFIG_FEATURE_DEVFS is not set +CONFIG_DEVMEM=y +# CONFIG_EJECT is not set +# CONFIG_FEATURE_EJECT_SCSI is not set +# CONFIG_FBSPLASH is not set +# CONFIG_FLASHCP is not set +# CONFIG_FLASH_LOCK is not set +# CONFIG_FLASH_UNLOCK is not set +# CONFIG_FLASH_ERASEALL is not set +# CONFIG_IONICE is not set +CONFIG_INOTIFYD=y +# CONFIG_LAST is not set +# CONFIG_FEATURE_LAST_SMALL is not set +# CONFIG_FEATURE_LAST_FANCY is not set +CONFIG_LESS=y +CONFIG_FEATURE_LESS_MAXLINES=9999999 +CONFIG_FEATURE_LESS_BRACKETS=y +CONFIG_FEATURE_LESS_FLAGS=y +# CONFIG_FEATURE_LESS_MARKS is not set +CONFIG_FEATURE_LESS_REGEXP=y +# CONFIG_FEATURE_LESS_WINCH is not set +# CONFIG_FEATURE_LESS_DASHCMD is not set +# CONFIG_FEATURE_LESS_LINENUMS is not set +# CONFIG_HDPARM is not set +# CONFIG_FEATURE_HDPARM_GET_IDENTITY is not set +# CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF is not set +# CONFIG_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF is not set +# CONFIG_FEATURE_HDPARM_HDIO_DRIVE_RESET is not set +# CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF is not set +# CONFIG_FEATURE_HDPARM_HDIO_GETSET_DMA is not set +CONFIG_MAKEDEVS=y +# CONFIG_FEATURE_MAKEDEVS_LEAF is not set +CONFIG_FEATURE_MAKEDEVS_TABLE=y +# CONFIG_MAN is not set +# CONFIG_MICROCOM is not set +# CONFIG_MOUNTPOINT is not set +# CONFIG_MT is not set +# CONFIG_RAIDAUTORUN is not set +# CONFIG_READAHEAD is not set +# CONFIG_RFKILL is not set +# CONFIG_RUNLEVEL is not set +# CONFIG_RX is not set +CONFIG_SETSID=y +CONFIG_STRINGS=y +# CONFIG_TASKSET is not set +# CONFIG_FEATURE_TASKSET_FANCY is not set +CONFIG_TIME=y +# CONFIG_TIMEOUT is not set +# CONFIG_TTYSIZE is not set +# CONFIG_VOLNAME is not set +CONFIG_WALL=y +# CONFIG_WATCHDOG is not set + +# +# Networking Utilities +# +# CONFIG_NBDCLIENT is not set +CONFIG_NC=y +CONFIG_NC_SERVER=y +CONFIG_NC_EXTRA=y +# CONFIG_NC_110_COMPAT is not set +CONFIG_FEATURE_IPV6=y +# CONFIG_FEATURE_UNIX_LOCAL is not set +# CONFIG_FEATURE_PREFER_IPV4_ADDRESS is not set +# CONFIG_VERBOSE_RESOLUTION_ERRORS is not set +# CONFIG_ARP is not set +# CONFIG_ARPING is not set +CONFIG_BRCTL=y +CONFIG_FEATURE_BRCTL_FANCY=y +CONFIG_FEATURE_BRCTL_SHOW=y +# CONFIG_DNSD is not set +CONFIG_ETHER_WAKE=y +# CONFIG_FAKEIDENTD is not set +# CONFIG_FTPD is not set +# CONFIG_FEATURE_FTP_WRITE is not set +# CONFIG_FEATURE_FTPD_ACCEPT_BROKEN_LIST is not set +# CONFIG_FTPGET is not set +# CONFIG_FTPPUT is not set +# CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS is not set +CONFIG_HOSTNAME=y +# CONFIG_HTTPD is not set +# CONFIG_FEATURE_HTTPD_RANGES is not set +# CONFIG_FEATURE_HTTPD_USE_SENDFILE is not set +# CONFIG_FEATURE_HTTPD_SETUID is not set +# CONFIG_FEATURE_HTTPD_BASIC_AUTH is not set +# CONFIG_FEATURE_HTTPD_AUTH_MD5 is not set +# CONFIG_FEATURE_HTTPD_CGI is not set +# CONFIG_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR is not set +# CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV is not set +# CONFIG_FEATURE_HTTPD_ENCODE_URL_STR is not set +# CONFIG_FEATURE_HTTPD_ERROR_PAGES is not set +# CONFIG_FEATURE_HTTPD_PROXY is not set +# CONFIG_FEATURE_HTTPD_GZIP is not set +CONFIG_IFCONFIG=y +CONFIG_FEATURE_IFCONFIG_STATUS=y +CONFIG_FEATURE_IFCONFIG_SLIP=y +CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ=y +CONFIG_FEATURE_IFCONFIG_HW=y +# CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS is not set +# CONFIG_IFENSLAVE is not set +# CONFIG_IFPLUGD is not set +# CONFIG_IFUPDOWN is not set +CONFIG_IFUPDOWN_IFSTATE_PATH="" +# CONFIG_FEATURE_IFUPDOWN_IP is not set +# CONFIG_FEATURE_IFUPDOWN_IP_BUILTIN is not set +# CONFIG_FEATURE_IFUPDOWN_IFCONFIG_BUILTIN is not set +# CONFIG_FEATURE_IFUPDOWN_IPV4 is not set +# CONFIG_FEATURE_IFUPDOWN_IPV6 is not set +# CONFIG_FEATURE_IFUPDOWN_MAPPING is not set +# CONFIG_FEATURE_IFUPDOWN_EXTERNAL_DHCP is not set +# CONFIG_INETD is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_TIME is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN is not set +# CONFIG_FEATURE_INETD_RPC is not set +CONFIG_IP=y +CONFIG_FEATURE_IP_ADDRESS=y +CONFIG_FEATURE_IP_LINK=y +CONFIG_FEATURE_IP_ROUTE=y +CONFIG_FEATURE_IP_TUNNEL=y +CONFIG_FEATURE_IP_RULE=y +CONFIG_FEATURE_IP_SHORT_FORMS=y +# CONFIG_FEATURE_IP_RARE_PROTOCOLS is not set +CONFIG_IPADDR=y +CONFIG_IPLINK=y +CONFIG_IPROUTE=y +CONFIG_IPTUNNEL=y +CONFIG_IPRULE=y +# CONFIG_IPCALC is not set +# CONFIG_FEATURE_IPCALC_FANCY is not set +# CONFIG_FEATURE_IPCALC_LONG_OPTIONS is not set +# CONFIG_NAMEIF is not set +# CONFIG_FEATURE_NAMEIF_EXTENDED is not set +CONFIG_NETSTAT=y +# CONFIG_FEATURE_NETSTAT_WIDE is not set +# CONFIG_FEATURE_NETSTAT_PRG is not set +CONFIG_NSLOOKUP=y +# CONFIG_NTPD is not set +# CONFIG_FEATURE_NTPD_SERVER is not set +CONFIG_PING=y +CONFIG_PING6=y +CONFIG_FEATURE_FANCY_PING=y +# CONFIG_PSCAN is not set +# CONFIG_ROUTE is not set +# CONFIG_SLATTACH is not set +CONFIG_TCPSVD=y +CONFIG_TELNET=y +CONFIG_FEATURE_TELNET_TTYPE=y +CONFIG_FEATURE_TELNET_AUTOLOGIN=y +CONFIG_TELNETD=y +# CONFIG_FEATURE_TELNETD_STANDALONE is not set +# CONFIG_FEATURE_TELNETD_INETD_WAIT is not set +CONFIG_TFTP=y +CONFIG_TFTPD=y + +# +# Common options for tftp/tftpd +# +CONFIG_FEATURE_TFTP_GET=y +CONFIG_FEATURE_TFTP_PUT=y +CONFIG_FEATURE_TFTP_BLOCKSIZE=y +# CONFIG_FEATURE_TFTP_PROGRESS_BAR is not set +# CONFIG_TFTP_DEBUG is not set +CONFIG_TRACEROUTE=y +CONFIG_TRACEROUTE6=y +# CONFIG_FEATURE_TRACEROUTE_VERBOSE is not set +# CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE is not set +# CONFIG_FEATURE_TRACEROUTE_USE_ICMP is not set +# CONFIG_TUNCTL is not set +# CONFIG_FEATURE_TUNCTL_UG is not set +CONFIG_UDHCPD=y +CONFIG_DHCPRELAY=y +CONFIG_DUMPLEASES=y +CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY=y +CONFIG_DHCPD_LEASES_FILE="/tmp/dhcp-leases" +CONFIG_UDHCPC=y +CONFIG_FEATURE_UDHCPC_ARPING=y +# CONFIG_FEATURE_UDHCP_PORT is not set +CONFIG_UDHCP_DEBUG=0 +# CONFIG_FEATURE_UDHCP_RFC3397 is not set +CONFIG_UDHCPC_DEFAULT_SCRIPT="/sbin/udhcpc-script" +CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=80 +CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS="" +CONFIG_UDPSVD=y +# CONFIG_VCONFIG is not set +CONFIG_WGET=y +CONFIG_FEATURE_WGET_STATUSBAR=y +CONFIG_FEATURE_WGET_AUTHENTICATION=y +CONFIG_FEATURE_WGET_LONG_OPTIONS=y +CONFIG_FEATURE_WGET_TIMEOUT=y +# CONFIG_ZCIP is not set + +# +# Print Utilities +# +# CONFIG_LPD is not set +# CONFIG_LPR is not set +# CONFIG_LPQ is not set + +# +# Mail Utilities +# +# CONFIG_MAKEMIME is not set +CONFIG_FEATURE_MIME_CHARSET="" +# CONFIG_POPMAILDIR is not set +# CONFIG_FEATURE_POPMAILDIR_DELIVERY is not set +# CONFIG_REFORMIME is not set +# CONFIG_FEATURE_REFORMIME_COMPAT is not set +# CONFIG_SENDMAIL is not set + +# +# Process Utilities +# +# CONFIG_IOSTAT is not set +# CONFIG_MPSTAT is not set +# CONFIG_PMAP is not set +# CONFIG_POWERTOP is not set +# CONFIG_SMEMCAP is not set +CONFIG_FREE=y +# CONFIG_FUSER is not set +CONFIG_KILL=y +CONFIG_KILLALL=y +CONFIG_KILLALL5=y +# CONFIG_NMETER is not set +# CONFIG_PGREP is not set +# CONFIG_PIDOF is not set +# CONFIG_FEATURE_PIDOF_SINGLE is not set +# CONFIG_FEATURE_PIDOF_OMIT is not set +# CONFIG_PKILL is not set +CONFIG_PS=y +CONFIG_FEATURE_PS_WIDE=y +# CONFIG_FEATURE_PS_TIME is not set +# CONFIG_FEATURE_PS_ADDITIONAL_COLUMNS is not set +# CONFIG_FEATURE_PS_UNUSUAL_SYSTEMS is not set +CONFIG_RENICE=y +# CONFIG_BB_SYSCTL is not set +CONFIG_TOP=y +CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y +CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y +# CONFIG_FEATURE_TOP_SMP_CPU is not set +# CONFIG_FEATURE_TOP_DECIMALS is not set +# CONFIG_FEATURE_TOP_SMP_PROCESS is not set +# CONFIG_FEATURE_TOPMEM is not set +# CONFIG_FEATURE_SHOW_THREADS is not set +CONFIG_UPTIME=y +CONFIG_WATCH=y + +# +# Runit Utilities +# +CONFIG_RUNSV=y +CONFIG_RUNSVDIR=y +CONFIG_FEATURE_RUNSVDIR_LOG=y +CONFIG_SV=y +CONFIG_SV_DEFAULT_SERVICE_DIR="/service" +CONFIG_SVLOGD=y +CONFIG_CHPST=y +CONFIG_SETUIDGID=y +CONFIG_ENVUIDGID=y +CONFIG_ENVDIR=y +CONFIG_SOFTLIMIT=y +# CONFIG_CHCON is not set +# CONFIG_FEATURE_CHCON_LONG_OPTIONS is not set +# CONFIG_GETENFORCE is not set +# CONFIG_GETSEBOOL is not set +# CONFIG_LOAD_POLICY is not set +# CONFIG_MATCHPATHCON is not set +# CONFIG_RESTORECON is not set +# CONFIG_RUNCON is not set +# CONFIG_FEATURE_RUNCON_LONG_OPTIONS is not set +# CONFIG_SELINUXENABLED is not set +# CONFIG_SETENFORCE is not set +# CONFIG_SETFILES is not set +# CONFIG_FEATURE_SETFILES_CHECK_OPTION is not set +# CONFIG_SETSEBOOL is not set +# CONFIG_SESTATUS is not set + +# +# Shells +# +CONFIG_ASH=y +CONFIG_ASH_BASH_COMPAT=y +CONFIG_ASH_JOB_CONTROL=y +CONFIG_ASH_ALIAS=y +# CONFIG_ASH_GETOPTS is not set +CONFIG_ASH_BUILTIN_ECHO=y +CONFIG_ASH_BUILTIN_PRINTF=y +CONFIG_ASH_BUILTIN_TEST=y +CONFIG_ASH_CMDCMD=y +# CONFIG_ASH_MAIL is not set +CONFIG_ASH_OPTIMIZE_FOR_SIZE=y +CONFIG_ASH_RANDOM_SUPPORT=y +CONFIG_ASH_EXPAND_PRMT=y +# CONFIG_CTTYHACK is not set +# CONFIG_HUSH is not set +# CONFIG_HUSH_BASH_COMPAT is not set +# CONFIG_HUSH_BRACE_EXPANSION is not set +# CONFIG_HUSH_HELP is not set +# CONFIG_HUSH_INTERACTIVE is not set +# CONFIG_HUSH_SAVEHISTORY is not set +# CONFIG_HUSH_JOB is not set +# CONFIG_HUSH_TICK is not set +# CONFIG_HUSH_IF is not set +# CONFIG_HUSH_LOOPS is not set +# CONFIG_HUSH_CASE is not set +# CONFIG_HUSH_FUNCTIONS is not set +# CONFIG_HUSH_LOCAL is not set +# CONFIG_HUSH_RANDOM_SUPPORT is not set +# CONFIG_HUSH_EXPORT_N is not set +# CONFIG_HUSH_MODE_X is not set +# CONFIG_MSH is not set +CONFIG_FEATURE_SH_IS_ASH=y +# CONFIG_FEATURE_SH_IS_HUSH is not set +# CONFIG_FEATURE_SH_IS_NONE is not set +# CONFIG_FEATURE_BASH_IS_ASH is not set +# CONFIG_FEATURE_BASH_IS_HUSH is not set +CONFIG_FEATURE_BASH_IS_NONE=y +# CONFIG_SH_MATH_SUPPORT is not set +# CONFIG_SH_MATH_SUPPORT_64 is not set +CONFIG_FEATURE_SH_EXTRA_QUIET=y +# CONFIG_FEATURE_SH_STANDALONE is not set +# CONFIG_FEATURE_SH_NOFORK is not set + +# +# System Logging Utilities +# +# CONFIG_SYSLOGD is not set +# CONFIG_FEATURE_ROTATE_LOGFILE is not set +# CONFIG_FEATURE_REMOTE_LOG is not set +# CONFIG_FEATURE_SYSLOGD_DUP is not set +CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE=0 +# CONFIG_FEATURE_IPC_SYSLOG is not set +CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=0 +# CONFIG_LOGREAD is not set +# CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING is not set +# CONFIG_KLOGD is not set +# CONFIG_FEATURE_KLOGD_KLOGCTL is not set +# CONFIG_LOGGER is not set diff --git a/sh4pwn/cleanup.sh b/sh4pwn/cleanup.sh new file mode 100755 index 0000000..36f0944 --- /dev/null +++ b/sh4pwn/cleanup.sh @@ -0,0 +1,26 @@ +#! /bin/sh + +# Invoked by buildroot just before making a filesystem + +move () { + [ -d $1 ] && (cd $1 && tar cf - .) | (cd $2 && tar xf -) && rm -rf $1 +} + +rm -rf $1/init.d +rm -rf $1/var/cache $1/var/lib + +move $1/usr/bin $1/bin +move $1/usr/sbin $1/sbin +move $1/usr/lib $1/lib +move $1/usr/share $1/lib +[ -d $1/usr ] && rmdir $1/usr +[ -x $1/usr ] && rm $1/usr + +set +cp $(dirname $0)/skeleton/sbin/init $1/sbin || exit 1 + +cat < $1/etc/issue + o Dirtbags Shitty Linux +(m) $(date --rfc-3339=date) +EOF + diff --git a/sh4pwn/linux.config b/sh4pwn/linux.config new file mode 100644 index 0000000..fa59a54 --- /dev/null +++ b/sh4pwn/linux.config @@ -0,0 +1,1645 @@ +# +# Automatically generated make config: don't edit +# Linux/sh 2.6.39.4 Kernel Configuration +# Fri Oct 7 16:03:14 2011 +# +CONFIG_SUPERH=y +CONFIG_SUPERH32=y +# CONFIG_SUPERH64 is not set +CONFIG_ARCH_DEFCONFIG="arch/sh/configs/shx3_defconfig" +CONFIG_RWSEM_GENERIC_SPINLOCK=y +CONFIG_GENERIC_BUG=y +CONFIG_GENERIC_FIND_NEXT_BIT=y +CONFIG_GENERIC_FIND_BIT_LE=y +CONFIG_GENERIC_HWEIGHT=y +CONFIG_IRQ_PER_CPU=y +# CONFIG_GENERIC_GPIO is not set +CONFIG_GENERIC_CLOCKEVENTS=y +# CONFIG_ARCH_SUSPEND_POSSIBLE is not set +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_SYS_SUPPORTS_HUGETLBFS=y +CONFIG_SYS_SUPPORTS_PCI=y +CONFIG_SYS_SUPPORTS_TMU=y +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_HAVE_LATENCYTOP_SUPPORT=y +# CONFIG_ARCH_HAS_ILOG2_U32 is not set +# CONFIG_ARCH_HAS_ILOG2_U64 is not set +CONFIG_ARCH_NO_VIRT_TO_BUS=y +CONFIG_ARCH_HAS_DEFAULT_IDLE=y +CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y +# CONFIG_NO_IOPORT is not set +CONFIG_IO_TRAPPED=y +CONFIG_DMA_NONCOHERENT=y +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_NEED_SG_DMA_LENGTH=y +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" +CONFIG_CONSTRUCTORS=y +CONFIG_HAVE_IRQ_WORK=y +CONFIG_IRQ_WORK=y + +# +# General setup +# +CONFIG_EXPERIMENTAL=y +CONFIG_BROKEN_ON_SMP=y +CONFIG_INIT_ENV_ARG_LIMIT=32 +CONFIG_CROSS_COMPILE="" +CONFIG_LOCALVERSION="" +CONFIG_LOCALVERSION_AUTO=y +CONFIG_HAVE_KERNEL_GZIP=y +CONFIG_HAVE_KERNEL_BZIP2=y +CONFIG_HAVE_KERNEL_LZMA=y +CONFIG_HAVE_KERNEL_XZ=y +CONFIG_HAVE_KERNEL_LZO=y +CONFIG_KERNEL_GZIP=y +# CONFIG_KERNEL_BZIP2 is not set +# CONFIG_KERNEL_LZMA is not set +# CONFIG_KERNEL_XZ is not set +# CONFIG_KERNEL_LZO is not set +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_SYSVIPC_SYSCTL=y +# CONFIG_POSIX_MQUEUE is not set +# CONFIG_BSD_PROCESS_ACCT is not set +# CONFIG_FHANDLE is not set +# CONFIG_TASKSTATS is not set +# CONFIG_AUDIT is not set +CONFIG_HAVE_GENERIC_HARDIRQS=y + +# +# IRQ subsystem +# +CONFIG_GENERIC_HARDIRQS=y +CONFIG_HAVE_SPARSE_IRQ=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_SPARSE_IRQ=y + +# +# RCU Subsystem +# +CONFIG_TINY_RCU=y +# CONFIG_PREEMPT_RCU is not set +# CONFIG_RCU_TRACE is not set +# CONFIG_TREE_RCU_TRACE is not set +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +CONFIG_LOG_BUF_SHIFT=14 +# CONFIG_CGROUPS is not set +# CONFIG_NAMESPACES is not set +# CONFIG_SCHED_AUTOGROUP is not set +CONFIG_SYSFS_DEPRECATED=y +CONFIG_SYSFS_DEPRECATED_V2=y +# CONFIG_RELAY is not set +CONFIG_BLK_DEV_INITRD=y +CONFIG_INITRAMFS_SOURCE="/home/neale/buildroot/output/images/rootfs.initramfs" +CONFIG_INITRAMFS_ROOT_UID=0 +CONFIG_INITRAMFS_ROOT_GID=0 +CONFIG_RD_GZIP=y +# CONFIG_RD_BZIP2 is not set +# CONFIG_RD_LZMA is not set +# CONFIG_RD_XZ is not set +# CONFIG_RD_LZO is not set +# CONFIG_INITRAMFS_COMPRESSION_NONE is not set +CONFIG_INITRAMFS_COMPRESSION_GZIP=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set +CONFIG_SYSCTL=y +CONFIG_ANON_INODES=y +CONFIG_EXPERT=y +CONFIG_UID16=y +# CONFIG_SYSCTL_SYSCALL is not set +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_HOTPLUG=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y +CONFIG_EVENTFD=y +CONFIG_SHMEM=y +CONFIG_AIO=y +CONFIG_EMBEDDED=y +CONFIG_HAVE_PERF_EVENTS=y +CONFIG_PERF_USE_VMALLOC=y + +# +# Kernel Performance Events And Counters +# +CONFIG_PERF_EVENTS=y +# CONFIG_PERF_COUNTERS is not set +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_PCI_QUIRKS=y +CONFIG_COMPAT_BRK=y +CONFIG_SLAB=y +# CONFIG_SLUB is not set +# CONFIG_SLOB is not set +CONFIG_PROFILING=y +CONFIG_OPROFILE=y +CONFIG_HAVE_OPROFILE=y +# CONFIG_KPROBES is not set +CONFIG_HAVE_IOREMAP_PROT=y +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_HAVE_ARCH_TRACEHOOK=y +CONFIG_HAVE_DMA_ATTRS=y +CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y +CONFIG_HAVE_CLK=y +CONFIG_HAVE_DMA_API_DEBUG=y +CONFIG_HAVE_HW_BREAKPOINT=y +CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y + +# +# GCOV-based kernel profiling +# +CONFIG_HAVE_GENERIC_DMA_COHERENT=y +CONFIG_SLABINFO=y +CONFIG_RT_MUTEXES=y +CONFIG_BASE_SMALL=0 +CONFIG_MODULES=y +# CONFIG_MODULE_FORCE_LOAD is not set +# CONFIG_MODULE_UNLOAD is not set +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +CONFIG_BLOCK=y +CONFIG_LBDAF=y +# CONFIG_BLK_DEV_BSG is not set +# CONFIG_BLK_DEV_INTEGRITY is not set + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +# CONFIG_DEFAULT_DEADLINE is not set +CONFIG_DEFAULT_CFQ=y +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="cfq" +# CONFIG_INLINE_SPIN_TRYLOCK is not set +# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set +# CONFIG_INLINE_SPIN_LOCK is not set +# CONFIG_INLINE_SPIN_LOCK_BH is not set +# CONFIG_INLINE_SPIN_LOCK_IRQ is not set +# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set +CONFIG_INLINE_SPIN_UNLOCK=y +# CONFIG_INLINE_SPIN_UNLOCK_BH is not set +CONFIG_INLINE_SPIN_UNLOCK_IRQ=y +# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set +# CONFIG_INLINE_READ_TRYLOCK is not set +# CONFIG_INLINE_READ_LOCK is not set +# CONFIG_INLINE_READ_LOCK_BH is not set +# CONFIG_INLINE_READ_LOCK_IRQ is not set +# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set +CONFIG_INLINE_READ_UNLOCK=y +# CONFIG_INLINE_READ_UNLOCK_BH is not set +CONFIG_INLINE_READ_UNLOCK_IRQ=y +# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set +# CONFIG_INLINE_WRITE_TRYLOCK is not set +# CONFIG_INLINE_WRITE_LOCK is not set +# CONFIG_INLINE_WRITE_LOCK_BH is not set +# CONFIG_INLINE_WRITE_LOCK_IRQ is not set +# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set +CONFIG_INLINE_WRITE_UNLOCK=y +# CONFIG_INLINE_WRITE_UNLOCK_BH is not set +CONFIG_INLINE_WRITE_UNLOCK_IRQ=y +# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set +# CONFIG_MUTEX_SPIN_ON_OWNER is not set +# CONFIG_FREEZER is not set + +# +# System type +# +CONFIG_CPU_SH4=y +CONFIG_CPU_HAS_PMU=y +# CONFIG_CPU_SUBTYPE_SH7619 is not set +# CONFIG_CPU_SUBTYPE_SH7201 is not set +# CONFIG_CPU_SUBTYPE_SH7203 is not set +# CONFIG_CPU_SUBTYPE_SH7206 is not set +# CONFIG_CPU_SUBTYPE_SH7263 is not set +# CONFIG_CPU_SUBTYPE_MXG is not set +# CONFIG_CPU_SUBTYPE_SH7705 is not set +# CONFIG_CPU_SUBTYPE_SH7706 is not set +# CONFIG_CPU_SUBTYPE_SH7707 is not set +# CONFIG_CPU_SUBTYPE_SH7708 is not set +# CONFIG_CPU_SUBTYPE_SH7709 is not set +# CONFIG_CPU_SUBTYPE_SH7710 is not set +# CONFIG_CPU_SUBTYPE_SH7712 is not set +# CONFIG_CPU_SUBTYPE_SH7720 is not set +# CONFIG_CPU_SUBTYPE_SH7721 is not set +# CONFIG_CPU_SUBTYPE_SH7750 is not set +# CONFIG_CPU_SUBTYPE_SH7091 is not set +# CONFIG_CPU_SUBTYPE_SH7750R is not set +# CONFIG_CPU_SUBTYPE_SH7750S is not set +# CONFIG_CPU_SUBTYPE_SH7751 is not set +CONFIG_CPU_SUBTYPE_SH7751R=y +# CONFIG_CPU_SUBTYPE_SH7760 is not set +# CONFIG_CPU_SUBTYPE_SH4_202 is not set +# CONFIG_CPU_SUBTYPE_SH7723 is not set +# CONFIG_CPU_SUBTYPE_SH7724 is not set +# CONFIG_CPU_SUBTYPE_SH7757 is not set +# CONFIG_CPU_SUBTYPE_SH7763 is not set +# CONFIG_CPU_SUBTYPE_SH7770 is not set +# CONFIG_CPU_SUBTYPE_SH7780 is not set +# CONFIG_CPU_SUBTYPE_SH7785 is not set +# CONFIG_CPU_SUBTYPE_SH7786 is not set +# CONFIG_CPU_SUBTYPE_SHX3 is not set +# CONFIG_CPU_SUBTYPE_SH7343 is not set +# CONFIG_CPU_SUBTYPE_SH7722 is not set +# CONFIG_CPU_SUBTYPE_SH7366 is not set + +# +# Memory management options +# +CONFIG_QUICKLIST=y +CONFIG_MMU=y +CONFIG_PAGE_OFFSET=0x80000000 +CONFIG_FORCE_MAX_ZONEORDER=11 +CONFIG_MEMORY_START=0x0c000000 +CONFIG_MEMORY_SIZE=0x04000000 +CONFIG_29BIT=y +CONFIG_VSYSCALL=y +CONFIG_ARCH_FLATMEM_ENABLE=y +CONFIG_ARCH_SPARSEMEM_ENABLE=y +CONFIG_ARCH_SPARSEMEM_DEFAULT=y +CONFIG_MAX_ACTIVE_REGIONS=1 +CONFIG_ARCH_POPULATES_NODE_MAP=y +CONFIG_ARCH_SELECT_MEMORY_MODEL=y +CONFIG_UNCACHED_MAPPING=y +CONFIG_PAGE_SIZE_4KB=y +# CONFIG_PAGE_SIZE_64KB is not set +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +CONFIG_SPARSEMEM_STATIC=y +CONFIG_HAVE_MEMBLOCK=y +CONFIG_PAGEFLAGS_EXTENDED=y +CONFIG_SPLIT_PTLOCK_CPUS=4 +# CONFIG_COMPACTION is not set +# CONFIG_PHYS_ADDR_T_64BIT is not set +CONFIG_ZONE_DMA_FLAG=0 +CONFIG_NR_QUICK=1 +# CONFIG_KSM is not set +CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 +CONFIG_NEED_PER_CPU_KM=y + +# +# Cache configuration +# +CONFIG_CACHE_WRITEBACK=y +# CONFIG_CACHE_WRITETHROUGH is not set +# CONFIG_CACHE_OFF is not set + +# +# Processor features +# +CONFIG_CPU_LITTLE_ENDIAN=y +# CONFIG_CPU_BIG_ENDIAN is not set +CONFIG_SH_FPU=y +# CONFIG_SH_STORE_QUEUES is not set +CONFIG_CPU_HAS_INTEVT=y +CONFIG_CPU_HAS_SR_RB=y +CONFIG_CPU_HAS_FPU=y + +# +# Board support +# +# CONFIG_SH_SECUREEDGE5410 is not set +CONFIG_SH_RTS7751R2D=y +# CONFIG_SH_LANDISK is not set +# CONFIG_SH_TITAN is not set +# CONFIG_SH_LBOX_RE2 is not set + +# +# RTS7751R2D Board Revision +# +CONFIG_RTS7751R2D_PLUS=y +# CONFIG_RTS7751R2D_1 is not set + +# +# Timer and clock configuration +# +CONFIG_SH_TIMER_TMU=y +CONFIG_SH_PCLK_FREQ=60000000 +CONFIG_SH_CLK_CPG=y +CONFIG_SH_CLK_CPG_LEGACY=y +# CONFIG_NO_HZ is not set +# CONFIG_HIGH_RES_TIMERS is not set +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y + +# +# CPU Frequency scaling +# +# CONFIG_CPU_FREQ is not set + +# +# DMA support +# +# CONFIG_SH_DMA is not set + +# +# Companion Chips +# + +# +# Additional SuperH Device Drivers +# +CONFIG_HEARTBEAT=y +# CONFIG_PUSH_SWITCH is not set + +# +# Kernel features +# +# CONFIG_HZ_100 is not set +CONFIG_HZ_250=y +# CONFIG_HZ_300 is not set +# CONFIG_HZ_1000 is not set +CONFIG_HZ=250 +# CONFIG_SCHED_HRTICK is not set +# CONFIG_KEXEC is not set +# CONFIG_CRASH_DUMP is not set +# CONFIG_SECCOMP is not set +CONFIG_PREEMPT_NONE=y +# CONFIG_PREEMPT_VOLUNTARY is not set +# CONFIG_PREEMPT is not set +CONFIG_GUSA=y +# CONFIG_GUSA_RB is not set +CONFIG_HW_PERF_EVENTS=y + +# +# SuperH / SH-Mobile Driver Options +# + +# +# Interrupt controller options +# + +# +# Boot options +# +CONFIG_ZERO_PAGE_OFFSET=0x00010000 +CONFIG_BOOT_LINK_OFFSET=0x00800000 +CONFIG_ENTRY_OFFSET=0x00001000 + +# +# Bus options +# +CONFIG_PCI=y +CONFIG_PCI_DOMAINS=y +# CONFIG_PCIEPORTBUS is not set +# CONFIG_ARCH_SUPPORTS_MSI is not set +# CONFIG_PCI_STUB is not set +# CONFIG_PCI_IOV is not set +# CONFIG_PCCARD is not set +# CONFIG_HOTPLUG_PCI is not set + +# +# Executable file formats +# +CONFIG_BINFMT_ELF=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +# CONFIG_HAVE_AOUT is not set +# CONFIG_BINFMT_MISC is not set + +# +# Power management options (EXPERIMENTAL) +# +# CONFIG_HIBERNATION is not set +# CONFIG_PM_RUNTIME is not set +# CONFIG_CPU_IDLE is not set +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +CONFIG_UNIX=y +# CONFIG_NET_KEY is not set +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +# CONFIG_IP_PNP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE_DEMUX is not set +# CONFIG_ARPD is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_XFRM_TUNNEL is not set +# CONFIG_INET_TUNNEL is not set +# CONFIG_INET_XFRM_MODE_TRANSPORT is not set +# CONFIG_INET_XFRM_MODE_TUNNEL is not set +# CONFIG_INET_XFRM_MODE_BEET is not set +# CONFIG_INET_LRO is not set +# CONFIG_INET_DIAG is not set +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_CUBIC=y +CONFIG_DEFAULT_TCP_CONG="cubic" +# CONFIG_TCP_MD5SIG is not set +CONFIG_IPV6=y +# CONFIG_IPV6_PRIVACY is not set +# CONFIG_IPV6_ROUTER_PREF is not set +# CONFIG_IPV6_OPTIMISTIC_DAD is not set +# CONFIG_INET6_AH is not set +# CONFIG_INET6_ESP is not set +# CONFIG_INET6_IPCOMP is not set +# CONFIG_IPV6_MIP6 is not set +# CONFIG_INET6_XFRM_TUNNEL is not set +# CONFIG_INET6_TUNNEL is not set +# CONFIG_INET6_XFRM_MODE_TRANSPORT is not set +# CONFIG_INET6_XFRM_MODE_TUNNEL is not set +# CONFIG_INET6_XFRM_MODE_BEET is not set +# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set +# CONFIG_IPV6_SIT is not set +# CONFIG_IPV6_TUNNEL is not set +# CONFIG_IPV6_MULTIPLE_TABLES is not set +# CONFIG_IPV6_MROUTE is not set +# CONFIG_NETWORK_SECMARK is not set +# CONFIG_NETWORK_PHY_TIMESTAMPING is not set +# CONFIG_NETFILTER is not set +# CONFIG_IP_DCCP is not set +# CONFIG_IP_SCTP is not set +# CONFIG_RDS is not set +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_L2TP is not set +# CONFIG_BRIDGE is not set +# CONFIG_NET_DSA is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_PHONET is not set +# CONFIG_IEEE802154 is not set +# CONFIG_NET_SCHED is not set +# CONFIG_DCB is not set +# CONFIG_BATMAN_ADV is not set + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_HAMRADIO is not set +# CONFIG_CAN is not set +# CONFIG_IRDA is not set +# CONFIG_BT is not set +# CONFIG_AF_RXRPC is not set +# CONFIG_WIRELESS is not set +# CONFIG_WIMAX is not set +# CONFIG_RFKILL is not set +# CONFIG_NET_9P is not set +# CONFIG_CAIF is not set +# CONFIG_CEPH_LIB is not set + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +# CONFIG_DEVTMPFS is not set +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=m +CONFIG_FIRMWARE_IN_KERNEL=y +CONFIG_EXTRA_FIRMWARE="" +# CONFIG_SYS_HYPERVISOR is not set +CONFIG_ARCH_NO_SYSDEV_OPS=y +# CONFIG_CONNECTOR is not set +# CONFIG_MTD is not set +# CONFIG_PARPORT is not set +CONFIG_BLK_DEV=y +# CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_BLK_DEV_DAC960 is not set +# CONFIG_BLK_DEV_UMEM is not set +# CONFIG_BLK_DEV_COW_COMMON is not set +# CONFIG_BLK_DEV_LOOP is not set + +# +# DRBD disabled because PROC_FS, INET or CONNECTOR not selected +# +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_SX8 is not set +# CONFIG_BLK_DEV_UB is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=4096 +# CONFIG_BLK_DEV_XIP is not set +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set +# CONFIG_BLK_DEV_HD is not set +# CONFIG_BLK_DEV_RBD is not set +# CONFIG_SENSORS_LIS3LV02D is not set +CONFIG_MISC_DEVICES=y +# CONFIG_AD525X_DPOT is not set +# CONFIG_PHANTOM is not set +# CONFIG_SGI_IOC4 is not set +# CONFIG_TIFM_CORE is not set +# CONFIG_ENCLOSURE_SERVICES is not set +# CONFIG_HP_ILO is not set +# CONFIG_TI_DAC7512 is not set +# CONFIG_PCH_PHUB is not set +# CONFIG_C2PORT is not set + +# +# EEPROM support +# +# CONFIG_EEPROM_AT25 is not set +# CONFIG_EEPROM_93CX6 is not set +# CONFIG_CB710_CORE is not set + +# +# Texas Instruments shared transport line discipline +# +# CONFIG_SENSORS_LIS3_SPI is not set +CONFIG_HAVE_IDE=y +# CONFIG_IDE is not set + +# +# SCSI device support +# +CONFIG_SCSI_MOD=y +# CONFIG_RAID_ATTRS is not set +CONFIG_SCSI=y +CONFIG_SCSI_DMA=y +# CONFIG_SCSI_TGT is not set +# CONFIG_SCSI_NETLINK is not set +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +# CONFIG_CHR_DEV_ST is not set +# CONFIG_CHR_DEV_OSST is not set +# CONFIG_BLK_DEV_SR is not set +# CONFIG_CHR_DEV_SG is not set +# CONFIG_CHR_DEV_SCH is not set +# CONFIG_SCSI_MULTI_LUN is not set +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set +# CONFIG_SCSI_SCAN_ASYNC is not set +CONFIG_SCSI_WAIT_SCAN=m + +# +# SCSI Transports +# +# CONFIG_SCSI_SPI_ATTRS is not set +# CONFIG_SCSI_FC_ATTRS is not set +# CONFIG_SCSI_ISCSI_ATTRS is not set +# CONFIG_SCSI_SAS_ATTRS is not set +# CONFIG_SCSI_SAS_LIBSAS is not set +# CONFIG_SCSI_SRP_ATTRS is not set +CONFIG_SCSI_LOWLEVEL=y +# CONFIG_ISCSI_TCP is not set +# CONFIG_ISCSI_BOOT_SYSFS is not set +# CONFIG_SCSI_CXGB3_ISCSI is not set +# CONFIG_SCSI_CXGB4_ISCSI is not set +# CONFIG_SCSI_BNX2_ISCSI is not set +# CONFIG_SCSI_BNX2X_FCOE is not set +# CONFIG_BE2ISCSI is not set +# CONFIG_BLK_DEV_3W_XXXX_RAID is not set +# CONFIG_SCSI_HPSA is not set +# CONFIG_SCSI_3W_9XXX is not set +# CONFIG_SCSI_3W_SAS is not set +# CONFIG_SCSI_ACARD is not set +# CONFIG_SCSI_AACRAID is not set +# CONFIG_SCSI_AIC7XXX is not set +# CONFIG_SCSI_AIC7XXX_OLD is not set +# CONFIG_SCSI_AIC79XX is not set +# CONFIG_SCSI_AIC94XX is not set +# CONFIG_SCSI_MVSAS is not set +# CONFIG_SCSI_ARCMSR is not set +# CONFIG_MEGARAID_NEWGEN is not set +# CONFIG_MEGARAID_LEGACY is not set +# CONFIG_MEGARAID_SAS is not set +# CONFIG_SCSI_MPT2SAS is not set +# CONFIG_SCSI_HPTIOP is not set +# CONFIG_LIBFC is not set +# CONFIG_LIBFCOE is not set +# CONFIG_FCOE is not set +# CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_FUTURE_DOMAIN is not set +# CONFIG_SCSI_IPS is not set +# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_INIA100 is not set +# CONFIG_SCSI_STEX is not set +# CONFIG_SCSI_SYM53C8XX_2 is not set +# CONFIG_SCSI_IPR is not set +# CONFIG_SCSI_QLOGIC_1280 is not set +# CONFIG_SCSI_QLA_FC is not set +# CONFIG_SCSI_QLA_ISCSI is not set +# CONFIG_SCSI_LPFC is not set +# CONFIG_SCSI_DC395x is not set +# CONFIG_SCSI_DC390T is not set +# CONFIG_SCSI_NSP32 is not set +# CONFIG_SCSI_DEBUG is not set +# CONFIG_SCSI_PMCRAID is not set +# CONFIG_SCSI_PM8001 is not set +# CONFIG_SCSI_SRP is not set +# CONFIG_SCSI_BFA_FC is not set +# CONFIG_SCSI_DH is not set +# CONFIG_SCSI_OSD_INITIATOR is not set +CONFIG_ATA=y +# CONFIG_ATA_NONSTANDARD is not set +CONFIG_ATA_VERBOSE_ERROR=y +CONFIG_SATA_PMP=y + +# +# Controllers with non-SFF native interface +# +# CONFIG_SATA_AHCI is not set +# CONFIG_SATA_AHCI_PLATFORM is not set +# CONFIG_SATA_INIC162X is not set +# CONFIG_SATA_ACARD_AHCI is not set +# CONFIG_SATA_SIL24 is not set +CONFIG_ATA_SFF=y + +# +# SFF controllers with custom DMA interface +# +# CONFIG_PDC_ADMA is not set +# CONFIG_SATA_QSTOR is not set +# CONFIG_SATA_SX4 is not set +CONFIG_ATA_BMDMA=y + +# +# SATA SFF controllers with BMDMA +# +# CONFIG_ATA_PIIX is not set +# CONFIG_SATA_MV is not set +# CONFIG_SATA_NV is not set +# CONFIG_SATA_PROMISE is not set +# CONFIG_SATA_SIL is not set +# CONFIG_SATA_SIS is not set +# CONFIG_SATA_SVW is not set +# CONFIG_SATA_ULI is not set +# CONFIG_SATA_VIA is not set +# CONFIG_SATA_VITESSE is not set + +# +# PATA SFF controllers with BMDMA +# +# CONFIG_PATA_ALI is not set +# CONFIG_PATA_AMD is not set +# CONFIG_PATA_ARASAN_CF is not set +# CONFIG_PATA_ARTOP is not set +# CONFIG_PATA_ATIIXP is not set +# CONFIG_PATA_ATP867X is not set +# CONFIG_PATA_CMD64X is not set +# CONFIG_PATA_CS5520 is not set +# CONFIG_PATA_CS5530 is not set +# CONFIG_PATA_CS5536 is not set +# CONFIG_PATA_CYPRESS is not set +# CONFIG_PATA_EFAR is not set +# CONFIG_PATA_HPT366 is not set +# CONFIG_PATA_HPT37X is not set +# CONFIG_PATA_HPT3X2N is not set +# CONFIG_PATA_HPT3X3 is not set +# CONFIG_PATA_IT8213 is not set +# CONFIG_PATA_IT821X is not set +# CONFIG_PATA_JMICRON is not set +# CONFIG_PATA_MARVELL is not set +# CONFIG_PATA_NETCELL is not set +# CONFIG_PATA_NINJA32 is not set +# CONFIG_PATA_NS87415 is not set +# CONFIG_PATA_OLDPIIX is not set +# CONFIG_PATA_OPTIDMA is not set +# CONFIG_PATA_PDC2027X is not set +# CONFIG_PATA_PDC_OLD is not set +# CONFIG_PATA_RADISYS is not set +# CONFIG_PATA_RDC is not set +# CONFIG_PATA_SC1200 is not set +# CONFIG_PATA_SCH is not set +# CONFIG_PATA_SERVERWORKS is not set +# CONFIG_PATA_SIL680 is not set +# CONFIG_PATA_SIS is not set +# CONFIG_PATA_TOSHIBA is not set +# CONFIG_PATA_TRIFLEX is not set +# CONFIG_PATA_VIA is not set +# CONFIG_PATA_WINBOND is not set + +# +# PIO-only SFF controllers +# +# CONFIG_PATA_CMD640_PCI is not set +# CONFIG_PATA_MPIIX is not set +# CONFIG_PATA_NS87410 is not set +# CONFIG_PATA_OPTI is not set +CONFIG_PATA_PLATFORM=y +# CONFIG_PATA_RZ1000 is not set + +# +# Generic fallback / legacy drivers +# +# CONFIG_ATA_GENERIC is not set +# CONFIG_PATA_LEGACY is not set +# CONFIG_MD is not set +# CONFIG_TARGET_CORE is not set +# CONFIG_FUSION is not set + +# +# IEEE 1394 (FireWire) support +# +# CONFIG_FIREWIRE is not set +# CONFIG_FIREWIRE_NOSY is not set +# CONFIG_I2O is not set +CONFIG_NETDEVICES=y +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_MACVLAN is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set +# CONFIG_VETH is not set +# CONFIG_ARCNET is not set +CONFIG_MII=y +# CONFIG_PHYLIB is not set +CONFIG_NET_ETHERNET=y +# CONFIG_AX88796 is not set +# CONFIG_STNIC is not set +# CONFIG_HAPPYMEAL is not set +# CONFIG_SUNGEM is not set +# CONFIG_CASSINI is not set +# CONFIG_NET_VENDOR_3COM is not set +# CONFIG_SMC91X is not set +# CONFIG_ENC28J60 is not set +# CONFIG_ETHOC is not set +# CONFIG_SMC911X is not set +# CONFIG_SMSC911X is not set +# CONFIG_DNET is not set +# CONFIG_NET_TULIP is not set +# CONFIG_HP100 is not set +# CONFIG_IBM_NEW_EMAC_ZMII is not set +# CONFIG_IBM_NEW_EMAC_RGMII is not set +# CONFIG_IBM_NEW_EMAC_TAH is not set +# CONFIG_IBM_NEW_EMAC_EMAC4 is not set +# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set +# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set +# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set +CONFIG_NET_PCI=y +# CONFIG_PCNET32 is not set +# CONFIG_AMD8111_ETH is not set +# CONFIG_ADAPTEC_STARFIRE is not set +# CONFIG_KSZ884X_PCI is not set +# CONFIG_B44 is not set +# CONFIG_FORCEDETH is not set +# CONFIG_E100 is not set +# CONFIG_FEALNX is not set +# CONFIG_NATSEMI is not set +# CONFIG_NE2K_PCI is not set +CONFIG_8139CP=y +CONFIG_8139TOO=y +# CONFIG_8139TOO_PIO is not set +# CONFIG_8139TOO_TUNE_TWISTER is not set +# CONFIG_8139TOO_8129 is not set +# CONFIG_8139_OLD_RX_RESET is not set +# CONFIG_R6040 is not set +# CONFIG_SIS900 is not set +# CONFIG_EPIC100 is not set +# CONFIG_SMSC9420 is not set +# CONFIG_SUNDANCE is not set +# CONFIG_TLAN is not set +# CONFIG_KS8851 is not set +# CONFIG_KS8851_MLL is not set +# CONFIG_VIA_RHINE is not set +# CONFIG_SC92031 is not set +# CONFIG_ATL2 is not set +# CONFIG_NETDEV_1000 is not set +# CONFIG_NETDEV_10000 is not set +# CONFIG_TR is not set +# CONFIG_WLAN is not set + +# +# Enable WiMAX (Networking options) to see the WiMAX drivers +# + +# +# USB Network Adapters +# +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_USBNET is not set +# CONFIG_USB_IPHETH is not set +# CONFIG_WAN is not set + +# +# CAIF transport drivers +# +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +# CONFIG_PPP is not set +# CONFIG_SLIP is not set +# CONFIG_NET_FC is not set +# CONFIG_NETCONSOLE is not set +# CONFIG_NETPOLL is not set +# CONFIG_NET_POLL_CONTROLLER is not set +# CONFIG_VMXNET3 is not set +# CONFIG_ISDN is not set +# CONFIG_PHONE is not set + +# +# Input device support +# +CONFIG_INPUT=y +CONFIG_INPUT_FF_MEMLESS=m +# CONFIG_INPUT_POLLDEV is not set +# CONFIG_INPUT_SPARSEKMAP is not set + +# +# Userland interfaces +# +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_EVDEV is not set +# CONFIG_INPUT_EVBUG is not set + +# +# Input Device Drivers +# +# CONFIG_INPUT_KEYBOARD is not set +# CONFIG_INPUT_MOUSE is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TABLET is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_INPUT_MISC is not set + +# +# Hardware I/O ports +# +# CONFIG_SERIO is not set +# CONFIG_GAMEPORT is not set + +# +# Character devices +# +CONFIG_VT=y +CONFIG_CONSOLE_TRANSLATIONS=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +CONFIG_VT_HW_CONSOLE_BINDING=y +CONFIG_UNIX98_PTYS=y +# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=256 +# CONFIG_SERIAL_NONSTANDARD is not set +# CONFIG_NOZOMI is not set +# CONFIG_N_GSM is not set +CONFIG_DEVKMEM=y + +# +# Serial drivers +# +CONFIG_SERIAL_8250=y +# CONFIG_SERIAL_8250_CONSOLE is not set +CONFIG_SERIAL_8250_PCI=y +CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_RUNTIME_UARTS=4 +# CONFIG_SERIAL_8250_EXTENDED is not set + +# +# Non-8250 serial port support +# +# CONFIG_SERIAL_MAX3100 is not set +# CONFIG_SERIAL_MAX3107 is not set +# CONFIG_SERIAL_MFD_HSU is not set +CONFIG_SERIAL_SH_SCI=y +CONFIG_SERIAL_SH_SCI_NR_UARTS=1 +CONFIG_SERIAL_SH_SCI_CONSOLE=y +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +# CONFIG_SERIAL_JSM is not set +# CONFIG_SERIAL_TIMBERDALE is not set +# CONFIG_SERIAL_ALTERA_JTAGUART is not set +# CONFIG_SERIAL_ALTERA_UART is not set +# CONFIG_SERIAL_PCH_UART is not set +# CONFIG_TTY_PRINTK is not set +# CONFIG_IPMI_HANDLER is not set +CONFIG_HW_RANDOM=y +# CONFIG_HW_RANDOM_TIMERIOMEM is not set +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set +# CONFIG_RAW_DRIVER is not set +# CONFIG_TCG_TPM is not set +CONFIG_DEVPORT=y +# CONFIG_RAMOOPS is not set +# CONFIG_I2C is not set +CONFIG_SPI=y +CONFIG_SPI_MASTER=y + +# +# SPI Master Controller Drivers +# +# CONFIG_SPI_ALTERA is not set +CONFIG_SPI_BITBANG=y +# CONFIG_SPI_PXA2XX_PCI is not set +# CONFIG_SPI_SH_MSIOF is not set +# CONFIG_SPI_SH is not set +CONFIG_SPI_SH_SCI=y +# CONFIG_SPI_TOPCLIFF_PCH is not set +# CONFIG_SPI_XILINX is not set +# CONFIG_SPI_DESIGNWARE is not set + +# +# SPI Protocol Masters +# +# CONFIG_SPI_SPIDEV is not set +# CONFIG_SPI_TLE62X0 is not set + +# +# PPS support +# +# CONFIG_PPS is not set + +# +# PPS generators support +# +# CONFIG_W1 is not set +# CONFIG_POWER_SUPPLY is not set +# CONFIG_HWMON is not set +# CONFIG_THERMAL is not set +# CONFIG_WATCHDOG is not set +CONFIG_SSB_POSSIBLE=y + +# +# Sonics Silicon Backplane +# +# CONFIG_SSB is not set +CONFIG_MFD_SUPPORT=y +# CONFIG_MFD_CORE is not set +CONFIG_MFD_SM501=y +# CONFIG_HTC_PASIC3 is not set +# CONFIG_MFD_TMIO is not set +# CONFIG_MFD_WM831X_SPI is not set +# CONFIG_MFD_MC13XXX is not set +# CONFIG_ABX500_CORE is not set +# CONFIG_EZX_PCAP is not set +# CONFIG_LPC_SCH is not set +# CONFIG_MFD_RDC321X is not set +# CONFIG_MFD_JANZ_CMODIO is not set +# CONFIG_MFD_VX855 is not set +# CONFIG_REGULATOR is not set +# CONFIG_MEDIA_SUPPORT is not set + +# +# Graphics support +# +CONFIG_VGA_ARB=y +CONFIG_VGA_ARB_MAX_GPUS=16 +# CONFIG_DRM is not set +# CONFIG_STUB_POULSBO is not set +# CONFIG_VGASTATE is not set +CONFIG_VIDEO_OUTPUT_CONTROL=m +CONFIG_FB=y +# CONFIG_FIRMWARE_EDID is not set +# CONFIG_FB_DDC is not set +# CONFIG_FB_BOOT_VESA_SUPPORT is not set +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set +CONFIG_FB_SYS_FILLRECT=m +CONFIG_FB_SYS_COPYAREA=m +CONFIG_FB_SYS_IMAGEBLIT=m +# CONFIG_FB_FOREIGN_ENDIAN is not set +CONFIG_FB_SYS_FOPS=m +# CONFIG_FB_WMT_GE_ROPS is not set +CONFIG_FB_DEFERRED_IO=y +# CONFIG_FB_SVGALIB is not set +# CONFIG_FB_MACMODES is not set +CONFIG_FB_BACKLIGHT=y +CONFIG_FB_MODE_HELPERS=y +# CONFIG_FB_TILEBLITTING is not set + +# +# Frame buffer hardware drivers +# +# CONFIG_FB_CIRRUS is not set +# CONFIG_FB_PM2 is not set +# CONFIG_FB_CYBER2000 is not set +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +# CONFIG_FB_S1D13XXX is not set +# CONFIG_FB_NVIDIA is not set +# CONFIG_FB_RIVA is not set +# CONFIG_FB_MATROX is not set +# CONFIG_FB_RADEON is not set +# CONFIG_FB_ATY128 is not set +# CONFIG_FB_ATY is not set +# CONFIG_FB_S3 is not set +# CONFIG_FB_SAVAGE is not set +# CONFIG_FB_SIS is not set +# CONFIG_FB_NEOMAGIC is not set +# CONFIG_FB_KYRO is not set +# CONFIG_FB_3DFX is not set +# CONFIG_FB_VOODOO1 is not set +# CONFIG_FB_VT8623 is not set +# CONFIG_FB_TRIDENT is not set +# CONFIG_FB_ARK is not set +# CONFIG_FB_PM3 is not set +# CONFIG_FB_CARMINE is not set +CONFIG_FB_SH_MOBILE_LCDC=m +CONFIG_FB_SH_MOBILE_HDMI=m +CONFIG_FB_SM501=y +# CONFIG_FB_UDL is not set +# CONFIG_FB_VIRTUAL is not set +# CONFIG_FB_METRONOME is not set +# CONFIG_FB_MB862XX is not set +# CONFIG_FB_BROADSHEET is not set +CONFIG_BACKLIGHT_LCD_SUPPORT=y +CONFIG_LCD_CLASS_DEVICE=m +# CONFIG_LCD_LTV350QV is not set +# CONFIG_LCD_TDO24M is not set +# CONFIG_LCD_VGG2432A4 is not set +# CONFIG_LCD_PLATFORM is not set +# CONFIG_LCD_S6E63M0 is not set +# CONFIG_LCD_LD9040 is not set +CONFIG_BACKLIGHT_CLASS_DEVICE=y +CONFIG_BACKLIGHT_GENERIC=y + +# +# Display device support +# +# CONFIG_DISPLAY_SUPPORT is not set + +# +# Console display driver support +# +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set +# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y +CONFIG_LOGO=y +# CONFIG_LOGO_LINUX_MONO is not set +# CONFIG_LOGO_LINUX_VGA16 is not set +# CONFIG_LOGO_LINUX_CLUT224 is not set +# CONFIG_LOGO_SUPERH_MONO is not set +# CONFIG_LOGO_SUPERH_VGA16 is not set +CONFIG_LOGO_SUPERH_CLUT224=y +CONFIG_SOUND=m +# CONFIG_SOUND_OSS_CORE is not set +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +CONFIG_SND_JACK=y +# CONFIG_SND_SEQUENCER is not set +# CONFIG_SND_MIXER_OSS is not set +# CONFIG_SND_PCM_OSS is not set +# CONFIG_SND_DYNAMIC_MINORS is not set +CONFIG_SND_SUPPORT_OLD_API=y +CONFIG_SND_VERBOSE_PROCFS=y +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set +# CONFIG_SND_RAWMIDI_SEQ is not set +# CONFIG_SND_OPL3_LIB_SEQ is not set +# CONFIG_SND_OPL4_LIB_SEQ is not set +# CONFIG_SND_SBAWE_SEQ is not set +# CONFIG_SND_EMU10K1_SEQ is not set +CONFIG_SND_DRIVERS=y +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_ALOOP is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_MPU401 is not set +CONFIG_SND_PCI=y +# CONFIG_SND_AD1889 is not set +# CONFIG_SND_ALS300 is not set +# CONFIG_SND_ALI5451 is not set +# CONFIG_SND_ATIIXP is not set +# CONFIG_SND_ATIIXP_MODEM is not set +# CONFIG_SND_AU8810 is not set +# CONFIG_SND_AU8820 is not set +# CONFIG_SND_AU8830 is not set +# CONFIG_SND_AW2 is not set +# CONFIG_SND_AZT3328 is not set +# CONFIG_SND_BT87X is not set +# CONFIG_SND_CA0106 is not set +# CONFIG_SND_CMIPCI is not set +# CONFIG_SND_OXYGEN is not set +# CONFIG_SND_CS4281 is not set +# CONFIG_SND_CS46XX is not set +# CONFIG_SND_CS5535AUDIO is not set +# CONFIG_SND_CTXFI is not set +# CONFIG_SND_DARLA20 is not set +# CONFIG_SND_GINA20 is not set +# CONFIG_SND_LAYLA20 is not set +# CONFIG_SND_DARLA24 is not set +# CONFIG_SND_GINA24 is not set +# CONFIG_SND_LAYLA24 is not set +# CONFIG_SND_MONA is not set +# CONFIG_SND_MIA is not set +# CONFIG_SND_ECHO3G is not set +# CONFIG_SND_INDIGO is not set +# CONFIG_SND_INDIGOIO is not set +# CONFIG_SND_INDIGODJ is not set +# CONFIG_SND_INDIGOIOX is not set +# CONFIG_SND_INDIGODJX is not set +# CONFIG_SND_EMU10K1 is not set +# CONFIG_SND_EMU10K1X is not set +# CONFIG_SND_ENS1370 is not set +# CONFIG_SND_ENS1371 is not set +# CONFIG_SND_ES1938 is not set +# CONFIG_SND_ES1968 is not set +# CONFIG_SND_FM801 is not set +# CONFIG_SND_HDA_INTEL is not set +# CONFIG_SND_HDSP is not set +# CONFIG_SND_HDSPM is not set +# CONFIG_SND_ICE1712 is not set +# CONFIG_SND_ICE1724 is not set +# CONFIG_SND_INTEL8X0 is not set +# CONFIG_SND_INTEL8X0M is not set +# CONFIG_SND_KORG1212 is not set +# CONFIG_SND_LX6464ES is not set +# CONFIG_SND_MAESTRO3 is not set +# CONFIG_SND_MIXART is not set +# CONFIG_SND_NM256 is not set +# CONFIG_SND_PCXHR is not set +# CONFIG_SND_RIPTIDE is not set +# CONFIG_SND_RME32 is not set +# CONFIG_SND_RME96 is not set +# CONFIG_SND_RME9652 is not set +# CONFIG_SND_SONICVIBES is not set +# CONFIG_SND_TRIDENT is not set +# CONFIG_SND_VIA82XX is not set +# CONFIG_SND_VIA82XX_MODEM is not set +# CONFIG_SND_VIRTUOSO is not set +# CONFIG_SND_VX222 is not set +# CONFIG_SND_YMFPCI is not set +CONFIG_SND_SPI=y +CONFIG_SND_SUPERH=y +CONFIG_SND_USB=y +# CONFIG_SND_USB_AUDIO is not set +# CONFIG_SND_USB_UA101 is not set +# CONFIG_SND_USB_CAIAQ is not set +# CONFIG_SND_USB_6FIRE is not set +CONFIG_SND_SOC=m +# CONFIG_SND_SOC_CACHE_LZO is not set + +# +# SoC Audio support for SuperH +# +# CONFIG_SND_SOC_SH4_FSI is not set +CONFIG_SND_SOC_I2C_AND_SPI=m +# CONFIG_SND_SOC_ALL_CODECS is not set +# CONFIG_SOUND_PRIME is not set +CONFIG_HID_SUPPORT=y +CONFIG_HID=y +# CONFIG_HIDRAW is not set + +# +# USB Input Devices +# +CONFIG_USB_HID=y +# CONFIG_HID_PID is not set +# CONFIG_USB_HIDDEV is not set + +# +# Special HID drivers +# +# CONFIG_HID_3M_PCT is not set +CONFIG_HID_A4TECH=y +# CONFIG_HID_ACRUX is not set +CONFIG_HID_APPLE=y +CONFIG_HID_BELKIN=y +# CONFIG_HID_CANDO is not set +CONFIG_HID_CHERRY=y +CONFIG_HID_CHICONY=y +# CONFIG_HID_PRODIKEYS is not set +CONFIG_HID_CYPRESS=y +# CONFIG_HID_DRAGONRISE is not set +# CONFIG_HID_EMS_FF is not set +CONFIG_HID_EZKEY=y +# CONFIG_HID_KEYTOUCH is not set +# CONFIG_HID_KYE is not set +# CONFIG_HID_UCLOGIC is not set +# CONFIG_HID_WALTOP is not set +CONFIG_HID_GYRATION=y +# CONFIG_HID_TWINHAN is not set +# CONFIG_HID_KENSINGTON is not set +# CONFIG_HID_LCPOWER is not set +CONFIG_HID_LOGITECH=y +# CONFIG_LOGITECH_FF is not set +# CONFIG_LOGIRUMBLEPAD2_FF is not set +# CONFIG_LOGIG940_FF is not set +# CONFIG_LOGIWII_FF is not set +CONFIG_HID_MICROSOFT=y +# CONFIG_HID_MOSART is not set +CONFIG_HID_MONTEREY=y +# CONFIG_HID_MULTITOUCH is not set +# CONFIG_HID_NTRIG is not set +# CONFIG_HID_ORTEK is not set +CONFIG_HID_PANTHERLORD=y +# CONFIG_PANTHERLORD_FF is not set +CONFIG_HID_PETALYNX=y +# CONFIG_HID_PICOLCD is not set +# CONFIG_HID_QUANTA is not set +# CONFIG_HID_ROCCAT is not set +# CONFIG_HID_ROCCAT_ARVO is not set +# CONFIG_HID_ROCCAT_KONE is not set +# CONFIG_HID_ROCCAT_KONEPLUS is not set +# CONFIG_HID_ROCCAT_KOVAPLUS is not set +# CONFIG_HID_ROCCAT_PYRA is not set +CONFIG_HID_SAMSUNG=y +CONFIG_HID_SONY=y +# CONFIG_HID_STANTUM is not set +CONFIG_HID_SUNPLUS=y +# CONFIG_HID_GREENASIA is not set +# CONFIG_HID_SMARTJOYPLUS is not set +# CONFIG_HID_TOPSEED is not set +# CONFIG_HID_THRUSTMASTER is not set +# CONFIG_HID_ZEROPLUS is not set +# CONFIG_HID_ZYDACRON is not set +CONFIG_USB_SUPPORT=y +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB_ARCH_HAS_OHCI=y +CONFIG_USB_ARCH_HAS_EHCI=y +CONFIG_USB=y +# CONFIG_USB_DEBUG is not set +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y + +# +# Miscellaneous USB options +# +# CONFIG_USB_DEVICEFS is not set +CONFIG_USB_DEVICE_CLASS=y +# CONFIG_USB_DYNAMIC_MINORS is not set +# CONFIG_USB_OTG_WHITELIST is not set +# CONFIG_USB_OTG_BLACKLIST_HUB is not set +# CONFIG_USB_MON is not set +# CONFIG_USB_WUSB is not set +# CONFIG_USB_WUSB_CBAF is not set + +# +# USB Host Controller Drivers +# +# CONFIG_USB_C67X00_HCD is not set +# CONFIG_USB_XHCI_HCD is not set +# CONFIG_USB_EHCI_HCD is not set +# CONFIG_USB_OXU210HP_HCD is not set +# CONFIG_USB_ISP116X_HCD is not set +# CONFIG_USB_ISP1760_HCD is not set +# CONFIG_USB_ISP1362_HCD is not set +CONFIG_USB_OHCI_HCD=y +# CONFIG_USB_OHCI_SH is not set +# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set +# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +# CONFIG_USB_UHCI_HCD is not set +# CONFIG_USB_SL811_HCD is not set +# CONFIG_USB_R8A66597_HCD is not set +# CONFIG_USB_WHCI_HCD is not set +# CONFIG_USB_HWA_HCD is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set +# CONFIG_USB_WDM is not set +# CONFIG_USB_TMC is not set + +# +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may +# + +# +# also be needed; see USB_STORAGE Help for more info +# +CONFIG_USB_STORAGE=y +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_REALTEK is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_USBAT is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_SDDR55 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_STORAGE_ALAUDA is not set +# CONFIG_USB_STORAGE_ONETOUCH is not set +# CONFIG_USB_STORAGE_KARMA is not set +# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set +# CONFIG_USB_STORAGE_ENE_UB6250 is not set +# CONFIG_USB_UAS is not set +CONFIG_USB_LIBUSUAL=y + +# +# USB Imaging devices +# +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_MICROTEK is not set + +# +# USB port drivers +# +# CONFIG_USB_SERIAL is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_ADUTUX is not set +# CONFIG_USB_SEVSEG is not set +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_LEGOTOWER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_LED is not set +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +# CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_FTDI_ELAN is not set +# CONFIG_USB_APPLEDISPLAY is not set +# CONFIG_USB_LD is not set +# CONFIG_USB_TRANCEVIBRATOR is not set +# CONFIG_USB_IOWARRIOR is not set +# CONFIG_USB_TEST is not set +# CONFIG_USB_ISIGHTFW is not set +# CONFIG_USB_YUREX is not set +# CONFIG_USB_GADGET is not set + +# +# OTG and related infrastructure +# +# CONFIG_NOP_USB_XCEIV is not set +# CONFIG_UWB is not set +# CONFIG_MMC is not set +# CONFIG_MEMSTICK is not set +# CONFIG_NEW_LEDS is not set +# CONFIG_NFC_DEVICES is not set +# CONFIG_ACCESSIBILITY is not set +# CONFIG_INFINIBAND is not set +CONFIG_RTC_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +# CONFIG_RTC_DEBUG is not set + +# +# RTC interfaces +# +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set +# CONFIG_RTC_DRV_TEST is not set + +# +# SPI RTC drivers +# +# CONFIG_RTC_DRV_M41T94 is not set +# CONFIG_RTC_DRV_DS1305 is not set +# CONFIG_RTC_DRV_DS1390 is not set +# CONFIG_RTC_DRV_MAX6902 is not set +CONFIG_RTC_DRV_R9701=y +# CONFIG_RTC_DRV_RS5C348 is not set +# CONFIG_RTC_DRV_DS3234 is not set +# CONFIG_RTC_DRV_PCF2123 is not set + +# +# Platform RTC drivers +# +# CONFIG_RTC_DRV_DS1286 is not set +# CONFIG_RTC_DRV_DS1511 is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_STK17TA8 is not set +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_M48T35 is not set +# CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_MSM6242 is not set +# CONFIG_RTC_DRV_BQ4802 is not set +# CONFIG_RTC_DRV_RP5C01 is not set +# CONFIG_RTC_DRV_V3020 is not set + +# +# on-CPU RTC drivers +# +# CONFIG_RTC_DRV_SH is not set +# CONFIG_RTC_DRV_GENERIC is not set +# CONFIG_DMADEVICES is not set +# CONFIG_AUXDISPLAY is not set +# CONFIG_UIO is not set +# CONFIG_STAGING is not set +CONFIG_CLKDEV_LOOKUP=y + +# +# File systems +# +# CONFIG_EXT2_FS is not set +# CONFIG_EXT3_FS is not set +# CONFIG_EXT4_FS is not set +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +# CONFIG_XFS_FS is not set +# CONFIG_GFS2_FS is not set +# CONFIG_BTRFS_FS is not set +# CONFIG_NILFS2_FS is not set +# CONFIG_FS_POSIX_ACL is not set +CONFIG_FILE_LOCKING=y +CONFIG_FSNOTIFY=y +CONFIG_DNOTIFY=y +CONFIG_INOTIFY_USER=y +# CONFIG_FANOTIFY is not set +# CONFIG_QUOTA is not set +# CONFIG_QUOTACTL is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_FUSE_FS is not set + +# +# Caches +# +# CONFIG_FSCACHE is not set + +# +# CD-ROM/DVD Filesystems +# +# CONFIG_ISO9660_FS is not set +# CONFIG_UDF_FS is not set + +# +# DOS/FAT/NT Filesystems +# +# CONFIG_MSDOS_FS is not set +# CONFIG_VFAT_FS is not set +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_PROC_SYSCTL=y +CONFIG_PROC_PAGE_MONITOR=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +# CONFIG_TMPFS_POSIX_ACL is not set +# CONFIG_HUGETLBFS is not set +# CONFIG_HUGETLB_PAGE is not set +# CONFIG_CONFIGFS_FS is not set +CONFIG_MISC_FILESYSTEMS=y +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_LOGFS is not set +# CONFIG_CRAMFS is not set +CONFIG_SQUASHFS=y +CONFIG_SQUASHFS_XATTR=y +CONFIG_SQUASHFS_LZO=y +# CONFIG_SQUASHFS_XZ is not set +# CONFIG_SQUASHFS_EMBEDDED is not set +CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 +# CONFIG_VXFS_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_MINIX_FS_NATIVE_ENDIAN is not set +# CONFIG_OMFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_PSTORE is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set +# CONFIG_NETWORK_FILESYSTEMS is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +# CONFIG_NLS_CODEPAGE_437 is not set +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_ASCII is not set +# CONFIG_NLS_ISO8859_1 is not set +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_UTF8 is not set + +# +# Kernel hacking +# +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +# CONFIG_PRINTK_TIME is not set +CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4 +# CONFIG_ENABLE_WARN_DEPRECATED is not set +# CONFIG_ENABLE_MUST_CHECK is not set +CONFIG_FRAME_WARN=1024 +# CONFIG_MAGIC_SYSRQ is not set +# CONFIG_STRIP_ASM_SYMS is not set +# CONFIG_UNUSED_SYMBOLS is not set +# CONFIG_DEBUG_FS is not set +# CONFIG_HEADERS_CHECK is not set +# CONFIG_DEBUG_SECTION_MISMATCH is not set +# CONFIG_DEBUG_KERNEL is not set +# CONFIG_HARDLOCKUP_DETECTOR is not set +# CONFIG_SPARSE_RCU_POINTER is not set +CONFIG_DEBUG_BUGVERBOSE=y +# CONFIG_DEBUG_MEMORY_INIT is not set +# CONFIG_SYSCTL_SYSCALL_CHECK is not set +CONFIG_HAVE_FUNCTION_TRACER=y +CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y +CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y +CONFIG_HAVE_DYNAMIC_FTRACE=y +CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y +CONFIG_HAVE_SYSCALL_TRACEPOINTS=y +CONFIG_RING_BUFFER=y +CONFIG_RING_BUFFER_ALLOW_SWAP=y +CONFIG_TRACING_SUPPORT=y +# CONFIG_FTRACE is not set +# CONFIG_DMA_API_DEBUG is not set +# CONFIG_ATOMIC64_SELFTEST is not set +# CONFIG_SAMPLES is not set +CONFIG_HAVE_ARCH_KGDB=y +# CONFIG_TEST_KSTRTOX is not set +# CONFIG_SH_STANDARD_BIOS is not set +# CONFIG_DWARF_UNWINDER is not set + +# +# Security options +# +# CONFIG_KEYS is not set +# CONFIG_SECURITY_DMESG_RESTRICT is not set +# CONFIG_SECURITY is not set +# CONFIG_SECURITYFS is not set +CONFIG_DEFAULT_SECURITY_DAC=y +CONFIG_DEFAULT_SECURITY="" +# CONFIG_CRYPTO is not set +# CONFIG_VIRTUALIZATION is not set +# CONFIG_BINARY_PRINTF is not set + +# +# Library routines +# +CONFIG_BITREVERSE=y +CONFIG_GENERIC_FIND_LAST_BIT=y +# CONFIG_CRC_CCITT is not set +# CONFIG_CRC16 is not set +# CONFIG_CRC_T10DIF is not set +# CONFIG_CRC_ITU_T is not set +CONFIG_CRC32=y +# CONFIG_CRC7 is not set +# CONFIG_LIBCRC32C is not set +CONFIG_ZLIB_INFLATE=y +CONFIG_LZO_DECOMPRESS=y +# CONFIG_XZ_DEC is not set +# CONFIG_XZ_DEC_BCJ is not set +CONFIG_DECOMPRESS_GZIP=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAS_DMA=y +CONFIG_NLATTR=y +CONFIG_GENERIC_ATOMIC64=y +# CONFIG_AVERAGE is not set diff --git a/sh4pwn/skeleton/etc/hosts b/sh4pwn/skeleton/etc/hosts new file mode 100644 index 0000000..ba712fe --- /dev/null +++ b/sh4pwn/skeleton/etc/hosts @@ -0,0 +1 @@ +127.0.0.1 localhost diff --git a/sh4pwn/skeleton/etc/issue b/sh4pwn/skeleton/etc/issue new file mode 100644 index 0000000..56f7582 --- /dev/null +++ b/sh4pwn/skeleton/etc/issue @@ -0,0 +1,2 @@ + o Dirtbags Tiny Linux +(m) diff --git a/sh4pwn/skeleton/etc/passwd b/sh4pwn/skeleton/etc/passwd new file mode 100644 index 0000000..bd59b18 --- /dev/null +++ b/sh4pwn/skeleton/etc/passwd @@ -0,0 +1 @@ +root::0:0:root:/tmp:/bin/sh diff --git a/sh4pwn/skeleton/etc/profile b/sh4pwn/skeleton/etc/profile new file mode 100644 index 0000000..531198c --- /dev/null +++ b/sh4pwn/skeleton/etc/profile @@ -0,0 +1,6 @@ +PATH=/bin +[ $USER = root ] && PATH=/sbin:/bin +for i in /opt/*/bin; do + [ -d $i ] && PATH=$i:$PATH +done +export PATH diff --git a/sh4pwn/skeleton/home/.empty b/sh4pwn/skeleton/home/.empty new file mode 100644 index 0000000..e69de29 diff --git a/sh4pwn/skeleton/mnt/.empty b/sh4pwn/skeleton/mnt/.empty new file mode 100644 index 0000000..e69de29 diff --git a/sh4pwn/skeleton/opt/.empty b/sh4pwn/skeleton/opt/.empty new file mode 100644 index 0000000..e69de29 diff --git a/sh4pwn/skeleton/proc/.empty b/sh4pwn/skeleton/proc/.empty new file mode 100644 index 0000000..e69de29 diff --git a/sh4pwn/skeleton/sbin/init b/sh4pwn/skeleton/sbin/init new file mode 100755 index 0000000..bd0cdc1 --- /dev/null +++ b/sh4pwn/skeleton/sbin/init @@ -0,0 +1,55 @@ +#! /bin/sh + +loudmount () { + echo -n " $3" + mount -t $1 $2 $3 +} + +sysctl () { + echo $2 > /proc/sys/$1 +} + +if [ $$ -ne 1 ]; then + echo "Perhaps you wanted poweroff, reboot, or halt?" + exit +fi + +echo -n "Mounting filesystems:" +loudmount proc proc /proc +loudmount sysfs sys /sys +loudmount tmpfs dev /dev + /sbin/mdev -s + mkdir /dev/pts +loudmount devpts pts /dev/pts +loudmount tmpfs tmp /tmp +loudmount tmpfs mnt /mnt +echo "." + +if grep -q noinit /proc/cmdline; then + exec /bin/sh +fi + +echo -n "Setting kernel parameters..." +sysctl kernel/hotplug /sbin/mdev +sysctl kernel/randomize_va_space 2 +sysctl kernel/hostname dbtl +sysctl kernel/ctrl-alt-del 0 +sysctl net/ipv4/tcp_syncookies 1 +echo " done." + +echo -n "Setting up /service..." +if ! mkrw /service; then + echo " failed! How embarassing!" + echo + echo "Er, sorry about that. Here's a shell, hopefully you" + echo "can sort things out. The machine will reboot when this shell" + echo "exits." + /bin/sh + busybox reboot -f +fi +echo " done." + +## Hand off to runit +exec runsvdir -P -s /sbin/runit-signal /service \ + 'log: ....................................................................................................................................' + diff --git a/sh4pwn/skeleton/sbin/mkrw b/sh4pwn/skeleton/sbin/mkrw new file mode 100755 index 0000000..e59f0d1 --- /dev/null +++ b/sh4pwn/skeleton/sbin/mkrw @@ -0,0 +1,17 @@ +#! /bin/sh -e + +if ! [ -d "$1" ]; then + echo "usage: $0 DIRECTORY" + echo + echo "Makes DIRECTORY a read/write tmpfs mount with the same" + echo "contents." + exit 1 +fi + +fsname=$(basename $1) +mkdir /tmp/$fsname +mount -t tmpfs $fsname /tmp/$fsname +(cd $1 && tar cf - .) | (cd /tmp/$fsname && tar xf -) +mount -o move /tmp/$fsname $1 +rmdir /tmp/$fsname + diff --git a/sh4pwn/skeleton/sbin/runit-signal b/sh4pwn/skeleton/sbin/runit-signal new file mode 100755 index 0000000..365fd28 --- /dev/null +++ b/sh4pwn/skeleton/sbin/runit-signal @@ -0,0 +1,69 @@ +#! /bin/sh + +## +## Signal handler for runit +## + +if [ $PPID != 1 ]; then + echo "This program should only be invoked by PID 1." + # The reason is that killall5 won't kill anything in the same + # process group. That means it won't kill your invoking shell, + # getty, or svrun. That in turn prevents filesystems from + # unmounting, or even being remounted ro, since svrun (at least) has + # a FIFO open for writes. And if we reboot without unmounting + # filesystems, that's bad. + + echo "Feel free to read $0 to learn why :)" + exit 1 +fi + +waitall () { + for i in $(seq 50); do + # If all processes are in group 0, we're done + awk '($5){exit 1;}' /proc/[0-9]*/stat && return 0 + usleep 200000 + done + return 1 +} + +cleanup () { + echo "Stopping services..." + sv stop /service/* + echo "Asking processes to exit..." + killall5 -HUP + killall5 -TERM + if waitall; then + echo "Forcing processes to exit..." + killall5 -KILL + waitall + fi + echo "Unmounting file systems..." + umount -a -r + + # Sometimes when we reach here we still haven't been able to umount + # everything. Not much more we can do about that, other than flush + # write buffers and hope for the best. + sync +} + +case $1 in + 1) # SIGHUP + ;; + 15) # SIGTERM: reboot + cleanup + echo "Rebooting..." + reboot -f + ;; + 10) # SIGUSR1: halt + cleanup + echo "Halting..." + halt -f + ;; + 12) # SIGUSR2: power + cleanup + echo "Shutting down..." + poweroff -f + ;; + *) # Everything else + ;; +esac diff --git a/sh4pwn/skeleton/sbin/udhcpc.script b/sh4pwn/skeleton/sbin/udhcpc.script new file mode 100755 index 0000000..a52a7f8 --- /dev/null +++ b/sh4pwn/skeleton/sbin/udhcpc.script @@ -0,0 +1,39 @@ +#!/bin/sh + +# udhcpc script edited by Tim Riker + +[ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1 + +RESOLV_CONF="/etc/resolv.conf" +[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast" +[ -n "$subnet" ] && NETMASK="netmask $subnet" + +case "$1" in + deconfig) + /sbin/ifconfig $interface 0.0.0.0 + ;; + + renew|bound) + /sbin/ifconfig $interface $ip $BROADCAST $NETMASK + + if [ -n "$router" ] ; then + echo "deleting routers" + while route del default gw 0.0.0.0 dev $interface ; do + : + done + + for i in $router ; do + route add default gw $i dev $interface + done + fi + + echo -n > $RESOLV_CONF + [ -n "$domain" ] && echo search $domain >> $RESOLV_CONF + for i in $dns ; do + echo adding dns $i + echo nameserver $i >> $RESOLV_CONF + done + ;; +esac + +exit 0 diff --git a/sh4pwn/skeleton/service/eth0/finish b/sh4pwn/skeleton/service/eth0/finish new file mode 100755 index 0000000..2df9a20 --- /dev/null +++ b/sh4pwn/skeleton/service/eth0/finish @@ -0,0 +1,3 @@ +#! /bin/sh + +ip addr set dev eth0 down diff --git a/sh4pwn/skeleton/service/eth0/run b/sh4pwn/skeleton/service/eth0/run new file mode 100755 index 0000000..cf90a25 --- /dev/null +++ b/sh4pwn/skeleton/service/eth0/run @@ -0,0 +1,6 @@ +#! /bin/sh -e + +ip link set dev eth0 up + +exec inotifyd true $(pwd) + diff --git a/sh4pwn/skeleton/service/lo/finish b/sh4pwn/skeleton/service/lo/finish new file mode 100755 index 0000000..e69f864 --- /dev/null +++ b/sh4pwn/skeleton/service/lo/finish @@ -0,0 +1,3 @@ +#! /bin/sh + +ip link set dev lo down diff --git a/sh4pwn/skeleton/service/lo/run b/sh4pwn/skeleton/service/lo/run new file mode 100755 index 0000000..851964d --- /dev/null +++ b/sh4pwn/skeleton/service/lo/run @@ -0,0 +1,7 @@ +#! /bin/sh -e + +ip link set dev lo up +ip addr add 127.0.0.1/8 dev lo + +exec inotifyd true $(pwd) + diff --git a/sh4pwn/skeleton/service/telnetd/issue b/sh4pwn/skeleton/service/telnetd/issue new file mode 100644 index 0000000..b8f0a8f --- /dev/null +++ b/sh4pwn/skeleton/service/telnetd/issue @@ -0,0 +1,8 @@ + ""\/ \/"" + "\__/" A STAG PARTY YOU SAY ?!!?!?!? + (oo) +-. ______-LJ WELL OF COURSE I'D LOVE TO ATTEND + ,' | + |.____.. / SAY WHAT REPEAT THAT LAST PART ABOUT WHAT IT IS AGAIN + \\ /A\ + |A |// vir. pwn:xudap-tinak-kanex diff --git a/sh4pwn/skeleton/service/telnetd/run b/sh4pwn/skeleton/service/telnetd/run new file mode 100755 index 0000000..b560efc --- /dev/null +++ b/sh4pwn/skeleton/service/telnetd/run @@ -0,0 +1,3 @@ +#! /bin/sh + +exec tcpsvd :: 23 telnetd -f issue -l /bin/sh diff --git a/sh4pwn/skeleton/service/tty1/run b/sh4pwn/skeleton/service/tty1/run new file mode 100755 index 0000000..b9c3414 --- /dev/null +++ b/sh4pwn/skeleton/service/tty1/run @@ -0,0 +1,6 @@ +#! /bin/sh + +dev=/dev/$(basename $(pwd)) +test -c $dev || exit + +exec getty 38400 $dev diff --git a/sh4pwn/skeleton/service/tty2/run b/sh4pwn/skeleton/service/tty2/run new file mode 120000 index 0000000..603eb32 --- /dev/null +++ b/sh4pwn/skeleton/service/tty2/run @@ -0,0 +1 @@ +../tty1/run \ No newline at end of file diff --git a/sh4pwn/skeleton/service/tty3/run b/sh4pwn/skeleton/service/tty3/run new file mode 120000 index 0000000..603eb32 --- /dev/null +++ b/sh4pwn/skeleton/service/tty3/run @@ -0,0 +1 @@ +../tty1/run \ No newline at end of file diff --git a/sh4pwn/skeleton/service/tty4/run b/sh4pwn/skeleton/service/tty4/run new file mode 120000 index 0000000..603eb32 --- /dev/null +++ b/sh4pwn/skeleton/service/tty4/run @@ -0,0 +1 @@ +../tty1/run \ No newline at end of file diff --git a/sh4pwn/skeleton/sys/.empty b/sh4pwn/skeleton/sys/.empty new file mode 100644 index 0000000..e69de29 diff --git a/sh4pwn/skeleton/tmp/.empty b/sh4pwn/skeleton/tmp/.empty new file mode 100644 index 0000000..e69de29 diff --git a/sh4pwn/target_device_table.txt b/sh4pwn/target_device_table.txt new file mode 100644 index 0000000..d270eb5 --- /dev/null +++ b/sh4pwn/target_device_table.txt @@ -0,0 +1,42 @@ +# When building a target filesystem, it is desirable to not have to +# become root and then run 'mknod' a thousand times. Using a device +# table you can create device nodes and directories "on the fly". +# +# This is a sample device table file for use with genext2fs. You can +# do all sorts of interesting things with a device table file. For +# example, if you want to adjust the permissions on a particular file +# you can just add an entry like: +# /sbin/foobar f 2755 0 0 - - - - - +# and (assuming the file /sbin/foobar exists) it will be made setuid +# root (regardless of what its permissions are on the host filesystem. +# Furthermore, you can use a single table entry to create a many device +# minors. For example, if I wanted to create /dev/hda and /dev/hda[0-15] +# I could just use the following two table entries: +# /dev/hda b 640 0 0 3 0 0 0 - +# /dev/hda b 640 0 0 3 1 1 1 15 +# +# Device table entries take the form of: +# +# where name is the file name, type can be one of: +# f A regular file +# d Directory +# c Character special device file +# b Block special device file +# p Fifo (named pipe) +# uid is the user id for the target file, gid is the group id for the +# target file. The rest of the entries (major, minor, etc) apply only +# to device special files. + +# Have fun +# -Erik Andersen +# + +# +/dev d 755 0 0 - - - - - +/tmp d 1777 0 0 - - - - - +/bin/busybox f 4755 0 0 - - - - - +/etc/passwd f 644 0 0 - - - - - +/etc/shadow f 600 0 0 - - - - - +/dev/console c 666 0 0 5 1 - - - +/dev/null c 666 0 0 1 3 - - - +/dev/zero c 666 0 0 1 5 - - - From 9e8968bbdd50eb7a1459f5cfdcacba8992bd8c2e Mon Sep 17 00:00:00 2001 From: "Cherish A. Franco" Date: Tue, 11 Oct 2011 15:54:52 -0600 Subject: [PATCH 03/25] Working on that server again, Now it does more stuff, er, more address getting. ~Cherish --- packages/multicaster/src/multicaster-server.c | 196 +++++++++++++----- 1 file changed, 147 insertions(+), 49 deletions(-) diff --git a/packages/multicaster/src/multicaster-server.c b/packages/multicaster/src/multicaster-server.c index 830ec3b..a1b3507 100644 --- a/packages/multicaster/src/multicaster-server.c +++ b/packages/multicaster/src/multicaster-server.c @@ -3,69 +3,167 @@ * found at http://cboard.cprogramming.com/showthread.php?t=67469 */ -#include /* for fprintf() */ -#include -#include #include -#include /* for atoi() and exit() */ -#include +#include +#include #include +#include +#include +#include +#include +#include static void DieWithError(const char* errorMessage) { - fprintf(stderr, "%s\n", errorMessage); - exit(10); + fprintf(stderr, "%s\n", errorMessage); + exit(10); } int main(int argc, char *argv[]) { - int sock; /* Socket */ - char* multicastIP; /* Arg: IP Multicast address */ - char* multicastPort; /* Arg: Server port */ - char* sendString; /* Arg: String to multicast */ - size_t sendStringLen; /* Length of string to multicast */ - struct addrinfo * multicastAddr; /* Multicast address */ - struct addrinfo hints = { 0 }; /* Hints for name lookup */ + int sender, listener; /* Sockets */ + char* multicastIP; /* Arg: IP Multicast address */ + char* multicastPort; /* Arg: Server port */ + char* token; + size_t tokenlen; + struct addrinfo * multicastAddr; /* Multicast address */ + struct addrinfo hints = { 0 }; /* Hints for name lookup */ - if ( argc != 4 ) - { - fprintf(stderr, "Usage: %s \n", argv[0]); - exit(10); - } + if (argc != 4) + { + fprintf(stderr, "Usage: %s \n", argv[0]); + exit(10); + } - multicastIP = argv[1]; /* First arg: multicast IP address */ - multicastPort = argv[2]; /* Second arg: multicast port */ - sendString = argv[3]; /* Third arg: String to multicast */ - sendStringLen = strlen(sendString); /* Find length of sendString */ + multicastIP = argv[1]; /* First arg: multicast IP address */ + multicastPort = argv[2]; /* Second arg: multicast port */ + token = argv[3]; + tokenlen = strlen(token); - /* Resolve destination address for multicast datagrams */ - hints.ai_family = PF_INET6; - hints.ai_socktype = SOCK_DGRAM; - hints.ai_flags = AI_NUMERICHOST; - if (getaddrinfo(multicastIP, multicastPort, &hints, &multicastAddr) != 0) DieWithError("getaddrinfo() failed"); + /* Resolve destination address for multicast datagrams */ + hints.ai_family = PF_INET6; + hints.ai_socktype = SOCK_DGRAM; + hints.ai_flags = AI_NUMERICHOST; - /* Create socket for sending multicast datagrams */ - if ((sock = socket(multicastAddr->ai_family, multicastAddr->ai_socktype, 0)) == -1) DieWithError("socket() failed"); + if (getaddrinfo(multicastIP, multicastPort, &hints, &multicastAddr) != 0) + { + DieWithError("getaddrinfo() failed"); + } - int hops = 5; - if (setsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &hops, sizeof(hops)) != 0) DieWithError("setsockopt(MULTICAST_HOPS) failed"); + /* Create socket for sending multicast datagrams */ + if ((sender = socket(multicastAddr->ai_family, multicastAddr->ai_socktype, 0)) == -1) + { + DieWithError("socket() failed"); + } - for (;;) /* Run forever */ - { - int sendLen = sendto(sock, sendString, sendStringLen, 0, multicastAddr->ai_addr, multicastAddr->ai_addrlen); - if (sendLen == sendStringLen ) - { - printf("Sent [%s] (%i bytes) to %s, port %s\n", sendString, sendLen, multicastIP, multicastPort); - } - else - { - DieWithError("sendto() sent a different number of bytes than expected"); - } - sleep(1); /* Multicast sendString in datagram to clients every second */ - } + /* Create socket for recieving multicast datagrams */ + if ((listener = socket(multicastAddr->ai_family, multicastAddr->ai_socktype, 0)) == -1) + { + DieWithError("socket() failed"); + } - /* NOT REACHED */ - freeaddrinfo(multicastAddr); - close(sock); - return 0; + { + int hops = 5; + if (setsockopt(sender, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &hops, sizeof(hops)) != 0) + { + DieWithError("setsockopt(MULTICAST_HOPS) failed"); + } + } + + /* Join the multicast group. */ + if ((multicastAddr->ai_family == PF_INET6)&&(multicastAddr->ai_addrlen == sizeof(struct sockaddr_in6))) + { + struct sockaddr_in6 *addr = (struct sockaddr_in6 *)(multicastAddr->ai_addr); + struct ipv6_mreq multicastRequest; /* Multicast address join structure */ + + /* Specify the multicast group */ + memcpy(&multicastRequest.ipv6mr_multiaddr, &(addr)->sin6_addr, sizeof(multicastRequest.ipv6mr_multiaddr)); + + /* Accept multicast from any interface */ + multicastRequest.ipv6mr_interface = addr->sin6_scope_id; + + /* Join the multicast address */ + if (setsockopt(listener, IPPROTO_IPV6, IPV6_JOIN_GROUP, (char*) &multicastRequest, sizeof(multicastRequest)) != 0) + { + DieWithError("setsockopt(IPV6_JOIN_GROUP) failed"); + } + } else { + DieWithError("Not IPv6"); + } + + for (;;) /* Run forever */ + { + int n; + int max_fd; + struct timeval timeout; + fd_set input; + + char recvString[500]; /* Buffer for received string */ + int recvStringLen; /* Length of received string */ + + char sendString[] = "Say Hello\n"; + size_t sendStringLen = sizeof(sendString)-1; + char errorString[] = "That is not correct! Try again!\n"; + + struct sockaddr_in6 from; + socklen_t fromlen = sizeof(from); + + FD_ZERO(&input); + FD_SET(listener, &input); + + max_fd = listener + 1; + + timeout.tv_sec = 1; + timeout.tv_usec = 0; + + n = select(max_fd, &input, NULL, NULL, &timeout); + + /* See if there was an error */ + if (n < 0) + { + perror("select failed"); + } else if (n == 0) { + puts("TIMEOUT"); + } else { + if (FD_ISSET(listener, &input)) + { + recvStringLen = recvfrom(listener, recvString, sizeof(recvString) - 1, 0, + (struct sockaddr *)&from, &fromlen); + /* Receive a single datagram from the server */ + if (recvStringLen < 0) + { + DieWithError("recvfrom() failed"); + } + + recvString[recvStringLen] = '\0'; + if (strcmp(recvString, "hello")==0) + { + printf("Correct!!\n"); + sendto(listener, token, sizeof(sendString), 0, (struct sockaddr *)&from, fromlen); + } else { + sendto(listener, errorString, sizeof(errorString), 0, (struct sockaddr *)&from, fromlen); + } + + /* Print the received string */ + printf("Received string [%s]\n", recvString); + } + } + + int sendLen = sendto(sender, sendString, sendStringLen, 0, multicastAddr->ai_addr, + multicastAddr->ai_addrlen); + if (sendLen == sendStringLen) + { + printf("Sent [%s] (%i bytes) to %s, port %s\n", sendString, sendLen, + multicastIP, multicastPort); + } else { + DieWithError("sendto() sent a different number of bytes than expected"); + } + } + + /* NOT REACHED */ + freeaddrinfo(multicastAddr); + close(sender); + close(listener); + + return 0; } From 0f1a8d66fed1c7262bd8fb78ddfd9609043667bc Mon Sep 17 00:00:00 2001 From: "Cherish A. Franco" Date: Tue, 11 Oct 2011 16:02:51 -0600 Subject: [PATCH 04/25] Fixing those stupid exit(10); things. ~Cherish --- packages/multicaster/src/multicaster-server.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/multicaster/src/multicaster-server.c b/packages/multicaster/src/multicaster-server.c index a1b3507..799e5ad 100644 --- a/packages/multicaster/src/multicaster-server.c +++ b/packages/multicaster/src/multicaster-server.c @@ -16,7 +16,7 @@ static void DieWithError(const char* errorMessage) { fprintf(stderr, "%s\n", errorMessage); - exit(10); + exit(1); } int main(int argc, char *argv[]) @@ -32,7 +32,7 @@ int main(int argc, char *argv[]) if (argc != 4) { fprintf(stderr, "Usage: %s \n", argv[0]); - exit(10); + exit(1); } multicastIP = argv[1]; /* First arg: multicast IP address */ From 18d15842f3c7b8d5db61a850ebb8fe6d3bfc0433 Mon Sep 17 00:00:00 2001 From: "Cherish A. Franco" Date: Tue, 11 Oct 2011 17:14:19 -0600 Subject: [PATCH 05/25] Done with AWESOME server I think! ~Cherish --- packages/multicaster/src/multicaster-server.c | 196 +++++------------- .../src/multicaster-serverAWESOME.c | 178 ++++++++++++++++ 2 files changed, 227 insertions(+), 147 deletions(-) create mode 100644 packages/multicaster/src/multicaster-serverAWESOME.c diff --git a/packages/multicaster/src/multicaster-server.c b/packages/multicaster/src/multicaster-server.c index 799e5ad..830ec3b 100644 --- a/packages/multicaster/src/multicaster-server.c +++ b/packages/multicaster/src/multicaster-server.c @@ -3,167 +3,69 @@ * found at http://cboard.cprogramming.com/showthread.php?t=67469 */ -#include -#include -#include -#include -#include -#include +#include /* for fprintf() */ #include -#include +#include +#include +#include /* for atoi() and exit() */ #include +#include static void DieWithError(const char* errorMessage) { - fprintf(stderr, "%s\n", errorMessage); - exit(1); + fprintf(stderr, "%s\n", errorMessage); + exit(10); } int main(int argc, char *argv[]) { - int sender, listener; /* Sockets */ - char* multicastIP; /* Arg: IP Multicast address */ - char* multicastPort; /* Arg: Server port */ - char* token; - size_t tokenlen; - struct addrinfo * multicastAddr; /* Multicast address */ - struct addrinfo hints = { 0 }; /* Hints for name lookup */ + int sock; /* Socket */ + char* multicastIP; /* Arg: IP Multicast address */ + char* multicastPort; /* Arg: Server port */ + char* sendString; /* Arg: String to multicast */ + size_t sendStringLen; /* Length of string to multicast */ + struct addrinfo * multicastAddr; /* Multicast address */ + struct addrinfo hints = { 0 }; /* Hints for name lookup */ - if (argc != 4) - { - fprintf(stderr, "Usage: %s \n", argv[0]); - exit(1); - } + if ( argc != 4 ) + { + fprintf(stderr, "Usage: %s \n", argv[0]); + exit(10); + } - multicastIP = argv[1]; /* First arg: multicast IP address */ - multicastPort = argv[2]; /* Second arg: multicast port */ - token = argv[3]; - tokenlen = strlen(token); + multicastIP = argv[1]; /* First arg: multicast IP address */ + multicastPort = argv[2]; /* Second arg: multicast port */ + sendString = argv[3]; /* Third arg: String to multicast */ + sendStringLen = strlen(sendString); /* Find length of sendString */ - /* Resolve destination address for multicast datagrams */ - hints.ai_family = PF_INET6; - hints.ai_socktype = SOCK_DGRAM; - hints.ai_flags = AI_NUMERICHOST; + /* Resolve destination address for multicast datagrams */ + hints.ai_family = PF_INET6; + hints.ai_socktype = SOCK_DGRAM; + hints.ai_flags = AI_NUMERICHOST; + if (getaddrinfo(multicastIP, multicastPort, &hints, &multicastAddr) != 0) DieWithError("getaddrinfo() failed"); - if (getaddrinfo(multicastIP, multicastPort, &hints, &multicastAddr) != 0) - { - DieWithError("getaddrinfo() failed"); - } + /* Create socket for sending multicast datagrams */ + if ((sock = socket(multicastAddr->ai_family, multicastAddr->ai_socktype, 0)) == -1) DieWithError("socket() failed"); - /* Create socket for sending multicast datagrams */ - if ((sender = socket(multicastAddr->ai_family, multicastAddr->ai_socktype, 0)) == -1) - { - DieWithError("socket() failed"); - } + int hops = 5; + if (setsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &hops, sizeof(hops)) != 0) DieWithError("setsockopt(MULTICAST_HOPS) failed"); - /* Create socket for recieving multicast datagrams */ - if ((listener = socket(multicastAddr->ai_family, multicastAddr->ai_socktype, 0)) == -1) - { - DieWithError("socket() failed"); - } + for (;;) /* Run forever */ + { + int sendLen = sendto(sock, sendString, sendStringLen, 0, multicastAddr->ai_addr, multicastAddr->ai_addrlen); + if (sendLen == sendStringLen ) + { + printf("Sent [%s] (%i bytes) to %s, port %s\n", sendString, sendLen, multicastIP, multicastPort); + } + else + { + DieWithError("sendto() sent a different number of bytes than expected"); + } + sleep(1); /* Multicast sendString in datagram to clients every second */ + } - { - int hops = 5; - if (setsockopt(sender, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &hops, sizeof(hops)) != 0) - { - DieWithError("setsockopt(MULTICAST_HOPS) failed"); - } - } - - /* Join the multicast group. */ - if ((multicastAddr->ai_family == PF_INET6)&&(multicastAddr->ai_addrlen == sizeof(struct sockaddr_in6))) - { - struct sockaddr_in6 *addr = (struct sockaddr_in6 *)(multicastAddr->ai_addr); - struct ipv6_mreq multicastRequest; /* Multicast address join structure */ - - /* Specify the multicast group */ - memcpy(&multicastRequest.ipv6mr_multiaddr, &(addr)->sin6_addr, sizeof(multicastRequest.ipv6mr_multiaddr)); - - /* Accept multicast from any interface */ - multicastRequest.ipv6mr_interface = addr->sin6_scope_id; - - /* Join the multicast address */ - if (setsockopt(listener, IPPROTO_IPV6, IPV6_JOIN_GROUP, (char*) &multicastRequest, sizeof(multicastRequest)) != 0) - { - DieWithError("setsockopt(IPV6_JOIN_GROUP) failed"); - } - } else { - DieWithError("Not IPv6"); - } - - for (;;) /* Run forever */ - { - int n; - int max_fd; - struct timeval timeout; - fd_set input; - - char recvString[500]; /* Buffer for received string */ - int recvStringLen; /* Length of received string */ - - char sendString[] = "Say Hello\n"; - size_t sendStringLen = sizeof(sendString)-1; - char errorString[] = "That is not correct! Try again!\n"; - - struct sockaddr_in6 from; - socklen_t fromlen = sizeof(from); - - FD_ZERO(&input); - FD_SET(listener, &input); - - max_fd = listener + 1; - - timeout.tv_sec = 1; - timeout.tv_usec = 0; - - n = select(max_fd, &input, NULL, NULL, &timeout); - - /* See if there was an error */ - if (n < 0) - { - perror("select failed"); - } else if (n == 0) { - puts("TIMEOUT"); - } else { - if (FD_ISSET(listener, &input)) - { - recvStringLen = recvfrom(listener, recvString, sizeof(recvString) - 1, 0, - (struct sockaddr *)&from, &fromlen); - /* Receive a single datagram from the server */ - if (recvStringLen < 0) - { - DieWithError("recvfrom() failed"); - } - - recvString[recvStringLen] = '\0'; - if (strcmp(recvString, "hello")==0) - { - printf("Correct!!\n"); - sendto(listener, token, sizeof(sendString), 0, (struct sockaddr *)&from, fromlen); - } else { - sendto(listener, errorString, sizeof(errorString), 0, (struct sockaddr *)&from, fromlen); - } - - /* Print the received string */ - printf("Received string [%s]\n", recvString); - } - } - - int sendLen = sendto(sender, sendString, sendStringLen, 0, multicastAddr->ai_addr, - multicastAddr->ai_addrlen); - if (sendLen == sendStringLen) - { - printf("Sent [%s] (%i bytes) to %s, port %s\n", sendString, sendLen, - multicastIP, multicastPort); - } else { - DieWithError("sendto() sent a different number of bytes than expected"); - } - } - - /* NOT REACHED */ - freeaddrinfo(multicastAddr); - close(sender); - close(listener); - - return 0; + /* NOT REACHED */ + freeaddrinfo(multicastAddr); + close(sock); + return 0; } diff --git a/packages/multicaster/src/multicaster-serverAWESOME.c b/packages/multicaster/src/multicaster-serverAWESOME.c new file mode 100644 index 0000000..d8b69d0 --- /dev/null +++ b/packages/multicaster/src/multicaster-serverAWESOME.c @@ -0,0 +1,178 @@ +/* multicast_server.c + * Adapted from tmouse's IPv6 client/server example code + * found at http://cboard.cprogramming.com/showthread.php?t=67469 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static void DieWithError(const char* errorMessage) +{ + fprintf(stderr, "%s\n", errorMessage); + exit(1); +} + +int main(int argc, char *argv[]) +{ + int sender, listener; /* Sockets */ + char* multicastIP; /* Arg: IP Multicast address */ + char* multicastPort; /* Arg: Server port */ + char* token; + size_t tokenlen; + struct addrinfo * multicastAddr; /* Multicast address */ + struct addrinfo hints = { 0 }; /* Hints for name lookup */ + struct timeval timeout = { 0 }; + + if (argc != 4) + { + fprintf(stderr, "Usage: %s \n", argv[0]); + exit(1); + } + + multicastIP = argv[1]; /* First arg: multicast IP address */ + multicastPort = argv[2]; /* Second arg: multicast port */ + token = argv[3]; + tokenlen = strlen(token); + + /* Resolve destination address for multicast datagrams */ + hints.ai_family = PF_INET6; + hints.ai_socktype = SOCK_DGRAM; + hints.ai_flags = AI_NUMERICHOST; + + if (getaddrinfo(multicastIP, multicastPort, &hints, &multicastAddr) != 0) + { + DieWithError("getaddrinfo() failed"); + } + + /* Create socket for sending multicast datagrams */ + if ((sender = socket(multicastAddr->ai_family, multicastAddr->ai_socktype, 0)) == -1) + { + DieWithError("socket() failed"); + } + + /* Create socket for recieving multicast datagrams */ + if ((listener = socket(multicastAddr->ai_family, multicastAddr->ai_socktype, 0)) == -1) + { + DieWithError("socket() failed"); + } + + { + int hops = 5; + if (setsockopt(sender, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &hops, sizeof(hops)) != 0) + { + DieWithError("setsockopt(MULTICAST_HOPS) failed"); + } + } + + /* Bind to the multicast port */ + if (bind(listener, multicastAddr->ai_addr, multicastAddr->ai_addrlen) != 0) + { + DieWithError("bind() failed"); + } + + /* Join the multicast group. */ + if ((multicastAddr->ai_family == PF_INET6)&&(multicastAddr->ai_addrlen == sizeof(struct sockaddr_in6))) + { + struct sockaddr_in6 *addr = (struct sockaddr_in6 *)(multicastAddr->ai_addr); + struct ipv6_mreq multicastRequest; /* Multicast address join structure */ + + /* Specify the multicast group */ + memcpy(&multicastRequest.ipv6mr_multiaddr, &(addr)->sin6_addr, sizeof(multicastRequest.ipv6mr_multiaddr)); + + /* Accept multicast from any interface */ + multicastRequest.ipv6mr_interface = addr->sin6_scope_id; + + /* Join the multicast address */ + if (setsockopt(listener, IPPROTO_IPV6, IPV6_JOIN_GROUP, (char*) &multicastRequest, sizeof(multicastRequest)) != 0) + { + DieWithError("setsockopt(IPV6_JOIN_GROUP) failed"); + } + } else { + DieWithError("Not IPv6"); + } + + for (;;) /* Run forever */ + { + int n; + int max_fd; + fd_set input; + + char recvString[500]; /* Buffer for received string */ + int recvStringLen; /* Length of received string */ + + char sendString[] = "Say Hello\n"; + size_t sendStringLen = sizeof(sendString)-1; + char errorString[] = "That is not correct! Try again!\n"; + + struct sockaddr_in6 from; + socklen_t fromlen = sizeof(from); + + FD_ZERO(&input); + FD_SET(listener, &input); + + max_fd = listener + 1; + + if (timeout.tv_usec < 100) + { + timeout.tv_sec = 1; + timeout.tv_usec = 0; + + int sendLen = sendto(sender, sendString, sendStringLen, 0, multicastAddr->ai_addr, + multicastAddr->ai_addrlen); + if (sendLen == sendStringLen) + { + printf("Sent [%s] (%i bytes) to %s, port %s\n", sendString, sendLen, + multicastIP, multicastPort); + } else { + DieWithError("sendto() sent a different number of bytes than expected"); + } + } + + n = select(max_fd, &input, NULL, NULL, &timeout); + + /* See if there was an error */ + if (n < 0) + { + perror("select failed"); + } else if (n == 0) { + puts("TIMEOUT"); + } else { + if (FD_ISSET(listener, &input)) + { + recvStringLen = recvfrom(listener, recvString, sizeof(recvString) - 1, 0, + (struct sockaddr *)&from, &fromlen); + /* Receive a single datagram from the server */ + if (recvStringLen < 0) + { + DieWithError("recvfrom() failed"); + } + + recvString[recvStringLen] = '\0'; + if (strcmp(recvString, "hello")==0) + { + printf("Correct!!\n"); + sendto(listener, token, sizeof(sendString), 0, (struct sockaddr *)&from, fromlen); + } else if (strcmp(recvString, sendString)!=0) { + sendto(listener, errorString, sizeof(errorString), 0, (struct sockaddr *)&from, fromlen); + } + + /* Print the received string */ + printf("Received string [%s]\n", recvString); + } + } + } + + /* NOT REACHED */ + freeaddrinfo(multicastAddr); + close(sender); + close(listener); + + return 0; +} From 6bd7d70c90aa850bb921074898680c242932f503 Mon Sep 17 00:00:00 2001 From: Neale Pickett Date: Wed, 12 Oct 2011 10:49:37 -0600 Subject: [PATCH 06/25] stop building lxc by default --- packages/lxc/lxc.mk | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/lxc/lxc.mk b/packages/lxc/lxc.mk index e8edc3e..c9816e8 100644 --- a/packages/lxc/lxc.mk +++ b/packages/lxc/lxc.mk @@ -50,6 +50,3 @@ lxc-clean: LIBCAP_PKGDIR = $(TARGET)/libcap - - -PACKAGES += lxc From 0a163cc53e415f99769906b1be82960b642fc4a6 Mon Sep 17 00:00:00 2001 From: Neale Pickett Date: Wed, 12 Oct 2011 10:50:09 -0600 Subject: [PATCH 07/25] replace mrd6 with ecmh --- packages/router/router.mk | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/packages/router/router.mk b/packages/router/router.mk index ed65d09..536e609 100644 --- a/packages/router/router.mk +++ b/packages/router/router.mk @@ -44,28 +44,29 @@ radvd-install: ## -## mrd6 +## ecmh ## -MRD6_CACHE = $(CACHE)/mrd6.git -MRD6_BUILDDIR = $(ROUTER_BUILDDIR)/mrd6 -MRD6_URL = https://github.com/hugosantos/mrd6.git +ECMH_CACHE = $(CACHE)/ecmh.git +ECMH_BUILDDIR = $(ROUTER_BUILDDIR)/ecmh +ECMH_URL = http://woozle.org/~neale/projects/ecmh -$(MRD6_CACHE): - git clone --bare $(MRD6_URL) $@ +$(ECMH_CACHE): + git clone --bare $(ECMH_URL) $@ -router-source: $(MRD6_BUILDDIR) -$(MRD6_BUILDDIR): $(MRD6_CACHE) +router-source: $(ECMH_BUILDDIR) +$(ECMH_BUILDDIR): $(ECMH_CACHE) git clone $< $@ -router-build: $(ROUTER_BUILDDIR)/mrd6-build -$(ROUTER_BUILDDIR)/mrd6-build: $(MRD6_BUILDDIR) - $(MAKE) -C $(MRD6_BUILDDIR) +router-build: $(ROUTER_BUILDDIR)/ecmh-build +$(ROUTER_BUILDDIR)/ecmh-build: $(ECMH_BUILDDIR) + $(MAKE) -C $(ECMH_BUILDDIR)/src ECMH_VERSION=dbtl-git + $(MAKE) -C $(ECMH_BUILDDIR)/tools/mtrace6 touch $@ -router-install: mrd6-install -mrd6-install: +router-install: ecmh-install +ecmh-install: mkdir -p $(ROUTER_PKGDIR)/bin - cp $(MRD6_BUILDDIR)/src/mrd $(ROUTER_PKGDIR)/bin - + cp $(ECMH_BUILDDIR)/src/ecmh $(ROUTER_PKGDIR)/bin + cp $(ECMH_BUILDDIR)/tools/mtrace6/mtrace6 $(ROUTER_PKGDIR)/bin PACKAGES += router From 02b9884709dc4a2a90a6986793c7279a9d178d02 Mon Sep 17 00:00:00 2001 From: Neale Pickett Date: Wed, 12 Oct 2011 17:41:19 -0600 Subject: [PATCH 08/25] make points submission almost work again --- packages/mcp/bin/addteam | 6 +----- packages/mcp/mcp.mk | 27 ++++++++++++++------------- packages/mcp/service/httpd/run | 6 +----- packages/mcp/service/puzzled/run | 3 +++ 4 files changed, 19 insertions(+), 23 deletions(-) diff --git a/packages/mcp/bin/addteam b/packages/mcp/bin/addteam index 6a335a3..e936f01 100755 --- a/packages/mcp/bin/addteam +++ b/packages/mcp/bin/addteam @@ -45,13 +45,9 @@ esac # Compute hash of team name; they'll use this for everything in the # contest instead of their team name, which makes stuff much easier on # me since all team hashes are in the set /[0-9a-f]{8}/. -hash=$(echo "not a nonce:::$1" | md5sum | cut -b 1-8) +hash=$(dd if=/dev/urandom count=1 2>/dev/null | md5sum | cut -b 1-8) echo "$1" > $base/teams/names/$hash echo "$color" > $base/teams/colors/$hash echo "Registered with hash: $hash" - -# Create encrypted listing of teams -ls $base/teams/names | KEY="Too much cheese." arc4 > $www/teams.txt.$$ -mv $www/teams.txt.$$ $www/teams.txt diff --git a/packages/mcp/mcp.mk b/packages/mcp/mcp.mk index 19e6ef8..ea8c647 100644 --- a/packages/mcp/mcp.mk +++ b/packages/mcp/mcp.mk @@ -1,27 +1,28 @@ MCP_PKGDIR = $(TARGET)/mcp MCP_BUILDDIR = $(BUILD)/mcp -MCP_FNORD_VERSION = 1.10 -MCP_FNORD_TARBALL = fnord-$(MCP_FNORD_VERSION).tar.bz2 -MCP_FNORD_TARCACHE = $(CACHE)/$(MCP_FNORD_TARBALL) -MCP_FNORD_URL = http://www.fefe.de/fnord/$(MCP_FNORD_TARBALL) -MCP_FNORD_SRCDIR = $(MCP_BUILDDIR)/fnord-$(MCP_FNORD_VERSION) -$(MCP_FNORD_TARCACHE): - @ mkdir -p $(@D) - wget -O $@ $(MCP_FNORD_URL) +## +## XXX: clean up fnord like router.mk +## + +FNORD_CACHE = $(CACHE)/fnord.git +FNORD_BUILDDIR = $(MCP_BUILDDIR)/fnord +FNORD_URL = http://woozle.org/~neale/projects/fnord + +$(FNORD_CACHE): + git clone --bare $(FNORD_URL) $@ mcp-source: $(MCP_BUILDDIR)/source -$(MCP_BUILDDIR)/source: $(MCP_FNORD_TARCACHE) +$(MCP_BUILDDIR)/source: $(FNORD_CACHE) mkdir -p $(@D) - bzcat $< | (cd $(@D) && tar xf -) - (cd $(@D)/fnord-$(MCP_FNORD_VERSION) && patch -p 1) < packages/mcp/fnord.patch + git clone $(FNORD_CACHE) $(@D)/fnord touch $@ mcp-build: $(MCP_BUILDDIR)/build $(MCP_BUILDDIR)/build: $(MCP_BUILDDIR)/source $(MAKE) -C packages/mcp/src build - $(MAKE) -C $(MCP_BUILDDIR)/fnord-$(MCP_FNORD_VERSION) DIET= CC=$(CC) fnord-cgi + $(MAKE) -C $(MCP_BUILDDIR)/fnord DIET= CC=$(CC) fnord-cgi mcp-install: $(MCP_BUILDDIR)/build @@ -31,7 +32,7 @@ mcp-install: $(MCP_BUILDDIR)/build cp packages/mcp/src/pointscli $(MCP_PKGDIR)/bin/ cp packages/mcp/src/puzzles.cgi $(MCP_PKGDIR)/bin/ - cp $(MCP_BUILDDIR)/fnord-$(MCP_FNORD_VERSION)/fnord-cgi $(MCP_PKGDIR)/bin/ + cp $(MCP_BUILDDIR)/fnord/fnord-cgi $(MCP_PKGDIR)/bin/ $(call COPYTREE, packages/mcp/service, $(MCP_PKGDIR)/service) diff --git a/packages/mcp/service/httpd/run b/packages/mcp/service/httpd/run index a183245..7a96666 100755 --- a/packages/mcp/service/httpd/run +++ b/packages/mcp/service/httpd/run @@ -18,8 +18,4 @@ for d in /opt/*; do fi done - -mkdir -p sites -cd sites -ln -sf /var/www default -exec tcpsvd -u ctf ${IP%/*} 80 /opt/mcp/bin/fnord-cgi +exec tcpsvd -u ctf ${IP%/*} 80 /opt/mcp/bin/fnord-cgi /var/www diff --git a/packages/mcp/service/puzzled/run b/packages/mcp/service/puzzled/run index 261eaf7..c154128 100755 --- a/packages/mcp/service/puzzled/run +++ b/packages/mcp/service/puzzled/run @@ -4,6 +4,9 @@ exec 2>&1 DB=/var/lib/ctf/puzzles.db +# Create CTF user +touch /etc/group /etc/passwd +addgroup -g 56634 nogroup || true adduser -D -S -h /var/lib/ctf -H ctf || true mkdir -p /var/lib/ctf /var/www From 46404a366715ebf08b17d0bbb9b84fa66e84cc7c Mon Sep 17 00:00:00 2001 From: Neale Pickett Date: Thu, 13 Oct 2011 17:22:03 -0600 Subject: [PATCH 09/25] Verified claim.cgi, puzzled, scoreboard. Looking good. --- packages/mcp/bin/scoreboard | 2 +- packages/mcp/service/pointsd/pointsd | 28 ++++++---------------- packages/mcp/service/pointsd/run | 36 +++++++++++++++++++++++----- packages/mcp/service/puzzled/run | 10 +++----- 4 files changed, 41 insertions(+), 35 deletions(-) diff --git a/packages/mcp/bin/scoreboard b/packages/mcp/bin/scoreboard index 3522446..1f2dac3 100755 --- a/packages/mcp/bin/scoreboard +++ b/packages/mcp/bin/scoreboard @@ -1,4 +1,4 @@ -#! /usr/bin/awk -f +#! /bin/awk -f ## ## diff --git a/packages/mcp/service/pointsd/pointsd b/packages/mcp/service/pointsd/pointsd index d1d7e72..a6fc72f 100755 --- a/packages/mcp/service/pointsd/pointsd +++ b/packages/mcp/service/pointsd/pointsd @@ -1,28 +1,14 @@ #! /bin/sh -# First argument is seconds between running everything -period=${1:-60} - -NEWPOINTS=/var/lib/ctf/points.new +fn=$2/$3 POINTS=/var/lib/ctf/points.log SCOREBOARD=/var/www/scoreboard.html -if ! [ -f $SCOREBOARD ]; then - /opt/mcp/bin/scoreboard < $POINTS > $SCOREBOARD +cat $fn >> $POINTS || break +rm $fn + +# Render scoreboard +if [ $POINTS -nt $SCOREBOARD ]; then + /opt/mcp/bin/scoreboard < $POINTS > $SCOREBOARD.new && mv $SCOREBOARD.new $SCOREBOARD fi -while true; do - # Collect any new points - for fn in $NEWPOINTS/*; do - [ -f $fn ] || continue - cat $fn >> $POINTS || break - rm $fn - done - - # Render scoreboard - if [ $POINTS -nt $SCOREBOARD ]; then - /opt/mcp/bin/scoreboard < $POINTS > $SCOREBOARD.new && mv $SCOREBOARD.new $SCOREBOARD - fi - - sleep $period -done diff --git a/packages/mcp/service/pointsd/run b/packages/mcp/service/pointsd/run index a7d63bd..ea3d1ac 100755 --- a/packages/mcp/service/pointsd/run +++ b/packages/mcp/service/pointsd/run @@ -1,13 +1,37 @@ -#! /bin/sh +#! /bin/sh -e exec 2>&1 -install -o ctf -m 0755 -d /var/lib/ctf/points.new +install -d /var/lib/ctf + +# Create CTF user +touch /etc/group /etc/passwd +addgroup -g 56634 nogroup || true +adduser -D -S -h /var/lib/ctf -H ctf || true + +NEWDIR=/var/lib/ctf/points.new + +install -d /var/www +install -o ctf -m 0755 -d $NEWDIR install -o ctf -m 0755 -d /var/lib/ctf/points.tmp touch /var/lib/ctf/points.log -# Re-populate teams list for tanks -ls $base/teams/names | KEY="Too much cheese." /opt/mcp/bin/arc4 > $www/teams.txt.$$ -mv $www/teams.txt.$$ $www/teams.txt +# Generate preliminary scoreboard +if ! [ -f /var/www/scoreboard.html ]; then + /opt/mcp/bin/scoreboard < /dev/null > /var/www/scoreboard.html +fi -exec ./pointsd + +if [ -x /sbin/inotifyd ]; then + exec /sbin/inotifyd ./pointsd $NEWDIR:y +fi + +# Simulate inotifyd +cd $NEWDIR +while true; do + for fn in *; do + [ -f "$fn" ] || continue + ./pointsd m $NEWDIR $fn + done + sleep 7 +done diff --git a/packages/mcp/service/puzzled/run b/packages/mcp/service/puzzled/run index c154128..08f8d43 100755 --- a/packages/mcp/service/puzzled/run +++ b/packages/mcp/service/puzzled/run @@ -2,14 +2,10 @@ exec 2>&1 +install -d /var/www + +# Install truncates files DB=/var/lib/ctf/puzzles.db - -# Create CTF user -touch /etc/group /etc/passwd -addgroup -g 56634 nogroup || true -adduser -D -S -h /var/lib/ctf -H ctf || true - -mkdir -p /var/lib/ctf /var/www touch $DB chown ctf $DB From 7c7fcb294950a6769254d3927053ca8c2c6de52c Mon Sep 17 00:00:00 2001 From: Neale Pickett Date: Thu, 13 Oct 2011 21:15:11 -0600 Subject: [PATCH 10/25] add multicaster, verify token junk --- packages/mcp/service/pointsd/run | 16 +- packages/mcp/www/index.html | 1 + packages/multicaster/multicaster.mk | 3 + packages/multicaster/src/Makefile | 2 +- .../src/multicaster-serverAWESOME.c | 178 ------------------ packages/multicaster/src/multicaster.c | 166 ++++++++++++++++ 6 files changed, 186 insertions(+), 180 deletions(-) delete mode 100644 packages/multicaster/src/multicaster-serverAWESOME.c create mode 100644 packages/multicaster/src/multicaster.c diff --git a/packages/mcp/service/pointsd/run b/packages/mcp/service/pointsd/run index ea3d1ac..104d477 100755 --- a/packages/mcp/service/pointsd/run +++ b/packages/mcp/service/pointsd/run @@ -9,11 +9,25 @@ touch /etc/group /etc/passwd addgroup -g 56634 nogroup || true adduser -D -S -h /var/lib/ctf -H ctf || true +# Set up base directories NEWDIR=/var/lib/ctf/points.new - install -d /var/www +install -d /var/lib/ctf install -o ctf -m 0755 -d $NEWDIR install -o ctf -m 0755 -d /var/lib/ctf/points.tmp + +# Make tokens database now, this is as good a time as any +TOKENS=/var/lib/ctf/tokens.db +for fn in $TOKENS /opt/*/tokens.txt; do + [ -f "$fn" ] || continue + cat $fn +done | sort | uniq > $TOKENS.new +mv $TOKENS.new $TOKENS + +# Create some files +CLAIM=/var/lib/ctf/claim.db +touch $CLAIM +chown ctf $CLAIM touch /var/lib/ctf/points.log # Generate preliminary scoreboard diff --git a/packages/mcp/www/index.html b/packages/mcp/www/index.html index 82b48c1..6eb124c 100644 --- a/packages/mcp/www/index.html +++ b/packages/mcp/www/index.html @@ -46,6 +46,7 @@ No DoS attacks.
  • + Contest servers lie within fd84:b410:3441::/112. Do not attack machines outside fd84:b410:3441::/48. Low ports (under 1024) do not run contest categories, don't waste your time. diff --git a/packages/multicaster/multicaster.mk b/packages/multicaster/multicaster.mk index ce8e15c..9e7fed6 100644 --- a/packages/multicaster/multicaster.mk +++ b/packages/multicaster/multicaster.mk @@ -2,6 +2,9 @@ MULTICASTER_PKGDIR = $(TARGET)/multicaster multicaster-install: multicaster-build mkdir -p $(MULTICASTER_PKGDIR) + cp packages/multicaster/tokens.txt $(MULTICASTER_PKGDIR) + + $(call COPYTREE, packages/multicaster/service, $(MULTICASTER_PKGDIR)/service) mkdir -p $(MULTICASTER_PKGDIR)/bin/ $(MAKE) -C packages/multicaster/src install DESTDIR=$(CURDIR)/$(MULTICASTER_PKGDIR) diff --git a/packages/multicaster/src/Makefile b/packages/multicaster/src/Makefile index bf4eb10..219a13b 100644 --- a/packages/multicaster/src/Makefile +++ b/packages/multicaster/src/Makefile @@ -1,5 +1,5 @@ CFLAGS = -Wall -Werror -TARGETS = multicaster-server multicaster-client +TARGETS = multicaster all: build build: $(TARGETS) diff --git a/packages/multicaster/src/multicaster-serverAWESOME.c b/packages/multicaster/src/multicaster-serverAWESOME.c deleted file mode 100644 index d8b69d0..0000000 --- a/packages/multicaster/src/multicaster-serverAWESOME.c +++ /dev/null @@ -1,178 +0,0 @@ -/* multicast_server.c - * Adapted from tmouse's IPv6 client/server example code - * found at http://cboard.cprogramming.com/showthread.php?t=67469 - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static void DieWithError(const char* errorMessage) -{ - fprintf(stderr, "%s\n", errorMessage); - exit(1); -} - -int main(int argc, char *argv[]) -{ - int sender, listener; /* Sockets */ - char* multicastIP; /* Arg: IP Multicast address */ - char* multicastPort; /* Arg: Server port */ - char* token; - size_t tokenlen; - struct addrinfo * multicastAddr; /* Multicast address */ - struct addrinfo hints = { 0 }; /* Hints for name lookup */ - struct timeval timeout = { 0 }; - - if (argc != 4) - { - fprintf(stderr, "Usage: %s \n", argv[0]); - exit(1); - } - - multicastIP = argv[1]; /* First arg: multicast IP address */ - multicastPort = argv[2]; /* Second arg: multicast port */ - token = argv[3]; - tokenlen = strlen(token); - - /* Resolve destination address for multicast datagrams */ - hints.ai_family = PF_INET6; - hints.ai_socktype = SOCK_DGRAM; - hints.ai_flags = AI_NUMERICHOST; - - if (getaddrinfo(multicastIP, multicastPort, &hints, &multicastAddr) != 0) - { - DieWithError("getaddrinfo() failed"); - } - - /* Create socket for sending multicast datagrams */ - if ((sender = socket(multicastAddr->ai_family, multicastAddr->ai_socktype, 0)) == -1) - { - DieWithError("socket() failed"); - } - - /* Create socket for recieving multicast datagrams */ - if ((listener = socket(multicastAddr->ai_family, multicastAddr->ai_socktype, 0)) == -1) - { - DieWithError("socket() failed"); - } - - { - int hops = 5; - if (setsockopt(sender, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &hops, sizeof(hops)) != 0) - { - DieWithError("setsockopt(MULTICAST_HOPS) failed"); - } - } - - /* Bind to the multicast port */ - if (bind(listener, multicastAddr->ai_addr, multicastAddr->ai_addrlen) != 0) - { - DieWithError("bind() failed"); - } - - /* Join the multicast group. */ - if ((multicastAddr->ai_family == PF_INET6)&&(multicastAddr->ai_addrlen == sizeof(struct sockaddr_in6))) - { - struct sockaddr_in6 *addr = (struct sockaddr_in6 *)(multicastAddr->ai_addr); - struct ipv6_mreq multicastRequest; /* Multicast address join structure */ - - /* Specify the multicast group */ - memcpy(&multicastRequest.ipv6mr_multiaddr, &(addr)->sin6_addr, sizeof(multicastRequest.ipv6mr_multiaddr)); - - /* Accept multicast from any interface */ - multicastRequest.ipv6mr_interface = addr->sin6_scope_id; - - /* Join the multicast address */ - if (setsockopt(listener, IPPROTO_IPV6, IPV6_JOIN_GROUP, (char*) &multicastRequest, sizeof(multicastRequest)) != 0) - { - DieWithError("setsockopt(IPV6_JOIN_GROUP) failed"); - } - } else { - DieWithError("Not IPv6"); - } - - for (;;) /* Run forever */ - { - int n; - int max_fd; - fd_set input; - - char recvString[500]; /* Buffer for received string */ - int recvStringLen; /* Length of received string */ - - char sendString[] = "Say Hello\n"; - size_t sendStringLen = sizeof(sendString)-1; - char errorString[] = "That is not correct! Try again!\n"; - - struct sockaddr_in6 from; - socklen_t fromlen = sizeof(from); - - FD_ZERO(&input); - FD_SET(listener, &input); - - max_fd = listener + 1; - - if (timeout.tv_usec < 100) - { - timeout.tv_sec = 1; - timeout.tv_usec = 0; - - int sendLen = sendto(sender, sendString, sendStringLen, 0, multicastAddr->ai_addr, - multicastAddr->ai_addrlen); - if (sendLen == sendStringLen) - { - printf("Sent [%s] (%i bytes) to %s, port %s\n", sendString, sendLen, - multicastIP, multicastPort); - } else { - DieWithError("sendto() sent a different number of bytes than expected"); - } - } - - n = select(max_fd, &input, NULL, NULL, &timeout); - - /* See if there was an error */ - if (n < 0) - { - perror("select failed"); - } else if (n == 0) { - puts("TIMEOUT"); - } else { - if (FD_ISSET(listener, &input)) - { - recvStringLen = recvfrom(listener, recvString, sizeof(recvString) - 1, 0, - (struct sockaddr *)&from, &fromlen); - /* Receive a single datagram from the server */ - if (recvStringLen < 0) - { - DieWithError("recvfrom() failed"); - } - - recvString[recvStringLen] = '\0'; - if (strcmp(recvString, "hello")==0) - { - printf("Correct!!\n"); - sendto(listener, token, sizeof(sendString), 0, (struct sockaddr *)&from, fromlen); - } else if (strcmp(recvString, sendString)!=0) { - sendto(listener, errorString, sizeof(errorString), 0, (struct sockaddr *)&from, fromlen); - } - - /* Print the received string */ - printf("Received string [%s]\n", recvString); - } - } - } - - /* NOT REACHED */ - freeaddrinfo(multicastAddr); - close(sender); - close(listener); - - return 0; -} diff --git a/packages/multicaster/src/multicaster.c b/packages/multicaster/src/multicaster.c new file mode 100644 index 0000000..0689959 --- /dev/null +++ b/packages/multicaster/src/multicaster.c @@ -0,0 +1,166 @@ +/* multicast_server.c + * Adapted from tmouse's IPv6 client/server example code + * found at http://cboard.cprogramming.com/showthread.php?t=67469 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static void +DieWithError(const char* errorMessage) +{ + fprintf(stderr, "%s\n", errorMessage); + exit(1); +} + +int +main(int argc, char *argv[]) +{ + int sender, listener; /* Sockets */ + char* multicastIP; /* Arg: IP Multicast address */ + char* multicastPort; /* Arg: Server port */ + char token[100]; + size_t tokenlen; + struct addrinfo * multicastAddr; /* Multicast address */ + struct addrinfo hints = { 0 }; /* Hints for name lookup */ + struct timeval timeout = { 0 }; + + if (argc != 3) + { + fprintf(stderr, "Usage: %s ADDRESS PORT ai_family == PF_INET6) && + (multicastAddr->ai_addrlen == sizeof(struct sockaddr_in6)))) { + DieWithError("Not IPv6"); + } + + /* Create socket for sending multicast datagrams */ + if ((sender = socket(multicastAddr->ai_family, multicastAddr->ai_socktype, 0)) == -1) { + DieWithError("socket() failed"); + } + + /* Create socket for recieving multicast datagrams */ + if ((listener = socket(multicastAddr->ai_family, multicastAddr->ai_socktype, 0)) == -1) { + DieWithError("socket() failed"); + } + + /* We need to go through a router, set hops to 5 */ + { + int hops = 5; + + if (setsockopt(sender, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &hops, sizeof(hops)) != 0) { + DieWithError("setsockopt(MULTICAST_HOPS) failed"); + } + } + + /* Bind to the multicast port */ + if (bind(listener, multicastAddr->ai_addr, multicastAddr->ai_addrlen) != 0) { + DieWithError("bind() failed"); + } + + + /* Join the multicast group. */ + { + struct sockaddr_in6 *addr = (struct sockaddr_in6 *)(multicastAddr->ai_addr); + struct ipv6_mreq multicastRequest; + + multicastRequest.ipv6mr_interface = addr->sin6_scope_id; + memcpy(&multicastRequest.ipv6mr_multiaddr, &(addr->sin6_addr), + sizeof(multicastRequest.ipv6mr_multiaddr)); + + if (setsockopt(listener, IPPROTO_IPV6, IPV6_JOIN_GROUP, + (char*)&multicastRequest, sizeof(multicastRequest)) != 0) { + DieWithError("setsockopt(IPV6_JOIN_GROUP) failed"); + } + } + + for (;;) { /* Run forever */ + int n; + int max_fd; + fd_set input; + + char recvString[500]; /* Buffer for received string */ + int recvStringLen; /* Length of received string */ + + char sendString[] = "If anyone is out there, please say hello\n"; + size_t sendStringLen = sizeof(sendString)-1; + char errorString[] = "Say what?\n"; + + struct sockaddr_in6 from; + socklen_t fromlen = sizeof(from); + + FD_ZERO(&input); + FD_SET(listener, &input); + + max_fd = listener + 1; + + if (timeout.tv_usec < 100) { + ssize_t sendLen; + + timeout.tv_sec = 1; + timeout.tv_usec = 0; + + sendLen = sendto(sender, sendString, sendStringLen, 0, multicastAddr->ai_addr, + multicastAddr->ai_addrlen); + if (sendLen != sendStringLen) { + DieWithError("sendto() sent a different number of bytes than expected"); + } + } + + n = select(max_fd, &input, NULL, NULL, &timeout); + + /* See if there was an error */ + if (n < 0) { + perror("select failed"); + } else if (FD_ISSET(listener, &input)) { + recvStringLen = recvfrom(listener, recvString, sizeof(recvString) - 1, 0, + (struct sockaddr *)&from, &fromlen); + /* Receive a single datagram from the server */ + if (recvStringLen < 0) { + DieWithError("recvfrom() failed"); + } + + recvString[recvStringLen] = '\0'; + if (strcmp(recvString, "hello")==0) { + sendto(listener, token, sizeof(sendString), 0, (struct sockaddr *)&from, + fromlen); + } else if (strcmp(recvString, sendString)!=0) { + sendto(listener, errorString, sizeof(errorString), 0, + (struct sockaddr *)&from, fromlen); + } + } + } + + /* NOT REACHED */ + freeaddrinfo(multicastAddr); + close(sender); + close(listener); + + return 0; +} From 29cd09bc705e364a60e01891b7209f46774aa78c Mon Sep 17 00:00:00 2001 From: Neale Pickett Date: Thu, 13 Oct 2011 21:24:29 -0600 Subject: [PATCH 11/25] make octopus use a changeable token --- packages/octopus/octopus.mk | 1 + packages/octopus/service/octopus/finish | 4 ---- packages/octopus/service/octopus/run | 6 +++--- packages/octopus/src/octopus.c | 10 ++++++++-- packages/octopus/tokens.txt | 1 + 5 files changed, 13 insertions(+), 9 deletions(-) delete mode 100755 packages/octopus/service/octopus/finish create mode 100644 packages/octopus/tokens.txt diff --git a/packages/octopus/octopus.mk b/packages/octopus/octopus.mk index 4e34aba..d0e2962 100644 --- a/packages/octopus/octopus.mk +++ b/packages/octopus/octopus.mk @@ -5,6 +5,7 @@ octopus-install: octopus-build $(call COPYTREE, packages/octopus/service, $(OCTOPUS_PKGDIR)/service) + cp packages/octopus/tokens.txt $(OCTOPUS_PKGDIR)/ cp packages/octopus/src/octopus $(OCTOPUS_PKGDIR)/bin/ octopus-clean: diff --git a/packages/octopus/service/octopus/finish b/packages/octopus/service/octopus/finish deleted file mode 100755 index 6317f74..0000000 --- a/packages/octopus/service/octopus/finish +++ /dev/null @@ -1,4 +0,0 @@ -#! /bin/sh - -IP=$(cat ip.txt) -ip addr del $IP dev eth0 diff --git a/packages/octopus/service/octopus/run b/packages/octopus/service/octopus/run index 3386b3d..66fc4e1 100755 --- a/packages/octopus/service/octopus/run +++ b/packages/octopus/service/octopus/run @@ -3,6 +3,6 @@ exec 2>&1 IP=$(cat ip.txt) -ip addr add $IP dev eth0 -ip monitor | grep -q $IP -exec /opt/octopus/bin/octopus ${IP%/*} +ip addr add $IP dev eth0 || true + +exec /opt/octopus/bin/octopus ${IP%/*} < /opt/octopus/tokens.txt diff --git a/packages/octopus/src/octopus.c b/packages/octopus/src/octopus.c index a205306..d1397bb 100644 --- a/packages/octopus/src/octopus.c +++ b/packages/octopus/src/octopus.c @@ -19,8 +19,8 @@ #define max(a,b) (((a)>(b))?(a):(b)) #endif -const char token[] = "octopus:xylep-radar-nanox"; -const size_t tokenlen = sizeof(token) - 1; +const char token[100]; +size_t tokenlen; char const octopus[] = (" ___\n" @@ -338,6 +338,12 @@ main(int argc, char *argv[]) memcpy(&addr, &in6addr_any, sizeof addr); } + if (NULL == fgets(token, sizeof(token), stdin)) { + perror("Unable to read token"); + return EX_IOERR; + } + tokenlen = strlen(token); + bound_ports[0].fd = socket(AF_INET6, SOCK_DGRAM, 0); ret = bind_port(&addr, bound_ports[0].fd, 8888); if (-1 == ret) { diff --git a/packages/octopus/tokens.txt b/packages/octopus/tokens.txt new file mode 100644 index 0000000..e7bf2cb --- /dev/null +++ b/packages/octopus/tokens.txt @@ -0,0 +1 @@ +net:xemim-civiz-tyrox From b87ec717c1417ffb77b565b5db4f12f49f835c2e Mon Sep 17 00:00:00 2001 From: Neale Pickett Date: Thu, 13 Oct 2011 22:12:53 -0600 Subject: [PATCH 12/25] add fizzbuzz --- packages/fizzbuzz/fizzbuzz-client.sh | 13 +++++++++++++ packages/fizzbuzz/fizzbuzz.mk | 29 ++++++++++++++++++++++++++++ packages/fizzbuzz/src/Makefile | 11 +++++++++++ packages/fizzbuzz/src/fizzbuzz.c | 7 ++++--- packages/fizzbuzz/tokens.txt | 1 + packages/mcp/service/pointsd/run | 5 +++-- packages/multicaster/src/Makefile | 2 +- 7 files changed, 62 insertions(+), 6 deletions(-) create mode 100755 packages/fizzbuzz/fizzbuzz-client.sh create mode 100644 packages/fizzbuzz/fizzbuzz.mk create mode 100644 packages/fizzbuzz/src/Makefile create mode 100644 packages/fizzbuzz/tokens.txt diff --git a/packages/fizzbuzz/fizzbuzz-client.sh b/packages/fizzbuzz/fizzbuzz-client.sh new file mode 100755 index 0000000..d6caa5e --- /dev/null +++ b/packages/fizzbuzz/fizzbuzz-client.sh @@ -0,0 +1,13 @@ +#! /bin/sh + +for i in $(seq 100); do + if [ $(expr $i % 15) = 0 ]; then + echo 'FizzBuzz' + elif [ $(expr $i % 3) = 0 ]; then + echo 'Fizz' + elif [ $(expr $i % 5) = 0 ]; then + echo 'Buzz' + else + echo $i + fi +done diff --git a/packages/fizzbuzz/fizzbuzz.mk b/packages/fizzbuzz/fizzbuzz.mk new file mode 100644 index 0000000..10dcac7 --- /dev/null +++ b/packages/fizzbuzz/fizzbuzz.mk @@ -0,0 +1,29 @@ +FIZZBUZZ_PKGDIR = $(TARGET)/fizzbuzz +FIZZBUZZ_BUILDDIR = $(BUILD)/fizzbuzz + +$(FIZZBUZZ_BUILDDIR)/token.enc: packages/fizzbuzz/tokens.txt +$(FIZZBUZZ_BUILDDIR)/token.enc: packages/fizzbuzz/fizzbuzz-client.sh +$(FIZZBUZZ_BUILDDIR)/token.enc: $(FIZZBUZZ_BUILDDIR)/fizzbuzz-native + packages/fizzbuzz/fizzbuzz-client.sh | $(FIZZBUZZ_BUILDDIR)/fizzbuzz-native 3< packages/fizzbuzz/tokens.txt > $@ + +$(FIZZBUZZ_BUILDDIR)/fizzbuzz-native: packages/fizzbuzz/src/fizzbuzz.c + @ mkdir -p $(@D) + cc -o $@ $< + +fizzbuzz-install: fizzbuzz-build + mkdir -p $(FIZZBUZZ_PKGDIR)/bin/ + + $(call COPYTREE, packages/fizzbuzz/service, $(FIZZBUZZ_PKGDIR)/service) + + cp packages/fizzbuzz/tokens.txt $(FIZZBUZZ_PKGDIR)/ + cp $(FIZZBUZZ_BUILDDIR)/token.enc $(FIZZBUZZ_PKGDIR)/ + cp packages/fizzbuzz/src/fizzbuzz $(FIZZBUZZ_PKGDIR)/bin/ + +fizzbuzz-clean: + rm -rf $(FIZZBUZZ_PKGDIR) $(FIZZBUZZ_BUILDDIR) + $(MAKE) -C packages/fizzbuzz/src clean + +fizzbuzz-build: $(FIZZBUZZ_BUILDDIR)/token.enc + $(MAKE) -C packages/fizzbuzz/src build + +PACKAGES += fizzbuzz diff --git a/packages/fizzbuzz/src/Makefile b/packages/fizzbuzz/src/Makefile new file mode 100644 index 0000000..cd3f866 --- /dev/null +++ b/packages/fizzbuzz/src/Makefile @@ -0,0 +1,11 @@ +CFLAGS = -Wall -Werror +TARGETS = fizzbuzz + +all: build +build: $(TARGETS) + +install: $(TARGETS) + install -m 0755 $(TARGETS) $(DESTDIR)/bin + +clean: + rm -f *.o $(TARGETS) diff --git a/packages/fizzbuzz/src/fizzbuzz.c b/packages/fizzbuzz/src/fizzbuzz.c index 41acb43..2b495e7 100644 --- a/packages/fizzbuzz/src/fizzbuzz.c +++ b/packages/fizzbuzz/src/fizzbuzz.c @@ -1,5 +1,6 @@ #include #include +#include /* * How this works: @@ -25,7 +26,7 @@ * echo $i * fi * done - * + * */ char craptable[] = { @@ -50,11 +51,11 @@ main(int argc, char *argv[]) printf("Somebody didn't read the instructions.\n"); return 1; } - + tokenlen = fread(token, 1, sizeof(token), tokenin); fclose(tokenin); } - + for (i=1; i <= 100; i += 1) { char l[100]; diff --git a/packages/fizzbuzz/tokens.txt b/packages/fizzbuzz/tokens.txt new file mode 100644 index 0000000..c55bea1 --- /dev/null +++ b/packages/fizzbuzz/tokens.txt @@ -0,0 +1 @@ +net:xuhen-fizuv-syvex diff --git a/packages/mcp/service/pointsd/run b/packages/mcp/service/pointsd/run index 104d477..d4f92f4 100755 --- a/packages/mcp/service/pointsd/run +++ b/packages/mcp/service/pointsd/run @@ -4,10 +4,11 @@ exec 2>&1 install -d /var/lib/ctf -# Create CTF user +# Create CTF and nobody users touch /etc/group /etc/passwd -addgroup -g 56634 nogroup || true +addgroup -g 65534 nogroup || true adduser -D -S -h /var/lib/ctf -H ctf || true +adduser -D -g nogroup -u 65534 -h /tmp -H nobody || true # Set up base directories NEWDIR=/var/lib/ctf/points.new diff --git a/packages/multicaster/src/Makefile b/packages/multicaster/src/Makefile index 219a13b..c5faabb 100644 --- a/packages/multicaster/src/Makefile +++ b/packages/multicaster/src/Makefile @@ -8,4 +8,4 @@ install: $(TARGETS) install -m 0755 $(TARGETS) $(DESTDIR)/bin clean: - rm -f *.o $(TARGETS) \ No newline at end of file + rm -f *.o $(TARGETS) From e42da095d118f0281fb53d7d6de062f91e5d8749 Mon Sep 17 00:00:00 2001 From: Neale Pickett Date: Thu, 13 Oct 2011 22:14:35 -0600 Subject: [PATCH 13/25] add some stuff I forgot (it's late) --- packages/fizzbuzz/service/fizzbuzz/ip.txt | 1 + packages/fizzbuzz/service/fizzbuzz/log/run | 3 +++ packages/fizzbuzz/service/fizzbuzz/run | 8 ++++++++ packages/multicaster/service/multicaster/ip.txt | 1 + packages/multicaster/service/multicaster/log/run | 3 +++ packages/multicaster/service/multicaster/run | 8 ++++++++ packages/multicaster/tokens.txt | 1 + 7 files changed, 25 insertions(+) create mode 100644 packages/fizzbuzz/service/fizzbuzz/ip.txt create mode 100755 packages/fizzbuzz/service/fizzbuzz/log/run create mode 100755 packages/fizzbuzz/service/fizzbuzz/run create mode 100644 packages/multicaster/service/multicaster/ip.txt create mode 100755 packages/multicaster/service/multicaster/log/run create mode 100755 packages/multicaster/service/multicaster/run create mode 100644 packages/multicaster/tokens.txt diff --git a/packages/fizzbuzz/service/fizzbuzz/ip.txt b/packages/fizzbuzz/service/fizzbuzz/ip.txt new file mode 100644 index 0000000..c4d788a --- /dev/null +++ b/packages/fizzbuzz/service/fizzbuzz/ip.txt @@ -0,0 +1 @@ +fd84:b410:3441::a0d/64 diff --git a/packages/fizzbuzz/service/fizzbuzz/log/run b/packages/fizzbuzz/service/fizzbuzz/log/run new file mode 100755 index 0000000..1e7bd9d --- /dev/null +++ b/packages/fizzbuzz/service/fizzbuzz/log/run @@ -0,0 +1,3 @@ +#! /bin/sh + +exec svlogd -tt $PWD diff --git a/packages/fizzbuzz/service/fizzbuzz/run b/packages/fizzbuzz/service/fizzbuzz/run new file mode 100755 index 0000000..47aef25 --- /dev/null +++ b/packages/fizzbuzz/service/fizzbuzz/run @@ -0,0 +1,8 @@ +#! /bin/sh -e + +exec 2>&1 + +IP=$(cat ip.txt) +ip addr add $IP dev eth0 || true + +exec tcpsvd -u nobody ${IP%/*} 1013 /opt/fizzbuzz/bin/fizzbuzz 3&1 + +IP=$(cat ip.txt) +ip addr add $IP dev eth0 || true + +exec setuidgid ctf /opt/multicaster/bin/multicaster ff15::62c 1580 Date: Fri, 14 Oct 2011 12:42:02 -0600 Subject: [PATCH 14/25] Add TF4 savethedate and an Inferno article --- doc/2011-09-Inferno/LLNL-article.pdf | Bin 0 -> 134655 bytes doc/2012-02-TF4/savethedate-color.pdf | Bin 0 -> 26384 bytes doc/2012-02-TF4/savethedate.pdf | Bin 0 -> 25319 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/2011-09-Inferno/LLNL-article.pdf create mode 100644 doc/2012-02-TF4/savethedate-color.pdf create mode 100644 doc/2012-02-TF4/savethedate.pdf diff --git a/doc/2011-09-Inferno/LLNL-article.pdf b/doc/2011-09-Inferno/LLNL-article.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9b124b455eb6d42432e5e6101ae8fa3a8f58605a GIT binary patch literal 134655 zcmb5VRd5_l&?P!zW+sc7nI(&vnJpMGj&MW1^2%h zO?Fv3M-L!~UDnau11Jr&bg=@8i6OgtfPm&s$UfPV2BVSGa+uvudJC&FnZ`_M(3J6t z_Vq3>XkvtUUEj?et=awr*f?frr0AH4x;Jnxl`BpDT!Z-funp0u*amROs^VZeGuCb_dacFXz|dIWgTL$Bk}jcYEy9kB&o1 zV5A#tl@5{4#!>5EGP`?wtH$Q1XyjJhS;Fk>UroW?{^xE;$9K?QyM8V$8B6}WJi+v7 zIP~|&A8%P|fSW$dHvY@R?#@YP^wrHqcyHb@2<;2fmDyG-&V^<*rws}F^r_?go{%lu zWptX(^z{uczs>yc_;j7Ph^T3vm~%U)>i6uEOq>|*=Z{%fu;uvGRzHzvV_g3+WxF}) zJtLZ>YMGmBk+=*Tu?U(Em4D*eotcT{qi21I#0$rpjkjW#XhTOj| z(|x-Rt(CRK@fplH)d)?KgW81yaNN-vdr4uwR5fAiF4hJ0CwUHbXOO3&`B?ts>Z8+p zPxBgxtEnRZ88^wzEU6DKnURX%U`~Iv?6}_!iK-a z2^-7N6^xqfm;5CA(cB53D=Njy2l}2q<*y5# zgpKRIhFD41bc<9DGd=tQKPJ@Oq&5qb&8#3+vW&CMvjT&3 zn2b!u&Q!JI4&M^y5tA)hH=TO(b4%Z9&O5TfF`_|1y?0Mho)o1=pG=x9o(1%kVlF5Roz!|9lBJfX@DmG#>SIn^T@MmT1XSAXY$iXY6+jT@sBc20$iH2DtZsw zf)uWTD@c~xbRoM5F(AyIw?lzPv|{f2rlGD*a8lOB!uez|H#}{ZH6ClMWHrP`d@hC= z&-3~gCVYeEH*`;5rwt1QvP&JS9tax0PqX1kGbYW7?S~FZN#~LWNX8V>Ay9FZgD0bH zZ@r8)MJNKhSrbfAn?phg5yvJ@yRb7vQ9+Awl4Rs^`LbAEapzXTXA=eK2J$9U|E8EO zIg)L&n?T|4qI=*qZz!&_RUQ9a;WxoAZh*c zarheL6SzNWf(Mhfv2`5O{8{DmIEi96Ia}IbqitYH*&8jNGaI!2b`OVcT3ER}#e0!% zyzUQ{$~Lixh0M6N>Cs9~jfI{|cBuJp9gEk@F7kshTBsl>?za|-08voY&Ap4llJ-Dl z*eT+&+XVz!Pu=)4^k%%Tj}XGH#=7D{fcLry1BS!P4oRHlH)0n(sr6=P4LIc;!|%5` zC}wM$iPBzr^a$k$^}9?`ubf z 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 literal 0 HcmV?d00001 diff --git a/doc/2012-02-TF4/savethedate-color.pdf b/doc/2012-02-TF4/savethedate-color.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a9126dc34efa932cacd69e1740597c71ce228f65 GIT binary patch literal 26384 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

    f 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 Jo{}W?e*wdYp-2D# literal 0 HcmV?d00001 From dc3474df0f760ca45e1ff278986417665a1bec74 Mon Sep 17 00:00:00 2001 From: Neale Pickett Date: Fri, 14 Oct 2011 22:10:25 -0600 Subject: [PATCH 15/25] printf working --- packages/printf/printf.mk | 1 + packages/printf/service/printf/run-printf | 2 +- packages/printf/src/printf.c | 31 ++++++++++++++++++----- packages/printf/tokens.txt | 5 ++++ 4 files changed, 31 insertions(+), 8 deletions(-) create mode 100644 packages/printf/tokens.txt diff --git a/packages/printf/printf.mk b/packages/printf/printf.mk index 520985d..cc22d75 100644 --- a/packages/printf/printf.mk +++ b/packages/printf/printf.mk @@ -7,6 +7,7 @@ printf-install: printf-build $(MAKE) -C packages/printf/src install DESTDIR=$(CURDIR)/$(PRINTF_PKGDIR) $(call COPYTREE, packages/printf/service, $(PRINTF_PKGDIR)/service) + cp packages/printf/tokens.txt $(PRINTF_PKGDIR)/ printf-clean: rm -rf $(PRINTF_PKGDIR) diff --git a/packages/printf/service/printf/run-printf b/packages/printf/service/printf/run-printf index 0f6bd9b..49789b9 100755 --- a/packages/printf/service/printf/run-printf +++ b/packages/printf/service/printf/run-printf @@ -1,3 +1,3 @@ #! /bin/sh -exec chpst -u 9001 -/ /opt/printf/bin ./printf +exec chpst -u 9001 -/ /opt/printf/bin ./printf 3 Date: Wed, 19 Oct 2011 16:16:57 -0600 Subject: [PATCH 16/25] add router sanity check, fix mcp race condition --- packages/mcp/service/httpd/finish | 4 ---- packages/mcp/service/httpd/run | 12 +++++++----- packages/mcp/www/ctf.css | 2 +- packages/octopus/solution.sh | 4 ++-- packages/router/service/router/run | 14 ++++++++++++-- packages/router/service/sshd/run | 2 +- 6 files changed, 23 insertions(+), 15 deletions(-) delete mode 100755 packages/mcp/service/httpd/finish diff --git a/packages/mcp/service/httpd/finish b/packages/mcp/service/httpd/finish deleted file mode 100755 index 6317f74..0000000 --- a/packages/mcp/service/httpd/finish +++ /dev/null @@ -1,4 +0,0 @@ -#! /bin/sh - -IP=$(cat ip.txt) -ip addr del $IP dev eth0 diff --git a/packages/mcp/service/httpd/run b/packages/mcp/service/httpd/run index 7a96666..6f875be 100755 --- a/packages/mcp/service/httpd/run +++ b/packages/mcp/service/httpd/run @@ -1,17 +1,19 @@ -#! /bin/sh +#! /bin/sh -e exec 2>&1 +hostname mcp + # Bring up address IP=$(cat ip.txt) -ip addr add $IP dev eth0 -ip monitor | grep -q $IP +ip addr add $IP dev eth0 || true # Link in puzzles and web pages install -d /var/www for d in /opt/*; do - if [ -d $d/puzzles ]; then - ln -sf $d/puzzles /var/www/$(basename $d) + w=/var/www/$(basename $d) + if [ -d $d/puzzles ] && ! [ -d $w ]; then + ln -sf $d/puzzles $w fi if [ -d $d/www ]; then ln -sf $d/www/* /var/www/ diff --git a/packages/mcp/www/ctf.css b/packages/mcp/www/ctf.css index c8e571e..0082719 100644 --- a/packages/mcp/www/ctf.css +++ b/packages/mcp/www/ctf.css @@ -46,7 +46,7 @@ h1:first-child { h1:first-child:before { letter-spacing: -0.1em; - content: "Capture The Flag: "; + content: "NSM FIRE: "; } /**** body ****/ diff --git a/packages/octopus/solution.sh b/packages/octopus/solution.sh index d99139b..7d97293 100755 --- a/packages/octopus/solution.sh +++ b/packages/octopus/solution.sh @@ -1,9 +1,9 @@ #! /bin/sh port=8888 -host=${1:-[::1]} +host=[${1:-::1}] -blooper=$(tempfile) +blooper=/tmp/bloop.$$ trap "rm $blooper" 0 echo foo | socat -t 0.01 STDIO UDP6:$host:$port | tail -n +5 > $blooper diff --git a/packages/router/service/router/run b/packages/router/service/router/run index 8a9c36f..54fd6b9 100755 --- a/packages/router/service/router/run +++ b/packages/router/service/router/run @@ -4,9 +4,19 @@ exec 2>&1 PFX=fd84:b410:3441 -hostname router +log () { + echo "router: $@" + echo "router: $@" > /dev/console +} -# We're a router +if [ $(mount | grep -c /opt/) -gt 1 ]; then + log "cannot run alongside other packages" > /dev/console + exit 1 +fi + + +# I'm a router +hostname router echo 1 > /proc/sys/net/ipv6/conf/all/forwarding # Bring up main ethernet interface diff --git a/packages/router/service/sshd/run b/packages/router/service/sshd/run index 6d4ef96..cfe1216 100755 --- a/packages/router/service/sshd/run +++ b/packages/router/service/sshd/run @@ -2,6 +2,6 @@ exec 2>&1 -[ -r /etc/passwd ] || echo 'root:$1$xAJ7KwiU$BeKJjYGs9r/hY9Ag4qv4I1:0:0:root:/tmp:/bin/sh' > /etc/passwd +echo 'root:$1$xAJ7KwiU$BeKJjYGs9r/hY9Ag4qv4I1:0:0:root:/tmp:/bin/sh' > /etc/passwd exec dropbear -r ./rsa.key -E -F From 99c3ed20ab79eeb2470b882a0b0b71d447044b27 Mon Sep 17 00:00:00 2001 From: Neale Pickett Date: Tue, 1 Nov 2011 18:56:04 -0600 Subject: [PATCH 17/25] add revwords package --- packages/fizzbuzz/service/fizzbuzz/go | 3 + packages/fizzbuzz/service/fizzbuzz/run | 2 +- packages/revwords/revwords.mk | 20 ++++ packages/revwords/service/revwords/go | 3 + packages/revwords/service/revwords/ip.txt | 1 + packages/revwords/service/revwords/log/run | 3 + packages/revwords/service/revwords/run | 9 ++ packages/revwords/src/Makefile | 6 ++ packages/revwords/src/revwords.c | 105 +++++++++++++++++++++ packages/revwords/src/solution.sh | 19 ++++ packages/revwords/tokens.txt | 1 + 11 files changed, 171 insertions(+), 1 deletion(-) create mode 100755 packages/fizzbuzz/service/fizzbuzz/go create mode 100644 packages/revwords/revwords.mk create mode 100755 packages/revwords/service/revwords/go create mode 100644 packages/revwords/service/revwords/ip.txt create mode 100755 packages/revwords/service/revwords/log/run create mode 100755 packages/revwords/service/revwords/run create mode 100644 packages/revwords/src/Makefile create mode 100644 packages/revwords/src/revwords.c create mode 100755 packages/revwords/src/solution.sh create mode 100644 packages/revwords/tokens.txt diff --git a/packages/fizzbuzz/service/fizzbuzz/go b/packages/fizzbuzz/service/fizzbuzz/go new file mode 100755 index 0000000..f463309 --- /dev/null +++ b/packages/fizzbuzz/service/fizzbuzz/go @@ -0,0 +1,3 @@ +#! /bin/sh + +exec /opt/fizzbuzz/bin/fizzbuzz 3&1 IP=$(cat ip.txt) ip addr add $IP dev eth0 || true -exec tcpsvd -u nobody ${IP%/*} 1013 /opt/fizzbuzz/bin/fizzbuzz 3&1 + +IP=$(cat ip.txt) +ip addr add $IP dev eth0 || true + +exec tcpsvd -u nobody ${IP%/*} 1013 ./go + diff --git a/packages/revwords/src/Makefile b/packages/revwords/src/Makefile new file mode 100644 index 0000000..5c328e7 --- /dev/null +++ b/packages/revwords/src/Makefile @@ -0,0 +1,6 @@ +CFLAGS = -Wall -Werror + +build: revwords + +clean: + rm -f revwords diff --git a/packages/revwords/src/revwords.c b/packages/revwords/src/revwords.c new file mode 100644 index 0000000..8a6c36d --- /dev/null +++ b/packages/revwords/src/revwords.c @@ -0,0 +1,105 @@ +#include +#include +#include +#include +#include + +#define XDEBUG + +int +once() +{ + char sdrow[25][10]; + int nwords = 5 + (rand() % 2); + int i; + +#ifdef DEBUG + nwords = 2; +#endif + + for (i = 0; i < nwords; i += 1) { + char *drow = sdrow[i]; + int len = 4 + (rand() % 6); + int j; + + if (i > 0) putchar(' '); + for (j = 0; j < len; j += 1) { + char c = 'a' + (rand() % 26); + + putchar(c); + drow[len-j-1] = c; + } + + drow[j] = 0; + } + +#ifdef DEBUG + printf (" (answer: "); + for (i = 0; i < nwords; i += 1) { + if (i > 0) putchar(' '); + printf("%s", sdrow[i]); + } + putchar(')'); +#endif + + putchar('\n'); + fflush(stdout); + + for (i = 0; i < nwords; i += 1) { + char *p; + + if (i > 0) { + if (getchar() != ' ') return -1; + } + for (p = sdrow[i]; *p; p += 1) { + int c = getchar(); + + if (c != *p) return -1; + } + } + if (getchar() != '\n') return -1; + + return 0; +} + + +int +main(int argc, char *argv[]) +{ + char token[100]; + int i; + + { + FILE *tokenin = fdopen(3, "r"); + + if (! tokenin) { + fprintf(stderr, "Somebody didn't read the instructions.\n"); + return 1; + } + + if (NULL == fgets(token, sizeof(token), tokenin)) { + fprintf(stderr, "Error reading token.\n"); + return 1; + } + + fclose(tokenin); + } + + +#ifndef DEBUG + /* don't hang around forever waiting for input */ + alarm(3); +#endif + + srandom(time(NULL) * getpid()); + + for (i = 0; i < 12; i += 1) { + if (-1 == once()) { + printf("tahT saw ton tahw I saw gnitcepxe\n"); + return 1; + } + } + fputs(token, stdout); + + return 0; +} diff --git a/packages/revwords/src/solution.sh b/packages/revwords/src/solution.sh new file mode 100755 index 0000000..da8910d --- /dev/null +++ b/packages/revwords/src/solution.sh @@ -0,0 +1,19 @@ +#! /bin/sh + +## Run like this: +## +## socat EXEC:./solution.sh EXEC:./revwords 3&2 + enil=$(lrev $line) + echo $enil +done \ No newline at end of file diff --git a/packages/revwords/tokens.txt b/packages/revwords/tokens.txt new file mode 100644 index 0000000..58c779f --- /dev/null +++ b/packages/revwords/tokens.txt @@ -0,0 +1 @@ +net:xetil-tuhet-calyx From 11d5a6509725bd0843dbba39a3dc24358336233c Mon Sep 17 00:00:00 2001 From: Neale Pickett Date: Thu, 3 Nov 2011 18:50:42 -0600 Subject: [PATCH 18/25] add Kate-o's radio --- packages/radio/radio.mk | 13 +++ packages/radio/tokens.txt | 58 +++++++++++++ packages/radio/www/radio.html | 150 ++++++++++++++++++++++++++++++++++ 3 files changed, 221 insertions(+) create mode 100644 packages/radio/radio.mk create mode 100644 packages/radio/tokens.txt create mode 100644 packages/radio/www/radio.html diff --git a/packages/radio/radio.mk b/packages/radio/radio.mk new file mode 100644 index 0000000..58b1489 --- /dev/null +++ b/packages/radio/radio.mk @@ -0,0 +1,13 @@ +RADIO_PKGDIR = $(TARGET)/radio + +radio-build: + +radio-install: + mkdir -p $(RADIO_PKGDIR) + + $(call COPYTREE, packages/radio/www, $(RADIO_PKGDIR)/www) + +radio-clean: + rm -rf $(RADIO_BUILDDIR) + +PACKAGES += radio \ No newline at end of file diff --git a/packages/radio/tokens.txt b/packages/radio/tokens.txt new file mode 100644 index 0000000..6973da0 --- /dev/null +++ b/packages/radio/tokens.txt @@ -0,0 +1,58 @@ +radio:xevat-dulel-fihax +radio:xerok-dibos-venex +radio:xehih-gaceg-govix +radio:xekem-lylav-vafax +radio:xurom-vicur-divax +radio:xotig-zyped-ropux +radio:xebor-suhek-gahex +radio:xisib-lirym-gilix +radio:xihob-hezic-honyx +radio:xubic-sehub-hyzex +radio:xemog-zapos-sotux +radio:xegep-hobid-balox +radio:xogom-ceneh-rypix +radio:xufab-cidyr-fyvux +radio:xoniz-bonos-vylex +radio:xinor-mefuc-hytix +radio:xusas-zitol-mosux +radio:xebad-benir-pepax +radio:xucoc-tisym-rerax +radio:xuhap-degeh-zahyx +radio:xemag-ryzon-famux +radio:xocab-guben-fosox +radio:ximib-lygol-nyvyx +radio:xumit-mydis-zofax +radio:xekaz-defos-gucix +radio:xucoz-pezet-huhix +radio:xehan-cyvag-sufax +radio:xipir-galep-sudyx +radio:xegof-bogep-nylix +radio:xuvet-copoc-dagix +radio:ximac-legyk-kotex +radio:xigeh-zinyn-munux +radio:xofos-zevyb-vybex +radio:xomim-fupeh-somex +radio:xunep-bybom-gyzux +radio:xodal-mapad-pykax +radio:xecep-mahuv-sukux +radio:xudav-gomir-fycax +radio:xicad-pizat-ruhix +radio:xovos-kegoc-tesyx +radio:xekot-timam-ladux +radio:xozac-ruron-bidex +radio:xuvok-lysyv-fuzex +radio:xevod-tidic-mocax +radio:xosec-hevib-vobux +radio:ximac-somyp-vesyx +radio:xevab-kotek-debax +radio:xinib-patut-nypex +radio:xomav-tecep-zisux +radio:xecod-boluf-mefyx +radio:xezeg-zizup-ramix +radio:xudol-rocas-pyvox +radio:xipes-gapor-zogux +radio:xekil-vokyt-punox +radio:xunen-tobok-pilux +radio:xofil-sukep-vimax +radio:xodon-luciz-sybix +radio:xelen-divyb-tarix diff --git a/packages/radio/www/radio.html b/packages/radio/www/radio.html new file mode 100644 index 0000000..c34f548 --- /dev/null +++ b/packages/radio/www/radio.html @@ -0,0 +1,150 @@ + + + + 101.1 MHz + + + + +

    101.1 MHz

    + +

    + Tune to 101.1 MHz. +

    + +
    + If you think you've figured something out, enter it here: + + +
    + +
    
    +  
    +
    
    From 7217d03259beafc0302cd80034dcbab036511974 Mon Sep 17 00:00:00 2001
    From: Neale Pickett 
    Date: Thu, 3 Nov 2011 18:51:28 -0600
    Subject: [PATCH 19/25] multi-point tokens in radio
    
    ---
     packages/radio/radio.mk       |  1 +
     packages/radio/tokens.txt     | 68 +++++------------------------
     packages/radio/www/radio.html | 81 ++++++++++-------------------------
     src/mktoken                   |  2 +-
     4 files changed, 35 insertions(+), 117 deletions(-)
    
    diff --git a/packages/radio/radio.mk b/packages/radio/radio.mk
    index 58b1489..bce708f 100644
    --- a/packages/radio/radio.mk
    +++ b/packages/radio/radio.mk
    @@ -6,6 +6,7 @@ radio-install:
     	mkdir -p $(RADIO_PKGDIR)
     
     	$(call COPYTREE, packages/radio/www, $(RADIO_PKGDIR)/www)
    +	cp packages/radio/tokens.txt $(RADIO_PKGDIR)/
     
     radio-clean:
     	rm -rf $(RADIO_BUILDDIR)
    diff --git a/packages/radio/tokens.txt b/packages/radio/tokens.txt
    index 6973da0..cd4eb4d 100644
    --- a/packages/radio/tokens.txt
    +++ b/packages/radio/tokens.txt
    @@ -1,58 +1,10 @@
    -radio:xevat-dulel-fihax
    -radio:xerok-dibos-venex
    -radio:xehih-gaceg-govix
    -radio:xekem-lylav-vafax
    -radio:xurom-vicur-divax
    -radio:xotig-zyped-ropux
    -radio:xebor-suhek-gahex
    -radio:xisib-lirym-gilix
    -radio:xihob-hezic-honyx
    -radio:xubic-sehub-hyzex
    -radio:xemog-zapos-sotux
    -radio:xegep-hobid-balox
    -radio:xogom-ceneh-rypix
    -radio:xufab-cidyr-fyvux
    -radio:xoniz-bonos-vylex
    -radio:xinor-mefuc-hytix
    -radio:xusas-zitol-mosux
    -radio:xebad-benir-pepax
    -radio:xucoc-tisym-rerax
    -radio:xuhap-degeh-zahyx
    -radio:xemag-ryzon-famux
    -radio:xocab-guben-fosox
    -radio:ximib-lygol-nyvyx
    -radio:xumit-mydis-zofax
    -radio:xekaz-defos-gucix
    -radio:xucoz-pezet-huhix
    -radio:xehan-cyvag-sufax
    -radio:xipir-galep-sudyx
    -radio:xegof-bogep-nylix
    -radio:xuvet-copoc-dagix
    -radio:ximac-legyk-kotex
    -radio:xigeh-zinyn-munux
    -radio:xofos-zevyb-vybex
    -radio:xomim-fupeh-somex
    -radio:xunep-bybom-gyzux
    -radio:xodal-mapad-pykax
    -radio:xecep-mahuv-sukux
    -radio:xudav-gomir-fycax
    -radio:xicad-pizat-ruhix
    -radio:xovos-kegoc-tesyx
    -radio:xekot-timam-ladux
    -radio:xozac-ruron-bidex
    -radio:xuvok-lysyv-fuzex
    -radio:xevod-tidic-mocax
    -radio:xosec-hevib-vobux
    -radio:ximac-somyp-vesyx
    -radio:xevab-kotek-debax
    -radio:xinib-patut-nypex
    -radio:xomav-tecep-zisux
    -radio:xecod-boluf-mefyx
    -radio:xezeg-zizup-ramix
    -radio:xudol-rocas-pyvox
    -radio:xipes-gapor-zogux
    -radio:xekil-vokyt-punox
    -radio:xunen-tobok-pilux
    -radio:xofil-sukep-vimax
    -radio:xodon-luciz-sybix
    -radio:xelen-divyb-tarix
    +radio:50:xeneb-tisyz-bamox
    +radio:40:xekaf-fozem-zezox
    +radio:5:xukos-gimiv-zupex
    +radio:50:xehih-gazap-zagox
    +radio:10:xehof-hucec-ruhux
    +radio:5:xukok-napyd-zurex
    +radio:10:xitim-pyvig-dakyx
    +radio:50:xudab-hihed-senix
    +radio:10:xihez-sepyr-zytax
    +radio:60:xoheg-fivic-besax
    diff --git a/packages/radio/www/radio.html b/packages/radio/www/radio.html
    index c34f548..0bf2d9f 100644
    --- a/packages/radio/www/radio.html
    +++ b/packages/radio/www/radio.html
    @@ -40,66 +40,30 @@ function rc4Encrypt(key, pt) {
     }
     
     tokens = [
    -"Vo%92%00%DE%ED%1F%BC%B9%A1%865%D6%CD%AD%EA%E7TY%CD%9F%14%F5",
    -"Vo%92%00%DE%ED%1F%BC%BD%AF%995%D6%D1%A3%E0%F8TI%C1%99%10%F5",
    -"Vo%92%00%DE%ED%1F%BC%A7%A9%9A5%D5%D9%A2%EA%ECTX%CB%81%1C%F5",
    -"Vo%92%00%DE%ED%1F%BC%A4%A5%9F5%DE%C1%AD%EE%FDTI%C5%91%14%F5",
    -"Vo%92%00%DE%ED%1F%AC%BD%AF%9F5%C4%D1%A2%FA%F9T%5B%CD%81%14%F5",
    -"Vo%92%00%DE%ED%1F%B6%BB%A9%955%C8%C1%B1%EA%EFTM%CB%87%00%F5",
    -"Vo%92%00%DE%ED%1F%BC%AD%AF%805%C1%CD%A9%EA%E0TX%C5%9F%10%F5",
    -"Vo%92%00%DE%ED%1F%B0%BC%A9%905%DE%D1%B3%F6%E6TX%CD%9B%1C%F5",
    -"Vo%92%00%DE%ED%1F%B0%A7%AF%905%DA%DD%BB%E6%E8TW%CB%99%0C%F5",
    -"Vo%92%00%DE%ED%1F%AC%AD%A9%915%C1%DD%A9%FA%E9TW%DD%8D%10%F5",
    -"%D0%C39fH%00q%AE%D2oMw%F7%0A%1C%B9%AFNOR1a%CD",
    -"%D0%C39fH%00q%AE%D8eZw%E5%04%0E%BF%B8N%5E%5C%29%7B%CD",
    -"%D0%C39fH%00q%A4%D8oGw%EE%0E%02%B3%B4NND5%7D%CD",
    -"%D0%C39fH%00q%BE%D9aHw%EE%02%08%AF%AENZD3a%CD",
    -"%D0%C39fH%00q%A4%D1iPw%EF%04%02%B9%AFNJD%29q%CD",
    -"%D0%C39fH%00q%A2%D1oXw%E0%0E%0A%A3%BFNTD1%7D%CD",
    -"%D0%C39fH%00q%BE%CCaYw%F7%02%18%B9%B0NQR6a%CD",
    -"%D0%C39fH%00q%AE%DDaNw%EF%0E%02%BF%AENLX5u%CD",
    -"%E6%A9%B8%09%A6%F2e%EC%E85%18%EE%8Ax_%182%BA%3A%9F%E2%0A%7B",
    -"%DE%02%A7%3A%CD%90%B6%D8r%D0%7B%8C%C4%1B%C7-C%1F%14%8B7%88@",
    -"Y%F8%0C%CD%ED%25%7C%E0HT%CA%AD%C5%FD%28k5%1C%7E%BE%20%16V",
    -"Y%F8%0C%CD%ED%25%7C%EAFT%CF%AD%D0%F10a5%1C%7E%B0%3E%0CV",
    -"Y%F8%0C%CD%ED%25%7C%ECH%5C%CF%AD%DB%FD5k7%1Cv%A6%3B%1AV",
    -"Y%F8%0C%CD%ED%25%7C%F0H%5C%D9%AD%DA%FD6m%28%1Cb%B0+%02V",
    -"Y%F8%0C%CD%ED%25%7C%E0NT%D7%AD%D3%E14k%28%1C%7F%AA.%0AV",
    -"Y%F8%0C%CD%ED%25%7C%F0FZ%D7%AD%C7%E1%28a/%1Cp%AA%25%0AV",
    -"Y%F8%0C%CD%ED%25%7C%E0MT%C3%AD%D4%FD%24e%3C%1Ck%AA+%02V",
    -"Y%F8%0C%CD%ED%25%7C%ECU%5C%DF%AD%D0%E5%3Ea+%1Ck%AA%29%1AV",
    -"Y%F8%0C%CD%ED%25%7C%E0BZ%CB%AD%D5%EB5a+%1Cv%A6%21%0AV",
    -"Y%F8%0C%CD%ED%25%7C%F0SP%D9%AD%D4%EB%22k8%1C%7C%BE*%0AV",
    -"%3F%84G%10%A5%5D.3%1F%10%F7%EC%D6%A38V%F9%96%05%19%D03%AC",
    -"%3F%84G%10%A5%5D.3%15%14%FC%EC%C0%AF1V%FC%96%03%03%CA%23%AC",
    -"Z%AE%16i%8F%1AK%DC%05%BE%7Ee_%0A%D2%A3%801%29%D3%13%13%E5",
    -"Z%AE%16i%8F%1AK%DC%0E%B8%60eC%1A%D4%BF%8A1%2C%C5%1C%13%E5",
    -"%18%F5%06d%C0%FCbli%C2%1AR25%AB%E0UD%BF@%81%15%E5",
    -"%18%F5%06d%C0%FCbvc%C6%06R%3D-%B9%EE%5CD%A8@%90%01%E5",
    -"%18%F5%06d%C0%FCb%7Cd%C2%1AR%3D-%A1%FAND%ABL%90%15%E5",
    -"%18%F5%06d%C0%FCblc%C6%1CR7%23%A4%E6JD%BE@%98%01%E5",
    -"%18%F5%06d%C0%FCbpd%C6%0ER%20%25%B3%EELD%AAL%93%09%E5",
    -"%18%F5%06d%C0%FCbvq%C8%19R%3B%29%AE%E0%5BD%AC%5C%88%19%E5",
    -"%18%F5%06d%C0%FCb%7Cl%C8%1ER%24%25%A4%EEUD%B4X%9F%15%E5",
    -"%18%F5%06d%C0%FCbv%7D%C6%09R%229%BB%E0VD%BAP%9F%05%E5",
    -"%18%F5%06d%C0%FCblq%C8%01R%3C5%BA%F6ND%BEL%81%05%E5",
    -"%18%F5%06d%C0%FCb%7Cq%C8%0ER%24%25%AD%E6%5BD%B5V%98%01%E5",
    -"%F2%F2%D0%DB%F7Uq%ED%E2%0C%C0%25L%7B%B9%F2I%013%C5%BA%1Fd",
    -"%F2%F2%D0%DB%F7Uq%EB%FC%08%C0%25Wq%A2%E2%5B%013%CF%AB%13d",
    -"%B1.2%D4ZV5%92%21%16%BB%EB%01%0D%5C%8F%D9%02%8F%0E6%A5%CB",
    -"%B1.2%D4ZV5%9E9%1E%BB%EB%1A%03%5C%9F%C6%02%85%12%24%A1%CB",
    -"%B1.2%D4ZV5%98%3A%16%AF%EB%1E%07K%8F%C2%02%91%02%27%B1%CB",
    -"%B1.2%D4ZV5%924%18%BD%EB%08%0DD%9F%D4%02%86%0E2%BD%CB",
    -"%B1.2%D4ZV5%92-%12%BE%EB%10%0BR%9F%C2%02%99%0A9%AD%CB",
    -"%B1.2%D4ZV5%823%18%B5%EB%18%0DK%8B%C1%02%9B%12%22%AB%CB",
    -"%B1.2%D4ZV5%9E%27%12%AA%EB%0D%03X%85%C0%02%91%043%B1%CB",
    -"%B1.2%D4ZV5%92%3C%1E%B5%EB%1C%0DC%93%C6%02%9B%1E%3A%AB%CB",
    -"%B1.2%D4ZV5%829%12%B7%EB%1E%0DJ%85%D9%02%9B%028%B1%CB",
    -"%B1.2%D4ZV5%981%1E%B5%EB%19%17C%8F%C2%02%9D%029%A5%CB",
    -"%B1.2%D4ZV5%983%18%B7%EB%06%17K%83%C8%02%98%126%AD%CB",
    -"%B1.2%D4ZV5%92%3B%12%B7%EB%0E%0B%5E%93%D0%02%9F%0A%26%AD%CB",
    +    "Vo%92%00%DE%EDR%E9%F5%B8%97v%D7%DA%EC%FB%E2%0AF%DE%DA%17%EC%0BF%3D",
    +    "%D0%C39fH%00%3D%FB%85xO1%EC%0DA%B0%B3%19YPhn%D0%0E%C4%04",
    +    "%E6%A9%B8%09%A6%F2%28%A3%F3/%10%AC%8D%3CK%082%FE%3E%D7%EA%1Es%3En",
    +    "Y%F8%0C%CD%ED%251%B5%1FM%C8%E8%DE%EC%7Fc%3AKy%AF%60%19O%03%7F%1C",
    +    "%DE%02%A7%3A%CD%90%FB%97b%C4%60%CE%CBS%CE%29%5BK%0A%C7%25%84J%B4*",
    +    "%3F%84G%10%A5%5DgjH%09%F1%A9%D5%A0rG%E7%D8%0B%15%89%24%A1%9Cx%C6",
    +    "Z%AE%16i%8F%1A%02%83Y%A9d%3CL%02%89%AA%9Bj6%CD%5C%12%FC%14%F5%12",
    +    "%18%F5%06d%C0%FC/%29%3D%DF%1F%1B1.%E4%E7Q%01%BD%5D%D6%13%F8w%25%02",
    +    "%F2%F2%D0%DB%F7U8%B2%AB%11%CA%60Ad%E2%E8N%5C%3C%D8%F5%10eM%D2%DD",
    +    "%B1.2%D4ZV%7B%C7m%0F%B6%AE%0F%05%05%8C%DBY%82%08y%A6%D6%5E%C4%C8",
     ];
     
    +otokens = [
    +    ["radio:50:xeneb-tisyz-bamox", "2381355233377"],
    +    ["radio:40:xekaf-fozem-zezox", "tactlessly"],
    +    ["radio:5:xukos-gimiv-zupex",  "archipelagos"],
    +    ["radio:50:xehih-gazap-zagox", "debagged"],
    +    ["radio:5:xukok-napyd-zurex",  "decoder"],
    +    ["radio:10:xehof-hucec-ruhux", "equivocate"],
    +    ["radio:10:xitim-pyvig-dakyx", "meningitis"],
    +    ["radio:50:xudab-hihed-senix", "meritocracy"],
    +    ["radio:10:xihez-sepyr-zytax", "penologist"],
    +    ["radio:60:xoheg-fivic-besax", "simulcasts"],
    +];
     
     function quote(s) {
         return s.replace(/&/g, "&").replace(//g, ">");
    @@ -114,6 +78,7 @@ function check() {
     
         for (var i in tokens) {
             //o.innerHTML += "\"" + escape(rc4Encrypt(tokens[i][1], tokens[i][0])) + "\",\n";
    +
             var t = unescape(tokens[i]);
             var d = rc4Encrypt(a, t);
     
    diff --git a/src/mktoken b/src/mktoken
    index ba1e009..9d0c98f 100755
    --- a/src/mktoken
    +++ b/src/mktoken
    @@ -6,7 +6,7 @@ case "$1" in
             exit
     esac
     
    -bb=$(dd bs=1 count=5 if=/dev/urandom 2>/dev/null | ./bubblebabble)
    +bb=$(dd bs=1 count=5 if=/dev/urandom 2>/dev/null | bubblebabble)
     points=$2${2:+:}
     
     echo $1:$points$bb
    
    From bf655905d95097325c6c5adf210ab13855da93ca Mon Sep 17 00:00:00 2001
    From: Neale Pickett 
    Date: Thu, 3 Nov 2011 22:22:07 -0600
    Subject: [PATCH 20/25] add playfair live category
    
    ---
     packages/playfair/playfair.mk              |  19 ++
     packages/playfair/service/playfair/ip.txt  |   1 +
     packages/playfair/service/playfair/log/run |   3 +
     packages/playfair/service/playfair/run     |   9 +
     packages/playfair/src/Makefile             |   4 +
     packages/playfair/src/playfair.c           | 196 +++++++++++++++++++++
     packages/playfair/tokens.txt               |   1 +
     7 files changed, 233 insertions(+)
     create mode 100644 packages/playfair/playfair.mk
     create mode 100644 packages/playfair/service/playfair/ip.txt
     create mode 100755 packages/playfair/service/playfair/log/run
     create mode 100755 packages/playfair/service/playfair/run
     create mode 100644 packages/playfair/src/Makefile
     create mode 100644 packages/playfair/src/playfair.c
     create mode 100644 packages/playfair/tokens.txt
    
    diff --git a/packages/playfair/playfair.mk b/packages/playfair/playfair.mk
    new file mode 100644
    index 0000000..8604ea8
    --- /dev/null
    +++ b/packages/playfair/playfair.mk
    @@ -0,0 +1,19 @@
    +PLAYFAIR_PKGDIR = $(TARGET)/playfair
    +PLAYFAIR_BUILDDIR = $(BUILD)/playfair
    +
    +playfair-install: playfair-build
    +	mkdir -p $(PLAYFAIR_PKGDIR)/bin/
    +
    +	$(call COPYTREE, packages/playfair/service, $(PLAYFAIR_PKGDIR)/service)
    +
    +	cp packages/playfair/tokens.txt $(PLAYFAIR_PKGDIR)/
    +	cp packages/playfair/src/playfair $(PLAYFAIR_PKGDIR)/bin/
    +
    +playfair-clean:
    +	rm -rf $(PLAYFAIR_PKGDIR) $(PLAYFAIR_BUILDDIR)
    +	$(MAKE) -C packages/playfair/src clean
    +
    +playfair-build:
    +	$(MAKE) -C packages/playfair/src build
    +
    +PACKAGES += playfair
    diff --git a/packages/playfair/service/playfair/ip.txt b/packages/playfair/service/playfair/ip.txt
    new file mode 100644
    index 0000000..f4f0fdd
    --- /dev/null
    +++ b/packages/playfair/service/playfair/ip.txt
    @@ -0,0 +1 @@
    +fd84:b410:3441::529/64
    diff --git a/packages/playfair/service/playfair/log/run b/packages/playfair/service/playfair/log/run
    new file mode 100755
    index 0000000..1e7bd9d
    --- /dev/null
    +++ b/packages/playfair/service/playfair/log/run
    @@ -0,0 +1,3 @@
    +#! /bin/sh
    +
    +exec svlogd -tt $PWD
    diff --git a/packages/playfair/service/playfair/run b/packages/playfair/service/playfair/run
    new file mode 100755
    index 0000000..ced4843
    --- /dev/null
    +++ b/packages/playfair/service/playfair/run
    @@ -0,0 +1,9 @@
    +#! /bin/sh -e
    +
    +exec 2>&1
    +
    +IP=$(cat ip.txt)
    +ip addr add $IP dev eth0 || true
    +
    +exec tcpsvd -u nobody ${IP%/*} 1013 /opt/playfair/bin/playfair
    +
    diff --git a/packages/playfair/src/Makefile b/packages/playfair/src/Makefile
    new file mode 100644
    index 0000000..66489f7
    --- /dev/null
    +++ b/packages/playfair/src/Makefile
    @@ -0,0 +1,4 @@
    +build: playfair
    +
    +clean:
    +	rm -f playfair
    \ No newline at end of file
    diff --git a/packages/playfair/src/playfair.c b/packages/playfair/src/playfair.c
    new file mode 100644
    index 0000000..abd1667
    --- /dev/null
    +++ b/packages/playfair/src/playfair.c
    @@ -0,0 +1,196 @@
    +#include 
    +#include 
    +#include 
    +#include 
    +
    +#define TRUE 1
    +#define FALSE 0
    +
    +// finds the index of a character in the index
    +// returns index or -1
    +int
    +indexkey(char* key, char c) {
    +  int i;
    +
    +  for(i=0; i < 25; i++) {
    +    if (key[i] == c) {
    +      //printf("'%d' -> %d\n", c, i);
    +      return i;
    +    }
    +  }
    +  return -1;
    +}
    +
    +// makes sure everything is lowercase or a space
    +void
    +strtolower(char* s, int len) {
    +  int i;
    +
    +  for(i = 0; i < len; i++) {
    +    s[i] = tolower(s[i]);
    +    if (s[i] < 'a' || s[i] > 'z') {
    +      s[i] = ' ';
    +    }
    +  }
    +}
    +
    +//
    +// makes a key
    +char *
    +make_key(char* s, int len) {
    +  strtolower(s, len);
    +  char alph[] = "abcdefghijklmnopqrstuvwxyz";
    +  char* key = (char *) malloc(26 * sizeof(char));
    +  key[26] = '\0';
    +  int keylen = 0;
    +  int i;
    +
    +  // initial dump
    +  for(i=0; i< len; i++) {
    +    if( s[i] != ' ' && alph[s[i]-97] != ' ' && s[i] != 'q') {
    +      key[keylen] = s[i];
    +      keylen++;
    +      alph[s[i]-97] = ' ';
    +    }
    +  }
    +
    +  // add extra chars
    +  for (i=0; i < 27; i++) {
    +    if (alph[i] != ' ' && alph[i] != 'q') {
    +      key[keylen] = alph[i];
    +      keylen++;
    +      alph[i] = ' ';
    +    }
    +  }
    +
    +  return key;
    +}
    +
    +
    +// double checks for duplicate chars in string
    +int
    +isdup(char* s, int len) {
    +  int i, j;
    +
    +  for(i = 0; i < len; i++) {
    +    for(j = i+1; j < len; j++ ) {
    +      if (s[i] == s[j]) {
    +        return 1;
    +      }
    +    }
    +  }
    +  return 0;
    +}
    +
    +// does the swapping of two characters
    +// assuming input is already sanitized
    +void
    +swapchar(char* key, char* plain) {
    +  int i0, i1;
    +  i0 = indexkey(key, plain[0]);
    +  i1 = indexkey(key, plain[1]);
    +
    +  // will hit this with double null, or double x
    +  if (i0 == i1){
    +    // so pass
    +  // vertical case
    +  } else if (i0%5 == i1%5) {
    +    plain[0] = key[(i0+5)%25];
    +    plain[1] = key[(i1+5)%25];
    +  // horizontal case
    +  } else if (i0/5 == i1/5) {
    +    plain[0] = key[(i0/5)*5 + (i0+1)%5];
    +    plain[1] = key[(i1/5)*5 + (i1+1)%5];
    +  // diagonal case
    +  } else {
    +    int b0 = i0%5;
    +    int b1 = i1%5;
    +    int diff;
    +    if (b0 > b1) {
    +        diff = b0 - b1;
    +        plain[0] = key[i0-diff];
    +        plain[1] = key[i1+diff];
    +    } else {
    +        diff = b1 - b0;
    +        plain[0] = key[i0+diff];
    +        plain[1] = key[i1-diff];
    +    }
    +  }
    +  return;
    +}
    +
    +void
    +printcrap(char* buf){
    +  printf("%c%c ", buf[0]-32, buf[1]-32);
    +}
    +
    +void
    +run(char* key) {
    +  char buf[3];
    +  char tmp;
    +  int existing = FALSE;
    +
    +  buf[2] = 0;
    +
    +  while (TRUE) {
    +    // read some crap in
    +    tmp = getchar();
    +    if (tmp == 'q') {
    +        tmp = 'x';
    +    }
    +    if (tmp == EOF) {
    +      if(existing) {
    +        buf[1] = 'x';
    +        swapchar(key, buf);
    +        printcrap(buf);
    +        existing = FALSE;
    +      } else {
    +        return;
    +      }
    +    } else if (tmp == '\n') {
    +       if(existing) {
    +        buf[1] = 'x';
    +        swapchar(key, buf);
    +        printcrap(buf);
    +        printf("\n");
    +        fflush(stdout);
    +        existing = FALSE;
    +      }
    +    } else if (91 <= tmp && tmp <= 122) {
    +      if (existing) {
    +        if (tmp == buf[0]) {
    +          buf[1] = 'x';
    +          swapchar(key, buf);
    +          printcrap(buf);
    +          buf[0] = tmp;
    +        } else {
    +          buf[1] = tmp;
    +          swapchar(key, buf);
    +          printcrap(buf);
    +          existing = FALSE;
    +        }
    +      } else {
    +        buf[0] = tmp;
    +        existing = TRUE;
    +      }
    +    } else {
    +      //printf("\nOnly [a-z\\n]\n");
    +      //fflush(stdout);
    +    }
    +  }
    +}
    +
    +
    +int
    +main() {
    +  // Unusual token, since it has to satisfy some strict requirements.
    +  char key[] = "netkutalbcdfgrisox";
    +  int len = strlen(key);
    +  char * ckey = make_key(key, len);
    +
    +  // All I know about trigraphs is that the gcc manual says I don't want
    +  // to know about trigraphs.
    +  printf("The key is the token.  ???:????\?-???\?-????\n");
    +  fflush(stdout);
    +  run(ckey);
    +}
    diff --git a/packages/playfair/tokens.txt b/packages/playfair/tokens.txt
    new file mode 100644
    index 0000000..c92cbfc
    --- /dev/null
    +++ b/packages/playfair/tokens.txt
    @@ -0,0 +1 @@
    +net:kutal-bcdfg-risox
    
    From 43e91dc7d54dfdc3de70249f699da2bbb1fad698 Mon Sep 17 00:00:00 2001
    From: Neale Pickett 
    Date: Thu, 3 Nov 2011 22:22:19 -0600
    Subject: [PATCH 21/25] fix revwords build
    
    ---
     packages/revwords/revwords.mk | 3 +--
     1 file changed, 1 insertion(+), 2 deletions(-)
    
    diff --git a/packages/revwords/revwords.mk b/packages/revwords/revwords.mk
    index a752c84..5f44a3e 100644
    --- a/packages/revwords/revwords.mk
    +++ b/packages/revwords/revwords.mk
    @@ -7,14 +7,13 @@ revwords-install: revwords-build
     	$(call COPYTREE, packages/revwords/service, $(REVWORDS_PKGDIR)/service)
     
     	cp packages/revwords/tokens.txt $(REVWORDS_PKGDIR)/
    -	cp $(REVWORDS_BUILDDIR)/token.enc $(REVWORDS_PKGDIR)/
     	cp packages/revwords/src/revwords $(REVWORDS_PKGDIR)/bin/
     
     revwords-clean:
     	rm -rf $(REVWORDS_PKGDIR) $(REVWORDS_BUILDDIR)
     	$(MAKE) -C packages/revwords/src clean
     
    -revwords-build: $(REVWORDS_BUILDDIR)/token.enc
    +revwords-build:
     	$(MAKE) -C packages/revwords/src build
     
     PACKAGES += revwords
    
    From 698d78aed66aa2f237ad9cb6f59691503574c17c Mon Sep 17 00:00:00 2001
    From: "Aaron J. McPhall" 
    Date: Fri, 4 Nov 2011 10:48:58 -0600
    Subject: [PATCH 22/25] Fixed condition in playfair where xx -> XX XX
    
    ---
     packages/playfair/src/playfair.c | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/packages/playfair/src/playfair.c b/packages/playfair/src/playfair.c
    index abd1667..f87f272 100644
    --- a/packages/playfair/src/playfair.c
    +++ b/packages/playfair/src/playfair.c
    @@ -158,7 +158,7 @@ run(char* key) {
           }
         } else if (91 <= tmp && tmp <= 122) {
           if (existing) {
    -        if (tmp == buf[0]) {
    +        if (tmp == buf[0] && tmp != 'x') {
               buf[1] = 'x';
               swapchar(key, buf);
               printcrap(buf);
    
    From 441eadf328d4a36a8b27a7badd6b717df5b8eed9 Mon Sep 17 00:00:00 2001
    From: "Aaron J. McPhall" 
    Date: Fri, 4 Nov 2011 11:03:48 -0600
    Subject: [PATCH 23/25] Fixed flushing bug
    
    ---
     packages/playfair/src/playfair.c | 3 +++
     1 file changed, 3 insertions(+)
    
    diff --git a/packages/playfair/src/playfair.c b/packages/playfair/src/playfair.c
    index f87f272..bb0749f 100644
    --- a/packages/playfair/src/playfair.c
    +++ b/packages/playfair/src/playfair.c
    @@ -155,6 +155,9 @@ run(char* key) {
             printf("\n");
             fflush(stdout);
             existing = FALSE;
    +      } else {
    +        printf("\n");
    +        fflush(stdout);
           }
         } else if (91 <= tmp && tmp <= 122) {
           if (existing) {
    
    From e336eb559d29b80211971da7b562cec797317f80 Mon Sep 17 00:00:00 2001
    From: Neale Pickett 
    Date: Sat, 5 Nov 2011 14:27:56 -0600
    Subject: [PATCH 24/25] put tanks back in
    
    ---
     packages/tanks/service/tanksd/tanksd |   15 +-
     packages/tanks/tanks.mk              |    2 +
     packages/tanks/tokens.txt            | 1440 ++++++++++++++++++++++++++
     3 files changed, 1450 insertions(+), 7 deletions(-)
     create mode 100644 packages/tanks/tokens.txt
    
    diff --git a/packages/tanks/service/tanksd/tanksd b/packages/tanks/service/tanksd/tanksd
    index 8bef825..a540e37 100755
    --- a/packages/tanks/service/tanksd/tanksd
    +++ b/packages/tanks/service/tanksd/tanksd
    @@ -3,6 +3,7 @@
     d=/var/lib/ctf/tanks
     p=$d/players
     w=/var/www/tanks
    +log=$d/winners.log
     
     summary () {
         cat <
     EOF
         
    -    # Get a token and add it to the redemption log
    -    nc 10.0.0.2 1 -e /opt/ctfbase/bin/tokencli tanks ./category.key 3> $tfn
    -    k=$(cat $tfn)
         winner.awk $rfn | while read winner; do
             hash=$(basename $winner)
    -        echo "Round $next winner: $hash"
    +        echo "Round $next winner: $hash" >> $log
    +        nwinners=$(wc -l $log)
    +        
    +        # Read a token
    +        k=$(sed -n ${nwinners}p /opt/tanks/tokens.txt)
             
             # XXX: pull this out into another daemon
             # XXX: this puts the token in /proc/self/cmdline
    diff --git a/packages/tanks/tanks.mk b/packages/tanks/tanks.mk
    index b530520..42c933b 100644
    --- a/packages/tanks/tanks.mk
    +++ b/packages/tanks/tanks.mk
    @@ -21,6 +21,8 @@ tanks-install: tanks-build
     	cp $(TANKS_BUILDDIR)/rank.awk $(TANKS_PKGDIR)/bin
     	cp $(TANKS_BUILDDIR)/winner.awk $(TANKS_PKGDIR)/bin
     
    +	cp packages/tanks/tokens.txt $(TANKS_PKGDIR)/
    +
     	$(call COPYTREE, packages/tanks/html, $(TANKS_PKGDIR)/html)
     	cp packages/mcp/www/ctf.css $(TANKS_PKGDIR)/html/style.css
     	cp $(TANKS_BUILDDIR)/nav.html.inc $(TANKS_PKGDIR)/html
    diff --git a/packages/tanks/tokens.txt b/packages/tanks/tokens.txt
    new file mode 100644
    index 0000000..581272f
    --- /dev/null
    +++ b/packages/tanks/tokens.txt
    @@ -0,0 +1,1440 @@
    +tanks:xogak-lihef-vevax
    +tanks:xubod-momuc-lynax
    +tanks:xuheh-kysig-narox
    +tanks:xefal-hynyl-symyx
    +tanks:xutin-ganib-nydox
    +tanks:xihep-gytud-kutox
    +tanks:xeged-lebys-totyx
    +tanks:xevog-bivuf-bydax
    +tanks:xefep-votok-kunux
    +tanks:xibol-rymav-zypix
    +tanks:xebat-rivif-lygux
    +tanks:xivek-cezyr-lesox
    +tanks:xobim-gymiv-henex
    +tanks:xefib-hebad-tipex
    +tanks:xezef-tikul-nuzax
    +tanks:xigom-rikav-rinux
    +tanks:xedik-rydig-lebyx
    +tanks:xibos-nydah-lolax
    +tanks:xukoc-libuz-nicox
    +tanks:xurab-pimok-sypix
    +tanks:xevih-guvur-kivax
    +tanks:xiped-pirug-gihox
    +tanks:xulaz-getuh-mekax
    +tanks:xovev-fycil-matix
    +tanks:xisof-cosel-tytyx
    +tanks:xehiz-tumuh-potox
    +tanks:xoroc-hugyf-pukix
    +tanks:xicef-kodoz-pasex
    +tanks:xikiz-vekap-relex
    +tanks:xodom-pabod-nimyx
    +tanks:xuvic-dasum-vamix
    +tanks:xukit-zumyh-derex
    +tanks:xosag-kever-tybux
    +tanks:xevob-purar-sarix
    +tanks:xufer-rocis-himix
    +tanks:xegit-vacup-masax
    +tanks:xoref-mamym-gezox
    +tanks:xipac-dizic-mitux
    +tanks:xovat-belyp-gomax
    +tanks:xukaz-cahah-lotyx
    +tanks:xolab-sepef-kavux
    +tanks:xufov-nusac-zerax
    +tanks:xigom-kovig-dylux
    +tanks:xitac-gasoh-tyzax
    +tanks:xifag-lufim-hyzex
    +tanks:xeroz-piced-mefix
    +tanks:xopem-buzod-luhix
    +tanks:xuzar-susyg-ledox
    +tanks:xetil-zobik-bufax
    +tanks:xuvel-kohip-damix
    +tanks:xihet-cycyk-zamax
    +tanks:xireb-hedom-hutex
    +tanks:xoceh-vezus-vibax
    +tanks:xurip-budyk-hebex
    +tanks:xoter-biciz-bymax
    +tanks:xocok-pezyp-bigax
    +tanks:xesif-sifah-vudox
    +tanks:xoten-gavid-sylix
    +tanks:xutoh-mumuf-zydix
    +tanks:xehid-dinov-dusyx
    +tanks:xogal-tykoz-rahix
    +tanks:xokot-fyhoh-lugux
    +tanks:xesis-bufef-gadix
    +tanks:xotid-merug-zorax
    +tanks:xegil-cynuc-fumyx
    +tanks:xesod-pocuc-vuzex
    +tanks:xigad-tudid-mifax
    +tanks:ximav-pedul-lihyx
    +tanks:xedoh-dycob-tudux
    +tanks:xifol-cenyn-tacix
    +tanks:xideb-nybat-dycix
    +tanks:xumah-mekes-lebyx
    +tanks:xofam-gitar-vebyx
    +tanks:xekas-dipiz-tacyx
    +tanks:xobol-firyn-rahux
    +tanks:xirib-kukyd-turyx
    +tanks:xigoc-zyhel-pocex
    +tanks:xesoz-tyfiv-labux
    +tanks:xilen-bilid-hunax
    +tanks:xekaz-rylam-gidex
    +tanks:xeniz-tobyp-vacix
    +tanks:xisad-byrek-digex
    +tanks:xesog-migek-mipix
    +tanks:xunan-puven-rilyx
    +tanks:xudev-tymas-titox
    +tanks:xicot-vydog-dysex
    +tanks:xemif-mevuh-vapox
    +tanks:xesov-sysos-ryfux
    +tanks:xozad-zedad-facex
    +tanks:xehav-notus-hamux
    +tanks:xesoh-cyruf-simix
    +tanks:xugim-kubyg-tazex
    +tanks:xuris-peris-romex
    +tanks:xerok-taped-letax
    +tanks:xevog-zipyb-kicyx
    +tanks:xehok-becuc-lucax
    +tanks:xukip-hyvog-safux
    +tanks:xudom-betuv-vokax
    +tanks:xutin-zikyg-simex
    +tanks:xenog-helor-zadix
    +tanks:xovag-tukoh-rekyx
    +tanks:xisap-facuk-latax
    +tanks:xesap-riduh-puvex
    +tanks:xuper-fovyk-suryx
    +tanks:xered-diryt-horux
    +tanks:xetel-himal-sapix
    +tanks:xobac-palyh-venox
    +tanks:xobik-byhal-gumux
    +tanks:xihek-cesoh-vemyx
    +tanks:xisen-motur-conux
    +tanks:xopem-hitaz-sokyx
    +tanks:xizag-nekih-sidox
    +tanks:xidem-tusir-pocix
    +tanks:xubap-tekuv-pikux
    +tanks:xihil-byveh-kesax
    +tanks:xobaf-gihos-huhix
    +tanks:xidab-topor-codax
    +tanks:xifod-cycoh-volux
    +tanks:xigob-dogov-dasyx
    +tanks:xevet-futir-katox
    +tanks:xiliv-mirid-zikox
    +tanks:xotab-dobib-kilix
    +tanks:xibif-syfuk-kynux
    +tanks:xitot-hekil-divix
    +tanks:xerog-bykac-bulax
    +tanks:xekav-dyves-bifux
    +tanks:xuzib-gagur-furex
    +tanks:xohos-ridom-ruvex
    +tanks:xuvet-kebyf-ranax
    +tanks:xedoc-pehin-vafox
    +tanks:xetes-capyd-cunux
    +tanks:xedoz-sysim-nidux
    +tanks:xihas-mofav-tatix
    +tanks:xopal-latis-balex
    +tanks:xehot-redur-tekix
    +tanks:xumol-vurek-lulex
    +tanks:ximit-taduc-lalex
    +tanks:xupil-feleh-kokix
    +tanks:xitos-potan-dosix
    +tanks:xibop-cesut-vytux
    +tanks:xelel-firab-mezex
    +tanks:xegop-bysor-megex
    +tanks:xupid-cumuv-rulax
    +tanks:xehic-sunul-dolex
    +tanks:xovic-kykin-nylix
    +tanks:ximod-kapuz-rohex
    +tanks:xobor-nyvuc-cikox
    +tanks:xinet-fenub-tylox
    +tanks:xoveb-daboc-fanyx
    +tanks:xicem-fozeb-fubux
    +tanks:ximar-daseh-hidyx
    +tanks:xubam-cidon-cadox
    +tanks:xulan-bofyt-zagex
    +tanks:xutad-kydab-ryryx
    +tanks:xepar-zific-dygix
    +tanks:xilak-cokel-hycox
    +tanks:xekiz-boran-tarex
    +tanks:xutem-vifef-rizux
    +tanks:xifad-fohyf-makux
    +tanks:xotec-vitin-besix
    +tanks:xipam-tetoc-kekyx
    +tanks:xiviv-valyn-zanox
    +tanks:xedig-zuben-sitex
    +tanks:xogok-pecal-padox
    +tanks:xomeh-fyhad-nudox
    +tanks:xemog-dacyr-gybax
    +tanks:xudov-bokim-cacyx
    +tanks:ximov-pyriz-hykex
    +tanks:xutan-tedyg-rekex
    +tanks:xonar-tysod-dipax
    +tanks:xugag-kedav-hygex
    +tanks:xemig-tizyr-ducax
    +tanks:xosak-kuzig-nuzox
    +tanks:xepeg-zidol-byzax
    +tanks:xogev-nelas-nevix
    +tanks:xesol-napir-romux
    +tanks:xonoh-koder-vifux
    +tanks:xidot-dubub-cocex
    +tanks:xoval-sufog-tytex
    +tanks:xulam-zupin-sudex
    +tanks:xisit-pugod-dufux
    +tanks:xonad-laloc-vapux
    +tanks:xemak-macik-zezux
    +tanks:xihog-fofef-dufyx
    +tanks:xinec-gasum-rukox
    +tanks:xisap-zused-pygex
    +tanks:xuloz-bitil-cirux
    +tanks:xohez-kunem-muhex
    +tanks:xivab-habur-befax
    +tanks:xitok-nimek-sasox
    +tanks:xulaz-vepys-romox
    +tanks:xumep-fucik-serox
    +tanks:xezot-nuzuk-fifyx
    +tanks:xezod-nesut-fufex
    +tanks:xupik-pumab-dypux
    +tanks:xuper-dorir-nucax
    +tanks:xubog-sifik-ludix
    +tanks:xubeh-hevig-romux
    +tanks:xomek-nonym-henix
    +tanks:xidig-dovop-tyhux
    +tanks:xidap-kotyl-gadox
    +tanks:xomip-putub-zutax
    +tanks:xecik-vufut-pycix
    +tanks:xuhov-gesuz-norox
    +tanks:xikil-dylep-fokyx
    +tanks:xinog-ledas-lidyx
    +tanks:xekiz-lynof-nehax
    +tanks:xobel-bilyf-bunax
    +tanks:xelif-vifuc-tynax
    +tanks:xinik-goteg-rikax
    +tanks:xefor-temun-mysix
    +tanks:xogim-bapov-mozax
    +tanks:xozig-himar-bomox
    +tanks:xiges-mysof-duhox
    +tanks:xicis-runyg-favix
    +tanks:xipez-sitof-vypox
    +tanks:xeloz-tocuv-dadax
    +tanks:xedoz-fezol-relyx
    +tanks:xeliz-fugad-kubix
    +tanks:xunac-piluc-sutux
    +tanks:xupaz-letim-tysex
    +tanks:xerah-fahoz-kahix
    +tanks:xocab-dunyb-kecax
    +tanks:xugig-cabak-kivox
    +tanks:xekeg-synak-zomox
    +tanks:xevam-hunuc-legax
    +tanks:xihep-rykyd-tasix
    +tanks:xohon-mybuv-cihex
    +tanks:xibol-celob-lybyx
    +tanks:xebif-kopat-rinyx
    +tanks:xosif-ponos-luvix
    +tanks:xudis-zifes-gepox
    +tanks:xiheh-dated-ganix
    +tanks:xegam-vibec-copix
    +tanks:xuhig-mohuk-devox
    +tanks:xuziv-tuhok-ganux
    +tanks:xecov-gaviv-rakux
    +tanks:xebog-bopak-gagex
    +tanks:xugaf-nalis-gopyx
    +tanks:xotap-fafar-vihox
    +tanks:xetam-ruvop-telex
    +tanks:xuteh-rypez-zodox
    +tanks:xemor-lemad-hodux
    +tanks:xibop-butub-licux
    +tanks:xipag-zyrob-hizex
    +tanks:xutit-sydit-lusex
    +tanks:xozal-bycah-sotyx
    +tanks:xozol-kyrom-lylix
    +tanks:xulah-dehus-horax
    +tanks:xihok-zifeh-vidox
    +tanks:xivif-bigub-dekux
    +tanks:xikeh-bozuk-tohix
    +tanks:xulop-busyf-bocix
    +tanks:xetom-sohyv-lolux
    +tanks:xesak-gysef-padax
    +tanks:xosat-kyden-bosox
    +tanks:xilef-tuker-hytox
    +tanks:xedes-hemob-zinax
    +tanks:xinav-tefer-serix
    +tanks:xizid-hafym-folax
    +tanks:xopec-gukoz-lucex
    +tanks:xifom-bygoc-hibax
    +tanks:xovof-kidid-tukex
    +tanks:xugel-hefit-ryhax
    +tanks:xocik-bofic-figux
    +tanks:xogaz-gukim-gudax
    +tanks:xirab-kybih-lykix
    +tanks:xivak-sylyh-cimax
    +tanks:xizon-ludoh-dymex
    +tanks:xukil-hyduc-cetyx
    +tanks:xetif-nidus-cyvyx
    +tanks:xeniz-kizuh-volyx
    +tanks:xodof-zaral-betyx
    +tanks:xigeg-gamar-tecux
    +tanks:xuges-dehim-guhax
    +tanks:xepac-vybaf-gekyx
    +tanks:xesiv-vydyp-zokyx
    +tanks:xelig-mivym-zizex
    +tanks:xugek-lilyf-hivix
    +tanks:xotin-docyl-locix
    +tanks:xigal-sadaf-ticux
    +tanks:xemes-ziset-sykux
    +tanks:xubes-hyhez-gizax
    +tanks:xuval-kamoc-celox
    +tanks:xokif-nenez-dafox
    +tanks:xuhel-mivan-ropax
    +tanks:xeheg-fysas-bemyx
    +tanks:xezip-dekaz-nenux
    +tanks:xepib-nolog-sarux
    +tanks:xetoh-mafip-hihix
    +tanks:xipik-vysyt-lidox
    +tanks:xugef-fumes-dysax
    +tanks:xunep-zofum-gopux
    +tanks:xupan-pupol-kehox
    +tanks:xiris-feveh-hinax
    +tanks:xibal-mazat-zemax
    +tanks:xelag-silut-bygox
    +tanks:xigof-zolon-nysix
    +tanks:xisab-gikog-tilax
    +tanks:xitos-zotiv-fabix
    +tanks:xisem-zufep-ligix
    +tanks:xogap-lepyc-monix
    +tanks:xitev-demor-sylax
    +tanks:xocen-mihuk-kydox
    +tanks:xinoc-limug-nubyx
    +tanks:xuvef-petid-mokux
    +tanks:xipir-kacag-tenyx
    +tanks:xemeh-nizih-pazix
    +tanks:xicip-fupos-lyfix
    +tanks:xoged-cyvih-satex
    +tanks:xenel-ficoc-zynex
    +tanks:xulov-lupeg-fulix
    +tanks:xefab-popas-rysox
    +tanks:xored-hemuf-gysyx
    +tanks:xugir-tufil-rebex
    +tanks:xuref-fynup-risex
    +tanks:xofit-docuk-remix
    +tanks:xecim-bipyl-pocax
    +tanks:xugih-zagyl-ladax
    +tanks:xegep-vahop-begox
    +tanks:xikac-ropok-cilox
    +tanks:xopoh-picid-binux
    +tanks:xetip-fanoz-sufox
    +tanks:xodep-rusyz-tusax
    +tanks:xutab-hozez-kisox
    +tanks:xugiz-besog-mukox
    +tanks:xilan-rasyd-gyfyx
    +tanks:xihik-bolan-supex
    +tanks:xusit-runus-muhox
    +tanks:xocig-nohur-humox
    +tanks:xikas-peler-cisex
    +tanks:xokar-cekaz-bybix
    +tanks:xesef-fuhem-mylyx
    +tanks:xoleb-zatel-rymyx
    +tanks:xunod-sybep-migax
    +tanks:xudik-hidos-suvux
    +tanks:xehel-zakun-vakix
    +tanks:xolak-bakor-pynax
    +tanks:xivot-kopih-bynax
    +tanks:xidif-gavim-savax
    +tanks:xucez-pukyv-kybyx
    +tanks:xivas-nipaf-lunux
    +tanks:xebeg-guzus-zikax
    +tanks:xotat-hokok-nuhax
    +tanks:xefaf-ramab-dyvux
    +tanks:xohog-bacok-ryzox
    +tanks:xogam-behun-kivux
    +tanks:xubih-zizaz-senax
    +tanks:ximoc-nagak-mumux
    +tanks:xetin-foreh-lygox
    +tanks:xopat-kuryz-sufix
    +tanks:xotah-nahug-vogix
    +tanks:xokor-cumus-rycax
    +tanks:xigak-hadyp-palux
    +tanks:xolac-cutig-nucux
    +tanks:xisad-memem-futux
    +tanks:xidal-gevim-rugux
    +tanks:xucor-bymuk-gadyx
    +tanks:xucez-titic-gelyx
    +tanks:xireb-vozus-tykox
    +tanks:xupob-tehol-pypux
    +tanks:xoloz-nigyv-hepex
    +tanks:xebor-gufyz-pycix
    +tanks:xubep-ticic-buryx
    +tanks:xezip-kasuf-tagax
    +tanks:xopor-puryc-gafox
    +tanks:xuheb-fakys-dykox
    +tanks:xocaz-vemeg-zurax
    +tanks:xopih-koror-bedux
    +tanks:xulid-pylyz-sicix
    +tanks:xikaf-lusam-futix
    +tanks:xidaf-fuzaf-nabox
    +tanks:xihiz-zaget-gedix
    +tanks:xigif-mezyz-fulax
    +tanks:xinav-dozyd-didux
    +tanks:xunim-cadum-hakux
    +tanks:xezav-dozeg-petux
    +tanks:xomic-rymys-pubux
    +tanks:xukep-nipat-hurux
    +tanks:xehed-guder-hopux
    +tanks:xoveh-pugoz-vysex
    +tanks:xozid-cibaf-tagyx
    +tanks:xogoh-livap-corix
    +tanks:xitom-cefal-vagux
    +tanks:xogof-cofas-lyzix
    +tanks:xisas-buhub-binox
    +tanks:xerez-kival-kizux
    +tanks:ximid-dakot-kihyx
    +tanks:xosim-lomys-fucax
    +tanks:xirat-gerib-tylyx
    +tanks:xudin-botor-rafox
    +tanks:xuboc-hipof-kifex
    +tanks:xusag-nomyr-dizax
    +tanks:xulas-zonyp-livox
    +tanks:xihig-pavyf-bigix
    +tanks:xifip-terid-zikex
    +tanks:xesaf-sevel-focex
    +tanks:xizas-nivin-zufyx
    +tanks:xogoz-hecal-momyx
    +tanks:xilol-sorek-vevyx
    +tanks:xokep-cicys-lymix
    +tanks:xurof-dahoz-bylax
    +tanks:xohan-caced-hemex
    +tanks:xudig-habub-petux
    +tanks:xofoz-gydud-zatux
    +tanks:xupir-ragih-nocox
    +tanks:xuzod-filan-zehex
    +tanks:xohoz-safob-helix
    +tanks:xotor-zehag-nimix
    +tanks:xugev-lohib-fisax
    +tanks:xefek-cohur-dopex
    +tanks:xubis-zamak-lybux
    +tanks:xitez-tyfiz-rebux
    +tanks:ximen-fafit-sytox
    +tanks:xuloz-getim-verax
    +tanks:xufav-horis-camux
    +tanks:xolal-zosod-cihux
    +tanks:xiraz-tisef-nyfox
    +tanks:xikap-dadav-larox
    +tanks:xulem-ludah-bypyx
    +tanks:xidal-pelor-dezax
    +tanks:xumak-sesug-dibax
    +tanks:xizaz-bugit-gepax
    +tanks:xibon-livod-mycix
    +tanks:xerol-devim-vodox
    +tanks:xusin-zakoz-rovax
    +tanks:xomod-nyhyh-mopix
    +tanks:xeled-fuben-pybox
    +tanks:xovam-nifer-zebyx
    +tanks:xuzag-kulip-pazux
    +tanks:xemoh-fydoc-sisax
    +tanks:xemof-povan-fyhux
    +tanks:xoles-fodih-syfix
    +tanks:xipen-dyhuh-mibex
    +tanks:xofah-rogiz-busex
    +tanks:xutav-gabec-rotix
    +tanks:xerop-laden-gehyx
    +tanks:xinil-samic-zosox
    +tanks:xupit-peluv-lodox
    +tanks:xizom-zabul-gibex
    +tanks:xidos-sifol-sacax
    +tanks:xukir-syren-zocix
    +tanks:xegof-gacuz-tedyx
    +tanks:xilav-vesap-pozux
    +tanks:xupez-zityb-buvux
    +tanks:xopef-dukut-rifax
    +tanks:xumen-ripir-bynex
    +tanks:xuzob-duzar-revex
    +tanks:xepif-kimen-mohix
    +tanks:ximop-vipel-tidix
    +tanks:xurom-karuf-tafix
    +tanks:xepek-gipeg-fapux
    +tanks:xenag-tuhuk-sevix
    +tanks:xonoc-sutos-sisax
    +tanks:xekad-movyb-zycex
    +tanks:xegan-laduk-kumix
    +tanks:xegit-zabet-vuzex
    +tanks:xosac-telog-zegox
    +tanks:xevig-paduk-fasux
    +tanks:xupic-bomeb-pucex
    +tanks:xupof-guvez-nirix
    +tanks:xinov-vapyv-mihex
    +tanks:xedeb-sunir-rirox
    +tanks:xobod-donaz-cenax
    +tanks:xuhab-hirab-mymax
    +tanks:xebov-gicov-hamox
    +tanks:xegen-ryhuk-neryx
    +tanks:xozor-fated-zigex
    +tanks:xisat-kupeg-dymyx
    +tanks:xeror-muvut-tomex
    +tanks:xikis-puhoc-mikox
    +tanks:xegof-fubis-kizox
    +tanks:xufos-mafig-fobux
    +tanks:xoniz-tycoh-pyfox
    +tanks:xumod-nofic-rilix
    +tanks:xokot-lazik-syhux
    +tanks:xoter-varyv-vohox
    +tanks:xihob-vevib-gilux
    +tanks:xopat-sulyc-pekex
    +tanks:xekac-vibyt-libyx
    +tanks:xucaf-pevyp-kahyx
    +tanks:xorap-myceg-nafax
    +tanks:xutip-vahyr-nurex
    +tanks:xinec-fygul-cunix
    +tanks:xemah-dinyg-rirax
    +tanks:xivav-sugil-pumix
    +tanks:xitih-cibyg-dalex
    +tanks:xekoh-seciz-zisyx
    +tanks:xusit-kefim-dypax
    +tanks:xocab-nukot-sokox
    +tanks:xupak-polek-carox
    +tanks:xuner-cugat-sisox
    +tanks:xovet-cuzyk-kedax
    +tanks:xidir-huhyh-dolex
    +tanks:xihed-cavom-muhex
    +tanks:xecim-tolet-dahix
    +tanks:xubam-pedev-valox
    +tanks:xofof-digor-zinox
    +tanks:xifah-gylih-fabox
    +tanks:xiver-loval-retix
    +tanks:xugic-pumuf-kufox
    +tanks:xinel-gedab-fypax
    +tanks:xecoz-zotan-mobex
    +tanks:xelah-nogin-cycix
    +tanks:xuboz-cypyr-zagax
    +tanks:xitan-dynen-cyfex
    +tanks:xetos-himev-kepux
    +tanks:xedec-pegak-camax
    +tanks:xulos-lozik-gisyx
    +tanks:xegic-dekag-sicox
    +tanks:xopek-nuhyd-hafex
    +tanks:xerol-ridyb-hesex
    +tanks:xerel-fazev-nydox
    +tanks:xibel-lugep-gypex
    +tanks:xuroc-camav-dazux
    +tanks:xizoh-gabub-bosix
    +tanks:xipaz-dypic-gepix
    +tanks:xegip-venuk-vosux
    +tanks:xelid-cydys-ralex
    +tanks:xekin-mucug-comux
    +tanks:ximon-vegyh-gefax
    +tanks:ximes-gyhyg-botix
    +tanks:ximeh-sohyn-pyfyx
    +tanks:xuzim-rokot-cuhix
    +tanks:xufir-vatuc-gezax
    +tanks:xugiz-cifad-nugax
    +tanks:xitoz-nedec-memux
    +tanks:xezap-vymoz-getix
    +tanks:xotek-lonif-vynex
    +tanks:xitok-filiz-nazix
    +tanks:xilom-rysit-lekux
    +tanks:xuvoh-nobuc-tarox
    +tanks:xefeg-gofug-vycix
    +tanks:xisas-mytic-socix
    +tanks:xecec-nekah-hozux
    +tanks:xugor-cotol-tosox
    +tanks:xuget-tyhyv-lulex
    +tanks:xogat-lezor-dabex
    +tanks:xigod-riloc-rugax
    +tanks:xegib-mepit-cenyx
    +tanks:xedeb-hoded-cosyx
    +tanks:xifac-zebul-ketax
    +tanks:ximen-fyrof-lamix
    +tanks:ximir-pifuc-bubix
    +tanks:xikov-lozuk-hitix
    +tanks:xipas-tygen-gomix
    +tanks:xofoc-cacot-luzux
    +tanks:xunol-pasin-bumyx
    +tanks:xupih-tupob-dodux
    +tanks:xuben-zuzim-tetax
    +tanks:xodov-tokyz-tabax
    +tanks:xugah-vebok-sopix
    +tanks:xegib-duvek-mefox
    +tanks:xudav-gugit-rihux
    +tanks:xivah-nygyf-desux
    +tanks:xonis-hicit-nozex
    +tanks:xelis-fibum-ritux
    +tanks:xutad-mibal-hifyx
    +tanks:xuman-vukeb-fafyx
    +tanks:xozag-vemyk-fukox
    +tanks:xirig-nolat-kivix
    +tanks:xulir-zabos-katox
    +tanks:xegoh-dabed-murex
    +tanks:xotic-lamoh-navyx
    +tanks:xoted-coheb-zilux
    +tanks:xerap-kilev-mubex
    +tanks:xitep-rifob-hibox
    +tanks:xuser-hegik-vulex
    +tanks:xibic-larul-limox
    +tanks:xibal-ranoc-nyzux
    +tanks:xomik-fizyp-depux
    +tanks:xoper-gazot-gycax
    +tanks:xeher-banaf-harex
    +tanks:xolig-zilef-lecox
    +tanks:xopav-gydal-perox
    +tanks:xoror-tamyv-honux
    +tanks:xonog-cuvov-dihyx
    +tanks:xobez-kisiz-cirex
    +tanks:xedem-bunus-calex
    +tanks:xepap-nycar-zarix
    +tanks:xures-bydom-luzix
    +tanks:xutaf-bucef-lutax
    +tanks:xohaz-pipev-pazox
    +tanks:xibin-gagoh-kelyx
    +tanks:xodad-setev-mirox
    +tanks:xeboz-rorag-hibex
    +tanks:xodot-humel-pozyx
    +tanks:xetaz-dyvah-morox
    +tanks:xumef-detug-kubox
    +tanks:xudav-sokys-bycex
    +tanks:xives-diked-kilux
    +tanks:xohek-tycih-tyfux
    +tanks:xerim-coduf-lanax
    +tanks:xecil-novyr-kicax
    +tanks:xugat-zypar-vycax
    +tanks:xizib-hudak-zopix
    +tanks:xivom-hucef-polex
    +tanks:xeped-vyzic-cyzyx
    +tanks:xunec-kygir-robux
    +tanks:xuhoh-bisuc-tudux
    +tanks:xepid-rabar-dehex
    +tanks:xomem-vyvis-hivax
    +tanks:xovop-fozeg-dydux
    +tanks:xives-gecom-gyvyx
    +tanks:xuzit-nygos-pelix
    +tanks:xudom-simub-karix
    +tanks:xicod-fokah-penax
    +tanks:xunir-rygip-suzex
    +tanks:xisis-fypyc-belux
    +tanks:xifeh-kicyg-higux
    +tanks:xulic-tubar-pupyx
    +tanks:xurac-bypyt-rakyx
    +tanks:xisen-cemal-fadax
    +tanks:xefan-vegiv-gilyx
    +tanks:xecot-nemuf-gahox
    +tanks:xucap-todeh-myrax
    +tanks:xutas-rypen-lohox
    +tanks:xedoz-mohuc-zalux
    +tanks:xizal-bogoh-canex
    +tanks:xehic-lizaf-zulyx
    +tanks:xizat-cobeg-pikax
    +tanks:xepod-dumyz-colex
    +tanks:xizap-tomiv-sidax
    +tanks:xovil-vitep-tokyx
    +tanks:xipir-bidud-hyhox
    +tanks:xifeg-fypyf-lihix
    +tanks:xifet-cagyv-hocux
    +tanks:xefac-rysez-cekux
    +tanks:xonof-delad-zikex
    +tanks:xobih-funep-tonax
    +tanks:xehev-cimug-pecyx
    +tanks:xusot-hevuz-parax
    +tanks:xotov-kahez-himox
    +tanks:xikev-lemiv-cumux
    +tanks:xuzag-fenov-kybix
    +tanks:xiniv-tuban-nosux
    +tanks:xigep-fysic-rotex
    +tanks:xiriz-feguv-hyfux
    +tanks:xidaf-pazub-rovax
    +tanks:xurag-mufeh-mazyx
    +tanks:xuvoh-bozid-vikex
    +tanks:xipib-maras-myhyx
    +tanks:xunak-zofur-hahyx
    +tanks:xuzot-gykug-kikix
    +tanks:xigal-sadit-dumex
    +tanks:xezet-pysop-sefex
    +tanks:xedaf-birek-gecix
    +tanks:xitag-fizos-bykax
    +tanks:xizan-hifob-tedix
    +tanks:xehik-nidos-gosux
    +tanks:xuhas-gehyv-tupux
    +tanks:xited-guvet-dutyx
    +tanks:xigif-cegos-fenex
    +tanks:xebim-masod-bokux
    +tanks:xezon-kytab-gynax
    +tanks:xucal-hiron-ruzex
    +tanks:xobor-dycun-dytox
    +tanks:xococ-dygis-rerix
    +tanks:xepof-dubap-nybix
    +tanks:xivak-vebor-homyx
    +tanks:xugok-nytas-bynax
    +tanks:xonop-zehuv-nonox
    +tanks:xohap-rohud-legyx
    +tanks:xecev-vitus-tyfyx
    +tanks:xudit-gihop-kanex
    +tanks:xigam-madic-deryx
    +tanks:xovar-cafin-bylax
    +tanks:xilet-dykid-kuvux
    +tanks:ximek-cunyk-rebex
    +tanks:xufas-niril-sycax
    +tanks:xelev-momig-natox
    +tanks:xulil-himaf-tunex
    +tanks:xokiz-gukal-nikex
    +tanks:xikab-basel-duvex
    +tanks:xoman-legyd-domex
    +tanks:xivaz-cibip-kehux
    +tanks:xicih-cagir-nyvux
    +tanks:xoses-vusir-bytex
    +tanks:xinod-bihit-gyfox
    +tanks:xopok-cyzez-hilax
    +tanks:xohec-zacef-kecex
    +tanks:xegon-getip-zenyx
    +tanks:xorop-larep-bymix
    +tanks:xuzat-vinir-nizux
    +tanks:xecet-ruken-tanox
    +tanks:xegon-bazib-sofyx
    +tanks:xesob-fipig-libux
    +tanks:xifad-tihul-hebox
    +tanks:xukin-rimys-kyvex
    +tanks:xeceg-tytiv-gutux
    +tanks:xuros-kafom-sopex
    +tanks:xevin-tahaf-musax
    +tanks:xokak-gebum-dakex
    +tanks:xuzib-cokaz-tadux
    +tanks:xodon-zamoc-sozux
    +tanks:ximoz-muzud-bisax
    +tanks:xifaz-kylyv-lehax
    +tanks:xepes-defyt-kadux
    +tanks:xidaf-letym-vokox
    +tanks:xutab-mibaz-hulax
    +tanks:xevif-rudir-sifyx
    +tanks:xinaz-cesor-lifox
    +tanks:xeren-tyden-cicax
    +tanks:xelap-mamop-pabix
    +tanks:xefor-tetef-cyrix
    +tanks:xihat-dazef-rynex
    +tanks:xular-vubot-padex
    +tanks:xobez-mycem-zylax
    +tanks:xilal-hukon-hovax
    +tanks:xivel-tegit-mafox
    +tanks:xumit-romen-pocyx
    +tanks:xutos-fudac-zusyx
    +tanks:xugof-basun-tinux
    +tanks:xinip-notud-ryvix
    +tanks:xuvin-sydod-livax
    +tanks:xinib-nivur-zidix
    +tanks:xobad-nebov-colyx
    +tanks:xuzib-domyk-nygix
    +tanks:xulef-huryz-fyrix
    +tanks:xizin-cisyh-gymex
    +tanks:xirom-cavum-lulix
    +tanks:xovig-mevoc-tomyx
    +tanks:xunor-ryheb-sosix
    +tanks:xenoz-ninut-hifux
    +tanks:xugag-hetav-modox
    +tanks:xolan-devub-luryx
    +tanks:xolon-hopel-lepix
    +tanks:xupon-mulah-dobax
    +tanks:xubam-pekoh-mutix
    +tanks:xesal-syteb-rygix
    +tanks:xeves-hozen-futex
    +tanks:xuceh-semeg-tagax
    +tanks:xitet-mudir-nylux
    +tanks:xofos-kegyz-fakax
    +tanks:xurap-gyvyz-depux
    +tanks:xopas-fupub-kogax
    +tanks:xonol-zygig-podux
    +tanks:xonic-pyker-fegox
    +tanks:xosop-rubav-kulux
    +tanks:xovaz-tukek-cybix
    +tanks:xecop-vezol-casox
    +tanks:xusan-teker-legax
    +tanks:xupez-mobuz-kupox
    +tanks:xison-rahug-zotax
    +tanks:xedib-guzur-mehax
    +tanks:xukah-pinap-kusux
    +tanks:xezan-mohom-camox
    +tanks:xucit-vyzyn-rocex
    +tanks:xonif-zakot-gukyx
    +tanks:xodep-duvof-besax
    +tanks:xohoz-panyc-tizux
    +tanks:xuvas-typef-vylex
    +tanks:xited-zicon-gofyx
    +tanks:xetah-refur-gusox
    +tanks:xigof-haceb-sakax
    +tanks:xupec-nirep-tadux
    +tanks:xuhis-ninuh-kovux
    +tanks:xukon-pesoc-sibax
    +tanks:xofoc-hegyf-zyhyx
    +tanks:xecin-padur-sunex
    +tanks:xidik-kopol-bymyx
    +tanks:xecis-tazon-nokox
    +tanks:xopah-zeryp-fytix
    +tanks:xelog-runev-nidex
    +tanks:xosir-bihov-nuhyx
    +tanks:xurat-nygim-kikyx
    +tanks:xizav-zyciv-ritux
    +tanks:xokel-sisif-zalyx
    +tanks:xefig-lemyd-vucex
    +tanks:xezec-finug-mecox
    +tanks:xivem-gofiv-gahyx
    +tanks:xezis-dybog-hilax
    +tanks:xebec-gizyc-dybyx
    +tanks:xicoz-burac-fynax
    +tanks:xuleb-lenik-syrux
    +tanks:xovid-suvas-vigex
    +tanks:xitan-cymar-kedax
    +tanks:xicov-cotun-rukax
    +tanks:xofov-kokyv-tekyx
    +tanks:xugof-numyl-vemax
    +tanks:xuvet-gabym-gikyx
    +tanks:xonon-gyfaf-hihax
    +tanks:xitaz-losat-fohax
    +tanks:xihol-hyzil-gusyx
    +tanks:xelaf-tysuh-mezex
    +tanks:xesiv-dyhes-merox
    +tanks:xiges-fyfot-pysox
    +tanks:xivok-zipev-hidux
    +tanks:xupez-zirav-bylux
    +tanks:xunop-lukur-vopyx
    +tanks:xivet-fumul-ryzax
    +tanks:xitod-solub-bykox
    +tanks:xuzip-zutok-dofyx
    +tanks:xeric-gikus-fikex
    +tanks:xisos-bisan-kunux
    +tanks:xuded-hagic-dofux
    +tanks:ximit-gubep-docax
    +tanks:xuvar-fihoz-cacux
    +tanks:xuhas-muhaf-gotux
    +tanks:xihep-huvun-pecox
    +tanks:xuroz-poruh-domex
    +tanks:xehis-budad-lupux
    +tanks:xozog-vegob-kopox
    +tanks:xekor-vodar-fadux
    +tanks:xuver-tigut-tekax
    +tanks:xuner-picet-litex
    +tanks:xigeg-hatyd-muhex
    +tanks:xepom-cynad-lulux
    +tanks:xelap-bofed-tecax
    +tanks:xubec-focih-fenox
    +tanks:xuhem-hypoz-zynux
    +tanks:xebip-notop-rybux
    +tanks:xokap-lagog-nosix
    +tanks:xutev-docam-hosox
    +tanks:xusih-denib-gonyx
    +tanks:xunom-rutyg-zofox
    +tanks:xolel-mapam-cufyx
    +tanks:xitan-nesig-sasex
    +tanks:xikam-nytov-vafax
    +tanks:xobis-gukic-zukyx
    +tanks:xezad-radop-tytyx
    +tanks:xihif-rahur-fonox
    +tanks:xolah-behyk-pitax
    +tanks:xoraf-zisut-pazyx
    +tanks:xifir-nemov-mulix
    +tanks:xobir-fudim-belyx
    +tanks:xupiz-byvuk-zubix
    +tanks:xigap-kenid-mutux
    +tanks:xocif-koryc-bikyx
    +tanks:xibem-zoheg-sedyx
    +tanks:xodef-cacev-bemix
    +tanks:xetob-nuzec-bogox
    +tanks:xegaz-febot-pumix
    +tanks:ximor-sypof-vihex
    +tanks:xicig-herug-hofex
    +tanks:xehip-bebeb-natex
    +tanks:xinod-vupuh-ramex
    +tanks:xofor-vibug-pumax
    +tanks:xuhan-cumot-dybox
    +tanks:xotoh-fupim-voryx
    +tanks:xivot-nyzil-vomex
    +tanks:xesoz-lonyg-tonux
    +tanks:xucas-kutav-vasux
    +tanks:xogav-dylyl-burox
    +tanks:xucec-gipok-velex
    +tanks:xoped-getap-zazix
    +tanks:xepem-cekyd-lamux
    +tanks:xifas-tynaf-gibyx
    +tanks:xutih-vynaz-bihax
    +tanks:xozam-buzuk-rosyx
    +tanks:xoher-muvob-huzux
    +tanks:xisec-bikyt-benax
    +tanks:xezov-vohob-coryx
    +tanks:xecas-pevon-refix
    +tanks:xubeh-palip-tacox
    +tanks:xulot-nibok-lysix
    +tanks:xibir-pesap-mycax
    +tanks:xebam-kuryg-zolyx
    +tanks:xopor-basev-kivex
    +tanks:xufav-hebik-denox
    +tanks:xeben-garyn-kyrix
    +tanks:xehas-borit-dosix
    +tanks:xubod-hyvet-sebax
    +tanks:xerod-tofur-kemox
    +tanks:xeseg-fugyn-pulux
    +tanks:xelak-kypif-suhyx
    +tanks:xodis-takec-zabox
    +tanks:xevem-vavub-papax
    +tanks:xumil-gacoz-pohex
    +tanks:xepoh-logis-tavax
    +tanks:xohet-golop-fogex
    +tanks:xelem-turem-nynex
    +tanks:xinar-zotaz-vamux
    +tanks:xedol-fymun-tarux
    +tanks:xisif-gomac-mevex
    +tanks:xobic-ralon-movyx
    +tanks:xopat-mefuk-kozix
    +tanks:xukac-faram-kozax
    +tanks:xobiv-lolam-kucyx
    +tanks:xubog-tulok-kisax
    +tanks:xenak-vipuz-zufix
    +tanks:xezot-toluv-cutyx
    +tanks:xuvic-lolup-hetax
    +tanks:xucor-cuzyd-fepax
    +tanks:xuvac-ryrar-focux
    +tanks:xokoh-rezeb-simox
    +tanks:ximom-sycif-pozix
    +tanks:xotom-sepyl-fapyx
    +tanks:xenig-gycud-fatex
    +tanks:xovab-dakah-mupax
    +tanks:xecad-gysah-bibix
    +tanks:xides-secih-vobux
    +tanks:xopap-vevaf-tocux
    +tanks:xelon-rehyr-casax
    +tanks:ximip-kefal-ladax
    +tanks:xihef-zykod-falex
    +tanks:xevak-doneb-togex
    +tanks:xonim-zikor-kinyx
    +tanks:xisot-tesac-rohyx
    +tanks:xilom-tisyd-kefax
    +tanks:xelin-punec-degux
    +tanks:xumil-dokom-kicox
    +tanks:xotik-rizur-zogyx
    +tanks:xorap-hezif-kyzax
    +tanks:xeheb-lamic-sybix
    +tanks:xipil-sozes-momax
    +tanks:xedeh-gytoh-zumax
    +tanks:xogak-lodan-losex
    +tanks:xisik-bymes-sihix
    +tanks:xogob-dureh-bozex
    +tanks:xusad-lugap-korix
    +tanks:xifod-rihuv-givax
    +tanks:xeneb-tebuc-culyx
    +tanks:xogoh-vigyz-hukix
    +tanks:xunar-zatav-fagyx
    +tanks:xucak-tegeh-zyzox
    +tanks:xotol-cerih-vygix
    +tanks:xunos-koduk-syfyx
    +tanks:xufot-pecur-buvyx
    +tanks:xener-budiv-tonox
    +tanks:xubot-pusez-nesax
    +tanks:xitib-pizoz-rypox
    +tanks:xemac-muces-cyvex
    +tanks:xugib-nizif-redox
    +tanks:xofaf-gyras-votex
    +tanks:xinak-zahep-didox
    +tanks:xired-bybed-pudyx
    +tanks:xepaf-hilus-mekox
    +tanks:xenod-metyf-mutix
    +tanks:xebif-gyted-tygux
    +tanks:xisap-fulyv-hedyx
    +tanks:xodif-mulad-cakex
    +tanks:xogab-deted-cirix
    +tanks:xulad-dicim-sacix
    +tanks:xuhin-suhab-sydex
    +tanks:xopab-sanof-vybix
    +tanks:xicam-rilov-sesox
    +tanks:xuvep-tobol-micix
    +tanks:xezac-sokup-zydyx
    +tanks:xidem-hupav-gyfyx
    +tanks:xunar-tonuz-tazox
    +tanks:xorob-nuvuk-copox
    +tanks:xelas-casip-fomox
    +tanks:xevih-bypol-vafux
    +tanks:xekid-sazyp-rahix
    +tanks:xekod-ruvyr-zubex
    +tanks:xucoz-sizes-zizax
    +tanks:xecel-suluk-fotax
    +tanks:xihek-comuk-zitux
    +tanks:xoheg-camiv-tinix
    +tanks:xosal-zupip-hezux
    +tanks:xepit-zemys-navex
    +tanks:xucic-vasus-morix
    +tanks:xohes-divut-mafyx
    +tanks:xivik-dodac-lofux
    +tanks:xumic-morap-covex
    +tanks:xizeb-pycuk-pogax
    +tanks:xidel-zogef-fyrix
    +tanks:xetez-lybiv-mitux
    +tanks:xiheb-saceh-picix
    +tanks:xivir-tazal-dumix
    +tanks:xisak-myruc-hivix
    +tanks:xodad-vogil-fabax
    +tanks:xired-byvop-vynax
    +tanks:xokig-munis-necix
    +tanks:xubaz-megyb-vokyx
    +tanks:xolam-besos-nydyx
    +tanks:xucam-zuhev-bucax
    +tanks:xudam-sumiz-kekex
    +tanks:xodir-dyreh-hupax
    +tanks:xivak-pukip-nosex
    +tanks:xodip-neduh-vetyx
    +tanks:xudof-fegol-nogux
    +tanks:xinop-lezur-fonyx
    +tanks:xidap-dibah-dotux
    +tanks:xinor-sotyt-fymix
    +tanks:xipas-nugig-fyfux
    +tanks:xilap-vomih-vabax
    +tanks:xedil-vunod-forux
    +tanks:xedin-sulig-nenix
    +tanks:xipeb-holuh-lymix
    +tanks:xukor-dalut-mybax
    +tanks:xuveg-hybis-zykex
    +tanks:xepig-mepuk-lafox
    +tanks:xodiv-lyzur-zagox
    +tanks:xugav-syfit-vycyx
    +tanks:xenaz-bytuz-kadix
    +tanks:xuvid-gypem-vunex
    +tanks:xuhon-kanih-tysox
    +tanks:xosac-pahar-nusyx
    +tanks:xomec-kihap-kerux
    +tanks:ximef-nugul-cypex
    +tanks:xoped-kotik-duryx
    +tanks:xukoh-gyziv-hogox
    +tanks:xonon-lavac-zedux
    +tanks:xudem-nigop-fezax
    +tanks:xelot-pozin-tedex
    +tanks:xesit-befyb-sisix
    +tanks:xigag-velal-petix
    +tanks:ximel-ladev-pifix
    +tanks:xufon-lyhub-cypax
    +tanks:xuhas-subev-danyx
    +tanks:xivab-gydyt-besox
    +tanks:xezot-himuk-tulex
    +tanks:xetem-nucim-kuzix
    +tanks:xeboz-lonoz-mifax
    +tanks:xedez-kivug-cecox
    +tanks:xumab-vybaf-fupex
    +tanks:xosah-batub-pobyx
    +tanks:xevet-curar-ropix
    +tanks:xuzaf-rulyv-lasax
    +tanks:xifiz-zinuh-lolyx
    +tanks:xofas-cucuh-sezex
    +tanks:xizog-tykym-rukyx
    +tanks:xibop-bekaf-minex
    +tanks:xomor-kugar-matex
    +tanks:xemot-myrys-tanux
    +tanks:xucen-kykyh-zekex
    +tanks:xubon-gomep-lipix
    +tanks:xusob-ripet-tarix
    +tanks:xefis-zarak-tyzax
    +tanks:xelad-gyhom-nigyx
    +tanks:xizeb-zukit-pamix
    +tanks:xucem-hapef-tekux
    +tanks:xomim-dypit-torex
    +tanks:xozen-zalom-durix
    +tanks:xemaz-dadon-lucix
    +tanks:xucen-hylon-mevyx
    +tanks:xuleh-fotus-zilux
    +tanks:ximep-byvug-pozax
    +tanks:xuvif-dinab-rivyx
    +tanks:xunih-vykuf-kudix
    +tanks:xumel-sepud-ripux
    +tanks:xizah-hakof-pivox
    +tanks:xovol-vedof-bavix
    +tanks:xoled-pemyv-pipox
    +tanks:xogoz-nydys-pykex
    +tanks:ximov-fekyt-sutux
    +tanks:xever-kynib-serix
    +tanks:xuzav-cobuc-byhux
    +tanks:xobeh-butyd-sezox
    +tanks:xiros-bubem-mypex
    +tanks:xepem-diker-kazax
    +tanks:xufet-polir-kabox
    +tanks:xelit-guhyl-domex
    +tanks:xosen-vuvyk-kypux
    +tanks:xivok-sysek-bavyx
    +tanks:xunas-hahil-lokix
    +tanks:xefik-kukud-bubix
    +tanks:xocid-pobip-dumex
    +tanks:xihec-bubeg-fylox
    +tanks:xemez-nafob-pupox
    +tanks:xufag-kanat-hufox
    +tanks:xohil-gelad-parix
    +tanks:xecid-dypip-fapux
    +tanks:xocab-votim-panox
    +tanks:xuhet-sepes-cedux
    +tanks:xepes-hylun-tihux
    +tanks:xirar-tybip-togix
    +tanks:xoseg-sezeb-comix
    +tanks:xuham-marel-nanux
    +tanks:xumef-naziv-gacax
    +tanks:xifek-sakon-gabex
    +tanks:xotef-dygap-getix
    +tanks:xetap-colus-covex
    +tanks:xebig-balud-bylex
    +tanks:xuhev-lilym-bopux
    +tanks:xenis-susuz-bitex
    +tanks:xekir-neduf-zysex
    +tanks:xifal-cunaz-pydax
    +tanks:xubeh-robir-kepix
    +tanks:xesef-pybum-defax
    +tanks:xulin-pagog-hupix
    +tanks:xesef-salyc-nivyx
    +tanks:xigon-kecut-lomax
    +tanks:xuges-mimun-zorux
    +tanks:xecas-katun-myhex
    +tanks:xogir-baviz-venyx
    +tanks:xoliv-cyfah-fivox
    +tanks:xifip-zimur-cetox
    +tanks:xufah-mobep-cucax
    +tanks:xohaf-pityr-munux
    +tanks:xobic-kudim-vomox
    +tanks:xufin-pyrug-rydix
    +tanks:xovem-vuciz-sifyx
    +tanks:xeseb-pasyk-hofex
    +tanks:xotel-hador-retix
    +tanks:xofed-gyfoh-telax
    +tanks:xihas-bigez-buvux
    +tanks:xizot-kykyc-nucex
    +tanks:xibol-puryv-myfex
    +tanks:xocet-beluf-sibix
    +tanks:xupoc-vatyt-popex
    +tanks:xedar-cyluf-fucox
    +tanks:xobek-ficeh-pobyx
    +tanks:xinod-myvez-byrox
    +tanks:xugid-kovov-hodax
    +tanks:xuriv-sasyl-febix
    +tanks:xecok-nydul-zuzux
    +tanks:xitok-kulet-rakox
    +tanks:xohan-hidav-gotox
    +tanks:xolen-dilup-dubox
    +tanks:xokoh-tekav-fepyx
    +tanks:xedot-nigef-henix
    +tanks:xesob-zazos-kogox
    +tanks:xozik-hyrac-kekox
    +tanks:xinip-kysyh-rydex
    +tanks:xobah-gikud-nesux
    +tanks:xozem-hofyp-sacux
    +tanks:xebes-petev-capax
    +tanks:xoval-gisak-vasyx
    +tanks:xitil-lopyz-zasix
    +tanks:xodin-mufes-vifix
    +tanks:xufof-loceh-vovox
    +tanks:xoker-cyhed-hilyx
    +tanks:xepob-dycym-bavix
    +tanks:xugok-kevad-lozyx
    +tanks:xugid-lunel-podyx
    +tanks:xizoh-fibip-fesyx
    +tanks:xeror-gugor-vabox
    +tanks:xolid-pivod-bulex
    +tanks:xilam-hifyk-guvex
    +tanks:xehar-sozek-sakyx
    +tanks:xofap-safon-vezyx
    +tanks:xocip-dozed-dinax
    +tanks:xipik-rodad-nytix
    +tanks:xipev-cabak-pycyx
    +tanks:xufin-bumit-zynyx
    +tanks:xugim-myfev-hyvex
    +tanks:xugap-ripif-bakax
    +tanks:xosah-savap-tahux
    +tanks:xotos-rudiv-pekix
    +tanks:xerig-vydoc-rodex
    +tanks:ximiz-pilek-pycox
    +tanks:xobef-dunym-luzox
    +tanks:xilib-rosar-titix
    +tanks:xekac-hygyg-tycox
    +tanks:xomid-mopuh-febyx
    +tanks:xunab-tadef-teryx
    +tanks:xezig-lamod-hepux
    +tanks:xitom-rykin-fafyx
    +tanks:xemab-nygof-fopox
    +tanks:xikol-setur-rymax
    +tanks:xenen-cokip-mitax
    +tanks:xezim-dabeg-nosox
    +tanks:xeped-voguk-kigax
    +tanks:xubih-fific-dytyx
    +tanks:xefaz-dufih-cynix
    +tanks:xumin-hibul-kalax
    +tanks:xitad-byvyv-byhix
    +tanks:xicen-tukyc-barex
    +tanks:xulab-gimog-zuvux
    +tanks:xucir-lisaf-vulix
    +tanks:xemid-sazid-busox
    +tanks:xepan-pifud-symox
    +tanks:xubap-hiral-kazix
    +tanks:xugis-metas-tivax
    +tanks:xetiv-tiger-polux
    +tanks:xocif-fubuc-tisox
    +tanks:xuhim-nyzad-tubyx
    +tanks:xisin-tipag-razox
    +tanks:xomir-suleg-fodix
    +tanks:xocak-guvyz-debix
    +tanks:xuneg-zezar-henex
    +tanks:xiloc-sosuh-mulyx
    +tanks:xinaz-sokat-putux
    +tanks:xecec-herev-pazax
    +tanks:xegiz-nybuv-hapax
    +tanks:xulap-comuv-tovox
    +tanks:xucan-syvyn-bycix
    +tanks:xuhet-sirel-dikax
    +tanks:xomad-linys-kabyx
    +tanks:xolot-baryz-rizux
    +tanks:xubot-gupav-ruvux
    +tanks:xovod-vekac-kusix
    +tanks:xomid-dulob-fotax
    +tanks:xonen-tofab-cufax
    +tanks:xufib-zevun-muzux
    +tanks:xitig-vyhes-makux
    +tanks:xozib-gober-hitix
    +tanks:xiloc-famah-ladex
    +tanks:xotez-pabig-zozyx
    +tanks:xugap-ribuz-pudex
    +tanks:xovit-lepil-vuzex
    +tanks:xomap-timip-ranyx
    +tanks:xogoc-zohuk-sazex
    +tanks:xomir-nykad-dikix
    +tanks:xebiz-pypym-tyhox
    +tanks:xenig-casyh-nitax
    +tanks:xunom-caboc-legix
    +tanks:xuloh-pokev-lekox
    +tanks:xuhav-zerov-gymix
    +tanks:xisah-tinoh-gulux
    +tanks:xutom-godec-zibux
    +tanks:xusev-conin-begix
    +tanks:xibas-zefok-rakux
    +tanks:xekid-tysol-tofex
    +tanks:xokab-mygan-fityx
    +tanks:xekiz-sukeb-lipex
    +tanks:xogec-gosah-vedex
    +tanks:xedol-mukyh-dobyx
    +tanks:xomok-fylus-zokix
    +tanks:ximeh-hudom-rabax
    +tanks:xihon-lanug-dicix
    +tanks:xogil-cisys-kosux
    +tanks:xumov-bekak-simox
    +tanks:xezar-siroh-latax
    +tanks:xunab-gazun-mafox
    +tanks:xukim-menos-refox
    +tanks:xutos-mogaf-ruvox
    +tanks:xubik-kupas-zonux
    +tanks:xuzom-hugyt-virux
    +tanks:xebig-tasym-rohux
    +tanks:xovah-novud-ponex
    +tanks:xorez-zisec-vitex
    +tanks:xokev-dahog-mykix
    +tanks:xehed-lipom-burax
    +tanks:xefan-nodes-hekux
    +tanks:ximig-radoc-gynax
    +tanks:xecap-cizud-tyrex
    +tanks:xuhez-lunuh-kirux
    +tanks:xopes-tupyk-dalyx
    +tanks:xipiv-lohek-dymyx
    +tanks:xiver-somyb-hycox
    +tanks:xuran-rimuc-bupox
    +tanks:ximin-hamit-mycex
    +tanks:xuzac-tuzys-rogax
    +tanks:xolil-hakik-katyx
    +tanks:xiloc-povyh-kerax
    +tanks:xerom-fubim-pavyx
    +tanks:xefeh-vahum-sasox
    +tanks:xogab-baced-cimix
    +tanks:xumoz-zobur-rutex
    +tanks:xigam-lunyp-rugyx
    +tanks:xuhin-focag-calex
    +tanks:xocot-pesuf-mehax
    +tanks:xikab-makyt-kimox
    +tanks:xuref-lukeb-kurux
    +tanks:xiroh-ciryt-pyrex
    +tanks:xepoz-kemug-kotax
    +tanks:xodah-nyroc-hizux
    +tanks:xicar-syfac-gabox
    +tanks:xokav-pefep-dagex
    +tanks:xefom-rameb-pidyx
    +tanks:xodag-fupon-sicax
    +tanks:xekot-zucuc-hufix
    +tanks:xedal-syviz-kytax
    +tanks:xolal-byruh-fonax
    +tanks:xolom-bepan-tagex
    +tanks:xulak-nemer-dimux
    +tanks:xepov-vynif-lavax
    +tanks:xeseb-gekev-tikax
    +tanks:xotap-rorid-dihyx
    +tanks:xovob-cipoz-tunix
    +tanks:xubag-basik-ramix
    +tanks:xipon-fedap-pucix
    +tanks:xokez-panaz-gicix
    +tanks:xohab-gefaf-gulyx
    +tanks:xeviv-dovyt-gafux
    +tanks:xutot-camip-gilax
    +tanks:ximes-mibod-bigux
    +tanks:xofap-tamid-mulox
    +tanks:xikic-risud-patyx
    +tanks:xuges-mazib-kahux
    +tanks:xecog-benid-hymyx
    +tanks:xepit-hosoh-dykux
    +tanks:xodal-cugal-zunox
    +tanks:xotor-zohak-husyx
    +tanks:xotob-caken-patox
    +tanks:xoten-levaf-zirex
    +tanks:xomat-tubym-musex
    +tanks:xebiv-rolat-gimix
    +tanks:xopeb-zykus-mycox
    +tanks:xesep-buvom-pefyx
    +tanks:xibef-hycip-merux
    +tanks:xecal-mafuk-bomux
    +tanks:xozos-daceh-rucix
    +tanks:xeraz-bumus-hidox
    +tanks:xukig-zynag-nefyx
    +tanks:xohaf-tesyc-gatex
    +tanks:xucit-ryvuf-zufax
    +tanks:xenif-racoh-kuhux
    +tanks:xisoz-sisoz-kyrax
    +tanks:xozir-hysob-pefix
    +tanks:xomim-nesoz-lemix
    +tanks:xolec-kefiv-herox
    +tanks:xebeb-dubyl-motex
    +tanks:xofog-tobof-kegux
    +tanks:xumob-syrav-mulax
    +tanks:xopez-sahen-pifyx
    +tanks:xelad-zufak-kifux
    +tanks:xocat-zanah-rokox
    +tanks:xupin-zyliv-gepux
    +tanks:xuhip-tyzyn-pygyx
    +tanks:xudic-hezer-duhox
    +tanks:xoseh-zonob-lydix
    +tanks:xocaz-gogod-sofex
    +tanks:xolag-bycom-curyx
    +tanks:xuvim-sybyk-megix
    +tanks:xogom-susuf-hunax
    +tanks:xules-sadav-fopox
    +tanks:xicod-puzak-nabox
    +tanks:xukap-mapug-zasix
    +tanks:xorav-fotyp-vapix
    +tanks:xopab-nurez-myfex
    +tanks:xubat-gohip-lycox
    +tanks:xorar-mosag-mavex
    +tanks:xufah-lutib-hatux
    +tanks:xudal-zitab-ramux
    +tanks:xipar-bylib-zofux
    +tanks:xomok-hahof-sulix
    +tanks:xukag-kucov-pogyx
    +tanks:xucis-zynys-behux
    +tanks:xucid-sucaf-hyzix
    +tanks:xonin-gizyp-zosax
    +tanks:xumom-luzam-suzix
    +tanks:xunop-bavug-lobax
    +tanks:xileg-hyped-gorux
    +tanks:xidat-pikob-sinax
    +tanks:xesef-zadoh-vulux
    +tanks:xogon-zaler-fohux
    +tanks:xuhaz-curem-sarux
    +tanks:xenot-lofag-valox
    +tanks:xusog-myzon-mugox
    +tanks:xezam-hafyt-gemox
    +tanks:xipor-vogef-fabox
    +tanks:xuvol-lulep-hihux
    +tanks:xuzol-tuluv-hibyx
    +tanks:xikof-conos-gebex
    +tanks:xehal-rynin-lecax
    +tanks:xocal-tyzec-pykix
    +tanks:xihak-vefyt-tetax
    +tanks:xuman-tuhop-fozix
    +tanks:xiheb-dusyc-muzex
    +tanks:xuvec-rikot-hecax
    +tanks:xolar-turar-cigyx
    +tanks:xifez-gital-rasux
    +tanks:xuroh-cohak-civix
    +tanks:xekom-gypir-volix
    +tanks:xugit-pevag-zopox
    +tanks:xevac-sekap-nivyx
    +tanks:xecib-tilum-lugux
    +tanks:xelor-bimif-kovyx
    +tanks:ximan-tapop-fipyx
    +tanks:xidoh-morub-verex
    +tanks:xeran-davyf-ligax
    +tanks:xiran-pohuh-valex
    +tanks:xufil-tadar-rityx
    +tanks:xuper-revaz-vysyx
    +tanks:xodev-vonyc-lycux
    +tanks:xesah-ragos-vasux
    +tanks:xipet-rykuc-culox
    +tanks:ximoh-fomyr-bidex
    +tanks:xedeh-zozat-lydyx
    +tanks:ximac-socaf-dahux
    +tanks:xehad-desid-tycax
    +tanks:ximel-pulyt-carux
    +tanks:xolar-bitor-fevyx
    +tanks:xevag-zyfin-gabox
    +tanks:xucav-hakok-hadox
    +tanks:xucot-pucin-relax
    +tanks:xenar-cozap-kivax
    +tanks:xufom-safor-vucox
    +tanks:xihip-ruvyd-tobyx
    +tanks:xohez-rukat-nugux
    +tanks:xumir-hudaf-sarux
    +tanks:xosis-rizug-hyfex
    +tanks:xucip-kahus-dupyx
    +tanks:xidoz-buzyk-magex
    +tanks:xomib-vutis-gobyx
    +tanks:xeset-zudag-gyzix
    +tanks:xizis-hugok-hyfox
    +tanks:xotor-rudiv-zirex
    +tanks:xemed-hatuz-hugox
    +tanks:xoper-vyfuh-zudox
    +tanks:xidem-gabal-kyrix
    +tanks:xihab-kedos-cibax
    +tanks:xipan-vytyf-dapyx
    +tanks:xotof-nafog-kizax
    +tanks:xizib-hecer-cosax
    +tanks:xinas-leveb-nupix
    +tanks:xuvoc-torun-nypux
    +tanks:xonam-zinen-nozux
    +tanks:xorah-gacyz-sonyx
    +tanks:xecob-pucek-bagix
    +tanks:xubar-vatyp-bavex
    +tanks:xures-luzat-necux
    +tanks:xugah-gunif-posex
    +tanks:xovep-luvef-gefex
    +tanks:xofip-cuvoz-katex
    +tanks:xogoz-mebak-sabax
    +tanks:xikat-bulib-canox
    +tanks:xihez-zyzuk-bigyx
    +tanks:xigok-pomob-sosox
    +tanks:xopeg-byguc-dabyx
    +tanks:xurag-pylov-mefyx
    +tanks:xubat-gevuh-hyfox
    +tanks:xotoz-rifeh-ridox
    +tanks:xovez-hurev-nydux
    +tanks:xehek-lyhad-celax
    +tanks:xegim-ludon-kurax
    +tanks:xifag-vunon-zefex
    +tanks:xerih-mison-higax
    +tanks:xebiv-buzyn-zakix
    +tanks:xigap-gyzir-memax
    +tanks:xecel-sovyb-papux
    +tanks:xosen-fihyr-lybix
    +tanks:xuvib-cezyz-syhex
    +tanks:xogif-cudik-pulox
    +tanks:xonel-zakar-pelox
    +tanks:xiben-vemeg-kunix
    +tanks:xezak-tarak-makax
    +tanks:xineb-betad-cytax
    +tanks:xubit-zysob-dalax
    +tanks:xozoc-popam-befyx
    +tanks:xitom-tosum-cezox
    +tanks:xikef-povor-rokux
    +tanks:xizit-lukuv-gylix
    +tanks:xihil-zoboc-cudix
    +tanks:xedot-turor-gypux
    +tanks:xitot-vakip-bunox
    +tanks:xevem-dikev-palux
    +tanks:xehic-zyrot-gakux
    +tanks:xikar-begom-cikyx
    +tanks:xobog-cyciv-zugyx
    +tanks:xufil-gygyd-sicex
    +tanks:xelic-mygyh-mehix
    +tanks:xudol-zadaf-rofux
    +tanks:xelim-hinyp-cugyx
    +tanks:xigof-viges-zahyx
    +tanks:xenes-fusev-kehax
    +tanks:xuval-gusub-zapex
    +tanks:xocak-hepor-tazyx
    +tanks:xilot-muzuc-sotyx
    +tanks:xucek-donet-nokox
    +tanks:xiloz-dabiz-vygux
    +tanks:xofet-pykaf-horex
    +tanks:xiziv-pemof-hobyx
    +tanks:xizel-vusen-fezox
    +tanks:xutap-rovor-hykix
    
    From 9e6f61c824e6ab322643620a0f3e4e5e965c6ba5 Mon Sep 17 00:00:00 2001
    From: Neale Pickett 
    Date: Sat, 5 Nov 2011 17:40:14 -0600
    Subject: [PATCH 25/25] increase ipv6 neighbor threshholds
    
    ---
     packages/router/service/router/run | 3 +++
     1 file changed, 3 insertions(+)
    
    diff --git a/packages/router/service/router/run b/packages/router/service/router/run
    index 54fd6b9..29ccdd5 100755
    --- a/packages/router/service/router/run
    +++ b/packages/router/service/router/run
    @@ -2,6 +2,9 @@
     
     exec 2>&1
     
    +echo 8192 > /proc/sys/net/ipv6/neigh/default/gc_thresh3
    +echo 4096 > /proc/sys/net/ipv6/neigh/default/gc_thresh2
    +
     PFX=fd84:b410:3441
     
     log () {