#include <stdio.h>

#include "AFS.h"
#include <afs/afs.h>

#define MAXACL 256

int
main(int argc, char **argv)
{
  struct ViceIoctl parms;
  char acl[MAXACL];
  int rights;

#ifndef pigs_had_wings
  fprintf(stderr, "Warning: This an example program similar to fs setacl -clear\n");
  fprintf(stderr, "Use only on test directories!\n");
#endif

  if (argc != 4)
    {
      fprintf(stderr, "Usage: setacl dir user rights\n");
      exit(1);
    }

  {
    char *t = argv[3];
    rights = 0;
    for (; *t; t++)
      switch (*t) {
      case 'r':
	rights |= PRSFS_READ;
	break;
      case 'w':
	rights |= PRSFS_WRITE;
	break;
      case 'i':
	rights |= PRSFS_INSERT;
	break;
      case 'l':
	rights |= PRSFS_LOOKUP;
	break;
      case 'd':
	rights |= PRSFS_DELETE;
	break;
      case 'k':
	rights |= PRSFS_LOCK;
	break;
      case 'a':
	rights |= PRSFS_ADMINISTER;
	break;
      default:
	fprintf(stderr, "illegal right '%c'\n", *t);
	exit(1);
	break;
      }
  }

  parms.out = 0;
  parms.out_size = 0;
  parms.in = acl;
  parms.in_size = MAXACL;
  sprintf(acl,
	  "%d\n%d\n"		/* header */
	  "%s\t%d\n",		/* acl pair */
	  1,			/* 1 positive entry */
	  0,			/* no negative entries */
	  argv[2],
	  rights);
  
  if (pioctl(argv[1], VIOCSETAL, &parms, 1) == -1)
    {
      perror("pioctl failed");
      exit(1);
    }
  
  if (pioctl(argv[1], VIOCSETAL, &parms, 1) == -1)
    {
      perror("pioctl failed");
      exit(1);
    }
  exit(0);
}

#if 0
/* ktc_ForgetAllTokens()
 * syscall(number=31, a0=20, path=0x0, cmd=-2146675179, data=0xf7fff6c4, a4=0, a5=0, a6=0)
 */

int
syscall(int number, int a0, char* path, int cmd, struct ViceIoctl *data, int a4, int a5, int a6)
{
  asm("t 0");
}
#else

int
dummy(int a, int b, int c, int d, int e, int f)
{
  return a+b+c+d+e+f;
}


Xktc_ForgetAllTokens()
{
  struct ViceIoctl parms;
  bzero(&parms, sizeof(parms));
  syscall(AFS_SYSCALL, AFSCALL_PIOCTL, 0, -2146675179, &parms);
}

Xsetpag()
{
  syscall(AFS_SYSCALL, AFSCALL_SETPAG);
}

#endif
