#!/usr/bin/perl -w { $name = $0; $version = "1.2 9 Jul 2003"; # 9 Jul 2003 v 1.2 WJS # Add time stamp to error msgs. Merge program variants (dates/version # numbers show independent development lines) # 1.1 mod: # a) Use $0 instead of hard-coded name. Whatever # file is named will be program name # b) Could not find 8081 in program anyplace. ?? # 1.01 mod: /usr/local/bin works on both boxes # [Begin v 1.2] # 31 Jan 2000 v 1.1 CLH # need to use from 8081 for testing superobjects # v 1.1 only renames method (jgofsread) and # changes hardcoding to 8081 port # 28 Jun 2000 v 1.01 RCG/WJS Change location for perl compiler # 25 Jan 2000 v 1.0 WJS # [Begin v 1.0] require "ctime.pl"; $FALSE = 0; $TRUE = ( ! $FALSE); $INPUT_open = $FALSE; # Must accept > 1 arg - could get selections/projections, which we ignore ($data_file = shift) || &bad_out("input file name missing"); $! = 0; $? = 0; open (INPUT,"$data_file") || &bad_io_out("Could not open input"); $INPUT_open = $TRUE; # jdb routines want Content-type lines... so they can be skipped # As of jdb 1.1, lines are just skipped, so they can be anything. However, # let's put in Content-type lines if they are missing defined($line = ) || &bad_io_out("Read error or empty input file"); if ($line =~ /^Content-type:/) { (print $line) || &bad_out ("Write error. err msg/number: $!"); defined($line = ) || ($line = ""); ( $line =~ /^\s+$/ ) || &bad_out("Bad format? " . "Line after 'Content-type:' should be empty\n" . " Line: $line"); (print $line) || &bad_out ("Write error. err msg/number: $!"); defined($line = ) || ($line = ""); } else { (print "Content-type: text/plain\n\n") || &bad_out ("Write error. err msg/number: $!"); } # Format check. Also serves as crude security check in that only files # this "copier" will read start with &v0 ( $line =~ /^&(v0|c)\n$/ ) || &bad_out("Bad format. " . "First data line must be &v0 or &c\n" . " Line: $line"); (print $line) || &bad_out ("Write error. err msg/number: $!"); # Copy input to stdout while (defined($line = )) { (print $line) || &bad_out ("Write error. err msg/number: $!"); } ($! || $?) && &bad_io_out("Read error."); exit; } sub bad_io_out # Also "normal" way out if EOF... maybe { # Explicitly close input in an attempt to get a $? status if input happens # to be a pipe... # We're really doing a unix "wait" call... or at least, that's my # intention! Seems weird to do a close if the open did not succeed! # Not sure what it would mean if close itself failed... selfishly, it # wouldn't affect this program. my $save_status = $!; close INPUT; $INPUT_open = $FALSE; $! = $save_status; chomp $_[$#_]; &bad_out("@_\n" . " I/O status: $save_status\n" . " Input source: $data_file\n" . " Child process status(if appropriate): $?" ); } sub bad_out { chomp $_[$#_]; if ($cleanup_msg = &cleanup) { chomp $cleanup_msg; push (@_,"\n",$cleanup_msg); } $text = "&x $name: @_\nThis message issued " . &ctime(time) . "$name version $version\n"; print $text; die $text; } sub cleanup { if ($INPUT_open) { close INPUT; $INPUT_open = $FALSE; ($! || $?) && return "Problems closing input\n" . " I/O status: $!\n" . " Input source: $data_file\n" . " Child process status (if appropriate): $?" ; } return ""; }