*** e:/perl5.002b3/doio.c	Sat Feb 03 01:49:30 1996
--- perl5/doio.c	Tue Feb 20 15:49:36 1996
***************
*** 942,947 ****
--- 942,949 ----
      }
  }
  
+ #ifndef OS2
+ 
  bool
  do_exec(cmd)
  char *cmd;
***************
*** 1030,1035 ****
--- 1032,1039 ----
      do_execfree();
      return FALSE;
  }
+ 
+ #endif
  
  I32
  apply(type,mark,sp)
*** e:/perl5.002b3/ext/DynaLoader/dl_os2.xs	Tue Nov 14 04:58:42 1995
--- perl5/ext/DynaLoader/dl_os2.xs	Tue Feb 20 17:58:38 1996
***************
*** 28,34 ****
  		return (void *)handle;
  
  	/* Not found. Check for non-FAT name and try truncated name. */
- 	/* Don't know if this helps though... */
  	for (beg = dot = path + strlen(path);
  	     beg > path && !strchr(":/\\", *(beg-1));
  	     beg--)
--- 28,33 ----
***************
*** 162,167 ****
--- 161,167 ----
  char *
  mod2fname(sv)
       SV   *sv;
+ 
  
  
  # These functions should not need changing on any platform:
*** e:/perl5.002b3/ext/DynaLoader/DynaLoader.pm	Thu Feb 01 19:00:30 1996
--- perl5/ext/DynaLoader/DynaLoader.pm	Tue Feb 20 18:48:00 1996
***************
*** 468,473 ****
--- 468,474 ----
      Linux: dld_create_reference(@dl_require_symbols); dld_link($filename)
      NeXT:  rld_load($filename, @dl_resolve_using)
      VMS:   lib$find_image_symbol($filename,$dl_require_symbols[0])
+     OS/2:  DosLoadModule(,,$filename,)
  
  
  =item dl_find_symbol()
***************
*** 490,495 ****
--- 491,497 ----
      Linux: dld_get_func($symbol) and/or dld_get_symbol($symbol)
      NeXT:  rld_lookup("_$symbol")
      VMS:   lib$find_image_symbol($libref,$symbol)
+     OS/2:  DosQueryProcAddr($libref,0,$symbol,)
  
  
  =item dl_undef_symbols()
*** e:/perl5.002b3/os2/os2.c	Sun Dec 24 19:43:02 1995
--- perl5/os2/os2.c	Mon Feb 26 02:46:30 1996
***************
*** 40,59 ****
  	int r, status;
  	Signal_t (*ihand)();     /* place to save signal during system() */
  	Signal_t (*qhand)();     /* place to save signal during system() */
  
! 	if (pid < 0 || flag != 0)
  		return pid;
  
  	ihand = signal(SIGINT, SIG_IGN);
  	qhand = signal(SIGQUIT, SIG_IGN);
  	r = waitpid(pid, &status, 0);
  	signal(SIGINT, ihand);
  	signal(SIGQUIT, qhand);
- 
  	statusvalue = (U16)status;
  	if (r < 0)
  		return -1;
  	return status & 0xFFFF;
  }
  
  int
--- 40,72 ----
  	int r, status;
  	Signal_t (*ihand)();     /* place to save signal during system() */
  	Signal_t (*qhand)();     /* place to save signal during system() */
+ #ifndef __EMX__
+ 	RESULTCODES res;
+ 	int rpid;
+ #endif
  
! 	if (pid <= 0 || (flag & 0xFF) != P_WAIT)
  		return pid;
  
+ #ifdef __EMX__
  	ihand = signal(SIGINT, SIG_IGN);
  	qhand = signal(SIGQUIT, SIG_IGN);
  	r = waitpid(pid, &status, 0);
  	signal(SIGINT, ihand);
  	signal(SIGQUIT, qhand);
  	statusvalue = (U16)status;
  	if (r < 0)
  		return -1;
  	return status & 0xFFFF;
+ #else
+ 	ihand = signal(SIGINT, SIG_IGN);
+ 	r = DosWaitChild(DCWA_PROCESS, DCWW_WAIT, &res, &rpid, pid);
+ 	signal(SIGINT, ihand);
+ 	statusvalue = res.codeResult << 8 | res.codeTerminate;
+ 	if (r)
+ 		return -1;
+ 	return statusvalue;
+ #endif
  }
  
  int
***************
*** 68,81 ****
      int flag = P_WAIT, trueflag;
  
      if (sp > mark) {
! 	New(401,Argv, sp - mark + 1, char*);
! 	a = Argv;
! 
! 	if (mark < sp && SvIOKp(*(mark+1))) {
  		++mark;
  		flag = SvIVx(*mark);
  	}
  
  	while (++mark <= sp) {
  	    if (*mark)
  		*a++ = SvPVx(*mark, na);
--- 81,94 ----
      int flag = P_WAIT, trueflag;
  
      if (sp > mark) {
! 	if (mark < sp && SvNOKp(*(mark+1))) {
  		++mark;
  		flag = SvIVx(*mark);
  	}
  
+ 	New(401,Argv, sp - mark + 1, char*);
+ 	a = Argv;
+ 
  	while (++mark <= sp) {
  	    if (*mark)
  		*a++ = SvPVx(*mark, na);
***************
*** 102,108 ****
  }
  
  int
! do_spawn(cmd)
  char *cmd;
  {
      register char **a;
--- 115,121 ----
  }
  
  int
! do_spawn2(cmd, execf)
  char *cmd;
  {
      register char **a;
***************
*** 132,138 ****
  		*s = '\0';
  		break;
  	    }
! shell_cmd:  return result(P_WAIT, spawnl(P_NOWAIT,shell,shell,copt,cmd,(char*)0));
  	}
      }
      New(402,Argv, (s - cmd) / 2 + 2, char*);
--- 145,153 ----
  		*s = '\0';
  		break;
  	    }
! shell_cmd:  if (execf)
!                 return spawnl(P_OVERLAY,shell,shell,copt,cmd,(char*)0);
! 	    return result(P_WAIT, spawnl(P_WAIT,shell,shell,copt,cmd,(char*)0));
  	}
      }
      New(402,Argv, (s - cmd) / 2 + 2, char*);
***************
*** 148,154 ****
      }
      *a = Nullch;
      if (Argv[0]) {
! 	rc = result(P_WAIT, spawnvp(P_NOWAIT,Argv[0],Argv));
  	if (rc < 0 && dowarn)
  	    warn("Can't spawn \"%s\": %s", Argv[0], Strerror(errno));
      } else
--- 163,172 ----
      }
      *a = Nullch;
      if (Argv[0]) {
! 	if (execf)
! 	    rc = spawnvp(P_OVERLAY,Argv[0],Argv);
!         else
! 	    rc = result(P_WAIT, spawnvp(P_NOWAIT,Argv[0],Argv));
  	if (rc < 0 && dowarn)
  	    warn("Can't spawn \"%s\": %s", Argv[0], Strerror(errno));
      } else
***************
*** 157,162 ****
--- 175,194 ----
      return rc;
  }
  
+ int
+ do_spawn(cmd)
+ char *cmd;
+ {
+     return do_spawn2(cmd, 0);
+ }
+ 
+ bool
+ do_exec(cmd)
+ char *cmd;
+ {
+     return do_spawn2(cmd, 1);
+ }
+ 
  /*****************************************************************************/
  
  #ifndef HAS_FORK
***************
*** 170,195 ****
  #endif
  
  /*****************************************************************************/
! /* not implemented in EMX 0.9a */
  
  void *	ctermid(x)	{ return 0; }
  
! #ifdef MYTTYNAME /* was not in emx0.9a */
! void *	ttyname(x)	{ return 0; }
! #endif
  
! void *	gethostent()	{ return 0; }
! void *	getnetent()	{ return 0; }
! void *	getprotoent()	{ return 0; }
! void *	getservent()	{ return 0; }
! void	sethostent(x)	{}
! void	setnetent(x)	{}
! void	setprotoent(x)	{}
! void	setservent(x)	{}
! void	endhostent(x)	{}
! void	endnetent(x)	{}
! void	endprotoent(x)	{}
! void	endservent(x)	{}
  
  /*****************************************************************************/
  /* stat() hack for char/block device */
--- 202,274 ----
  #endif
  
  /*****************************************************************************/
! /* missing in malloc.c */
! 
! void *
! calloc(size_t n, size_t s)
! {
!     void *p;
! 
!     n *= s;
!     p = malloc(n);
!     if (p)
! 	memset(p, 0, n);
!     return p;
! }
! 
! /*****************************************************************************/
! /* not implemented in EMX 0.9b */
  
  void *	ctermid(x)	{ return 0; }
  
! /*****************************************************************************/
! /* my socket forwarders - EMX lib only provides static forwarders */
! 
! static HMODULE htcp = 0;
  
! static void *
! tcp0(char *name)
! {
!     static BYTE buf[20];
!     PFN fcn;
!     if (!htcp)
! 	DosLoadModule(buf, sizeof buf, "tcp32dll", &htcp);
!     if (htcp && DosQueryProcAddr(htcp, 0, name, &fcn) == 0)
! 	return (void *) ((void * (*)(void)) fcn) ();
!     return 0;
! }
! 
! static void
! tcp1(char *name, int arg)
! {
!     static BYTE buf[20];
!     PFN fcn;
!     if (!htcp)
! 	DosLoadModule(buf, sizeof buf, "tcp32dll", &htcp);
!     if (htcp && DosQueryProcAddr(htcp, 0, name, &fcn) == 0)
! 	((void (*)(int)) fcn) (arg);
! }
! 
! void *	gethostent()	{ return tcp0("GETHOSTENT");  }
! void *	getnetent()	{ return tcp0("GETNETENT");   }
! void *	getprotoent()	{ return tcp0("GETPROTOENT"); }
! void *	getservent()	{ return tcp0("GETSERVENT");  }
! void	sethostent(x)	{ tcp1("SETHOSTENT",  x); }
! void	setnetent(x)	{ tcp1("SETNETENT",   x); }
! void	setprotoent(x)	{ tcp1("SETPROTOENT", x); }
! void	setservent(x)	{ tcp1("SETSERVENT",  x); }
! void	endhostent()	{ tcp0("ENDHOSTENT");  }
! void	endnetent()	{ tcp0("ENDNETENT");   }
! void	endprotoent()	{ tcp0("ENDPROTOENT"); }
! void	endservent()	{ tcp0("ENDSERVENT");  }
! 
! /*****************************************************************************/
! /* not implemented in C Set++ */
! 
! #ifndef __EMX__
! int	setuid(x)	{ errno = EINVAL; return -1; }
! int	setgid(x)	{ errno = EINVAL; return -1; }
! #endif
  
  /*****************************************************************************/
  /* stat() hack for char/block device */
*** e:/perl5.002b3/os2/os2ish.h	Tue Feb 20 13:52:32 1996
--- perl5/os2/os2ish.h	Tue Feb 20 14:20:58 1996
***************
*** 4,10 ****
--- 4,12 ----
   *	This symbol, if defined, indicates that the ioctl() routine is
   *	available to set I/O characteristics
   */
+ #ifdef __EMX__
  #define	HAS_IOCTL		/**/
+ #endif
   
  /* HAS_UTIME:
   *	This symbol, if defined, indicates that the routine utime() is
***************
*** 12,18 ****
--- 14,22 ----
   */
  #define HAS_UTIME		/**/
  
+ #ifndef __IBMC__
  #define HAS_KILL
+ #endif
  #define HAS_WAIT
  
  #ifndef SIGABRT
***************
*** 21,27 ****
--- 25,36 ----
  #ifndef SIGILL
  #    define SIGILL 6         /* blech */
  #endif
+ 
+ #ifdef __IBMC__
+ #define ABORT() abort();
+ #else
  #define ABORT() kill(getpid(),SIGABRT);
+ #endif
  
  #define BIT_BUCKET "/dev/null"  /* Will this work? */
  
***************
*** 29,40 ****
      _response(argcp, argvp);			\
      _wildcard(argcp, argvp); } while (0)
  
- 
- #define PERL_SYS_INIT(argcp, argvp) do {	\
-     _response(argcp, argvp);			\
-     _wildcard(argcp, argvp); } while (0)
- 
- 
  /*
   * fwrite1() should be a routine with the same calling sequence as fwrite(),
   * but which outputs all of the bytes requested as a single stream (unlike
--- 38,43 ----
***************
*** 47,60 ****
  
  /*****************************************************************************/
  
  #include <stdlib.h>	/* before the following definitions */
  #include <unistd.h>	/* before the following definitions */
  
  #define chdir	_chdir2
  #define getcwd	_getcwd2
  
! /* This guy is needed for quick stdstd  */
  
  #if defined(USE_STDIO_PTR) && defined(STDIO_PTR_LVALUE) && defined(STDIO_CNT_LVALUE)
  #  define _filbuf _fill
  	/* Perl uses ungetc only with successful return */
--- 50,81 ----
  
  /*****************************************************************************/
  
+ #ifdef __EMX__
+ 
  #include <stdlib.h>	/* before the following definitions */
  #include <unistd.h>	/* before the following definitions */
  
  #define chdir	_chdir2
  #define getcwd	_getcwd2
  
! #define OS2_STAT_HACK 1
! 
! #else /* __IBMC__ */
! 
! #define __EXTENDED__
! 
! #include <fcntl.h>
! #include <io.h>
! #include <direct.h>
! #include <process.h>
! 
! #define mkdir(x,y) _mkdir(x)
  
+ #define OS2_STAT_HACK 0
+ 
+ #endif /* __IBMC__ */
+ 
+ /* This guy is needed for quick stdstd  */
  #if defined(USE_STDIO_PTR) && defined(STDIO_PTR_LVALUE) && defined(STDIO_CNT_LVALUE)
  #  define _filbuf _fill
  	/* Perl uses ungetc only with successful return */
***************
*** 65,71 ****
  
  #define OP_BINARY O_BINARY
  
! #define OS2_STAT_HACK 1
  #if OS2_STAT_HACK
  
  #define Stat(fname,bufptr) os2_stat((fname),(bufptr))
--- 86,92 ----
  
  #define OP_BINARY O_BINARY
  
! 
  #if OS2_STAT_HACK
  
  #define Stat(fname,bufptr) os2_stat((fname),(bufptr))
*** e:/perl5.002b3/perl.c	Thu Feb 01 18:40:14 1996
--- perl5/perl.c	Mon Feb 26 01:16:04 1996
***************
*** 1174,1180 ****
  #endif
  #ifdef OS2
  	fputs("OS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
! 	    "Version 5 port Copyright (c) 1994-1995, Andreas Kaiser\n", stdout);
  #endif
  #ifdef atarist
  	fputs("atariST series port, ++jrb  bammi@cadence.com\n", stdout);
--- 1174,1180 ----
  #endif
  #ifdef OS2
  	fputs("OS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
! 	    "Version 5 port Copyright (c) 1994-1996, Andreas Kaiser\n", stdout);
  #endif
  #ifdef atarist
  	fputs("atariST series port, ++jrb  bammi@cadence.com\n", stdout);
