* sending now detect partial writes and does not return an error in that case.
* writev() now also calls bind() if needed. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19428 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
|
|
||||||
void socket_delete(net_socket *socket);
|
void socket_delete(net_socket *socket);
|
||||||
|
int socket_bind(net_socket *socket, const struct sockaddr *address, socklen_t addressLength);
|
||||||
|
|
||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
@@ -128,8 +129,10 @@ socket_writev(net_socket *socket, const iovec *vecs, size_t vecCount, size_t *_l
|
|||||||
return ECONNRESET;
|
return ECONNRESET;
|
||||||
|
|
||||||
if (socket->address.ss_len == 0) {
|
if (socket->address.ss_len == 0) {
|
||||||
// TODO: bind?!
|
// try to bind first
|
||||||
return ENETUNREACH;
|
status_t status = socket_bind(socket, NULL, 0);
|
||||||
|
if (status < B_OK)
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: useful, maybe even computed header space!
|
// TODO: useful, maybe even computed header space!
|
||||||
@@ -147,15 +150,18 @@ socket_writev(net_socket *socket, const iovec *vecs, size_t vecCount, size_t *_l
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//buffer->source = (sockaddr *)&socket->address;
|
|
||||||
//buffer->destination = (sockaddr *)&socket->peer;
|
|
||||||
memcpy(&buffer->source, &socket->address, socket->address.ss_len);
|
memcpy(&buffer->source, &socket->address, socket->address.ss_len);
|
||||||
memcpy(&buffer->destination, &socket->peer, socket->peer.ss_len);
|
memcpy(&buffer->destination, &socket->peer, socket->peer.ss_len);
|
||||||
|
size_t size = buffer->size;
|
||||||
|
|
||||||
ssize_t bytesWritten = socket->first_info->send_data(socket->first_protocol,
|
ssize_t bytesWritten = socket->first_info->send_data(socket->first_protocol,
|
||||||
buffer);
|
buffer);
|
||||||
if (bytesWritten < B_OK) {
|
if (bytesWritten < B_OK) {
|
||||||
*_length = 0;
|
if (buffer->size != size) {
|
||||||
|
// this appears to be a partial write
|
||||||
|
*_length = size - buffer->size;
|
||||||
|
}
|
||||||
|
gNetBufferModule.free(buffer);
|
||||||
return bytesWritten;
|
return bytesWritten;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -704,14 +710,20 @@ socket_send(net_socket *socket, const void *data, size_t length, int flags)
|
|||||||
}
|
}
|
||||||
|
|
||||||
buffer->flags = flags;
|
buffer->flags = flags;
|
||||||
//buffer->source = (sockaddr *)&socket->address;
|
|
||||||
//buffer->destination = (sockaddr *)&socket->peer;
|
|
||||||
memcpy(&buffer->source, &socket->address, socket->address.ss_len);
|
memcpy(&buffer->source, &socket->address, socket->address.ss_len);
|
||||||
memcpy(&buffer->destination, &socket->peer, socket->peer.ss_len);
|
memcpy(&buffer->destination, &socket->peer, socket->peer.ss_len);
|
||||||
|
|
||||||
status_t status = socket->first_info->send_data(socket->first_protocol, buffer);
|
status_t status = socket->first_info->send_data(socket->first_protocol,
|
||||||
|
buffer);
|
||||||
if (status < B_OK) {
|
if (status < B_OK) {
|
||||||
|
size_t size = buffer->size;
|
||||||
gNetBufferModule.free(buffer);
|
gNetBufferModule.free(buffer);
|
||||||
|
|
||||||
|
if (size != length && (status == B_INTERRUPTED || status == B_WOULD_BLOCK)) {
|
||||||
|
// this appears to be a partial write
|
||||||
|
return length - size;
|
||||||
|
}
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -759,9 +771,16 @@ socket_sendto(net_socket *socket, const void *data, size_t length, int flags,
|
|||||||
memcpy(&buffer->source, &socket->address, socket->address.ss_len);
|
memcpy(&buffer->source, &socket->address, socket->address.ss_len);
|
||||||
memcpy(&buffer->destination, address, addressLength);
|
memcpy(&buffer->destination, address, addressLength);
|
||||||
|
|
||||||
status_t status = socket->first_info->send_data(socket->first_protocol, buffer);
|
status_t status = socket->first_info->send_data(socket->first_protocol,
|
||||||
|
buffer);
|
||||||
if (status < B_OK) {
|
if (status < B_OK) {
|
||||||
|
size_t size = buffer->size;
|
||||||
gNetBufferModule.free(buffer);
|
gNetBufferModule.free(buffer);
|
||||||
|
|
||||||
|
if (size != length && (status == B_INTERRUPTED || status == B_WOULD_BLOCK)) {
|
||||||
|
// this appears to be a partial write
|
||||||
|
return length - size;
|
||||||
|
}
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user