applied patch, with indentation tweaks
[p5sagit/p5-mst-13.2.git] / win32 / runperl.c
index cfa195d..17d2ac2 100644 (file)
@@ -23,6 +23,12 @@ CPerlObj *pPerl;
 #include <ipproc.h>
 #include <ipstdio.h>
 
+#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);
 extern struct direct *g_readdir(DIR *dirp);
@@ -35,15 +41,15 @@ public:
     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)
     {
@@ -72,7 +78,7 @@ public:
 };
 
 
-extern char * g_win32_get_stdlib(char *pl);
+extern char * g_win32_get_privlib(char *pl);
 extern char * g_win32_get_sitelib(char *pl);
 class CPerlEnv : public IPerlEnv
 {
@@ -88,7 +94,7 @@ public:
     };
     virtual char* LibPath(char *pl)
     {
-       return g_win32_get_stdlib(pl);
+       return g_win32_get_privlib(pl);
     };
     virtual char* SiteLibPath(char *pl)
     {
@@ -243,14 +249,14 @@ public:
        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)
@@ -309,6 +315,16 @@ public:
         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;
+    };
 };
 
 
@@ -579,10 +595,8 @@ public:
     };
     virtual PerlIO* Popen(const char *command, const char *mode)
     {
-#ifdef __BORLANDC__
        win32_fflush(stdout);
        win32_fflush(stderr);
-#endif
        return (PerlIO*)win32_popen(command, mode);
     };
     virtual int Pclose(PerlIO *stream)
@@ -724,6 +738,13 @@ public:
        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)
     {
        CALLFUNCERR(win32_fputc(c, (FILE*)pf))
@@ -905,11 +926,10 @@ public:
     };
     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)
        {
@@ -921,6 +941,7 @@ public:
            win32_fprintf(stderr, "Error: Parse exception\n");
            retVal = -1;
        }
+       *win32_errno() = 0;
        return retVal;
     };
     inline int PerlRun(void)
@@ -977,7 +998,7 @@ main(int argc, char **argv, char **env)
        exit(exitstatus);
 
 
-    exitstatus = host.PerlParse(argc, argv, env);
+    exitstatus = host.PerlParse(argc, argv, NULL);
 
     if (!exitstatus)
     {
@@ -1006,7 +1027,6 @@ xs_init(CPERLarg)
 
 #else  /* PERL_OBJECT */
 
-/* Say NO to CPP! Hallelujah! */
 #ifdef __GNUC__
 /*
  * GNU C does not do __declspec()