[dovecot-cvs] dovecot/src/lib file-copy.c,1.1.2.2,1.1.2.3
cras at dovecot.org
cras at dovecot.org
Sat Jul 1 20:45:27 EEST 2006
Update of /var/lib/cvs/dovecot/src/lib
In directory talvi:/tmp/cvs-serv2992
Modified Files:
Tag: branch_1_0
file-copy.c
Log Message:
Try to preserve file's mode and group when copying it.
Index: file-copy.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib/file-copy.c,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -u -d -r1.1.2.2 -r1.1.2.3
--- file-copy.c 19 Jun 2006 18:15:59 -0000 1.1.2.2
+++ file-copy.c 1 Jul 2006 17:45:16 -0000 1.1.2.3
@@ -8,12 +8,15 @@
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
+#include <sys/stat.h>
static int file_copy_to_tmp(const char *srcpath, const char *tmppath,
bool try_hardlink)
{
struct istream *input;
struct ostream *output;
+ struct stat st;
+ mode_t old_umask;
int fd_in, fd_out;
off_t ret;
@@ -47,12 +50,24 @@
return -1;
}
- fd_out = open(tmppath, O_WRONLY | O_CREAT | O_TRUNC, 0644);
+ if (fstat(fd_in, &st) < 0) {
+ i_error("fstat(%s) failed: %m", srcpath);
+ (void)close(fd_in);
+ return -1;
+ }
+
+ old_umask = umask(0);
+ fd_out = open(tmppath, O_WRONLY | O_CREAT | O_TRUNC, st.st_mode);
+ umask(old_umask);
if (fd_out == -1) {
i_error("open(%s, O_CREAT) failed: %m", tmppath);
(void)close(fd_in);
return -1;
}
+
+ /* try to change the group, don't really care if it fails */
+ (void)fchown(fd_out, (uid_t)-1, st.st_gid);
+
input = i_stream_create_file(fd_in, default_pool, 0, FALSE);
output = o_stream_create_file(fd_out, default_pool, 0, FALSE);
More information about the dovecot-cvs
mailing list