unzip ndk.zip && \
mkdir /root/lib && \
mv /tmp/android-sdk-linux /root/lib/android-sdk && \
- mv /tmp/android-ndk-r11-linux-x86_64.tar.bz2 /root/lib/android-ndk && \
+ mv /tmp/android-ndk-r11 /root/lib/android-ndk && \
rm -fr /tmp/*
RUN mkdir -p /data/data/com.termux/files/usr && mkdir -p /root/termux-packages && \
exit 1
fi
- local TERMUX_GO_VERSION=go1.6
+ local TERMUX_GO_VERSION=go1.6.1
local TERMUX_GO_PLATFORM=linux-amd64
test `uname` = "Darwin" && TERMUX_GO_PLATFORM=darwin-amd64
+++ /dev/null
-/**************************************************************************
-* Unix-like crypt(3) Algorithm for Password Encryption
-*
-* File : crypt3.c
-* Purpose : Provides crypt(3) functionality to ANSI C compilers
-* without a need for the crypt library.
-* Author : Michael Dipperstein
-* Date : November 3, 1998
-*
-***************************************************************************
-* The source in this file is heavily borrowed from the crypt3.c file
-* found on several ftp sites on the Internet. The original source
-* claimed to be BSD, but was not distributed with any BSD license or
-* copyright claims. I am releasing the source that I have provided into
-* public domain without any restrictions, warranties, or copyright
-* claims of my own.
-*
-* The code below has been cleaned and compiles correctly under, gcc,
-* lcc, and Borland's bcc C compilers. A bug involving the left and
-* right halves of the encrypted data block in the widely published
-* crypt3.c source has been fixed by this version. All implicit register
-* declarations have been removed, because they generated suboptimal code.
-* All constant data has been explicitly declared as const and all
-* declarations have been given a minimal scope, because I'm paranoid.
-*
-* Caution: crypt() returns a pointer to static data. I left it this way
-* to maintain backward compatibility. The downside is that
-* successive calls will cause previous results to be lost.
-* This can easily be changed with only minor modifications to
-* the function crypt().
-**************************************************************************/
-
-/* Initial permutation */
-static const char IP[] =
-{
- 58, 50, 42, 34, 26, 18, 10, 2,
- 60, 52, 44, 36, 28, 20, 12, 4,
- 62, 54, 46, 38, 30, 22, 14, 6,
- 64, 56, 48, 40, 32, 24, 16, 8,
- 57, 49, 41, 33, 25, 17, 9, 1,
- 59, 51, 43, 35, 27, 19, 11, 3,
- 61, 53, 45, 37, 29, 21, 13, 5,
- 63, 55, 47, 39, 31, 23, 15, 7,
-};
-
-/* Final permutation, FP = IP^(-1) */
-static const char FP[] = {
- 40, 8, 48, 16, 56, 24, 64, 32,
- 39, 7, 47, 15, 55, 23, 63, 31,
- 38, 6, 46, 14, 54, 22, 62, 30,
- 37, 5, 45, 13, 53, 21, 61, 29,
- 36, 4, 44, 12, 52, 20, 60, 28,
- 35, 3, 43, 11, 51, 19, 59, 27,
- 34, 2, 42, 10, 50, 18, 58, 26,
- 33, 1, 41, 9, 49, 17, 57, 25,
-};
-
-/**************************************************************************
-* Permuted-choice 1 from the key bits to yield C and D.
-* Note that bits 8,16... are left out:
-* They are intended for a parity check.
-**************************************************************************/
-static const char PC1_C[] =
-{
- 57, 49, 41, 33, 25, 17, 9,
- 1, 58, 50, 42, 34, 26, 18,
- 10, 2, 59, 51, 43, 35, 27,
- 19, 11, 3, 60, 52, 44, 36,
-};
-
-static const char PC1_D[] =
-{
- 63, 55, 47, 39, 31, 23, 15,
- 7, 62, 54, 46, 38, 30, 22,
- 14, 6, 61, 53, 45, 37, 29,
- 21, 13, 5, 28, 20, 12, 4,
-};
-
-/* Sequence of shifts used for the key schedule. */
-static const char shifts[] =
- {1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1};
-
-/**************************************************************************
-* Permuted-choice 2, to pick out the bits from the CD array that generate
-* the key schedule.
-**************************************************************************/
-static const char PC2_C[] =
-{
- 14, 17, 11, 24, 1, 5,
- 3, 28, 15, 6, 21, 10,
- 23, 19, 12, 4, 26, 8,
- 16, 7, 27, 20, 13, 2,
-};
-
-static const char PC2_D[] =
-{
- 41, 52, 31, 37, 47, 55,
- 30, 40, 51, 45, 33, 48,
- 44, 49, 39, 56, 34, 53,
- 46, 42, 50, 36, 29, 32,
-};
-
-/* The C and D arrays used to calculate the key schedule. */
-static char C[28];
-static char D[28];
-
-/* The key schedule. Generated from the key. */
-static char KS[16][48];
-
-/* The E bit-selection table. */
-static char E[48];
-static const char e2[] =
-{
- 32, 1, 2, 3, 4, 5,
- 4, 5, 6, 7, 8, 9,
- 8, 9, 10, 11, 12, 13,
- 12, 13, 14, 15, 16, 17,
- 16, 17, 18, 19, 20, 21,
- 20, 21, 22, 23, 24, 25,
- 24, 25, 26, 27, 28, 29,
- 28, 29, 30, 31, 32, 1,
-};
-
-/**************************************************************************
-* Function: setkey
-*
-* Description: Set up the key schedule from the encryption key.
-*
-* Inputs: char *key
-* pointer to 64 character array. Each character represents a
-* bit in the key.
-*
-* Returns: none
-**************************************************************************/
-void setkey(char *key)
-{
- int i, j, k, temp;
-
- /**********************************************************************
- * First, generate C and D by permuting the key. The low order bit of
- * each 8-bit char is not used, so C and D are only 28 bits apiece.
- **********************************************************************/
- for(i = 0; i < 28; i++)
- {
- C[i] = key[PC1_C[i] - 1];
- D[i] = key[PC1_D[i] - 1];
- }
-
- /**********************************************************************
- * To generate Ki, rotate C and D according to schedule and pick up a
- * permutation using PC2.
- **********************************************************************/
- for(i = 0; i < 16; i++)
- {
- /* rotate */
- for(k = 0; k < shifts[i]; k++)
- {
- temp = C[0];
-
- for(j = 0; j < 28 - 1; j++)
- C[j] = C[j+1];
-
- C[27] = temp;
- temp = D[0];
- for(j = 0; j < 28 - 1; j++)
- D[j] = D[j+1];
-
- D[27] = temp;
- }
-
- /* get Ki. Note C and D are concatenated */
- for(j = 0; j < 24; j++)
- {
- KS[i][j] = C[PC2_C[j] - 1];
- KS[i][j + 24] = D[PC2_D[j] - 28 -1];
- }
- }
-
- /* load E with the initial E bit selections */
- for(i=0; i < 48; i++)
- E[i] = e2[i];
-}
-
-/**************************************************************************
-* The 8 selection functions. For some reason, they give a 0-origin
-* index, unlike everything else.
-**************************************************************************/
-
-static const char S[8][64] =
-{
- {
- 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
- 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
- 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
- 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13
- },
-
- {
- 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
- 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
- 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
- 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9
- },
-
- {
- 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
- 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
- 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
- 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12
- },
-
- {
- 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
- 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
- 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
- 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14
- },
-
- {
- 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
- 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
- 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
- 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3
- },
-
- {
- 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
- 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
- 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
- 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13
- },
-
- {
- 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
- 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
- 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
- 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12
- },
-
- {
- 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
- 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
- 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
- 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11
- }
-};
-
-/**************************************************************************
-* P is a permutation on the selected combination of the current L and key.
-**************************************************************************/
-static const char P[] =
-{
- 16, 7, 20, 21,
- 29, 12, 28, 17,
- 1, 15, 23, 26,
- 5, 18, 31, 10,
- 2, 8, 24, 14,
- 32, 27, 3, 9,
- 19, 13, 30, 6,
- 22, 11, 4, 25,
-};
-
-/* The combination of the key and the input, before selection. */
-static char preS[48];
-
-/**************************************************************************
-* Function: encrypt
-*
-* Description: Uses DES to encrypt a 64 bit block of data. Requires
-* setkey to be invoked with the encryption key before it may
-* be used. The results of the encryption are stored in block.
-*
-* Inputs: char *block
-* pointer to 64 character array. Each character represents a
-* bit in the data block.
-*
-* Returns: none
-**************************************************************************/
-void encrypt(char *block)
-{
- int i, ii, temp, j, k;
-
- char left[32], right[32]; /* block in two halves */
- char old[32];
- char f[32];
-
- /* First, permute the bits in the input */
- for(j = 0; j < 32; j++)
- left[j] = block[IP[j] - 1];
-
- for(;j < 64; j++)
- right[j - 32] = block[IP[j] - 1];
-
- /* Perform an encryption operation 16 times. */
- for(ii= 0; ii < 16; ii++)
- {
- i = ii;
- /* Save the right array, which will be the new left. */
- for(j = 0; j < 32; j++)
- old[j] = right[j];
-
- /******************************************************************
- * Expand right to 48 bits using the E selector and
- * exclusive-or with the current key bits.
- ******************************************************************/
- for(j =0 ; j < 48; j++)
- preS[j] = right[E[j] - 1] ^ KS[i][j];
-
- /******************************************************************
- * The pre-select bits are now considered in 8 groups of 6 bits ea.
- * The 8 selection functions map these 6-bit quantities into 4-bit
- * quantities and the results are permuted to make an f(R, K).
- * The indexing into the selection functions is peculiar;
- * it could be simplified by rewriting the tables.
- ******************************************************************/
- for(j = 0; j < 8; j++)
- {
- temp = 6 * j;
- k = S[j][(preS[temp + 0] << 5) +
- (preS[temp + 1] << 3) +
- (preS[temp + 2] << 2) +
- (preS[temp + 3] << 1) +
- (preS[temp + 4] << 0) +
- (preS[temp + 5] << 4)];
-
- temp = 4 * j;
-
- f[temp + 0] = (k >> 3) & 01;
- f[temp + 1] = (k >> 2) & 01;
- f[temp + 2] = (k >> 1) & 01;
- f[temp + 3] = (k >> 0) & 01;
- }
-
- /******************************************************************
- * The new right is left ^ f(R, K).
- * The f here has to be permuted first, though.
- ******************************************************************/
- for(j = 0; j < 32; j++)
- right[j] = left[j] ^ f[P[j] - 1];
-
- /* Finally, the new left (the original right) is copied back. */
- for(j = 0; j < 32; j++)
- left[j] = old[j];
- }
-
- /* The output left and right are reversed. */
- for(j = 0; j < 32; j++)
- {
- temp = left[j];
- left[j] = right[j];
- right[j] = temp;
- }
-
- /* The final output gets the inverse permutation of the very original. */
- for(j = 0; j < 64; j++)
- {
- i = FP[j];
- if (i < 33)
- block[j] = left[FP[j] - 1];
- else
- block[j] = right[FP[j] - 33];
- }
-}
-
-/**************************************************************************
-* Function: crypt
-*
-* Description: Clone of Unix crypt(3) function.
-*
-* Inputs: char *pw
-* pointer to 8 character encryption key (user password)
-* char *salt
-* pointer to 2 character salt used to modify the DES results.
-*
-* Returns: Pointer to static array containing the salt concatenated
-* on to the encrypted results. Same as stored in passwd file.
-**************************************************************************/
-char *crypt(char *pw, char *salt)
-{
- int i, j, temp;
- char c,
- block[66]; /* 1st store key, then results */
- static char iobuf[16]; /* encrypted results */
-
- for(i = 0; i < 66; i++)
- block[i] = 0;
-
- /* break pw into 64 bits */
- for(i = 0, c = *pw; c && (i < 64); i++)
- {
- for(j = 0; j < 7; j++, i++)
- block[i] = (c >> (6 - j)) & 01;
- pw++;
- c = *pw;
- }
-
- /* set key based on pw */
- setkey(block);
-
- for(i = 0; i < 66; i++)
- block[i] = 0;
-
- for(i = 0; i < 2; i++)
- {
- /* store salt at beginning of results */
- c = *salt++;
- iobuf[i] = c;
-
- if(c > 'Z')
- c -= 6;
-
- if(c > '9')
- c -= 7;
-
- c -= '.';
-
- /* use salt to effect the E-bit selection */
- for(j = 0; j < 6; j++)
- {
- if((c >> j) & 01)
- {
- temp = E[6 * i + j];
- E[6 * i +j] = E[6 * i + j + 24];
- E[6 * i + j + 24] = temp;
- }
- }
- }
-
- /* call DES encryption 25 times using pw as key and initial data = 0 */
- for(i = 0; i < 25; i++)
- encrypt(block);
-
- /* format encrypted block for standard crypt(3) output */
- for(i=0; i < 11; i++)
- {
- c = 0;
- for(j = 0; j < 6; j++)
- {
- c <<= 1;
- c |= block[6 * i + j];
- }
-
- c += '.';
- if(c > '9')
- c += 7;
-
- if(c > 'Z')
- c += 6;
-
- iobuf[i + 2] = c;
- }
-
- iobuf[i + 2] = '\0';
-
- /* prevent premature NULL terminator */
- if(iobuf[1] == '\0')
- iobuf[1] = iobuf[0];
-
- return(iobuf);
-}
+++ /dev/null
-#0 0xb6f72b24 in std::locale::operator=(std::locale const&) () from /data/data/com.termux/files/usr/lib/libgnustl_shared.so
-#1 0xb6f71e54 in std::ios_base::_M_init() () from /data/data/com.termux/files/usr/lib/libgnustl_shared.so
-#2 0xb6f7df64 in std::basic_ios<char, std::char_traits<char> >::init(std::basic_streambuf<char, std::char_traits<char> >*) ()
- from /data/data/com.termux/files/usr/lib/libgnustl_shared.so
-#3 0x2a012ef8 in std::basic_istream<char, std::char_traits<char> >::basic_istream (__vtt_parm=<optimized out>, this=0xb6167348,
- __in_chrg=<optimized out>) at /home/fornwall/lib/android-standalone-toolchain-arm-api21-gcc4.9/include/c++/4.9/istream:608
-#4 std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream (__mode=(std::_S_bin | std::_S_in),
- __s=0x2a04a560 <rdev> "/dev/urandom", this=0xb6167348, __in_chrg=<optimized out>, __vtt_parm=<optimized out>)
- at /home/fornwall/lib/android-standalone-toolchain-arm-api21-gcc4.9/include/c++/4.9/fstream:471
-#5 PRNG::PRNG (this=0xb6167348) at /home/fornwall/termux/mosh/src/src/frontend/../crypto/prng.h:59
-#6 Network::TransportSender<Network::UserStream>::TransportSender (this=0xb6167288, s_connection=<optimized out>, initial_state=...)
- at /home/fornwall/termux/mosh/src/src/frontend/../network/transportsender.cc:65
-#7 0x2a01322c in Network::Transport<Network::UserStream, Terminal::Complete>::Transport (this=0xb6167100, initial_state=...,
- initial_remote=..., key_str=<optimized out>, ip=0xb60408cc "23.229.0.146", port=0xb6037214 "60001")
- at /home/fornwall/termux/mosh/src/src/frontend/../network/networktransport.cc:65
-#8 0x2a009cb0 in STMClient::main_init (this=this@entry=0xbefff790) at /home/fornwall/termux/mosh/src/src/frontend/stmclient.cc:251
-#9 0x2a009ff4 in STMClient::main (this=0xbefff790) at /home/fornwall/termux/mosh/src/src/frontend/stmclient.cc:414
-#10 0x2a005f00 in main (argc=<optimized out>, argv=<optimized out>) at /home/fornwall/termux/mosh/src/src/frontend/mosh-client.cc:171
-
+++ /dev/null
-TERMUX_PKG_HOMEPAGE=http://mosh.mit.edu/
-TERMUX_PKG_DESCRIPTION="Mobile shell that supports roaming and intelligent local echo"
-TERMUX_PKG_VERSION=1.2.5
-TERMUX_PKG_SRCURL=http://mosh.mit.edu/mosh-${TERMUX_PKG_VERSION}.tar.gz
-TERMUX_PKG_DEPENDS="libandroid-support, protobuf, ncurses, openssl, libutil, perl"
-
-export PROTOC=$TERMUX_TOPDIR/protobuf/host-build/src/protoc
-
-LDFLAGS+=" -lgnustl_shared"
TERMUX_PKG_HOMEPAGE=https://racket-lang.org
TERMUX_PKG_DESCRIPTION="Full-spectrum programming language going beyond Lisp and Scheme"
-TERMUX_PKG_VERSION=6.3
-TERMUX_PKG_SRCURL=https://mirror.racket-lang.org/releases/6.3/installers/racket-minimal-${TERMUX_PKG_VERSION}-src-builtpkgs.tgz
-TERMUX_PKG_DEPENDS="libffi, libandroid-support"
-# TERMUX_PKG_EXTRA_CONFIGURE_ARGS="--with-ssl=openssl --disable-iri"
-# TERMUX_PKG_HOSTBUILD=true
+TERMUX_PKG_VERSION=6.4
+TERMUX_PKG_SRCURL=https://mirror.racket-lang.org/installers/${TERMUX_PKG_VERSION}/racket-minimal-${TERMUX_PKG_VERSION}-src-builtpkgs.tgz
TERMUX_PKG_FOLDERNAME=racket-${TERMUX_PKG_VERSION}
-TERMUX_MAKE_PROCESSES=1
+TERMUX_PKG_HOSTBUILD=true
+TERMUX_PKG_DEPENDS="libffi, libandroid-support"
+TERMUX_PKG_EXTRA_CONFIGURE_ARGS="--enable-racket=$TERMUX_PKG_HOSTBUILD_DIR/racket/racketcgc"
+# Building racket hits the 'the wrong gcc-problem' detailed at http://www.metastatic.org/text/libtool.html
+# due to --tag=CC being used. To avoid that a cross libtool built in termux_step_post_extract_package()
+# below and used due to this configure argument:
+_CROSS_LIBTOOL_DIR=$TERMUX_PKG_CACHEDIR/libtool-cross-2.4.6-${TERMUX_HOST_PLATFORM}
+TERMUX_PKG_EXTRA_CONFIGURE_ARGS+=" --enable-lt=$_CROSS_LIBTOOL_DIR/bin/${TERMUX_HOST_PLATFORM}-libtool"
+
+LDFLAGS+=" -llog"
termux_step_post_extract_package () {
+ if [ ! -d $_CROSS_LIBTOOL_DIR ]; then
+ LIBTOOL_TARFILE=$TERMUX_PKG_CACHEDIR/libtool-2.4.6.tar.gz
+ if [ ! -f $LIBTOOL_TARFILE ]; then
+ curl -L -o $LIBTOOL_TARFILE http://ftpmirror.gnu.org/libtool/libtool-2.4.6.tar.gz
+ fi
+ cd $TERMUX_PKG_CACHEDIR
+ tar xf $LIBTOOL_TARFILE
+ cd libtool-2.4.6
+ ./configure --prefix=$_CROSS_LIBTOOL_DIR --host=$TERMUX_HOST_PLATFORM --program-prefix=${TERMUX_HOST_PLATFORM}-
+ make install
+ fi
+
export TERMUX_PKG_SRCDIR=$TERMUX_PKG_SRCDIR/src
}
--- /dev/null
+"The getdtablesize functions has been deprecated by Posix and has been
+removed from Android's LB64 ABI. Replace calls to it with the modern
+equivalent sysconf(_SC_OPEN_MAX)."
+
+- https://groups.google.com/a/chromium.org/forum/#!topic/chromium-reviews/AXhZapYuHi8
+
+diff -u -r ../../racket-6.4/src/racket/src/port.c ./racket/src/port.c
+--- ../../racket-6.4/src/racket/src/port.c 2016-01-14 12:11:20.000000000 -0500
++++ ./racket/src/port.c 2016-04-10 17:43:40.039414493 -0400
+@@ -1090,7 +1090,7 @@
+ # ifdef USE_ULIMIT
+ dynamic_fd_size = ulimit(4, 0);
+ # else
+- dynamic_fd_size = getdtablesize();
++ dynamic_fd_size = sysconf(_SC_OPEN_MAX);
+ # endif
+ /* divide by bits-per-byte: */
+ dynamic_fd_size = (dynamic_fd_size + 7) >> 3;
+@@ -1365,7 +1365,7 @@
+ # ifdef FIXED_FD_LIMIT
+ limit = FIXED_FD_LIMIT;
+ # else
+- limit = getdtablesize();
++ limit = sysconf(_SC_OPEN_MAX);
+ # endif
+ # endif
+ # endif
+@@ -10390,7 +10390,7 @@
+ # ifdef USE_ULIMIT
+ i = ulimit(4, 0);
+ # else
+- i = getdtablesize();
++ i = sysconf(_SC_OPEN_MAX);
+ # endif
+ while (i--) {
+ int cr;
--- /dev/null
+TERMUX_PKG_HOMEPAGE=http://www.sbcl.org/
+TERMUX_PKG_DESCRIPTION="Steel Bank Common Lisp"
+TERMUX_PKG_VERSION=1.3.4
+TERMUX_PKG_SRCURL=http://prdownloads.sourceforge.net/sbcl/sbcl-${TERMUX_PKG_VERSION}-source.tar.bz2
+TERMUX_PKG_FOLDERNAME=sbcl-$TERMUX_PKG_VERSION
+
+termux_step_pre_configure () {
+ local SBCL_HOST_TARFILE=$TERMUX_PKG_CACHEDIR/sbcl-host-${TERMUX_PKG_VERSION}.tar.bz2
+ if [ ! -f $SBCL_HOST_TARFILE ]; then
+ curl -o $SBCL_HOST_TARFILE -L http://downloads.sourceforge.net/project/sbcl/sbcl/1.3.4/sbcl-1.3.4-x86-64-linux-binary.tar.bz2
+ cd $TERMUX_PKG_TMPDIR
+ tar xf $SBCL_HOST_TARFILE
+ cd sbcl-1.3.4-x86-64-linux
+ INSTALL_ROOT=$TERMUX_PKG_CACHEDIR/sbcl-host sh install.sh
+ fi
+ export PATH=$PATH:$TERMUX_PKG_CACHEDIR/sbcl-host/bin
+ export SBCL_HOME=$TERMUX_PKG_CACHEDIR/sbcl-host/lib/sbcl
+}
+
+termux_step_make_install () {
+ cd $TERMUX_PKG_SRCDIR
+ sh make.sh --prefix=$TERMUX_PREFIX
+}
--- /dev/null
+diff -u -r ../sbcl-1.3.4/make-config.sh ./make-config.sh
+--- ../sbcl-1.3.4/make-config.sh 2016-03-31 03:28:36.000000000 -0400
++++ ./make-config.sh 2016-04-10 16:43:40.651905145 -0400
+@@ -754,8 +754,9 @@
+ # cross-compilers!
+ #
+ # FIXME: integrate to grovel-features, mayhaps
+-$GNUMAKE -C tools-for-build determine-endianness -I ../src/runtime
+-tools-for-build/determine-endianness >> $ltf
++# $GNUMAKE -C tools-for-build determine-endianness -I ../src/runtime
++# tools-for-build/determine-endianness >> $ltf
++echo " :little-endian" >> $ltf # Termux patch.
+
+ export sbcl_os sbcl_arch
+ sh tools-for-build/grovel-features.sh >> $ltf
--- /dev/null
+diff -u -r /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/paths.h ./usr/include/paths.h
+--- /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/paths.h 2016-03-03 16:54:24.000000000 -0500
++++ ./usr/include/paths.h 2016-04-11 03:56:22.460545708 -0400
+@@ -66,9 +66,9 @@
+
+ /* Provide trailing slash, since mostly used for building pathnames. */
+ #define _PATH_DEV "/dev/"
+-#define _PATH_TMP "/tmp/"
+-#define _PATH_VARDB "/var/db/"
+-#define _PATH_VARRUN "/var/run/"
+-#define _PATH_VARTMP "/var/tmp/"
++#define _PATH_TMP "@TERMUX_PREFIX@/tmp/"
++#define _PATH_VARDB "@TERMUX_PREFIX@/var/db/"
++#define _PATH_VARRUN "@TERMUX_PREFIX@/var/run/"
++#define _PATH_VARTMP "@TERMUX_PREFIX@/var/tmp/"
+
+ #endif /* !_PATHS_H_ */
diff -u -r /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/stdio.h ./usr/include/stdio.h
---- /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/stdio.h 2014-10-14 22:53:49.000000000 -0400
-+++ ./usr/include/stdio.h 2015-12-24 03:07:45.028840214 -0500
-@@ -52,6 +52,8 @@
+--- /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/stdio.h 2016-03-03 16:54:24.000000000 -0500
++++ ./usr/include/stdio.h 2016-04-11 06:54:22.893930847 -0400
+@@ -52,6 +52,10 @@
#include <stdarg.h>
#include <stddef.h>
+#include <string.h> /* For strcpy(3) used by ctermid() */
++#include <asm-generic/fcntl.h> /* For O_RDWR and other O_* constants */
++#include <stdlib.h> /* For arc4random() */
+
#define __need_NULL
#include <stddef.h>
-@@ -193,7 +195,7 @@
+@@ -193,7 +196,7 @@
/* System V/ANSI C; this is the wrong way to do this, do *not* use these. */
#if __BSD_VISIBLE || __XPG_VISIBLE
#endif
#define L_tmpnam 1024 /* XXX must be == PATH_MAX */
#define TMP_MAX 308915776
+@@ -257,7 +260,6 @@
+ int setvbuf(FILE * __restrict, char * __restrict, int, size_t);
+ int sscanf(const char * __restrict, const char * __restrict, ...)
+ __scanflike(2, 3);
+-FILE *tmpfile(void);
+ int ungetc(int, FILE *);
+ int vfprintf(FILE * __restrict, const char * __restrict, __va_list)
+ __printflike(2, 0);
@@ -371,6 +373,16 @@
#define fwopen(cookie, fn) funopen(cookie, 0, fn, 0, 0)
#endif /* __BSD_VISIBLE */
#if defined(__BIONIC_FORTIFY)
__BEGIN_DECLS
+@@ -462,4 +474,29 @@
+
+ #endif /* defined(__BIONIC_FORTIFY) */
+
++__BEGIN_DECLS
++
++extern int open(const char*, int, ...);
++extern pid_t getpid();
++extern int unlink(const char*);
++static FILE* tmpfile() {
++ int p = getpid();
++ char* path;
++ int i;
++ for (i = 0; i < 100; i++) {
++ unsigned int r = arc4random();
++ if (asprintf(&path, "@TERMUX_PREFIX@/tmp/tmpfile.%d-%u", p, r) == -1) return NULL;
++ int fd = open(path, O_RDWR | O_CREAT | O_EXCL | O_LARGEFILE);
++ free(path);
++ if (fd >= 0) {
++ FILE* result = fdopen(fd, "w+");
++ unlink(path);
++ return result;
++ }
++ }
++ return NULL;
++}
++
++__END_DECLS
++
+ #endif /* _STDIO_H_ */
TERMUX_PKG_HOMEPAGE=https://packages.debian.org/apt
TERMUX_PKG_DESCRIPTION="Front-end for the dpkg package manager"
TERMUX_PKG_DEPENDS="liblzma, libgnustl, dpkg, gnupg"
-TERMUX_PKG_VERSION=1.2.6
+TERMUX_PKG_VERSION=1.2.10
TERMUX_PKG_SRCURL=http://ftp.debian.org/debian/pool/main/a/apt/apt_${TERMUX_PKG_VERSION}.tar.xz
TERMUX_PKG_EXTRA_CONFIGURE_ARGS="--host=${TERMUX_ARCH}-linux --disable-rpath acl_cv_rpath=$TERMUX_PREFIX/lib gt_cv_func_CFPreferencesCopyAppValue=no gt_cv_func_CFLocaleCopyCurrent=no ac_cv_c_bigendian=no --no-create"
# When ready to drop bz2 support:
TERMUX_PKG_HOMEPAGE=http://www.busybox.net/
TERMUX_PKG_DESCRIPTION="Tiny versions of many common UNIX utilities into a single small executable"
TERMUX_PKG_ESSENTIAL=yes
-TERMUX_PKG_VERSION=1.24.1
-TERMUX_PKG_BUILD_REVISION=3
+TERMUX_PKG_VERSION=1.24.2
TERMUX_PKG_SRCURL=http://www.busybox.net/downloads/busybox-${TERMUX_PKG_VERSION}.tar.bz2
TERMUX_PKG_BUILD_IN_SRC=yes
--- /dev/null
+TERMUX_PKG_HOMEPAGE=http://byobu.co/
+TERMUX_PKG_DESCRIPTION="Byobu is a GPLv3 open source text-based window manager and terminal multiplexer"
+TERMUX_PKG_VERSION=5.105
+TERMUX_PKG_FOLDERNAME="byobu-${TERMUX_PKG_VERSION}"
+TERMUX_PKG_SRCURL=https://launchpad.net/byobu/trunk/${TERMUX_PKG_VERSION}/+download/byobu_${TERMUX_PKG_VERSION}.orig.tar.gz
+TERMUX_PKG_DEPENDS="gawk,tmux"
+TERMUX_PKG_PLATFORM_INDEPENDENT=yes
TERMUX_PKG_HOMEPAGE=http://www.cmake.org/
TERMUX_PKG_DESCRIPTION="Family of tools designed to build, test and package software"
-_MAJOR_VERSION=3.4
-TERMUX_PKG_VERSION=${_MAJOR_VERSION}.3
+_MAJOR_VERSION=3.5
+TERMUX_PKG_VERSION=${_MAJOR_VERSION}.1
TERMUX_PKG_SRCURL=http://www.cmake.org/files/v${_MAJOR_VERSION}/cmake-${TERMUX_PKG_VERSION}.tar.gz
TERMUX_PKG_DEPENDS="libarchive, libcurl, libexpat, ncurses, jsoncpp"
TERMUX_PKG_HOMEPAGE=http://termux.com
TERMUX_PKG_DESCRIPTION="Suggest installation of packages in interactive shell sessions"
-TERMUX_PKG_VERSION=1.5
+TERMUX_PKG_VERSION=1.7
termux_step_make_install () {
TERMUX_LIBEXEC_DIR=$TERMUX_PREFIX/libexec/termux
" curl",
"curseofwar",
" curseofwar",
+"cvs",
+" cvs",
+" rcs2log",
"dash",
" dash",
" sh",
"datamash",
" datamash",
+"dcraw",
+" dcraw",
"debianutils",
" add-shell",
" ischroot",
"emacs",
" ebrowse",
" emacs",
+" emacs-25.0.92",
" emacsclient",
" etags",
-" temacs",
"espeak",
" espeak",
"ffmpeg",
" fc-query",
" fc-scan",
" fc-validate",
+"fortune",
+" fortune",
"frobtads",
" frob",
" t3make",
" git-receive-pack",
" git-upload-archive",
" git-upload-pack",
+" perl5.22.1",
"glib-bin",
" gapplication",
" gdbus",
" dnsdomainname",
" ftp",
" logger",
-" ping6",
" telnet",
" tftp",
" traceroute",
" jq",
"kona",
" k",
+"leptonica",
+" convertfilestopdf",
+" convertfilestops",
+" convertformat",
+" convertsegfilestopdf",
+" convertsegfilestops",
+" converttopdf",
+" converttops",
+" fileinfo",
+" printimage",
+" printsplitimage",
+" printtiff",
+" splitimage2pdf",
+" xtractprotos",
"less",
" less",
" lessecho",
" updatedb",
"moon-buggy",
" moon-buggy",
+"mosh",
+" mosh",
+" mosh-client",
+" mosh-server",
"multitail",
" multitail",
"mutt",
"pick",
" pick",
"picolisp",
+" httpGate",
" picolisp",
" pil",
+" ssl",
"pinentry",
" pinentry",
" pinentry-curses",
" dalvikvm",
" df",
" getprop",
+" ip",
" logcat",
" ping",
+" ping6",
" pm",
+" settings",
" su",
" termux-elf-cleaner",
" termux-fix-shebang",
"teseq",
" reseq",
" teseq",
+"tesseract",
+" tesseract",
"tig",
" tig",
"tinyscheme",
"utfdecode",
" utfdecode",
"vim",
+" vi",
" view",
" vim",
" vimdiff",
" vimtutor",
" xxd",
"vim-python",
+" vi",
" view",
" vim",
" vimdiff",
" vimtutor",
" xxd",
+"vorbis-tools",
+" oggdec",
+" oggenc",
+" ogginfo",
+" vcut",
+" vorbiscomment",
"vttest",
" vttest",
"vtutils",
" vsyasm",
" yasm",
" ytasm",
+"zbar",
+" zbarimg",
"zile",
" zile",
"zip",
" ack",
"ant",
" ant",
+"byobu",
+" byobu",
+" byobu-config",
+" byobu-ctrl-a",
+" byobu-disable",
+" byobu-disable-prompt",
+" byobu-enable",
+" byobu-enable-prompt",
+" byobu-export",
+" byobu-janitor",
+" byobu-keybindings",
+" byobu-launch",
+" byobu-launcher",
+" byobu-launcher-install",
+" byobu-launcher-uninstall",
+" byobu-layout",
+" byobu-prompt",
+" byobu-quiet",
+" byobu-reconnect-sockets",
+" byobu-screen",
+" byobu-select-backend",
+" byobu-select-profile",
+" byobu-select-session",
+" byobu-shell",
+" byobu-silent",
+" byobu-status",
+" byobu-status-detail",
+" byobu-tmux",
+" byobu-ugraph",
+" byobu-ulevel",
+" col1",
+" ctail",
+" manifest",
+" purge-old-kernels",
+" vigpg",
+" wifi-status",
"dx",
" dalvikvm-wrapper",
" dx",
--- /dev/null
+TERMUX_PKG_HOMEPAGE=http://www.nongnu.org/cvs/
+TERMUX_PKG_DESCRIPTION="Concurrent Versions System"
+TERMUX_PKG_VERSION=1.11.23
+TERMUX_PKG_SRCURL=http://ftp.gnu.org/non-gnu/cvs/source/stable/${TERMUX_PKG_VERSION}/cvs-${TERMUX_PKG_VERSION}.tar.bz2
+TERMUX_PKG_EXTRA_CONFIGURE_ARGS="--disable-server"
+TERMUX_PKG_RM_AFTER_INSTALL="bin/cvsbug share/man/man8/cvsbug.8"
--- /dev/null
+diff -u -r ../cvs-1.11.23/lib/getline.c ./lib/getline.c
+--- ../cvs-1.11.23/lib/getline.c 2005-04-04 16:46:05.000000000 -0400
++++ ./lib/getline.c 2016-03-29 17:34:23.536876927 -0400
+@@ -155,15 +155,6 @@
+ }
+
+ int
+-getline (lineptr, n, stream)
+- char **lineptr;
+- size_t *n;
+- FILE *stream;
+-{
+- return getstr (lineptr, n, stream, '\n', 0, GETLINE_NO_LIMIT);
+-}
+-
+-int
+ getline_safe (lineptr, n, stream, limit)
+ char **lineptr;
+ size_t *n;
--- /dev/null
+diff -u -r ../cvs-1.11.23/lib/getline.h ./lib/getline.h
+--- ../cvs-1.11.23/lib/getline.h 2005-04-04 16:46:05.000000000 -0400
++++ ./lib/getline.h 2016-03-29 17:31:15.020232824 -0400
+@@ -12,8 +12,6 @@
+ #define GETLINE_NO_LIMIT -1
+
+ int
+- getline __PROTO ((char **_lineptr, size_t *_n, FILE *_stream));
+-int
+ getline_safe __PROTO ((char **_lineptr, size_t *_n, FILE *_stream,
+ int limit));
+ int
TERMUX_PKG_HOMEPAGE=http://www.cybercom.net/~dcoffin/dcraw/
TERMUX_PKG_DESCRIPTION="Raw digital camera images decoding utility"
TERMUX_PKG_VERSION=9.26.0
-TERMUX_PKG_BUILD_REVISION=1
+TERMUX_PKG_BUILD_REVISION=2
TERMUX_PKG_SRCURL=http://www.cybercom.net/~dcoffin/dcraw/archive/dcraw-${TERMUX_PKG_VERSION}.tar.gz
TERMUX_PKG_FOLDERNAME=dcraw
TERMUX_PKG_BUILD_IN_SRC=yes
termux_step_make_install () {
# See the "install" script for flags:
- $CC $CFLAGS $CPPFLAGS $LDFLAGS dcraw.c $TERMUX_PKG_BUILDER_DIR/swab.c -lm -ljasper -ljpeg -llcms2 -o $TERMUX_PREFIX/dcraw
+ $CC $CFLAGS $CPPFLAGS $LDFLAGS dcraw.c $TERMUX_PKG_BUILDER_DIR/swab.c -lm -ljasper -ljpeg -llcms2 -o $TERMUX_PREFIX/bin/dcraw
chmod +w dcraw.1 # Add missing write permission
cp dcraw.1 $TERMUX_PREFIX/share/man/man1/
}
TERMUX_PKG_HOMEPAGE=http://www.gnu.org/software/emacs/
TERMUX_PKG_DESCRIPTION="Extensible, customizable text editor-and more"
TERMUX_PKG_VERSION=25.0.92
+TERMUX_PKG_BUILD_REVISION=5
TERMUX_PKG_SRCURL=ftp://alpha.gnu.org/gnu/emacs/pretest/emacs-${TERMUX_PKG_VERSION}.tar.xz
-TERMUX_PKG_DEPENDS="ncurses"
-TERMUX_PKG_EXTRA_CONFIGURE_ARGS="--without-x --with-xpm=no --with-jpeg=no --with-png=no --with-gif=no --with-tiff=no --without-gconf --without-gsettings --without-all"
+TERMUX_PKG_DEPENDS="ncurses, gnutls, libxml2"
+TERMUX_PKG_EXTRA_CONFIGURE_ARGS="--without-x --with-xpm=no --with-jpeg=no --with-png=no --with-gif=no --with-tiff=no --without-gconf --without-gsettings --with-gnutls --with-xml2"
# Ensure use of system malloc:
TERMUX_PKG_EXTRA_CONFIGURE_ARGS+=" emacs_cv_sanitize_address=yes"
# Prevent configure from adding -nopie:
--- /dev/null
+diff -u -r ../emacs-25.0.92/lib-src/emacsclient.c ./lib-src/emacsclient.c
+--- ../emacs-25.0.92/lib-src/emacsclient.c 2016-03-02 05:21:42.000000000 -0500
++++ ./lib-src/emacsclient.c 2016-04-09 01:28:10.881760020 -0400
+@@ -1210,7 +1210,7 @@
+ }
+ else
+ #endif
+- tmpdir = "/tmp";
++ tmpdir = "@TERMUX_PREFIX@/tmp";
+ }
+ socket_name_storage =
+ xmalloc (strlen (tmpdir) + strlen (server_name) + EXTRA_SPACE);
--- /dev/null
+diff -u -r ../emacs-25.0.92/lisp/cus-start.el ./lisp/cus-start.el
+--- ../emacs-25.0.92/lisp/cus-start.el 2016-03-02 05:21:42.000000000 -0500
++++ ./lisp/cus-start.el 2016-04-06 18:16:00.007272810 -0400
+@@ -277,7 +277,7 @@
+ "/tmp"))
+ (t
+ (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP")
+- "/tmp"))))
++ "@TERMUX_PREFIX@/tmp"))))
+ :initialize custom-initialize-delay)
+ ;; fns.c
+ (use-dialog-box menu boolean "21.1")
diff -u -r ../emacs-25.0.92/lisp/loadup.el ./lisp/loadup.el
--- ../emacs-25.0.92/lisp/loadup.el 2016-03-02 05:21:42.000000000 -0500
-+++ ./lisp/loadup.el 2016-03-25 21:40:48.314906360 -0400
++++ ./lisp/loadup.el 2016-03-31 18:41:25.609790054 -0400
@@ -1,3 +1,7 @@
+;; Termux patch: See
+;; https://lists.gnu.org/archive/html/bug-gnu-emacs/2016-03/msg00471.html
;;; loadup.el --- load up standardly loaded Lisp files for Emacs
;; Copyright (C) 1985-1986, 1992, 1994, 2001-2016 Free Software
-@@ -110,6 +114,12 @@
+@@ -69,7 +73,8 @@
+
+ ;; Prevent build-time PATH getting stored in the binary.
+ ;; Mainly cosmetic, but helpful for Guix. (Bug#20330)
+-(setq exec-path nil)
++;; Termux patch: Keep exec-path when running undumped:
++;; (setq exec-path nil)
+
+ (if (eq t purify-flag)
+ ;; Hash consing saved around 11% of pure space in my tests.
+@@ -110,6 +115,12 @@
(load "format")
(load "bindings")
(load "window") ; Needed here for `replace-buffer-in-windows'.
(setq load-source-file-function 'load-with-code-conversion)
(load "files")
-@@ -465,3 +475,7 @@
+@@ -465,3 +476,7 @@
;; End:
;;; loadup.el ends here
--- /dev/null
+diff -u -r ../emacs-25.0.92/lisp/server.el ./lisp/server.el
+--- ../emacs-25.0.92/lisp/server.el 2016-03-02 05:21:42.000000000 -0500
++++ ./lisp/server.el 2016-04-06 17:34:48.134354070 -0400
+@@ -267,7 +267,7 @@
+ ;; does not read the init file.
+ (defvar server-socket-dir
+ (and (featurep 'make-network-process '(:family local))
+- (format "%s/emacs%d" (or (getenv "TMPDIR") "/tmp") (user-uid)))
++ (format "%s/emacs%d" (or (getenv "TMPDIR") "@TERMUX_PREFIX@/tmp") (user-uid)))
+ "The directory in which to place the server socket.
+ If local sockets are not supported, this is nil.")
+
--- /dev/null
+TERMUX_PKG_HOMEPAGE=https://www.fefe.de/fortune/
+TERMUX_PKG_DESCRIPTION="Revealer of fotunes"
+TERMUX_PKG_VERSION=1.2
+TERMUX_PKG_SRCURL=http://dl.fefe.de/fortune-${TERMUX_PKG_VERSION}.tar.bz2
+
+termux_step_make_install () {
+ cd $TERMUX_PKG_SRCDIR
+ $CC $CFLAGS fortune.c -o $TERMUX_PREFIX/bin/fortune
+ mkdir -p $TERMUX_PREFIX/share/man/man6
+ cp debian/fortune.6 $TERMUX_PREFIX/share/man/man6/
+
+ local TARFILE=$TERMUX_PKG_CACHEDIR/f.tar.gz
+ if [ ! -f $TARFILE ]; then
+ curl --retry 3 -L -o $TARFILE http://http.debian.net/debian/pool/main/f/fortune-mod/fortune-mod_1.99.1.orig.tar.gz
+ fi
+ cd $TERMUX_PKG_TMPDIR
+ mkdir datfiles
+ cd datfiles
+ tar xf $TARFILE
+ cd fortune-mod-1.99.1/datfiles
+ rm -Rf html off Makefile
+ mkdir -p $TERMUX_PREFIX/share/games/fortunes
+ cp * $TERMUX_PREFIX/share/games/fortunes
+}
--- /dev/null
+diff -u -r ../fortune-1.2/fortune.c ./fortune.c
+--- ../fortune-1.2/fortune.c 2008-02-15 08:20:30.000000000 -0500
++++ ./fortune.c 2016-04-12 04:08:49.426592095 -0400
+@@ -51,7 +51,7 @@
+ #endif
+
+ #define VERSION "1.0"
+-#define FORTUNEDIR "/usr/share/games/fortunes"
++#define FORTUNEDIR "@TERMUX_PREFIX@/share/games/fortunes"
+
+ struct option const long_options[] =
+ {
TERMUX_PKG_HOMEPAGE=http://www.tads.org/frobtads.htm
TERMUX_PKG_DESCRIPTION="TADS is a free authoring system for writing your own Interactive Fiction"
TERMUX_PKG_VERSION=1.2.3
+TERMUX_PKG_BUILD_REVISION=1
TERMUX_PKG_SRCURL=http://www.tads.org/frobtads/frobtads-${TERMUX_PKG_VERSION}.tar.gz
TERMUX_PKG_RM_AFTER_INSTALL="share/frobtads/tads3/doc share/frobtads/tads3/lib/webuires"
TERMUX_PKG_DEPENDS="curl, ncurses"
--- /dev/null
+TERMUX_PKG_HOMEPAGE=http://pyropus.ca/software/getmail/
+TERMUX_PKG_DESCRIPTION="fetchmail replacement relatively easy to configure"
+TERMUX_PKG_VERSION=4.49.0
+TERMUX_PKG_SRCURL=http://pyropus.ca/software/getmail/old-versions/getmail-${TERMUX_PKG_VERSION}.tar.gz
+TERMUX_PKG_DEPENDS="python2"
+TERMUX_PKG_BUILD_IN_SRC=yes
+TERMUX_PKG_PLATFORM_INDEPENDENT=yes
+
+termux_step_make_install () {
+ python setup.py install --prefix=$TERMUX_PREFIX --force
+}
+
+termux_step_post_massage () {
+ find . -path '*.pyc' -delete
+}
--- /dev/null
+--- ../getmail/src/getmailcore/utilities.py 2013-09-01 04:11:31.000000000 +1000
++++ ./getmailcore/utilities.py 2016-03-26 17:22:08.173621990 +1100
+@@ -44,6 +44,7 @@
+ import getpass
+ import commands
+ import sys
++import shutil
+
+ # hashlib only present in python2.5, ssl in python2.6; used together
+ # in SSL functionality below
+@@ -333,7 +334,7 @@
+
+ # Move message file from Maildir/tmp to Maildir/new
+ try:
+- os.link(fname_tmp, fname_new)
++ shutil.copy2(fname_tmp, fname_new)
+ os.unlink(fname_tmp)
+
+ except OSError:
TERMUX_PKG_DESCRIPTION="Distributed version control system designed to handle everything from small to very large projects with speed and efficiency"
# less is required as a pager for git log, and the busybox less does not handle used escape sequences.
TERMUX_PKG_DEPENDS="libcurl, less"
-TERMUX_PKG_VERSION=2.7.4
+TERMUX_PKG_VERSION=2.8.1
+TERMUX_PKG_BUILD_REVISION=1
TERMUX_PKG_SRCURL=https://www.kernel.org/pub/software/scm/git/git-${TERMUX_PKG_VERSION}.tar.xz
## This requires a working $TERMUX_PREFIX/bin/sh on the host building:
TERMUX_PKG_EXTRA_CONFIGURE_ARGS="--without-tcltk --with-curl --with-shell=$TERMUX_PREFIX/bin/sh ac_cv_header_libintl_h=no ac_cv_fread_reads_directories=yes ac_cv_snprintf_returns_bogus=yes"
TERMUX_PKG_HOMEPAGE=http://www.gnupg.org/
TERMUX_PKG_DESCRIPTION="OpenPGP implementation for encrypting and signing data and communication"
TERMUX_PKG_VERSION=1.4.20
-
+TERMUX_PKG_BUILD_REVISION=1
TERMUX_PKG_SRCURL=ftp://ftp.gnupg.org/gcrypt/gnupg/gnupg-${TERMUX_PKG_VERSION}.tar.bz2
# disable readline since gnupg is used in bootstrap, so nice to avoid readline+ncurses dependencies.
# ac_cv_sys_symbol_underscore=no needed for i686 build to avoid "undefined reference to `mpihelp_sub_n'" errors
TERMUX_PKG_HOMEPAGE=https://golang.org/
TERMUX_PKG_DESCRIPTION="Go programming language compiler"
-_MAJOR_VERSION=1.6
+_MAJOR_VERSION=1.6.1
# Use the ~ deb versioning construct in the future:
TERMUX_PKG_VERSION=2:$_MAJOR_VERSION
TERMUX_PKG_SRCURL=https://storage.googleapis.com/golang/go${_MAJOR_VERSION}.src.tar.gz
TERMUX_PKG_HOMEPAGE=https://www.gnu.org/software/gzip/
TERMUX_PKG_DESCRIPTION="Standard GNU file compression utilities"
-TERMUX_PKG_VERSION=1.6
+TERMUX_PKG_VERSION=1.7
TERMUX_PKG_SRCURL=http://ftp.gnu.org/gnu/gzip/gzip-${TERMUX_PKG_VERSION}.tar.xz
+++ /dev/null
-http://lists.gnu.org/archive/html/bug-gnulib/2013-09/msg00005.html
-
-diff -u -r ../gzip-1.6/lib/stdio-impl.h ./lib/stdio-impl.h
---- ../gzip-1.6/lib/stdio-impl.h 2013-06-09 22:37:56.000000000 +0200
-+++ ./lib/stdio-impl.h 2014-02-25 23:50:09.000000000 +0100
-@@ -57,7 +57,7 @@
- # define fp_ fp
- # endif
-
--# if (defined __NetBSD__ && __NetBSD_Version__ >= 105270000) || defined __OpenBSD__ /* NetBSD >= 1.5ZA, OpenBSD */
-+# if (defined __NetBSD__ && __NetBSD_Version__ >= 105270000) || defined __OpenBSD__ || defined __ANDROID__ /* NetBSD >= 1.5ZA, OpenBSD */
- /* See <http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/stdio/fileext.h?rev=HEAD&content-type=text/x-cvsweb-markup>
- and <http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdio/fileext.h?rev=HEAD&content-type=text/x-cvsweb-markup> */
- struct __sfileext
+++ /dev/null
-Re-ordering the headers in the below patch fixes aarch64
-compilation, due to gzip.h defining
-
-# define head (prev+WSIZE)
-
-and <asm/sigcontext.h> using
-
-struct fpsimd_context {
- struct _aarch64_ctx head;
- /* ... */
-}
-
-diff -u -r ../gzip-1.6/zip.c ./zip.c
---- ../gzip-1.6/zip.c 2013-02-01 23:39:13.000000000 -0500
-+++ ./zip.c 2016-01-03 19:37:00.603075562 -0500
-@@ -20,12 +20,12 @@
- #include <config.h>
- #include <ctype.h>
-
--#include "tailor.h"
--#include "gzip.h"
--
- #include <unistd.h>
- #include <fcntl.h>
-
-+#include "tailor.h"
-+#include "gzip.h"
-+
- local ulg crc; /* crc on uncompressed file data */
- off_t header_bytes; /* number of bytes in gzip header */
-
TERMUX_PKG_HOMEPAGE=http://www.gnu.org/software/inetutils/
TERMUX_PKG_DESCRIPTION="Collection of common network programs"
TERMUX_PKG_VERSION=1.9.4
-TERMUX_PKG_BUILD_REVISION=1
+TERMUX_PKG_BUILD_REVISION=2
TERMUX_PKG_SRCURL=http://ftp.gnu.org/gnu/inetutils/inetutils-${TERMUX_PKG_VERSION}.tar.xz
TERMUX_PKG_DEPENDS="readline, libutil"
# These are old cruft / not suited for android:
-TERMUX_PKG_EXTRA_CONFIGURE_ARGS="--disable-ifconfig --disable-rcp --disable-rlogin --disable-rsh --disable-rexecd --disable-uucpd --disable-rexec --disable-ping --disable-hostname"
+TERMUX_PKG_EXTRA_CONFIGURE_ARGS="--disable-ifconfig --disable-rcp --disable-rlogin --disable-rsh --disable-rexecd --disable-uucpd --disable-rexec --disable-ping --disable-ping6 --disable-hostname"
CPPFLAGS+=" -DLOGIN_PROCESS=6 -DDEAD_PROCESS=8 -DLOG_NFACILITIES=24"
LDFLAGS+=" -llog" # for syslog
TERMUX_PKG_HOMEPAGE=http://www.irssi.org/
TERMUX_PKG_DESCRIPTION="Terminal based IRC client for UNIX systems"
TERMUX_PKG_DEPENDS="ncurses, openssl, glib, libandroid-glob"
-TERMUX_PKG_VERSION=0.8.18
+TERMUX_PKG_VERSION=0.8.19
TERMUX_PKG_SRCURL=https://github.com/irssi/irssi/releases/download/${TERMUX_PKG_VERSION}/irssi-${TERMUX_PKG_VERSION}.tar.xz
TERMUX_PKG_FOLDERNAME=irssi-${TERMUX_PKG_VERSION}
TERMUX_PKG_BUILD_IN_SRC=yes
TERMUX_PKG_HOMEPAGE=http://tools.android.com/tech-docs/jackandjill
TERMUX_PKG_DESCRIPTION="Java Android Compiler Kit"
TERMUX_PKG_VERSION="1.1-mr2"
-TERMUX_PKG_BUILD_REVISION=2
+TERMUX_PKG_BUILD_REVISION=3
TERMUX_PKG_PLATFORM_INDEPENDENT=true
termux_step_make () {
export ANDROID_DATA=@TERMUX_PREFIX@/var/android/
mkdir -p $ANDROID_DATA/dalvik-cache
-# Find the right lib folder for dalvikvm. We cannot take LD_LIBRARY_PATH
-# as is since it contains Termux-supplied libraries which may clash with
-# system ones.
-LIBFOLDER=/system/lib
-if test -d /system/lib64; then
- LIBFOLDER=/system/lib64
-fi
-
-LD_LIBRARY_PATH=$LIBFOLDER \
- exec dalvikvm -Xmx256m \
- -Djava.io.tmpdir=@TERMUX_PREFIX@/tmp \
- -cp @TERMUX_PREFIX@/share/dex/jack.jar com.android.jack.Main \
- -cp @TERMUX_PREFIX@/share/jack/android.jack \
- -D jack.library.digest.algo=MD5 -D sched.vfs.case-insensitive.algo=MD5 \
- -D jack.annotation-processor=off \
- --output-dex=`pwd` \
- $@
+exec dalvikvm -Xmx256m \
+-Djava.io.tmpdir=@TERMUX_PREFIX@/tmp \
+-cp @TERMUX_PREFIX@/share/dex/jack.jar com.android.jack.Main \
+-cp @TERMUX_PREFIX@/share/jack/android.jack \
+-D jack.library.digest.algo=MD5 -D sched.vfs.case-insensitive.algo=MD5 \
+-D jack.annotation-processor=off \
+--output-dex=`pwd` \
+$@
--- /dev/null
+TERMUX_PKG_HOMEPAGE=http://www.leptonica.com/
+TERMUX_PKG_DESCRIPTION="Leptonica is a pedagogically-oriented open source site containing software that is broadly useful for image processing and image analysis applications"
+TERMUX_PKG_VERSION=1.73
+TERMUX_PKG_DEPENDS="libjpeg-turbo, libpng, libtiff"
+TERMUX_PKG_SRCURL=http://www.leptonica.com/source/leptonica-${TERMUX_PKG_VERSION}.tar.gz
+TERMUX_PKG_EXTRA_CONFIGURE_ARGS="--without-giflib --without-libwebp --without-libopenjpeg"
--- /dev/null
+diff -u -r ../leptonica-1.73/src/bmpio.c ./src/bmpio.c
+--- ../leptonica-1.73/src/bmpio.c 2016-01-15 21:41:41.000000000 -0500
++++ ./src/bmpio.c 2016-04-11 06:59:55.564738401 -0400
+@@ -600,7 +600,6 @@
+ if ((fp = fmemopen((l_uint8 *)cdata, size, "rb")) == NULL)
+ return (PIX *)ERROR_PTR("stream not opened", procName, NULL);
+ #else
+- L_WARNING("work-around: writing to a temp file\n", procName);
+ if ((fp = tmpfile()) == NULL)
+ return (PIX *)ERROR_PTR("tmpfile stream not opened", procName, NULL);
+ fwrite(cdata, 1, size, fp);
+@@ -647,7 +646,6 @@
+ return ERROR_INT("stream not opened", procName, 1);
+ ret = pixWriteStreamBmp(fp, pix);
+ #else
+- L_WARNING("work-around: writing to a temp file\n", procName);
+ if ((fp = tmpfile()) == NULL)
+ return ERROR_INT("tmpfile stream not opened", procName, 1);
+ ret = pixWriteStreamBmp(fp, pix);
+diff -u -r ../leptonica-1.73/src/gifio.c ./src/gifio.c
+--- ../leptonica-1.73/src/gifio.c 2016-01-21 13:06:52.000000000 -0500
++++ ./src/gifio.c 2016-04-11 07:00:33.292149664 -0400
+@@ -519,7 +519,6 @@
+
+ if (!cdata)
+ return (PIX *)ERROR_PTR("cdata not defined", procName, NULL);
+- L_WARNING("writing to a temp file, not directly to memory\n", procName);
+
+ /* Write to a temp file */
+ fname = genTempFilename("/tmp/", "mem.gif", 1, 1);
+@@ -562,7 +561,6 @@
+ *psize = 0;
+ if (!pix)
+ return ERROR_INT("&pix not defined", procName, 1 );
+- L_WARNING("writing to a temp file, not directly to memory\n", procName);
+
+ /* Write to a temp file */
+ fname = genTempFilename("/tmp/", "mem.gif", 1, 1);
+diff -u -r ../leptonica-1.73/src/jp2kio.c ./src/jp2kio.c
+--- ../leptonica-1.73/src/jp2kio.c 2016-01-15 21:41:29.000000000 -0500
++++ ./src/jp2kio.c 2016-04-11 07:00:45.691956165 -0400
+@@ -786,7 +786,6 @@
+ if ((fp = fmemopen((void *)data, size, "rb")) == NULL)
+ return (PIX *)ERROR_PTR("stream not opened", procName, NULL);
+ #else
+- L_WARNING("work-around: writing to a temp file\n", procName);
+ if ((fp = tmpfile()) == NULL)
+ return (PIX *)ERROR_PTR("tmpfile stream not opened", procName, NULL);
+ fwrite(data, 1, size, fp);
+@@ -843,7 +842,6 @@
+ return ERROR_INT("stream not opened", procName, 1);
+ ret = pixWriteStreamJp2k(fp, pix, quality, nlevels, hint, debug);
+ #else
+- L_WARNING("work-around: writing to a temp file\n", procName);
+ if ((fp = tmpfile()) == NULL)
+ return ERROR_INT("tmpfile stream not opened", procName, 1);
+ ret = pixWriteStreamJp2k(fp, pix, quality, nlevels, hint, debug);
+diff -u -r ../leptonica-1.73/src/jpegio.c ./src/jpegio.c
+--- ../leptonica-1.73/src/jpegio.c 2016-01-15 21:41:17.000000000 -0500
++++ ./src/jpegio.c 2016-04-11 06:59:13.425396015 -0400
+@@ -987,7 +987,6 @@
+ if ((fp = fmemopen((l_uint8 *)data, size, "rb")) == NULL)
+ return (PIX *)ERROR_PTR("stream not opened", procName, NULL);
+ #else
+- L_WARNING("work-around: writing to a temp file\n", procName);
+ if ((fp = tmpfile()) == NULL)
+ return (PIX *)ERROR_PTR("tmpfile stream not opened", procName, NULL);
+ fwrite(data, 1, size, fp);
+@@ -1047,7 +1046,6 @@
+ if ((fp = fmemopen((l_uint8 *)data, size, "rb")) == NULL)
+ return ERROR_INT("stream not opened", procName, 1);
+ #else
+- L_WARNING("work-around: writing to a temp file\n", procName);
+ if ((fp = tmpfile()) == NULL)
+ return ERROR_INT("tmpfile stream not opened", procName, 1);
+ fwrite(data, 1, size, fp);
+@@ -1099,7 +1097,6 @@
+ return ERROR_INT("stream not opened", procName, 1);
+ ret = pixWriteStreamJpeg(fp, pix, quality, progressive);
+ #else
+- L_WARNING("work-around: writing to a temp file\n", procName);
+ if ((fp = tmpfile()) == NULL)
+ return ERROR_INT("tmpfile stream not opened", procName, 1);
+ ret = pixWriteStreamJpeg(fp, pix, quality, progressive);
+diff -u -r ../leptonica-1.73/src/pngio.c ./src/pngio.c
+--- ../leptonica-1.73/src/pngio.c 2016-01-15 21:40:28.000000000 -0500
++++ ./src/pngio.c 2016-04-11 06:59:45.780891088 -0400
+@@ -1285,7 +1285,6 @@
+ if ((fp = fmemopen((void *)cdata, size, "rb")) == NULL)
+ return (PIX *)ERROR_PTR("stream not opened", procName, NULL);
+ #else
+- L_WARNING("work-around: writing to a temp file\n", procName);
+ if ((fp = tmpfile()) == NULL)
+ return (PIX *)ERROR_PTR("tmpfile stream not opened", procName, NULL);
+ fwrite(cdata, 1, size, fp);
+@@ -1336,7 +1335,6 @@
+ return ERROR_INT("stream not opened", procName, 1);
+ ret = pixWriteStreamPng(fp, pix, gamma);
+ #else
+- L_WARNING("work-around: writing to a temp file\n", procName);
+ if ((fp = tmpfile()) == NULL)
+ return ERROR_INT("tmpfile stream not opened", procName, 1);
+ ret = pixWriteStreamPng(fp, pix, gamma);
+diff -u -r ../leptonica-1.73/src/pnmio.c ./src/pnmio.c
+--- ../leptonica-1.73/src/pnmio.c 2016-01-15 21:40:19.000000000 -0500
++++ ./src/pnmio.c 2016-04-11 06:59:35.017059063 -0400
+@@ -629,7 +629,6 @@
+ if ((fp = fmemopen((l_uint8 *)cdata, size, "rb")) == NULL)
+ return (PIX *)ERROR_PTR("stream not opened", procName, NULL);
+ #else
+- L_WARNING("work-around: writing to a temp file\n", procName);
+ if ((fp = tmpfile()) == NULL)
+ return (PIX *)ERROR_PTR("tmpfile stream not opened", procName, NULL);
+ fwrite(cdata, 1, size, fp);
+@@ -677,7 +676,6 @@
+ if ((fp = fmemopen((l_uint8 *)cdata, size, "rb")) == NULL)
+ return ERROR_INT("stream not opened", procName, 1);
+ #else
+- L_WARNING("work-around: writing to a temp file\n", procName);
+ if ((fp = tmpfile()) == NULL)
+ return ERROR_INT("tmpfile stream not opened", procName, 1);
+ fwrite(cdata, 1, size, fp);
+@@ -727,7 +725,6 @@
+ return ERROR_INT("stream not opened", procName, 1);
+ ret = pixWriteStreamPnm(fp, pix);
+ #else
+- L_WARNING("work-around: writing to a temp file\n", procName);
+ if ((fp = tmpfile()) == NULL)
+ return ERROR_INT("tmpfile stream not opened", procName, 1);
+ ret = pixWriteStreamPnm(fp, pix);
TERMUX_PKG_HOMEPAGE=http://michael.dipperstein.com/crypt/
TERMUX_PKG_DESCRIPTION="A crypt(3) implementation"
-TERMUX_PKG_VERSION=0.1
+TERMUX_PKG_VERSION=0.2
+TERMUX_PKG_DEPENDS="openssl"
termux_step_make_install () {
- $CC $CFLAGS $LDFLAGS -fPIC -shared $TERMUX_PKG_BUILDER_DIR/crypt3.c -o $TERMUX_PREFIX/lib/libcrypt.so
+ $CC $CFLAGS $CPPFLAGS $LDFLAGS -Wall -Wextra -fPIC -shared $TERMUX_PKG_BUILDER_DIR/crypt3.c -lcrypto -o $TERMUX_PREFIX/lib/libcrypt.so
mkdir -p $TERMUX_PREFIX/include/
cp $TERMUX_PKG_BUILDER_DIR/crypt.h $TERMUX_PREFIX/include/
}
--- /dev/null
+/**************************************************************************
+* Implementation of crypt(3) using routines in libcrypto from openssl for
+* use on Android in Termux.
+*
+* https://www.freebsd.org/cgi/man.cgi?crypt(3)
+* http://man7.org/linux/man-pages/man3/crypt.3.html
+*
+* Relevant code is from FreeBSD with license given below.
+**************************************************************************/
+
+/*
+ * Copyright (c) 2011 The FreeBSD Project. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <arpa/inet.h>
+#include <errno.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+#include <openssl/sha.h>
+#include <openssl/md5.h>
+
+/* START: Freebsd compat */
+typedef unsigned long u_long;
+#define MIN(a,b) (((a)<(b))?(a):(b))
+#define MAX(a,b) (((a)>(b))?(a):(b))
+#define MD5_SIZE 16
+#define _PASSWORD_EFMT1 '_'
+#define DES_SALT_ALPHABET \
+ "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
+#define MD5Init MD5_Init
+#define MD5Update MD5_Update
+#define MD5Final MD5_Final
+/* END: Freebsd compat */
+
+
+/* START: https://github.com/freebsd/freebsd/blob/master/lib/libcrypt/misc.c */
+static char itoa64[] = /* 0 ... 63 => ascii - 64 */
+ "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+
+void
+_crypt_to64(char *s, u_long v, int n)
+{
+ while (--n >= 0) {
+ *s++ = itoa64[v&0x3f];
+ v >>= 6;
+ }
+}
+
+void
+b64_from_24bit(uint8_t B2, uint8_t B1, uint8_t B0, int n, int *buflen, char **cp)
+{
+ uint32_t w;
+ int i;
+
+ w = (B2 << 16) | (B1 << 8) | B0;
+ for (i = 0; i < n; i++) {
+ **cp = itoa64[w&0x3f];
+ (*cp)++;
+ if ((*buflen)-- < 0)
+ break;
+ w >>= 6;
+ }
+}
+/* END: https://github.com/freebsd/freebsd/blob/master/lib/libcrypt/misc.c */
+
+
+/* START: https://github.com/freebsd/freebsd/blob/master/secure/lib/libcrypt/crypt-des.c */
+#if defined(__GNUC__) && !defined(lint)
+#define INLINE inline
+#else
+#define INLINE
+#endif
+
+static u_char IP[64] = {
+ 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,
+ 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,
+ 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3,
+ 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7
+};
+
+static u_char inv_key_perm[64];
+static u_char key_perm[56] = {
+ 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18,
+ 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36,
+ 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22,
+ 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4
+};
+
+static u_char key_shifts[16] = {
+ 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
+};
+
+static u_char inv_comp_perm[56];
+static u_char comp_perm[48] = {
+ 14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10,
+ 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2,
+ 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48,
+ 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32
+};
+
+/*
+ * No E box is used, as it's replaced by some ANDs, shifts, and ORs.
+ */
+
+static u_char u_sbox[8][64];
+static u_char sbox[8][64] = {
+ {
+ 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
+ 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
+ 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
+ 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13
+ },
+ {
+ 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
+ 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
+ 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
+ 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9
+ },
+ {
+ 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
+ 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
+ 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
+ 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12
+ },
+ {
+ 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
+ 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
+ 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
+ 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14
+ },
+ {
+ 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
+ 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
+ 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
+ 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3
+ },
+ {
+ 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
+ 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
+ 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
+ 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13
+ },
+ {
+ 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
+ 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
+ 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
+ 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12
+ },
+ {
+ 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
+ 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
+ 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
+ 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11
+ }
+};
+
+static u_char un_pbox[32];
+static u_char pbox[32] = {
+ 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10,
+ 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25
+};
+
+static u_int32_t bits32[32] =
+{
+ 0x80000000, 0x40000000, 0x20000000, 0x10000000,
+ 0x08000000, 0x04000000, 0x02000000, 0x01000000,
+ 0x00800000, 0x00400000, 0x00200000, 0x00100000,
+ 0x00080000, 0x00040000, 0x00020000, 0x00010000,
+ 0x00008000, 0x00004000, 0x00002000, 0x00001000,
+ 0x00000800, 0x00000400, 0x00000200, 0x00000100,
+ 0x00000080, 0x00000040, 0x00000020, 0x00000010,
+ 0x00000008, 0x00000004, 0x00000002, 0x00000001
+};
+
+static u_char bits8[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
+
+static u_int32_t saltbits;
+static u_int32_t old_salt;
+static u_int32_t *bits28, *bits24;
+static u_char init_perm[64], final_perm[64];
+static u_int32_t en_keysl[16], en_keysr[16];
+static u_int32_t de_keysl[16], de_keysr[16];
+static int des_initialised = 0;
+static u_char m_sbox[4][4096];
+static u_int32_t psbox[4][256];
+static u_int32_t ip_maskl[8][256], ip_maskr[8][256];
+static u_int32_t fp_maskl[8][256], fp_maskr[8][256];
+static u_int32_t key_perm_maskl[8][128], key_perm_maskr[8][128];
+static u_int32_t comp_maskl[8][128], comp_maskr[8][128];
+static u_int32_t old_rawkey0, old_rawkey1;
+
+static u_char ascii64[] =
+ "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+/* 0000000000111111111122222222223333333333444444444455555555556666 */
+/* 0123456789012345678901234567890123456789012345678901234567890123 */
+
+static INLINE int
+ascii_to_bin(char ch)
+{
+ if (ch > 'z')
+ return(0);
+ if (ch >= 'a')
+ return(ch - 'a' + 38);
+ if (ch > 'Z')
+ return(0);
+ if (ch >= 'A')
+ return(ch - 'A' + 12);
+ if (ch > '9')
+ return(0);
+ if (ch >= '.')
+ return(ch - '.');
+ return(0);
+}
+
+static void
+des_init(void)
+{
+ int i, j, b, k, inbit, obit;
+ u_int32_t *p, *il, *ir, *fl, *fr;
+
+ old_rawkey0 = old_rawkey1 = 0L;
+ saltbits = 0L;
+ old_salt = 0L;
+ bits24 = (bits28 = bits32 + 4) + 4;
+
+ /*
+ * Invert the S-boxes, reordering the input bits.
+ */
+ for (i = 0; i < 8; i++)
+ for (j = 0; j < 64; j++) {
+ b = (j & 0x20) | ((j & 1) << 4) | ((j >> 1) & 0xf);
+ u_sbox[i][j] = sbox[i][b];
+ }
+
+ /*
+ * Convert the inverted S-boxes into 4 arrays of 8 bits.
+ * Each will handle 12 bits of the S-box input.
+ */
+ for (b = 0; b < 4; b++)
+ for (i = 0; i < 64; i++)
+ for (j = 0; j < 64; j++)
+ m_sbox[b][(i << 6) | j] =
+ (u_char)((u_sbox[(b << 1)][i] << 4) |
+ u_sbox[(b << 1) + 1][j]);
+
+ /*
+ * Set up the initial & final permutations into a useful form, and
+ * initialise the inverted key permutation.
+ */
+ for (i = 0; i < 64; i++) {
+ init_perm[final_perm[i] = IP[i] - 1] = (u_char)i;
+ inv_key_perm[i] = 255;
+ }
+
+ /*
+ * Invert the key permutation and initialise the inverted key
+ * compression permutation.
+ */
+ for (i = 0; i < 56; i++) {
+ inv_key_perm[key_perm[i] - 1] = (u_char)i;
+ inv_comp_perm[i] = 255;
+ }
+
+ /*
+ * Invert the key compression permutation.
+ */
+ for (i = 0; i < 48; i++) {
+ inv_comp_perm[comp_perm[i] - 1] = (u_char)i;
+ }
+
+ /*
+ * Set up the OR-mask arrays for the initial and final permutations,
+ * and for the key initial and compression permutations.
+ */
+ for (k = 0; k < 8; k++) {
+ for (i = 0; i < 256; i++) {
+ *(il = &ip_maskl[k][i]) = 0L;
+ *(ir = &ip_maskr[k][i]) = 0L;
+ *(fl = &fp_maskl[k][i]) = 0L;
+ *(fr = &fp_maskr[k][i]) = 0L;
+ for (j = 0; j < 8; j++) {
+ inbit = 8 * k + j;
+ if (i & bits8[j]) {
+ if ((obit = init_perm[inbit]) < 32)
+ *il |= bits32[obit];
+ else
+ *ir |= bits32[obit-32];
+ if ((obit = final_perm[inbit]) < 32)
+ *fl |= bits32[obit];
+ else
+ *fr |= bits32[obit - 32];
+ }
+ }
+ }
+ for (i = 0; i < 128; i++) {
+ *(il = &key_perm_maskl[k][i]) = 0L;
+ *(ir = &key_perm_maskr[k][i]) = 0L;
+ for (j = 0; j < 7; j++) {
+ inbit = 8 * k + j;
+ if (i & bits8[j + 1]) {
+ if ((obit = inv_key_perm[inbit]) == 255)
+ continue;
+ if (obit < 28)
+ *il |= bits28[obit];
+ else
+ *ir |= bits28[obit - 28];
+ }
+ }
+ *(il = &comp_maskl[k][i]) = 0L;
+ *(ir = &comp_maskr[k][i]) = 0L;
+ for (j = 0; j < 7; j++) {
+ inbit = 7 * k + j;
+ if (i & bits8[j + 1]) {
+ if ((obit=inv_comp_perm[inbit]) == 255)
+ continue;
+ if (obit < 24)
+ *il |= bits24[obit];
+ else
+ *ir |= bits24[obit - 24];
+ }
+ }
+ }
+ }
+
+ /*
+ * Invert the P-box permutation, and convert into OR-masks for
+ * handling the output of the S-box arrays setup above.
+ */
+ for (i = 0; i < 32; i++)
+ un_pbox[pbox[i] - 1] = (u_char)i;
+
+ for (b = 0; b < 4; b++)
+ for (i = 0; i < 256; i++) {
+ *(p = &psbox[b][i]) = 0L;
+ for (j = 0; j < 8; j++) {
+ if (i & bits8[j])
+ *p |= bits32[un_pbox[8 * b + j]];
+ }
+ }
+
+ des_initialised = 1;
+}
+
+static void
+setup_salt(u_int32_t salt)
+{
+ u_int32_t obit, saltbit;
+ int i;
+
+ if (salt == old_salt)
+ return;
+ old_salt = salt;
+
+ saltbits = 0L;
+ saltbit = 1;
+ obit = 0x800000;
+ for (i = 0; i < 24; i++) {
+ if (salt & saltbit)
+ saltbits |= obit;
+ saltbit <<= 1;
+ obit >>= 1;
+ }
+}
+
+static int
+des_setkey(const char *key)
+{
+ u_int32_t k0, k1, rawkey0, rawkey1;
+ int shifts, round;
+
+ if (!des_initialised)
+ des_init();
+
+ rawkey0 = ntohl(*(const u_int32_t *) key);
+ rawkey1 = ntohl(*(const u_int32_t *) (key + 4));
+
+ if ((rawkey0 | rawkey1)
+ && rawkey0 == old_rawkey0
+ && rawkey1 == old_rawkey1) {
+ /*
+ * Already setup for this key.
+ * This optimisation fails on a zero key (which is weak and
+ * has bad parity anyway) in order to simplify the starting
+ * conditions.
+ */
+ return(0);
+ }
+ old_rawkey0 = rawkey0;
+ old_rawkey1 = rawkey1;
+
+ /*
+ * Do key permutation and split into two 28-bit subkeys.
+ */
+ k0 = key_perm_maskl[0][rawkey0 >> 25]
+ | key_perm_maskl[1][(rawkey0 >> 17) & 0x7f]
+ | key_perm_maskl[2][(rawkey0 >> 9) & 0x7f]
+ | key_perm_maskl[3][(rawkey0 >> 1) & 0x7f]
+ | key_perm_maskl[4][rawkey1 >> 25]
+ | key_perm_maskl[5][(rawkey1 >> 17) & 0x7f]
+ | key_perm_maskl[6][(rawkey1 >> 9) & 0x7f]
+ | key_perm_maskl[7][(rawkey1 >> 1) & 0x7f];
+ k1 = key_perm_maskr[0][rawkey0 >> 25]
+ | key_perm_maskr[1][(rawkey0 >> 17) & 0x7f]
+ | key_perm_maskr[2][(rawkey0 >> 9) & 0x7f]
+ | key_perm_maskr[3][(rawkey0 >> 1) & 0x7f]
+ | key_perm_maskr[4][rawkey1 >> 25]
+ | key_perm_maskr[5][(rawkey1 >> 17) & 0x7f]
+ | key_perm_maskr[6][(rawkey1 >> 9) & 0x7f]
+ | key_perm_maskr[7][(rawkey1 >> 1) & 0x7f];
+ /*
+ * Rotate subkeys and do compression permutation.
+ */
+ shifts = 0;
+ for (round = 0; round < 16; round++) {
+ u_int32_t t0, t1;
+
+ shifts += key_shifts[round];
+
+ t0 = (k0 << shifts) | (k0 >> (28 - shifts));
+ t1 = (k1 << shifts) | (k1 >> (28 - shifts));
+
+ de_keysl[15 - round] =
+ en_keysl[round] = comp_maskl[0][(t0 >> 21) & 0x7f]
+ | comp_maskl[1][(t0 >> 14) & 0x7f]
+ | comp_maskl[2][(t0 >> 7) & 0x7f]
+ | comp_maskl[3][t0 & 0x7f]
+ | comp_maskl[4][(t1 >> 21) & 0x7f]
+ | comp_maskl[5][(t1 >> 14) & 0x7f]
+ | comp_maskl[6][(t1 >> 7) & 0x7f]
+ | comp_maskl[7][t1 & 0x7f];
+
+ de_keysr[15 - round] =
+ en_keysr[round] = comp_maskr[0][(t0 >> 21) & 0x7f]
+ | comp_maskr[1][(t0 >> 14) & 0x7f]
+ | comp_maskr[2][(t0 >> 7) & 0x7f]
+ | comp_maskr[3][t0 & 0x7f]
+ | comp_maskr[4][(t1 >> 21) & 0x7f]
+ | comp_maskr[5][(t1 >> 14) & 0x7f]
+ | comp_maskr[6][(t1 >> 7) & 0x7f]
+ | comp_maskr[7][t1 & 0x7f];
+ }
+ return(0);
+}
+
+static int
+do_des( u_int32_t l_in, u_int32_t r_in, u_int32_t *l_out, u_int32_t *r_out, int count)
+{
+ /*
+ * l_in, r_in, l_out, and r_out are in pseudo-"big-endian" format.
+ */
+ u_int32_t l, r, *kl, *kr, *kl1, *kr1;
+ u_int32_t f, r48l, r48r;
+ int round;
+
+ if (count == 0) {
+ return(1);
+ } else if (count > 0) {
+ /*
+ * Encrypting
+ */
+ kl1 = en_keysl;
+ kr1 = en_keysr;
+ } else {
+ /*
+ * Decrypting
+ */
+ count = -count;
+ kl1 = de_keysl;
+ kr1 = de_keysr;
+ }
+
+ /*
+ * Do initial permutation (IP).
+ */
+ l = ip_maskl[0][l_in >> 24]
+ | ip_maskl[1][(l_in >> 16) & 0xff]
+ | ip_maskl[2][(l_in >> 8) & 0xff]
+ | ip_maskl[3][l_in & 0xff]
+ | ip_maskl[4][r_in >> 24]
+ | ip_maskl[5][(r_in >> 16) & 0xff]
+ | ip_maskl[6][(r_in >> 8) & 0xff]
+ | ip_maskl[7][r_in & 0xff];
+ r = ip_maskr[0][l_in >> 24]
+ | ip_maskr[1][(l_in >> 16) & 0xff]
+ | ip_maskr[2][(l_in >> 8) & 0xff]
+ | ip_maskr[3][l_in & 0xff]
+ | ip_maskr[4][r_in >> 24]
+ | ip_maskr[5][(r_in >> 16) & 0xff]
+ | ip_maskr[6][(r_in >> 8) & 0xff]
+ | ip_maskr[7][r_in & 0xff];
+
+ while (count--) {
+ /*
+ * Do each round.
+ */
+ kl = kl1;
+ kr = kr1;
+ round = 16;
+ while (round--) {
+ /*
+ * Expand R to 48 bits (simulate the E-box).
+ */
+ r48l = ((r & 0x00000001) << 23)
+ | ((r & 0xf8000000) >> 9)
+ | ((r & 0x1f800000) >> 11)
+ | ((r & 0x01f80000) >> 13)
+ | ((r & 0x001f8000) >> 15);
+
+ r48r = ((r & 0x0001f800) << 7)
+ | ((r & 0x00001f80) << 5)
+ | ((r & 0x000001f8) << 3)
+ | ((r & 0x0000001f) << 1)
+ | ((r & 0x80000000) >> 31);
+ /*
+ * Do salting for crypt() and friends, and
+ * XOR with the permuted key.
+ */
+ f = (r48l ^ r48r) & saltbits;
+ r48l ^= f ^ *kl++;
+ r48r ^= f ^ *kr++;
+ /*
+ * Do sbox lookups (which shrink it back to 32 bits)
+ * and do the pbox permutation at the same time.
+ */
+ f = psbox[0][m_sbox[0][r48l >> 12]]
+ | psbox[1][m_sbox[1][r48l & 0xfff]]
+ | psbox[2][m_sbox[2][r48r >> 12]]
+ | psbox[3][m_sbox[3][r48r & 0xfff]];
+ /*
+ * Now that we've permuted things, complete f().
+ */
+ f ^= l;
+ l = r;
+ r = f;
+ }
+ r = l;
+ l = f;
+ }
+ /*
+ * Do final permutation (inverse of IP).
+ */
+ *l_out = fp_maskl[0][l >> 24]
+ | fp_maskl[1][(l >> 16) & 0xff]
+ | fp_maskl[2][(l >> 8) & 0xff]
+ | fp_maskl[3][l & 0xff]
+ | fp_maskl[4][r >> 24]
+ | fp_maskl[5][(r >> 16) & 0xff]
+ | fp_maskl[6][(r >> 8) & 0xff]
+ | fp_maskl[7][r & 0xff];
+ *r_out = fp_maskr[0][l >> 24]
+ | fp_maskr[1][(l >> 16) & 0xff]
+ | fp_maskr[2][(l >> 8) & 0xff]
+ | fp_maskr[3][l & 0xff]
+ | fp_maskr[4][r >> 24]
+ | fp_maskr[5][(r >> 16) & 0xff]
+ | fp_maskr[6][(r >> 8) & 0xff]
+ | fp_maskr[7][r & 0xff];
+ return(0);
+}
+
+static int
+des_cipher(const char *in, char *out, u_long salt, int count)
+{
+ u_int32_t l_out, r_out, rawl, rawr;
+ int retval;
+ union {
+ u_int32_t *ui32;
+ const char *c;
+ } trans;
+
+ if (!des_initialised)
+ des_init();
+
+ setup_salt(salt);
+
+ trans.c = in;
+ rawl = ntohl(*trans.ui32++);
+ rawr = ntohl(*trans.ui32);
+
+ retval = do_des(rawl, rawr, &l_out, &r_out, count);
+
+ trans.c = out;
+ *trans.ui32++ = htonl(l_out);
+ *trans.ui32 = htonl(r_out);
+ return(retval);
+}
+
+char *
+crypt_des(const char *key, const char *setting)
+{
+ int i;
+ u_int32_t count, salt, l, r0, r1, keybuf[2];
+ u_char *p, *q;
+ static char output[21];
+
+ if (!des_initialised)
+ des_init();
+
+ /*
+ * Copy the key, shifting each character up by one bit
+ * and padding with zeros.
+ */
+ q = (u_char *)keybuf;
+ while (q - (u_char *)keybuf - 8) {
+ *q++ = *key << 1;
+ if (*key != '\0')
+ key++;
+ }
+ if (des_setkey((char *)keybuf))
+ return(NULL);
+
+ if (*setting == _PASSWORD_EFMT1) {
+ /*
+ * "new"-style:
+ * setting - underscore, 4 bytes of count, 4 bytes of salt
+ * key - unlimited characters
+ */
+ for (i = 1, count = 0L; i < 5; i++)
+ count |= ascii_to_bin(setting[i]) << ((i - 1) * 6);
+
+ for (i = 5, salt = 0L; i < 9; i++)
+ salt |= ascii_to_bin(setting[i]) << ((i - 5) * 6);
+
+ while (*key) {
+ /*
+ * Encrypt the key with itself.
+ */
+ if (des_cipher((char *)keybuf, (char *)keybuf, 0L, 1))
+ return(NULL);
+ /*
+ * And XOR with the next 8 characters of the key.
+ */
+ q = (u_char *)keybuf;
+ while (q - (u_char *)keybuf - 8 && *key)
+ *q++ ^= *key++ << 1;
+
+ if (des_setkey((char *)keybuf))
+ return(NULL);
+ }
+ strncpy(output, setting, 9);
+
+ /*
+ * Double check that we weren't given a short setting.
+ * If we were, the above code will probably have created
+ * wierd values for count and salt, but we don't really care.
+ * Just make sure the output string doesn't have an extra
+ * NUL in it.
+ */
+ output[9] = '\0';
+ p = (u_char *)output + strlen(output);
+ } else {
+ /*
+ * "old"-style:
+ * setting - 2 bytes of salt
+ * key - up to 8 characters
+ */
+ count = 25;
+
+ salt = (ascii_to_bin(setting[1]) << 6)
+ | ascii_to_bin(setting[0]);
+
+ output[0] = setting[0];
+ /*
+ * If the encrypted password that the salt was extracted from
+ * is only 1 character long, the salt will be corrupted. We
+ * need to ensure that the output string doesn't have an extra
+ * NUL in it!
+ */
+ output[1] = setting[1] ? setting[1] : output[0];
+
+ p = (u_char *)output + 2;
+ }
+ setup_salt(salt);
+ /*
+ * Do it.
+ */
+ if (do_des(0L, 0L, &r0, &r1, (int)count))
+ return(NULL);
+ /*
+ * Now encode the result...
+ */
+ l = (r0 >> 8);
+ *p++ = ascii64[(l >> 18) & 0x3f];
+ *p++ = ascii64[(l >> 12) & 0x3f];
+ *p++ = ascii64[(l >> 6) & 0x3f];
+ *p++ = ascii64[l & 0x3f];
+
+ l = (r0 << 16) | ((r1 >> 16) & 0xffff);
+ *p++ = ascii64[(l >> 18) & 0x3f];
+ *p++ = ascii64[(l >> 12) & 0x3f];
+ *p++ = ascii64[(l >> 6) & 0x3f];
+ *p++ = ascii64[l & 0x3f];
+
+ l = r1 << 2;
+ *p++ = ascii64[(l >> 12) & 0x3f];
+ *p++ = ascii64[(l >> 6) & 0x3f];
+ *p++ = ascii64[l & 0x3f];
+ *p = 0;
+
+ return(output);
+}
+/* END: https://github.com/freebsd/freebsd/blob/master/secure/lib/libcrypt/crypt-des.c */
+
+
+/* START: https://github.com/freebsd/freebsd/blob/master/lib/libcrypt/crypt-md5.c */
+char *
+crypt_md5(const char *pw, const char *salt)
+{
+ MD5_CTX ctx,ctx1;
+ unsigned long l;
+ int sl, pl;
+ u_int i;
+ u_char final[MD5_SIZE];
+ static const char *sp, *ep;
+ static char passwd[120], *p;
+ static const char *magic = "$1$";
+
+ /* Refine the Salt first */
+ sp = salt;
+
+ /* If it starts with the magic string, then skip that */
+ if(!strncmp(sp, magic, strlen(magic)))
+ sp += strlen(magic);
+
+ /* It stops at the first '$', max 8 chars */
+ for(ep = sp; *ep && *ep != '$' && ep < (sp + 8); ep++)
+ continue;
+
+ /* get the length of the true salt */
+ sl = ep - sp;
+
+ MD5Init(&ctx);
+
+ /* The password first, since that is what is most unknown */
+ MD5Update(&ctx, (const u_char *)pw, strlen(pw));
+
+ /* Then our magic string */
+ MD5Update(&ctx, (const u_char *)magic, strlen(magic));
+
+ /* Then the raw salt */
+ MD5Update(&ctx, (const u_char *)sp, (u_int)sl);
+
+ /* Then just as many characters of the MD5(pw,salt,pw) */
+ MD5Init(&ctx1);
+ MD5Update(&ctx1, (const u_char *)pw, strlen(pw));
+ MD5Update(&ctx1, (const u_char *)sp, (u_int)sl);
+ MD5Update(&ctx1, (const u_char *)pw, strlen(pw));
+ MD5Final(final, &ctx1);
+ for(pl = (int)strlen(pw); pl > 0; pl -= MD5_SIZE)
+ MD5Update(&ctx, (const u_char *)final,
+ (u_int)(pl > MD5_SIZE ? MD5_SIZE : pl));
+
+ /* Don't leave anything around in vm they could use. */
+ memset(final, 0, sizeof(final));
+
+ /* Then something really weird... */
+ for (i = strlen(pw); i; i >>= 1)
+ if(i & 1)
+ MD5Update(&ctx, (const u_char *)final, 1);
+ else
+ MD5Update(&ctx, (const u_char *)pw, 1);
+
+ /* Now make the output string */
+ strcpy(passwd, magic);
+ strncat(passwd, sp, (u_int)sl);
+ strcat(passwd, "$");
+
+ MD5Final(final, &ctx);
+
+ /*
+ * and now, just to make sure things don't run too fast
+ * On a 60 Mhz Pentium this takes 34 msec, so you would
+ * need 30 seconds to build a 1000 entry dictionary...
+ */
+ for(i = 0; i < 1000; i++) {
+ MD5Init(&ctx1);
+ if(i & 1)
+ MD5Update(&ctx1, (const u_char *)pw, strlen(pw));
+ else
+ MD5Update(&ctx1, (const u_char *)final, MD5_SIZE);
+
+ if(i % 3)
+ MD5Update(&ctx1, (const u_char *)sp, (u_int)sl);
+
+ if(i % 7)
+ MD5Update(&ctx1, (const u_char *)pw, strlen(pw));
+
+ if(i & 1)
+ MD5Update(&ctx1, (const u_char *)final, MD5_SIZE);
+ else
+ MD5Update(&ctx1, (const u_char *)pw, strlen(pw));
+ MD5Final(final, &ctx1);
+ }
+
+ p = passwd + strlen(passwd);
+
+ l = (final[ 0]<<16) | (final[ 6]<<8) | final[12];
+ _crypt_to64(p, l, 4); p += 4;
+ l = (final[ 1]<<16) | (final[ 7]<<8) | final[13];
+ _crypt_to64(p, l, 4); p += 4;
+ l = (final[ 2]<<16) | (final[ 8]<<8) | final[14];
+ _crypt_to64(p, l, 4); p += 4;
+ l = (final[ 3]<<16) | (final[ 9]<<8) | final[15];
+ _crypt_to64(p, l, 4); p += 4;
+ l = (final[ 4]<<16) | (final[10]<<8) | final[ 5];
+ _crypt_to64(p, l, 4); p += 4;
+ l = final[11];
+ _crypt_to64(p, l, 2); p += 2;
+ *p = '\0';
+
+ /* Don't leave anything around in vm they could use. */
+ memset(final, 0, sizeof(final));
+
+ return (passwd);
+}
+/* END: https://github.com/freebsd/freebsd/blob/master/lib/libcrypt/crypt-md5.c */
+
+
+/* START: https://github.com/freebsd/freebsd/blob/master/lib/libcrypt/crypt-sha256.c */
+static const char sha256_salt_prefix[] = "$5$";
+
+/* Prefix for optional rounds specification. */
+static const char sha256_rounds_prefix[] = "rounds=";
+
+/* Maximum salt string length. */
+#define SALT_LEN_MAX 16
+/* Default number of rounds if not explicitly specified. */
+#define ROUNDS_DEFAULT 5000
+/* Minimum number of rounds. */
+#define ROUNDS_MIN 1000
+/* Maximum number of rounds. */
+#define ROUNDS_MAX 999999999
+
+static char *
+crypt_sha256_r(const char *key, const char *salt, char *buffer, int buflen)
+{
+ u_long srounds;
+ int n;
+ uint8_t alt_result[32], temp_result[32];
+ SHA256_CTX ctx, alt_ctx;
+ size_t salt_len, key_len, cnt, rounds;
+ char *cp, *copied_key, *copied_salt, *p_bytes, *s_bytes, *endp;
+ const char *num;
+ bool rounds_custom;
+
+ copied_key = NULL;
+ copied_salt = NULL;
+
+ /* Default number of rounds. */
+ rounds = ROUNDS_DEFAULT;
+ rounds_custom = false;
+
+ /* Find beginning of salt string. The prefix should normally always
+ * be present. Just in case it is not. */
+ if (strncmp(sha256_salt_prefix, salt, sizeof(sha256_salt_prefix) - 1) == 0)
+ /* Skip salt prefix. */
+ salt += sizeof(sha256_salt_prefix) - 1;
+
+ if (strncmp(salt, sha256_rounds_prefix, sizeof(sha256_rounds_prefix) - 1)
+ == 0) {
+ num = salt + sizeof(sha256_rounds_prefix) - 1;
+ srounds = strtoul(num, &endp, 10);
+
+ if (*endp == '$') {
+ salt = endp + 1;
+ rounds = MAX(ROUNDS_MIN, MIN(srounds, ROUNDS_MAX));
+ rounds_custom = true;
+ }
+ }
+
+ salt_len = MIN(strcspn(salt, "$"), SALT_LEN_MAX);
+ key_len = strlen(key);
+
+ /* Prepare for the real work. */
+ SHA256_Init(&ctx);
+
+ /* Add the key string. */
+ SHA256_Update(&ctx, key, key_len);
+
+ /* The last part is the salt string. This must be at most 8
+ * characters and it ends at the first `$' character (for
+ * compatibility with existing implementations). */
+ SHA256_Update(&ctx, salt, salt_len);
+
+ /* Compute alternate SHA256 sum with input KEY, SALT, and KEY. The
+ * final result will be added to the first context. */
+ SHA256_Init(&alt_ctx);
+
+ /* Add key. */
+ SHA256_Update(&alt_ctx, key, key_len);
+
+ /* Add salt. */
+ SHA256_Update(&alt_ctx, salt, salt_len);
+
+ /* Add key again. */
+ SHA256_Update(&alt_ctx, key, key_len);
+
+ /* Now get result of this (32 bytes) and add it to the other context. */
+ SHA256_Final(alt_result, &alt_ctx);
+
+ /* Add for any character in the key one byte of the alternate sum. */
+ for (cnt = key_len; cnt > 32; cnt -= 32)
+ SHA256_Update(&ctx, alt_result, 32);
+ SHA256_Update(&ctx, alt_result, cnt);
+
+ /* Take the binary representation of the length of the key and for
+ * every 1 add the alternate sum, for every 0 the key. */
+ for (cnt = key_len; cnt > 0; cnt >>= 1)
+ if ((cnt & 1) != 0)
+ SHA256_Update(&ctx, alt_result, 32);
+ else
+ SHA256_Update(&ctx, key, key_len);
+
+ /* Create intermediate result. */
+ SHA256_Final(alt_result, &ctx);
+
+ /* Start computation of P byte sequence. */
+ SHA256_Init(&alt_ctx);
+
+ /* For every character in the password add the entire password. */
+ for (cnt = 0; cnt < key_len; ++cnt)
+ SHA256_Update(&alt_ctx, key, key_len);
+
+ /* Finish the digest. */
+ SHA256_Final(temp_result, &alt_ctx);
+
+ /* Create byte sequence P. */
+ cp = p_bytes = alloca(key_len);
+ for (cnt = key_len; cnt >= 32; cnt -= 32) {
+ memcpy(cp, temp_result, 32);
+ cp += 32;
+ }
+ memcpy(cp, temp_result, cnt);
+
+ /* Start computation of S byte sequence. */
+ SHA256_Init(&alt_ctx);
+
+ /* For every character in the password add the entire password. */
+ for (cnt = 0; cnt < 16 + alt_result[0]; ++cnt)
+ SHA256_Update(&alt_ctx, salt, salt_len);
+
+ /* Finish the digest. */
+ SHA256_Final(temp_result, &alt_ctx);
+
+ /* Create byte sequence S. */
+ cp = s_bytes = alloca(salt_len);
+ for (cnt = salt_len; cnt >= 32; cnt -= 32) {
+ memcpy(cp, temp_result, 32);
+ cp += 32;
+ }
+ memcpy(cp, temp_result, cnt);
+
+ /* Repeatedly run the collected hash value through SHA256 to burn CPU
+ * cycles. */
+ for (cnt = 0; cnt < rounds; ++cnt) {
+ /* New context. */
+ SHA256_Init(&ctx);
+
+ /* Add key or last result. */
+ if ((cnt & 1) != 0)
+ SHA256_Update(&ctx, p_bytes, key_len);
+ else
+ SHA256_Update(&ctx, alt_result, 32);
+
+ /* Add salt for numbers not divisible by 3. */
+ if (cnt % 3 != 0)
+ SHA256_Update(&ctx, s_bytes, salt_len);
+
+ /* Add key for numbers not divisible by 7. */
+ if (cnt % 7 != 0)
+ SHA256_Update(&ctx, p_bytes, key_len);
+
+ /* Add key or last result. */
+ if ((cnt & 1) != 0)
+ SHA256_Update(&ctx, alt_result, 32);
+ else
+ SHA256_Update(&ctx, p_bytes, key_len);
+
+ /* Create intermediate result. */
+ SHA256_Final(alt_result, &ctx);
+ }
+
+ /* Now we can construct the result string. It consists of three
+ * parts. */
+ cp = stpncpy(buffer, sha256_salt_prefix, MAX(0, buflen));
+ buflen -= sizeof(sha256_salt_prefix) - 1;
+
+ if (rounds_custom) {
+ n = snprintf(cp, MAX(0, buflen), "%s%zu$",
+ sha256_rounds_prefix, rounds);
+
+ cp += n;
+ buflen -= n;
+ }
+
+ cp = stpncpy(cp, salt, MIN((size_t)MAX(0, buflen), salt_len));
+ buflen -= MIN((size_t)MAX(0, buflen), salt_len);
+
+ if (buflen > 0) {
+ *cp++ = '$';
+ --buflen;
+ }
+
+ b64_from_24bit(alt_result[0], alt_result[10], alt_result[20], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[21], alt_result[1], alt_result[11], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[12], alt_result[22], alt_result[2], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[3], alt_result[13], alt_result[23], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[24], alt_result[4], alt_result[14], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[15], alt_result[25], alt_result[5], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[6], alt_result[16], alt_result[26], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[27], alt_result[7], alt_result[17], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[18], alt_result[28], alt_result[8], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[9], alt_result[19], alt_result[29], 4, &buflen, &cp);
+ b64_from_24bit(0, alt_result[31], alt_result[30], 3, &buflen, &cp);
+ if (buflen <= 0) {
+ errno = ERANGE;
+ buffer = NULL;
+ }
+ else
+ *cp = '\0'; /* Terminate the string. */
+
+ /* Clear the buffer for the intermediate result so that people
+ * attaching to processes or reading core dumps cannot get any
+ * information. We do it in this way to clear correct_words[] inside
+ * the SHA256 implementation as well. */
+ SHA256_Init(&ctx);
+ SHA256_Final(alt_result, &ctx);
+ memset(temp_result, '\0', sizeof(temp_result));
+ memset(p_bytes, '\0', key_len);
+ memset(s_bytes, '\0', salt_len);
+ memset(&ctx, '\0', sizeof(ctx));
+ memset(&alt_ctx, '\0', sizeof(alt_ctx));
+ if (copied_key != NULL)
+ memset(copied_key, '\0', key_len);
+ if (copied_salt != NULL)
+ memset(copied_salt, '\0', salt_len);
+
+ return buffer;
+}
+
+/* This entry point is equivalent to crypt(3). */
+char* crypt_sha256(const char *key, const char *salt)
+{
+ /* We don't want to have an arbitrary limit in the size of the
+ * password. We can compute an upper bound for the size of the
+ * result in advance and so we can prepare the buffer we pass to
+ * `crypt_sha256_r'. */
+ static char *buffer;
+ static int buflen;
+ int needed;
+ char *new_buffer;
+
+ needed = (sizeof(sha256_salt_prefix) - 1
+ + sizeof(sha256_rounds_prefix) + 9 + 1
+ + strlen(salt) + 1 + 43 + 1);
+
+ if (buflen < needed) {
+ new_buffer = (char *)realloc(buffer, needed);
+
+ if (new_buffer == NULL)
+ return NULL;
+
+ buffer = new_buffer;
+ buflen = needed;
+ }
+
+ return crypt_sha256_r(key, salt, buffer, buflen);
+}
+/* END: https://github.com/freebsd/freebsd/blob/master/lib/libcrypt/crypt-sha256.c */
+
+
+/* START: https://github.com/freebsd/freebsd/blob/master/lib/libcrypt/crypt-sha512.c */
+/* Define our magic string to mark salt for SHA512 "encryption" replacement. */
+static const char sha512_salt_prefix[] = "$6$";
+
+/* Prefix for optional rounds specification. */
+static const char sha512_rounds_prefix[] = "rounds=";
+
+/* Maximum salt string length. */
+#define SALT_LEN_MAX 16
+/* Default number of rounds if not explicitly specified. */
+#define ROUNDS_DEFAULT 5000
+/* Minimum number of rounds. */
+#define ROUNDS_MIN 1000
+/* Maximum number of rounds. */
+#define ROUNDS_MAX 999999999
+
+static char *
+crypt_sha512_r(const char *key, const char *salt, char *buffer, int buflen)
+{
+ u_long srounds;
+ int n;
+ uint8_t alt_result[64], temp_result[64];
+ SHA512_CTX ctx, alt_ctx;
+ size_t salt_len, key_len, cnt, rounds;
+ char *cp, *copied_key, *copied_salt, *p_bytes, *s_bytes, *endp;
+ const char *num;
+ bool rounds_custom;
+
+ copied_key = NULL;
+ copied_salt = NULL;
+
+ /* Default number of rounds. */
+ rounds = ROUNDS_DEFAULT;
+ rounds_custom = false;
+
+ /* Find beginning of salt string. The prefix should normally always
+ * be present. Just in case it is not. */
+ if (strncmp(sha512_salt_prefix, salt, sizeof(sha512_salt_prefix) - 1) == 0)
+ /* Skip salt prefix. */
+ salt += sizeof(sha512_salt_prefix) - 1;
+
+ if (strncmp(salt, sha512_rounds_prefix, sizeof(sha512_rounds_prefix) - 1)
+ == 0) {
+ num = salt + sizeof(sha512_rounds_prefix) - 1;
+ srounds = strtoul(num, &endp, 10);
+
+ if (*endp == '$') {
+ salt = endp + 1;
+ rounds = MAX(ROUNDS_MIN, MIN(srounds, ROUNDS_MAX));
+ rounds_custom = true;
+ }
+ }
+
+ salt_len = MIN(strcspn(salt, "$"), SALT_LEN_MAX);
+ key_len = strlen(key);
+
+ /* Prepare for the real work. */
+ SHA512_Init(&ctx);
+
+ /* Add the key string. */
+ SHA512_Update(&ctx, key, key_len);
+
+ /* The last part is the salt string. This must be at most 8
+ * characters and it ends at the first `$' character (for
+ * compatibility with existing implementations). */
+ SHA512_Update(&ctx, salt, salt_len);
+
+ /* Compute alternate SHA512 sum with input KEY, SALT, and KEY. The
+ * final result will be added to the first context. */
+ SHA512_Init(&alt_ctx);
+
+ /* Add key. */
+ SHA512_Update(&alt_ctx, key, key_len);
+
+ /* Add salt. */
+ SHA512_Update(&alt_ctx, salt, salt_len);
+
+ /* Add key again. */
+ SHA512_Update(&alt_ctx, key, key_len);
+
+ /* Now get result of this (64 bytes) and add it to the other context. */
+ SHA512_Final(alt_result, &alt_ctx);
+
+ /* Add for any character in the key one byte of the alternate sum. */
+ for (cnt = key_len; cnt > 64; cnt -= 64)
+ SHA512_Update(&ctx, alt_result, 64);
+ SHA512_Update(&ctx, alt_result, cnt);
+
+ /* Take the binary representation of the length of the key and for
+ * every 1 add the alternate sum, for every 0 the key. */
+ for (cnt = key_len; cnt > 0; cnt >>= 1)
+ if ((cnt & 1) != 0)
+ SHA512_Update(&ctx, alt_result, 64);
+ else
+ SHA512_Update(&ctx, key, key_len);
+
+ /* Create intermediate result. */
+ SHA512_Final(alt_result, &ctx);
+
+ /* Start computation of P byte sequence. */
+ SHA512_Init(&alt_ctx);
+
+ /* For every character in the password add the entire password. */
+ for (cnt = 0; cnt < key_len; ++cnt)
+ SHA512_Update(&alt_ctx, key, key_len);
+
+ /* Finish the digest. */
+ SHA512_Final(temp_result, &alt_ctx);
+
+ /* Create byte sequence P. */
+ cp = p_bytes = alloca(key_len);
+ for (cnt = key_len; cnt >= 64; cnt -= 64) {
+ memcpy(cp, temp_result, 64);
+ cp += 64;
+ }
+ memcpy(cp, temp_result, cnt);
+
+ /* Start computation of S byte sequence. */
+ SHA512_Init(&alt_ctx);
+
+ /* For every character in the password add the entire password. */
+ for (cnt = 0; cnt < 16 + alt_result[0]; ++cnt)
+ SHA512_Update(&alt_ctx, salt, salt_len);
+
+ /* Finish the digest. */
+ SHA512_Final(temp_result, &alt_ctx);
+
+ /* Create byte sequence S. */
+ cp = s_bytes = alloca(salt_len);
+ for (cnt = salt_len; cnt >= 64; cnt -= 64) {
+ memcpy(cp, temp_result, 64);
+ cp += 64;
+ }
+ memcpy(cp, temp_result, cnt);
+
+ /* Repeatedly run the collected hash value through SHA512 to burn CPU
+ * cycles. */
+ for (cnt = 0; cnt < rounds; ++cnt) {
+ /* New context. */
+ SHA512_Init(&ctx);
+
+ /* Add key or last result. */
+ if ((cnt & 1) != 0)
+ SHA512_Update(&ctx, p_bytes, key_len);
+ else
+ SHA512_Update(&ctx, alt_result, 64);
+
+ /* Add salt for numbers not divisible by 3. */
+ if (cnt % 3 != 0)
+ SHA512_Update(&ctx, s_bytes, salt_len);
+
+ /* Add key for numbers not divisible by 7. */
+ if (cnt % 7 != 0)
+ SHA512_Update(&ctx, p_bytes, key_len);
+
+ /* Add key or last result. */
+ if ((cnt & 1) != 0)
+ SHA512_Update(&ctx, alt_result, 64);
+ else
+ SHA512_Update(&ctx, p_bytes, key_len);
+
+ /* Create intermediate result. */
+ SHA512_Final(alt_result, &ctx);
+ }
+
+ /* Now we can construct the result string. It consists of three
+ * parts. */
+ cp = stpncpy(buffer, sha512_salt_prefix, MAX(0, buflen));
+ buflen -= sizeof(sha512_salt_prefix) - 1;
+
+ if (rounds_custom) {
+ n = snprintf(cp, MAX(0, buflen), "%s%zu$",
+ sha512_rounds_prefix, rounds);
+
+ cp += n;
+ buflen -= n;
+ }
+
+ cp = stpncpy(cp, salt, MIN((size_t)MAX(0, buflen), salt_len));
+ buflen -= MIN((size_t)MAX(0, buflen), salt_len);
+
+ if (buflen > 0) {
+ *cp++ = '$';
+ --buflen;
+ }
+
+ b64_from_24bit(alt_result[0], alt_result[21], alt_result[42], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[22], alt_result[43], alt_result[1], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[44], alt_result[2], alt_result[23], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[3], alt_result[24], alt_result[45], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[25], alt_result[46], alt_result[4], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[47], alt_result[5], alt_result[26], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[6], alt_result[27], alt_result[48], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[28], alt_result[49], alt_result[7], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[50], alt_result[8], alt_result[29], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[9], alt_result[30], alt_result[51], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[31], alt_result[52], alt_result[10], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[53], alt_result[11], alt_result[32], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[12], alt_result[33], alt_result[54], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[34], alt_result[55], alt_result[13], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[56], alt_result[14], alt_result[35], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[15], alt_result[36], alt_result[57], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[37], alt_result[58], alt_result[16], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[59], alt_result[17], alt_result[38], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[18], alt_result[39], alt_result[60], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[40], alt_result[61], alt_result[19], 4, &buflen, &cp);
+ b64_from_24bit(alt_result[62], alt_result[20], alt_result[41], 4, &buflen, &cp);
+ b64_from_24bit(0, 0, alt_result[63], 2, &buflen, &cp);
+
+ if (buflen <= 0) {
+ errno = ERANGE;
+ buffer = NULL;
+ }
+ else
+ *cp = '\0'; /* Terminate the string. */
+
+ /* Clear the buffer for the intermediate result so that people
+ * attaching to processes or reading core dumps cannot get any
+ * information. We do it in this way to clear correct_words[] inside
+ * the SHA512 implementation as well. */
+ SHA512_Init(&ctx);
+ SHA512_Final(alt_result, &ctx);
+ memset(temp_result, '\0', sizeof(temp_result));
+ memset(p_bytes, '\0', key_len);
+ memset(s_bytes, '\0', salt_len);
+ memset(&ctx, '\0', sizeof(ctx));
+ memset(&alt_ctx, '\0', sizeof(alt_ctx));
+ if (copied_key != NULL)
+ memset(copied_key, '\0', key_len);
+ if (copied_salt != NULL)
+ memset(copied_salt, '\0', salt_len);
+
+ return buffer;
+}
+
+/* This entry point is equivalent to crypt(3). */
+char *
+crypt_sha512(const char *key, const char *salt)
+{
+ /* We don't want to have an arbitrary limit in the size of the
+ * password. We can compute an upper bound for the size of the
+ * result in advance and so we can prepare the buffer we pass to
+ * `crypt_sha512_r'. */
+ static char *buffer;
+ static int buflen;
+ int needed;
+ char *new_buffer;
+
+ needed = (sizeof(sha512_salt_prefix) - 1
+ + sizeof(sha512_rounds_prefix) + 9 + 1
+ + strlen(salt) + 1 + 86 + 1);
+
+ if (buflen < needed) {
+ new_buffer = (char *)realloc(buffer, needed);
+
+ if (new_buffer == NULL)
+ return NULL;
+
+ buffer = new_buffer;
+ buflen = needed;
+ }
+
+ return crypt_sha512_r(key, salt, buffer, buflen);
+}
+/* END: https://github.com/freebsd/freebsd/blob/master/lib/libcrypt/crypt-sha512.c */
+
+
+/** From https://github.com/freebsd/freebsd/blob/master/lib/libcrypt/crypt.c */
+static const struct crypt_format {
+ const char* const name;
+ const char* const magic;
+ char* (*const func)(char const*, char const*);
+} crypt_formats[] = {
+ { "des", "_", crypt_des },
+ { "md5", "$1$", crypt_md5 },
+ { "sha256", "$5$", crypt_sha256 },
+ { "sha512", "$6$", crypt_sha512 },
+ { NULL, NULL, NULL }
+};
+
+
+char* crypt(const char* key, const char* salt)
+{
+ int len;
+ const struct crypt_format *cf;
+
+ for (cf = crypt_formats; cf->name != NULL; ++cf) {
+ if (cf->magic != NULL && strstr(salt, cf->magic) == salt) {
+ return cf->func(key, salt);
+ }
+ }
+
+ len = strlen(salt);
+ if ((len == 13 || len == 2) && strspn(salt, DES_SALT_ALPHABET) == len) {
+ return (crypt_des(key, salt));
+ }
+
+ return crypt_formats[0].func(key, salt);
+}
TERMUX_PKG_HOMEPAGE=http://curl.haxx.se/
TERMUX_PKG_DESCRIPTION="Easy-to-use client-side URL transfer library"
TERMUX_PKG_DEPENDS="openssl"
-TERMUX_PKG_VERSION=7.47.1
+TERMUX_PKG_VERSION=7.48.0
TERMUX_PKG_SRCURL=http://curl.haxx.se/download/curl-${TERMUX_PKG_VERSION}.tar.bz2
export TERMUX_CA_BUNDLE=$TERMUX_PREFIX/etc/tls/cert.pem
TERMUX_PKG_EXTRA_CONFIGURE_ARGS="--with-ssl --without-libidn --with-ca-bundle=$TERMUX_CA_BUNDLE"
TERMUX_PKG_HOMEPAGE=http://www.sqlite.org/
TERMUX_PKG_DESCRIPTION="Software library that implements a self-contained, serverless, zero-configuration, transactional SQL database engine"
-TERMUX_PKG_VERSION=3.11.1
-TERMUX_PKG_SRCURL=https://www.sqlite.org/2016/sqlite-autoconf-3110100.tar.gz
+TERMUX_PKG_VERSION=3.12.0
+TERMUX_PKG_SRCURL=https://www.sqlite.org/2016/sqlite-autoconf-3120000.tar.gz
TERMUX_PKG_EXTRA_CONFIGURE_ARGS="--enable-readline"
--- /dev/null
+TERMUX_PKG_HOMEPAGE=http://mosh.mit.edu/
+TERMUX_PKG_DESCRIPTION="Mobile shell that supports roaming and intelligent local echo"
+TERMUX_PKG_VERSION=1.2.5.20160402
+TERMUX_PKG_SRCURL=http://mosh.mit.edu/mosh-${TERMUX_PKG_VERSION}.tar.gz
+_COMMIT=f30738e3256e90850e945c08624fce90b1ba78a1
+TERMUX_PKG_SRCURL=https://github.com/mobile-shell/mosh/archive/${_COMMIT}.zip
+TERMUX_PKG_FOLDERNAME=mosh-${_COMMIT}
+
+TERMUX_PKG_DEPENDS="libandroid-support, protobuf, ncurses, openssl, libutil, perl, libgnustl"
+
+export PROTOC=$TERMUX_TOPDIR/protobuf/host-build/src/protoc
+
+LDFLAGS+=" -lgnustl_shared"
+
+termux_step_pre_configure () {
+ cd $TERMUX_PKG_SRCDIR
+ ./autogen.sh
+}
+
+termux_step_post_make_install () {
+ # Avoid env and specify perl directly:
+ sed -i'' '1 s|^.*$|#! /bin/perl|' $TERMUX_PREFIX/bin/mosh
+}
TERMUX_PKG_HOMEPAGE=http://www.mutt.org/
TERMUX_PKG_DESCRIPTION="Mail client"
-TERMUX_PKG_VERSION=1.5.24
-TERMUX_PKG_BUILD_REVISION=3
-TERMUX_PKG_SRCURL=https://bitbucket.org/mutt/mutt/downloads/mutt-${TERMUX_PKG_VERSION}.tar.gz
+TERMUX_PKG_VERSION=1.6.0
+TERMUX_PKG_SRCURL=ftp://ftp.mutt.org/pub/mutt/mutt-${TERMUX_PKG_VERSION}.tar.gz
TERMUX_PKG_DEPENDS="libandroid-support, ncurses, gdbm, openssl, libsasl, gpgme"
TERMUX_PKG_EXTRA_CONFIGURE_ARGS="--enable-smtp --enable-imap --enable-pop --with-mailpath=$TERMUX_PREFIX/var/mail --with-ssl --enable-compressed --without-idn --enable-hcache --with-sasl"
TERMUX_PKG_EXTRA_CONFIGURE_ARGS+=" --with-exec-shell=$TERMUX_PREFIX/bin/sh"
--- /dev/null
+diff -u -r ../mutt-1.6.0/getdomain.c ./getdomain.c
+--- ../mutt-1.6.0/getdomain.c 2016-04-02 14:12:22.000000000 -0400
++++ ./getdomain.c 2016-04-06 06:18:24.614628451 -0400
+@@ -44,7 +44,9 @@
+ hints.ai_flags = AI_CANONNAME;
+ hints.ai_family = AF_UNSPEC;
+
++#ifdef _SC_HOST_NAME_MAX
+ if ((node_len = sysconf(_SC_HOST_NAME_MAX)) == -1)
++#endif
+ node_len = STRING;
+ node = safe_malloc(node_len + 1);
+ if (gethostname(node, node_len))
TERMUX_PKG_HOMEPAGE=http://nodejs.org/
TERMUX_PKG_DESCRIPTION="Platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications"
-TERMUX_PKG_VERSION=5.9.0
+TERMUX_PKG_VERSION=5.10.0
TERMUX_PKG_SRCURL=https://nodejs.org/dist/v${TERMUX_PKG_VERSION}/node-v${TERMUX_PKG_VERSION}.tar.gz
TERMUX_PKG_DEPENDS="openssl, libuv"
TERMUX_PKG_RM_AFTER_INSTALL="lib/node_modules/npm/html lib/node_modules/npm/make.bat share/systemtap lib/dtrace"
-diff -u -r ../node-v0.12.3/lib/os.js ./lib/os.js
---- ../node-v0.12.3/lib/os.js 2015-05-13 20:30:45.000000000 -0400
-+++ ./lib/os.js 2015-05-22 13:23:14.286889554 -0400
-@@ -51,7 +51,7 @@
- return process.env.TMPDIR ||
+diff -u -r ../node-v5.10.0/lib/os.js ./lib/os.js
+--- ../node-v5.10.0/lib/os.js 2016-03-31 21:52:17.000000000 -0400
++++ ./lib/os.js 2016-04-04 04:46:05.148105544 -0400
+@@ -36,7 +36,7 @@
+ path = process.env.TMPDIR ||
process.env.TMP ||
process.env.TEMP ||
- '/tmp';
+ '@TERMUX_PREFIX@/tmp';
+ if (path.length > 1 && path.endsWith('/'))
+ path = path.slice(0, -1);
}
- };
-
TERMUX_PKG_HOMEPAGE=http://picolisp.com
TERMUX_PKG_DESCRIPTION="Lisp interpreter and application server framework"
-TERMUX_PKG_VERSION=16.3.1
+TERMUX_PKG_DEPENDS="libcrypt, openssl"
+TERMUX_PKG_VERSION=16.4.1
+TERMUX_PKG_BUILD_REVISION=1
TERMUX_PKG_SRCURL=http://software-lab.de/picoLisp.tgz
TERMUX_PKG_FOLDERNAME=picoLisp
TERMUX_PKG_BUILD_IN_SRC=true
termux_step_pre_configure() {
# Validate that we have the right version:
- grep -q '16 3 1' src64/version.l
+ grep -q '16 4 1' src64/version.l
TERMUX_PKG_SRCDIR=$TERMUX_PKG_SRCDIR/src
if [ $TERMUX_ARCH_BITS = 64 ]; then
fi
fi
TERMUX_PKG_BUILDDIR=$TERMUX_PKG_SRCDIR
+ ORIG_CFLAGS="$CFLAGS"
CFLAGS+=" -c $LDFLAGS $CPPFLAGS"
}
termux_step_make_install () {
+ cd $TERMUX_PKG_SRCDIR/
+
if [ $TERMUX_ARCH_BITS = "64" ]; then
- cd $TERMUX_PKG_SRCDIR/
$CC -pie -o ../bin/picolisp -rdynamic ${TERMUX_PKG_EXTRA_MAKE_ARGS}.base.s -lc -lm -ldl
chmod +x ../bin/picolisp
$CC -pie -o ../lib/ext -shared -export-dynamic ${TERMUX_PKG_EXTRA_MAKE_ARGS}.ext.s
sed -i "1 s|^.*$|#!$TERMUX_PREFIX/bin/picolisp $TERMUX_PREFIX/lib/picolisp/lib.l|g" $TERMUX_PREFIX/lib/picolisp/bin/pil
( cd $TERMUX_PREFIX/bin && ln -f -s ../lib/picolisp/bin/picolisp picolisp && ln -f -s ../lib/picolisp/bin/pil pil )
+
+ # Bundled tools:
+ $CC $ORIG_CFLAGS $CPPFLAGS $LDFLAGS -o $TERMUX_PREFIX/bin/ssl ../src/ssl.c -lssl -lcrypto
+ $CC $ORIG_CFLAGS $CPPFLAGS $LDFLAGS -o $TERMUX_PREFIX/bin/httpGate ../src/httpGate.c -lssl -lcrypto
+
+ # Man pages:
+ cp $TERMUX_PKG_SRCDIR/../man/man1/{pil,picolisp}.1 $TERMUX_PREFIX/share/man/man1/
}
diff -u -r ../picoLisp/src/Makefile ./src/Makefile
--- ../picoLisp/src/Makefile 2016-02-02 10:52:49.000000000 -0500
-+++ ./src/Makefile 2016-02-08 06:15:50.293964319 -0500
-@@ -6,118 +6,13 @@
++++ ./src/Makefile 2016-04-12 05:55:14.050621923 -0400
+@@ -6,119 +6,14 @@
picoFiles = main.c gc.c apply.c flow.c sym.c subr.c big.c io.c net.c tab.c
-endif
-endif
-endif
+-
+CCLD = $(CC)
-+LCRYPT =
++LCRYPT = -lcrypt
+OS = Android
+PICOLISP-FLAGS = -rdynamic -lm $(LDFLAGS)
+DYNAMIC-LIB-FLAGS = -shared -export-dynamic $(LDFLAGS) -lm
-
++
picolisp: $(bin)/picolisp $(lib)/ext$(dll) $(lib)/ht$(dll)
tools: $(bin)/lat1 $(bin)/utf2 $(bin)/balance
+ gate: $(bin)/ssl $(bin)/httpGate
-The crypt(3) function is not available in Android, so remove support
-in ext for now.
-
diff -u -r ../picoLisp/src/ext.c ./src/ext.c
---- ../picoLisp/src/ext.c 2015-11-27 02:25:22.000000000 -0500
-+++ ./src/ext.c 2016-02-08 06:19:58.405969024 -0500
-@@ -250,6 +250,7 @@
- return T;
- }
+--- ../picoLisp/src/ext.c 2016-04-01 04:05:10.000000000 -0400
++++ ./src/ext.c 2016-04-13 06:40:31.791712225 -0400
+@@ -3,6 +3,7 @@
+ */
-+#ifndef __ANDROID__
- /*** Password hashing ***/
- // (ext:Crypt 'key 'salt) -> str
- any Crypt(any x) {
-@@ -269,3 +270,4 @@
- }
- }
- }
-+#endif
+ #include "pico.h"
++#include <crypt.h>
+
+ /*** Soundex Algorithm ***/
+ static int SnxTab[] = {
TERMUX_PKG_HOMEPAGE=https://packages.debian.org/sid/procps
TERMUX_PKG_DESCRIPTION="Utilities that give information about processes using the /proc filesystem"
TERMUX_PKG_VERSION=3.3.11
+TERMUX_PKG_BUILD_REVISION=1
TERMUX_PKG_SRCURL=http://downloads.sourceforge.net/project/procps-ng/Production/procps-ng-${TERMUX_PKG_VERSION}.tar.xz
TERMUX_PKG_BUILD_IN_SRC=yes
TERMUX_PKG_FOLDERNAME=procps-ng-${TERMUX_PKG_VERSION}
--- /dev/null
+diff -u -r ../procps-ng-3.3.11/pgrep.c ./pgrep.c
+--- ../procps-ng-3.3.11/pgrep.c 2015-08-09 01:54:54.298117295 -0400
++++ ./pgrep.c 2016-04-12 01:14:09.647108539 -0400
+@@ -713,7 +713,7 @@
+ {NULL, 0, NULL, 0}
+ };
+
+- if (strstr (program_invocation_short_name, "pkill")) {
++ if (strstr (argv[0], "pkill")) {
+ int sig;
+ i_am_pkill = 1;
+ sig = signal_option(&argc, argv);
TERMUX_PKG_HOMEPAGE=http://proot.me/
TERMUX_PKG_DESCRIPTION="Emulate chroot, bind mount and binfmt_misc for non-root users"
-TERMUX_PKG_VERSION=5.1.99
+TERMUX_PKG_VERSION=5.1.100
TERMUX_PKG_SRCURL=https://github.com/proot-me/PRoot/archive/next.zip
TERMUX_PKG_FOLDERNAME=PRoot-next
TERMUX_PKG_DEPENDS="libtalloc"
# to find e.g. configurations files there work.
ARGS="$ARGS -b $PREFIX/..:$PREFIX/.."
+# Expose external and internal storage:
+if [ -d /storage ]; then
+ ARGS="$ARGS -b /storage:/storage"
+fi
+
# Mimic traditional Linux file system hierarchy - /usr:
ARGS="$ARGS -b $PREFIX:/usr"
TERMUX_PKG_HOMEPAGE=https://code.google.com/p/protobuf/
TERMUX_PKG_DESCRIPTION="Library for encoding structured data in an efficient yet extensible format"
TERMUX_PKG_VERSION=2.6.1
+TERMUX_PKG_BUILD_REVISION=1
TERMUX_PKG_SRCURL=https://github.com/google/protobuf/releases/download/v${TERMUX_PKG_VERSION}/protobuf-${TERMUX_PKG_VERSION}.tar.bz2
# Build a host build first and use the host build protoc:
TERMUX_PKG_HOSTBUILD=yes
TERMUX_PKG_EXTRA_CONFIGURE_ARGS="--with-protoc=$TERMUX_PKG_HOSTBUILD_DIR/src/protoc"
+# Link against libgnustl_shared.so so that other C++ programs that
+# uses protobuf (e.g. mosh) may use libgnustl_shared.so.
+TERMUX_PKG_DEPENDS="libgnustl"
+
+LDFLAGS+=" -lgnustl_shared"
TERMUX_PKG_HOMEPAGE=http://termux.com/add-ons/api/
TERMUX_PKG_DESCRIPTION="Termux API commands"
-TERMUX_PKG_VERSION=0.13
+TERMUX_PKG_VERSION=0.14
termux_step_make_install () {
mkdir -p $TERMUX_PREFIX/bin
// Close stdin:
close(STDIN_FILENO);
- char const* const file = "/system/bin/am";
- // Avoid the system am binary from linking to wrong libraries:
- unsetenv("LD_LIBRARY_PATH");
- // Ensure /system/bin/app_process is in path, which is needed by am in some systems:
- putenv("PATH=/system/bin");
-
// The user is calculated from the uid in android.os.UserHandle#getUserId(int uid) as "uid / 100000", so we do the same:
uid_t current_uid = getuid();
int android_user_id = current_uid / 100000;
// End with NULL:
child_argv[argc + extra_args] = NULL;
- execv(file, child_argv);
+ // Use an a executable taking care of PATH and LD_LIBRARY_PATH:
+ char const* const am_executable = "/data/data/com.termux/files/usr/bin/am";
+ execv(am_executable, child_argv);
+
perror("execv(\"/system/bin/am\")");
exit(1);
}
TERMUX_PKG_HOMEPAGE=http://termux.com/
TERMUX_PKG_DESCRIPTION="Some tools for Termux"
-TERMUX_PKG_VERSION=0.21
+TERMUX_PKG_VERSION=0.25
termux_step_make_install () {
$CXX $CFLAGS $LDFLAGS -std=c++14 -Wall -Wextra -pedantic -Werror $TERMUX_PKG_BUILDER_DIR/*.cpp -o $TERMUX_PREFIX/bin/termux-elf-cleaner
# Remove LD_LIBRARY_PATH from environment to avoid conflicting
# with system libraries that am may link against.
- for tool in am dalvikvm df getprop logcat ping pm; do
+ for tool in am dalvikvm df getprop logcat ping ping6 ip pm settings; do
WRAPPER_FILE=$TERMUX_PREFIX/bin/$tool
echo '#!/bin/sh' > $WRAPPER_FILE
- if [ $tool = am -o $tool = pm ]; then
- # These tools require having /system/bin/app_process in the PATH,
- # at least on a Nexus 6p running Android 6.0.
- echo -n 'PATH=$PATH:/system/bin ' >> $WRAPPER_FILE
+
+ # Some of these tools (am,dalvikvm,?) requires LD_LIBRARY_PATH setup on at least some devices:
+ if [ $tool != getprop ]; then
+ echo 'if [ -n "`getprop ro.product.cpu.abilist64`" ]; then BITS=64; else BITS=; fi' >> $WRAPPER_FILE
+ echo -n 'LD_LIBRARY_PATH=/system/lib$BITS ' >> $WRAPPER_FILE
fi
- echo "LD_LIBRARY_PATH= exec /system/bin/$tool \$@" >> $WRAPPER_FILE
+
+ # Some tools require having /system/bin/app_process in the PATH,
+ # at least am&pm on a Nexus 6p running Android 6.0:
+ echo -n 'PATH=$PATH:/system/bin ' >> $WRAPPER_FILE
+
+ echo "exec /system/bin/$tool \$@" >> $WRAPPER_FILE
chmod +x $TERMUX_PREFIX/bin/$tool
done
#!/bin/sh
-if [ -x /system/xbin/su ]; then
- # The su tool may require programs from /system/bin in path:
- PATH=/system/bin:$PATH /system/xbin/su $@
-else
- echo "There is no su program on this device. Termux"
- echo "does not supply tools for rooting, see e.g."
- echo "http://www.androidcentral.com/root for"
- echo "information about rooting Android."
- exit 1
-fi
+for p in /system/xbin/su /su/bin/su
+do
+ if [ -x $p ]; then
+ # The su tool may require programs
+ # from /system/bin in path:
+ PATH=/system/bin:$PATH exec $p $@
+ fi
+done
+
+echo "There is no su program on this device. Termux"
+echo "does not supply tools for rooting, see e.g."
+echo "http://www.androidcentral.com/root for"
+echo "information about rooting Android."
+exit 1
exit
fi
-LD_LIBRARY_PATH= am broadcast --user 0 -a com.termux.app.reload_style com.termux > /dev/null
+am broadcast --user 0 -a com.termux.app.reload_style com.termux > /dev/null
exit
fi
-LD_LIBRARY_PATH= am broadcast --user 0 \
+am broadcast --user 0 \
--es com.termux.app.reload_style storage \
-a com.termux.app.reload_style com.termux > /dev/null
--- /dev/null
+TERMUX_PKG_HOMEPAGE=https://github.com/tesseract-ocr/tesseract
+TERMUX_PKG_DESCRIPTION="Tesseract is probably the most accurate open source OCR engine available"
+TERMUX_PKG_VERSION=3.04.01
+TERMUX_PKG_DEPENDS="libtool, libuuid, leptonica"
+TERMUX_PKG_SRCURL=https://github.com/tesseract-ocr/tesseract/archive/${TERMUX_PKG_VERSION}.tar.gz
+TERMUX_PKG_FOLDERNAME=tesseract-${TERMUX_PKG_VERSION}
+
+termux_step_pre_configure() {
+ # http://blog.matt-swain.com/post/26419042500/installing-tesseract-ocr-on-mac-os-x-lion
+ export LIBLEPT_HEADERSDIR=${TERMUX_PREFIX}/include/leptonica
+
+ cd $TERMUX_PKG_SRCDIR
+ perl -p -i -e 's|ADD_RT, true|ADD_RT, false|g' configure.ac
+ ./autogen.sh
+}
+
+termux_step_post_make_install() {
+ # download english trained data
+ cd "${TERMUX_PREFIX}/share/tessdata"
+ rm -f eng.*
+ wget https://raw.githubusercontent.com/tesseract-ocr/tessdata/master/eng.cube.bigrams
+ wget https://raw.githubusercontent.com/tesseract-ocr/tessdata/master/eng.cube.fold
+ wget https://raw.githubusercontent.com/tesseract-ocr/tessdata/master/eng.cube.lm
+ wget https://raw.githubusercontent.com/tesseract-ocr/tessdata/master/eng.cube.nn
+ wget https://raw.githubusercontent.com/tesseract-ocr/tessdata/master/eng.cube.params
+ wget https://raw.githubusercontent.com/tesseract-ocr/tessdata/master/eng.cube.size
+ wget https://raw.githubusercontent.com/tesseract-ocr/tessdata/master/eng.cube.word-freq
+ wget https://raw.githubusercontent.com/tesseract-ocr/tessdata/master/eng.tesseract_cube.nn
+ wget https://raw.githubusercontent.com/tesseract-ocr/tessdata/master/eng.traineddata
+}
TERMUX_PKG_HOMEPAGE=http://jonas.nitro.dk/tig/
TERMUX_PKG_DESCRIPTION="Ncurses-based text-mode interface for git"
TERMUX_PKG_VERSION=2.1.1
+TERMUX_PKG_BUILD_REVISION=1
TERMUX_PKG_SRCURL=http://jonas.nitro.dk/tig/releases/tig-${TERMUX_PKG_VERSION}.tar.gz
TERMUX_PKG_BUILD_IN_SRC=yes
TERMUX_PKG_DEPENDS="ncurses, git, libandroid-support"
TERMUX_PKG_HOMEPAGE=http://tmux.github.io/
TERMUX_PKG_DESCRIPTION="Terminal multiplexer implementing switching between several programs in one terminal, detaching them and reattaching them to a different terminal"
TERMUX_PKG_DEPENDS="ncurses, libevent, libutil"
-TERMUX_PKG_VERSION=2.1
-TERMUX_PKG_BUILD_REVISION=1
+TERMUX_PKG_VERSION=2.2
TERMUX_PKG_SRCURL=https://github.com/tmux/tmux/releases/download/${TERMUX_PKG_VERSION}/tmux-${TERMUX_PKG_VERSION}.tar.gz
TERMUX_PKG_BUILD_IN_SRC=yes
+++ /dev/null
-diff -u -r ../tmux-1.8/session.c ./session.c
---- ../tmux-1.8/session.c 2013-03-26 20:22:31.000000000 +0100
-+++ ./session.c 2014-02-13 18:55:45.000000000 +0100
-@@ -23,6 +23,7 @@
- #include <stdlib.h>
- #include <unistd.h>
- #include <time.h>
-+#include <sys/stat.h>
-
- #include "tmux.h"
-
-@@ -245,8 +246,10 @@
- server_fill_environ(s, &env);
-
- shell = options_get_string(&s->options, "default-shell");
-- if (*shell == '\0' || areshell(shell))
-- shell = _PATH_BSHELL;
-+ if (*shell == '\0' || areshell(shell)) {
-+ struct stat st;
-+ shell = (stat("@TERMUX_PREFIX@/home/.aterm/shell", &st) == 0) ? "@TERMUX_PREFIX@/home/.aterm/shell" : _PATH_BSHELL;
-+ }
-
- hlimit = options_get_number(&s->options, "history-limit");
- w = window_create(
--- /dev/null
+diff -u -r ../tmux-2.2/session.c ./session.c
+--- ../tmux-2.2/session.c 2016-01-20 19:00:28.000000000 -0500
++++ ./session.c 2016-04-11 05:28:53.669311770 -0400
+@@ -22,6 +22,7 @@
+ #include <string.h>
+ #include <stdlib.h>
+ #include <unistd.h>
++#include <pwd.h>
+ #include <time.h>
+
+ #include "tmux.h"
+@@ -340,7 +341,7 @@
+
+ shell = options_get_string(s->options, "default-shell");
+ if (*shell == '\0' || areshell(shell))
+- shell = _PATH_BSHELL;
++ shell = getpwuid(getuid())->pw_shell;
+
+ hlimit = options_get_number(s->options, "history-limit");
+ w = window_create(name, argc, argv, path, shell, cwd, env, s->tio,
--- /dev/null
+diff -u -r ../tmux-2.2/tmux.c ./tmux.c
+--- ../tmux-2.2/tmux.c 2016-03-05 12:55:49.000000000 -0500
++++ ./tmux.c 2016-04-11 04:36:26.594521819 -0400
+@@ -24,7 +24,9 @@
+ #include <event.h>
+ #include <fcntl.h>
+ #include <getopt.h>
++#ifndef __ANDROID__
+ #include <langinfo.h>
++#endif
+ #include <locale.h>
+ #include <pwd.h>
+ #include <stdlib.h>
+@@ -195,10 +197,12 @@
+ if (setlocale(LC_CTYPE, "en_US.UTF-8") == NULL) {
+ if (setlocale(LC_CTYPE, "") == NULL)
+ errx(1, "invalid LC_ALL, LC_CTYPE or LANG");
++#ifndef __ANDROID__
+ s = nl_langinfo(CODESET);
+ if (strcasecmp(s, "UTF-8") != 0 &&
+ strcasecmp(s, "UTF8") != 0)
+ errx(1, "need UTF-8 locale (LC_CTYPE) but have %s", s);
++#endif
+ }
+
+ setlocale(LC_TIME, "");
set -g mouse on
set -s escape-time 0
-
-# Version 2.1 of tmux removed mouse wheel scrolling support by default,
-# but these two lines from https://github.com/tmux/tmux/issues/145 add it back:
-bind -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'select-pane -t=; copy-mode -e; send-keys -M'"
-bind -n WheelDownPane select-pane -t= \; send-keys -M
--- /dev/null
+diff -u -r ../tmux-2.2/tmux.h ./tmux.h
+--- ../tmux-2.2/tmux.h 2016-04-03 20:16:53.000000000 -0400
++++ ./tmux.h 2016-04-11 04:38:13.276761966 -0400
+@@ -51,7 +51,7 @@
+ struct tmuxproc;
+
+ /* Default global configuration file. */
+-#define TMUX_CONF "/etc/tmux.conf"
++#define TMUX_CONF "@TERMUX_PREFIX@/etc/tmux.conf"
+
+ /*
+ * Minimum layout cell size, NOT including separator line. The scroll region
+++ /dev/null
-diff -u -r ../tmux-1.9a/tmux.c ./tmux.c
---- ../tmux-1.9a/tmux.c 2014-02-22 21:48:37.000000000 +0100
-+++ ./tmux.c 2014-02-24 08:56:45.000000000 +0100
-@@ -137,7 +137,7 @@
- else if ((s = getenv("TMPDIR")) != NULL && *s != '\0')
- xsnprintf(base, sizeof base, "%s/tmux-%u", s, uid);
- else
-- xsnprintf(base, sizeof base, "%s/tmux-%u", _PATH_TMP, uid);
-+ xsnprintf(base, sizeof base, "%s/tmux-%u", "@TERMUX_PREFIX@/tmp", uid);
-
- if (mkdir(base, S_IRWXU) != 0 && errno != EEXIST)
- return (NULL);
+++ /dev/null
-diff -u -r ../tmux-2.1/tmux.h ./tmux.h
---- ../tmux-2.1/tmux.h 2015-09-27 05:51:49.000000000 -0400
-+++ ./tmux.h 2015-10-19 17:33:45.737891900 -0400
-@@ -40,7 +40,7 @@
- extern char **environ;
-
- /* Default global configuration file. */
--#define TMUX_CONF "/etc/tmux.conf"
-+#define TMUX_CONF "@TERMUX_PREFIX@/etc/tmux.conf"
-
- /*
- * Minimum layout cell size, NOT including separator line. The scroll region
-@@ -72,7 +72,7 @@
- #define fatalx(msg) log_fatalx("%s: %s", __func__, msg);
-
- /* Definition to shut gcc up about unused arguments. */
--#define unused __attribute__ ((unused))
-+#define unused
-
- /* Attribute to make gcc check printf-like arguments. */
- #define printflike(a, b) __attribute__ ((format (printf, a, b)))
TERMUX_PKG_DESCRIPTION="Easy, lean and powerful BitTorrent client"
TERMUX_PKG_DEPENDS="curl, libevent, openssl"
TERMUX_PKG_VERSION=2.92
+TERMUX_PKG_BUILD_REVISION=1
TERMUX_PKG_SRCURL=https://transmission.cachefly.net/transmission-${TERMUX_PKG_VERSION}.tar.xz
TERMUX_PKG_EXTRA_CONFIGURE_ARGS="--disable-gtk --enable-lightweight --cache-file=termux_configure.cache"
TERMUX_PKG_VERSION=6.0
+TERMUX_PKG_BUILD_REVISION=1
TERMUX_PKG_HOMEPAGE=http://www.info-zip.org/
TERMUX_PKG_DESCRIPTION="Tools for working with zip files"
TERMUX_PKG_SRCURL="http://downloads.sourceforge.net/project/infozip/UnZip%206.x%20%28latest%29/UnZip%206.0/unzip60.tar.gz"
TERMUX_PKG_DEPENDS="ncurses, vim-runtime, python"
# Vim 7.4 patches described at ftp://ftp.vim.org/pub/vim/patches/7.4/README
-TERMUX_PKG_VERSION=7.4.1627
+TERMUX_PKG_VERSION=7.4.1707
TERMUX_PKG_SRCURL="https://github.com/vim/vim/archive/v${TERMUX_PKG_VERSION}.tar.gz"
TERMUX_PKG_FOLDERNAME=vim-${TERMUX_PKG_VERSION}
TERMUX_PKG_EXTRA_CONFIGURE_ARGS="vim_cv_toupper_broken=no vim_cv_terminfo=yes vim_cv_tty_group=world"
cp $TERMUX_PREFIX/share/vim/vim74/tutor/{tutor,tutor.vim,tutor.utf-8} $TERMUX_PKG_TMPDIR/
rm -f $TERMUX_PREFIX/share/vim/vim74/tutor/*
cp $TERMUX_PKG_TMPDIR/{tutor,tutor.vim,tutor.utf-8} $TERMUX_PREFIX/share/vim/vim74/tutor/
+
+ cd $TERMUX_PREFIX/bin
+ ln -f -s vim vi
}
TERMUX_PKG_DEPENDS="ncurses, vim-runtime"
# Vim 7.4 patches described at ftp://ftp.vim.org/pub/vim/patches/7.4/README
-TERMUX_PKG_VERSION=7.4.1627
+TERMUX_PKG_VERSION=7.4.1707
TERMUX_PKG_SRCURL="https://github.com/vim/vim/archive/v${TERMUX_PKG_VERSION}.tar.gz"
TERMUX_PKG_FOLDERNAME=vim-${TERMUX_PKG_VERSION}
TERMUX_PKG_EXTRA_CONFIGURE_ARGS="vim_cv_toupper_broken=no vim_cv_terminfo=yes vim_cv_tty_group=world"
cp $TERMUX_PREFIX/share/vim/vim74/tutor/{tutor,tutor.vim,tutor.utf-8} $TERMUX_PKG_TMPDIR/
rm -f $TERMUX_PREFIX/share/vim/vim74/tutor/*
cp $TERMUX_PKG_TMPDIR/{tutor,tutor.vim,tutor.utf-8} $TERMUX_PREFIX/share/vim/vim74/tutor/
+
+ cd $TERMUX_PREFIX/bin
+ ln -f -s vim vi
}
--- /dev/null
+TERMUX_PKG_HOMEPAGE=http://www.vorbis.com
+TERMUX_PKG_DESCRIPTION="Ogg Vorbis tools"
+TERMUX_PKG_VERSION=1.4.0
+TERMUX_PKG_SRCURL=http://downloads.xiph.org/releases/vorbis/vorbis-tools-${TERMUX_PKG_VERSION}.tar.gz
+TERMUX_PKG_DEPENDS="libvorbis"
+
+LDFLAGS+=" -lm"
TERMUX_PKG_HOMEPAGE=http://weechat.org/
TERMUX_PKG_DESCRIPTION="Fast, light and extensible IRC chat client"
TERMUX_PKG_VERSION=1.4
-TERMUX_PKG_BUILD_REVISION=1
+TERMUX_PKG_BUILD_REVISION=2
TERMUX_PKG_SRCURL=http://www.weechat.org/files/src/weechat-${TERMUX_PKG_VERSION}.tar.bz2
TERMUX_PKG_DEPENDS="ncurses, libgcrypt, libcurl, libgnutls, libandroid-support"
# weechat-curses is a symlink to weechat, so remove it:
--- /dev/null
+TERMUX_PKG_HOMEPAGE=http://zbar.sourceforge.net
+TERMUX_PKG_DESCRIPTION="Software suite for reading bar codes from various sources"
+TERMUX_PKG_VERSION=0.10
+TERMUX_PKG_SRCURL=http://downloads.sourceforge.net/project/zbar/zbar/0.10/zbar-${TERMUX_PKG_VERSION}.tar.bz2
+TERMUX_PKG_DEPENDS="imagemagick"
+TERMUX_PKG_EXTRA_CONFIGURE_ARGS="--disable-pthread --disable-video --without-xshm --without-xv --without-gtk --without-qt --without-python --mandir=$TERMUX_PREFIX/share/man"