V10/cmd/nupas/send/notify.c

Compare this file to the similar file:
Show the results in this format:

#include <signal.h>
#include "mail.h"
#include "string.h"
#include "message.h"
#include <sys/stat.h>
#include <utmp.h>

SIGRETURN
ding(s)
	int s;
{
	signal(SIGALRM, ding);
}

/* output message to one terminal */
static void
tell(dev, sender, date)
	char *dev, *sender, *date;
{
	int fd;
	static string *msg=NULL;

	signal(SIGALRM, ding);
	alarm(30);
	if((fd = open(dev, 1))<0)
		return;
	if(msg==NULL)
		msg=s_new();
	s_append(s_restart(msg), "[\007From ");
	s_append(msg, sender);
	s_append(msg, " ");
	s_append(msg, date);
	s_append(msg, "\007]\n");
	write(fd, s_to_c(msg), strlen(s_to_c(msg)));
	alarm(0);
	close(fd);
}

/* loop through all logins */
notify(user, mp)
	char *user;
	message *mp;
{
	int fd;
	struct utmp u;
	char dev[128];
	struct stat sbuf;

	if((fd=open("/etc/utmp", 0))<0)
		return;
	while(read(fd, (char *)&u, sizeof(u))==sizeof(u)) {
		if (strncmp(u.ut_name, user, sizeof(u.ut_name))!=0)
			continue;
		strcpy(dev, "/dev/");
		strncat(dev, u.ut_line, sizeof(u.ut_line));
		dev[sizeof(u.ut_line)+sizeof("/dev/")-1] = '\0';
		if (stat(dev, &sbuf)<0)
			continue;
		if (sbuf.st_mode&S_IEXEC)
			tell(dev, s_to_c(mp->sender), s_to_c(mp->date));
	}
	close(fd);
}