blob: eab8110dc8146563e71c5e35c92c59df34ddbfa2 [file] [log] [blame]
Bernhard Reutner-Fischerb5353a22006-06-01 18:30:42 +00001/* vi: set sw=4 ts=4: */
Eric Andersencff3fe32000-09-20 19:22:26 +00002/*
Eric Andersen544891d2001-02-22 23:37:30 +00003 * dos2unix for BusyBox
4 *
5 * dos2unix '\n' convertor 0.5.0
Rob Landley330ac852006-03-14 21:49:18 +00006 * based on Unix2Dos 0.9.0 by Peter Hanecak (made 19.2.1997)
Eric Andersen544891d2001-02-22 23:37:30 +00007 * Copyright 1997,.. by Peter Hanecak <hanecak@megaloman.sk>.
8 * All rights reserved.
9 *
10 * dos2unix filters reading input from stdin and writing output to stdout.
Eric Andersen544891d2001-02-22 23:37:30 +000011 *
Denys Vlasenko0ef64bd2010-08-16 20:14:46 +020012 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
Rob Landley330ac852006-03-14 21:49:18 +000013*/
Eric Andersencff3fe32000-09-20 19:22:26 +000014
Denis Vlasenkob6adbf12007-05-26 19:00:18 +000015#include "libbb.h"
Eric Andersencff3fe32000-09-20 19:22:26 +000016
Dan Fandrich2d1a78b2010-09-30 14:31:12 -070017/* This is a NOEXEC applet. Be very careful! */
18
Denis Vlasenko74324c82007-06-04 10:16:52 +000019enum {
Bernhard Reutner-Fischerb5353a22006-06-01 18:30:42 +000020 CT_UNIX2DOS = 1,
21 CT_DOS2UNIX
Denis Vlasenko74324c82007-06-04 10:16:52 +000022};
"Vladimir N. Oleynik"6f347ef2005-10-15 10:23:55 +000023
Rob Landleyf8154692005-09-01 03:11:19 +000024/* if fn is NULL then input is stdin and output is stdout */
Denis Vlasenko54296362008-02-17 14:31:50 +000025static void convert(char *fn, int conv_type)
Eric Andersen655584b2001-07-25 07:22:55 +000026{
Rob Landleyf8154692005-09-01 03:11:19 +000027 FILE *in, *out;
Bernhard Reutner-Fischerb5353a22006-06-01 18:30:42 +000028 int i;
Denis Vlasenkoa1767a12008-06-14 04:28:41 +000029 char *temp_fn = temp_fn; /* for compiler */
30 char *resolved_fn = resolved_fn;
Glenn L McGratha6ce6702001-04-12 02:26:04 +000031
Denis Vlasenko74324c82007-06-04 10:16:52 +000032 in = stdin;
33 out = stdout;
Glenn L McGratha6ce6702001-04-12 02:26:04 +000034 if (fn != NULL) {
Denis Vlasenkoa1767a12008-06-14 04:28:41 +000035 struct stat st;
36
37 resolved_fn = xmalloc_follow_symlinks(fn);
38 if (resolved_fn == NULL)
39 bb_simple_perror_msg_and_die(fn);
Denis Vlasenko5415c852008-07-21 23:05:26 +000040 in = xfopen_for_read(resolved_fn);
Denis Vlasenkoa1767a12008-06-14 04:28:41 +000041 fstat(fileno(in), &st);
42
43 temp_fn = xasprintf("%sXXXXXX", resolved_fn);
Alexander Shishkin67227372010-10-22 13:27:16 +020044 i = xmkstemp(temp_fn);
45 if (fchmod(i, st.st_mode) == -1)
Denis Vlasenkoa1767a12008-06-14 04:28:41 +000046 bb_simple_perror_msg_and_die(temp_fn);
Alexander Shishkin67227372010-10-22 13:27:16 +020047
Denys Vlasenkoa7ccdee2009-11-15 23:28:11 +010048 out = xfdopen_for_write(i);
Glenn L McGratha6ce6702001-04-12 02:26:04 +000049 }
50
Bernhard Reutner-Fischerb5353a22006-06-01 18:30:42 +000051 while ((i = fgetc(in)) != EOF) {
52 if (i == '\r')
Rob Landleyf8154692005-09-01 03:11:19 +000053 continue;
Denis Vlasenkocdf62772008-03-17 08:42:43 +000054 if (i == '\n')
Denis Vlasenko09196572007-07-21 13:27:44 +000055 if (conv_type == CT_UNIX2DOS)
Rob Landleyf8154692005-09-01 03:11:19 +000056 fputc('\r', out);
Bernhard Reutner-Fischerb5353a22006-06-01 18:30:42 +000057 fputc(i, out);
Glenn L McGratha6ce6702001-04-12 02:26:04 +000058 }
59
60 if (fn != NULL) {
Rob Landley330ac852006-03-14 21:49:18 +000061 if (fclose(in) < 0 || fclose(out) < 0) {
Denis Vlasenkoa1767a12008-06-14 04:28:41 +000062 unlink(temp_fn);
Denis Vlasenko54296362008-02-17 14:31:50 +000063 bb_perror_nomsg_and_die();
Bernhard Reutner-Fischerb5353a22006-06-01 18:30:42 +000064 }
Denis Vlasenkoa1767a12008-06-14 04:28:41 +000065 xrename(temp_fn, resolved_fn);
66 free(temp_fn);
67 free(resolved_fn);
Glenn L McGratha6ce6702001-04-12 02:26:04 +000068 }
Glenn L McGratha6ce6702001-04-12 02:26:04 +000069}
70
Denis Vlasenko9b49a5e2007-10-11 10:05:36 +000071int dos2unix_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
Denys Vlasenkoe992bae2009-11-28 15:18:53 +010072int dos2unix_main(int argc UNUSED_PARAM, char **argv)
Eric Andersen655584b2001-07-25 07:22:55 +000073{
Denis Vlasenko09196572007-07-21 13:27:44 +000074 int o, conv_type;
Eric Andersen544891d2001-02-22 23:37:30 +000075
Rob Landleyf8154692005-09-01 03:11:19 +000076 /* See if we are supposed to be doing dos2unix or unix2dos */
Denis Vlasenko54296362008-02-17 14:31:50 +000077 conv_type = CT_UNIX2DOS;
Denis Vlasenko8f8f2682006-10-03 21:00:43 +000078 if (applet_name[0] == 'd') {
Denis Vlasenko54296362008-02-17 14:31:50 +000079 conv_type = CT_DOS2UNIX;
Eric Andersen655584b2001-07-25 07:22:55 +000080 }
Denis Vlasenko6a2f7f42007-08-16 10:35:17 +000081
Denis Vlasenko09196572007-07-21 13:27:44 +000082 /* -u convert to unix, -d convert to dos */
Denis Vlasenkoa0319ba2007-08-16 10:37:49 +000083 opt_complementary = "u--d:d--u"; /* mutually exclusive */
Denis Vlasenkofe7cd642007-08-18 15:32:12 +000084 o = getopt32(argv, "du");
Rob Landleyf8154692005-09-01 03:11:19 +000085
86 /* Do the conversion requested by an argument else do the default
87 * conversion depending on our name. */
88 if (o)
Denis Vlasenko09196572007-07-21 13:27:44 +000089 conv_type = o;
Eric Andersen544891d2001-02-22 23:37:30 +000090
Denys Vlasenkoe992bae2009-11-28 15:18:53 +010091 argv += optind;
Denis Vlasenko74324c82007-06-04 10:16:52 +000092 do {
93 /* might be convert(NULL) if there is no filename given */
Denys Vlasenkoe992bae2009-11-28 15:18:53 +010094 convert(*argv, conv_type);
Denys Vlasenkod1516c42010-07-17 22:43:42 +020095 } while (*argv && *++argv);
Eric Andersen544891d2001-02-22 23:37:30 +000096
Denis Vlasenko54296362008-02-17 14:31:50 +000097 return 0;
Eric Andersen544891d2001-02-22 23:37:30 +000098}