458 lines
13 KiB
Diff
458 lines
13 KiB
Diff
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -7,6 +7,11 @@ ifeq ($(WITHOUT_XATTR), 1)
|
|
CPPFLAGS += -DWITHOUT_XATTR
|
|
endif
|
|
|
|
+ifeq ($(shell uname -o),Cygwin)
|
|
+CPPFLAGS += -I./include/cygwin
|
|
+endif
|
|
+
|
|
+ifneq ($(shell uname -o),Cygwin)
|
|
SUBDIRS = ubi-utils mkfs.ubifs
|
|
|
|
TARGETS = ftl_format flash_erase flash_eraseall nanddump doc_loadbios \
|
|
@@ -17,6 +22,10 @@ TARGETS = ftl_format flash_erase flash_e
|
|
rfddump rfdformat \
|
|
serve_image recv_image \
|
|
sumtool #jffs2reader
|
|
+else
|
|
+SUBDIRS =
|
|
+TARGETS = mkfs.jffs2
|
|
+endif
|
|
|
|
SYMLINKS =
|
|
|
|
--- /dev/null
|
|
+++ b/include/cygwin/bits-byteswap.h
|
|
@@ -0,0 +1,132 @@
|
|
+/* Macros to swap the order of bytes in integer values.
|
|
+ Copyright (C) 1997, 1998, 2000, 2002 Free Software Foundation, Inc.
|
|
+ This file is part of the GNU C Library.
|
|
+
|
|
+ The GNU C Library is free software; you can redistribute it and/or
|
|
+ modify it under the terms of the GNU Lesser General Public
|
|
+ License as published by the Free Software Foundation; either
|
|
+ version 2.1 of the License, or (at your option) any later version.
|
|
+
|
|
+ The GNU C Library is distributed in the hope that it will be useful,
|
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
+ Lesser General Public License for more details.
|
|
+
|
|
+ You should have received a copy of the GNU Lesser General Public
|
|
+ License along with the GNU C Library; if not, write to the Free
|
|
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
|
+ 02111-1307 USA. */
|
|
+
|
|
+#if !defined _BYTESWAP_H && !defined _NETINET_IN_H
|
|
+# error "Never use <bits/byteswap.h> directly; include <byteswap.h> instead."
|
|
+#endif
|
|
+
|
|
+#ifndef _BITS_BYTESWAP_H
|
|
+#define _BITS_BYTESWAP_H 1
|
|
+
|
|
+/* Swap bytes in 16 bit value. */
|
|
+#define __bswap_constant_16(x) \
|
|
+ ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))
|
|
+
|
|
+#ifdef __GNUC__
|
|
+# if __GNUC__ >= 2
|
|
+# define __bswap_16(x) \
|
|
+ (__extension__ \
|
|
+ ({ register unsigned short int __v, __x = (x); \
|
|
+ if (__builtin_constant_p (__x)) \
|
|
+ __v = __bswap_constant_16 (__x); \
|
|
+ else \
|
|
+ __asm__ ("rorw $8, %w0" \
|
|
+ : "=r" (__v) \
|
|
+ : "0" (__x) \
|
|
+ : "cc"); \
|
|
+ __v; }))
|
|
+# else
|
|
+/* This is better than nothing. */
|
|
+# define __bswap_16(x) \
|
|
+ (__extension__ \
|
|
+ ({ register unsigned short int __x = (x); __bswap_constant_16 (__x); }))
|
|
+# endif
|
|
+#else
|
|
+static __inline unsigned short int
|
|
+__bswap_16 (unsigned short int __bsx)
|
|
+{
|
|
+ return __bswap_constant_16 (__bsx);
|
|
+}
|
|
+#endif
|
|
+
|
|
+/* Swap bytes in 32 bit value. */
|
|
+#define __bswap_constant_32(x) \
|
|
+ ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \
|
|
+ (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24))
|
|
+
|
|
+#ifdef __GNUC__
|
|
+# if __GNUC__ >= 2
|
|
+/* To swap the bytes in a word the i486 processors and up provide the
|
|
+ `bswap' opcode. On i386 we have to use three instructions. */
|
|
+# if !defined __i486__ && !defined __pentium__ && !defined __pentiumpro__
|
|
+# define __bswap_32(x) \
|
|
+ (__extension__ \
|
|
+ ({ register unsigned int __v, __x = (x); \
|
|
+ if (__builtin_constant_p (__x)) \
|
|
+ __v = __bswap_constant_32 (__x); \
|
|
+ else \
|
|
+ __asm__ ("rorw $8, %w0;" \
|
|
+ "rorl $16, %0;" \
|
|
+ "rorw $8, %w0" \
|
|
+ : "=r" (__v) \
|
|
+ : "0" (__x) \
|
|
+ : "cc"); \
|
|
+ __v; }))
|
|
+# else
|
|
+# define __bswap_32(x) \
|
|
+ (__extension__ \
|
|
+ ({ register unsigned int __v, __x = (x); \
|
|
+ if (__builtin_constant_p (__x)) \
|
|
+ __v = __bswap_constant_32 (__x); \
|
|
+ else \
|
|
+ __asm__ ("bswap %0" : "=r" (__v) : "0" (__x)); \
|
|
+ __v; }))
|
|
+# endif
|
|
+# else
|
|
+# define __bswap_32(x) \
|
|
+ (__extension__ \
|
|
+ ({ register unsigned int __x = (x); __bswap_constant_32 (__x); }))
|
|
+# endif
|
|
+#else
|
|
+static __inline unsigned int
|
|
+__bswap_32 (unsigned int __bsx)
|
|
+{
|
|
+ return __bswap_constant_32 (__bsx);
|
|
+}
|
|
+#endif
|
|
+
|
|
+
|
|
+#if defined __GNUC__ && __GNUC__ >= 2
|
|
+/* Swap bytes in 64 bit value. */
|
|
+#define __bswap_constant_64(x) \
|
|
+ ((((x) & 0xff00000000000000ull) >> 56) \
|
|
+ | (((x) & 0x00ff000000000000ull) >> 40) \
|
|
+ | (((x) & 0x0000ff0000000000ull) >> 24) \
|
|
+ | (((x) & 0x000000ff00000000ull) >> 8) \
|
|
+ | (((x) & 0x00000000ff000000ull) << 8) \
|
|
+ | (((x) & 0x0000000000ff0000ull) << 24) \
|
|
+ | (((x) & 0x000000000000ff00ull) << 40) \
|
|
+ | (((x) & 0x00000000000000ffull) << 56))
|
|
+
|
|
+# define __bswap_64(x) \
|
|
+ (__extension__ \
|
|
+ ({ union { __extension__ unsigned long long int __ll; \
|
|
+ unsigned long int __l[2]; } __w, __r; \
|
|
+ if (__builtin_constant_p (x)) \
|
|
+ __r.__ll = __bswap_constant_64 (x); \
|
|
+ else \
|
|
+ { \
|
|
+ __w.__ll = (x); \
|
|
+ __r.__l[0] = __bswap_32 (__w.__l[1]); \
|
|
+ __r.__l[1] = __bswap_32 (__w.__l[0]); \
|
|
+ } \
|
|
+ __r.__ll; }))
|
|
+#endif
|
|
+
|
|
+#endif /* _BITS_BYTESWAP_H */
|
|
--- /dev/null
|
|
+++ b/include/cygwin/byteswap.h
|
|
@@ -0,0 +1,40 @@
|
|
+/* Copyright (C) 1997 Free Software Foundation, Inc.
|
|
+ This file is part of the GNU C Library.
|
|
+
|
|
+ The GNU C Library is free software; you can redistribute it and/or
|
|
+ modify it under the terms of the GNU Lesser General Public
|
|
+ License as published by the Free Software Foundation; either
|
|
+ version 2.1 of the License, or (at your option) any later version.
|
|
+
|
|
+ The GNU C Library is distributed in the hope that it will be useful,
|
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
+ Lesser General Public License for more details.
|
|
+
|
|
+ You should have received a copy of the GNU Lesser General Public
|
|
+ License along with the GNU C Library; if not, write to the Free
|
|
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
|
+ 02111-1307 USA. */
|
|
+
|
|
+#ifndef _BYTESWAP_H
|
|
+#define _BYTESWAP_H 1
|
|
+
|
|
+/* Get the machine specific, optimized definitions. */
|
|
+#include "bits-byteswap.h"
|
|
+
|
|
+
|
|
+/* The following definitions must all be macros since otherwise some
|
|
+ of the possible optimizations are not possible. */
|
|
+
|
|
+/* Return a value with all bytes in the 16 bit argument swapped. */
|
|
+#define bswap_16(x) __bswap_16 (x)
|
|
+
|
|
+/* Return a value with all bytes in the 32 bit argument swapped. */
|
|
+#define bswap_32(x) __bswap_32 (x)
|
|
+
|
|
+#if defined __GNUC__ && __GNUC__ >= 2
|
|
+/* Return a value with all bytes in the 64 bit argument swapped. */
|
|
+# define bswap_64(x) __bswap_64 (x)
|
|
+#endif
|
|
+
|
|
+#endif /* byteswap.h */
|
|
--- /dev/null
|
|
+++ b/include/cygwin/endian.h
|
|
@@ -0,0 +1,26 @@
|
|
+#ifndef _CYGENDIAN_H_
|
|
+#define _CYGENDIAN_H_
|
|
+
|
|
+#ifdef __CYGWIN__
|
|
+
|
|
+#include <sys/param.h>
|
|
+
|
|
+#ifndef __BIG_ENDIAN
|
|
+#define __BIG_ENDIAN 4321
|
|
+#endif
|
|
+
|
|
+#ifndef __LITTLE_ENDIAN
|
|
+#define __LITTLE_ENDIAN 1234
|
|
+#endif
|
|
+
|
|
+#ifndef __BYTE_ORDER
|
|
+#define __BYTE_ORDER __LITTLE_ENDIAN
|
|
+#endif
|
|
+
|
|
+#ifndef BYTE_ORDER
|
|
+#define BYTE_ORDER __LITTLE_ENDIAN
|
|
+#endif
|
|
+
|
|
+#endif /* __CYGWIN__ */
|
|
+
|
|
+#endif /* _CYGENDIAN_H_ */
|
|
--- /dev/null
|
|
+++ b/include/cygwin/ioctl.h
|
|
@@ -0,0 +1,38 @@
|
|
+#ifndef _CYGIOCTL_H_
|
|
+#define _CYGIOCTL_H_
|
|
+
|
|
+#ifdef __CYGWIN__
|
|
+
|
|
+#define _IOC_NRBITS 8
|
|
+#define _IOC_TYPEBITS 8
|
|
+#define _IOC_SIZEBITS 14
|
|
+#define _IOC_DIRBITS 2
|
|
+
|
|
+#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1)
|
|
+#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1)
|
|
+#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1)
|
|
+#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1)
|
|
+
|
|
+#define _IOC_NRSHIFT 0
|
|
+#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS)
|
|
+#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS)
|
|
+#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS)
|
|
+
|
|
+#define _IOC_NONE 0U
|
|
+#define _IOC_WRITE 1U
|
|
+#define _IOC_READ 2U
|
|
+
|
|
+#define _IOC(dir,type,nr,size) \
|
|
+ (((dir) << _IOC_DIRSHIFT) | \
|
|
+ ((type) << _IOC_TYPESHIFT) | \
|
|
+ ((nr) << _IOC_NRSHIFT) | \
|
|
+ ((size) << _IOC_SIZESHIFT))
|
|
+
|
|
+#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0)
|
|
+#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size))
|
|
+#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size))
|
|
+#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))
|
|
+
|
|
+#endif /* __CYGWIN__ */
|
|
+
|
|
+#endif /* _CYGIOCTL_H_ */
|
|
--- /dev/null
|
|
+++ b/include/cygwin/pread.c
|
|
@@ -0,0 +1,41 @@
|
|
+#ifdef __CYGWIN__
|
|
+
|
|
+#include <errno.h>
|
|
+
|
|
+ssize_t
|
|
+pread(int fd, void *p, size_t n, off_t off)
|
|
+{
|
|
+ off_t ooff;
|
|
+ int oerrno;
|
|
+
|
|
+ if ((ooff = lseek(fd, off, SEEK_SET)) == -1)
|
|
+ return -1;
|
|
+
|
|
+ n = read(fd, p, n);
|
|
+
|
|
+ oerrno = errno;
|
|
+ lseek(fd, ooff, SEEK_SET);
|
|
+ errno = oerrno;
|
|
+
|
|
+ return n;
|
|
+}
|
|
+
|
|
+ssize_t
|
|
+pwrite(int fd, const void *p, size_t n, off_t off)
|
|
+{
|
|
+ off_t ooff;
|
|
+ int oerrno;
|
|
+
|
|
+ if ((ooff = lseek(fd, off, SEEK_SET)) == -1)
|
|
+ return -1;
|
|
+
|
|
+ n = write(fd, p, n);
|
|
+
|
|
+ oerrno = errno;
|
|
+ lseek(fd, ooff, SEEK_SET);
|
|
+ errno = oerrno;
|
|
+
|
|
+ return n;
|
|
+}
|
|
+
|
|
+#endif /* __CYGWIN__ */
|
|
--- /dev/null
|
|
+++ b/lnconf.sh
|
|
@@ -0,0 +1,53 @@
|
|
+#!/bin/sh
|
|
+#
|
|
+# Generic configure replacement.
|
|
+#
|
|
+# $Id: lnconf.sh,v 1.1 2004/04/05 21:55:59 igor Exp $
|
|
+#
|
|
+# Copies all files from the script directory to the current one.
|
|
+# Intended to replace 'configure' for packages that don't have one, to
|
|
+# allow building outside of the source tree.
|
|
+#
|
|
+# Note: this does not do any fancy things with detecting shells and
|
|
+# supporting other platforms. But it should work on Cygwin.
|
|
+
|
|
+# find out where the script is located
|
|
+tdir=`echo "$0" | sed 's%[\\/][^\\/][^\\/]*$%%'`
|
|
+test "x$tdir" = "x$0" && tdir=.
|
|
+
|
|
+a_srcdir=`cd $tdir; pwd`
|
|
+a_destdir=`pwd`
|
|
+
|
|
+# sanity checks:
|
|
+# are we in the script directory?
|
|
+test "x$a_srcdir" = "x$a_destdir" && exit 0
|
|
+# is there any chance that this is the script directory?
|
|
+test "x`cd "$a_srcdir" && /bin/ls -id`" = "x`/bin/ls -id`" && exit 0
|
|
+
|
|
+# try to find lndir and use it if it's available
|
|
+LNDIR="`which lndir 2>/dev/null`"
|
|
+if [ "x$LNDIR" = "x" ]; then
|
|
+ lndir() {
|
|
+ test "x$1" = "x" && return 1
|
|
+ # be careful of the current directory
|
|
+ DINODE=`find . -maxdepth 0 -ls | sed 's/ .*$//'`
|
|
+ case "`pwd`" in
|
|
+ "`cd "$1" && pwd`"/*) CUR="-type d -inum $DINODE -prune -o";;
|
|
+ esac
|
|
+ # duplicate the directory structure
|
|
+ (cd "$1" && find . $CUR -type d -mindepth 1 -print) | xargs -tr mkdir -p
|
|
+ # copy all symbolic links
|
|
+ (cd "$1" && find . $CUR -type l -mindepth 1 -print) | xargs -ri sh -c "ln -s \"\`readlink "$1/{}"\`\" \"{}\""
|
|
+ # or simply
|
|
+ #(cd "$1" && find . $CUR -type l -mindepth 1 -print) | xargs -ri ln -s "$1"/{} {}
|
|
+ # link all files
|
|
+ (cd "$1" && find . $CUR -type f -mindepth 1 -print) | xargs -ri ln -s "$1"/{} {}
|
|
+ }
|
|
+else
|
|
+ lndir() {
|
|
+ "$LNDIR" "$@"
|
|
+ }
|
|
+fi
|
|
+
|
|
+lndir "$tdir"
|
|
+
|
|
--- a/mkfs.jffs2.c
|
|
+++ b/mkfs.jffs2.c
|
|
@@ -75,6 +75,14 @@
|
|
#include "crc32.h"
|
|
#include "rbtree.h"
|
|
|
|
+#ifdef __CYGWIN__
|
|
+#include <cygwin/ioctl.h>
|
|
+#include <cygwin/endian.h>
|
|
+#include <cygwin/pread.c>
|
|
+# define IFTODT(mode) (((mode) & 0170000) >> 12)
|
|
+# define DTTOIF(dirtype) ((dirtype) << 12)
|
|
+#endif /* __CYGWIN__ */
|
|
+
|
|
/* Do not use the weird XPG version of basename */
|
|
#undef basename
|
|
|
|
@@ -474,7 +482,7 @@ static struct filesystem_entry *recursiv
|
|
the following macros use it if available or use a hacky workaround...
|
|
*/
|
|
|
|
-#ifdef __GNUC__
|
|
+#if defined __GNUC__ && !defined __CYGWIN__
|
|
#define SCANF_PREFIX "a"
|
|
#define SCANF_STRING(s) (&s)
|
|
#define GETCWD_SIZE 0
|
|
@@ -557,6 +565,14 @@ static int interpret_table_entry(struct
|
|
}
|
|
entry = find_filesystem_entry(root, name, mode);
|
|
if (entry) {
|
|
+ /* Check the type */
|
|
+ if ((mode & S_IFMT) != (entry->sb.st_mode & S_IFMT)) {
|
|
+ error_msg ("skipping device_table entry '%s': type mismatch!", name);
|
|
+ free(name);
|
|
+ free(hostpath);
|
|
+ return 1;
|
|
+ }
|
|
+
|
|
/* Ok, we just need to fixup the existing entry
|
|
* and we will be all done... */
|
|
entry->sb.st_uid = uid;
|
|
@@ -566,11 +582,21 @@ static int interpret_table_entry(struct
|
|
entry->sb.st_rdev = makedev(major, minor);
|
|
}
|
|
} else {
|
|
+ if (type == 'f' || type == 'l') {
|
|
+ error_msg ("skipping device_table entry '%s': file does not exist!", name);
|
|
+ free(name);
|
|
+ free(hostpath);
|
|
+ return 1;
|
|
+ }
|
|
/* If parent is NULL (happens with device table entries),
|
|
* try and find our parent now) */
|
|
tmp = strdup(name);
|
|
dir = dirname(tmp);
|
|
- parent = find_filesystem_entry(root, dir, S_IFDIR);
|
|
+ if (!strcmp(dir, "/")) {
|
|
+ parent = root;
|
|
+ } else {
|
|
+ parent = find_filesystem_entry(root, dir, S_IFDIR);
|
|
+ }
|
|
free(tmp);
|
|
if (parent == NULL) {
|
|
error_msg ("skipping device_table entry '%s': no parent directory!", name);
|
|
@@ -584,6 +610,7 @@ static int interpret_table_entry(struct
|
|
add_host_filesystem_entry(name, hostpath, uid, gid, mode, 0, parent);
|
|
break;
|
|
case 'f':
|
|
+ case 'l':
|
|
add_host_filesystem_entry(name, hostpath, uid, gid, mode, 0, parent);
|
|
break;
|
|
case 'p':
|
|
--- a/ubi-utils/src/libubi.c
|
|
+++ b/ubi-utils/src/libubi.c
|
|
@@ -30,6 +30,9 @@
|
|
#include <sys/ioctl.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/types.h>
|
|
+#ifdef __CYGWIN__
|
|
+#include <cygwin/ioctl.h>
|
|
+#endif
|
|
#include <libubi.h>
|
|
#include "libubi_int.h"
|
|
#include "common.h"
|