sync to 0.30.213
[util-vserver.git] / lib_internal / unify-copy.c
index 1eae081..81102e5 100644 (file)
@@ -1,4 +1,4 @@
-// $Id: unify-copy.c 1977 2005-03-24 12:42:16Z ensc $    --*- c -*--
+// $Id: unify-copy.c 2485 2007-02-04 17:18:27Z ensc $    --*- c -*--
 
 // Copyright (C) 2004 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
 //  
@@ -83,6 +83,8 @@ static void
 copyMem(void *dst_v, void const *src_v, size_t len_v)
 {
 #if 1
+    // Do not use memcpy because this would dirty pages consisting only of
+    // '\0'
   int          *dst = dst_v;
   int const    *src = src_v;
   size_t       len  = len_v / sizeof(int);
@@ -119,9 +121,7 @@ copyMMap(int in_fd, int out_fd)
   bool   volatile      res      = false;
 
   if (in_len==-1) return false;
-  if (in_len>0 &&
-      (lseek(out_fd, in_len-1, SEEK_SET)==-1 ||
-       write(out_fd, "\0",     1)!=1))         // create sparse file
+  if (in_len>0 && ftruncate(out_fd, in_len)==-1)       // create sparse file
     return false;
   
   bus_error = 0;
@@ -164,7 +164,7 @@ copyReg(char const *src, struct stat const *src_stat,
        char const *dst)
 {
   int          in_fd  = open(src, O_RDONLY|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW|O_LARGEFILE);
-  int          out_fd = in_fd==-1 ? -1 : open(dst, O_RDWR|O_CREAT|O_EXCL, 0200);
+  int          out_fd = in_fd==-1 ? -1 : open(dst, O_RDWR|O_CREAT|O_EXCL|O_NOCTTY, 0200);
   bool         res    = false;
   
   if (in_fd==-1 || out_fd==-1 ||