#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>

#define FNAME "locki.lck"

void status(struct flock *lock)
{
  printf("Status: ");
  switch(lock->l_type)
    {
      case F_UNLCK: printf("F_UNLCK\n");  break;
      case F_RDLCK: printf("F_RDLCK (pid: %d)\n", lock->l_pid);  break;
      case F_WRLCK: printf("F_WRLCK (pid: %d)\n", lock->l_pid);  break;
      default     :   break;
    }
}


int main(int argc, char **argv)
{
  struct flock lock;
  int fd;
  char puffer[100];

  fd = open(FNAME, O_WRONLY|O_CREAT|O_APPEND);

  memset(&lock, 0, sizeof(struct flock));
  fcntl(fd, F_GETLK, &lock);

  if(lock.l_type==F_WRLCK || lock.l_type==F_RDLCK)
    {
      status(&lock);
      memset(&lock,0,sizeof(struct flock));
      lock.l_type = F_UNLCK;
      if (fcntl(fd, F_SETLK, &lock) < 0)
       printf("fcntl(fd, F_SETLK, F_UNLCK) failed (%s)\n",strerror(errno));
      else
       printf("fcntl(fd, F_SETLK, F_UNLCK) succeeded\n");
    }

  status(&lock);

  while((read(1,puffer,100))>1)
       write(fd,puffer,100);


  memset(&lock, 0, sizeof(struct flock));
  lock.l_type = F_WRLCK;
  lock.l_start=0;
  lock.l_whence = SEEK_SET;
  lock.l_len=0;
  lock.l_pid = getpid();
  if (fcntl(fd, F_SETLK, &lock) < 0)
    printf("fcntl(fd, F_SETLK, F_WRLCK) failed (%s)\n",strerror(errno));
  else
    printf("fcntl(fd, F_SETLK, F_WRLCK) succeeded\n");
  status(&lock);
  close(fd);
  return 0;
}