[PATCH 1/5] wall: remove global variables and support TMPDIR

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The TMPDIR environment is preferred over _PATH_TMP in which a
file is created that is ultimately sent to terminals. This patch
will also fix compiler warnings and removes magical numbers,
which has not explanation.

Signed-off-by: Sami Kerola <kerolasa@xxxxxx>
---
 term-utils/wall.c |   74 +++++++++++++++++++++++++++++++++-------------------
 1 files changed, 47 insertions(+), 27 deletions(-)

diff --git a/term-utils/wall.c b/term-utils/wall.c
index bc2e382..eb7cd7f 100644
--- a/term-utils/wall.c
+++ b/term-utils/wall.c
@@ -66,8 +66,6 @@
 #include "carefulputc.h"
 #include "c.h"
 
-void	makemsg __P((char *));
-
 #define	IGNOREUSER	"sleeper"
 
 #ifndef MAXHOSTNAMELEN
@@ -78,9 +76,8 @@ void	makemsg __P((char *));
 # endif
 #endif
 
-int nobanner;
-int mbufsize;
-char *mbuf;
+/* Function prototypes */
+char *makemsg(char *fname, size_t *mbufsize, int print_banner);
 
 static void __attribute__((__noreturn__)) usage(void)
 {
@@ -96,16 +93,19 @@ main(int argc, char **argv) {
 	struct utmp *utmpptr;
 	char *p;
 	char line[sizeof(utmpptr->ut_line) + 1];
+	int print_banner = TRUE;
+	char *mbuf;
+	size_t mbufsize;
 
 	setlocale(LC_ALL, "");
-        bindtextdomain(PACKAGE, LOCALEDIR);
-        textdomain(PACKAGE);
+	bindtextdomain(PACKAGE, LOCALEDIR);
+	textdomain(PACKAGE);
 
 	while ((ch = getopt(argc, argv, "n")) != -1) {
 		switch (ch) {
 		case 'n':
 			if (geteuid() == 0)
-				nobanner = 1;
+				print_banner = FALSE;
 			break;
 		case '?':
 		default:
@@ -117,9 +117,7 @@ main(int argc, char **argv) {
 	if (argc > 1)
 		usage();
 
-	makemsg(*argv);
-
-	setutent();
+	mbuf = makemsg(*argv, &mbufsize, print_banner);
 
 	iov.iov_base = mbuf;
 	iov.iov_len = mbufsize;
@@ -144,12 +142,12 @@ main(int argc, char **argv) {
 			warnx("%s", p);
 	}
 	endutent();
+	free(mbuf);
 	exit(EXIT_SUCCESS);
 }
 
-void
-makemsg(fname)
-	char *fname;
+char *
+makemsg(char *fname, size_t *mainmbufsize, int print_banner)
 {
 	register int ch, cnt;
 	struct tm *lt;
@@ -158,24 +156,39 @@ makemsg(fname)
 	time_t now;
 	FILE *fp;
 	int fd;
-	char *p, *whom, *where, hostname[MAXHOSTNAMELEN],
-		lbuf[MAXHOSTNAMELEN + 320],
-		tmpname[sizeof(_PATH_TMP) + 20];
+	char *p, *whom, *where, *hostname, *lbuf, *tmpname, *tmpenv, *mbuf;
+	size_t mbufsize;
+	long line_max;
 
-	sprintf(tmpname, "%s/wall.XXXXXX", _PATH_TMP);
-	if (!(fd = mkstemp(tmpname)) || !(fp = fdopen(fd, "r+")))
-		errx(EXIT_FAILURE, _("can't open temporary file"));
+	hostname = xmalloc(sysconf(_SC_HOST_NAME_MAX) + 1);
+	line_max = sysconf(_SC_LINE_MAX);
+	lbuf = xmalloc(line_max);
 
+	tmpname = xmalloc(PATH_MAX);
+	tmpenv = getenv("TMPDIR");
+	if ((tmpenv))
+		snprintf(tmpname, PATH_MAX, "%s/%s.XXXXXX", tmpenv,
+			program_invocation_short_name);
+	else
+		snprintf(tmpname, PATH_MAX, "%s/%s.XXXXXX", _PATH_TMP,
+			program_invocation_short_name);
+	if (!(fd = mkstemp(tmpname)) || !(fp = fdopen(fd, "r+")))
+		err(EXIT_FAILURE, _("can't open temporary file %s"), tmpname);
 	unlink(tmpname);
+	free(tmpname);
 
-	if (!nobanner) {
+	if (print_banner == TRUE) {
 		if (!(whom = getlogin()) || !*whom)
 			whom = (pw = getpwuid(getuid())) ? pw->pw_name : "???";
-		if (!whom || strlen(whom) > 100)
+		if (!whom) {
 			whom = "someone";
-		where = ttyname(2);
-		if (!where || strlen(where) > 100)
+			warn(_("cannot get passwd uid"));
+		}
+		where = ttyname(STDOUT_FILENO);
+		if (!where) {
 			where = "somewhere";
+			warn(_("cannot get tty name"));
+		}
 		gethostname(hostname, sizeof(hostname));
 		time(&now);
 		lt = localtime(&now);
@@ -199,6 +212,8 @@ makemsg(fname)
 	}
 	fprintf(fp, "%79s\r\n", " ");
 
+	free(hostname);
+
 	if (fname) {
 		/*
 		 * When we are not root, but suid or sgid, refuse to read files
@@ -206,16 +221,16 @@ makemsg(fname)
 		 * After all, our invoker can easily do "wall < file"
 		 * instead of "wall file".
 		 */
-		int uid = getuid();
+		uid_t uid = getuid();
 		if (uid && (uid != geteuid() || getgid() != getegid()))
 			errx(EXIT_FAILURE, _("will not read %s - use stdin."),
 			     fname);
 
 		if (!freopen(fname, "r", stdin))
-			errx(EXIT_FAILURE, _("can't read %s."), fname);
+			err(EXIT_FAILURE, _("cannot open file %s."), fname);
 	}
 
-	while (fgets(lbuf, sizeof(lbuf), stdin)) {
+	while (fgets(lbuf, line_max, stdin)) {
 		for (cnt = 0, p = lbuf; (ch = *p) != '\0'; ++p, ++cnt) {
 			if (cnt == 79 || ch == '\n') {
 				for (; cnt < 79; ++cnt)
@@ -229,16 +244,21 @@ makemsg(fname)
 		}
 	}
 	fprintf(fp, "%79s\r\n", " ");
+
+	free(lbuf);
 	rewind(fp);
 
 	if (fstat(fd, &sbuf))
 		err(EXIT_FAILURE, _("fstat failed"));
 
 	mbufsize = sbuf.st_size;
+	memcpy(mainmbufsize, &mbufsize, sizeof(size_t));
 	mbuf = xmalloc(mbufsize);
 
 	if (fread(mbuf, sizeof(*mbuf), mbufsize, fp) != mbufsize)
 		err(EXIT_FAILURE, _("fread failed"));
 
 	close(fd);
+	fclose(fp);
+	return(mbuf);
 }
-- 
1.7.4.3

--
To unsubscribe from this list: send the line "unsubscribe util-linux" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux