|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T f
Length: 4179 (0x1053)
Types: TextFile
Names: »flagmail.c«
└─⟦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«
/* 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;
}