Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 23 Feb 2000 16:08:12 +1100 (EST)
From:      lodea@angmar.mel.vet.com.au
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   bin/16924: tmpfile(3) should respect TMPDIR env variable
Message-ID:  <200002230508.QAA09369@angmar.mel.vet.com.au>

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

>Number:         16924
>Category:       bin
>Synopsis:       tmpfile(3) ignores TMPDIR and always uses /tmp
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Tue Feb 22 21:10:01 PST 2000
>Closed-Date:
>Last-Modified:
>Originator:     Lachlan O'Dea
>Release:        FreeBSD 3.3-STABLE i386
>Organization:
Computer Associates
>Environment:

FreeBSD angmar.mel.vet.com.au 3.3-STABLE FreeBSD 3.3-STABLE #4: Wed Dec  1 20:06:43 EST 1999     lodea@angmar.mel.vet.com.au:/usr/src/sys/compile/ANGMAR  i386

>Description:

Others may disagree, but I think it would be nice if the tmpfile(3)
function would use the TMPDIR environment variable if it is present.
Currently it is hard-coded to use /tmp.

My reason for doing this is that the Cyrus deliver program uses
tmpfile to store the email that it is delivering. I don't really
want to make my MFS /tmp big enough to hold the largest email
messages I expect to receive.

I can't see any problems caused by this change.

>How-To-Repeat:

Set TMPDIR to /var/tmp. Use tmpfile(3) to create a temporary file, then
write 50 Mb of data to it. Chances are pretty good your /tmp will run
out of space.

>Fix:
	
Here's a patch which might be satisfactory. If TMPDIR is not set, it
reverts to current behaviour. Please let me know if you like the
idea but not the patch.


Index: tmpfile.c
===================================================================
RCS file: /home/ncvs/src/lib/libc/stdio/tmpfile.c,v
retrieving revision 1.4
diff -u -r1.4 tmpfile.c
--- tmpfile.c	2000/01/27 23:06:46	1.4
+++ tmpfile.c	2000/02/23 04:26:46
@@ -47,6 +47,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <paths.h>
+#include <stdlib.h>
 
 FILE *
 tmpfile()
@@ -55,10 +56,24 @@
 	FILE *fp;
 	int fd, sverrno;
 #define	TRAILER	"tmp.XXXXXX"
-	char buf[sizeof(_PATH_TMP) + sizeof(TRAILER)];
+	char *buf;
+	char *envtmpdir;
+	int envtmpdirlen;
 
-	(void)memcpy(buf, _PATH_TMP, sizeof(_PATH_TMP) - 1);
-	(void)memcpy(buf + sizeof(_PATH_TMP) - 1, TRAILER, sizeof(TRAILER));
+	if ((envtmpdir = getenv("TMPDIR")) != NULL)
+	{
+		envtmpdirlen = strlen(envtmpdir);
+		buf = malloc(envtmpdirlen + 1 + sizeof(TRAILER));
+		(void)memcpy(buf, envtmpdir, envtmpdirlen);
+		buf[envtmpdirlen] = '/';
+		(void)memcpy(buf + envtmpdirlen + 1, TRAILER, sizeof(TRAILER));
+	}
+	else
+	{
+		buf = malloc(sizeof(_PATH_TMP) + sizeof(TRAILER) - 1);
+		(void)memcpy(buf, _PATH_TMP, sizeof(_PATH_TMP) - 1);
+		(void)memcpy(buf + sizeof(_PATH_TMP) - 1, TRAILER, sizeof(TRAILER));
+	}
 
 	sigfillset(&set);
 	(void)sigprocmask(SIG_BLOCK, &set, &oset);
@@ -66,6 +81,8 @@
 	fd = mkstemp(buf);
 	if (fd != -1)
 		(void)unlink(buf);
+
+	free(buf);
 
 	(void)sigprocmask(SIG_SETMASK, &oset, NULL);
 



>Release-Note:
>Audit-Trail:
>Unformatted:


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




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