[Haiku-commits] r31311 - haiku/trunk/src/bin/coreutils/src
stippi at mail.berlios.de
stippi at mail.berlios.de
Mon Jun 29 11:35:41 CEST 2009
Author: stippi
Date: 2009-06-29 11:35:39 +0200 (Mon, 29 Jun 2009)
New Revision: 31311
ViewCVS: http://svn.berlios.de/viewcvs/haiku?rev=31311&view=rev
Modified:
haiku/trunk/src/bin/coreutils/src/copy.c
Log:
Cut down on the required number of syscalls by using the new Haiku API
for reading/writing attributes.
Modified: haiku/trunk/src/bin/coreutils/src/copy.c
===================================================================
--- haiku/trunk/src/bin/coreutils/src/copy.c 2009-06-29 09:13:33 UTC (rev 31310)
+++ haiku/trunk/src/bin/coreutils/src/copy.c 2009-06-29 09:35:39 UTC (rev 31311)
@@ -18,6 +18,7 @@
#include <config.h>
#include <stdio.h>
+#include <unistd.h>
#include <assert.h>
#include <sys/types.h>
#include <selinux/selinux.h>
@@ -147,35 +148,49 @@
return -1;
while ((dirent = fs_read_attr_dir(attributes)) != NULL) {
- attr_info info;
+ struct stat stat;
off_t pos = 0;
+ int attrFromFD = fs_open_attr(fromFd, dirent->d_name, 0, O_RDONLY);
+ int attrToFD;
- if (fs_stat_attr(fromFd, dirent->d_name, &info) != 0)
+ if (attrFromFD < 0)
continue;
+ if (fstat(attrFromFD, &stat) != 0) {
+ close(attrFromFD);
+ continue;
+ }
+
+ attrToFD = fs_open_attr(toFd, dirent->d_name, stat.st_type,
+ O_WRONLY | O_TRUNC | O_CREAT);
+ if (attrToFD < 0) {
+ close(attrFromFD);
+ continue;
+ }
+
while (true) {
ssize_t bytesRead, bytesWritten;
- bytesRead = fs_read_attr(fromFd, dirent->d_name, info.type, pos,
- buffer, sizeof(buffer));
+ bytesRead = read_pos(attrFromFD, pos, buffer, sizeof(buffer));
if (bytesRead < 0) {
fprintf(stderr, "error reading attribute '%s'", dirent->d_name);
break;
}
- bytesWritten = fs_write_attr(toFd, dirent->d_name, info.type, pos,
- buffer, bytesRead);
+ bytesWritten = write_pos(attrToFD, pos, buffer, bytesRead);
if (bytesWritten != bytesRead) {
fprintf(stderr, "error writing attribute '%s'", dirent->d_name);
break;
}
pos += bytesWritten;
- info.size -= bytesWritten;
+ stat.st_size -= bytesWritten;
- if (info.size <= 0)
+ if (stat.st_size <= 0)
break;
}
+ close(attrToFD);
+ close(attrFromFD);
}
fs_close_attr_dir(attributes);
More information about the Haiku-commits
mailing list