/*
* announce - sits listening on a port, and whenever anyone connects
* announces a message and disconnects them
*
* Usage: announce [port] < message_file
*
* Author: Lawrence Brown <lpb@cs.adfa.oz.au> Aug 90
*
* Bits of code are adapted from the Berkeley telnetd sources
*/
#define PORT 4201
#include "os.h"
extern char **environ;
char *Name; /* name of this program for error messages */
char msg[2048];
int main (int argc, char **argv)
{
SOCKET s, ns;
int foo;
static struct sockaddr_in sin;
char *host;
char tmp[80];
long ct;
WIN32STARTUP
sin.sin_family = AF_INET;
Name = argv[0]; /* save name of program for error messages */
sin.sin_port = htons ((u_short) PORT); /* Assume PORT */
argc--, argv++;
if (argc > 0) { /* unless specified on command-line */
sin.sin_port = atoi (*argv);
sin.sin_port = htons ((u_short) sin.sin_port);
}
strcpy (msg, "");
strcpy (tmp, "");
while (1) {
if ((gets (tmp)) == NULL)
break;
strcat (tmp, "\r\n");
strcat (msg, tmp);
}
msg[2047] = '\0';
#ifndef WIN32
signal (SIGHUP, SIG_IGN); /* get socket, bind port to it */
#endif
s = socket (AF_INET, SOCK_STREAM, 0);
if (s == INVALID_SOCKET) {
perror ("announce: socket");;
WIN32CLEANUP
exit (1);
}
if (bind (s, (struct sockaddr *) &sin, sizeof sin) < 0) {
perror ("bind");
WIN32CLEANUP
exit (1);
}
#ifndef WIN32
if ((foo = fork ()) != 0) {
fprintf (stderr, "announce: pid %d running on port %d\n", foo,
ntohs ((u_short) sin.sin_port));
exit (0);
} else {
setpriority (PRIO_PROCESS, getpid (), 10);
}
#endif
if (listen (s, 1) == SOCKET_ERROR) { /* start listening on port */
perror ("announce: listen");
WIN32CLEANUP
exit (1);
}
foo = sizeof sin;
for (;;) { /* loop forever, accepting requests & printing msg */
ns = accept (s, (struct sockaddr *) &sin, &foo);
if (ns == INVALID_SOCKET) {
perror ("announce: accept");
exit (1);
}
host = inet_ntoa (sin.sin_addr);
ct = time (0L);
fprintf (stderr, "CONNECTION made from %s at %s", host, ctime (&ct));
send (ns, msg, strlen (msg), 0);
#ifdef WIN32
Sleep (5000);
#else
sleep (5);
#endif
close (ns);
}
WIN32CLEANUP
return 0;
} /* main */