📄 webstone-gui.pl
字号:
#!/pkg/gnu/bin//perl5##$Id: webstone-gui.pl 32986 2000-06-04 22:02:08Z brunsch $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>";}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -