#include <sys/types.h>
#include <stdio.h>
#include <strings.h>
#include <signal.h>
#include <sys/file.h>
#include <sys/time.h>
#include <pwd.h>
#include <errno.h>


struct passwd *getpwuid();
int sigcount = 0;
int errno;

setcount()
{
  sleep(2);
  signal(SIGFPE, setcount);
  ++sigcount; }

blpth(i)
  int i;
{
  write(2, "BLPTHTHTHTHTHTHTHTHTHTHT", i);
  write(2, "\n", 1);
  exit(i);
}

main(argc, argv)
  int argc;
  char **argv;
{
  char Uname[100], filename[16];
  int Iuid, Uuid, sfd, numsig, Unamelen, i, j;
  struct timeval tp;
  gettimeofday(&tp, (struct timezone *) NULL);
  srand(tp.tv_usec);
  if (argc != 4 || argv[3][2] != '\0' || strcmp("Waynesville", argv[2]))
    blpth(1);
  (void) open("carolina", O_RDONLY);
  if (errno != ENOENT)
    blpth(2);
  i = rand() % 1492;
  write(7, (char *) &i, sizeof(int));
  read(5, (char *) &j, sizeof(int));
  if (j != i*i)
    blpth(3);
  (void) open("carolina", O_RDONLY);
  if (errno != EACCES && errno != EPERM)
    blpth(4);
  Uuid = getuid();
  Iuid = geteuid();
  signal(SIGFPE, setcount);
  setuid(Uuid);
  sleep(7);
  sleep(7);
  if (sigcount != 2)
    blpth(5);
  signal(SIGFPE, SIG_DFL);
  (void) open("carolina", O_RDWR);
  if (errno != EISDIR)
    blpth(6);
  (void) sprintf(filename, "carolina/X%05d", rand() % 10000);
  write(7, filename, strlen(filename));
  read(5, Uname, 1);
  i = open(filename, O_RDONLY);
  if (i == -1)
    blpth(8);
  close(i);
  numsig = rand() % 4 + 10;
  kill(getppid(), numsig);
  read(5, (char *) &j, sizeof(int));
  if (numsig != j)
    blpth(9);
  (void) open(filename, O_RDWR);
  if (errno != ENOTDIR  && errno != ENOENT)
    blpth(10);
  if (read(5, Uname, 1))
    blpth(11);
  setuid(Iuid);
  if ((sfd=open("/unc/brock/home6/THE.list",O_WRONLY|O_APPEND,0644)) == -1) {
    printf("Open failed.  Send mail to brock.\n");
    exit(12); }
  strcpy(Uname, getpwuid(Uuid)->pw_name);
  Unamelen = strlen(Uname);
  Uname[Unamelen++] = '\n';
  if (write(sfd, Uname, Unamelen) == Unamelen) {
    printf("To THE.list is added %s", Uname);
    exit(0); }
  else {
    printf("Write failed.  Send mail to brock.\n");
    exit(13); } }
