- look at bb_applet_name. Should close bugs #892 and #893

also restructure code a bit so the fix only adds 1 byte..
This commit is contained in:
Bernhard Reutner-Fischer 2006-06-01 18:30:42 +00:00
parent d04e9b8130
commit b5353a20f3

View File

@ -1,3 +1,4 @@
/* vi: set sw=4 ts=4: */
/* /*
* dos2unix for BusyBox * dos2unix for BusyBox
* *
@ -8,7 +9,7 @@
* *
* dos2unix filters reading input from stdin and writing output to stdout. * dos2unix filters reading input from stdin and writing output to stdout.
* *
* Licensed under the GPL v2 or later, see the file LICENSE in this tarball. * Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
*/ */
#include <string.h> #include <string.h>
@ -17,68 +18,69 @@
#include <fcntl.h> #include <fcntl.h>
#include "busybox.h" #include "busybox.h"
#define CT_UNIX2DOS 1 enum ConvType {
#define CT_DOS2UNIX 2 CT_UNIX2DOS = 1,
#define tempFn bb_common_bufsiz1 CT_DOS2UNIX
} ConvType;
/* if fn is NULL then input is stdin and output is stdout */ /* if fn is NULL then input is stdin and output is stdout */
static int convert(char *fn, int ConvType) static int convert(char *fn)
{ {
int c, fd;
FILE *in, *out; FILE *in, *out;
int i;
if (fn != NULL) { if (fn != NULL) {
in = bb_xfopen(fn, "rw"); in = bb_xfopen(fn, "rw");
/* /*
The file is then created with mode read/write and The file is then created with mode read/write and
permissions 0666 for glibc 2.0.6 and earlier or permissions 0666 for glibc 2.0.6 and earlier or
0600 for glibc 2.0.7 and later. 0600 for glibc 2.0.7 and later.
*/ */
snprintf(tempFn, sizeof(tempFn), "%sXXXXXX", fn); snprintf(bb_common_bufsiz1, sizeof(bb_common_bufsiz1), "%sXXXXXX", fn);
/* /*
sizeof tempFn is 4096, so it should be big enough to hold the full sizeof bb_common_bufsiz1 is 4096, so it should be big enough to
path. however if the output is truncated the subsequent call to hold the full path. However if the output is truncated the
mkstemp would fail. subsequent call to mkstemp would fail.
*/ */
if ((fd = mkstemp(&tempFn[0])) == -1 || chmod(tempFn, 0600) == -1) { if ((i = mkstemp(&bb_common_bufsiz1[0])) == -1
|| chmod(bb_common_bufsiz1, 0600) == -1) {
bb_perror_nomsg_and_die(); bb_perror_nomsg_and_die();
} }
out = fdopen(fd, "w+"); out = fdopen(i, "w+");
if (!out) { if (!out) {
close(fd); close(i);
remove(tempFn); remove(bb_common_bufsiz1);
} }
} else { } else {
in = stdin; in = stdin;
out = stdout; out = stdout;
} }
while ((c = fgetc(in)) != EOF) { while ((i = fgetc(in)) != EOF) {
if (c == '\r') if (i == '\r')
continue; continue;
if (c == '\n') { if (i == '\n') {
if (ConvType == CT_UNIX2DOS) if (ConvType == CT_UNIX2DOS)
fputc('\r', out); fputc('\r', out);
fputc('\n', out); fputc('\n', out);
continue; continue;
} }
fputc(c, out); fputc(i, out);
} }
if (fn != NULL) { if (fn != NULL) {
if (fclose(in) < 0 || fclose(out) < 0) { if (fclose(in) < 0 || fclose(out) < 0) {
bb_perror_nomsg(); bb_perror_nomsg();
remove(tempFn); remove(bb_common_bufsiz1);
return -2; return -2;
} }
/* Assume they are both on the same filesystem (which /* Assume they are both on the same filesystem (which
* should be true since we put them into the same directory * should be true since we put them into the same directory
* so we _should_ be ok, but you never know... */ * so we _should_ be ok, but you never know... */
if (rename(tempFn, fn) < 0) { if (rename(bb_common_bufsiz1, fn) < 0) {
bb_perror_msg("cannot rename '%s' as '%s'", tempFn, fn); bb_perror_msg("cannot rename '%s' as '%s'", bb_common_bufsiz1, fn);
return -1; return -1;
} }
} }
return 0; return 0;
@ -86,14 +88,13 @@ static int convert(char *fn, int ConvType)
int dos2unix_main(int argc, char *argv[]) int dos2unix_main(int argc, char *argv[])
{ {
int ConvType;
int o; int o;
/* See if we are supposed to be doing dos2unix or unix2dos */ /* See if we are supposed to be doing dos2unix or unix2dos */
if (argv[0][0]=='d') { if (bb_applet_name[0] == 'd') {
ConvType = CT_DOS2UNIX; /*2*/ ConvType = CT_DOS2UNIX; /*2 */
} else { } else {
ConvType = CT_UNIX2DOS; /*1*/ ConvType = CT_UNIX2DOS; /*1 */
} }
/* -u and -d are mutally exclusive */ /* -u and -d are mutally exclusive */
bb_opt_complementally = "?:u--d:d--u"; bb_opt_complementally = "?:u--d:d--u";
@ -108,12 +109,11 @@ int dos2unix_main(int argc, char *argv[])
ConvType = o; ConvType = o;
if (optind < argc) { if (optind < argc) {
while(optind < argc) while (optind < argc)
if ((o = convert(argv[optind++], ConvType)) < 0) if ((o = convert(argv[optind++])) < 0)
break; break;
} } else
else o = convert(NULL);
o = convert(NULL, ConvType);
return o; return o;
} }