/*
 * notify_input.c -- use notify_set_input_func to monitor the state of
 * a file.  The notifier is running and checking the file descriptors
 * of the opened files associated with the command line args.  The
 * routine installed by notify_set_input_func() is called whenever
 * there is data to be read.  When there is no more data to be read
 * for that file, the input function is unregistered.  When all files
 * have been read, notify_start() returns and the program exits.
 */
#include <stdio.h>
#ifdef SVR4
#include <sys/stat.h>
#else
#include <sys/ioctl.h>
#endif /* SVR4 */
#include <xview/notify.h>

main(argc, argv)
char *argv[];
{
    Notify_value   read_it();
    Notify_client  client = (Notify_client)10101; /* arbitrary */
    FILE           *fp;

    while (*++argv)
        if (!(fp = fopen(*argv, "r")))
            perror(*argv);
        else {
            (void) notify_set_input_func(client, read_it, fileno(fp));
            client++; /* next client is new/unique */
        }

    /* loops continuously */
    notify_start();
}

/*
 * read_it() is called whenever there is input to be read.  Actually,
 * it's called continuously, so check to see if there is input to be
 * read first.
 */
Notify_value
read_it(client, fd)
Notify_client   client;
int fd;
{
    char buf[BUFSIZ];
    int bytes, i;

    if ((bytes = input_available(fd)) < 1)
        (void) notify_set_input_func(client, NOTIFY_FUNC_NULL, fd);
    else
        do
            if ((i = read(fd, buf, sizeof buf)) > 0)
                (void) write(1, buf, i);
        while (i > 0 && (bytes -= i) > 0);
    return NOTIFY_DONE;
}

int input_available(fd)
int fd;
{
 
   int bytes = -1;
 
#ifdef SVR4
   struct stat statbuf;
   int retval;
 
   if ( ( retval = fstat( fd, &statbuf ) ) >= 0 ) {
      if ( S_ISREG( statbuf.st_mode ) ) {
         if ( ( retval = lseek( fd, 0, SEEK_CUR ) ) >= 0 )
            bytes = statbuf.st_size - retval;
      }  
   }
#else
   if (ioctl(fd, FIONREAD, &bytes) == -1 || bytes == 0)
      bytes = -1;
#endif
 
   return( bytes );
}
