diff options
author | Denys Vlasenko | 2016-01-17 03:50:36 +0100 |
---|---|---|
committer | Denys Vlasenko | 2016-01-17 03:50:36 +0100 |
commit | c7e47cf6273830a59f5d3f822e4a6855a80312c6 (patch) | |
tree | ebbde78e8dcc73a762f241ced0204915e77177f4 /coreutils | |
parent | ccf7f0e4d3aed3bd9f46a239d9033cd773e67ab8 (diff) | |
download | busybox-c7e47cf6273830a59f5d3f822e4a6855a80312c6.zip busybox-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>
Diffstat (limited to 'coreutils')
-rw-r--r-- | coreutils/dos2unix.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/coreutils/dos2unix.c b/coreutils/dos2unix.c index 07398bd..ccb74a1 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) { |