# undef I_SYS_UN
#endif
-#ifdef USE_5005THREADS
+#ifdef USE_ITHREADS
#define do_spawn(a) os2_do_spawn(aTHX_ (a))
#define do_aspawn(a,b,c) os2_do_aspawn(aTHX_ (a),(b),(c))
# define pthread_getspecific(k) (*(k))
# define pthread_setspecific(k,v) (*(k)=(v),0)
# define pthread_key_create(keyp,flag) \
- ( DosAllocThreadLocalMemory(1,(U32*)keyp) \
+ ( DosAllocThreadLocalMemory(1,(unsigned long**)keyp) \
? Perl_croak_nocontext("LocalMemory"),1 \
: 0 \
)
#define THREADS_ELSEWHERE
-#else /* USE_5005THREADS */
+#else /* USE_ITHREADS */
#define do_spawn(a) os2_do_spawn(a)
#define do_aspawn(a,b,c) os2_do_aspawn((a),(b),(c))
-
-#endif /* USE_5005THREADS */
void Perl_OS2_init(char **);
void Perl_OS2_init3(char **envp, void **excH, int flags);
# define PERL_SYS_INIT3(argcp, argvp, envp) \
{ void *xreg[2]; \
+ MALLOC_CHECK_TAINT(*argcp, *argvp, *envp) \
_response(argcp, argvp); \
_wildcard(argcp, argvp); \
Perl_OS2_init3(*envp, xreg, 0)
#endif
#define TMPPATH1 "plXXXXXX"
-extern char *tmppath;
+extern const char *tmppath;
PerlIO *my_syspopen(pTHX_ char *cmd, char *mode);
/* Cannot prototype with I32 at this point. */
int my_syspclose(PerlIO *f);
void my_endpwent (void);
char *gcvt_os2(double value, int digits, char *buffer);
+#define MAX_SLEEP (((1<30) / (1000/4))-1) /* 1<32 msec */
+
+static __inline__ unsigned
+my_sleep(unsigned sec)
+{
+ int remain;
+ while (sec > MAX_SLEEP) {
+ sec -= MAX_SLEEP;
+ remain = sleep(MAX_SLEEP);
+ if (remain)
+ return remain + sec;
+ }
+ return sleep(sec);
+}
+
+#define sleep my_sleep
+
+#ifndef INCL_DOS
+unsigned long DosSleep(unsigned long);
+unsigned long DosAllocThreadLocalMemory (unsigned long cb, unsigned long **p);
+#endif
+
struct group *getgrent (void);
void setgrent (void);
void endgrent (void);
#define strtoll _strtoll
#define strtoull _strtoull
+#define usleep(usec) ((void)_sleep2(((usec)+500)/1000))
+
+
/*
* 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
#include <stdlib.h> /* before the following definitions */
#include <unistd.h> /* before the following definitions */
+#include <fcntl.h>
+#include <sys/stat.h>
#define chdir _chdir2
#define getcwd _getcwd2
#define PERLIO_IS_BINMODE_FD(fd) _PERLIO_IS_BINMODE_FD(fd)
+#ifdef __GNUG__
+# define HAS_BOOL
+#endif
+#ifndef HAS_BOOL
+# define bool char
+# define HAS_BOOL 1
+#endif
+
+#include <emx/io.h> /* for _fd_flags() prototype */
+
static inline bool
_PERLIO_IS_BINMODE_FD(int fd)
{
#if OS2_STAT_HACK
#define Stat(fname,bufptr) os2_stat((fname),(bufptr))
-#define Fstat(fd,bufptr) fstat((fd),(bufptr))
+#define Fstat(fd,bufptr) os2_fstat((fd),(bufptr))
#define Fflush(fp) fflush(fp)
#define Mkdir(path,mode) mkdir((path),(mode))
+#define chmod(path,mode) os2_chmod((path),(mode))
#undef S_IFBLK
#undef S_ISBLK
-#define S_IFBLK 0120000
+#define S_IFBLK 0120000 /* Hacks to make things compile... */
#define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK)
+int os2_chmod(const char *name, int pmode);
+int os2_fstat(int handle, struct stat *st);
+
#else
#define Stat(fname,bufptr) stat((fname),(bufptr))
unsigned long phmq_refcnt;
unsigned long phmq_servers;
unsigned long initial_mode; /* VIO etc. mode we were started in */
+ unsigned long morph_refcnt;
} OS2_Perl_data_t;
extern OS2_Perl_data_t OS2_Perl_data;
#define Perl_hmq_refcnt (OS2_Perl_data.phmq_refcnt)
#define Perl_hmq_servers (OS2_Perl_data.phmq_servers)
#define Perl_os2_initial_mode (OS2_Perl_data.initial_mode)
+#define Perl_morph_refcnt (OS2_Perl_data.morph_refcnt)
unsigned long Perl_hab_GET();
unsigned long Perl_Register_MQ(int serve);
ORD_WinQueryDesktopWindow,
ORD_WinSetActiveWindow,
ORD_DosQueryModFromEIP,
+ ORD_Dos32QueryHeaderInfo,
+ ORD_DosTmrQueryFreq,
+ ORD_DosTmrQueryTime,
+ ORD_WinQueryActiveDesktopPathname,
+ ORD_WinInvalidateRect,
+ ORD_WinCreateFrameControls,
+ ORD_WinQueryClipbrdFmtInfo,
+ ORD_WinQueryClipbrdOwner,
+ ORD_WinQueryClipbrdViewer,
+ ORD_WinQueryClipbrdData,
+ ORD_WinOpenClipbrd,
+ ORD_WinCloseClipbrd,
+ ORD_WinSetClipbrdData,
+ ORD_WinSetClipbrdOwner,
+ ORD_WinSetClipbrdViewer,
+ ORD_WinEnumClipbrdFmts,
+ ORD_WinEmptyClipbrd,
+ ORD_WinAddAtom,
+ ORD_WinFindAtom,
+ ORD_WinDeleteAtom,
+ ORD_WinQueryAtomUsage,
+ ORD_WinQueryAtomName,
+ ORD_WinQueryAtomLength,
+ ORD_WinQuerySystemAtomTable,
+ ORD_WinCreateAtomTable,
+ ORD_WinDestroyAtomTable,
+ ORD_WinOpenWindowDC,
+ ORD_DevOpenDC,
+ ORD_DevQueryCaps,
+ ORD_DevCloseDC,
+ ORD_WinMessageBox,
+ ORD_WinMessageBox2,
+ ORD_WinQuerySysValue,
+ ORD_WinSetSysValue,
+ ORD_WinAlarm,
+ ORD_WinFlashWindow,
+ ORD_WinLoadPointer,
+ ORD_WinQuerySysPointer,
ORD_NENTRIES
};
#define PERLLIB_MANGLE(s, n) perllib_mangle((s), (n))
char *perllib_mangle(char *, unsigned int);
+#define fork fork_with_resources
+
+#ifdef EINTR /* x2p do not include perl.h!!! */
+static __inline__ int
+my_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)
+{
+ if (nfds == 0 && timeout && (_emx_env & 0x200)) {
+ if (DosSleep(1000 * timeout->tv_sec + (timeout->tv_usec + 500)/1000) == 0)
+ return 0;
+ errno = EINTR;
+ return -1;
+ }
+ return select(nfds, readfds, writefds, exceptfds, timeout);
+}
+
+#define select my_select
+#endif
+
+
typedef int (*Perl_PFN)();
Perl_PFN loadByOrdinal(enum entries_ordinals ord, int fail);
extern const Perl_PFN * const pExtFCN;
char *os2error(int rc);
int os2_stat(const char *name, struct stat *st);
+int fork_with_resources();
int setpriority(int which, int pid, int val);
int getpriority(int which /* ignored */, int pid);
+void croak_with_os2error(char *s) __attribute__((noreturn));
+
#ifdef PERL_CORE
int os2_do_spawn(pTHX_ char *cmd);
-int os2_do_aspawn(pTHX_ SV *really, void **vmark, void **vsp);
+int os2_do_aspawn(pTHX_ SV *really, SV **vmark, SV **vsp);
#endif
#ifndef LOG_DAEMON