Browse Source

* Don't try to guess the file format in cacaserver, instead feed the data

to cucul_import_memory() and try again later if it says "not enough data".
tags/v0.99.beta14
Sam Hocevar sam 18 years ago
parent
commit
6dc69f3ace
1 changed files with 31 additions and 18 deletions
  1. +31
    -18
      src/cacaserver.c

+ 31
- 18
src/cacaserver.c View File

@@ -195,36 +195,49 @@ int main(void)
/* Main loop */ /* Main loop */
for(;;) for(;;)
{ {
uint8_t *buf = server->input;
uint32_t control_size, data_size;
unsigned int size;

restart:
/* Manage new connections as this function will be called sometimes /* Manage new connections as this function will be called sometimes
* more often than display */ * more often than display */
manage_connections(server); manage_connections(server);


/* Read data from stdin */ /* Read data from stdin */
read(0, buf, 12);
if(server->read < 12)
{
read(0, server->input + server->read, 12 - server->read);
server->read = 12;
}


while(buf[0] != 0xca || buf[1] != 0xca
|| buf[2] != 'C' || buf[3] != 'V')
while(cucul_import_memory(server->canvas, server->input,
server->read, "caca") < 0)
{ {
memmove(buf, buf + 1, 11);
read(0, buf + 11, 1);
memmove(server->input, server->input + 1, server->read - 1);
read(0, server->input + server->read - 1, 1);
} }


control_size = ((uint32_t)buf[4] << 24) | ((uint32_t)buf[5] << 16)
| ((uint32_t)buf[6] << 8) | (uint32_t)buf[7];
data_size = ((uint32_t)buf[8] << 24) | ((uint32_t)buf[9] << 16)
| ((uint32_t)buf[10] << 8) | (uint32_t)buf[11];
for(;;)
{
long int needed;
ssize_t wanted;


size = 4 + control_size + data_size;
buf = server->input = realloc(server->input, size);
read(0, buf + 12, size - 12);
needed = cucul_import_memory(server->canvas, server->input,
server->read, "caca");
if(needed < 0)
goto restart;


if(cucul_import_memory(server->canvas, buf, size, "caca") < 0)
continue; /* Load error */
if(needed > 0)
{
server->read -= needed;
memmove(server->input, server->input + needed, server->read);
break;
}


server->input = realloc(server->input, server->read + 128);
wanted = read(0, server->input + server->read, 128);
if(wanted < 0)
goto restart;
server->read += wanted;
}
/* Free the previous export buffer, if any */ /* Free the previous export buffer, if any */
if(server->buffer) if(server->buffer)
{ {


Loading…
Cancel
Save