From c16f3bd8a391a68427a95e15a3c1894198ff0377 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Sat, 3 May 2003 09:14:54 +0000 Subject: Patch #708495: Port more stuff to OpenVMS. --- Modules/bz2module.c | 2 ++ Modules/fcntlmodule.c | 4 +++ Modules/fpectlmodule.c | 4 +++ Modules/grpmodule.c | 5 +++ Modules/mmapmodule.c | 4 +++ Modules/posixmodule.c | 84 ++------------------------------------------------ Modules/socketmodule.c | 10 +++++- Modules/socketmodule.h | 6 +++- Parser/myreadline.c | 8 +++++ Python/dynload_shlib.c | 28 +++++++++++++++++ Python/sysmodule.c | 19 ++++++++++++ 11 files changed, 90 insertions(+), 84 deletions(-) diff --git a/Modules/bz2module.c b/Modules/bz2module.c index 9289a02..83582bd 100644 --- a/Modules/bz2module.c +++ b/Modules/bz2module.c @@ -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: diff --git a/Modules/fcntlmodule.c b/Modules/fcntlmodule.c index c495a77..9695057 100644 --- a/Modules/fcntlmodule.c +++ b/Modules/fcntlmodule.c @@ -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); diff --git a/Modules/fpectlmodule.c b/Modules/fpectlmodule.c index 099cda0..241c1c2 100644 --- a/Modules/fpectlmodule.c +++ b/Modules/fpectlmodule.c @@ -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 */ diff --git a/Modules/grpmodule.c b/Modules/grpmodule.c index 2882fab..ab9d3c5 100644 --- a/Modules/grpmodule.c +++ b/Modules/grpmodule.c @@ -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 diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index c2c723c..56033e8 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -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"); diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 035bb36..ff81585 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -17,18 +17,7 @@ #include "structseq.h" #if defined(__VMS) -# include /* tolower() */ -# include /* string descriptors */ -# include /* DVI$_name */ -# include /* -> O_RDWR */ -# include /* JPI$_name */ -# include /* LIB$name */ -# include /* OTS$name */ -# include /* SS$_name */ # include -# include -# include -# include /* 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(); diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 843c5a9..f107e0b 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -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 diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h index 936acac..167d507 100644 --- a/Modules/socketmodule.h +++ b/Modules/socketmodule.h @@ -2,7 +2,11 @@ /* Includes needed for the sockaddr_* symbols below */ #ifndef MS_WINDOWS -# include +#ifdef __VMS +# include +# else +# include +# endif # include # if !(defined(__BEOS__) || defined(__CYGWIN__) || (defined(PYOS_OS2) && defined(PYCC_VACPP))) # include diff --git a/Parser/myreadline.c b/Parser/myreadline.c index 7b7ef7e..fcc4667 100644 --- a/Parser/myreadline.c +++ b/Parser/myreadline.c @@ -15,6 +15,10 @@ #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 diff --git a/Python/dynload_shlib.c b/Python/dynload_shlib.c index 61674ba..af23f80 100644 --- a/Python/dynload_shlib.c +++ b/Python/dynload_shlib.c @@ -40,16 +40,27 @@ const struct filedescr _PyImport_DynLoadFiletab[] = { {".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) { diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 50b9912..d06d18a 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -32,6 +32,10 @@ extern void *PyWin_DLLhModule; extern const char *PyWin_DLLVersionString; #endif +#ifdef __VMS +#include +#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; -- cgit v0.12