diff options
-rw-r--r-- | trunk/ChangeLog.cross | 4 | ||||
-rw-r--r-- | trunk/src/dso-readonly.c | 76 |
2 files changed, 48 insertions, 32 deletions
diff --git a/trunk/ChangeLog.cross b/trunk/ChangeLog.cross index 3424127..a607b65 100644 --- a/trunk/ChangeLog.cross +++ b/trunk/ChangeLog.cross @@ -1,3 +1,7 @@ +2010-07-22 Mark Hatle <mark.hatle@windriver.com> + * Merge to upstream r185 + * Resync dso-readonly.c from dso.c + 2010-06-18 Mark Hatle <mark.hatle@windriver.com> * Sync src/dso-readonly.c and ... diff --git a/trunk/src/dso-readonly.c b/trunk/src/dso-readonly.c index b32fa3c..3cfe838 100644 --- a/trunk/src/dso-readonly.c +++ b/trunk/src/dso-readonly.c @@ -1769,6 +1769,45 @@ set_security_context (const char *temp_name, const char *name, } int +copy_fd_to_file (int fdin, const char *name, struct stat64 *st) +{ + struct stat64 stt; + off_t off = 0; + int err, fdout; + struct utimbuf u; + + if (strcmp (name, "-") == 0) + fdout = 1; + else + fdout = wrap_open (name, O_WRONLY | O_CREAT, 0600); + if (fdout != -1 + && fstat64 (fdin, &stt) >= 0 + && send_file (fdout, fdin, &off, stt.st_size) == stt.st_size) + { + if (fchown (fdout, st->st_uid, st->st_gid) >= 0) + fchmod (fdout, st->st_mode & 07777); + if (strcmp (name, "-") != 0) + { + set_security_context (name, name, 1); + u.actime = time (NULL); + u.modtime = st->st_mtime; + wrap_utime (name, &u); + close (fdout); + } + return 0; + } + else if (fdout != -1) + { + err = errno; + if (strcmp (name, "-") == 0) + close (fdout); + } + else + err = errno; + return err; +} + +int update_dso (DSO *dso, const char *orig_name) { int rdwr = dso_is_rdwr (dso); @@ -1778,7 +1817,7 @@ update_dso (DSO *dso, const char *orig_name) char *name1, *name2; struct utimbuf u; struct stat64 st; - int fdin, fdout; + int fdin; switch (write_dso (dso)) { @@ -1832,39 +1871,12 @@ update_dso (DSO *dso, const char *orig_name) { if (fdin != -1) { - struct stat64 stt; - off_t off = 0; - int err; - if (strcmp (name1, "-") == 0) - fdout = 1; - else - fdout = wrap_open (name1, O_WRONLY | O_CREAT, 0600); - if (fdout != -1 - && fstat64 (fdin, &stt) >= 0 - && send_file (fdout, fdin, &off, stt.st_size) == stt.st_size) - { - close (fdin); - if (fchown (fdout, st.st_uid, st.st_gid) >= 0) - fchmod (fdout, st.st_mode & 07777); - if (strcmp (name1, "-") != 0) - { - set_security_context (name1, name1, 1); - wrap_utime (name1, &u); - close (fdout); - } - wrap_unlink (name2); - return 0; - } - else if (fdout != -1) - { - err = errno; - if (strcmp (name1, "-") == 0) - close (fdout); - } - else - err = errno; + int err = copy_fd_to_file (fdin, name1, &st); + close (fdin); wrap_unlink (name2); + if (err == 0) + return 0; error (0, err, "Could not rename nor copy temporary to %s", name1); return 1; |