1*cd60bc56SAndroid Build Coastguard Worker /* SPDX-License-Identifier: GPL-2.0-or-later */
2*cd60bc56SAndroid Build Coastguard Worker #ifndef UTIL_H
3*cd60bc56SAndroid Build Coastguard Worker #define UTIL_H
4*cd60bc56SAndroid Build Coastguard Worker
5*cd60bc56SAndroid Build Coastguard Worker #include <stdlib.h>
6*cd60bc56SAndroid Build Coastguard Worker #include <stdarg.h>
7*cd60bc56SAndroid Build Coastguard Worker #include <stdbool.h>
8*cd60bc56SAndroid Build Coastguard Worker #include <getopt.h>
9*cd60bc56SAndroid Build Coastguard Worker
10*cd60bc56SAndroid Build Coastguard Worker /*
11*cd60bc56SAndroid Build Coastguard Worker * Copyright 2011 The Chromium Authors, All Rights Reserved.
12*cd60bc56SAndroid Build Coastguard Worker * Copyright 2008 Jon Loeliger, Freescale Semiconductor, Inc.
13*cd60bc56SAndroid Build Coastguard Worker */
14*cd60bc56SAndroid Build Coastguard Worker
15*cd60bc56SAndroid Build Coastguard Worker #ifdef __GNUC__
16*cd60bc56SAndroid Build Coastguard Worker #if __GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
17*cd60bc56SAndroid Build Coastguard Worker #define PRINTF(i, j) __attribute__((format (gnu_printf, i, j)))
18*cd60bc56SAndroid Build Coastguard Worker #else
19*cd60bc56SAndroid Build Coastguard Worker #define PRINTF(i, j) __attribute__((format (printf, i, j)))
20*cd60bc56SAndroid Build Coastguard Worker #endif
21*cd60bc56SAndroid Build Coastguard Worker #define NORETURN __attribute__((noreturn))
22*cd60bc56SAndroid Build Coastguard Worker #else
23*cd60bc56SAndroid Build Coastguard Worker #define PRINTF(i, j)
24*cd60bc56SAndroid Build Coastguard Worker #define NORETURN
25*cd60bc56SAndroid Build Coastguard Worker #endif
26*cd60bc56SAndroid Build Coastguard Worker
27*cd60bc56SAndroid Build Coastguard Worker #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
28*cd60bc56SAndroid Build Coastguard Worker
29*cd60bc56SAndroid Build Coastguard Worker #define stringify(s) stringify_(s)
30*cd60bc56SAndroid Build Coastguard Worker #define stringify_(s) #s
31*cd60bc56SAndroid Build Coastguard Worker
die(const char * str,...)32*cd60bc56SAndroid Build Coastguard Worker static inline void NORETURN PRINTF(1, 2) die(const char *str, ...)
33*cd60bc56SAndroid Build Coastguard Worker {
34*cd60bc56SAndroid Build Coastguard Worker va_list ap;
35*cd60bc56SAndroid Build Coastguard Worker
36*cd60bc56SAndroid Build Coastguard Worker va_start(ap, str);
37*cd60bc56SAndroid Build Coastguard Worker fprintf(stderr, "FATAL ERROR: ");
38*cd60bc56SAndroid Build Coastguard Worker vfprintf(stderr, str, ap);
39*cd60bc56SAndroid Build Coastguard Worker va_end(ap);
40*cd60bc56SAndroid Build Coastguard Worker exit(1);
41*cd60bc56SAndroid Build Coastguard Worker }
42*cd60bc56SAndroid Build Coastguard Worker
xmalloc(size_t len)43*cd60bc56SAndroid Build Coastguard Worker static inline void *xmalloc(size_t len)
44*cd60bc56SAndroid Build Coastguard Worker {
45*cd60bc56SAndroid Build Coastguard Worker void *new = malloc(len);
46*cd60bc56SAndroid Build Coastguard Worker
47*cd60bc56SAndroid Build Coastguard Worker if (!new)
48*cd60bc56SAndroid Build Coastguard Worker die("malloc() failed\n");
49*cd60bc56SAndroid Build Coastguard Worker
50*cd60bc56SAndroid Build Coastguard Worker return new;
51*cd60bc56SAndroid Build Coastguard Worker }
52*cd60bc56SAndroid Build Coastguard Worker
xrealloc(void * p,size_t len)53*cd60bc56SAndroid Build Coastguard Worker static inline void *xrealloc(void *p, size_t len)
54*cd60bc56SAndroid Build Coastguard Worker {
55*cd60bc56SAndroid Build Coastguard Worker void *new = realloc(p, len);
56*cd60bc56SAndroid Build Coastguard Worker
57*cd60bc56SAndroid Build Coastguard Worker if (!new)
58*cd60bc56SAndroid Build Coastguard Worker die("realloc() failed (len=%zd)\n", len);
59*cd60bc56SAndroid Build Coastguard Worker
60*cd60bc56SAndroid Build Coastguard Worker return new;
61*cd60bc56SAndroid Build Coastguard Worker }
62*cd60bc56SAndroid Build Coastguard Worker
63*cd60bc56SAndroid Build Coastguard Worker extern char *xstrdup(const char *s);
64*cd60bc56SAndroid Build Coastguard Worker extern char *xstrndup(const char *s, size_t len);
65*cd60bc56SAndroid Build Coastguard Worker
66*cd60bc56SAndroid Build Coastguard Worker extern int PRINTF(2, 3) xasprintf(char **strp, const char *fmt, ...);
67*cd60bc56SAndroid Build Coastguard Worker extern int PRINTF(2, 3) xasprintf_append(char **strp, const char *fmt, ...);
68*cd60bc56SAndroid Build Coastguard Worker extern int xavsprintf_append(char **strp, const char *fmt, va_list ap);
69*cd60bc56SAndroid Build Coastguard Worker extern char *join_path(const char *path, const char *name);
70*cd60bc56SAndroid Build Coastguard Worker
71*cd60bc56SAndroid Build Coastguard Worker /**
72*cd60bc56SAndroid Build Coastguard Worker * Check a property of a given length to see if it is all printable and
73*cd60bc56SAndroid Build Coastguard Worker * has a valid terminator. The property can contain either a single string,
74*cd60bc56SAndroid Build Coastguard Worker * or multiple strings each of non-zero length.
75*cd60bc56SAndroid Build Coastguard Worker *
76*cd60bc56SAndroid Build Coastguard Worker * @param data The string to check
77*cd60bc56SAndroid Build Coastguard Worker * @param len The string length including terminator
78*cd60bc56SAndroid Build Coastguard Worker * @return 1 if a valid printable string, 0 if not
79*cd60bc56SAndroid Build Coastguard Worker */
80*cd60bc56SAndroid Build Coastguard Worker bool util_is_printable_string(const void *data, int len);
81*cd60bc56SAndroid Build Coastguard Worker
82*cd60bc56SAndroid Build Coastguard Worker /*
83*cd60bc56SAndroid Build Coastguard Worker * Parse an escaped character starting at index i in string s. The resulting
84*cd60bc56SAndroid Build Coastguard Worker * character will be returned and the index i will be updated to point at the
85*cd60bc56SAndroid Build Coastguard Worker * character directly after the end of the encoding, this may be the '\0'
86*cd60bc56SAndroid Build Coastguard Worker * terminator of the string.
87*cd60bc56SAndroid Build Coastguard Worker */
88*cd60bc56SAndroid Build Coastguard Worker char get_escape_char(const char *s, int *i);
89*cd60bc56SAndroid Build Coastguard Worker
90*cd60bc56SAndroid Build Coastguard Worker /**
91*cd60bc56SAndroid Build Coastguard Worker * Read a device tree file into a buffer. This will report any errors on
92*cd60bc56SAndroid Build Coastguard Worker * stderr.
93*cd60bc56SAndroid Build Coastguard Worker *
94*cd60bc56SAndroid Build Coastguard Worker * @param filename The filename to read, or - for stdin
95*cd60bc56SAndroid Build Coastguard Worker * @param len If non-NULL, the amount of data we managed to read
96*cd60bc56SAndroid Build Coastguard Worker * @return Pointer to allocated buffer containing fdt, or NULL on error
97*cd60bc56SAndroid Build Coastguard Worker */
98*cd60bc56SAndroid Build Coastguard Worker char *utilfdt_read(const char *filename, size_t *len);
99*cd60bc56SAndroid Build Coastguard Worker
100*cd60bc56SAndroid Build Coastguard Worker /**
101*cd60bc56SAndroid Build Coastguard Worker * Read a device tree file into a buffer. Does not report errors, but only
102*cd60bc56SAndroid Build Coastguard Worker * returns them. The value returned can be passed to strerror() to obtain
103*cd60bc56SAndroid Build Coastguard Worker * an error message for the user.
104*cd60bc56SAndroid Build Coastguard Worker *
105*cd60bc56SAndroid Build Coastguard Worker * @param filename The filename to read, or - for stdin
106*cd60bc56SAndroid Build Coastguard Worker * @param buffp Returns pointer to buffer containing fdt
107*cd60bc56SAndroid Build Coastguard Worker * @param len If non-NULL, the amount of data we managed to read
108*cd60bc56SAndroid Build Coastguard Worker * @return 0 if ok, else an errno value representing the error
109*cd60bc56SAndroid Build Coastguard Worker */
110*cd60bc56SAndroid Build Coastguard Worker int utilfdt_read_err(const char *filename, char **buffp, size_t *len);
111*cd60bc56SAndroid Build Coastguard Worker
112*cd60bc56SAndroid Build Coastguard Worker /**
113*cd60bc56SAndroid Build Coastguard Worker * Write a device tree buffer to a file. This will report any errors on
114*cd60bc56SAndroid Build Coastguard Worker * stderr.
115*cd60bc56SAndroid Build Coastguard Worker *
116*cd60bc56SAndroid Build Coastguard Worker * @param filename The filename to write, or - for stdout
117*cd60bc56SAndroid Build Coastguard Worker * @param blob Pointer to buffer containing fdt
118*cd60bc56SAndroid Build Coastguard Worker * @return 0 if ok, -1 on error
119*cd60bc56SAndroid Build Coastguard Worker */
120*cd60bc56SAndroid Build Coastguard Worker int utilfdt_write(const char *filename, const void *blob);
121*cd60bc56SAndroid Build Coastguard Worker
122*cd60bc56SAndroid Build Coastguard Worker /**
123*cd60bc56SAndroid Build Coastguard Worker * Write a device tree buffer to a file. Does not report errors, but only
124*cd60bc56SAndroid Build Coastguard Worker * returns them. The value returned can be passed to strerror() to obtain
125*cd60bc56SAndroid Build Coastguard Worker * an error message for the user.
126*cd60bc56SAndroid Build Coastguard Worker *
127*cd60bc56SAndroid Build Coastguard Worker * @param filename The filename to write, or - for stdout
128*cd60bc56SAndroid Build Coastguard Worker * @param blob Pointer to buffer containing fdt
129*cd60bc56SAndroid Build Coastguard Worker * @return 0 if ok, else an errno value representing the error
130*cd60bc56SAndroid Build Coastguard Worker */
131*cd60bc56SAndroid Build Coastguard Worker int utilfdt_write_err(const char *filename, const void *blob);
132*cd60bc56SAndroid Build Coastguard Worker
133*cd60bc56SAndroid Build Coastguard Worker /**
134*cd60bc56SAndroid Build Coastguard Worker * Decode a data type string. The purpose of this string
135*cd60bc56SAndroid Build Coastguard Worker *
136*cd60bc56SAndroid Build Coastguard Worker * The string consists of an optional character followed by the type:
137*cd60bc56SAndroid Build Coastguard Worker * Modifier characters:
138*cd60bc56SAndroid Build Coastguard Worker * hh or b 1 byte
139*cd60bc56SAndroid Build Coastguard Worker * h 2 byte
140*cd60bc56SAndroid Build Coastguard Worker * l 4 byte, default
141*cd60bc56SAndroid Build Coastguard Worker *
142*cd60bc56SAndroid Build Coastguard Worker * Type character:
143*cd60bc56SAndroid Build Coastguard Worker * s string
144*cd60bc56SAndroid Build Coastguard Worker * i signed integer
145*cd60bc56SAndroid Build Coastguard Worker * u unsigned integer
146*cd60bc56SAndroid Build Coastguard Worker * x hex
147*cd60bc56SAndroid Build Coastguard Worker * r raw
148*cd60bc56SAndroid Build Coastguard Worker *
149*cd60bc56SAndroid Build Coastguard Worker * TODO: Implement ll modifier (8 bytes)
150*cd60bc56SAndroid Build Coastguard Worker * TODO: Implement o type (octal)
151*cd60bc56SAndroid Build Coastguard Worker *
152*cd60bc56SAndroid Build Coastguard Worker * @param fmt Format string to process
153*cd60bc56SAndroid Build Coastguard Worker * @param type Returns type found(s/d/u/x), or 0 if none
154*cd60bc56SAndroid Build Coastguard Worker * @param size Returns size found(1,2,4,8) or 4 if none
155*cd60bc56SAndroid Build Coastguard Worker * @return 0 if ok, -1 on error (no type given, or other invalid format)
156*cd60bc56SAndroid Build Coastguard Worker */
157*cd60bc56SAndroid Build Coastguard Worker int utilfdt_decode_type(const char *fmt, int *type, int *size);
158*cd60bc56SAndroid Build Coastguard Worker
159*cd60bc56SAndroid Build Coastguard Worker /*
160*cd60bc56SAndroid Build Coastguard Worker * This is a usage message fragment for the -t option. It is the format
161*cd60bc56SAndroid Build Coastguard Worker * supported by utilfdt_decode_type.
162*cd60bc56SAndroid Build Coastguard Worker */
163*cd60bc56SAndroid Build Coastguard Worker
164*cd60bc56SAndroid Build Coastguard Worker #define USAGE_TYPE_MSG \
165*cd60bc56SAndroid Build Coastguard Worker "<type>\ts=string, i=int, u=unsigned, x=hex, r=raw\n" \
166*cd60bc56SAndroid Build Coastguard Worker "\tOptional modifier prefix:\n" \
167*cd60bc56SAndroid Build Coastguard Worker "\t\thh or b=byte, h=2 byte, l=4 byte (default)";
168*cd60bc56SAndroid Build Coastguard Worker
169*cd60bc56SAndroid Build Coastguard Worker /**
170*cd60bc56SAndroid Build Coastguard Worker * Print property data in a readable format to stdout
171*cd60bc56SAndroid Build Coastguard Worker *
172*cd60bc56SAndroid Build Coastguard Worker * Properties that look like strings will be printed as strings. Otherwise
173*cd60bc56SAndroid Build Coastguard Worker * the data will be displayed either as cells (if len is a multiple of 4
174*cd60bc56SAndroid Build Coastguard Worker * bytes) or bytes.
175*cd60bc56SAndroid Build Coastguard Worker *
176*cd60bc56SAndroid Build Coastguard Worker * If len is 0 then this function does nothing.
177*cd60bc56SAndroid Build Coastguard Worker *
178*cd60bc56SAndroid Build Coastguard Worker * @param data Pointers to property data
179*cd60bc56SAndroid Build Coastguard Worker * @param len Length of property data
180*cd60bc56SAndroid Build Coastguard Worker */
181*cd60bc56SAndroid Build Coastguard Worker void utilfdt_print_data(const char *data, int len);
182*cd60bc56SAndroid Build Coastguard Worker
183*cd60bc56SAndroid Build Coastguard Worker /**
184*cd60bc56SAndroid Build Coastguard Worker * Show source version and exit
185*cd60bc56SAndroid Build Coastguard Worker */
186*cd60bc56SAndroid Build Coastguard Worker void NORETURN util_version(void);
187*cd60bc56SAndroid Build Coastguard Worker
188*cd60bc56SAndroid Build Coastguard Worker /**
189*cd60bc56SAndroid Build Coastguard Worker * Show usage and exit
190*cd60bc56SAndroid Build Coastguard Worker *
191*cd60bc56SAndroid Build Coastguard Worker * This helps standardize the output of various utils. You most likely want
192*cd60bc56SAndroid Build Coastguard Worker * to use the usage() helper below rather than call this.
193*cd60bc56SAndroid Build Coastguard Worker *
194*cd60bc56SAndroid Build Coastguard Worker * @param errmsg If non-NULL, an error message to display
195*cd60bc56SAndroid Build Coastguard Worker * @param synopsis The initial example usage text (and possible examples)
196*cd60bc56SAndroid Build Coastguard Worker * @param short_opts The string of short options
197*cd60bc56SAndroid Build Coastguard Worker * @param long_opts The structure of long options
198*cd60bc56SAndroid Build Coastguard Worker * @param opts_help An array of help strings (should align with long_opts)
199*cd60bc56SAndroid Build Coastguard Worker */
200*cd60bc56SAndroid Build Coastguard Worker void NORETURN util_usage(const char *errmsg, const char *synopsis,
201*cd60bc56SAndroid Build Coastguard Worker const char *short_opts,
202*cd60bc56SAndroid Build Coastguard Worker struct option const long_opts[],
203*cd60bc56SAndroid Build Coastguard Worker const char * const opts_help[]);
204*cd60bc56SAndroid Build Coastguard Worker
205*cd60bc56SAndroid Build Coastguard Worker /**
206*cd60bc56SAndroid Build Coastguard Worker * Show usage and exit
207*cd60bc56SAndroid Build Coastguard Worker *
208*cd60bc56SAndroid Build Coastguard Worker * If you name all your usage variables with usage_xxx, then you can call this
209*cd60bc56SAndroid Build Coastguard Worker * help macro rather than expanding all arguments yourself.
210*cd60bc56SAndroid Build Coastguard Worker *
211*cd60bc56SAndroid Build Coastguard Worker * @param errmsg If non-NULL, an error message to display
212*cd60bc56SAndroid Build Coastguard Worker */
213*cd60bc56SAndroid Build Coastguard Worker #define usage(errmsg) \
214*cd60bc56SAndroid Build Coastguard Worker util_usage(errmsg, usage_synopsis, usage_short_opts, \
215*cd60bc56SAndroid Build Coastguard Worker usage_long_opts, usage_opts_help)
216*cd60bc56SAndroid Build Coastguard Worker
217*cd60bc56SAndroid Build Coastguard Worker /**
218*cd60bc56SAndroid Build Coastguard Worker * Call getopt_long() with standard options
219*cd60bc56SAndroid Build Coastguard Worker *
220*cd60bc56SAndroid Build Coastguard Worker * Since all util code runs getopt in the same way, provide a helper.
221*cd60bc56SAndroid Build Coastguard Worker */
222*cd60bc56SAndroid Build Coastguard Worker #define util_getopt_long() getopt_long(argc, argv, usage_short_opts, \
223*cd60bc56SAndroid Build Coastguard Worker usage_long_opts, NULL)
224*cd60bc56SAndroid Build Coastguard Worker
225*cd60bc56SAndroid Build Coastguard Worker /* Helper for aligning long_opts array */
226*cd60bc56SAndroid Build Coastguard Worker #define a_argument required_argument
227*cd60bc56SAndroid Build Coastguard Worker
228*cd60bc56SAndroid Build Coastguard Worker /* Helper for usage_short_opts string constant */
229*cd60bc56SAndroid Build Coastguard Worker #define USAGE_COMMON_SHORT_OPTS "hV"
230*cd60bc56SAndroid Build Coastguard Worker
231*cd60bc56SAndroid Build Coastguard Worker /* Helper for usage_long_opts option array */
232*cd60bc56SAndroid Build Coastguard Worker #define USAGE_COMMON_LONG_OPTS \
233*cd60bc56SAndroid Build Coastguard Worker {"help", no_argument, NULL, 'h'}, \
234*cd60bc56SAndroid Build Coastguard Worker {"version", no_argument, NULL, 'V'}, \
235*cd60bc56SAndroid Build Coastguard Worker {NULL, no_argument, NULL, 0x0}
236*cd60bc56SAndroid Build Coastguard Worker
237*cd60bc56SAndroid Build Coastguard Worker /* Helper for usage_opts_help array */
238*cd60bc56SAndroid Build Coastguard Worker #define USAGE_COMMON_OPTS_HELP \
239*cd60bc56SAndroid Build Coastguard Worker "Print this help and exit", \
240*cd60bc56SAndroid Build Coastguard Worker "Print version and exit", \
241*cd60bc56SAndroid Build Coastguard Worker NULL
242*cd60bc56SAndroid Build Coastguard Worker
243*cd60bc56SAndroid Build Coastguard Worker /* Helper for getopt case statements */
244*cd60bc56SAndroid Build Coastguard Worker #define case_USAGE_COMMON_FLAGS \
245*cd60bc56SAndroid Build Coastguard Worker case 'h': usage(NULL); \
246*cd60bc56SAndroid Build Coastguard Worker case 'V': util_version(); \
247*cd60bc56SAndroid Build Coastguard Worker case '?': usage("unknown option");
248*cd60bc56SAndroid Build Coastguard Worker
249*cd60bc56SAndroid Build Coastguard Worker #endif /* UTIL_H */
250