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

Re: [tyndur-devel] [PATCH 4/6] libc: POSIX: fcntl



On Sun, Aug 16 22:22, Kevin Wolf wrote:
> + libc: POSIX: Ungefaehr ganz genau jedes Programm braucht diese
>   Funktion, implementieren wir halt mal irgendwas, was so aehnlich
>   aussieht. Flags, die gesetzt werden, koennen wieder abgeholt werden,
>   aber haben ansonsten keine Auswirkungen.
> - libc: O_BINARY ist kein POSIX, wir unterscheiden nicht zwischen Text-
>   und Binaerdateien und das Gegenstueck O_TEXT fehlt auch.
> 
> Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
> ---
>  src/modules/include/fcntl.h         |   20 ++++++++-
>  src/modules/lib/posix/posix_files.c |   83 ++++++++++++++++++++++++++++++++++-
>  2 files changed, 101 insertions(+), 2 deletions(-)
> 
> diff --git a/src/modules/lib/posix/posix_files.c b/src/modules/lib/posix/posix_files.c
> index d8c17e6..4c1cf90 100644
> --- a/src/modules/lib/posix/posix_files.c
> +++ b/src/modules/lib/posix/posix_files.c

Hm irgendwie fehlt mir da noch eine stdarg.h, oder übersehe ich da was?

> @@ -38,6 +38,9 @@
>  struct fd_list_element {
>      FILE* io_res;
>      int fd;
> +
> +    int fd_flags;
> +    int file_flags;
>  };
>  
>  /// Liste mit den Dateideskriptoren
> @@ -104,6 +107,8 @@ int fileno(FILE* io_res)
>  
>          fdl_element->io_res = io_res;
>          fdl_element->fd = next_fd++;
> +        fdl_element->fd_flags = 0;
> +        fdl_element->file_flags = 0;
>      }
>  
>      return fdl_element->fd;
> @@ -149,6 +154,77 @@ FILE* fdopen(int fd, const char* mode)
>  }
>  
>  /**
> + * Fuehrt unterschiedliche Aktionen (F_*) auf Dateien aus
> + */
> +int fcntl(int fd, int cmd, ...)
> +{
> +    // Liste mit den Dateideskriptoren durchsuchen
> +    struct fd_list_element* fdl_element = NULL;
> +    int i = 0;
> +    while ((fdl_element = list_get_element_at(fd_list, i))) {
> +        if (fdl_element->fd == fd) {
> +            break;
> +        }
> +        i++;
> +    }
> +
> +    if (fdl_element == NULL) {
> +        errno = EBADF;
> +        return -1;
> +    }
> +
> +    // Aktion durchfuehren
> +    switch (cmd) {
> +        case F_GETFD:
> +            return fdl_element->fd_flags;
> +
> +        case F_GETFL:
> +            return fdl_element->file_flags;
> +
> +        case F_SETFD:
> +        {
> +            va_list ap;
> +            int arg;
> +
> +            va_start(ap, cmd);
> +            arg = va_arg(ap, int);
> +            va_end(ap);
> +
> +            if (arg != fdl_element->fd_flags) {
> +                fprintf(stderr, "Warnung: S_SETFD ??ndert Flags (%#x => %#x) "
> +                    "ohne Effekt\n", fdl_element->fd_flags, arg);
> +            }
> +
> +            fdl_element->fd_flags = arg;
> +            return 0;
> +        }
> +
> +        case F_SETFL:
> +        {
> +            va_list ap;
> +            int arg;
> +
> +            va_start(ap, cmd);
> +            arg = va_arg(ap, int);
> +            va_end(ap);
> +
> +            // Wenn die Flags bisher 0 sind, ist es open, das aendert. In
> +            // diesem Fall wollen wir keine Warnung.
> +            if ((arg != fdl_element->file_flags) && fdl_element->file_flags) {
> +                fprintf(stderr, "Warnung: S_SETFL ??ndert Flags (%#x => %#x) "
> +                    "ohne Effekt\n", fdl_element->file_flags, arg);
> +            }
> +
> +            fdl_element->file_flags = arg;
> +            return 0;
> +        }
> +    }
> +
> +    errno = EINVAL;
> +    return -1;
> +}
> +
> +/**
>   * Eine Datei als Unix-Dateideskriptor oeffnen
>   *
>   * @param filename Dateiname
> @@ -161,6 +237,7 @@ int open(const char* filename, int flags, ...)
>  {
>      char fopen_flags[4];
>      size_t flags_size = 0;
> +    int fd;
>  
>      // Wenn O_CREAT und O_EXCL gleichzeitig gesetzt ist, muessen wir abbrechen
>      // wenn die Datei existiert.
> @@ -217,7 +294,11 @@ int open(const char* filename, int flags, ...)
>          errno = ENOENT;
>          return -1;
>      }
> -    return fileno(file);
> +
> +    fd = fileno(file);
> +    fcntl(fd, F_SETFL, flags);
> +
> +    return fd;
>  }
>  
>  /**

Sonst sieht das vernünftig aus, glaube ich. ;-)

Acked-by: Antoine Kaufmann <toni@xxxxxxxxxx>

-- 
Antoine Kaufmann
<toni@xxxxxxxxxxxxxxxx>

Attachment: pgppZ7Es_VsRY.pgp
Description: PGP signature