blob: 1911f5319bc545bb204332cb2c6810df63ea6c59 [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 *
Bernhard Reutner-Fischerb5353a22006-06-01 18:30:42 +000012 * Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
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
Denis Vlasenko74324c82007-06-04 10:16:52 +000017enum {
Bernhard Reutner-Fischerb5353a22006-06-01 18:30:42 +000018 CT_UNIX2DOS = 1,
19 CT_DOS2UNIX
Denis Vlasenko74324c82007-06-04 10:16:52 +000020};
"Vladimir N. Oleynik"6f347ef2005-10-15 10:23:55 +000021
Rob Landleyf8154692005-09-01 03:11:19 +000022/* if fn is NULL then input is stdin and output is stdout */
Denis Vlasenko54296362008-02-17 14:31:50 +000023static void convert(char *fn, int conv_type)
Eric Andersen655584b2001-07-25 07:22:55 +000024{
Rob Landleyf8154692005-09-01 03:11:19 +000025 FILE *in, *out;
Bernhard Reutner-Fischerb5353a22006-06-01 18:30:42 +000026 int i;
Denis Vlasenkoa1767a12008-06-14 04:28:41 +000027 char *temp_fn = temp_fn; /* for compiler */
28 char *resolved_fn = resolved_fn;
Glenn L McGratha6ce6702001-04-12 02:26:04 +000029
Denis Vlasenko74324c82007-06-04 10:16:52 +000030 in = stdin;
31 out = stdout;
Glenn L McGratha6ce6702001-04-12 02:26:04 +000032 if (fn != NULL) {
Denis Vlasenkoa1767a12008-06-14 04:28:41 +000033 struct stat st;
34
35 resolved_fn = xmalloc_follow_symlinks(fn);
36 if (resolved_fn == NULL)
37 bb_simple_perror_msg_and_die(fn);
Denis Vlasenko5415c852008-07-21 23:05:26 +000038 in = xfopen_for_read(resolved_fn);
Denis Vlasenkoa1767a12008-06-14 04:28:41 +000039 fstat(fileno(in), &st);
40
41 temp_fn = xasprintf("%sXXXXXX", resolved_fn);
42 i = mkstemp(temp_fn);
Denis Vlasenko54296362008-02-17 14:31:50 +000043 if (i == -1
Denis Vlasenkoa1767a12008-06-14 04:28:41 +000044 || fchmod(i, st.st_mode) == -1
Denis Vlasenko54296362008-02-17 14:31:50 +000045 ) {
Denis Vlasenkoa1767a12008-06-14 04:28:41 +000046 bb_simple_perror_msg_and_die(temp_fn);
Rob Landley330ac852006-03-14 21:49:18 +000047 }
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);
95 } while (*++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}