[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [tyndur-devel] [PATCH 5/6] libc: Rückgabe von lio_compat_read/write angepasst



On Sun, Sep 25 18:02, Kevin Wolf wrote:
> * libc: lio_compat_read/write gibt jetzt wie das richtge lio_read/write
>   etwas negatives zurück, wenn ein Fehler aufgetreten ist und 0 bei EOF
> 
> Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
> ---
>  src/modules/include/lostio.h         |    4 ++--
>  src/modules/lib/lostio/client/file.c |   33 ++++++++++++++++++++++++++-------
>  2 files changed, 28 insertions(+), 9 deletions(-)
> 
> diff --git a/src/modules/include/lostio.h b/src/modules/include/lostio.h
> index 4df497f..5aa580c 100644
> --- a/src/modules/include/lostio.h
> +++ b/src/modules/include/lostio.h
> @@ -196,11 +196,11 @@ io_resource_t* lio_compat_open(const char* filename, uint8_t attr);
>  int lio_compat_close(io_resource_t* io_res);
>  
>  /// Von einem Stream lesen
> -size_t lio_compat_read(void* dest, size_t blocksize, size_t blockcount,
> +ssize_t lio_compat_read(void* dest, size_t blocksize, size_t blockcount,
>      io_resource_t* io_res);
>  
>  /// In einen Stream schreiben
> -size_t lio_compat_write(const void* src, size_t blocksize, size_t blockcount,
> +ssize_t lio_compat_write(const void* src, size_t blocksize, size_t blockcount,
>      io_resource_t* io_res);
>  
>  /// Prueft, ob das Ende des Streams erreicht ist
> diff --git a/src/modules/lib/lostio/client/file.c b/src/modules/lib/lostio/client/file.c
> index 3b789b4..142de7d 100644
> --- a/src/modules/lib/lostio/client/file.c
> +++ b/src/modules/lib/lostio/client/file.c
> @@ -98,9 +98,16 @@ int lio_compat_close(io_resource_t* io_res)
>      return result;
>  }
>  
> -size_t lio_compat_read(void* dest, size_t blocksize, size_t blockcount,
> +/**
> + * Liest aus einer Ressource
> + *
> + * @return Anzahl gelesener Bytes; 0 bei Dateiende; negativ im Fehlerfall.
> + */

Den Kommentar hier eventuell noch in den Header übernehmen?

> +ssize_t lio_compat_read(void* dest, size_t blocksize, size_t blockcount,
>      io_resource_t* io_res)
>  {
> +    size_t size;
> +
>      io_read_request_t read_request = {
>          .id         = io_res->id,
>          .blocksize  = blocksize,
> @@ -115,7 +122,7 @@ size_t lio_compat_read(void* dest, size_t blocksize, size_t blockcount,
>  
>          response_t* resp = rpc_get_response(io_res->pid, "IO_READ ",
>              sizeof(read_request), (char*) &(read_request));
> -        size_t size = *((size_t*) resp->data);
> +        size = *((size_t*) resp->data);
>  
>          // Wenn zuviele Daten gekommen sind, wird nur der notwendige Teil
>          // kopiert.
> @@ -127,14 +134,12 @@ size_t lio_compat_read(void* dest, size_t blocksize, size_t blockcount,
>  
>          free(resp->data);
>          free(resp);
> -
> -        return size;
>      } else {
>          read_request.shared_mem_id = 0;
>  
>          response_t* resp = rpc_get_response(io_res->pid, "IO_READ ",
>              sizeof(read_request), (char*) &(read_request));
> -        size_t size = resp->data_length;
> +        size = resp->data_length;
>  
>          // Wenn zuviele Daten gekommen sind, wird nur der notwendige Teil
>          // kopiert.
> @@ -145,12 +150,21 @@ size_t lio_compat_read(void* dest, size_t blocksize, size_t blockcount,
>  
>          free(resp->data);
>          free(resp);
> +    }
>  
> -        return size;
> +    // EOF ist Rückgabewert 0, Fehler sind negativ
> +    if (size == 0  && !lio_compat_eof(io_res)) {
> +        return -1;
>      }
> +    return size;
>  }
>  
> -size_t lio_compat_write(const void* src, size_t blocksize, size_t blockcount,
> +/**
> + * Schreibt in eine Ressource
> + *
> + * @return Anzahl geschriebener Bytes; negativ im Fehlerfall.
> + */

Dito

> +ssize_t lio_compat_write(const void* src, size_t blocksize, size_t blockcount,
>      io_resource_t* io_res)
>  {
>      size_t data_size = blockcount * blocksize;
> @@ -184,6 +198,11 @@ size_t lio_compat_write(const void* src, size_t blocksize, size_t blockcount,
>      if (data_size >= 1024) {
>          close_shared_memory(write_request->shared_mem_id);
>      }
> +
> +    // Rückgabewert für Fehler ist -1
> +    if (resp == 0) {
> +        return -1;
> +    }
>      return resp;
>  }

In fread() sollte man wohl zumindest aus kosmetischen Gründen (ich hoffe
bis jemand das Userland auf amd64 laufen hat, ist lostio1 weg ;-)) den
Typen der ret-Variable noch anpassen, wobei der auch jetzt schon
korrekter ist, als vor dem Patch. ;-)

Ansonsten:
Acked-by: Antoine Kaufmann <toni@xxxxxxxxxx>

-- 
Antoine Kaufmann
<toni@xxxxxxxxxxxxxxxx>

Attachment: signature.asc
Description: Digital signature