#include <sys/types.h>
#include <sys/socket.h>

#include <netinet/in.h>

#include <unistd.h>
#include <fcntl.h>
#include <curses.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define COLUMNS 80
#define GREETING "    -------{========[OOOOOOOO BSD BSD BSD BSD OOOOOOO]========}-------"
#define SPEED (5 * 10000)
#define DEF_MESSAGE	"OpenBSD 4.7, NetBSD 5.0.1, FreeBSD 8.0, DragonflyBSD 2.X, Darwin 10.9, to customize your own message here: echo \"message \" | nc -u 127.0.0.1 9999 from localhost!!!!! "

int
main(void)
{
	WINDOW *win;
	int i, len;
	int line, col;
	int so;
	int on = 1;
	int scroll = 79;
	int slen = sizeof(struct sockaddr_in);
	int flags;
	char buf[512];
	char *message = buf;
	char *pm = message;
	struct sockaddr_in sin;

	memset(buf, 0, sizeof(buf));
	strlcpy(buf, DEF_MESSAGE, sizeof(buf));

	so = socket(AF_INET, SOCK_DGRAM, 0);
	if (so < 0)  {
		perror("socket");
		exit(1);
	}	
	
	memset(&sin, 0, sizeof(sin));
	sin.sin_family = AF_INET;
	sin.sin_port = htons(9999);
	sin.sin_addr.s_addr = INADDR_ANY;

	if (bind(so, (struct sockaddr*)&sin, sizeof(sin)) < 0) {
		perror("bind");
		exit(1);
	}

	flags = fcntl(so, F_GETFL);
	flags |= O_NONBLOCK;
	fcntl(so, F_SETFL, flags);
	
	win = initscr();
	cbreak();
	noecho();

	box(win, '*', '*');
	refresh();

	col = 3;

	for (;;) {
		for (i = 1; i < (LINES - 1); i++) {
			if (i > 1) {
				wmove(win, i - 1, col);
				wprintw(win, "                                                                            ");
			}
			wmove(win, i, col);
			wprintw(win, GREETING);
			wmove(win, LINES - 1, scroll--);
			if (scroll == 0) {
				scroll = 1; 
				message++;

				if (message >= &pm[strlen(buf)]) {
					len = recvfrom(so, buf, sizeof(buf), 0, (struct sockaddr *)&sin, &slen);
					if (len > 0) 
						buf[len - 1] = '\0';
#if 0
					else 
						buf[0] = '\0';
#endif

					message = pm = buf;
					scroll = 79;
					wmove(win, LINES - 1, scroll);
					
				}
			}
			wprintw(win, message);
			wmove(win, 0, 0);
			refresh();
			usleep(SPEED);
		}

		for (i-- ;i > 1; i--) {
			wmove(win, i, col);
			wprintw(win, "                                                                           ");
			wmove(win, i - 1, col);
			wprintw(win, GREETING);
			wmove(win, LINES - 1, scroll--);
			if (scroll == 0) {
				scroll = 1;
				message++;

				if (message >= &pm[strlen(buf)]) {
					len = recvfrom(so, buf, sizeof(buf), 0, (struct sockaddr *)&sin, &slen);
					if (len > 0) 
						buf[len - 1] = '\0';

					message = pm = buf;

					scroll = 79;	
					wmove(win, LINES - 1, scroll);
				}
			}
			wprintw(win, message);
			wmove(win, 0, 0);
			refresh();
			usleep(SPEED);
		}
	}

	endwin();
}

