#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc, char **argv)
{
  int fd,fdup;
  int flags,modus;

  if(argc<2)
    {
      fprintf(stderr,"Benutzung : %s datei \n",argv[0]);
      exit (0);
    }
  if(( fd = open(argv[1],O_RDONLY)) == -1)
    {
      fprintf(stderr,"Konnte %s nicht oeffnen!!!\n",argv[1]);
      exit (1);
    }

/*Wir Duplizieren den Filediskriptor mit dem Kommando F_DUPFD*/
  if((fdup=fcntl(fd,F_DUPFD,0)) != -1)
      fprintf(stdout,"Fildeskriptor erfolgreich dupliziert!!!\n");

/*Wir überprüfen die fdflags von fd und setzten falls nicht gesetzt FD_CLOEXEC*/
  if((fcntl(fd,F_GETFD,FD_CLOEXEC)) == 1)
      fprintf(stdout,"close-on-exec-Bit ist gesetzt!!!\n");
  else if((fcntl(fd,F_SETFD,FD_CLOEXEC)) <0)
      fprintf(stderr,"Konnte close-on-exec-Bit nicht setzen!!!\n");
  else
      fprintf(stdout,"close-on-exec-Bit wurde gesetzt!!!\n");

/*Wir überprüfen die file status flags von fd*/
  flags=fcntl(fd,F_GETFL,0);
  modus=flags & O_ACCMODE;
  if(modus==O_RDWR)
      fprintf(stdout,"Datei zum lesen und schreiben geöffnet!!\n");
  else if(modus==O_RDONLY)
      fprintf(stdout,"Datei nur zum lesen geöffnet!!\n");
  else if(modus==O_WRONLY)
      fprintf(stdout,"Datei nur zum schreiben geöffnet!!\n");

/*Wir überprüfen weitere statur flags von fd */
/* und ändern falls nötig die flags*/
  if(modus==O_APPEND)
      fprintf(stdout,"...wir können am Dateiende schreiben...\n");

  modus|=O_APPEND;
  if((fcntl(fd,F_SETFL,modus)) <0)
      fprintf(stdout,"...Konnte Attribut O_APPEND nicht setzen...\n");

  if(modus==O_APPEND)
      fprintf(stdout,"...O_APPEND gesetzt...\n");

  flags=fcntl(fd,F_GETFD,0);
  modus=flags & O_ACCMODE;
  if(modus==O_SYNC)
      fprintf(stdout,"...O_SYNC gesetzt...\n");
  else
    {
      modus|=O_SYNC;
      fcntl(fd,F_SETFL,modus);
      if(modus==O_SYNC)
          fprintf(stdout,"...O_SYNC gesetzt...\n");
      else
          fprintf(stdout,"...konnte O_SYNC nicht setzten...\n");
    }

  return 0;
}