DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T f

⟦ec991394f⟧ TextFile

    Length: 4179 (0x1053)
    Types: TextFile
    Names: »flagmail.c«

Derivation

└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
    └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« 
        └─⟦e5a54fb17⟧ 
            └─⟦this⟧ »pp-5.0/Uip/rcvalert/flagmail.c« 

TextFile

/* client.c: client for alert program */

# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Uip/rcvalert/RCS/flagmail.c,v 5.0 90/09/20 16:33:42 pp Exp Locker: pp $";
# endif

/*
 * $Header: /cs/research/pp/hubris/pp-beta/Uip/rcvalert/RCS/flagmail.c,v 5.0 90/09/20 16:33:42 pp Exp Locker: pp $
 *
 * $Log:	flagmail.c,v $
 * Revision 5.0  90/09/20  16:33:42  pp
 * rcsforce : 5.0 public release
 * 
 */



#include <stdio.h>
#include <isode/manifest.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/time.h>
#include <pwd.h>
#include <ctype.h>

#include "data.h"

char	displayline[BUFSIZ];
char	username[40];
char	hostname[BUFSIZ];
char	homedir[512];
char	*filename = ".alert";
char	*extra = "NEW: ";
char	*format = "%extra(%size) %20from %subject << %50body";
int	width = 80;
int	debug = 0;
int	theport = 0;

char	*myname;

extern char	*index ();

main (argc, argv)
int	argc;
char	*argv[];
{
	extern char	*optarg;
	extern int	optind;
	int	opt;
	int	size = 0;

	myname = argv[0];
	while((opt = getopt(argc, argv, "de:f:h:p:s:w:")) != EOF)
		switch (opt) {
		    case 'e':
			extra = optarg;
			break;

		    case 'f':
			format = optarg;
			break;

		    case 'd':
			debug = 1;
			break;

		    case 'h':
			filename = optarg;
			break;

		    case 's':
			size = atoi (optarg);
			break;

		    case 'p':
			theport = atoi (optarg);
			break;

		    case 'w':
			width = atoi (optarg);
			break;

		    default:
			fprintf (stderr, "Usage: %s [options]\n",
				 myname);
			break;
		}
	argc -= optind;
	argv += optind;

	init_stuff ();
	
	parse_msg (displayline, format, width, size, extra);

	if (debug == 0 && fork () > 0)
		exit (1);
	if (notify_x () == 0)
		(void) notify_normal (displayline, username);
	exit (1);
}

init_stuff ()
{
	struct passwd *pwd;
	char	*cp, *getenv ();

	if ((pwd = getpwuid (getuid())) == NULL) {
		fprintf (stderr, "No user name\n");
		exit(-1);
	}

	(void) strcpy (username, pwd -> pw_name);
	if ((cp = getenv ("HOME")) != NULL && *cp)
		(void) strcpy (homedir, cp);
	else
		(void) strcpy (homedir, pwd -> pw_dir);
}


notify_x ()
{
	struct data data;
	struct sockaddr_in sin;
	struct hostent *hp;
	int	i;
	int	sd;
	
	if (!findhost(hostname))
		return 0;

	if ((sd = socket (AF_INET, SOCK_DGRAM, 0)) < 0) {
		perror ("socket");
		exit (1);
	}

	bzero ((char *)&sin, sizeof sin);

	sin.sin_family = AF_INET;
	sin.sin_port = htons (theport);

	bzero ((char *)&data, sizeof data);
	data.refid = htonl(getpid ());
	(void) strcpy (data.user, username);
	(void) strncpy (data.data, displayline, sizeof (data.data) - 1);
	data.data[sizeof data.data - 1] = 0;
	if ((hp = gethostbyname (hostname)) == NULL) {
		fprintf (stderr, "No such host %s\n", hostname);
		return 0;
	}
	bcopy (hp -> h_addr, (char *)&sin.sin_addr, hp -> h_length);
	for (i = 0; i < N_RETRYS; i++) {
		if (sendto (sd, (char *)&data, sizeof data, 0,
			    (struct sockaddr *)&sin, sizeof sin) < 0)
			perror ("sendto");

		if (replys (sd))
			return 1;
	}
	return 0;
}

replys (sd)
int	sd;
{
	fd_set rfds;
	char	buffer[20];
	struct timeval timer;
	struct sockaddr_in nsin;
	int	len;

	timer.tv_usec = 0;
	timer.tv_sec = 10;
	FD_ZERO (&rfds);
	FD_SET (sd, &rfds);

	if (select (sd + 1, &rfds, NULLFD, NULLFD, &timer) <= 0)
		return 0;

	if (FD_ISSET (sd, &rfds)) {
		len = sizeof nsin;

		if (recvfrom (sd, buffer, 3, 0,
			      (struct sockaddr *)&nsin, &len) < 0)
			perror ("recvfrom");
		return 1;
	}
	return 0;
}

findhost (host)
char	*host;
{
	FILE	*fp;
	char	*cp;
	char	buf[BUFSIZ];

	if (*filename == '/' || strncmp (filename, "./", 2) == 0 ||
	    strncmp (filename, "../", 3) == 0)
		(void) strcpy (buf, filename);
	else
		(void) sprintf (buf, "%s/%s", homedir, filename);

	if ((fp = fopen (buf, "r")) == NULL &&
	    (fp = fopen (filename, "r")) == NULL)
		return 0;

	if (fgets (host, BUFSIZ, fp) == NULL) {
		(void) fclose (fp);
		return 0;
	}
	(void) fclose (fp);
	if (cp = index (hostname, '\n'))
		*cp = '\0';
	if (cp = index (hostname, ' ')) {
		*cp++ = '\0';
		if (theport == 0)
			theport = htons (atoi (cp));
	}

	if (theport == 0) {
		fprintf (stderr, "No port!\n");
		return 0;
	}
		
	return 1;
}