tools/mtd-utils: update to mtd-utils-20101001, fix FreeBSD (and hopefully Darwin...
[openwrt/svn-archive/archive.git] / tools / mtd-utils / patches / 120-cygwin_fixes.patch
1 --- a/Makefile
2 +++ b/Makefile
3 @@ -7,6 +7,11 @@ ifeq ($(WITHOUT_XATTR), 1)
4 CPPFLAGS += -DWITHOUT_XATTR
5 endif
6
7 +ifeq ($(shell uname -o),Cygwin)
8 +CPPFLAGS += -I./include/cygwin
9 +endif
10 +
11 +ifneq ($(shell uname -o),Cygwin)
12 SUBDIRS = lib ubi-utils mkfs.ubifs
13
14 TARGETS = ftl_format flash_erase nanddump doc_loadbios \
15 @@ -17,6 +22,10 @@ TARGETS = ftl_format flash_erase nanddum
16 rfddump rfdformat \
17 serve_image recv_image \
18 sumtool #jffs2reader
19 +else
20 +SUBDIRS =
21 +TARGETS = mkfs.jffs2
22 +endif
23 SCRIPTS = flash_eraseall
24
25 SYMLINKS =
26 --- /dev/null
27 +++ b/include/cygwin/bits-byteswap.h
28 @@ -0,0 +1,132 @@
29 +/* Macros to swap the order of bytes in integer values.
30 + Copyright (C) 1997, 1998, 2000, 2002 Free Software Foundation, Inc.
31 + This file is part of the GNU C Library.
32 +
33 + The GNU C Library is free software; you can redistribute it and/or
34 + modify it under the terms of the GNU Lesser General Public
35 + License as published by the Free Software Foundation; either
36 + version 2.1 of the License, or (at your option) any later version.
37 +
38 + The GNU C Library is distributed in the hope that it will be useful,
39 + but WITHOUT ANY WARRANTY; without even the implied warranty of
40 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
41 + Lesser General Public License for more details.
42 +
43 + You should have received a copy of the GNU Lesser General Public
44 + License along with the GNU C Library; if not, write to the Free
45 + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
46 + 02111-1307 USA. */
47 +
48 +#if !defined _BYTESWAP_H && !defined _NETINET_IN_H
49 +# error "Never use <bits/byteswap.h> directly; include <byteswap.h> instead."
50 +#endif
51 +
52 +#ifndef _BITS_BYTESWAP_H
53 +#define _BITS_BYTESWAP_H 1
54 +
55 +/* Swap bytes in 16 bit value. */
56 +#define __bswap_constant_16(x) \
57 + ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))
58 +
59 +#ifdef __GNUC__
60 +# if __GNUC__ >= 2
61 +# define __bswap_16(x) \
62 + (__extension__ \
63 + ({ register unsigned short int __v, __x = (x); \
64 + if (__builtin_constant_p (__x)) \
65 + __v = __bswap_constant_16 (__x); \
66 + else \
67 + __asm__ ("rorw $8, %w0" \
68 + : "=r" (__v) \
69 + : "0" (__x) \
70 + : "cc"); \
71 + __v; }))
72 +# else
73 +/* This is better than nothing. */
74 +# define __bswap_16(x) \
75 + (__extension__ \
76 + ({ register unsigned short int __x = (x); __bswap_constant_16 (__x); }))
77 +# endif
78 +#else
79 +static __inline unsigned short int
80 +__bswap_16 (unsigned short int __bsx)
81 +{
82 + return __bswap_constant_16 (__bsx);
83 +}
84 +#endif
85 +
86 +/* Swap bytes in 32 bit value. */
87 +#define __bswap_constant_32(x) \
88 + ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \
89 + (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24))
90 +
91 +#ifdef __GNUC__
92 +# if __GNUC__ >= 2
93 +/* To swap the bytes in a word the i486 processors and up provide the
94 + `bswap' opcode. On i386 we have to use three instructions. */
95 +# if !defined __i486__ && !defined __pentium__ && !defined __pentiumpro__
96 +# define __bswap_32(x) \
97 + (__extension__ \
98 + ({ register unsigned int __v, __x = (x); \
99 + if (__builtin_constant_p (__x)) \
100 + __v = __bswap_constant_32 (__x); \
101 + else \
102 + __asm__ ("rorw $8, %w0;" \
103 + "rorl $16, %0;" \
104 + "rorw $8, %w0" \
105 + : "=r" (__v) \
106 + : "0" (__x) \
107 + : "cc"); \
108 + __v; }))
109 +# else
110 +# define __bswap_32(x) \
111 + (__extension__ \
112 + ({ register unsigned int __v, __x = (x); \
113 + if (__builtin_constant_p (__x)) \
114 + __v = __bswap_constant_32 (__x); \
115 + else \
116 + __asm__ ("bswap %0" : "=r" (__v) : "0" (__x)); \
117 + __v; }))
118 +# endif
119 +# else
120 +# define __bswap_32(x) \
121 + (__extension__ \
122 + ({ register unsigned int __x = (x); __bswap_constant_32 (__x); }))
123 +# endif
124 +#else
125 +static __inline unsigned int
126 +__bswap_32 (unsigned int __bsx)
127 +{
128 + return __bswap_constant_32 (__bsx);
129 +}
130 +#endif
131 +
132 +
133 +#if defined __GNUC__ && __GNUC__ >= 2
134 +/* Swap bytes in 64 bit value. */
135 +#define __bswap_constant_64(x) \
136 + ((((x) & 0xff00000000000000ull) >> 56) \
137 + | (((x) & 0x00ff000000000000ull) >> 40) \
138 + | (((x) & 0x0000ff0000000000ull) >> 24) \
139 + | (((x) & 0x000000ff00000000ull) >> 8) \
140 + | (((x) & 0x00000000ff000000ull) << 8) \
141 + | (((x) & 0x0000000000ff0000ull) << 24) \
142 + | (((x) & 0x000000000000ff00ull) << 40) \
143 + | (((x) & 0x00000000000000ffull) << 56))
144 +
145 +# define __bswap_64(x) \
146 + (__extension__ \
147 + ({ union { __extension__ unsigned long long int __ll; \
148 + unsigned long int __l[2]; } __w, __r; \
149 + if (__builtin_constant_p (x)) \
150 + __r.__ll = __bswap_constant_64 (x); \
151 + else \
152 + { \
153 + __w.__ll = (x); \
154 + __r.__l[0] = __bswap_32 (__w.__l[1]); \
155 + __r.__l[1] = __bswap_32 (__w.__l[0]); \
156 + } \
157 + __r.__ll; }))
158 +#endif
159 +
160 +#endif /* _BITS_BYTESWAP_H */
161 --- /dev/null
162 +++ b/include/cygwin/byteswap.h
163 @@ -0,0 +1,40 @@
164 +/* Copyright (C) 1997 Free Software Foundation, Inc.
165 + This file is part of the GNU C Library.
166 +
167 + The GNU C Library is free software; you can redistribute it and/or
168 + modify it under the terms of the GNU Lesser General Public
169 + License as published by the Free Software Foundation; either
170 + version 2.1 of the License, or (at your option) any later version.
171 +
172 + The GNU C Library is distributed in the hope that it will be useful,
173 + but WITHOUT ANY WARRANTY; without even the implied warranty of
174 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
175 + Lesser General Public License for more details.
176 +
177 + You should have received a copy of the GNU Lesser General Public
178 + License along with the GNU C Library; if not, write to the Free
179 + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
180 + 02111-1307 USA. */
181 +
182 +#ifndef _BYTESWAP_H
183 +#define _BYTESWAP_H 1
184 +
185 +/* Get the machine specific, optimized definitions. */
186 +#include "bits-byteswap.h"
187 +
188 +
189 +/* The following definitions must all be macros since otherwise some
190 + of the possible optimizations are not possible. */
191 +
192 +/* Return a value with all bytes in the 16 bit argument swapped. */
193 +#define bswap_16(x) __bswap_16 (x)
194 +
195 +/* Return a value with all bytes in the 32 bit argument swapped. */
196 +#define bswap_32(x) __bswap_32 (x)
197 +
198 +#if defined __GNUC__ && __GNUC__ >= 2
199 +/* Return a value with all bytes in the 64 bit argument swapped. */
200 +# define bswap_64(x) __bswap_64 (x)
201 +#endif
202 +
203 +#endif /* byteswap.h */
204 --- /dev/null
205 +++ b/include/cygwin/endian.h
206 @@ -0,0 +1,26 @@
207 +#ifndef _CYGENDIAN_H_
208 +#define _CYGENDIAN_H_
209 +
210 +#ifdef __CYGWIN__
211 +
212 +#include <sys/param.h>
213 +
214 +#ifndef __BIG_ENDIAN
215 +#define __BIG_ENDIAN 4321
216 +#endif
217 +
218 +#ifndef __LITTLE_ENDIAN
219 +#define __LITTLE_ENDIAN 1234
220 +#endif
221 +
222 +#ifndef __BYTE_ORDER
223 +#define __BYTE_ORDER __LITTLE_ENDIAN
224 +#endif
225 +
226 +#ifndef BYTE_ORDER
227 +#define BYTE_ORDER __LITTLE_ENDIAN
228 +#endif
229 +
230 +#endif /* __CYGWIN__ */
231 +
232 +#endif /* _CYGENDIAN_H_ */
233 --- /dev/null
234 +++ b/include/cygwin/ioctl.h
235 @@ -0,0 +1,38 @@
236 +#ifndef _CYGIOCTL_H_
237 +#define _CYGIOCTL_H_
238 +
239 +#ifdef __CYGWIN__
240 +
241 +#define _IOC_NRBITS 8
242 +#define _IOC_TYPEBITS 8
243 +#define _IOC_SIZEBITS 14
244 +#define _IOC_DIRBITS 2
245 +
246 +#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1)
247 +#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1)
248 +#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1)
249 +#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1)
250 +
251 +#define _IOC_NRSHIFT 0
252 +#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS)
253 +#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS)
254 +#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS)
255 +
256 +#define _IOC_NONE 0U
257 +#define _IOC_WRITE 1U
258 +#define _IOC_READ 2U
259 +
260 +#define _IOC(dir,type,nr,size) \
261 + (((dir) << _IOC_DIRSHIFT) | \
262 + ((type) << _IOC_TYPESHIFT) | \
263 + ((nr) << _IOC_NRSHIFT) | \
264 + ((size) << _IOC_SIZESHIFT))
265 +
266 +#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0)
267 +#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size))
268 +#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size))
269 +#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))
270 +
271 +#endif /* __CYGWIN__ */
272 +
273 +#endif /* _CYGIOCTL_H_ */
274 --- /dev/null
275 +++ b/include/cygwin/pread.c
276 @@ -0,0 +1,41 @@
277 +#ifdef __CYGWIN__
278 +
279 +#include <errno.h>
280 +
281 +ssize_t
282 +pread(int fd, void *p, size_t n, off_t off)
283 +{
284 + off_t ooff;
285 + int oerrno;
286 +
287 + if ((ooff = lseek(fd, off, SEEK_SET)) == -1)
288 + return -1;
289 +
290 + n = read(fd, p, n);
291 +
292 + oerrno = errno;
293 + lseek(fd, ooff, SEEK_SET);
294 + errno = oerrno;
295 +
296 + return n;
297 +}
298 +
299 +ssize_t
300 +pwrite(int fd, const void *p, size_t n, off_t off)
301 +{
302 + off_t ooff;
303 + int oerrno;
304 +
305 + if ((ooff = lseek(fd, off, SEEK_SET)) == -1)
306 + return -1;
307 +
308 + n = write(fd, p, n);
309 +
310 + oerrno = errno;
311 + lseek(fd, ooff, SEEK_SET);
312 + errno = oerrno;
313 +
314 + return n;
315 +}
316 +
317 +#endif /* __CYGWIN__ */
318 --- /dev/null
319 +++ b/lnconf.sh
320 @@ -0,0 +1,53 @@
321 +#!/bin/sh
322 +#
323 +# Generic configure replacement.
324 +#
325 +# $Id: lnconf.sh,v 1.1 2004/04/05 21:55:59 igor Exp $
326 +#
327 +# Copies all files from the script directory to the current one.
328 +# Intended to replace 'configure' for packages that don't have one, to
329 +# allow building outside of the source tree.
330 +#
331 +# Note: this does not do any fancy things with detecting shells and
332 +# supporting other platforms. But it should work on Cygwin.
333 +
334 +# find out where the script is located
335 +tdir=`echo "$0" | sed 's%[\\/][^\\/][^\\/]*$%%'`
336 +test "x$tdir" = "x$0" && tdir=.
337 +
338 +a_srcdir=`cd $tdir; pwd`
339 +a_destdir=`pwd`
340 +
341 +# sanity checks:
342 +# are we in the script directory?
343 +test "x$a_srcdir" = "x$a_destdir" && exit 0
344 +# is there any chance that this is the script directory?
345 +test "x`cd "$a_srcdir" && /bin/ls -id`" = "x`/bin/ls -id`" && exit 0
346 +
347 +# try to find lndir and use it if it's available
348 +LNDIR="`which lndir 2>/dev/null`"
349 +if [ "x$LNDIR" = "x" ]; then
350 + lndir() {
351 + test "x$1" = "x" && return 1
352 + # be careful of the current directory
353 + DINODE=`find . -maxdepth 0 -ls | sed 's/ .*$//'`
354 + case "`pwd`" in
355 + "`cd "$1" && pwd`"/*) CUR="-type d -inum $DINODE -prune -o";;
356 + esac
357 + # duplicate the directory structure
358 + (cd "$1" && find . $CUR -type d -mindepth 1 -print) | xargs -tr mkdir -p
359 + # copy all symbolic links
360 + (cd "$1" && find . $CUR -type l -mindepth 1 -print) | xargs -ri sh -c "ln -s \"\`readlink "$1/{}"\`\" \"{}\""
361 + # or simply
362 + #(cd "$1" && find . $CUR -type l -mindepth 1 -print) | xargs -ri ln -s "$1"/{} {}
363 + # link all files
364 + (cd "$1" && find . $CUR -type f -mindepth 1 -print) | xargs -ri ln -s "$1"/{} {}
365 + }
366 +else
367 + lndir() {
368 + "$LNDIR" "$@"
369 + }
370 +fi
371 +
372 +lndir "$tdir"
373 +
374 --- a/mkfs.jffs2.c
375 +++ b/mkfs.jffs2.c
376 @@ -75,6 +75,14 @@
377 #include "crc32.h"
378 #include "rbtree.h"
379
380 +#ifdef __CYGWIN__
381 +#include <cygwin/ioctl.h>
382 +#include <cygwin/endian.h>
383 +#include <cygwin/pread.c>
384 +# define IFTODT(mode) (((mode) & 0170000) >> 12)
385 +# define DTTOIF(dirtype) ((dirtype) << 12)
386 +#endif /* __CYGWIN__ */
387 +
388 /* Do not use the weird XPG version of basename */
389 #undef basename
390
391 @@ -474,7 +482,7 @@ static struct filesystem_entry *recursiv
392 the following macros use it if available or use a hacky workaround...
393 */
394
395 -#ifdef __GNUC__
396 +#if defined __GNUC__ && !defined __CYGWIN__
397 #define SCANF_PREFIX "a"
398 #define SCANF_STRING(s) (&s)
399 #define GETCWD_SIZE 0
400 @@ -557,6 +565,14 @@ static int interpret_table_entry(struct
401 }
402 entry = find_filesystem_entry(root, name, mode);
403 if (entry) {
404 + /* Check the type */
405 + if ((mode & S_IFMT) != (entry->sb.st_mode & S_IFMT)) {
406 + error_msg ("skipping device_table entry '%s': type mismatch!", name);
407 + free(name);
408 + free(hostpath);
409 + return 1;
410 + }
411 +
412 /* Ok, we just need to fixup the existing entry
413 * and we will be all done... */
414 entry->sb.st_uid = uid;
415 @@ -566,11 +582,21 @@ static int interpret_table_entry(struct
416 entry->sb.st_rdev = makedev(major, minor);
417 }
418 } else {
419 + if (type == 'f' || type == 'l') {
420 + error_msg ("skipping device_table entry '%s': file does not exist!", name);
421 + free(name);
422 + free(hostpath);
423 + return 1;
424 + }
425 /* If parent is NULL (happens with device table entries),
426 * try and find our parent now) */
427 tmp = strdup(name);
428 dir = dirname(tmp);
429 - parent = find_filesystem_entry(root, dir, S_IFDIR);
430 + if (!strcmp(dir, "/")) {
431 + parent = root;
432 + } else {
433 + parent = find_filesystem_entry(root, dir, S_IFDIR);
434 + }
435 free(tmp);
436 if (parent == NULL) {
437 error_msg ("skipping device_table entry '%s': no parent directory!", name);
438 @@ -584,6 +610,7 @@ static int interpret_table_entry(struct
439 add_host_filesystem_entry(name, hostpath, uid, gid, mode, 0, parent);
440 break;
441 case 'f':
442 + case 'l':
443 add_host_filesystem_entry(name, hostpath, uid, gid, mode, 0, parent);
444 break;
445 case 'p':
446 --- a/ubi-utils/src/libubi.c
447 +++ b/ubi-utils/src/libubi.c
448 @@ -30,6 +30,9 @@
449 #include <sys/ioctl.h>
450 #include <sys/stat.h>
451 #include <sys/types.h>
452 +#ifdef __CYGWIN__
453 +#include <cygwin/ioctl.h>
454 +#endif
455 #include <libubi.h>
456 #include "libubi_int.h"
457 #include "common.h"