diff options
author | Sami Kerola | 2012-08-04 09:33:40 +0200 |
---|---|---|
committer | Karel Zak | 2012-08-06 14:53:02 +0200 |
commit | 69a826f187cbef2acf3fda2512f28ea31c42933c (patch) | |
tree | fefcc0d2ae73efa47f4ddd3b1fc7982aa548a4c9 /login-utils/vipw.c | |
parent | docs: add sys-utils/umount.8 manual page (diff) | |
download | kernel-qcow2-util-linux-69a826f187cbef2acf3fda2512f28ea31c42933c.tar.gz kernel-qcow2-util-linux-69a826f187cbef2acf3fda2512f28ea31c42933c.tar.xz kernel-qcow2-util-linux-69a826f187cbef2acf3fda2512f28ea31c42933c.zip |
vipw: make vim writebackup mode work
Some editors, such as Vim with 'writebackup' mode enabled, use "atomic
save" in which the old file is deleted and a new one with the same name
created in its place. The vipw tries to detect if such happen by
looking hard temporary file link count, when it is zero reopen
temporary file by using it's path.
Reported-by: Mantas Mikulėnas <grawity@gmail.com>
References: http://www.spinics.net/lists/util-linux-ng/msg06666.html
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
Diffstat (limited to 'login-utils/vipw.c')
-rw-r--r-- | login-utils/vipw.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/login-utils/vipw.c b/login-utils/vipw.c index ed3f43bec..1eeeb0dd7 100644 --- a/login-utils/vipw.c +++ b/login-utils/vipw.c @@ -275,6 +275,18 @@ static void edit_file(int is_shadow) if (fstat(fileno(tmp_fd), &end)) pw_error(tmp_file, 1, 1); + /* Some editors, such as Vim with 'writebackup' mode enabled, + * use "atomic save" in which the old file is deleted and a new + * one with the same name created in its place. */ + if (end.st_nlink == 0) { + if (close_stream(tmp_fd) != 0) + err(EXIT_FAILURE, _("write error")); + tmp_fd = fopen(tmp_file, "r"); + if (!tmp_file) + err(EXIT_FAILURE, _("cannot open %s"), tmp_file); + if (fstat(fileno(tmp_fd), &end)) + pw_error(tmp_file, 1, 1); + } if (begin.st_mtime == end.st_mtime) { warnx(_("no changes made")); pw_error((char *)NULL, 0, 0); |