#include <stdio.h>

#include "AFS.h"

#define MAXACL 256

int
main(int argc, char **argv)
{
  struct ViceIoctl parms;
  char acl[MAXACL];
  char *p, *q;
  char name[MAXACL];
  int rights, i;
  int pos_entries;
  int neg_entries;

  if (argc != 2)
    {
      fprintf(stderr, "Usage: getacl dir\n");
      exit(1);
    }

  parms.out = acl;
  parms.out_size = MAXACL;
  parms.in = 0;
  parms.in_size = 0;
  if (pioctl(argv[1], VIOCGETAL, &parms, 1) == -1)
    {
      perror("pioctl failed");
      exit(1);
    }

  p = acl;
  sscanf(p,"%d\n%d\n",&pos_entries, &neg_entries);

  while(*p != '\n')
     p++;
  p++;

  printf("Positive entries\n");
  for(i=0; i<pos_entries; i++) {
     while(*p != '\n')
	p++;
     p++;
     sscanf(p,"%s\t%d\n",name,&rights);

     {
	char crights[8];	/* rwlidka is 7 characters */
	q = crights;

	if(rights & PRSFS_READ)
	   *q++ = 'r';
	if(rights & PRSFS_LOOKUP)
	   *q++ = 'l';
	if(rights & PRSFS_INSERT)
	   *q++ = 'i';
	if(rights & PRSFS_DELETE)
	   *q++ = 'd';
	if(rights & PRSFS_WRITE)
	   *q++ = 'w';
	if(rights & PRSFS_LOCK)
	   *q++ = 'k';
	if(rights & PRSFS_ADMINISTER)
	   *q++ = 'a';
	*q = '\0';

	printf("%s: %s\n", name, crights);
     }
  }

  printf("Negative entries\n");
  for(i=0; i<neg_entries; i++) {
     while(*p != '\n')
	p++;
     p++;
     sscanf(p,"%s\t%d\n",name,&rights);

     {
	char crights[8];	/* rlidwka is 7 characters */
	q = crights;

	if(rights & PRSFS_READ)
	   *q++ = 'r';
	if(rights & PRSFS_LOOKUP)
	   *q++ = 'l';
	if(rights & PRSFS_INSERT)
	   *q++ = 'i';
	if(rights & PRSFS_DELETE)
	   *q++ = 'd';
	if(rights & PRSFS_WRITE)
	   *q++ = 'w';
	if(rights & PRSFS_LOCK)
	   *q++ = 'k';
	if(rights & PRSFS_ADMINISTER)
	   *q++ = 'a';
	*q = '\0';

	printf("%s: %d %s\n", name, rights, crights);
     }
  }
  exit(0);
}
