LC_TIME=C export LC_TIME shell_get_perl () { FILENAME=$1 OFFSET=$2 perl -e ' use strict; use POSIX; use Fcntl; my $filename = $ARGV[0]; my $pos = $ARGV[1]; my $content; my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = lstat("$filename"); my $n; if (open IFILE,$filename) { if ($size<$pos) { printf("0\n"); } else { $size-=$pos; printf("$size\n"); } printf("### 100\n"); seek (IFILE, $pos, 0); while ($n = read(IFILE,$content,$blksize)!= 0) { print $content; } close IFILE; printf("### 200\n"); } else { printf("### 500\n"); } exit 0 ' "${FILENAME}" $OFFSET } shell_get_tail () { FILENAME=$1 OFFSET=$2 LC_TIME=C export LC_TIME if dd if="${FILENAME}" of=/dev/null bs=1 count=1 2>/dev/null ; then file_size=`ls -ln "${FILENAME}" 2>/dev/null | ( read p l u g s r echo $s )` if [ $OFFSET -gt 0 ]; then file_size=`expr $file_size - $OFFSET` OFFSET=`expr $OFFSET + 1` fi if [ $file_size -gt 0 ]; then echo $file_size else echo 0 fi echo "### 100" if [ $OFFSET -gt 0 ]; then tail -c +${OFFSET} "${FILENAME}" else cat "${FILENAME}" fi echo "### 200" else echo "### 500" fi } shell_get_dd () { FILENAME=$1 OFFSET=$2 LC_TIME=C export LC_TIME if dd if="${FILENAME}" of=/dev/null bs=1 count=1 2>/dev/null ; then file_size=`ls -ln "${FILENAME}" 2>/dev/null | ( read p l u g s r echo $s )` file_size=`expr $file_size - $OFFSET` if [ $file_size -gt 0 ]; then echo $file_size else echo 0 fi echo "### 100" if [ $OFFSET -gt 0 ]; then dd skip=$OFFSET ibs=1 if="${FILENAME}" 2>/dev/null else cat "${FILENAME}" fi echo "### 200" else echo "### 500" fi } if [ -n "${SHELL_HAVE_PERL}" ]; then shell_get_perl "/${SHELL_FILENAME}" ${SHELL_START_OFFSET} elif [ -n "${SHELL_HAVE_TAIL}" ]; then shell_get_tail "/${SHELL_FILENAME}" ${SHELL_START_OFFSET} else shell_get_dd "/${SHELL_FILENAME}" ${SHELL_START_OFFSET} fi