Added initial revision of demo application
git-svn-id: https://shellinabox.googlecode.com/svn/trunk@93 0da03de8-d603-11dd-86c2-0f8696b7b6f9
This commit is contained in:
parent
c19ed2f3ca
commit
3e0241dde3
16 changed files with 916 additions and 43 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
2009-03-30 Markus Gutschke <markus@shellinabox.com>
|
||||||
|
|
||||||
|
* Added initial revision of demo application
|
||||||
|
|
||||||
|
2009-03-29 Markus Gutschke <markus@shellinabox.com>
|
||||||
|
|
||||||
|
* Added support for chained SSL certificates
|
||||||
|
|
||||||
2009-03-23 Markus Gutschke <markus@shellinabox.com>
|
2009-03-23 Markus Gutschke <markus@shellinabox.com>
|
||||||
|
|
||||||
* Added an INSTALL.Debian file with Debian-specific instructions on
|
* Added an INSTALL.Debian file with Debian-specific instructions on
|
||||||
|
|
12
Makefile.am
12
Makefile.am
|
@ -1,9 +1,10 @@
|
||||||
AM_CPPFLAGS =
|
AM_CPPFLAGS =
|
||||||
AM_CFLAGS = -g -std=gnu99 -Wall -Werror -Os
|
AM_CFLAGS = -g -std=gnu99 -Wall
|
||||||
AM_LDFLAGS = -g
|
AM_LDFLAGS = -g
|
||||||
|
|
||||||
noinst_LTLIBRARIES = libhttp.la \
|
noinst_LTLIBRARIES = libhttp.la \
|
||||||
liblogging.la
|
liblogging.la
|
||||||
|
noinst_DATA = $(top_srcdir)/demo/demo.js
|
||||||
bin_PROGRAMS = shellinaboxd
|
bin_PROGRAMS = shellinaboxd
|
||||||
man_MANS = shellinaboxd.1
|
man_MANS = shellinaboxd.1
|
||||||
noinst_HEADERS = libhttp/http.h
|
noinst_HEADERS = libhttp/http.h
|
||||||
|
@ -15,7 +16,14 @@ dist_doc_DATA = AUTHORS \
|
||||||
NEWS \
|
NEWS \
|
||||||
README \
|
README \
|
||||||
TODO
|
TODO
|
||||||
EXTRA_DIST = shellinabox/shellinaboxd.man.in \
|
EXTRA_DIST = demo/beep.wav \
|
||||||
|
demo/favicon.ico \
|
||||||
|
demo/demo.html \
|
||||||
|
demo/demo.js \
|
||||||
|
demo/demo.jspp \
|
||||||
|
demo/styles.css \
|
||||||
|
demo/vt100.js \
|
||||||
|
shellinabox/shellinaboxd.man.in \
|
||||||
shellinabox/shell_in_a_box.js \
|
shellinabox/shell_in_a_box.js \
|
||||||
shellinabox/vt100.js \
|
shellinabox/vt100.js \
|
||||||
debian/README \
|
debian/README \
|
||||||
|
|
14
Makefile.in
14
Makefile.in
|
@ -110,7 +110,7 @@ am__vpath_adj = case $$p in \
|
||||||
esac;
|
esac;
|
||||||
am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
|
am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
|
||||||
dist_docDATA_INSTALL = $(INSTALL_DATA)
|
dist_docDATA_INSTALL = $(INSTALL_DATA)
|
||||||
DATA = $(dist_doc_DATA)
|
DATA = $(dist_doc_DATA) $(noinst_DATA)
|
||||||
HEADERS = $(noinst_HEADERS)
|
HEADERS = $(noinst_HEADERS)
|
||||||
ETAGS = etags
|
ETAGS = etags
|
||||||
CTAGS = ctags
|
CTAGS = ctags
|
||||||
|
@ -237,11 +237,12 @@ top_build_prefix = @top_build_prefix@
|
||||||
top_builddir = @top_builddir@
|
top_builddir = @top_builddir@
|
||||||
top_srcdir = @top_srcdir@
|
top_srcdir = @top_srcdir@
|
||||||
AM_CPPFLAGS =
|
AM_CPPFLAGS =
|
||||||
AM_CFLAGS = -g -std=gnu99 -Wall -Werror -Os
|
AM_CFLAGS = -g -std=gnu99 -Wall
|
||||||
AM_LDFLAGS = -g
|
AM_LDFLAGS = -g
|
||||||
noinst_LTLIBRARIES = libhttp.la \
|
noinst_LTLIBRARIES = libhttp.la \
|
||||||
liblogging.la
|
liblogging.la
|
||||||
|
|
||||||
|
noinst_DATA = $(top_srcdir)/demo/demo.js
|
||||||
man_MANS = shellinaboxd.1
|
man_MANS = shellinaboxd.1
|
||||||
noinst_HEADERS = libhttp/http.h
|
noinst_HEADERS = libhttp/http.h
|
||||||
dist_doc_DATA = AUTHORS \
|
dist_doc_DATA = AUTHORS \
|
||||||
|
@ -253,7 +254,14 @@ dist_doc_DATA = AUTHORS \
|
||||||
README \
|
README \
|
||||||
TODO
|
TODO
|
||||||
|
|
||||||
EXTRA_DIST = shellinabox/shellinaboxd.man.in \
|
EXTRA_DIST = demo/beep.wav \
|
||||||
|
demo/favicon.ico \
|
||||||
|
demo/demo.html \
|
||||||
|
demo/demo.js \
|
||||||
|
demo/demo.jspp \
|
||||||
|
demo/styles.css \
|
||||||
|
demo/vt100.js \
|
||||||
|
shellinabox/shellinaboxd.man.in \
|
||||||
shellinabox/shell_in_a_box.js \
|
shellinabox/shell_in_a_box.js \
|
||||||
shellinabox/vt100.js \
|
shellinabox/vt100.js \
|
||||||
debian/README \
|
debian/README \
|
||||||
|
|
4
commit
4
commit
|
@ -34,7 +34,9 @@ yes_no() {
|
||||||
|
|
||||||
test -r configure.ac
|
test -r configure.ac
|
||||||
svn update
|
svn update
|
||||||
|
{
|
||||||
rev=$(($(svn info | sed -e 's/^Revision: \(.*\)/\1/;t1;d;:1;q')+1))
|
rev=$(($(svn info | sed -e 's/^Revision: \(.*\)/\1/;t1;d;:1;q')+1))
|
||||||
|
} 2>/dev/null
|
||||||
prj="$(sed -e 's/^AC_INIT(\([^,]*\),.*/\1/;t1;d;:1;q' configure.ac)"
|
prj="$(sed -e 's/^AC_INIT(\([^,]*\),.*/\1/;t1;d;:1;q' configure.ac)"
|
||||||
ver="$(sed -e 's/^AC_INIT([^,]*, *\([^,]*\),.*/\1/;t1;d;:1;q' configure.ac)"
|
ver="$(sed -e 's/^AC_INIT([^,]*, *\([^,]*\),.*/\1/;t1;d;:1;q' configure.ac)"
|
||||||
sed -ie 's/^\(VCS_REVISION=\).*/\1'"${rev}"'/' configure.ac
|
sed -ie 's/^\(VCS_REVISION=\).*/\1'"${rev}"'/' configure.ac
|
||||||
|
@ -43,7 +45,7 @@ make all distcheck
|
||||||
rm -f "${prj}-${ver}" &&
|
rm -f "${prj}-${ver}" &&
|
||||||
tar zfx "${prj}-${ver}.tar.gz" &&
|
tar zfx "${prj}-${ver}.tar.gz" &&
|
||||||
cd "${prj}-${ver}" &&
|
cd "${prj}-${ver}" &&
|
||||||
{ fakeroot dpkg-buildpackage || :; } &&
|
fakeroot dpkg-buildpackage -us -uc &&
|
||||||
cd .. &&
|
cd .. &&
|
||||||
rm -f $(ls "${prj}_${ver}-"*.* | egrep -v '.deb$') ) || :
|
rm -f $(ls "${prj}_${ver}-"*.* | egrep -v '.deb$') ) || :
|
||||||
svn diff $(svn st |
|
svn diff $(svn st |
|
||||||
|
|
2
config.h
2
config.h
|
@ -95,7 +95,7 @@
|
||||||
#define STDC_HEADERS 1
|
#define STDC_HEADERS 1
|
||||||
|
|
||||||
/* Most recent revision number in the version control system */
|
/* Most recent revision number in the version control system */
|
||||||
#define VCS_REVISION "91"
|
#define VCS_REVISION "93"
|
||||||
|
|
||||||
/* Version number of package */
|
/* Version number of package */
|
||||||
#define VERSION "2.5"
|
#define VERSION "2.5"
|
||||||
|
|
54
configure
vendored
54
configure
vendored
|
@ -754,6 +754,7 @@ PACKAGE_VERSION='2.5'
|
||||||
PACKAGE_STRING='shellinabox 2.5'
|
PACKAGE_STRING='shellinabox 2.5'
|
||||||
PACKAGE_BUGREPORT='markus@shellinabox.com'
|
PACKAGE_BUGREPORT='markus@shellinabox.com'
|
||||||
|
|
||||||
|
ac_c_werror_flag=
|
||||||
# Factoring default headers for most tests.
|
# Factoring default headers for most tests.
|
||||||
ac_includes_default="\
|
ac_includes_default="\
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -2055,7 +2056,7 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $
|
||||||
ac_compiler_gnu=$ac_cv_c_compiler_gnu
|
ac_compiler_gnu=$ac_cv_c_compiler_gnu
|
||||||
|
|
||||||
|
|
||||||
VCS_REVISION=91
|
VCS_REVISION=93
|
||||||
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
@ -2063,6 +2064,7 @@ cat >>confdefs.h <<_ACEOF
|
||||||
_ACEOF
|
_ACEOF
|
||||||
|
|
||||||
|
|
||||||
|
CFLAGS="${CFLAGS:--Os}"
|
||||||
am__api_version='1.10'
|
am__api_version='1.10'
|
||||||
|
|
||||||
ac_aux_dir=
|
ac_aux_dir=
|
||||||
|
@ -3658,6 +3660,8 @@ else
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ac_c_werror_flag=yes
|
||||||
# Find a good install program. We prefer a C program (faster),
|
# Find a good install program. We prefer a C program (faster),
|
||||||
# so one script is as good as another. But avoid the broken or
|
# so one script is as good as another. But avoid the broken or
|
||||||
# incompatible versions:
|
# incompatible versions:
|
||||||
|
@ -4531,7 +4535,7 @@ ia64-*-hpux*)
|
||||||
;;
|
;;
|
||||||
*-*-irix6*)
|
*-*-irix6*)
|
||||||
# Find out which ABI we are using.
|
# Find out which ABI we are using.
|
||||||
echo '#line 4534 "configure"' > conftest.$ac_ext
|
echo '#line 4538 "configure"' > conftest.$ac_ext
|
||||||
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
|
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
|
||||||
(eval $ac_compile) 2>&5
|
(eval $ac_compile) 2>&5
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
|
@ -7616,11 +7620,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:7619: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:7623: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>conftest.err)
|
(eval "$lt_compile" 2>conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat conftest.err >&5
|
cat conftest.err >&5
|
||||||
echo "$as_me:7623: \$? = $ac_status" >&5
|
echo "$as_me:7627: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s "$ac_outfile"; then
|
if (exit $ac_status) && test -s "$ac_outfile"; then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
# So say no if there are warnings other than the usual output.
|
# So say no if there are warnings other than the usual output.
|
||||||
|
@ -7906,11 +7910,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:7909: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:7913: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>conftest.err)
|
(eval "$lt_compile" 2>conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat conftest.err >&5
|
cat conftest.err >&5
|
||||||
echo "$as_me:7913: \$? = $ac_status" >&5
|
echo "$as_me:7917: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s "$ac_outfile"; then
|
if (exit $ac_status) && test -s "$ac_outfile"; then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
# So say no if there are warnings other than the usual output.
|
# So say no if there are warnings other than the usual output.
|
||||||
|
@ -8010,11 +8014,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:8013: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:8017: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>out/conftest.err)
|
(eval "$lt_compile" 2>out/conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat out/conftest.err >&5
|
cat out/conftest.err >&5
|
||||||
echo "$as_me:8017: \$? = $ac_status" >&5
|
echo "$as_me:8021: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s out/conftest2.$ac_objext
|
if (exit $ac_status) && test -s out/conftest2.$ac_objext
|
||||||
then
|
then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
|
@ -10423,7 +10427,7 @@ else
|
||||||
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
|
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
|
||||||
lt_status=$lt_dlunknown
|
lt_status=$lt_dlunknown
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 10426 "configure"
|
#line 10430 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
|
|
||||||
#if HAVE_DLFCN_H
|
#if HAVE_DLFCN_H
|
||||||
|
@ -10523,7 +10527,7 @@ else
|
||||||
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
|
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
|
||||||
lt_status=$lt_dlunknown
|
lt_status=$lt_dlunknown
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 10526 "configure"
|
#line 10530 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
|
|
||||||
#if HAVE_DLFCN_H
|
#if HAVE_DLFCN_H
|
||||||
|
@ -12932,11 +12936,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:12935: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:12939: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>conftest.err)
|
(eval "$lt_compile" 2>conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat conftest.err >&5
|
cat conftest.err >&5
|
||||||
echo "$as_me:12939: \$? = $ac_status" >&5
|
echo "$as_me:12943: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s "$ac_outfile"; then
|
if (exit $ac_status) && test -s "$ac_outfile"; then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
# So say no if there are warnings other than the usual output.
|
# So say no if there are warnings other than the usual output.
|
||||||
|
@ -13036,11 +13040,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:13039: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:13043: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>out/conftest.err)
|
(eval "$lt_compile" 2>out/conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat out/conftest.err >&5
|
cat out/conftest.err >&5
|
||||||
echo "$as_me:13043: \$? = $ac_status" >&5
|
echo "$as_me:13047: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s out/conftest2.$ac_objext
|
if (exit $ac_status) && test -s out/conftest2.$ac_objext
|
||||||
then
|
then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
|
@ -14634,11 +14638,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:14637: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:14641: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>conftest.err)
|
(eval "$lt_compile" 2>conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat conftest.err >&5
|
cat conftest.err >&5
|
||||||
echo "$as_me:14641: \$? = $ac_status" >&5
|
echo "$as_me:14645: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s "$ac_outfile"; then
|
if (exit $ac_status) && test -s "$ac_outfile"; then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
# So say no if there are warnings other than the usual output.
|
# So say no if there are warnings other than the usual output.
|
||||||
|
@ -14738,11 +14742,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:14741: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:14745: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>out/conftest.err)
|
(eval "$lt_compile" 2>out/conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat out/conftest.err >&5
|
cat out/conftest.err >&5
|
||||||
echo "$as_me:14745: \$? = $ac_status" >&5
|
echo "$as_me:14749: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s out/conftest2.$ac_objext
|
if (exit $ac_status) && test -s out/conftest2.$ac_objext
|
||||||
then
|
then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
|
@ -16966,11 +16970,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:16969: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:16973: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>conftest.err)
|
(eval "$lt_compile" 2>conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat conftest.err >&5
|
cat conftest.err >&5
|
||||||
echo "$as_me:16973: \$? = $ac_status" >&5
|
echo "$as_me:16977: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s "$ac_outfile"; then
|
if (exit $ac_status) && test -s "$ac_outfile"; then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
# So say no if there are warnings other than the usual output.
|
# So say no if there are warnings other than the usual output.
|
||||||
|
@ -17256,11 +17260,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:17259: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:17263: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>conftest.err)
|
(eval "$lt_compile" 2>conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat conftest.err >&5
|
cat conftest.err >&5
|
||||||
echo "$as_me:17263: \$? = $ac_status" >&5
|
echo "$as_me:17267: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s "$ac_outfile"; then
|
if (exit $ac_status) && test -s "$ac_outfile"; then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
# So say no if there are warnings other than the usual output.
|
# So say no if there are warnings other than the usual output.
|
||||||
|
@ -17360,11 +17364,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:17363: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:17367: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>out/conftest.err)
|
(eval "$lt_compile" 2>out/conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat out/conftest.err >&5
|
cat out/conftest.err >&5
|
||||||
echo "$as_me:17367: \$? = $ac_status" >&5
|
echo "$as_me:17371: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s out/conftest2.$ac_objext
|
if (exit $ac_status) && test -s out/conftest2.$ac_objext
|
||||||
then
|
then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
|
@ -20565,7 +20569,7 @@ cat >>conftest.$ac_ext <<_ACEOF
|
||||||
int
|
int
|
||||||
main ()
|
main ()
|
||||||
{
|
{
|
||||||
ptsname_r(0, 0, 0);
|
char buf[10]; ptsname_r(0, buf, sizeof(buf));
|
||||||
;
|
;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,15 +2,17 @@ AC_PREREQ(2.57)
|
||||||
|
|
||||||
dnl This is the one location where the authoritative version number is stored
|
dnl This is the one location where the authoritative version number is stored
|
||||||
AC_INIT(shellinabox, 2.5, markus@shellinabox.com)
|
AC_INIT(shellinabox, 2.5, markus@shellinabox.com)
|
||||||
VCS_REVISION=91
|
VCS_REVISION=93
|
||||||
AC_SUBST(VCS_REVISION)
|
AC_SUBST(VCS_REVISION)
|
||||||
AC_DEFINE_UNQUOTED(VCS_REVISION, "${VCS_REVISION}",
|
AC_DEFINE_UNQUOTED(VCS_REVISION, "${VCS_REVISION}",
|
||||||
[Most recent revision number in the version control system])
|
[Most recent revision number in the version control system])
|
||||||
|
|
||||||
dnl Set up autoconf/automake for building C libraries and binaries with GCC
|
dnl Set up autoconf/automake for building C libraries and binaries with GCC
|
||||||
|
CFLAGS="${CFLAGS:--Os}"
|
||||||
AM_INIT_AUTOMAKE
|
AM_INIT_AUTOMAKE
|
||||||
AM_CONFIG_HEADER(config.h)
|
AM_CONFIG_HEADER(config.h)
|
||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
|
AC_LANG_WERROR
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
AC_PROG_LIBTOOL
|
AC_PROG_LIBTOOL
|
||||||
AC_SUBST(LIBTOOL_DEPS)
|
AC_SUBST(LIBTOOL_DEPS)
|
||||||
|
@ -34,7 +36,7 @@ AC_TRY_LINK([#ifndef _XOPEN_SOURCE
|
||||||
#define _GNU_SOURCE
|
#define _GNU_SOURCE
|
||||||
#endif
|
#endif
|
||||||
#include <stdlib.h>],
|
#include <stdlib.h>],
|
||||||
[ptsname_r(0, 0, 0);],
|
[char buf[10]; ptsname_r(0, buf, sizeof(buf));],
|
||||||
[AC_DEFINE(HAVE_PTSNAME_R, 1,
|
[AC_DEFINE(HAVE_PTSNAME_R, 1,
|
||||||
Define to 1 if you have a re-entrant version of ptsname)])
|
Define to 1 if you have a re-entrant version of ptsname)])
|
||||||
|
|
||||||
|
|
1
demo/beep.wav
Symbolic link
1
demo/beep.wav
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../shellinabox/beep.wav
|
79
demo/demo.html
Normal file
79
demo/demo.html
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xml:lang="en" lang="en">
|
||||||
|
<head>
|
||||||
|
<!--
|
||||||
|
ShellInABox - Make command line applications available as AJAX web applications
|
||||||
|
Copyright (C) 2008-2009 Markus Gutschke markus@shellinabox.com
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License version 2 as
|
||||||
|
published by the Free Software Foundation.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
In addition to these license terms, the author grants the following
|
||||||
|
additional rights:
|
||||||
|
|
||||||
|
If you modify this program, or any covered work, by linking or
|
||||||
|
combining it with the OpenSSL project's OpenSSL library (or a
|
||||||
|
modified version of that library), containing parts covered by the
|
||||||
|
terms of the OpenSSL or SSLeay licenses, the author
|
||||||
|
grants you additional permission to convey the resulting work.
|
||||||
|
Corresponding Source for a non-source form of such a combination
|
||||||
|
shall include the source code for the parts of OpenSSL used as well
|
||||||
|
as that of the covered work.
|
||||||
|
|
||||||
|
You may at your option choose to remove this additional permission from
|
||||||
|
the work, or from any part of it.
|
||||||
|
|
||||||
|
It is possible to build this program in a way that it loads OpenSSL
|
||||||
|
libraries at run-time. If doing so, the following notices are required
|
||||||
|
by the OpenSSL and SSLeay licenses:
|
||||||
|
|
||||||
|
This product includes software developed by the OpenSSL Project
|
||||||
|
for use in the OpenSSL Toolkit. (http://www.openssl.org/)
|
||||||
|
|
||||||
|
This product includes cryptographic software written by Eric Young
|
||||||
|
(eay@cryptsoft.com)
|
||||||
|
|
||||||
|
The most up-to-date version of this program is always available from
|
||||||
|
http://shellinabox.com
|
||||||
|
-->
|
||||||
|
<title>Shell In A Box</title>
|
||||||
|
<link rel="stylesheet" href="styles.css" type="text/css">
|
||||||
|
<script type="text/javascript"><!--
|
||||||
|
// We would like to hide overflowing lines as this can lead to
|
||||||
|
// visually jarring results if the browser substitutes oversized
|
||||||
|
// Unicode characters from different fonts. Unfortunately, a bug
|
||||||
|
// in Firefox prevents it from allowing multi-line text
|
||||||
|
// selections whenever we change the "overflow" style. So, only
|
||||||
|
// do so for non-Netscape browsers.
|
||||||
|
if (typeof navigator.appName == 'undefined' ||
|
||||||
|
navigator.appName != 'Netscape') {
|
||||||
|
document.write('<style type="text/css">' +
|
||||||
|
'#vt100 #console div, #vt100 #alt_console div {' +
|
||||||
|
' overflow: hidden;' +
|
||||||
|
'}' +
|
||||||
|
'</style>');
|
||||||
|
}
|
||||||
|
--></script>
|
||||||
|
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
|
||||||
|
<script type="text/javascript" src="vt100.js"></script>
|
||||||
|
<script type="text/javascript" src="demo.js"></script>
|
||||||
|
</head>
|
||||||
|
<!-- Load ShellInABox from a timer as Konqueror sometimes fails to
|
||||||
|
correctly deal with the enclosing frameset (if any), if we do not
|
||||||
|
do this
|
||||||
|
-->
|
||||||
|
<body onload="setTimeout('new Demo()', 100)"
|
||||||
|
scroll="no"><noscript>JavaScript
|
||||||
|
must be enabled for ShellInABox</noscript></body>
|
||||||
|
</html>
|
371
demo/demo.js
Normal file
371
demo/demo.js
Normal file
|
@ -0,0 +1,371 @@
|
||||||
|
// Demo.js -- Demonstrate some of the features of ShellInABox
|
||||||
|
// Copyright (C) 2008-2009 Markus Gutschke <markus@shellinabox.com>
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License version 2 as
|
||||||
|
// published by the Free Software Foundation.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License along
|
||||||
|
// with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
//
|
||||||
|
// In addition to these license terms, the author grants the following
|
||||||
|
// additional rights:
|
||||||
|
//
|
||||||
|
// If you modify this program, or any covered work, by linking or
|
||||||
|
// combining it with the OpenSSL project's OpenSSL library (or a
|
||||||
|
// modified version of that library), containing parts covered by the
|
||||||
|
// terms of the OpenSSL or SSLeay licenses, the author
|
||||||
|
// grants you additional permission to convey the resulting work.
|
||||||
|
// Corresponding Source for a non-source form of such a combination
|
||||||
|
// shall include the source code for the parts of OpenSSL used as well
|
||||||
|
// as that of the covered work.
|
||||||
|
//
|
||||||
|
// You may at your option choose to remove this additional permission from
|
||||||
|
// the work, or from any part of it.
|
||||||
|
//
|
||||||
|
// It is possible to build this program in a way that it loads OpenSSL
|
||||||
|
// libraries at run-time. If doing so, the following notices are required
|
||||||
|
// by the OpenSSL and SSLeay licenses:
|
||||||
|
//
|
||||||
|
// This product includes software developed by the OpenSSL Project
|
||||||
|
// for use in the OpenSSL Toolkit. (http://www.openssl.org/)
|
||||||
|
//
|
||||||
|
// This product includes cryptographic software written by Eric Young
|
||||||
|
// (eay@cryptsoft.com)
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// The most up-to-date version of this program is always available from
|
||||||
|
// http://shellinabox.com
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Notes:
|
||||||
|
//
|
||||||
|
// The author believes that for the purposes of this license, you meet the
|
||||||
|
// requirements for publishing the source code, if your web server publishes
|
||||||
|
// the source in unmodified form (i.e. with licensing information, comments,
|
||||||
|
// formatting, and identifier names intact). If there are technical reasons
|
||||||
|
// that require you to make changes to the source code when serving the
|
||||||
|
// JavaScript (e.g to remove pre-processor directives from the source), these
|
||||||
|
// changes should be done in a reversible fashion.
|
||||||
|
//
|
||||||
|
// The author does not consider websites that reference this script in
|
||||||
|
// unmodified form, and web servers that serve this script in unmodified form
|
||||||
|
// to be derived works. As such, they are believed to be outside of the
|
||||||
|
// scope of this license and not subject to the rights or restrictions of the
|
||||||
|
// GNU General Public License.
|
||||||
|
//
|
||||||
|
// If in doubt, consult a legal professional familiar with the laws that
|
||||||
|
// apply in your country.
|
||||||
|
|
||||||
|
// #define STATE_IDLE 0
|
||||||
|
// #define STATE_INIT 1
|
||||||
|
// #define STATE_PROMPT 2
|
||||||
|
// #define STATE_READLINE 3
|
||||||
|
// #define STATE_COMMAND 4
|
||||||
|
// #define STATE_EVAL 5
|
||||||
|
// #define STATE_RUN 6
|
||||||
|
// #define STATE_EXEC 7
|
||||||
|
|
||||||
|
function extend(subClass, baseClass) {
|
||||||
|
function inheritance() { }
|
||||||
|
inheritance.prototype = baseClass.prototype;
|
||||||
|
subClass.prototype = new inheritance();
|
||||||
|
subClass.prototype.constructor = subClass;
|
||||||
|
subClass.prototype.superClass = baseClass.prototype;
|
||||||
|
};
|
||||||
|
|
||||||
|
function Demo(container) {
|
||||||
|
this.superClass.constructor.call(this, container);
|
||||||
|
this.gotoState(1 /* STATE_INIT */);
|
||||||
|
};
|
||||||
|
extend(Demo, VT100);
|
||||||
|
|
||||||
|
Demo.prototype.keysPressed = function(ch) {
|
||||||
|
this.keys += ch;
|
||||||
|
this.gotoState(this.state);
|
||||||
|
};
|
||||||
|
|
||||||
|
Demo.prototype.gotoState = function(state, tmo) {
|
||||||
|
this.state = state;
|
||||||
|
if (!this.timer || tmo) {
|
||||||
|
if (!tmo) {
|
||||||
|
tmo = 1;
|
||||||
|
}
|
||||||
|
this.timer = setTimeout(function(demo) {
|
||||||
|
return function() {
|
||||||
|
demo.demo();
|
||||||
|
};
|
||||||
|
}(this), tmo);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Demo.prototype.demo = function() {
|
||||||
|
var done = false;
|
||||||
|
while (!done) {
|
||||||
|
var state = this.state;
|
||||||
|
this.state = 0 /* STATE_IDLE */;
|
||||||
|
switch (state) {
|
||||||
|
case 1 /* STATE_INIT */:
|
||||||
|
this.doInit();
|
||||||
|
break;
|
||||||
|
case 2 /* STATE_PROMPT */:
|
||||||
|
this.doPrompt();
|
||||||
|
break;
|
||||||
|
case 3 /* STATE_READLINE */:
|
||||||
|
this.doReadLine();
|
||||||
|
if (this.state == 3 /* STATE_READLINE */) {
|
||||||
|
done = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 4 /* STATE_COMMAND */:
|
||||||
|
this.doCommand();
|
||||||
|
break;
|
||||||
|
case 5 /* STATE_EVAL */:
|
||||||
|
this.doEval();
|
||||||
|
break;
|
||||||
|
case 6 /* STATE_RUN */:
|
||||||
|
this.doRun();
|
||||||
|
break;
|
||||||
|
case 7 /* STATE_EXEC */:
|
||||||
|
if (this.doExec()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 0 /* STATE_IDLE */:
|
||||||
|
default:
|
||||||
|
done = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.timer = undefined;
|
||||||
|
};
|
||||||
|
|
||||||
|
Demo.prototype.error = function(msg) {
|
||||||
|
if (msg == undefined) {
|
||||||
|
msg = 'Syntax Error';
|
||||||
|
}
|
||||||
|
this.vt100('\u0007? ' + msg + '\r\n');
|
||||||
|
this.gotoState(2 /* STATE_PROMPT */);
|
||||||
|
};
|
||||||
|
|
||||||
|
Demo.prototype.doInit = function() {
|
||||||
|
this.program = new Array();
|
||||||
|
this.vt100(
|
||||||
|
'\u001Bc\u001B[34;4m' +
|
||||||
|
'ShellInABox Demo Script\u001B[24;31m\r\n' +
|
||||||
|
'\r\n' +
|
||||||
|
'Copyright 2009 by Markus Gutschke <markus@shellinabox.com>\u001B[0m\r\n' +
|
||||||
|
'\r\n' +
|
||||||
|
'\r\n' +
|
||||||
|
'This script simulates a minimal BASIC interpreter, allowing you to\r\n' +
|
||||||
|
'experiment with the JavaScript terminal emulator that is part of\r\n' +
|
||||||
|
'the ShellInABox project.\r\n' +
|
||||||
|
'\r\n' +
|
||||||
|
'Type HELP for a list of commands.\r\n' +
|
||||||
|
'\r\n');
|
||||||
|
this.gotoState(2 /* STATE_PROMPT */);
|
||||||
|
};
|
||||||
|
|
||||||
|
Demo.prototype.doPrompt = function() {
|
||||||
|
this.keys = '';
|
||||||
|
this.line = '';
|
||||||
|
this.currentLineIndex = -1;
|
||||||
|
this.vt100('> ');
|
||||||
|
this.gotoState(3 /* STATE_READLINE */);
|
||||||
|
};
|
||||||
|
|
||||||
|
Demo.prototype.doReadLine = function() {
|
||||||
|
this.gotoState(3 /* STATE_READLINE */);
|
||||||
|
var keys = this.keys;
|
||||||
|
this.keys = '';
|
||||||
|
for (var i = 0; i < keys.length; i++) {
|
||||||
|
var ch = keys.charAt(i);
|
||||||
|
if (ch >= ' ' && ch < '\u007F' || ch > '\u00A0') {
|
||||||
|
this.line += ch;
|
||||||
|
this.vt100(ch);
|
||||||
|
} else if (ch == '\r' || ch == '\n') {
|
||||||
|
this.vt100('\r\n');
|
||||||
|
this.gotoState(4 /* STATE_COMMAND */);
|
||||||
|
} else if (ch == '\u0008' || ch == '\u007F') {
|
||||||
|
if (this.line.length > 0) {
|
||||||
|
this.line = this.line.substr(0, this.line.length - 1);
|
||||||
|
if (this.cursorX == 0) {
|
||||||
|
var x = this.terminalWidth - 1;
|
||||||
|
var y = this.cursorY - 1;
|
||||||
|
this.gotoXY(x, y);
|
||||||
|
this.vt100(' ');
|
||||||
|
this.gotoXY(x, y);
|
||||||
|
} else {
|
||||||
|
this.vt100('\u0008 \u0008');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.vt100('\u0007');
|
||||||
|
}
|
||||||
|
} else if (ch == '\u001B') {
|
||||||
|
// This was probably a function key. Just eat all of the following keys.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Demo.prototype.doCommand = function() {
|
||||||
|
this.gotoState(2 /* STATE_PROMPT */);
|
||||||
|
var tokens = new Tokens(this.line);
|
||||||
|
this.line = '';
|
||||||
|
var cmd = tokens.nextToken().toUpperCase();
|
||||||
|
if (cmd.match(/^[0-9]+$/)) {
|
||||||
|
tokens.removeLineNumber();
|
||||||
|
var lineNumber = parseInt(cmd);
|
||||||
|
var index = this.findLine(lineNumber);
|
||||||
|
if (tokens.nextToken() == undefined) {
|
||||||
|
if (index > 0) {
|
||||||
|
// Delete line from program
|
||||||
|
this.program.splice(index, 1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (index >= 0) {
|
||||||
|
// Replace line in program
|
||||||
|
this.program[index].setTokens(tokens);
|
||||||
|
} else {
|
||||||
|
// Add new line to program
|
||||||
|
this.program.splice(-index - 1, 0, new Line(lineNumber, tokens));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.currentLineIndex = -1;
|
||||||
|
this.tokens = tokens;
|
||||||
|
this.gotoState(5 /* STATE_EVAL */);
|
||||||
|
}
|
||||||
|
tokens.reset();
|
||||||
|
};
|
||||||
|
|
||||||
|
Demo.prototype.doEval = function() {
|
||||||
|
this.gotoState(2 /* STATE_PROMPT */);
|
||||||
|
var cmd = this.tokens.nextToken().toUpperCase();
|
||||||
|
if (cmd == "HELP") {
|
||||||
|
this.vt100('Supported commands:\r\n' +
|
||||||
|
' HELP LIST RUN\r\n');
|
||||||
|
} else if (cmd == "LIST") {
|
||||||
|
if (this.tokens.nextToken() != undefined) {
|
||||||
|
this.error();
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
for (var i = 0; i < this.program.length; i++) {
|
||||||
|
var line = this.program[i];
|
||||||
|
this.vt100('' + line.lineNumber());
|
||||||
|
line.tokens().reset();
|
||||||
|
for (var token; (token = line.tokens().nextToken()) != undefined; ) {
|
||||||
|
this.vt100(' ' + token);
|
||||||
|
}
|
||||||
|
line.tokens().reset();
|
||||||
|
this.vt100('\r\n');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (cmd == "RUN") {
|
||||||
|
if (this.tokens.nextToken() != undefined) {
|
||||||
|
this.error();
|
||||||
|
} else {
|
||||||
|
this.gotoState(6 /* STATE_RUN */);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
this.error();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
Demo.prototype.doRun = function() {
|
||||||
|
if (this.program.length > 0) {
|
||||||
|
this.currentLineIndex = 0;
|
||||||
|
this.gotoState(7 /* STATE_EXEC */);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Demo.prototype.doExec = function() {
|
||||||
|
this.tokens = this.program[this.currentLineIndex++].tokens();
|
||||||
|
this.tokens.reset();
|
||||||
|
if (this.doEval()) {
|
||||||
|
if (this.currentLineIndex >= this.program.length) {
|
||||||
|
this.gotoState(2 /* STATE_PROMPT */);
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
this.gotoState(7 /* STATE_EXEC */, 20);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Demo.prototype.findLine = function(lineNumber) {
|
||||||
|
var l = 0;
|
||||||
|
var h = this.program.length;
|
||||||
|
while (h > l) {
|
||||||
|
var m = Math.floor((l + h) / 2);
|
||||||
|
var n = this.program[m].lineNumber();
|
||||||
|
if (n == lineNumber) {
|
||||||
|
return m;
|
||||||
|
} else if (n > lineNumber) {
|
||||||
|
h = m;
|
||||||
|
} else {
|
||||||
|
l = m + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -l - 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
function Tokens(line) {
|
||||||
|
this.tokens = line.split(' ');
|
||||||
|
this.index = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
Tokens.prototype.nextToken = function() {
|
||||||
|
while (this.index < this.tokens.length) {
|
||||||
|
var token = this.tokens[this.index++];
|
||||||
|
token = token.replace(/^[ \t]*/, '');
|
||||||
|
token = token.replace(/[ \t]*$/, '');
|
||||||
|
if (token.length) {
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
};
|
||||||
|
|
||||||
|
Tokens.prototype.removeLineNumber = function() {
|
||||||
|
if (this.tokens.length > 0) {
|
||||||
|
this.tokens.splice(0, 1);
|
||||||
|
if (this.index > 0) {
|
||||||
|
this.index--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Tokens.prototype.reset = function() {
|
||||||
|
this.index = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
function Line(lineNumber, tokens) {
|
||||||
|
this.lineNumber_ = lineNumber;
|
||||||
|
this.tokens_ = tokens;
|
||||||
|
};
|
||||||
|
|
||||||
|
Line.prototype.lineNumber = function() {
|
||||||
|
return this.lineNumber_;
|
||||||
|
};
|
||||||
|
|
||||||
|
Line.prototype.tokens = function() {
|
||||||
|
return this.tokens_;
|
||||||
|
};
|
||||||
|
|
||||||
|
Line.prototype.setTokens = function(tokens) {
|
||||||
|
this.tokens_ = tokens;
|
||||||
|
};
|
||||||
|
|
||||||
|
Line.prototype.sort = function(a, b) {
|
||||||
|
return a.lineNumber_ - b.lineNumber_;
|
||||||
|
};
|
371
demo/demo.jspp
Normal file
371
demo/demo.jspp
Normal file
|
@ -0,0 +1,371 @@
|
||||||
|
// Demo.js -- Demonstrate some of the features of ShellInABox
|
||||||
|
// Copyright (C) 2008-2009 Markus Gutschke <markus@shellinabox.com>
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License version 2 as
|
||||||
|
// published by the Free Software Foundation.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License along
|
||||||
|
// with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
//
|
||||||
|
// In addition to these license terms, the author grants the following
|
||||||
|
// additional rights:
|
||||||
|
//
|
||||||
|
// If you modify this program, or any covered work, by linking or
|
||||||
|
// combining it with the OpenSSL project's OpenSSL library (or a
|
||||||
|
// modified version of that library), containing parts covered by the
|
||||||
|
// terms of the OpenSSL or SSLeay licenses, the author
|
||||||
|
// grants you additional permission to convey the resulting work.
|
||||||
|
// Corresponding Source for a non-source form of such a combination
|
||||||
|
// shall include the source code for the parts of OpenSSL used as well
|
||||||
|
// as that of the covered work.
|
||||||
|
//
|
||||||
|
// You may at your option choose to remove this additional permission from
|
||||||
|
// the work, or from any part of it.
|
||||||
|
//
|
||||||
|
// It is possible to build this program in a way that it loads OpenSSL
|
||||||
|
// libraries at run-time. If doing so, the following notices are required
|
||||||
|
// by the OpenSSL and SSLeay licenses:
|
||||||
|
//
|
||||||
|
// This product includes software developed by the OpenSSL Project
|
||||||
|
// for use in the OpenSSL Toolkit. (http://www.openssl.org/)
|
||||||
|
//
|
||||||
|
// This product includes cryptographic software written by Eric Young
|
||||||
|
// (eay@cryptsoft.com)
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// The most up-to-date version of this program is always available from
|
||||||
|
// http://shellinabox.com
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Notes:
|
||||||
|
//
|
||||||
|
// The author believes that for the purposes of this license, you meet the
|
||||||
|
// requirements for publishing the source code, if your web server publishes
|
||||||
|
// the source in unmodified form (i.e. with licensing information, comments,
|
||||||
|
// formatting, and identifier names intact). If there are technical reasons
|
||||||
|
// that require you to make changes to the source code when serving the
|
||||||
|
// JavaScript (e.g to remove pre-processor directives from the source), these
|
||||||
|
// changes should be done in a reversible fashion.
|
||||||
|
//
|
||||||
|
// The author does not consider websites that reference this script in
|
||||||
|
// unmodified form, and web servers that serve this script in unmodified form
|
||||||
|
// to be derived works. As such, they are believed to be outside of the
|
||||||
|
// scope of this license and not subject to the rights or restrictions of the
|
||||||
|
// GNU General Public License.
|
||||||
|
//
|
||||||
|
// If in doubt, consult a legal professional familiar with the laws that
|
||||||
|
// apply in your country.
|
||||||
|
|
||||||
|
#define STATE_IDLE 0
|
||||||
|
#define STATE_INIT 1
|
||||||
|
#define STATE_PROMPT 2
|
||||||
|
#define STATE_READLINE 3
|
||||||
|
#define STATE_COMMAND 4
|
||||||
|
#define STATE_EVAL 5
|
||||||
|
#define STATE_RUN 6
|
||||||
|
#define STATE_EXEC 7
|
||||||
|
|
||||||
|
function extend(subClass, baseClass) {
|
||||||
|
function inheritance() { }
|
||||||
|
inheritance.prototype = baseClass.prototype;
|
||||||
|
subClass.prototype = new inheritance();
|
||||||
|
subClass.prototype.constructor = subClass;
|
||||||
|
subClass.prototype.superClass = baseClass.prototype;
|
||||||
|
};
|
||||||
|
|
||||||
|
function Demo(container) {
|
||||||
|
this.superClass.constructor.call(this, container);
|
||||||
|
this.gotoState(STATE_INIT);
|
||||||
|
};
|
||||||
|
extend(Demo, VT100);
|
||||||
|
|
||||||
|
Demo.prototype.keysPressed = function(ch) {
|
||||||
|
this.keys += ch;
|
||||||
|
this.gotoState(this.state);
|
||||||
|
};
|
||||||
|
|
||||||
|
Demo.prototype.gotoState = function(state, tmo) {
|
||||||
|
this.state = state;
|
||||||
|
if (!this.timer || tmo) {
|
||||||
|
if (!tmo) {
|
||||||
|
tmo = 1;
|
||||||
|
}
|
||||||
|
this.timer = setTimeout(function(demo) {
|
||||||
|
return function() {
|
||||||
|
demo.demo();
|
||||||
|
};
|
||||||
|
}(this), tmo);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Demo.prototype.demo = function() {
|
||||||
|
var done = false;
|
||||||
|
while (!done) {
|
||||||
|
var state = this.state;
|
||||||
|
this.state = STATE_IDLE;
|
||||||
|
switch (state) {
|
||||||
|
case STATE_INIT:
|
||||||
|
this.doInit();
|
||||||
|
break;
|
||||||
|
case STATE_PROMPT:
|
||||||
|
this.doPrompt();
|
||||||
|
break;
|
||||||
|
case STATE_READLINE:
|
||||||
|
this.doReadLine();
|
||||||
|
if (this.state == STATE_READLINE) {
|
||||||
|
done = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case STATE_COMMAND:
|
||||||
|
this.doCommand();
|
||||||
|
break;
|
||||||
|
case STATE_EVAL:
|
||||||
|
this.doEval();
|
||||||
|
break;
|
||||||
|
case STATE_RUN:
|
||||||
|
this.doRun();
|
||||||
|
break;
|
||||||
|
case STATE_EXEC:
|
||||||
|
if (this.doExec()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case STATE_IDLE:
|
||||||
|
default:
|
||||||
|
done = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.timer = undefined;
|
||||||
|
};
|
||||||
|
|
||||||
|
Demo.prototype.error = function(msg) {
|
||||||
|
if (msg == undefined) {
|
||||||
|
msg = 'Syntax Error';
|
||||||
|
}
|
||||||
|
this.vt100('\u0007? ' + msg + '\r\n');
|
||||||
|
this.gotoState(STATE_PROMPT);
|
||||||
|
};
|
||||||
|
|
||||||
|
Demo.prototype.doInit = function() {
|
||||||
|
this.program = new Array();
|
||||||
|
this.vt100(
|
||||||
|
'\u001Bc\u001B[34;4m' +
|
||||||
|
'ShellInABox Demo Script\u001B[24;31m\r\n' +
|
||||||
|
'\r\n' +
|
||||||
|
'Copyright 2009 by Markus Gutschke <markus@shellinabox.com>\u001B[0m\r\n' +
|
||||||
|
'\r\n' +
|
||||||
|
'\r\n' +
|
||||||
|
'This script simulates a minimal BASIC interpreter, allowing you to\r\n' +
|
||||||
|
'experiment with the JavaScript terminal emulator that is part of\r\n' +
|
||||||
|
'the ShellInABox project.\r\n' +
|
||||||
|
'\r\n' +
|
||||||
|
'Type HELP for a list of commands.\r\n' +
|
||||||
|
'\r\n');
|
||||||
|
this.gotoState(STATE_PROMPT);
|
||||||
|
};
|
||||||
|
|
||||||
|
Demo.prototype.doPrompt = function() {
|
||||||
|
this.keys = '';
|
||||||
|
this.line = '';
|
||||||
|
this.currentLineIndex = -1;
|
||||||
|
this.vt100('> ');
|
||||||
|
this.gotoState(STATE_READLINE);
|
||||||
|
};
|
||||||
|
|
||||||
|
Demo.prototype.doReadLine = function() {
|
||||||
|
this.gotoState(STATE_READLINE);
|
||||||
|
var keys = this.keys;
|
||||||
|
this.keys = '';
|
||||||
|
for (var i = 0; i < keys.length; i++) {
|
||||||
|
var ch = keys.charAt(i);
|
||||||
|
if (ch >= ' ' && ch < '\u007F' || ch > '\u00A0') {
|
||||||
|
this.line += ch;
|
||||||
|
this.vt100(ch);
|
||||||
|
} else if (ch == '\r' || ch == '\n') {
|
||||||
|
this.vt100('\r\n');
|
||||||
|
this.gotoState(STATE_COMMAND);
|
||||||
|
} else if (ch == '\u0008' || ch == '\u007F') {
|
||||||
|
if (this.line.length > 0) {
|
||||||
|
this.line = this.line.substr(0, this.line.length - 1);
|
||||||
|
if (this.cursorX == 0) {
|
||||||
|
var x = this.terminalWidth - 1;
|
||||||
|
var y = this.cursorY - 1;
|
||||||
|
this.gotoXY(x, y);
|
||||||
|
this.vt100(' ');
|
||||||
|
this.gotoXY(x, y);
|
||||||
|
} else {
|
||||||
|
this.vt100('\u0008 \u0008');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.vt100('\u0007');
|
||||||
|
}
|
||||||
|
} else if (ch == '\u001B') {
|
||||||
|
// This was probably a function key. Just eat all of the following keys.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Demo.prototype.doCommand = function() {
|
||||||
|
this.gotoState(STATE_PROMPT);
|
||||||
|
var tokens = new Tokens(this.line);
|
||||||
|
this.line = '';
|
||||||
|
var cmd = tokens.nextToken().toUpperCase();
|
||||||
|
if (cmd.match(/^[0-9]+$/)) {
|
||||||
|
tokens.removeLineNumber();
|
||||||
|
var lineNumber = parseInt(cmd);
|
||||||
|
var index = this.findLine(lineNumber);
|
||||||
|
if (tokens.nextToken() == undefined) {
|
||||||
|
if (index > 0) {
|
||||||
|
// Delete line from program
|
||||||
|
this.program.splice(index, 1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (index >= 0) {
|
||||||
|
// Replace line in program
|
||||||
|
this.program[index].setTokens(tokens);
|
||||||
|
} else {
|
||||||
|
// Add new line to program
|
||||||
|
this.program.splice(-index - 1, 0, new Line(lineNumber, tokens));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.currentLineIndex = -1;
|
||||||
|
this.tokens = tokens;
|
||||||
|
this.gotoState(STATE_EVAL);
|
||||||
|
}
|
||||||
|
tokens.reset();
|
||||||
|
};
|
||||||
|
|
||||||
|
Demo.prototype.doEval = function() {
|
||||||
|
this.gotoState(STATE_PROMPT);
|
||||||
|
var cmd = this.tokens.nextToken().toUpperCase();
|
||||||
|
if (cmd == "HELP") {
|
||||||
|
this.vt100('Supported commands:\r\n' +
|
||||||
|
' HELP LIST RUN\r\n');
|
||||||
|
} else if (cmd == "LIST") {
|
||||||
|
if (this.tokens.nextToken() != undefined) {
|
||||||
|
this.error();
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
for (var i = 0; i < this.program.length; i++) {
|
||||||
|
var line = this.program[i];
|
||||||
|
this.vt100('' + line.lineNumber());
|
||||||
|
line.tokens().reset();
|
||||||
|
for (var token; (token = line.tokens().nextToken()) != undefined; ) {
|
||||||
|
this.vt100(' ' + token);
|
||||||
|
}
|
||||||
|
line.tokens().reset();
|
||||||
|
this.vt100('\r\n');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (cmd == "RUN") {
|
||||||
|
if (this.tokens.nextToken() != undefined) {
|
||||||
|
this.error();
|
||||||
|
} else {
|
||||||
|
this.gotoState(STATE_RUN);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
this.error();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
Demo.prototype.doRun = function() {
|
||||||
|
if (this.program.length > 0) {
|
||||||
|
this.currentLineIndex = 0;
|
||||||
|
this.gotoState(STATE_EXEC);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Demo.prototype.doExec = function() {
|
||||||
|
this.tokens = this.program[this.currentLineIndex++].tokens();
|
||||||
|
this.tokens.reset();
|
||||||
|
if (this.doEval()) {
|
||||||
|
if (this.currentLineIndex >= this.program.length) {
|
||||||
|
this.gotoState(STATE_PROMPT);
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
this.gotoState(STATE_EXEC, 20);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Demo.prototype.findLine = function(lineNumber) {
|
||||||
|
var l = 0;
|
||||||
|
var h = this.program.length;
|
||||||
|
while (h > l) {
|
||||||
|
var m = Math.floor((l + h) / 2);
|
||||||
|
var n = this.program[m].lineNumber();
|
||||||
|
if (n == lineNumber) {
|
||||||
|
return m;
|
||||||
|
} else if (n > lineNumber) {
|
||||||
|
h = m;
|
||||||
|
} else {
|
||||||
|
l = m + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -l - 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
function Tokens(line) {
|
||||||
|
this.tokens = line.split(' ');
|
||||||
|
this.index = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
Tokens.prototype.nextToken = function() {
|
||||||
|
while (this.index < this.tokens.length) {
|
||||||
|
var token = this.tokens[this.index++];
|
||||||
|
token = token.replace(/^[ \t]*/, '');
|
||||||
|
token = token.replace(/[ \t]*$/, '');
|
||||||
|
if (token.length) {
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
};
|
||||||
|
|
||||||
|
Tokens.prototype.removeLineNumber = function() {
|
||||||
|
if (this.tokens.length > 0) {
|
||||||
|
this.tokens.splice(0, 1);
|
||||||
|
if (this.index > 0) {
|
||||||
|
this.index--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Tokens.prototype.reset = function() {
|
||||||
|
this.index = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
function Line(lineNumber, tokens) {
|
||||||
|
this.lineNumber_ = lineNumber;
|
||||||
|
this.tokens_ = tokens;
|
||||||
|
};
|
||||||
|
|
||||||
|
Line.prototype.lineNumber = function() {
|
||||||
|
return this.lineNumber_;
|
||||||
|
};
|
||||||
|
|
||||||
|
Line.prototype.tokens = function() {
|
||||||
|
return this.tokens_;
|
||||||
|
};
|
||||||
|
|
||||||
|
Line.prototype.setTokens = function(tokens) {
|
||||||
|
this.tokens_ = tokens;
|
||||||
|
};
|
||||||
|
|
||||||
|
Line.prototype.sort = function(a, b) {
|
||||||
|
return a.lineNumber_ - b.lineNumber_;
|
||||||
|
};
|
1
demo/favicon.ico
Symbolic link
1
demo/favicon.ico
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../shellinabox/favicon.ico
|
1
demo/styles.css
Symbolic link
1
demo/styles.css
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../shellinabox/styles.css
|
1
demo/vt100.js
Symbolic link
1
demo/vt100.js
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../shellinabox/vt100.js
|
|
@ -46,6 +46,9 @@
|
||||||
#define _GNU_SOURCE
|
#define _GNU_SOURCE
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
#define pthread_once x_pthread_once
|
||||||
|
#define pthread_sigmask x_pthread_sigmask
|
||||||
|
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
@ -61,6 +64,9 @@
|
||||||
#include "libhttp/httpconnection.h"
|
#include "libhttp/httpconnection.h"
|
||||||
#include "logging/logging.h"
|
#include "logging/logging.h"
|
||||||
|
|
||||||
|
#undef pthread_once
|
||||||
|
#undef pthread_sigmask
|
||||||
|
|
||||||
#if defined(HAVE_OPENSSL) && !defined(OPENSSL_NO_TLSEXT) && \
|
#if defined(HAVE_OPENSSL) && !defined(OPENSSL_NO_TLSEXT) && \
|
||||||
defined(TLSEXT_NAMETYPE_host_name) && defined(SSL_TLSEXT_ERR_OK)
|
defined(TLSEXT_NAMETYPE_host_name) && defined(SSL_TLSEXT_ERR_OK)
|
||||||
#define HAVE_TLSEXT
|
#define HAVE_TLSEXT
|
||||||
|
@ -683,8 +689,11 @@ void sslBlockSigPipe(void) {
|
||||||
sigset_t set;
|
sigset_t set;
|
||||||
sigemptyset(&set);
|
sigemptyset(&set);
|
||||||
sigaddset(&set, SIGPIPE);
|
sigaddset(&set, SIGPIPE);
|
||||||
dcheck(!(&pthread_sigmask ? pthread_sigmask : sigprocmask)
|
if (&pthread_sigmask) {
|
||||||
(SIG_BLOCK, &set, NULL));
|
dcheck(!pthread_sigmask(SIG_BLOCK, &set, NULL));
|
||||||
|
} else {
|
||||||
|
dcheck(!sigprocmask(SIG_BLOCK, &set, NULL));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int sslUnblockSigPipe(void) {
|
int sslUnblockSigPipe(void) {
|
||||||
|
@ -696,8 +705,11 @@ int sslUnblockSigPipe(void) {
|
||||||
}
|
}
|
||||||
sigemptyset(&set);
|
sigemptyset(&set);
|
||||||
sigaddset(&set, SIGPIPE);
|
sigaddset(&set, SIGPIPE);
|
||||||
check(!(&pthread_sigmask ? pthread_sigmask : sigprocmask)
|
if (&pthread_sigmask) {
|
||||||
(SIG_UNBLOCK, &set, NULL));
|
dcheck(!pthread_sigmask(SIG_UNBLOCK, &set, NULL));
|
||||||
|
} else {
|
||||||
|
dcheck(!sigprocmask(SIG_UNBLOCK, &set, NULL));
|
||||||
|
}
|
||||||
return signum;
|
return signum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,6 +46,8 @@
|
||||||
#define _GNU_SOURCE
|
#define _GNU_SOURCE
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
#define pthread_once x_pthread_once
|
||||||
|
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
@ -91,17 +93,19 @@ struct pam_conv;
|
||||||
typedef struct pam_handle pam_handle_t;
|
typedef struct pam_handle pam_handle_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(HAVE_PTHREAD_H) && defined(__linux__)
|
|
||||||
#include <pthread.h>
|
|
||||||
extern int pthread_once(pthread_once_t *, void (*)(void))__attribute__((weak));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "shellinabox/launcher.h"
|
#include "shellinabox/launcher.h"
|
||||||
#include "shellinabox/privileges.h"
|
#include "shellinabox/privileges.h"
|
||||||
#include "shellinabox/service.h"
|
#include "shellinabox/service.h"
|
||||||
#include "libhttp/hashmap.h"
|
#include "libhttp/hashmap.h"
|
||||||
#include "logging/logging.h"
|
#include "logging/logging.h"
|
||||||
|
|
||||||
|
#undef pthread_once
|
||||||
|
|
||||||
|
#if defined(HAVE_PTHREAD_H) && defined(__linux__)
|
||||||
|
#include <pthread.h>
|
||||||
|
extern int pthread_once(pthread_once_t *, void (*)(void))__attribute__((weak));
|
||||||
|
#endif
|
||||||
|
|
||||||
// If PAM support is available, take advantage of it. Otherwise, silently fall
|
// If PAM support is available, take advantage of it. Otherwise, silently fall
|
||||||
// back on legacy operations for session management.
|
// back on legacy operations for session management.
|
||||||
#if defined(HAVE_SECURITY_PAM_APPL_H) && defined(HAVE_DLOPEN)
|
#if defined(HAVE_SECURITY_PAM_APPL_H) && defined(HAVE_DLOPEN)
|
||||||
|
|
Loading…
Reference in a new issue