fileutils: differentiate xmkstemp and xfmkstemp

Let developer to choose, case by case, what sort of return value is
best in her code.  The xmkstemp() is for users who want file
descriptor as return value of the function, xfmkstemp() will return
FILE pointer.

Proposed-By: Karel Zak <kzak@redhat.com>
CC: Davidlohr Bueso <dave@gnu.org>
Reference: http://marc.info/?l=util-linux-ng&m=133129570124003&w=2
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
This commit is contained in:
Sami Kerola 2012-03-10 12:29:35 +01:00
parent fd2e8c693e
commit 7961acce46
5 changed files with 29 additions and 18 deletions

View File

@ -1,6 +1,20 @@
#ifndef UTIL_LINUX_FILEUTILS
#define UTIL_LINUX_FILEUTILS
extern FILE * xmkstemp(char **tmpname);
extern int xmkstemp(char **tmpname);
static inline FILE *xfmkstemp(char **tmpname)
{
int fd;
FILE *ret;
fd = xmkstemp(tmpname);
if (fd == -1) {
return NULL;
}
if (!(ret = fdopen(fd, "w+"))) {
close(fd);
return NULL;
}
return ret;
}
#endif

View File

@ -8,38 +8,35 @@
#include <unistd.h>
#include "c.h"
#include "fileutils.h"
#include "pathnames.h"
#include "xalloc.h"
/* Create open temporary file in safe way. Please notice that the
* file permissions are -rw------- by default. */
FILE *xmkstemp(char **tmpname)
int xmkstemp(char **tmpname)
{
char *localtmp;
char *tmpenv;
mode_t old_mode;
int fd;
FILE *ret;
tmpenv = getenv("TMPDIR");
if (tmpenv)
xasprintf(&localtmp, "%s/%s.XXXXXX", tmpenv,
program_invocation_short_name);
program_invocation_short_name);
else
xasprintf(&localtmp, "%s/%s.XXXXXX", _PATH_TMP,
program_invocation_short_name);
program_invocation_short_name);
old_mode = umask(077);
fd = mkstemp(localtmp);
umask(old_mode);
if (fd == -1)
return NULL;
if (!(ret = fdopen(fd, "w+")))
goto err;
if (fd == -1) {
free(localtmp);
localtmp = NULL;
}
*tmpname = localtmp;
return ret;
err:
close(fd);
return NULL;
return fd;
}
#ifdef TEST_PROGRAM
@ -47,7 +44,7 @@ int main(void)
{
FILE *f;
char *tmpname;
f = xmkstemp(&tmpname);
f = xfmkstemp(&tmpname);
unlink(tmpname);
free(tmpname);
fclose(f);

View File

@ -83,7 +83,7 @@ int setpwnam(struct passwd *pwd)
pw_init();
if ((fp = xmkstemp(&tmpname)) == NULL)
if ((fp = xfmkstemp(&tmpname)) == NULL)
return -1;
/* ptmp should be owned by root.root or root.wheel */
@ -140,7 +140,7 @@ int setpwnam(struct passwd *pwd)
fputs(linebuf, fp);
}
/* xmkstemp is too restrictive by default for passwd file */
/* xfmkstemp is too restrictive by default for passwd file */
if (fchmod(fileno(fp), 0644) < 0)
goto fail;
rc = fclose(fp);

View File

@ -143,7 +143,7 @@ static FILE * pw_tmpfile(int lockfd)
FILE *fd;
char *tmpname = NULL;
if ((fd = xmkstemp(&tmpname)) == NULL) {
if ((fd = xfmkstemp(&tmpname)) == NULL) {
ulckpwdf();
err(EXIT_FAILURE, _("can't open temporary file"));
}

View File

@ -196,7 +196,7 @@ makemsg(char *fname, size_t *mbufsize, int print_banner)
line_max = sysconf(_SC_LINE_MAX);
lbuf = xmalloc(line_max);
if ((fp = xmkstemp(&tmpname)) == NULL)
if ((fp = xfmkstemp(&tmpname)) == NULL)
err(EXIT_FAILURE, _("can't open temporary file"));
unlink(tmpname);
free(tmpname);