bpo-30022: Get rid of using EnvironmentError and IOError (except test… (#1051)

diff --git a/Modules/_bz2module.c b/Modules/_bz2module.c
index 5cea42c..409522f 100644
--- a/Modules/_bz2module.c
+++ b/Modules/_bz2module.c
@@ -96,10 +96,10 @@
             return 1;
         case BZ_DATA_ERROR:
         case BZ_DATA_ERROR_MAGIC:
-            PyErr_SetString(PyExc_IOError, "Invalid data stream");
+            PyErr_SetString(PyExc_OSError, "Invalid data stream");
             return 1;
         case BZ_IO_ERROR:
-            PyErr_SetString(PyExc_IOError, "Unknown I/O error");
+            PyErr_SetString(PyExc_OSError, "Unknown I/O error");
             return 1;
         case BZ_UNEXPECTED_EOF:
             PyErr_SetString(PyExc_EOFError,
@@ -112,7 +112,7 @@
                             "Invalid sequence of commands sent to libbzip2");
             return 1;
         default:
-            PyErr_Format(PyExc_IOError,
+            PyErr_Format(PyExc_OSError,
                          "Unrecognized error from libbzip2: %d", bzerror);
             return 1;
     }
diff --git a/Modules/_dbmmodule.c b/Modules/_dbmmodule.c
index 4b3fac4..7e13441 100644
--- a/Modules/_dbmmodule.c
+++ b/Modules/_dbmmodule.c
@@ -483,7 +483,7 @@
     d = PyModule_GetDict(m);
     if (DbmError == NULL)
         DbmError = PyErr_NewException("_dbm.error",
-                                      PyExc_IOError, NULL);
+                                      PyExc_OSError, NULL);
     s = PyUnicode_FromString(which_dbm);
     if (s != NULL) {
         PyDict_SetItemString(d, "library", s);
diff --git a/Modules/_gdbmmodule.c b/Modules/_gdbmmodule.c
index 54a6566..12d973b 100644
--- a/Modules/_gdbmmodule.c
+++ b/Modules/_gdbmmodule.c
@@ -649,7 +649,7 @@
     if (m == NULL)
         return NULL;
     d = PyModule_GetDict(m);
-    DbmError = PyErr_NewException("_gdbm.error", PyExc_IOError, NULL);
+    DbmError = PyErr_NewException("_gdbm.error", PyExc_OSError, NULL);
     if (DbmError != NULL) {
         PyDict_SetItemString(d, "error", DbmError);
         s = PyUnicode_FromString(dbmmodule_open_flags);
diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c
index bc2fb32..f0621f4 100644
--- a/Modules/_io/_iomodule.c
+++ b/Modules/_io/_iomodule.c
@@ -61,7 +61,7 @@
 "At the top of the I/O hierarchy is the abstract base class IOBase. It\n"
 "defines the basic interface to a stream. Note, however, that there is no\n"
 "separation between reading and writing to streams; implementations are\n"
-"allowed to raise an IOError if they do not support a given operation.\n"
+"allowed to raise an OSError if they do not support a given operation.\n"
 "\n"
 "Extending IOBase is RawIOBase which deals simply with the reading and\n"
 "writing of raw bytes to a stream. FileIO subclasses RawIOBase to provide\n"
@@ -107,7 +107,7 @@
     closefd: bool(accept={int}) = True
     opener: object = None
 
-Open file and return a stream.  Raise IOError upon failure.
+Open file and return a stream.  Raise OSError upon failure.
 
 file is either a text or byte string giving the name (and the path
 if the file isn't in the current working directory) of the file to
@@ -231,7 +231,7 @@
 _io_open_impl(PyObject *module, PyObject *file, const char *mode,
               int buffering, const char *encoding, const char *errors,
               const char *newline, int closefd, PyObject *opener)
-/*[clinic end generated code: output=aefafc4ce2b46dc0 input=7f81b2a1d3b02344]*/
+/*[clinic end generated code: output=aefafc4ce2b46dc0 input=03da2940c8a65871]*/
 {
     unsigned i;
 
@@ -656,7 +656,7 @@
     if (PyModule_AddIntMacro(m, DEFAULT_BUFFER_SIZE) < 0)
         goto fail;
 
-    /* UnsupportedOperation inherits from ValueError and IOError */
+    /* UnsupportedOperation inherits from ValueError and OSError */
     state->unsupported_operation = PyObject_CallFunction(
         (PyObject *)&PyType_Type, "s(OO){}",
         "UnsupportedOperation", PyExc_OSError, PyExc_ValueError);
diff --git a/Modules/_io/_iomodule.h b/Modules/_io/_iomodule.h
index c589c38..db84037 100644
--- a/Modules/_io/_iomodule.h
+++ b/Modules/_io/_iomodule.h
@@ -67,7 +67,7 @@
     int translated, int universal, PyObject *readnl,
     int kind, const char *start, const char *end, Py_ssize_t *consumed);
 
-/* Return 1 if an EnvironmentError with errno == EINTR is set (and then
+/* Return 1 if an OSError with errno == EINTR is set (and then
    clears the error indicator), 0 otherwise.
    Should only be called when PyErr_Occurred() is true.
 */
diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c
index 24e052b..189b1cd 100644
--- a/Modules/_io/bufferedio.c
+++ b/Modules/_io/bufferedio.c
@@ -695,7 +695,7 @@
     Py_DECREF(res);
     if (n < 0) {
         if (!PyErr_Occurred())
-            PyErr_Format(PyExc_IOError,
+            PyErr_Format(PyExc_OSError,
                          "Raw stream returned invalid position %" PY_PRIdOFF,
                          (PY_OFF_T_COMPAT)n);
         return -1;
@@ -728,7 +728,7 @@
     Py_DECREF(res);
     if (n < 0) {
         if (!PyErr_Occurred())
-            PyErr_Format(PyExc_IOError,
+            PyErr_Format(PyExc_OSError,
                          "Raw stream returned invalid position %" PY_PRIdOFF,
                          (PY_OFF_T_COMPAT)n);
         return -1;
@@ -776,7 +776,7 @@
     return 0;
 }
 
-/* Return 1 if an EnvironmentError with errno == EINTR is set (and then
+/* Return 1 if an OSError with errno == EINTR is set (and then
    clears the error indicator), 0 otherwise.
    Should only be called when PyErr_Occurred() is true.
 */
@@ -785,17 +785,17 @@
 {
     static PyObject *eintr_int = NULL;
     PyObject *typ, *val, *tb;
-    PyEnvironmentErrorObject *env_err;
+    PyOSErrorObject *env_err;
 
     if (eintr_int == NULL) {
         eintr_int = PyLong_FromLong(EINTR);
         assert(eintr_int != NULL);
     }
-    if (!PyErr_ExceptionMatches(PyExc_EnvironmentError))
+    if (!PyErr_ExceptionMatches(PyExc_OSError))
         return 0;
     PyErr_Fetch(&typ, &val, &tb);
     PyErr_NormalizeException(&typ, &val, &tb);
-    env_err = (PyEnvironmentErrorObject *) val;
+    env_err = (PyOSErrorObject *) val;
     assert(env_err != NULL);
     if (env_err->myerrno != NULL &&
         PyObject_RichCompareBool(env_err->myerrno, eintr_int, Py_EQ) > 0) {
@@ -1374,7 +1374,7 @@
         line = PyObject_CallMethodObjArgs((PyObject *)self,
                                            _PyIO_str_readline, NULL);
         if (line && !PyBytes_Check(line)) {
-            PyErr_Format(PyExc_IOError,
+            PyErr_Format(PyExc_OSError,
                          "readline() should have returned a bytes object, "
                          "not '%.200s'", Py_TYPE(line)->tp_name);
             Py_DECREF(line);
@@ -1501,7 +1501,7 @@
     n = PyNumber_AsSsize_t(res, PyExc_ValueError);
     Py_DECREF(res);
     if (n < 0 || n > len) {
-        PyErr_Format(PyExc_IOError,
+        PyErr_Format(PyExc_OSError,
                      "raw readinto() returned invalid length %zd "
                      "(should have been between 0 and %zd)", n, len);
         return -1;
@@ -1858,7 +1858,7 @@
     n = PyNumber_AsSsize_t(res, PyExc_ValueError);
     Py_DECREF(res);
     if (n < 0 || n > len) {
-        PyErr_Format(PyExc_IOError,
+        PyErr_Format(PyExc_OSError,
                      "raw write() returned invalid length %zd "
                      "(should have been between 0 and %zd)", n, len);
         return -1;
diff --git a/Modules/_io/clinic/_iomodule.c.h b/Modules/_io/clinic/_iomodule.c.h
index a1ba869..245df25 100644
--- a/Modules/_io/clinic/_iomodule.c.h
+++ b/Modules/_io/clinic/_iomodule.c.h
@@ -7,7 +7,7 @@
 "     errors=None, newline=None, closefd=True, opener=None)\n"
 "--\n"
 "\n"
-"Open file and return a stream.  Raise IOError upon failure.\n"
+"Open file and return a stream.  Raise OSError upon failure.\n"
 "\n"
 "file is either a text or byte string giving the name (and the path\n"
 "if the file isn\'t in the current working directory) of the file to\n"
@@ -158,4 +158,4 @@
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=79fd04d9c9d8f28f input=a9049054013a1b77]*/
+/*[clinic end generated code: output=e6011c784fe6589b input=a9049054013a1b77]*/
diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c
index 3c0b752..922db3e 100644
--- a/Modules/_io/fileio.c
+++ b/Modules/_io/fileio.c
@@ -123,7 +123,7 @@
     }
     if (err < 0) {
         errno = save_errno;
-        PyErr_SetFromErrno(PyExc_IOError);
+        PyErr_SetFromErrno(PyExc_OSError);
         return -1;
     }
     return 0;
@@ -456,7 +456,7 @@
            directories, so we need a check.  */
         if (S_ISDIR(fdfstat.st_mode)) {
             errno = EISDIR;
-            PyErr_SetFromErrnoWithFilenameObject(PyExc_IOError, nameobj);
+            PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, nameobj);
             goto error;
         }
 #endif /* defined(S_ISDIR) */
@@ -910,7 +910,7 @@
     _Py_END_SUPPRESS_IPH
     Py_END_ALLOW_THREADS
     if (res < 0)
-        return PyErr_SetFromErrno(PyExc_IOError);
+        return PyErr_SetFromErrno(PyExc_OSError);
 
 #if defined(HAVE_LARGEFILE_SUPPORT)
     return PyLong_FromLongLong(res);
@@ -1023,7 +1023,7 @@
 
     if (ret != 0) {
         Py_DECREF(posobj);
-        PyErr_SetFromErrno(PyExc_IOError);
+        PyErr_SetFromErrno(PyExc_OSError);
         return NULL;
     }
 
diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c
index 1a687c5..b7a506b 100644
--- a/Modules/_io/iobase.c
+++ b/Modules/_io/iobase.c
@@ -526,7 +526,7 @@
                 goto fail;
             }
             if (!PyBytes_Check(readahead)) {
-                PyErr_Format(PyExc_IOError,
+                PyErr_Format(PyExc_OSError,
                              "peek() should have returned a bytes object, "
                              "not '%.200s'", Py_TYPE(readahead)->tp_name);
                 Py_DECREF(readahead);
@@ -566,7 +566,7 @@
             goto fail;
         }
         if (!PyBytes_Check(b)) {
-            PyErr_Format(PyExc_IOError,
+            PyErr_Format(PyExc_OSError,
                          "read() should have returned a bytes object, "
                          "not '%.200s'", Py_TYPE(b)->tp_name);
             Py_DECREF(b);
diff --git a/Modules/_io/stringio.c b/Modules/_io/stringio.c
index 2ec32ac..718b1ac 100644
--- a/Modules/_io/stringio.c
+++ b/Modules/_io/stringio.c
@@ -410,7 +410,7 @@
         line = PyObject_CallMethodObjArgs((PyObject *)self,
                                            _PyIO_str_readline, NULL);
         if (line && !PyUnicode_Check(line)) {
-            PyErr_Format(PyExc_IOError,
+            PyErr_Format(PyExc_OSError,
                          "readline() should have returned a str object, "
                          "not '%.200s'", Py_TYPE(line)->tp_name);
             Py_DECREF(line);
@@ -498,7 +498,7 @@
         return NULL;
     }
     else if (whence != 0 && pos != 0) {
-        PyErr_SetString(PyExc_IOError,
+        PyErr_SetString(PyExc_OSError,
                         "Can't do nonzero cur-relative seeks");
         return NULL;
     }
diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c
index 5639ad8..2c799e3 100644
--- a/Modules/_io/textio.c
+++ b/Modules/_io/textio.c
@@ -924,7 +924,7 @@
             goto error;
     }
     else {
-        PyErr_SetString(PyExc_IOError,
+        PyErr_SetString(PyExc_OSError,
                         "could not determine default encoding");
     }
 
@@ -2205,7 +2205,7 @@
 
         /* Skip chars_to_skip of the decoded characters. */
         if (PyUnicode_GetLength(self->decoded_chars) < cookie.chars_to_skip) {
-            PyErr_SetString(PyExc_IOError, "can't restore logical file position");
+            PyErr_SetString(PyExc_OSError, "can't restore logical file position");
             goto fail;
         }
         self->decoded_chars_used = cookie.chars_to_skip;
@@ -2255,7 +2255,7 @@
         goto fail;
     }
     if (!self->telling) {
-        PyErr_SetString(PyExc_IOError,
+        PyErr_SetString(PyExc_OSError,
                         "telling position disabled by next() call");
         goto fail;
     }
@@ -2421,7 +2421,7 @@
         cookie.need_eof = 1;
 
         if (chars_decoded < chars_to_skip) {
-            PyErr_SetString(PyExc_IOError,
+            PyErr_SetString(PyExc_OSError,
                             "can't reconstruct logical file position");
             goto fail;
         }
@@ -2693,7 +2693,7 @@
         line = PyObject_CallMethodObjArgs((PyObject *)self,
                                            _PyIO_str_readline, NULL);
         if (line && !PyUnicode_Check(line)) {
-            PyErr_Format(PyExc_IOError,
+            PyErr_Format(PyExc_OSError,
                          "readline() should have returned a str object, "
                          "not '%.200s'", Py_TYPE(line)->tp_name);
             Py_DECREF(line);
diff --git a/Modules/_multiprocessing/multiprocessing.c b/Modules/_multiprocessing/multiprocessing.c
index bb65b3b..806e638 100644
--- a/Modules/_multiprocessing/multiprocessing.c
+++ b/Modules/_multiprocessing/multiprocessing.c
@@ -64,7 +64,7 @@
     Py_END_ALLOW_THREADS
 
     if (ret)
-        return PyErr_SetExcFromWindowsErr(PyExc_IOError, WSAGetLastError());
+        return PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
     Py_RETURN_NONE;
 }
 
@@ -88,7 +88,7 @@
 
     if (nread < 0) {
         Py_DECREF(buf);
-        return PyErr_SetExcFromWindowsErr(PyExc_IOError, WSAGetLastError());
+        return PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
     }
     _PyBytes_Resize(&buf, nread);
     return buf;
@@ -112,7 +112,7 @@
 
     PyBuffer_Release(&buf);
     if (ret < 0)
-        return PyErr_SetExcFromWindowsErr(PyExc_IOError, WSAGetLastError());
+        return PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
     return PyLong_FromLong(ret);
 }
 
diff --git a/Modules/_multiprocessing/semaphore.c b/Modules/_multiprocessing/semaphore.c
index 9614329..79e8715 100644
--- a/Modules/_multiprocessing/semaphore.c
+++ b/Modules/_multiprocessing/semaphore.c
@@ -135,7 +135,7 @@
         Py_RETURN_TRUE;
     case WAIT_OBJECT_0 + 1:
         errno = EINTR;
-        return PyErr_SetFromErrno(PyExc_IOError);
+        return PyErr_SetFromErrno(PyExc_OSError);
     case WAIT_FAILED:
         return PyErr_SetFromWindowsErr(0);
     default:
diff --git a/Modules/_ssl.c b/Modules/_ssl.c
index 5f2de61..68fd2dd 100644
--- a/Modules/_ssl.c
+++ b/Modules/_ssl.c
@@ -3275,7 +3275,7 @@
         }
         else if (errno != 0) {
             ERR_clear_error();
-            PyErr_SetFromErrno(PyExc_IOError);
+            PyErr_SetFromErrno(PyExc_OSError);
         }
         else {
             _setSSLError(NULL, 0, __FILE__, __LINE__);
@@ -3296,7 +3296,7 @@
         }
         else if (errno != 0) {
             ERR_clear_error();
-            PyErr_SetFromErrno(PyExc_IOError);
+            PyErr_SetFromErrno(PyExc_OSError);
         }
         else {
             _setSSLError(NULL, 0, __FILE__, __LINE__);
@@ -3504,7 +3504,7 @@
             ok = 0;
             if (errno != 0) {
                 ERR_clear_error();
-                PyErr_SetFromErrno(PyExc_IOError);
+                PyErr_SetFromErrno(PyExc_OSError);
             }
             else {
                 _setSSLError(NULL, 0, __FILE__, __LINE__);
diff --git a/Modules/_winapi.c b/Modules/_winapi.c
index cb6a85c..1cb60cd 100644
--- a/Modules/_winapi.c
+++ b/Modules/_winapi.c
@@ -224,7 +224,7 @@
             break;
         default:
             self->pending = 0;
-            return PyErr_SetExcFromWindowsErr(PyExc_IOError, err);
+            return PyErr_SetExcFromWindowsErr(PyExc_OSError, err);
     }
     if (self->completed && self->read_buffer != NULL) {
         assert(PyBytes_CheckExact(self->read_buffer));
@@ -276,7 +276,7 @@
 
     /* CancelIoEx returns ERROR_NOT_FOUND if the I/O completed in-between */
     if (!res && GetLastError() != ERROR_NOT_FOUND)
-        return PyErr_SetExcFromWindowsErr(PyExc_IOError, 0);
+        return PyErr_SetExcFromWindowsErr(PyExc_OSError, 0);
     self->pending = 0;
     Py_RETURN_NONE;
 }
@@ -1139,7 +1139,7 @@
         Py_END_ALLOW_THREADS
         if (!ret) {
             Py_DECREF(buf);
-            return PyErr_SetExcFromWindowsErr(PyExc_IOError, 0);
+            return PyErr_SetExcFromWindowsErr(PyExc_OSError, 0);
         }
         if (_PyBytes_Resize(&buf, nread))
             return NULL;
@@ -1150,7 +1150,7 @@
         ret = PeekNamedPipe(handle, NULL, 0, NULL, &navail, &nleft);
         Py_END_ALLOW_THREADS
         if (!ret) {
-            return PyErr_SetExcFromWindowsErr(PyExc_IOError, 0);
+            return PyErr_SetExcFromWindowsErr(PyExc_OSError, 0);
         }
         return Py_BuildValue("ii", navail, nleft);
     }
@@ -1201,7 +1201,7 @@
                 overlapped->pending = 1;
             else if (err != ERROR_MORE_DATA) {
                 Py_DECREF(overlapped);
-                return PyErr_SetExcFromWindowsErr(PyExc_IOError, 0);
+                return PyErr_SetExcFromWindowsErr(PyExc_OSError, 0);
             }
         }
         return Py_BuildValue("NI", (PyObject *) overlapped, err);
@@ -1209,7 +1209,7 @@
 
     if (!ret && err != ERROR_MORE_DATA) {
         Py_DECREF(buf);
-        return PyErr_SetExcFromWindowsErr(PyExc_IOError, 0);
+        return PyErr_SetExcFromWindowsErr(PyExc_OSError, 0);
     }
     if (_PyBytes_Resize(&buf, nread))
         return NULL;
@@ -1366,10 +1366,10 @@
     Py_END_ALLOW_THREADS
 
     if (result == WAIT_FAILED)
-        return PyErr_SetExcFromWindowsErr(PyExc_IOError, 0);
+        return PyErr_SetExcFromWindowsErr(PyExc_OSError, 0);
     else if (sigint_event != NULL && result == WAIT_OBJECT_0 + nhandles - 1) {
         errno = EINTR;
-        return PyErr_SetFromErrno(PyExc_IOError);
+        return PyErr_SetFromErrno(PyExc_OSError);
     }
 
     return PyLong_FromLong((int) result);
@@ -1455,7 +1455,7 @@
                 overlapped->pending = 1;
             else {
                 Py_DECREF(overlapped);
-                return PyErr_SetExcFromWindowsErr(PyExc_IOError, 0);
+                return PyErr_SetExcFromWindowsErr(PyExc_OSError, 0);
             }
         }
         return Py_BuildValue("NI", (PyObject *) overlapped, err);
@@ -1463,7 +1463,7 @@
 
     PyBuffer_Release(buf);
     if (!ret)
-        return PyErr_SetExcFromWindowsErr(PyExc_IOError, 0);
+        return PyErr_SetExcFromWindowsErr(PyExc_OSError, 0);
     return Py_BuildValue("II", written, err);
 }
 
diff --git a/Modules/fcntlmodule.c b/Modules/fcntlmodule.c
index 8875b26..0baaa83 100644
--- a/Modules/fcntlmodule.c
+++ b/Modules/fcntlmodule.c
@@ -79,7 +79,7 @@
             ret = fcntl(fd, code, buf);
             Py_END_ALLOW_THREADS
             if (ret < 0) {
-                PyErr_SetFromErrno(PyExc_IOError);
+                PyErr_SetFromErrno(PyExc_OSError);
                 return NULL;
             }
             return PyBytes_FromStringAndSize(buf, len);
@@ -99,7 +99,7 @@
     ret = fcntl(fd, code, (int)int_arg);
     Py_END_ALLOW_THREADS
     if (ret < 0) {
-        PyErr_SetFromErrno(PyExc_IOError);
+        PyErr_SetFromErrno(PyExc_OSError);
         return NULL;
     }
     return PyLong_FromLong((long)ret);
@@ -210,7 +210,7 @@
             }
             PyBuffer_Release(&pstr); /* No further access to str below this point */
             if (ret < 0) {
-                PyErr_SetFromErrno(PyExc_IOError);
+                PyErr_SetFromErrno(PyExc_OSError);
                 return NULL;
             }
             if (mutate_arg) {
@@ -238,7 +238,7 @@
             Py_END_ALLOW_THREADS
             if (ret < 0) {
                 PyBuffer_Release(&pstr);
-                PyErr_SetFromErrno(PyExc_IOError);
+                PyErr_SetFromErrno(PyExc_OSError);
                 return NULL;
             }
             PyBuffer_Release(&pstr);
@@ -258,7 +258,7 @@
     ret = ioctl(fd, code, arg);
     Py_END_ALLOW_THREADS
     if (ret < 0) {
-        PyErr_SetFromErrno(PyExc_IOError);
+        PyErr_SetFromErrno(PyExc_OSError);
         return NULL;
     }
     return PyLong_FromLong((long)ret);
@@ -316,7 +316,7 @@
     }
 #endif /* HAVE_FLOCK */
     if (ret < 0) {
-        PyErr_SetFromErrno(PyExc_IOError);
+        PyErr_SetFromErrno(PyExc_OSError);
         return NULL;
     }
     Py_RETURN_NONE;
@@ -412,7 +412,7 @@
         Py_END_ALLOW_THREADS
     }
     if (ret < 0) {
-        PyErr_SetFromErrno(PyExc_IOError);
+        PyErr_SetFromErrno(PyExc_OSError);
         return NULL;
     }
     Py_RETURN_NONE;
diff --git a/Modules/main.c b/Modules/main.c
index 42fe2a0..2fb230a 100644
--- a/Modules/main.c
+++ b/Modules/main.c
@@ -141,7 +141,7 @@
             save_errno = errno;
             PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
             errno = save_errno;
-            PyErr_SetFromErrnoWithFilename(PyExc_IOError,
+            PyErr_SetFromErrnoWithFilename(PyExc_OSError,
                             startup);
             PyErr_Print();
             PyErr_Clear();
diff --git a/Modules/ossaudiodev.c b/Modules/ossaudiodev.c
index 1cdbbae..8bb4d0d 100644
--- a/Modules/ossaudiodev.c
+++ b/Modules/ossaudiodev.c
@@ -128,13 +128,13 @@
        expected write() semantics. */
     if (fcntl(fd, F_SETFL, 0) == -1) {
         close(fd);
-        PyErr_SetFromErrnoWithFilename(PyExc_IOError, devicename);
+        PyErr_SetFromErrnoWithFilename(PyExc_OSError, devicename);
         return NULL;
     }
 
     if (ioctl(fd, SNDCTL_DSP_GETFMTS, &afmts) == -1) {
         close(fd);
-        PyErr_SetFromErrnoWithFilename(PyExc_IOError, devicename);
+        PyErr_SetFromErrnoWithFilename(PyExc_OSError, devicename);
         return NULL;
     }
     /* Create and initialize the object */
@@ -253,7 +253,7 @@
         return NULL;
 
     if (ioctl(fd, cmd, &arg) == -1)
-        return PyErr_SetFromErrno(PyExc_IOError);
+        return PyErr_SetFromErrno(PyExc_OSError);
     return PyLong_FromLong(arg);
 }
 
@@ -278,7 +278,7 @@
         return NULL;
 
     if (ioctl(fd, cmd, &arg) == -1)
-        return PyErr_SetFromErrno(PyExc_IOError);
+        return PyErr_SetFromErrno(PyExc_OSError);
     return PyLong_FromLong(arg);
 }
 
@@ -306,7 +306,7 @@
     Py_END_ALLOW_THREADS
 
     if (rv == -1)
-        return PyErr_SetFromErrno(PyExc_IOError);
+        return PyErr_SetFromErrno(PyExc_OSError);
     Py_RETURN_NONE;
 }
 
@@ -324,7 +324,7 @@
     /* Hmmm: it doesn't appear to be possible to return to blocking
        mode once we're in non-blocking mode! */
     if (ioctl(self->fd, SNDCTL_DSP_NONBLOCK, NULL) == -1)
-        return PyErr_SetFromErrno(PyExc_IOError);
+        return PyErr_SetFromErrno(PyExc_OSError);
     Py_RETURN_NONE;
 }
 
@@ -346,7 +346,7 @@
         return NULL;
 
     if (ioctl(self->fd, SNDCTL_DSP_GETFMTS, &mask) == -1)
-        return PyErr_SetFromErrno(PyExc_IOError);
+        return PyErr_SetFromErrno(PyExc_OSError);
     return PyLong_FromLong(mask);
 }
 
@@ -491,7 +491,7 @@
         assert(select_rv != 0);   /* no timeout, can't expire */
         if (select_rv == -1) {
             PyBuffer_Release(&data);
-            return PyErr_SetFromErrno(PyExc_IOError);
+            return PyErr_SetFromErrno(PyExc_OSError);
         }
 
         rv = _Py_write(self->fd, cp, Py_MIN(size, INT_MAX));
@@ -575,7 +575,7 @@
 
     fmt = wanted_fmt;
     if (ioctl(self->fd, SNDCTL_DSP_SETFMT, &fmt) == -1) {
-        return PyErr_SetFromErrno(PyExc_IOError);
+        return PyErr_SetFromErrno(PyExc_OSError);
     }
     if (strict && fmt != wanted_fmt) {
         return PyErr_Format
@@ -586,7 +586,7 @@
 
     channels = wanted_channels;
     if (ioctl(self->fd, SNDCTL_DSP_CHANNELS, &channels) == -1) {
-        return PyErr_SetFromErrno(PyExc_IOError);
+        return PyErr_SetFromErrno(PyExc_OSError);
     }
     if (strict && channels != wanted_channels) {
         return PyErr_Format
@@ -597,7 +597,7 @@
 
     rate = wanted_rate;
     if (ioctl(self->fd, SNDCTL_DSP_SPEED, &rate) == -1) {
-        return PyErr_SetFromErrno(PyExc_IOError);
+        return PyErr_SetFromErrno(PyExc_OSError);
     }
     if (strict && rate != wanted_rate) {
         return PyErr_Format
@@ -656,11 +656,11 @@
         return NULL;
 
     if (_ssize(self, &nchannels, &ssize) < 0 || !nchannels || !ssize) {
-        PyErr_SetFromErrno(PyExc_IOError);
+        PyErr_SetFromErrno(PyExc_OSError);
         return NULL;
     }
     if (ioctl(self->fd, SNDCTL_DSP_GETOSPACE, &ai) < 0) {
-        PyErr_SetFromErrno(PyExc_IOError);
+        PyErr_SetFromErrno(PyExc_OSError);
         return NULL;
     }
     return PyLong_FromLong((ai.fragstotal * ai.fragsize) / (nchannels * ssize));
@@ -678,11 +678,11 @@
         return NULL;
 
     if (_ssize(self, &nchannels, &ssize) < 0 || !nchannels || !ssize) {
-        PyErr_SetFromErrno(PyExc_IOError);
+        PyErr_SetFromErrno(PyExc_OSError);
         return NULL;
     }
     if (ioctl(self->fd, SNDCTL_DSP_GETOSPACE, &ai) < 0) {
-        PyErr_SetFromErrno(PyExc_IOError);
+        PyErr_SetFromErrno(PyExc_OSError);
         return NULL;
     }
     return PyLong_FromLong((ai.fragstotal * ai.fragsize - ai.bytes) /
@@ -701,11 +701,11 @@
         return NULL;
 
     if (_ssize(self, &nchannels, &ssize) < 0 || !nchannels || !ssize) {
-        PyErr_SetFromErrno(PyExc_IOError);
+        PyErr_SetFromErrno(PyExc_OSError);
         return NULL;
     }
     if (ioctl(self->fd, SNDCTL_DSP_GETOSPACE, &ai) < 0) {
-        PyErr_SetFromErrno(PyExc_IOError);
+        PyErr_SetFromErrno(PyExc_OSError);
         return NULL;
     }
     return PyLong_FromLong(ai.bytes / (ssize * nchannels));
@@ -725,7 +725,7 @@
     else
         req = SNDCTL_DSP_GETOPTR;
     if (ioctl(self->fd, req, &info) == -1) {
-        PyErr_SetFromErrno(PyExc_IOError);
+        PyErr_SetFromErrno(PyExc_OSError);
         return NULL;
     }
     return Py_BuildValue("iii", info.bytes, info.blocks, info.ptr);
@@ -805,7 +805,7 @@
     }
 
     if (ioctl(self->fd, MIXER_READ(channel), &volume) == -1)
-        return PyErr_SetFromErrno(PyExc_IOError);
+        return PyErr_SetFromErrno(PyExc_OSError);
 
     return Py_BuildValue("(ii)", volume & 0xff, (volume & 0xff00) >> 8);
 }
@@ -835,7 +835,7 @@
     volume = (rightVol << 8) | leftVol;
 
     if (ioctl(self->fd, MIXER_WRITE(channel), &volume) == -1)
-        return PyErr_SetFromErrno(PyExc_IOError);
+        return PyErr_SetFromErrno(PyExc_OSError);
 
     return Py_BuildValue("(ii)", volume & 0xff, (volume & 0xff00) >> 8);
 }
diff --git a/Modules/readline.c b/Modules/readline.c
index 389954f..dfbbb29 100644
--- a/Modules/readline.c
+++ b/Modules/readline.c
@@ -188,7 +188,7 @@
     } else
         errno = rl_read_init_file(NULL);
     if (errno)
-        return PyErr_SetFromErrno(PyExc_IOError);
+        return PyErr_SetFromErrno(PyExc_OSError);
     Py_RETURN_NONE;
 }
 
@@ -214,7 +214,7 @@
     } else
         errno = read_history(NULL);
     if (errno)
-        return PyErr_SetFromErrno(PyExc_IOError);
+        return PyErr_SetFromErrno(PyExc_OSError);
     Py_RETURN_NONE;
 }
 
@@ -249,7 +249,7 @@
     Py_XDECREF(filename_bytes);
     errno = err;
     if (errno)
-        return PyErr_SetFromErrno(PyExc_IOError);
+        return PyErr_SetFromErrno(PyExc_OSError);
     Py_RETURN_NONE;
 }
 
@@ -285,7 +285,7 @@
     Py_XDECREF(filename_bytes);
     errno = err;
     if (errno)
-        return PyErr_SetFromErrno(PyExc_IOError);
+        return PyErr_SetFromErrno(PyExc_OSError);
     Py_RETURN_NONE;
 }
 
diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c
index 6f71d58..0b9b5da 100644
--- a/Modules/selectmodule.c
+++ b/Modules/selectmodule.c
@@ -768,7 +768,7 @@
         ** the wild.
         ** See http://bugs.python.org/issue6397.
         */
-        PyErr_Format(PyExc_IOError, "failed to write all pollfds. "
+        PyErr_Format(PyExc_OSError, "failed to write all pollfds. "
                 "Please, report at http://bugs.python.org/. "
                 "Data to report: Size tried: %d, actual size written: %d.",
                 size, n);
@@ -948,7 +948,7 @@
     } while (1);
 
     if (poll_result < 0) {
-        PyErr_SetFromErrno(PyExc_IOError);
+        PyErr_SetFromErrno(PyExc_OSError);
         return NULL;
     }
 
diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c
index ed03683..7982139 100644
--- a/Modules/signalmodule.c
+++ b/Modules/signalmodule.c
@@ -1438,7 +1438,7 @@
 
 #if defined (HAVE_SETITIMER) || defined (HAVE_GETITIMER)
     ItimerError = PyErr_NewException("signal.ItimerError",
-            PyExc_IOError, NULL);
+            PyExc_OSError, NULL);
     if (ItimerError != NULL)
         PyDict_SetItemString(d, "ItimerError", ItimerError);
 #endif
diff --git a/Modules/zipimport.c b/Modules/zipimport.c
index a74f6c7..c9526ba 100644
--- a/Modules/zipimport.c
+++ b/Modules/zipimport.c
@@ -603,7 +603,7 @@
         goto error;
     toc_entry = PyDict_GetItem(self->files, key);
     if (toc_entry == NULL) {
-        PyErr_SetFromErrnoWithFilenameObject(PyExc_IOError, key);
+        PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, key);
         Py_DECREF(key);
         goto error;
     }
@@ -709,7 +709,7 @@
 PyDoc_STRVAR(doc_get_data,
 "get_data(pathname) -> string with file data.\n\
 \n\
-Return the data associated with 'pathname'. Raise IOError if\n\
+Return the data associated with 'pathname'. Raise OSError if\n\
 the file wasn't found.");
 
 PyDoc_STRVAR(doc_is_package,
@@ -1193,7 +1193,7 @@
         goto file_error;
     }
     if (fread(buf, 1, data_size, fp) != (size_t)data_size) {
-        PyErr_SetString(PyExc_IOError,
+        PyErr_SetString(PyExc_OSError,
                         "zipimport: can't read data");
         goto error;
     }