+ v[0]=p[3]; v[1]=p[4];
+ /* SSLv3/TLSv1 */
+ if (p[4] >= TLS1_VERSION_MINOR)
+ {
+ if (!(s->options & SSL_OP_NO_TLSv1))
+ {
+ s->version=TLS1_VERSION;
+ /* type=2; */ /* done later to survive restarts */
+ s->state=SSL23_ST_SR_CLNT_HELLO_B;
+ }
+ else if (!(s->options & SSL_OP_NO_SSLv3))
+ {
+ s->version=SSL3_VERSION;
+ /* type=2; */
+ s->state=SSL23_ST_SR_CLNT_HELLO_B;
+ }
+ else if (!(s->options & SSL_OP_NO_SSLv2))
+ {
+ type=1;
+ }
+ }
+ else if (!(s->options & SSL_OP_NO_SSLv3))
+ {
+ s->version=SSL3_VERSION;
+ /* type=2; */
+ s->state=SSL23_ST_SR_CLNT_HELLO_B;
+ }
+ else if (!(s->options & SSL_OP_NO_SSLv2))
+ type=1;
+
+ if (s->options & SSL_OP_NON_EXPORT_FIRST)
+ /* Not only utterly confusing, but broken
+ * ('fractured programming'?) -- the details
+ * of this block nearly make it work
+ * as intended in this environment, but on one
+ * of the fine points (w.r.t. restarts) it fails.
+ * The obvious fix would be even more devastating
+ * to program structure; if you want the functionality,
+ * throw this away and implement it in a way
+ * that makes sense */