aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2016-01-17 03:50:36 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2016-01-17 03:50:36 +0100
commitc7e47cf6273830a59f5d3f822e4a6855a80312c6 (patch)
treeebbde78e8dcc73a762f241ced0204915e77177f4
parentccf7f0e4d3aed3bd9f46a239d9033cd773e67ab8 (diff)
downloadbusybox-c7e47cf6273830a59f5d3f822e4a6855a80312c6.tar.gz
dos2unix: try to preserve ownership. closes 8311
function old new delta dos2unix_main 426 441 +15 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--coreutils/dos2unix.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/coreutils/dos2unix.c b/coreutils/dos2unix.c
index 07398bdfa..ccb74a113 100644
--- a/coreutils/dos2unix.c
+++ b/coreutils/dos2unix.c
@@ -41,7 +41,7 @@ enum {
static void convert(char *fn, int conv_type)
{
FILE *in, *out;
- int i;
+ int ch;
char *temp_fn = temp_fn; /* for compiler */
char *resolved_fn = resolved_fn;
@@ -49,28 +49,30 @@ static void convert(char *fn, int conv_type)
out = stdout;
if (fn != NULL) {
struct stat st;
+ int fd;
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);
+ xfstat(fileno(in), &st, resolved_fn);
temp_fn = xasprintf("%sXXXXXX", resolved_fn);
- i = xmkstemp(temp_fn);
- if (fchmod(i, st.st_mode) == -1)
+ fd = xmkstemp(temp_fn);
+ if (fchmod(fd, st.st_mode) == -1)
bb_simple_perror_msg_and_die(temp_fn);
+ fchown(fd, st.st_uid, st.st_gid);
- out = xfdopen_for_write(i);
+ out = xfdopen_for_write(fd);
}
- while ((i = fgetc(in)) != EOF) {
- if (i == '\r')
+ while ((ch = fgetc(in)) != EOF) {
+ if (ch == '\r')
continue;
- if (i == '\n')
+ if (ch == '\n')
if (conv_type == CT_UNIX2DOS)
fputc('\r', out);
- fputc(i, out);
+ fputc(ch, out);
}
if (fn != NULL) {