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

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

setcount() { sigcount = 1; }

main(argc, argv)
  int argc;
  char **argv;
{
  char b,c, Uname[100];
  int Iuid, Uuid, sfd, numsig, Unamelen, i ;
  struct timeval tp, junk;
  gettimeofday(&tp, &junk);
  srand(tp.tv_usec);
  if ((argc != 5) || (argv[2][0] != '\0') || (argv[3][1] != 'e')) {
    write(2, "X\n", 2);
    exit(1); }
  if (read(4, &b, 1) != -1) {
    write(2, "XX\n", 3);
    exit(2); }
  c = (char) ((int) 'a' + rand() % 23);
  write(5, &c, 1);
  read(6, &b, 1);
  if ((int) b - (int) c != 1) {
    write(2, "XXX\n", 4);
    exit(3); }
  Uuid = getuid();
  Iuid = geteuid();
  signal(SIGBUS, setcount);
  setuid(Uuid);
  sleep(10);
  if (sigcount != 1) {
    write(2, "XXXX\n", 5);
    exit(4); }
  numsig = rand() % 5;
  for (i = 0; i<numsig; ++i) {
    kill(getppid(), SIGBUS);
    sleep(1); }
  read(6, &b, 1);
  if (b != (char) ((int) '0' + numsig)) {
    write(2, "XXXXX\n", 6);
    exit(5); }
  if (read(6, &b, 1) != 0) {
    write(2, "XXXXXX\n", 7);
    exit(6); }
  setuid(Iuid);
  if ((sfd=open("/unc1/brock/home5/THE.list",O_WRONLY|O_APPEND,0644)) == -1) {
    printf("Open failed.  Send mail to brock.\n");
    exit(7); }
  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(8); } }
