- in = xfopen(fn, "rw");
- /*
- The file is then created with mode read/write and
- permissions 0666 for glibc 2.0.6 and earlier or
- 0600 for glibc 2.0.7 and later.
- */
- snprintf(name_buf, sizeof(name_buf), "%sXXXXXX", fn);
- i = mkstemp(&name_buf[0]);
- if (i == -1 || chmod(name_buf, 0600) == -1) {
- bb_perror_nomsg_and_die();
- }
- out = fdopen(i, "w+");
- if (!out) {
- close(i);
- remove(name_buf);
- return -2;
+ struct stat st;
+
+ resolved_fn = xmalloc_follow_symlinks(fn);
+ if (resolved_fn == NULL)
+ bb_simple_perror_msg_and_die(fn);
+ in = xfopen_for_read(resolved_fn);
+ fstat(fileno(in), &st);
+
+ temp_fn = xasprintf("%sXXXXXX", resolved_fn);
+ i = mkstemp(temp_fn);
+ if (i == -1
+ || fchmod(i, st.st_mode) == -1
+ || !(out = fdopen(i, "w+"))
+ ) {
+ bb_simple_perror_msg_and_die(temp_fn);