]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Patch #708495: Port more stuff to OpenVMS.
authorMartin v. Löwis <martin@v.loewis.de>
Sat, 3 May 2003 09:14:54 +0000 (09:14 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Sat, 3 May 2003 09:14:54 +0000 (09:14 +0000)
Modules/bz2module.c
Modules/fcntlmodule.c
Modules/fpectlmodule.c
Modules/grpmodule.c
Modules/mmapmodule.c
Modules/posixmodule.c
Modules/socketmodule.c
Modules/socketmodule.h
Parser/myreadline.c
Python/dynload_shlib.c
Python/sysmodule.c

index 9289a02b238dde08c4cbb290666833fae842c885..83582bd937452daaff8d2afff0121f62d14d0feb 100644 (file)
@@ -1309,7 +1309,9 @@ BZ2File_init(BZ2FileObject *self, PyObject *args, PyObject *kwargs)
                                break;
 
                        case 'U':
+#ifdef WITH_UNIVERSAL_NEWLINES
                                self->f_univ_newline = 1;
+#endif
                                break;
 
                        default:
index c495a77319ade1200c2d899a41f4f96defe256b5..969505755c8c641ff3eddc30860baf7f4057f489 100644 (file)
@@ -182,7 +182,11 @@ fcntl_ioctl(PyObject *self, PyObject *args)
          return NULL;
        }
        Py_BEGIN_ALLOW_THREADS
+#ifdef __VMS
+       ret = ioctl(fd, code, (void *)arg);
+#else
        ret = ioctl(fd, code, arg);
+#endif
        Py_END_ALLOW_THREADS
        if (ret < 0) {
                PyErr_SetFromErrno(PyExc_IOError);
index 099cda02caae252bf06273efa16d278e4f3932a1..241c1c2620fd0f44e7953d3caa8cdbc83c935a91 100644 (file)
@@ -188,6 +188,10 @@ static void fpe_reset(Sigfunc *handler)
     ieee_set_fp_control(fp_control);
     PyOS_setsig(SIGFPE, handler);
 
+/*-- DEC ALPHA VMS --------------------------------------------------------*/
+#elif defined(__ALPHA) && defined(__VMS)
+    PyOS_setsig(SIGFPE, handler);
+
 /*-- Cray Unicos ----------------------------------------------------------*/
 #elif defined(cray)
     /* UNICOS delivers SIGFPE by default, but no matherr */
index 2882fabd13308f8eb01bccaf19da22ae87cca51a..ab9d3c5edd8cd02325edffcd27732df16f7eab58 100644 (file)
@@ -58,12 +58,17 @@ mkgrent(struct group *p)
 
 #define SET(i,val) PyStructSequence_SET_ITEM(v, i, val)
     SET(setIndex++, PyString_FromString(p->gr_name));
+#ifdef __VMS
+    SET(setIndex++, Py_None);
+    Py_INCREF(Py_None);
+#else
     if (p->gr_passwd)
            SET(setIndex++, PyString_FromString(p->gr_passwd));
     else {
            SET(setIndex++, Py_None);
            Py_INCREF(Py_None);
     }
+#endif
     SET(setIndex++, PyInt_FromLong((long) p->gr_gid));
     SET(setIndex++, w);
 #undef SET
index c2c723c302cb52c769b4acd56704eabf2444b5e9..56033e8d4e88c222d6c0d9f0a67e78c9f0615891 100644 (file)
@@ -897,6 +897,10 @@ new_mmap_object(PyObject *self, PyObject *args, PyObject *kwdict)
        }
 
 #ifdef HAVE_FSTAT
+#  ifdef __VMS
+       /* on OpenVMS we must ensure that all bytes are written to the file */
+       fsync(fd);
+#  endif
        if (fstat(fd, &st) == 0 && (size_t)map_size > st.st_size) {
                PyErr_SetString(PyExc_ValueError, 
                                "mmap length is greater than file size");
index 035bb3657eb54751e3ef7e5d7df17e03f33ea152..ff81585af86f731b50888c346ca28f87a27a5a17 100644 (file)
 #include "structseq.h"
 
 #if defined(__VMS)
-#    include <ctype.h>                 /* tolower() */
-#    include <descrip.h>               /* string descriptors */
-#    include <dvidef.h>                        /* DVI$_name */
-#    include <file.h>                  /* -> O_RDWR */
-#    include <jpidef.h>                        /* JPI$_name */
-#    include <lib$routines.h>          /* LIB$name */
-#    include <ots$routines.h>          /* OTS$name */
-#    include <ssdef.h>                 /* SS$_name */
 #    include <unixio.h>
-#    include <unixlib.h>
-#    include <stat.h>
-#    include <wait.h>                  /* define wait() */
 #endif /* defined(__VMS) */
 
 PyDoc_STRVAR(posix__doc__,
@@ -325,63 +314,6 @@ static char **environ;
 extern char **environ;
 #endif /* !_MSC_VER */
 
-#if defined(__VMS)
-/* add some values to provide a similar environment like POSIX */
-static
-void
-vms_add_posix_env(PyObject *d)
-{
-       PyObject *o;
-       char* str;
-
-       str = getenv("LINES");
-       o = Py_BuildValue("s", str);
-       if (o != NULL) {
-               (void)PyDict_SetItemString(d, "LINES", o);
-               Py_DECREF(o);
-       }
-
-       str = getenv("COLUMNS");
-       o = Py_BuildValue("s", str);
-       if (o != NULL) {
-               (void)PyDict_SetItemString(d, "COLUMNS", o);
-               Py_DECREF(o);
-       }
-
-       str = getenv("USER");
-       o = Py_BuildValue("s", str);
-       if (o != NULL) {
-               (void)PyDict_SetItemString(d, "USERNAME", o);
-               Py_DECREF(o);
-       }
-       o = Py_BuildValue("s", str);
-       if (o != NULL) {
-               (void)PyDict_SetItemString(d, "LOGNAME", o);
-               Py_DECREF(o);
-       }
-
-       str = getenv("HOME");
-       o = Py_BuildValue("s", str);
-       if (o != NULL) {
-               (void)PyDict_SetItemString(d, "HOME", o);
-               Py_DECREF(o);
-       }
-
-       str = getenv("PATH");
-       o = Py_BuildValue("s", str);
-       if (o != NULL) {
-               (void)PyDict_SetItemString(d, "PATH", o);
-               Py_DECREF(o);
-       }
-       /* OS = "OpenVMS" */
-       o = PyString_FromString ("OpenVMS");
-       if (o != NULL) {
-               (void)PyDict_SetItemString(d, "OS", o);
-               Py_DECREF(o);
-       }
-}
-#endif /* __VMS */
-
 static PyObject *
 convertenviron(void)
 {
@@ -421,9 +353,7 @@ convertenviron(void)
                Py_DECREF(k);
                Py_DECREF(v);
        }
-#if defined(__VMS)
-        vms_add_posix_env(d);
-#elif defined(PYOS_OS2)
+#if defined(PYOS_OS2)
     {
         APIRET rc;
         char   buffer[1024]; /* OS/2 Provides a Documented Max of 1024 Chars */
@@ -1133,7 +1063,7 @@ posix_ttyname(PyObject *self, PyObject *args)
                return NULL;
 
 #if defined(__VMS)
-       /* DECC V5.0 - only about FD= 0 @@ try getname()+$getdvi(dvi$_devnam) */
+        /* file descriptor 0 only, the default input device (stdin) */
        if (id == 0) {
                ret = ttyname();
        }
@@ -1339,9 +1269,6 @@ posix_getcwd(PyObject *self, PyObject *noargs)
        Py_BEGIN_ALLOW_THREADS
 #if defined(PYOS_OS2) && defined(PYCC_GCC)
        res = _getcwd2(buf, sizeof buf);
-#elif defined(__VMS)
-       /* 0 = force Unix-style path if in the VMS DCL environment! */
-       res = getcwd(buf, sizeof buf, 0);
 #else
        res = getcwd(buf, sizeof buf);
 #endif
@@ -1378,9 +1305,6 @@ posix_getcwdu(PyObject *self, PyObject *noargs)
        Py_BEGIN_ALLOW_THREADS
 #if defined(PYOS_OS2) && defined(PYCC_GCC)
        res = _getcwd2(buf, sizeof buf);
-#elif defined(__VMS)
-       /* 0 = force Unix-style path if in the VMS DCL environment! */
-       res = getcwd(buf, sizeof buf, 0);
 #else
        res = getcwd(buf, sizeof buf);
 #endif
@@ -5183,11 +5107,7 @@ posix_pipe(PyObject *self, PyObject *noargs)
        int fds[2];
        int res;
        Py_BEGIN_ALLOW_THREADS
-#if defined(__VMS)
-       res = pipe(fds,0,2100); /* bigger mailbox quota than 512 */
-#else
        res = pipe(fds);
-#endif
        Py_END_ALLOW_THREADS
        if (res != 0)
                return posix_error();
index 843c5a968763112aaf31f64e2731bc6a836c9806..f107e0b14fcefc079a2105151fe6e4bb37d225c7 100644 (file)
@@ -2199,7 +2199,11 @@ static PyObject *
 socket_gethostbyname(PyObject *self, PyObject *args)
 {
        char *name;
+#ifdef ENABLE_IPV6
        struct sockaddr_storage addrbuf;
+#else
+        struct sockaddr_in addrbuf;
+#endif
 
        if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
                return NULL;
@@ -2357,7 +2361,11 @@ socket_gethostbyname_ex(PyObject *self, PyObject *args)
 {
        char *name;
        struct hostent *h;
-       struct sockaddr_storage addr;
+#ifdef ENABLE_IPV6
+        struct sockaddr_storage addr;
+#else
+        struct sockaddr_in addr;
+#endif
        struct sockaddr *sa;
        PyObject *ret;
 #ifdef HAVE_GETHOSTBYNAME_R
index 936acac5b9d6197a9bd7c7e5b400797a6ea70998..167d50711a2f0dfbf92280b4605f5e6080315f88 100644 (file)
@@ -2,7 +2,11 @@
 
 /* Includes needed for the sockaddr_* symbols below */
 #ifndef MS_WINDOWS
-# include <sys/socket.h>
+#ifdef __VMS
+#   include <socket.h>
+# else
+#   include <sys/socket.h>
+# endif
 # include <netinet/in.h>
 # if !(defined(__BEOS__) || defined(__CYGWIN__) || (defined(PYOS_OS2) && defined(PYCC_VACPP)))
 #  include <netinet/tcp.h>
index 7b7ef7e2042e00b4f4f82b376b4bf186589cf583..fcc4667d7f64ffcb495b3d98e9d66fa8573b4ccc 100644 (file)
 #include "windows.h"
 #endif /* MS_WINDOWS */
 
+#ifdef __VMS
+extern char* vms__StdioReadline(FILE *sys_stdin, FILE *sys_stdout, char *prompt);
+#endif
+
 int (*PyOS_InputHook)(void) = NULL;
 
 #ifdef RISCOS
@@ -159,7 +163,11 @@ PyOS_Readline(FILE *sys_stdin, FILE *sys_stdout, char *prompt)
        char *rv;
 
        if (PyOS_ReadlineFunctionPointer == NULL) {
+#ifdef __VMS
+                PyOS_ReadlineFunctionPointer = vms__StdioReadline;
+#else
                 PyOS_ReadlineFunctionPointer = PyOS_StdioReadline;
+#endif
        }
 
        Py_BEGIN_ALLOW_THREADS
index 61674ba555a2575cb7d8bacdfefd54f605bb041f..af23f80a27321a678a963db2c9eb4cd61dcea93c 100644 (file)
@@ -39,17 +39,28 @@ const struct filedescr _PyImport_DynLoadFiletab[] = {
 #if defined(PYOS_OS2) && defined(PYCC_GCC)
        {".pyd", "rb", C_EXTENSION},
        {".dll", "rb", C_EXTENSION},
+#else
+#ifdef __VMS
+        {".exe", "rb", C_EXTENSION},
+        {".EXE", "rb", C_EXTENSION},
+        {"module.exe", "rb", C_EXTENSION},
+        {"MODULE.EXE", "rb", C_EXTENSION},
 #else
        {".so", "rb", C_EXTENSION},
        {"module.so", "rb", C_EXTENSION},
 #endif
+#endif
 #endif
        {0, 0}
 };
 
 static struct {
        dev_t dev;
+#ifdef __VMS
+       ino_t ino[3];
+#else
        ino_t ino;
+#endif
        void *handle;
 } handles[128];
 static int nhandles = 0;
@@ -87,7 +98,13 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
                }
                if (nhandles < 128) {
                        handles[nhandles].dev = statb.st_dev;
+#ifdef __VMS
+                       handles[nhandles].ino[0] = statb.st_ino[0];
+                       handles[nhandles].ino[1] = statb.st_ino[1];
+                       handles[nhandles].ino[2] = statb.st_ino[2];
+#else
                        handles[nhandles].ino = statb.st_ino;
+#endif
                }
        }
 
@@ -98,6 +115,17 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
        if (Py_VerboseFlag)
                printf("dlopen(\"%s\", %x);\n", pathname, dlopenflags);
 
+#ifdef __VMS
+       /* VMS currently don't allow a pathname, use a logical name instead */
+       /* Concatenate 'python_module_' and shortname */
+       /* so "import vms.bar" will use the logical python_module_bar */
+       /* As C module use only one name space this is probably not a */
+       /* important limitation */
+       PyOS_snprintf(pathbuf, sizeof(pathbuf), "python_module_%-.200s", 
+                     shortname);
+       pathname = pathbuf;
+#endif
+
        handle = dlopen(pathname, dlopenflags);
 
        if (handle == NULL) {
index 50b99127a014cf33a667d5ae39d9f9a09717de0c..d06d18a98b40fe48409ebe198dacc5536e128679 100644 (file)
@@ -32,6 +32,10 @@ extern void *PyWin_DLLhModule;
 extern const char *PyWin_DLLVersionString;
 #endif
 
+#ifdef __VMS
+#include <unixlib.h>
+#endif
+
 PyObject *
 PySys_GetObject(char *name)
 {
@@ -1050,7 +1054,22 @@ makeargvobject(int argc, char **argv)
        if (av != NULL) {
                int i;
                for (i = 0; i < argc; i++) {
+#ifdef __VMS
+                       PyObject *v;
+
+                       /* argv[0] is the script pathname if known */
+                       if (i == 0) {
+                               char* fn = decc$translate_vms(argv[0]);
+                               if ((fn == (char *)0) || fn == (char *)-1)
+                                       v = PyString_FromString(argv[0]);
+                               else
+                                       v = PyString_FromString(
+                                               decc$translate_vms(argv[0]));
+                       } else
+                               v = PyString_FromString(argv[i]);
+#else
                        PyObject *v = PyString_FromString(argv[i]);
+#endif
                        if (v == NULL) {
                                Py_DECREF(av);
                                av = NULL;