a791c272bc
Expose net_recv_all() and net_send_all(), equivalent of net_recv() and net_send(), but that waits/retries until the requested length has been transferred. Use these new functions where it was (wrongly) assumed that the requested length had been transferred.
18 lines
842 B
C
18 lines
842 B
C
#include "device.h"
|
|
#include "log.h"
|
|
|
|
SDL_bool device_read_info(socket_t device_socket, char *device_name, struct size *size) {
|
|
unsigned char buf[DEVICE_NAME_FIELD_LENGTH + 4];
|
|
int r = net_recv_all(device_socket, buf, sizeof(buf));
|
|
if (r < DEVICE_NAME_FIELD_LENGTH + 4) {
|
|
LOGE("Could not retrieve device information");
|
|
return SDL_FALSE;
|
|
}
|
|
buf[DEVICE_NAME_FIELD_LENGTH - 1] = '\0'; // in case the client sends garbage
|
|
// strcpy is safe here, since name contains at least DEVICE_NAME_FIELD_LENGTH bytes
|
|
// and strlen(buf) < DEVICE_NAME_FIELD_LENGTH
|
|
strcpy(device_name, (char *) buf);
|
|
size->width = (buf[DEVICE_NAME_FIELD_LENGTH] << 8) | buf[DEVICE_NAME_FIELD_LENGTH + 1];
|
|
size->height = (buf[DEVICE_NAME_FIELD_LENGTH + 2] << 8) | buf[DEVICE_NAME_FIELD_LENGTH + 3];
|
|
return SDL_TRUE;
|
|
}
|