
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

void complain(char *cause)
{
  perror(cause);
  exit(1);
}

void usage(char *progname)
{
  fprintf(stderr, "Usage:\t%s [-r] <filename>\n", progname);
  exit(1);
}

static int read_locking = 0;

int main(int ac, char *av[])
{
  int fd, retval, argi = 1;
  struct flock lk;
  if (ac < 2) usage(av[0]);
  if (! strcmp(av[argi], "-r")) read_locking = 1, argi++;
  if (ac - argi < 1) usage(av[0]);
  fd = open(av[argi], O_RDONLY);
  if (fd < 0) complain("open");
  lk.l_type = (read_locking ? F_RDLCK : F_WRLCK);
  lk.l_whence = SEEK_SET;
  lk.l_start = 0;
  lk.l_len = 0;
  retval = fcntl(fd, F_GETLK, &lk);
  if (retval < 0) complain("fcntl");
  printf("%s: type=%s, start=%d, pid=%d\n", av[argi],
	 ( lk.l_type==F_UNLCK ? "unlocked" :
	   lk.l_type==F_RDLCK ? "readlock" : "writelock" ),
	 lk.l_start, lk.l_pid);
}

