|
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; }