gentoo: use /var/run for new /run compatibility
[util-vserver.git] / lib_internal / unify-copy.c
index 6b93089..6fe282d 100644 (file)
@@ -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;
@@ -132,8 +132,8 @@ copyMMap(int in_fd, int out_fd)
       buf_size = in_len - offset;
       if (buf_size > MMAP_BLOCKSIZE) buf_size = MMAP_BLOCKSIZE;
       
-      if ((in_buf  = mmap(0, buf_size, PROT_READ,  MAP_SHARED,  in_fd, offset))==0 ||
-         (out_buf = mmap(0, buf_size, PROT_WRITE, MAP_SHARED, out_fd, offset))==0) {
+      if ((in_buf  = mmap(0, buf_size, PROT_READ,  MAP_SHARED,  in_fd, offset))==MAP_FAILED ||
+         (out_buf = mmap(0, buf_size, PROT_WRITE, MAP_SHARED, out_fd, offset))==MAP_FAILED) {
        perror("mmap()");
        goto out;
       }
@@ -145,16 +145,16 @@ copyMMap(int in_fd, int out_fd)
       TESTSUITE_COPY_CODE;
       copyMem(out_buf, in_buf, buf_size);
 
-      munmap(const_cast(void *)(in_buf),  buf_size);  in_buf = 0;
       munmap(out_buf,                     buf_size); out_buf = 0;
+      munmap(const_cast(void *)(in_buf),  buf_size);  in_buf = 0;
     }
 
     res = true;
   }
 
   out:
-  if (in_buf !=0) munmap(const_cast(void *)(in_buf),  buf_size);
   if (out_buf!=0) munmap(out_buf,                     buf_size);
+  if (in_buf !=0) munmap(const_cast(void *)(in_buf),  buf_size);
 
   return res;
 }
@@ -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 ||