t/op/magic.t on FreeBSD
[p5sagit/p5-mst-13.2.git] / t / op / magic.t
index 28e66d9..f55630a 100755 (executable)
@@ -292,15 +292,28 @@ else {
             my $mydollarzero = sub {
               my($arg) = shift;
               $0 = $arg if defined $arg;
-              my $ps = `ps -o command= -p $$`;
+             # In FreeBSD the ps -o command= will cause
+             # an empty header line, grab only the last line.
+              my $ps = (`ps -o command= -p $$`)[-1];
               return if $?;
               chomp $ps;
               printf "# 0[%s]ps[%s]\n", $0, $ps;
               $ps;
             };
             my $ps = $mydollarzero->("x");
-            ok(!$ps ||   # we allow that something goes wrong with the ps command
-               $ps eq "x", 'altering $0 is effective (testing with `ps`)');
+            ok(!$ps  # we allow that something goes wrong with the ps command
+              # In Linux 2.4 we would get an exact match ($ps eq 'x') but
+              # in Linux 2.2 there seems to be something funny going on:
+              # it seems as if the original length of the argv[] would
+              # be stored in the proc struct and then used by ps(1),
+              # no matter what characters we use to pad the argv[].
+              # (And if we use \0:s, they are shown as spaces.)  Sigh.
+               || $ps =~ /^x\s*$/
+              # FreeBSD cannot get rid of both the leading "perl :"
+              # and the trailing " (perl)": some FreeBSD versions
+              # can get rid of the first one.
+              || ($^O eq 'freebsd' && $ps =~ m/^(?:perl: )?x(?: \(perl\))?$/),
+                      'altering $0 is effective (testing with `ps`)');
        } else {
            skip("\$0 check only on Linux and FreeBSD") for 0, 1;
        }