summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/fileutils.h6
-rw-r--r--lib/fileutils.c21
-rw-r--r--login-utils/chfn.c2
-rw-r--r--login-utils/chsh.c2
-rw-r--r--login-utils/setpwnam.c5
-rw-r--r--login-utils/setpwnam.h6
-rw-r--r--login-utils/vipw.c3
7 files changed, 20 insertions, 25 deletions
diff --git a/include/fileutils.h b/include/fileutils.h
index e0e2ecee1..be6d1f7f9 100644
--- a/include/fileutils.h
+++ b/include/fileutils.h
@@ -7,14 +7,14 @@
#include "c.h"
-extern int xmkstemp(char **tmpname, char *dir);
+extern int xmkstemp(char **tmpname, const char *dir, const char *prefix);
-static inline FILE *xfmkstemp(char **tmpname, char *dir)
+static inline FILE *xfmkstemp(char **tmpname, const char *dir, const char *prefix)
{
int fd;
FILE *ret;
- fd = xmkstemp(tmpname, dir);
+ fd = xmkstemp(tmpname, dir, prefix);
if (fd == -1)
return NULL;
diff --git a/lib/fileutils.c b/lib/fileutils.c
index 81b38ad3a..bf8e60a4b 100644
--- a/lib/fileutils.c
+++ b/lib/fileutils.c
@@ -15,27 +15,20 @@
/* Create open temporary file in safe way. Please notice that the
* file permissions are -rw------- by default. */
-int xmkstemp(char **tmpname, char *dir)
+int xmkstemp(char **tmpname, const char *dir, const char *prefix)
{
char *localtmp;
- char *tmpenv;
+ const char *tmpenv;
mode_t old_mode;
int fd, rc;
/* Some use cases must be capable of being moved atomically
* with rename(2), which is the reason why dir is here. */
- if (dir != NULL)
- tmpenv = dir;
- else
- tmpenv = getenv("TMPDIR");
-
- if (tmpenv)
- rc = asprintf(&localtmp, "%s/%s.XXXXXX", tmpenv,
- program_invocation_short_name);
- else
- rc = asprintf(&localtmp, "%s/%s.XXXXXX", _PATH_TMP,
- program_invocation_short_name);
+ tmpenv = dir ? dir : getenv("TMPDIR");
+ if (!tmpenv)
+ tmpenv = _PATH_TMP;
+ rc = asprintf(&localtmp, "%s/%s.XXXXXX", tmpenv, prefix);
if (rc < 0)
return -1;
@@ -107,7 +100,7 @@ int main(void)
{
FILE *f;
char *tmpname;
- f = xfmkstemp(&tmpname, NULL);
+ f = xfmkstemp(&tmpname, NULL, "test");
unlink(tmpname);
free(tmpname);
fclose(f);
diff --git a/login-utils/chfn.c b/login-utils/chfn.c
index ac0a3cbde..b1c7ea25a 100644
--- a/login-utils/chfn.c
+++ b/login-utils/chfn.c
@@ -373,7 +373,7 @@ static int save_new_data(struct chfn_control *ctl)
#else /* HAVE_LIBUSER */
/* write the new struct passwd to the passwd file. */
ctl->pw->pw_gecos = gecos;
- if (setpwnam(ctl->pw) < 0) {
+ if (setpwnam(ctl->pw, ".chfn") < 0) {
warn("setpwnam failed");
#endif
printf(_
diff --git a/login-utils/chsh.c b/login-utils/chsh.c
index f4455d7e2..d74a1f0f1 100644
--- a/login-utils/chsh.c
+++ b/login-utils/chsh.c
@@ -323,7 +323,7 @@ int main(int argc, char **argv)
errx(EXIT_FAILURE, _("Shell *NOT* changed. Try again later."));
#else
pw->pw_shell = info.shell;
- if (setpwnam(pw) < 0)
+ if (setpwnam(pw, ".chsh") < 0)
err(EXIT_FAILURE, _("setpwnam failed\n"
"Shell *NOT* changed. Try again later."));
#endif
diff --git a/login-utils/setpwnam.c b/login-utils/setpwnam.c
index 79f3299d4..9f39d0181 100644
--- a/login-utils/setpwnam.c
+++ b/login-utils/setpwnam.c
@@ -71,7 +71,7 @@ static void pw_init(void);
* If the given username exists in the passwd file, the entry is
* replaced with the given entry.
*/
-int setpwnam(struct passwd *pwd)
+int setpwnam(struct passwd *pwd, const char *prefix)
{
FILE *fp = NULL, *pwf = NULL;
int save_errno;
@@ -81,11 +81,10 @@ int setpwnam(struct passwd *pwd)
int contlen, rc;
char *linebuf = NULL;
char *tmpname = NULL;
- char *atomic_dir = "/etc";
pw_init();
- if ((fp = xfmkstemp(&tmpname, atomic_dir)) == NULL)
+ if ((fp = xfmkstemp(&tmpname, "/etc", prefix)) == NULL)
return -1;
/* ptmp should be owned by root.root or root.wheel */
diff --git a/login-utils/setpwnam.h b/login-utils/setpwnam.h
index 7d69445e8..95785923f 100644
--- a/login-utils/setpwnam.h
+++ b/login-utils/setpwnam.h
@@ -11,6 +11,8 @@
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*/
+#ifndef UTIL_LINUX_SETPWNAM_H
+#define UTIL_LINUX_SETPWNAM_H
#include "pathnames.h"
@@ -26,4 +28,6 @@
# define SGROUP_FILE "/tmp/gshadow"
#endif
-extern int setpwnam (struct passwd *pwd);
+extern int setpwnam (struct passwd *pwd, const char *prefix);
+
+#endif /* UTIL_LINUX_SETPWNAM_H */
diff --git a/login-utils/vipw.c b/login-utils/vipw.c
index 9fb25502c..a3c932f16 100644
--- a/login-utils/vipw.c
+++ b/login-utils/vipw.c
@@ -135,9 +135,8 @@ static FILE * pw_tmpfile(int lockfd)
{
FILE *fd;
char *tmpname = NULL;
- char *dir = "/etc";
- if ((fd = xfmkstemp(&tmpname, dir)) == NULL) {
+ if ((fd = xfmkstemp(&tmpname, "/etc", ".vipw")) == NULL) {
ulckpwdf();
err(EXIT_FAILURE, _("can't open temporary file"));
}