/*
* LED biff for X
* blinks scroll lock LED when new mail
*
* version 1.0
*
*/

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <signal.h>
#include <X11/X.h>
#include <X11/Xlib.h>

#define FALSE 0
#define TRUE 1

#define SCRL_LED 3
#define SLEEPTIME 10

Display *dpy;

char mbox_name[50];

int mbox_size, mbox_flag, read_since_last_write;


void set_led(int mode)
{
       XKeyboardControl kbd;

       kbd.led = SCRL_LED;
       kbd.led_mode = mode;

       XChangeKeyboardControl(dpy, KBLed | KBLedMode, &kbd);
       XFlush(dpy);
}


void blink(void)
{
       int i;

       for (i = 0; i < SLEEPTIME; i++) {
               set_led(LedModeOn);
               usleep(500000);
               set_led(LedModeOff);
               usleep(500000);
       }
}


int check_mailbox(void)
{
       struct stat st;
       int i, n;

       if (stat (mbox_name, &st) == 0) {
               mbox_size = st.st_size;
               read_since_last_write = (st.st_atime > st.st_mtime);
       }

       if (mbox_size == 0)
               return FALSE;
       else if (read_since_last_write)
               return FALSE;
       else
               return TRUE;
}


void cleanup(int sig)
{
       XCloseDisplay(dpy);
       raise(sig);
}


void init(void)
{
       char *p;

       if (! (p = getenv("MAIL"))) {
               printf("Error: environment variable MAIL not set.\n");
               exit(1);
       }
       strcpy(mbox_name, p);
       signal(SIGTERM, cleanup);
       dpy = XOpenDisplay(NULL);
       set_led(LedModeOff);
}


void main(void)
{
       init();
       while (1) {
               if (check_mailbox())
                       blink();
               else
                       sleep(SLEEPTIME);
       }
}