Perl apology -- and enhancement

Victor Gavin vic at zen.UUCP
Thu Apr 28 00:31:23 AEST 1988


I said:

> Can anyone fill me in on the current status of perl as we still haven't got it
> working.

> We are running an HP9000 model 840 with HPUX 1.2, perl is at patchlevel 29.

I now say:

Sorry folks, I f***ed up (horrific sounds of programmer hitting himself).
I though I had it all re-compiled and linked -- I hadn't.

After fixing the problem that stopped it from linking (HPUX doesn't have the
functions set[er][gu]id()) the tests ran perfectly -- except for failing
symlink(), which is present in release 2.0 of HPUX for the series 800.

Whilst I'm here, for anyone that's interested, here's some code that will fix
(system "/bin/sh -c 'exit 1'") so that it returns 1 and not 256:

....................... cut along the dotted line ..............................
*** arg.c.orig	Wed Apr 27 14:50:31 1988
--- arg.c	Sat Apr 16 09:18:34 1988
***************
*** 2180,2185
  		;
  	    if (maxarg == -1)
  		argflags = -1;
  	    signal(SIGINT, ihand);
  	    signal(SIGQUIT, qhand);
  	    statusvalue = argflags;

--- 2180,2211 -----
  		;
  	    if (maxarg == -1)
  		argflags = -1;
+ #ifdef	hpux
+ 	    /* the return value from this command is not the same as that
+ 	     * produced by shell, in particular
+ 	     *		system("/bin/sh -c 'exit 1'") returns 256 not 1
+ 	     *
+ 	     * HPUX return three different values through the parameter to
+ 	     * wait() -- taken as a 16 bit integer.
+ 	     *
+ 	     *	1.  If lower 8 bits are FF then process stopped and
+ 	     *	    reason is in upper 8 bits.
+ 	     *
+ 	     *	2.  If lower 8 bits are 00 then process exit()'ed and
+ 	     *	    status is in upper 8 bits.
+ 	     *
+ 	     *	3.  If upper 8 bits are 00 then process was hit by signal
+ 	     *	    which is in lower 8 bits.
+ 	     *
+ 	     */
+ 	    else if ( !(argflags & (int)0xFF) )
+ 	    {
+ 	      /* the program terminated so transpose the 8 bits to get the
+ 	       * status
+ 	       */
+ 	      argflags = ((argflags>>8)&0xFF) | ((argflags&0xFF)<<8);
+ 	    }
+ #endif
  	    signal(SIGINT, ihand);
  	    signal(SIGQUIT, qhand);
  	    statusvalue = argflags;
................................................................................



--
Victor Gavin                         vic at zen.co.uk || ..!mcvax!ukc!zen.co.uk!vic
Computer Psychoanalyst               Zengrange Limited, Leeds LS9 8DB, England



More information about the Comp.sources.bugs mailing list