@@ -7242,12 +7242,62 @@ parse_openssl_version(unsigned long libver,
72427242 * major = libver & 0xFF ;
72437243}
72447244
7245+ PyDoc_STRVAR (openssl_version_info__doc__ ,
7246+ "ssl.OPENSSL_VERSION_INFO\n\
7247+ \n\
7248+ OpenSSL version information as a named tuple." );
7249+
7250+ static PyStructSequence_Field openssl_version_info_fields [] = {
7251+ {"major" , "Major release number" },
7252+ {"minor" , "Minor release number" },
7253+ {"fix" , "Fix release number" },
7254+ {"patch" , "Patch release number" },
7255+ {"status" , "Release status" },
7256+ {0 }
7257+ };
7258+
7259+ static PyStructSequence_Desc openssl_version_info_desc = {
7260+ "ssl.OPENSSL_VERSION_INFO" , /* name */
7261+ openssl_version_info__doc__ , /* doc */
7262+ openssl_version_info_fields , /* fields */
7263+ 5
7264+ };
7265+
7266+ static PyObject *
7267+ make_openssl_version_info (PyTypeObject * type , unsigned long libver )
7268+ {
7269+ PyObject * version ;
7270+ int pos = 0 ;
7271+ unsigned int major , minor , fix , patch , status ;
7272+
7273+ parse_openssl_version (libver , & major , & minor , & fix , & patch , & status );
7274+ version = PyStructSequence_New (type );
7275+ if (version == NULL ) {
7276+ return NULL ;
7277+ }
7278+
7279+ #define SetItem (VALUE ) \
7280+ PyStructSequence_SET_ITEM(version, pos++, VALUE); \
7281+ if (PyErr_Occurred()) { \
7282+ Py_DECREF(version); \
7283+ return NULL; \
7284+ }
7285+
7286+ SetItem (PyLong_FromUnsignedLong (major ))
7287+ SetItem (PyLong_FromUnsignedLong (minor ))
7288+ SetItem (PyLong_FromUnsignedLong (fix ))
7289+ SetItem (PyLong_FromUnsignedLong (patch ))
7290+ SetItem (PyLong_FromUnsignedLong (status ))
7291+ #undef SetItem
7292+
7293+ return version ;
7294+ }
7295+
72457296static int
72467297sslmodule_init_versioninfo (PyObject * m )
72477298{
72487299 PyObject * r ;
72497300 unsigned long libver ;
7250- unsigned int major , minor , fix , patch , status ;
72517301
72527302 /* OpenSSL version */
72537303 /* SSLeay() gives us the version of the library linked against,
@@ -7258,20 +7308,33 @@ sslmodule_init_versioninfo(PyObject *m)
72587308 if (PyModule_Add (m , "OPENSSL_VERSION_NUMBER" , r ) < 0 )
72597309 return -1 ;
72607310
7261- parse_openssl_version (libver , & major , & minor , & fix , & patch , & status );
7262- r = Py_BuildValue ("IIIII" , major , minor , fix , patch , status );
7263- if (PyModule_Add (m , "OPENSSL_VERSION_INFO" , r ) < 0 )
7264- return -1 ;
7265-
72667311 r = PyUnicode_FromString (OpenSSL_version (OPENSSL_VERSION ));
72677312 if (PyModule_Add (m , "OPENSSL_VERSION" , r ) < 0 )
72687313 return -1 ;
72697314
7270- libver = OPENSSL_VERSION_NUMBER ;
7271- parse_openssl_version (libver , & major , & minor , & fix , & patch , & status );
7272- r = Py_BuildValue ("IIIII" , major , minor , fix , patch , status );
7273- if (PyModule_Add (m , "_OPENSSL_API_VERSION" , r ) < 0 )
7315+ PyTypeObject * version_type ;
7316+ version_type = PyStructSequence_NewType (& openssl_version_info_desc );
7317+ if (version_type == NULL ) {
7318+ return -1 ;
7319+ }
7320+ if (PyModule_Add (m , "OPENSSL_VERSION_INFO" ,
7321+ make_openssl_version_info (version_type , libver )) < 0 )
7322+ {
7323+ Py_DECREF (version_type );
7324+ return -1 ;
7325+ }
7326+ r = make_openssl_version_info (version_type , OPENSSL_VERSION_NUMBER );
7327+ Py_DECREF (version_type );
7328+ if (r == NULL ) {
72747329 return -1 ;
7330+ }
7331+ if (PyModule_AddObjectRef (m , "OPENSSL_API_VERSION_INFO" , r ) < 0 ||
7332+ PyModule_AddObjectRef (m , "_OPENSSL_API_VERSION" , r ) < 0 )
7333+ {
7334+ Py_DECREF (r );
7335+ return -1 ;
7336+ }
7337+ Py_DECREF (r );
72757338
72767339 return 0 ;
72777340}
0 commit comments