Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 19 Jun 2000 00:10:13 -0600
From:      Warner Losh <imp@village.org>
To:        audit@freebsd.org
Subject:   Comments?
Message-ID:  <200006190610.AAA54148@harmony.village.org>

next in thread | raw e-mail | index | archive | help

What do you think of the following patch?  It makes dump use wall
rather than writing to the ttys directly.  This means we can remove
setgid tty for dump finally.  It is from OpenBSD from 1996(!).  I've
wanted to include it since then, but only now have been able to
actually do so.  It also saves errno accross interrupts, which is a
hunk of another change, but seemed useful.  There are also two white
space changes to reduce the number of trivial differences between this
and OpenBSD.

I've not extensively tested this, but my simple tests show this works.

comments?

Warner

Index: Makefile
===================================================================
RCS file: /home/imp/FreeBSD/CVS/src/sbin/dump/Makefile,v
retrieving revision 1.12
diff -u -r1.12 Makefile
--- Makefile	2000/02/24 21:01:49	1.12
+++ Makefile	2000/06/19 05:54:57
@@ -18,8 +18,6 @@
 CFLAGS+=-DRDUMP
 CFLAGS+=-I${.CURDIR}/../../libexec/rlogind
 SRCS=	itime.c main.c optr.c dumprmt.c tape.c traverse.c unctime.c
-BINGRP=	tty
-BINMODE=2555
 MAN8=	dump.8
 MLINKS+=dump.8 rdump.8
 
Index: main.c
===================================================================
RCS file: /home/imp/FreeBSD/CVS/src/sbin/dump/main.c,v
retrieving revision 1.21
diff -u -r1.21 main.c
--- main.c	2000/04/02 10:16:38	1.21
+++ main.c	2000/06/19 06:05:48
@@ -285,7 +285,6 @@
 	if (signal(SIGINT, interrupt) == SIG_IGN)
 		signal(SIGINT, SIG_IGN);
 
-	set_operators();	/* /etc/group snarfed */
 	getfstab();		/* /etc/fstab snarfed */
 	/*
 	 *	disk can be either the full special file name,
Index: optr.c
===================================================================
RCS file: /home/imp/FreeBSD/CVS/src/sbin/dump/optr.c,v
retrieving revision 1.10
diff -u -r1.10 optr.c
--- optr.c	2000/04/02 10:16:40	1.10
+++ optr.c	2000/06/19 06:01:36
@@ -58,7 +58,6 @@
 
 void	alarmcatch __P((/* int, int */));
 int	datesort __P((const void *, const void *));
-static	void sendmes __P((char *, char *));
 
 /*
  *	Query the operator; This previously-fascist piece of code
@@ -116,7 +115,7 @@
 	return(back);
 }
 
-char lastmsg[100];
+char lastmsg[BUFSIZ];
 
 /*
  *	Alert the console operator, and enable the alarm clock to
@@ -125,6 +124,8 @@
 void
 alarmcatch()
 {
+	int save_errno = errno;
+
 	if (notify == 0) {
 		if (timeout == 0)
 			(void) fprintf(stderr,
@@ -143,6 +144,7 @@
 	signal(SIGALRM, alarmcatch);
 	(void) alarm(120);
 	timeout = 1;
+	errno = save_errno;
 }
 
 /*
@@ -157,131 +159,34 @@
 		dumpabort(0);
 }
 
-/*
- *	The following variables and routines manage alerting
- *	operators to the status of dump.
- *	This works much like wall(1) does.
- */
-struct	group *gp;
-
 /*
- *	Get the names from the group entry "operator" to notify.
+ *	We now use wall(1) to do the actual broadcasting.
  */
 void
-set_operators()
-{
-	if (!notify)		/*not going to notify*/
-		return;
-	gp = getgrnam(OPGRENT);
-	(void) endgrent();
-	if (gp == NULL) {
-		msg("No group entry for %s.\n", OPGRENT);
-		notify = 0;
-		return;
-	}
-}
-
-struct tm *localclock;
-
-/*
- *	We fork a child to do the actual broadcasting, so
- *	that the process control groups are not messed up
- */
-void
 broadcast(message)
 	char	*message;
 {
-	time_t		clock;
-	FILE	*f_utmp;
-	struct	utmp	utmp;
-	char	**np;
-	int	pid, s;
+	FILE *fp;
+	char buf[sizeof(_PATH_WALL) + sizeof(OPGRENT) + 3];
 
-	if (!notify || gp == NULL)
+	if (!notify)
 		return;
 
-	switch (pid = fork()) {
-	case -1:
+	(void)snprintf(buf, sizeof(buf), "%s -g %s", _PATH_WALL, OPGRENT);
+	if ((fp = popen(buf, "w")) == NULL)
 		return;
-	case 0:
-		break;
-	default:
-		while (wait(&s) != pid)
-			continue;
-		return;
-	}
 
-	clock = time((time_t *)0);
-	localclock = localtime(&clock);
-
-	if ((f_utmp = fopen(_PATH_UTMP, "r")) == NULL) {
-		msg("Cannot open %s: %s\n", _PATH_UTMP, strerror(errno));
-		return;
-	}
-
-	while (!feof(f_utmp)) {
-		if (fread((char *) &utmp, sizeof (struct utmp), 1, f_utmp) != 1)
-			break;
-		if (utmp.ut_name[0] == 0)
-			continue;
-		for (np = gp->gr_mem; *np; np++) {
-			if (strncmp(*np, utmp.ut_name, sizeof(utmp.ut_name)) != 0)
-				continue;
-			/*
-			 *	Do not send messages to operators on dialups
-			 */
-			if (strncmp(utmp.ut_line, DIALUP, strlen(DIALUP)) == 0)
-				continue;
-#ifdef DEBUG
-			msg("Message to %s at %s\n", *np, utmp.ut_line);
-#endif
-			sendmes(utmp.ut_line, message);
-		}
-	}
-	(void) fclose(f_utmp);
-	Exit(0);	/* the wait in this same routine will catch this */
-	/* NOTREACHED */
-}
+	(void) fputs("\7\7\7Message from the dump program to all operators\n\nDUMP: NEEDS ATTENTION: ", fp);
+	if (lastmsg[0])
+		(void) fputs(lastmsg, fp);
+	if (message[0])
+		(void) fputs(message, fp);
 
-static void
-sendmes(tty, message)
-	char *tty, *message;
-{
-	char t[MAXPATHLEN], buf[BUFSIZ];
-	register char *cp;
-	int lmsg = 1;
-	FILE *f_tty;
-
-	(void) strcpy(t, _PATH_DEV);
-	(void) strncat(t, tty, sizeof t - strlen(_PATH_DEV) - 1);
-
-	if ((f_tty = fopen(t, "w")) != NULL) {
-		setbuf(f_tty, buf);
-		(void) fprintf(f_tty,
-		    "\n\
-\7\7\7Message from the dump program to all operators at %d:%02d ...\r\n\n\
-DUMP: NEEDS ATTENTION: ",
-		    localclock->tm_hour, localclock->tm_min);
-		for (cp = lastmsg; ; cp++) {
-			if (*cp == '\0') {
-				if (lmsg) {
-					cp = message;
-					if (*cp == '\0')
-						break;
-					lmsg = 0;
-				} else
-					break;
-			}
-			if (*cp == '\n')
-				(void) putc('\r', f_tty);
-			(void) putc(*cp, f_tty);
-		}
-		(void) fclose(f_tty);
-	}
+	(void) pclose(fp);
 }
 
 /*
- *	print out an estimate of the amount of time left to do the dump
+ *	Print out an estimate of the amount of time left to do the dump
  */
 
 time_t	tschedule = 0;
@@ -389,7 +294,7 @@
 {
 	register struct fstab *new;
 
-	new = (struct fstab *)malloc(sizeof (*fs));
+	new = (struct fstab *)malloc(sizeof(*fs));
 	if (new == NULL ||
 	    (new->fs_file = strdup(fs->fs_file)) == NULL ||
 	    (new->fs_type = strdup(fs->fs_type)) == NULL ||
@@ -424,7 +329,7 @@
 		    strcmp(fs->fs_type, FSTAB_RQ))
 			continue;
 		fs = allocfsent(fs);
-		if ((pf = (struct pfstab *)malloc(sizeof (*pf))) == NULL)
+		if ((pf = (struct pfstab *)malloc(sizeof(*pf))) == NULL)
 			quit("%s\n", strerror(errno));
 		pf->pf_fstab = fs;
 		pf->pf_next = table;
Index: pathnames.h
===================================================================
RCS file: /home/imp/FreeBSD/CVS/src/sbin/dump/pathnames.h,v
retrieving revision 1.5
diff -u -r1.5 pathnames.h
--- pathnames.h	1998/09/22 10:05:17	1.5
+++ pathnames.h	2000/06/19 05:54:17
@@ -40,3 +40,4 @@
 #define	_PATH_DUMPDATES	"/etc/dumpdates"
 #define	_PATH_LOCK	"/tmp/dumplockXXXXXX"
 #define	_PATH_RMT	"/etc/rmt"		/* path on remote host */
+#define _PATH_WALL	"/usr/bin/wall"


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-audit" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200006190610.AAA54148>