summaryrefslogtreecommitdiff
path: root/ACE/apps/JAWS/clients/WebSTONE/bin/webstone-gui.pl
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/apps/JAWS/clients/WebSTONE/bin/webstone-gui.pl')
-rwxr-xr-xACE/apps/JAWS/clients/WebSTONE/bin/webstone-gui.pl318
1 files changed, 318 insertions, 0 deletions
diff --git a/ACE/apps/JAWS/clients/WebSTONE/bin/webstone-gui.pl b/ACE/apps/JAWS/clients/WebSTONE/bin/webstone-gui.pl
new file mode 100755
index 00000000000..cb0c7224c09
--- /dev/null
+++ b/ACE/apps/JAWS/clients/WebSTONE/bin/webstone-gui.pl
@@ -0,0 +1,318 @@
+#!/pkg/gnu/bin//perl5
+#
+#$Id$
+
+require 'conf/paths.pl';
+
+#$debug = 1;
+$HELPME="http://reality.sgi.com/employees/mblakele_engr/WebStone/";
+$| = 1; # set pipes to hot
+
+&html();
+
+sub html {
+ local($helper, $wd);
+
+ &start_html_server();
+ # These strings are used in, among others, PERL-to-HTML scripts.
+ #
+ $wd = `pwd`;
+ chop $wd;
+
+ print "$html_port\n" if $debug;
+
+ $HTML_STARTPAGE = "http://localhost:$html_port$wd/doc/WebStone.html";
+
+ #
+ # Fork off the HTML client, and fork off a server process that
+ # handles requests from that client. The parent process waits
+ # until the client exits and terminates the server.
+ #
+ print "Starting $MOSAIC...\n" if $debug;
+
+ if (($client = fork()) == 0) {
+ foreach (keys %ENV) {
+ delete $ENV{$_} if (/proxy/i && !/no_proxy/i);
+ }
+ exec($MOSAIC, "$HTML_STARTPAGE")
+ || die "cannot exec $MOSAIC: $!";
+ }
+
+ if (($server = fork()) == 0) {
+ if (($helper = fork()) == 0) {
+ alarm 3600;
+ &patience();
+ }
+ kill 'TERM',$helper;
+ $SIG{'PIPE'} = 'IGNORE';
+ for (;;) {
+ accept(CLIENT, SOCK) || die "accept: $!";
+ select((select(CLIENT), $| = 1)[0]);
+ &process_html_request();
+ close(CLIENT);
+ }
+ }
+
+ #
+ # Wait until the client terminates, then terminate the server.
+ #
+ close(SOCK);
+ waitpid($client, 0);
+ kill('TERM', $server);
+ exit;
+}
+
+#
+# Set up a listener on an arbitrary port. There is no good reason to
+# listen on a well-known port number.
+#
+sub start_html_server {
+ local($sockaddr, $proto, $junk);
+
+ $AF_INET = 2;
+ $SOCK_STREAM = 2;
+ $PORT = 0; #1024;
+
+ $sockaddr = 'S n a4 x8';
+ $this = pack($sockaddr, $AF_INET, $PORT, "\0\0\0\0");
+ ($junk, $junk, $proto) = getprotobyname('tcp');
+ socket(SOCK, $AF_INET, $SOCK_STREAM, $proto) || die "socket: $!";
+ setsockopt(SOCK, 0xffff, 0x0004, 1) || die "setsockopt: $!";
+ bind(SOCK, $this) || die "bind: $!";
+ listen(SOCK, 1) || die "listen: $!";
+ ($junk, $html_port) = unpack($sockaddr, getsockname(SOCK));
+}
+
+
+#
+# Process one client request. We expect the client to send stuff that
+# begins with:
+#
+# command /password/perl_script junk
+#
+# Where perl_script is the name of a perl file that is executed via
+# do "perl_script";
+#
+# In case of a POST command the values in the client's attribute-value
+# list are assigned to the corresponding global PERL variables.
+#
+sub process_html_request {
+ local($request, $command, $script, $magic, $url, $peer);
+ local(%args);
+
+ #
+ # Parse the command and URL. Update the default file prefix.
+ #
+ $request = <CLIENT>;
+ print $request if $debug;
+ ($command, $url) = split(/\s+/, $request);
+ if ($command eq "" || $command eq "QUIT") {
+ return;
+ }
+
+ #($junk, $script) = split(/\//, $url, 2);
+ #($script, $html_script_args) = split(',', $script, 2);
+ #($HTML_CWD = "file:$script") =~ s/\/[^\/]*$//;
+ $script = $url;
+
+ while (<CLIENT>) {
+ last if (/^\s+$/);
+ }
+
+ if ($command eq "GET") {
+ if (-d $script) {
+ get_dir($script);
+ }
+ elsif ($script =~ /\.pl\b/) {
+ perl_html_script($script);
+ }
+ else {
+ get_file($script);
+ }
+ } elsif ($command eq "POST") {
+
+ print $request if $debug;
+ flush;
+ #
+ # Process the attribute-value list.
+ #
+ if ($_ = <CLIENT>) {
+ print "Hi $_" if $debug;
+ flush;
+ s/\s+$//;
+ s/^/\n/;
+ s/&/\n/g;
+ $html_post_attributes = '';
+ $* = 1;
+ for (split(/(%[0-9][0-9A-Z])/, $_)) {
+ $html_post_attributes .= (/%([0-9][0-9A-Z])/) ?
+ pack('c',hex($1)) : $_;
+ }
+ %args = ('_junk_', split(/\n([^=]+)=/, $html_post_attributes));
+ delete $args{'_junk_'};
+ for (keys %args) {
+ print "\$$_ = $args{$_}\n" if $debug;
+ ${$_} = $args{$_};
+ }
+ perl_html_script($script);
+ } else {
+ &bad_html_form($script);
+ }
+ } else {
+ &bad_html_command($request);
+ }
+}
+
+
+#
+# Unexpected HTML command.
+#
+sub bad_html_command {
+ local($request) = @_;
+
+ print CLIENT <<EOF
+<HTML>
+<HEAD>
+<TITLE>Unknown command</TITLE>
+<LINK REV="made" HREF=$HELPME>
+</HEAD>
+<BODY>
+<H1>Unknown command</H1>
+The command <TT>$request<TT> was not recognized.
+</BODY>
+</HTML>
+EOF
+;
+}
+
+#
+# Execute PERL script
+#
+sub perl_html_script {
+ local($script) = @_;
+
+ if (! -e $script) {
+ print CLIENT <<EOF
+<HTML>
+<HEAD>
+<TITLE>File not found</TITLE>
+<LINK REV="made" HREF=$HELPME>
+</HEAD>
+<BODY>
+<H1>File not found</H1>
+The file <TT>$script</TT> does not exist or is not accessible.
+</BODY>
+</HTML>
+EOF
+; return;
+ }
+ do $script;
+ if ($@ && ($@ ne "\n")) {
+ print CLIENT <<EOF
+<HTML>
+<HEAD>
+<TITLE>Command failed</TITLE>
+<LINK REV="made" HREF=$HELPME>
+</HEAD>
+<BODY>
+<H1>Command failed</H1>
+$@
+</BODY>
+</HTML>
+EOF
+;
+ }
+}
+
+#
+# Missing attribute list
+#
+sub bad_html_form {
+ local($script) = @_;
+
+ print CLIENT <<EOF
+<HTML>
+<HEAD>
+<TITLE>No attribute list</TITLE>
+<LINK REV="made" HREF=$HELPME>
+</HEAD>
+<BODY>
+<H1>No attribute list</H1>
+
+No attribute list was found.
+</BODY>
+</HTML>
+EOF
+;
+}
+
+#
+# Give them something to read while the server is initializing.
+#
+sub patience {
+ for (;;) {
+ accept(CLIENT, SOCK) || die "accept: $!";
+ <CLIENT>;
+ print CLIENT <<EOF
+<HTML>
+<HEAD>
+<TITLE>Initializing...</TITLE>
+<LINK REV="made" HREF=$HELPME>
+</HEAD>
+<BODY>
+<H1>Initializing...</H1>
+WebStone is initializing...
+</BODY>
+</HTML>
+EOF
+;
+ close(CLIENT);
+ }
+}
+
+sub get_file {
+ local($file) = @_;
+
+ print CLIENT <<EOF
+<HTML>
+<HEAD>
+<TITLE>$file</TITLE>
+</HEAD>
+<H1>$file</H1>
+<BODY><PRE>
+EOF
+ unless ($file =~ /(html|htm|gif|jpeg|jpg)\b/);
+
+ open(FILE, $file);
+ while (<FILE>) {
+ print CLIENT $_;
+ }
+ close(FILE);
+
+ print CLIENT <<EOF
+</PRE>
+</HTML>
+EOF
+ unless ($file =~ /(html|htm|gif|jpeg|jpg)\b/);
+}
+
+sub get_dir {
+ local($dir) = @_;
+ opendir(DIRECTORY, $dir);
+ @listing = readdir(DIRECTORY);
+ closedir(DIRECTORY);
+ print CLIENT <<EOF
+<HTML>
+<HEAD>
+<TITLE>$dir</TITLE>
+</HEAD>
+<H1>$dir</H1>
+<BODY>
+EOF
+ ;
+
+ while (<@listing>) {
+ print CLIENT "<P><A HREF=$dir/$_>$_</A>";
+ }
+ print CLIENT "</HTML>";
+}