#include "XSUB.H"
#include "Win32iop.h"
-#undef errno
-#if defined(_MT)
-_CRTIMP int * __cdecl _errno(void);
-#define errno (*_errno())
-#else
-_CRTIMP extern int errno;
-#endif
+#define errno (*win32_errno())
+#define stdout (win32_stdout())
+#define stderr (win32_stderr())
CPerlObj *pPerl;
#include <ipproc.h>
#include <ipstdio.h>
-class IPerlStdIOWin : public IPerlStdIO
-{
-public:
- virtual int OpenOSfhandle(long osfhandle, int flags) = 0;
- virtual int GetOSfhandle(int filenum) = 0;
-};
+#define CALLFUNC0RET(x)\
+ int ret = x;\
+ if(ret < 0)\
+ err = errno;\
+ return ret;
extern int g_closedir(DIR *dirp);
extern DIR *g_opendir(char *filename);
CPerlDir() {};
virtual int Makedir(const char *dirname, int mode, int &err)
{
- return win32_mkdir(dirname, mode);
+ CALLFUNC0RET(win32_mkdir(dirname, mode));
};
virtual int Chdir(const char *dirname, int &err)
{
- return win32_chdir(dirname);
+ CALLFUNC0RET(win32_chdir(dirname));
};
virtual int Rmdir(const char *dirname, int &err)
{
- return win32_rmdir(dirname);
+ CALLFUNC0RET(win32_rmdir(dirname));
};
virtual int Close(DIR *dirp, int &err)
{
};
-extern char * g_win32_perllib_path(char *sfx,...);
+extern char * g_win32_get_privlib(char *pl);
+extern char * g_win32_get_sitelib(char *pl);
class CPerlEnv : public IPerlEnv
{
public:
};
virtual int Putenv(const char *envstring, int &err)
{
- return _putenv(envstring);
+ return putenv(envstring);
};
- virtual char* LibPath(char *sfx, ...)
+ virtual char* LibPath(char *pl)
{
- LPSTR ptr1, ptr2, ptr3, ptr4, ptr5;
- va_list ap;
- va_start(ap,sfx);
- ptr1 = va_arg(ap,char *);
- ptr2 = va_arg(ap,char *);
- ptr3 = va_arg(ap,char *);
- ptr4 = va_arg(ap,char *);
- ptr5 = va_arg(ap,char *);
- return g_win32_perllib_path(sfx, ptr1, ptr2, ptr3, ptr4, ptr5);
+ return g_win32_get_privlib(pl);
+ };
+ virtual char* SiteLibPath(char *pl)
+ {
+ return g_win32_get_sitelib(pl);
};
};
char *r = win32_inet_ntoa(in);
PROCESS_AND_RETURN;
};
- virtual int IoctlSocket(SOCKET s, long cmd, u_long *argp, int& err)
+ virtual int Listen(SOCKET s, int backlog, int &err)
{
- int r = win32_ioctlsocket(s, cmd, argp);
+ int r = win32_listen(s, backlog);
PROCESS_AND_RETURN;
};
- virtual int Listen(SOCKET s, int backlog, int &err)
+ virtual int Recv(SOCKET s, char* buffer, int len, int flags, int &err)
{
- int r = win32_listen(s, backlog);
+ int r = win32_recv(s, buffer, len, flags);
PROCESS_AND_RETURN;
};
virtual int Recvfrom(SOCKET s, char* buffer, int len, int flags, struct sockaddr* from, int* fromlen, int &err)
croak("socketpair not implemented!\n");
return 0;
};
+ virtual int Closesocket(SOCKET s, int& err)
+ {
+ int r = win32_closesocket(s);
+ PROCESS_AND_RETURN;
+ };
+ virtual int Ioctlsocket(SOCKET s, long cmd, u_long *argp, int& err)
+ {
+ int r = win32_ioctlsocket(s, cmd, argp);
+ PROCESS_AND_RETURN;
+ };
};
{
CALLFUNCRET(chmod(filename, pmode))
};
+ virtual int Chown(const char *filename, uid_t owner, gid_t group, int &err)
+ {
+ CALLFUNCERR(chown(filename, owner, group))
+ };
virtual int Chsize(int handle, long size, int &err)
{
CALLFUNCRET(chsize(handle, size))
};
virtual int Unlink(const char *filename, int &err)
{
- chmod(filename, _S_IREAD | _S_IWRITE);
+ chmod(filename, S_IREAD | S_IWRITE);
CALLFUNCRET(unlink(filename))
};
virtual int Utime(char *filename, struct utimbuf *times, int &err)
};
virtual PerlIO* Popen(const char *command, const char *mode)
{
+ win32_fflush(stdout);
+ win32_fflush(stderr);
return (PerlIO*)win32_popen(command, mode);
};
virtual int Pclose(PerlIO *stream)
};
virtual int Pipe(int *phandles)
{
- return win32_pipe(phandles, 512, _O_BINARY);
+ return win32_pipe(phandles, 512, O_BINARY);
};
virtual int Setuid(uid_t u)
{
};
-class CPerlStdIO : public IPerlStdIOWin
+class CPerlStdIO : public IPerlStdIO
{
public:
CPerlStdIO() {};
};
virtual char* GetBase(PerlIO* pf, int &err)
{
- return ((FILE*)pf)->_base;
+ FILE *f = (FILE*)pf;
+ return FILE_base(f);
};
virtual int GetBufsiz(PerlIO* pf, int &err)
{
- return ((FILE*)pf)->_bufsiz;
+ FILE *f = (FILE*)pf;
+ return FILE_bufsiz(f);
};
virtual int GetCnt(PerlIO* pf, int &err)
{
- return ((FILE*)pf)->_cnt;
+ FILE *f = (FILE*)pf;
+ return FILE_cnt(f);
};
virtual char* GetPtr(PerlIO* pf, int &err)
{
- return ((FILE*)pf)->_ptr;
+ FILE *f = (FILE*)pf;
+ return FILE_ptr(f);
+ };
+ virtual char* Gets(PerlIO* pf, char* s, int n, int& err)
+ {
+ char* ret = win32_fgets(s, n, (FILE*)pf);
+ if(errno)
+ err = errno;
+ return ret;
};
virtual int Putc(PerlIO* pf, int c, int &err)
{
};
virtual void SetCnt(PerlIO* pf, int n, int &err)
{
- ((FILE*)pf)->_cnt = n;
+ FILE *f = (FILE*)pf;
+ FILE_cnt(f) = n;
};
virtual void SetPtrCnt(PerlIO* pf, char * ptr, int n, int& err)
{
- ((FILE*)pf)->_ptr = ptr;
- ((FILE*)pf)->_cnt = n;
+ FILE *f = (FILE*)pf;
+ FILE_ptr(f) = ptr;
+ FILE_cnt(f) = n;
};
virtual void Setlinebuf(PerlIO* pf, int &err)
{
static void xs_init _((CPERLarg));
-#define stderr (&_iob[2])
-#undef fprintf
-#undef environ
class CPerlHost
{
}
catch(...)
{
- fprintf(stderr, "%s\n", "Error: Unable to construct data structures");
+ win32_fprintf(stderr, "%s\n", "Error: Unable to construct data structures");
pPerl->perl_free();
pPerl = NULL;
}
}
catch(...)
{
- fprintf(stderr, "%s\n", "Error: Unable to allocate memory");
+ win32_fprintf(stderr, "%s\n", "Error: Unable to allocate memory");
pPerl = NULL;
}
return (pPerl != NULL);
};
inline int PerlParse(int argc, char** argv, char** env)
{
- char* environ = NULL;
int retVal;
try
{
- retVal = pPerl->perl_parse(xs_init, argc, argv, (env == NULL || *env == NULL ? &environ : env));
+ retVal = pPerl->perl_parse(xs_init, argc, argv, env);
}
catch(int x)
{
}
catch(...)
{
- fprintf(stderr, "Error: Parse exception\n");
+ win32_fprintf(stderr, "Error: Parse exception\n");
retVal = -1;
}
+ *win32_errno() = 0;
return retVal;
};
inline int PerlRun(void)
}
catch(...)
{
- fprintf(stderr, "Error: Runtime exception\n");
+ win32_fprintf(stderr, "Error: Runtime exception\n");
retVal = -1;
}
return retVal;
exit(exitstatus);
- exitstatus = host.PerlParse(argc, argv, env);
+ exitstatus = host.PerlParse(argc, argv, NULL);
if (!exitstatus)
{
NULL,
};
-EXTERN_C void boot_DynaLoader _((CPERLarg_ CV* cv));
+EXTERN_C void boot_DynaLoader _((CV* cv _CPERLarg));
static void
xs_init(CPERLarg)
#else /* PERL_OBJECT */
-/* Say NO to CPP! Hallelujah! */
#ifdef __GNUC__
/*
* GNU C does not do __declspec()