|
|
|
|
| 34 |
* may use your version of this file under either the MPL or the |
34 |
* may use your version of this file under either the MPL or the |
| 35 |
* GPL. |
35 |
* GPL. |
| 36 |
* |
36 |
* |
| 37 |
* $Id: sslsock.c,v 1.13 2001/02/09 02:11:31 nelsonb%netscape.com Exp $ |
37 |
* $Id: sslsock.c,v 1.12 2001/02/09 00:32:08 nelsonb%netscape.com Exp $ |
| 38 |
*/ |
38 |
*/ |
| 39 |
#include "seccomon.h" |
39 |
#include "seccomon.h" |
| 40 |
#include "cert.h" |
40 |
#include "cert.h" |
|
|
| 1291 |
return 0; /* don't poll on this socket */ |
1291 |
return 0; /* don't poll on this socket */ |
| 1292 |
} |
1292 |
} |
| 1293 |
|
1293 |
|
| 1294 |
if ((ret_flags & PR_POLL_WRITE) && |
1294 |
if (ss->useSecurity && !ss->connected) { |
| 1295 |
ss->useSecurity && |
1295 |
/* XXX There needs to be a better test than the following. */ |
| 1296 |
!ss->connected && |
1296 |
if ((ss->handshake == ssl2_BeginClientHandshake) && |
| 1297 |
/* XXX There needs to be a better test than the following. */ |
1297 |
(ret_flags & (PR_POLL_READ | PR_POLL_WRITE))) { |
| 1298 |
/* Don't check ss->securityHandshake. */ |
1298 |
/* The user is waiting to read or write, but the first |
| 1299 |
(ss->handshake || ss->nextHandshake)) { |
1299 |
** handshake record hasn't been sent yet, so lie and |
| 1300 |
/* The user is trying to write, but the handshake is blocked waiting |
1300 |
** say it's ready so the user will try a read or write. |
| 1301 |
* to read, so tell NSPR NOT to poll on write. |
1301 |
*/ |
| 1302 |
*/ |
1302 |
*out_flags = (ret_flags & (PR_POLL_READ | PR_POLL_WRITE)); |
| 1303 |
ret_flags ^= PR_POLL_WRITE; /* don't select on write. */ |
1303 |
return ret_flags; |
| 1304 |
ret_flags |= PR_POLL_READ; /* do select on read. */ |
1304 |
} |
| 1305 |
} |
1305 |
/* The application is waiting for data to be received, |
| 1306 |
|
1306 |
** but the initial handshake is blocked on write. |
| 1307 |
if ((ret_flags & PR_POLL_READ) && (SSL_DataPending(fd) > 0)) { |
1307 |
** The code should select on write, not read. |
|
|
1308 |
*/ |
| 1309 |
if ((ret_flags & PR_POLL_READ) && ss->lastWriteBlocked) { |
| 1310 |
ret_flags ^= PR_POLL_READ; /* don't select on write. */ |
| 1311 |
ret_flags |= PR_POLL_WRITE; /* do select on read. */ |
| 1312 |
} else if ((ret_flags & PR_POLL_WRITE) && |
| 1313 |
/* XXX There needs to be a better test than the following. */ |
| 1314 |
/* Don't check ss->securityHandshake. */ |
| 1315 |
(ss->handshake || ss->nextHandshake)) { |
| 1316 |
/* The user is trying to write, but the handshake is blocked |
| 1317 |
** waiting to read, so tell NSPR NOT to poll on write. |
| 1318 |
*/ |
| 1319 |
ret_flags ^= PR_POLL_WRITE; /* don't select on write. */ |
| 1320 |
ret_flags |= PR_POLL_READ; /* do select on read. */ |
| 1321 |
} |
| 1322 |
} else if ((ret_flags & PR_POLL_READ) && (SSL_DataPending(fd) > 0)) { |
| 1308 |
*out_flags = PR_POLL_READ; /* it's ready already. */ |
1323 |
*out_flags = PR_POLL_READ; /* it's ready already. */ |
| 1309 |
|
1324 |
return ret_flags; |
| 1310 |
} else if (ret_flags && (fd->lower->methods->poll != NULL)) { |
1325 |
} |
|
|
1326 |
if (ret_flags && (fd->lower->methods->poll != NULL)) { |
| 1311 |
ret_flags = fd->lower->methods->poll(fd->lower, ret_flags, out_flags); |
1327 |
ret_flags = fd->lower->methods->poll(fd->lower, ret_flags, out_flags); |
| 1312 |
} |
1328 |
} |
| 1313 |
|
1329 |
|