version 1.5, 2009/06/27 09:32:43 |
version 1.6, 2009/10/24 11:22:37 |
|
|
} |
} |
debug3("Wrote %ld bytes for a total of %llu", (long)ret, |
debug3("Wrote %ld bytes for a total of %llu", (long)ret, |
(unsigned long long)write_bytes); |
(unsigned long long)write_bytes); |
|
if (out_buf_size > 0 && |
|
(ret == 0 || (ret == -1 && errno == EPIPE))) { |
|
if (wait_for_roaming_reconnect() != 0) { |
|
ret = 0; |
|
*cont = 1; |
|
} else { |
|
ret = -1; |
|
errno = EAGAIN; |
|
} |
|
} |
return ret; |
return ret; |
} |
} |
|
|
|
|
if (!resume_in_progress) { |
if (!resume_in_progress) { |
read_bytes += ret; |
read_bytes += ret; |
} |
} |
|
} else if (out_buf_size > 0 && |
|
(ret == 0 || (ret == -1 && (errno == ECONNRESET |
|
|| errno == ECONNABORTED || errno == ETIMEDOUT |
|
|| errno == EHOSTUNREACH)))) { |
|
debug("roaming_read failed for %d ret=%ld errno=%d", |
|
fd, (long)ret, errno); |
|
ret = 0; |
|
if (wait_for_roaming_reconnect() == 0) |
|
*cont = 1; |
} |
} |
return ret; |
return ret; |
} |
} |
|
|
} else { |
} else { |
atomicio(vwrite, fd, out_buf + (out_last - needed), needed); |
atomicio(vwrite, fd, out_buf + (out_last - needed), needed); |
} |
} |
|
} |
|
|
|
/* |
|
* Caclulate a new key after a reconnect |
|
*/ |
|
void |
|
calculate_new_key(u_int64_t *key, u_int64_t cookie, u_int64_t challenge) |
|
{ |
|
const EVP_MD *md = EVP_sha1(); |
|
EVP_MD_CTX ctx; |
|
char hash[EVP_MAX_MD_SIZE]; |
|
Buffer b; |
|
|
|
buffer_init(&b); |
|
buffer_put_int64(&b, *key); |
|
buffer_put_int64(&b, cookie); |
|
buffer_put_int64(&b, challenge); |
|
|
|
EVP_DigestInit(&ctx, md); |
|
EVP_DigestUpdate(&ctx, buffer_ptr(&b), buffer_len(&b)); |
|
EVP_DigestFinal(&ctx, hash, NULL); |
|
|
|
buffer_clear(&b); |
|
buffer_append(&b, hash, EVP_MD_size(md)); |
|
*key = buffer_get_int64(&b); |
|
buffer_free(&b); |
} |
} |