e1c04048eddfddd8d31fcfe7c11d907f0e22a686
[openwrt.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 @@ -76,6 +76,14 @@
377  
378  #include "common.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 @@ -375,7 +383,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 @@ -458,6 +466,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 @@ -467,11 +483,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                         errmsg ("skipping device_table entry '%s': no parent directory!", name);
438 @@ -485,6 +511,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 @@ -32,6 +32,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"