summaryrefslogtreecommitdiffstats
path: root/scripts/dtc/dtc.c
diff options
context:
space:
mode:
authorRob Herring <robh@kernel.org>2016-01-26 10:04:11 -0500
committerRob Herring <robh@kernel.org>2016-02-11 20:45:09 -0500
commit91feabc2e2240ee80dc8ac08103cb83f497e4d12 (patch)
tree8bd53e02910f0d15b3516d7af298b03b19ca5dac /scripts/dtc/dtc.c
parent76df69806b7fafea013e2f4f82b0bd54498f3406 (diff)
scripts/dtc: Update to upstream commit b06e55c88b9b
Sync to upstream dtc commit b06e55c88b9b ("Prevent crash on modulo by zero"). This adds the following commits from upstream: b06e55c Prevent crash on modulo by zero b433450 Fix some bugs in processing of line directives d728ad5 Fix crash on nul character in string escape sequence 1ab2205 Gracefully handle bad octal literals 1937095 Prevent crash on division by zero d0b3ab0 libfdt: Fix undefined behaviour in fdt_offset_ptr() d4c7c25 libfdt: check for potential overrun in _fdt_splice() f58799b libfdt: Add some missing symbols to version.lds af9f26d Remove duplicated -Werror in dtc Makefile 604e61e fdt: Add functions to retrieve strings 8702bd1 fdt: Add a function to get the index of a string 2218387 fdt: Add a function to count strings 554fde2 libfdt: fix comment block of fdt_get_property_namelen() e5e6df7 fdtdump: Fix bug printing bytestrings with negative values 067829e Remove redundant fdtdump test code 897a429 Move fdt_path_offset alias tests to right tests section 2d1417c Add simple .travis.yml f6dbc6c guess output file format 5e78dff guess input file format based on file content or file name 8b927bf tests: convert `echo -n` to `printf` 64c46b0 Fix crash with poorly defined #size-cells Cc: Grant Likely <grant.likely@linaro.org> Tested-by: Frank Rowand <frank.rowand@sonymobile.com> Reviewed-by: Frank Rowand <frank.rowand@sonymobile.com> Signed-off-by: Rob Herring <robh@kernel.org>
Diffstat (limited to 'scripts/dtc/dtc.c')
-rw-r--r--scripts/dtc/dtc.c62
1 files changed, 60 insertions, 2 deletions
diff --git a/scripts/dtc/dtc.c b/scripts/dtc/dtc.c
index 8c4add69a765..5fa23c406266 100644
--- a/scripts/dtc/dtc.c
+++ b/scripts/dtc/dtc.c
@@ -18,6 +18,8 @@
18 * USA 18 * USA
19 */ 19 */
20 20
21#include <sys/stat.h>
22
21#include "dtc.h" 23#include "dtc.h"
22#include "srcpos.h" 24#include "srcpos.h"
23 25
@@ -104,11 +106,56 @@ static const char * const usage_opts_help[] = {
104 NULL, 106 NULL,
105}; 107};
106 108
109static const char *guess_type_by_name(const char *fname, const char *fallback)
110{
111 const char *s;
112
113 s = strrchr(fname, '.');
114 if (s == NULL)
115 return fallback;
116 if (!strcasecmp(s, ".dts"))
117 return "dts";
118 if (!strcasecmp(s, ".dtb"))
119 return "dtb";
120 return fallback;
121}
122
123static const char *guess_input_format(const char *fname, const char *fallback)
124{
125 struct stat statbuf;
126 uint32_t magic;
127 FILE *f;
128
129 if (stat(fname, &statbuf) != 0)
130 return fallback;
131
132 if (S_ISDIR(statbuf.st_mode))
133 return "fs";
134
135 if (!S_ISREG(statbuf.st_mode))
136 return fallback;
137
138 f = fopen(fname, "r");
139 if (f == NULL)
140 return fallback;
141 if (fread(&magic, 4, 1, f) != 1) {
142 fclose(f);
143 return fallback;
144 }
145 fclose(f);
146
147 magic = fdt32_to_cpu(magic);
148 if (magic == FDT_MAGIC)
149 return "dtb";
150
151 return guess_type_by_name(fname, fallback);
152}
153
107int main(int argc, char *argv[]) 154int main(int argc, char *argv[])
108{ 155{
109 struct boot_info *bi; 156 struct boot_info *bi;
110 const char *inform = "dts"; 157 const char *inform = NULL;
111 const char *outform = "dts"; 158 const char *outform = NULL;
112 const char *outname = "-"; 159 const char *outname = "-";
113 const char *depname = NULL; 160 const char *depname = NULL;
114 bool force = false, sort = false; 161 bool force = false, sort = false;
@@ -213,6 +260,17 @@ int main(int argc, char *argv[])
213 fprintf(depfile, "%s:", outname); 260 fprintf(depfile, "%s:", outname);
214 } 261 }
215 262
263 if (inform == NULL)
264 inform = guess_input_format(arg, "dts");
265 if (outform == NULL) {
266 outform = guess_type_by_name(outname, NULL);
267 if (outform == NULL) {
268 if (streq(inform, "dts"))
269 outform = "dtb";
270 else
271 outform = "dts";
272 }
273 }
216 if (streq(inform, "dts")) 274 if (streq(inform, "dts"))
217 bi = dt_from_source(arg); 275 bi = dt_from_source(arg);
218 else if (streq(inform, "fs")) 276 else if (streq(inform, "fs"))