summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/dosfstools/dosfstools/fix_populated_dosfs_creation.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-devtools/dosfstools/dosfstools/fix_populated_dosfs_creation.patch')
-rw-r--r--meta/recipes-devtools/dosfstools/dosfstools/fix_populated_dosfs_creation.patch489
1 files changed, 0 insertions, 489 deletions
diff --git a/meta/recipes-devtools/dosfstools/dosfstools/fix_populated_dosfs_creation.patch b/meta/recipes-devtools/dosfstools/dosfstools/fix_populated_dosfs_creation.patch
deleted file mode 100644
index 9d7f7321ac..0000000000
--- a/meta/recipes-devtools/dosfstools/dosfstools/fix_populated_dosfs_creation.patch
+++ /dev/null
@@ -1,489 +0,0 @@
-Upstream-Status: Inappropriate
-
-This patch fixes populated dosfs image creation with directory
-structures. Earlier it was causing segfault; and only image
-population with no subdirectories was working.
-
-Issues fixed:
-1. (dir->count == dir->entries) check was only needed for root
- directory entries. And this check is wrong for non-root
- directories.
-2. For each dir entry 2 dir->table entries were needed, one for
- the file/dir and 2nd for long file name support. Earlier long
- name support was added for filenames but the 2nd entry
- allocation, initialization & counting was missed.
-3. The memory clearing was missed at the code path after dir->table
- memroy allocation.
-4. Add entries for . & .. directories in all non-root directories.
-5. The . directory points to the correct entry in fat now.
-6. All directoriy entries' size was not zero as required for dosfsck,
- Now all directory entries' size is zero.
-
-Enhancements:
-1. Added support for long names for directory names. This is same
- as the existing long name support for filenames.
-2. Added error messages for previously silent memory allocation and
- other errors.
-3. -d options does not work correctly with fat32, so now throwing
- an error for that.
-4. Use predefined structures from kernel's msdos_fs.h file, rather
- than defining again here. And accordingly change the names & use
- of structure variables.
-
-Outstanding Issues:
-1. The .. directory entry do not point to the parent of current
- directory. This issue can be fixed by running dosfsck -a after
- image creation.
-2. For files the filesize is correct, but the clusters size is more
- than it needs to be, this also can be fixed by running dosfsck -a
- after image creation.
-
-Signed-off-by: Nitin A Kamble <nitin.a.kamble@intel.com>
-2011/12/13
-
-
-Index: dosfstools-2.11/mkdosfs/mkdosfs.c
-===================================================================
---- dosfstools-2.11.orig/mkdosfs/mkdosfs.c
-+++ dosfstools-2.11/mkdosfs/mkdosfs.c
-@@ -21,7 +21,17 @@
- June 2004 - Jordan Crouse (info.linux@amd.com)
- Added -d <directory> support to populate the image
- Copyright (C) 2004, Advanced Micro Devices, All Rights Reserved
--
-+
-+ 2011-12-13: Nitin A Kamble <nitin.a.kamble@intel.com>
-+ Enhanced the -d <directory> support for population of image while
-+ creation. Earlier subdirectores support was broken, only files in
-+ the rootdir were supported. Now directory hirarchy is supported.
-+ Also added long filename support to directory names.
-+ The -d <directory> option (image population while creation)
-+ is broken with fat32.
-+ Copyright (C) 2011, Intel Corporation, All Rights Reserved
-+
-+
- Fixes/additions May 1998 by Roman Hodek
- <Roman.Hodek@informatik.uni-erlangen.de>:
- - Atari format support
-@@ -86,23 +96,23 @@
- # undef __KERNEL__
- #endif
-
--#if __BYTE_ORDER == __BIG_ENDIAN
--
-+#ifndef __ASM_STUB_BYTEORDER_H__
- #include <asm/byteorder.h>
--#ifdef __le16_to_cpu
--/* ++roman: 2.1 kernel headers define these function, they're probably more
-- * efficient then coding the swaps machine-independently. */
--#define CF_LE_W __le16_to_cpu
--#define CF_LE_L __le32_to_cpu
--#define CT_LE_W __cpu_to_le16
--#define CT_LE_L __cpu_to_le32
--#else
--#define CF_LE_W(v) ((((v) & 0xff) << 8) | (((v) >> 8) & 0xff))
--#define CF_LE_L(v) (((unsigned)(v)>>24) | (((unsigned)(v)>>8)&0xff00) | \
-- (((unsigned)(v)<<8)&0xff0000) | ((unsigned)(v)<<24))
-+#endif
-+
-+#include <linux/msdos_fs.h>
-+
-+#undef CF_LE_W
-+#undef CF_LE_L
-+#undef CT_LE_W
-+#undef CT_LE_L
-+
-+#if __BYTE_ORDER == __BIG_ENDIAN
-+#include <byteswap.h>
-+#define CF_LE_W(v) bswap_16(v)
-+#define CF_LE_L(v) bswap_32(v)
- #define CT_LE_W(v) CF_LE_W(v)
- #define CT_LE_L(v) CF_LE_L(v)
--#endif /* defined(__le16_to_cpu) */
-
- #else
-
-@@ -253,33 +263,6 @@ struct fat32_fsinfo {
- __u32 reserved2[4];
- };
-
--/* This stores up to 13 chars of the name */
--
--struct msdos_dir_slot {
-- __u8 id; /* sequence number for slot */
-- __u8 name0_4[10]; /* first 5 characters in name */
-- __u8 attr; /* attribute byte */
-- __u8 reserved; /* always 0 */
-- __u8 alias_checksum; /* checksum for 8.3 alias */
-- __u8 name5_10[12]; /* 6 more characters in name */
-- __u16 start; /* starting cluster number, 0 in long slots */
-- __u8 name11_12[4]; /* last 2 characters in name */
--};
--
--struct msdos_dir_entry
-- {
-- char name[8], ext[3]; /* name and extension */
-- __u8 attr; /* attribute bits */
-- __u8 lcase; /* Case for base and extension */
-- __u8 ctime_ms; /* Creation time, milliseconds */
-- __u16 ctime; /* Creation time */
-- __u16 cdate; /* Creation date */
-- __u16 adate; /* Last access date */
-- __u16 starthi; /* high 16 bits of first cl. (FAT32) */
-- __u16 time, date, start; /* time, date and first cluster */
-- __u32 size; /* file size (in bytes) */
-- } __attribute__ ((packed));
--
- /* The "boot code" we put into the filesystem... it writes a message and
- tells the user to try again */
-
-@@ -356,7 +339,6 @@ static struct msdos_dir_entry *root_dir;
- static int size_root_dir; /* Size of the root directory in bytes */
- static int sectors_per_cluster = 0; /* Number of sectors per disk cluster */
- static int root_dir_entries = 0; /* Number of root directory entries */
--static int root_dir_num_entries = 0;
- static int last_cluster_written = 0;
-
- static char *blank_sector; /* Blank sector - all zeros */
-@@ -1315,7 +1297,7 @@ setup_tables (void)
- de->date = CT_LE_W((unsigned short)(ctime->tm_mday +
- ((ctime->tm_mon+1) << 5) +
- ((ctime->tm_year-80) << 9)));
-- de->ctime_ms = 0;
-+ de->ctime_cs = 0;
- de->ctime = de->time;
- de->cdate = de->date;
- de->adate = de->date;
-@@ -1451,16 +1433,23 @@ write_tables (void)
-
- /* Add a file to the specified directory entry, and also write it into the image */
-
--static void copy_filename(char *filename, char *base, char *ext) {
-+static void copy_filename(char *filename, char *dos_name) {
-
- char *ch = filename;
- int i, len;
-
-- memset(base, 0x20, 8);
-- memset(ext, 0x20, 3);
-+ if (!strcmp(filename, ".")) {
-+ strncpy(dos_name, MSDOS_DOT, MSDOS_NAME);
-+ return;
-+ }
-+ if (!strcmp(filename, "..")) {
-+ strncpy(dos_name, MSDOS_DOTDOT, MSDOS_NAME);
-+ return;
-+ }
-+ memset(dos_name, 0x20, MSDOS_NAME);
-
- for(len = 0 ; *ch && *ch != '.'; ch++) {
-- base[len++] = toupper(*ch);
-+ dos_name[len++] = toupper(*ch);
- if (len == 8) break;
- }
-
-@@ -1468,7 +1457,7 @@ static void copy_filename(char *filename
- if (*ch) ch++;
-
- for(len = 0 ; *ch; ch++) {
-- ext[len++] = toupper(*ch);
-+ dos_name[8 + len++] = toupper(*ch);
- if (len == 3) break;
- }
- }
-@@ -1551,7 +1540,7 @@ static int add_file(char *filename, stru
- int start;
- int usedsec, totalsec;
-
-- char name83[8], ext83[3];
-+ char dos_name[MSDOS_NAME+1];
-
- struct msdos_dir_slot *slot;
- int i;
-@@ -1562,23 +1551,22 @@ static int add_file(char *filename, stru
- if (dir->root) {
- if (dir->count == dir->entries) {
- printf("Error - too many directory entries\n");
-+ return;
- }
- }
- else {
-- if (dir->count == dir->entries) {
-- if (!dir->table)
-- dir->table =
-- (struct msdos_dir_entry *) malloc(sizeof(struct msdos_dir_entry));
-- else {
-- dir->table =
-- (struct msdos_dir_entry *) realloc(dir->table, (dir->entries + 1) *
-- sizeof(struct msdos_dir_entry));
--
-- memset(&dir->table[dir->entries], 0, sizeof(struct msdos_dir_entry));
-- }
--
-- dir->entries++;
-- }
-+ /* 2 entries, one extra for long filename */
-+ if (!dir->table)
-+ dir->table =
-+ (struct msdos_dir_entry *) malloc(2 * sizeof(struct msdos_dir_entry));
-+ else
-+ dir->table =
-+ (struct msdos_dir_entry *) realloc(dir->table, 2 * (dir->entries + 1) *
-+ sizeof(struct msdos_dir_entry));
-+ if (!dir->table)
-+ printf("Error - realloc failed\n");
-+ memset(&dir->table[dir->entries], 0, 2 * sizeof(struct msdos_dir_entry));
-+ dir->entries += 2;
- }
-
- infile = open(filename, O_RDONLY, 0);
-@@ -1611,13 +1599,13 @@ static int add_file(char *filename, stru
- return -1;
- }
-
-- printf("ADD %s\n", filename);
-+ printf("ADD FILE %s\n", filename);
-
- /* Grab the basename of the file */
- base = basename(filename);
-
-- /* Extract out the 8.3 name */
-- copy_filename(base, name83, ext83);
-+ /* convert for dos fat structure */
-+ copy_filename(base, dos_name);
-
- /* Make an extended name slot */
-
-@@ -1629,12 +1617,9 @@ static int add_file(char *filename, stru
-
- slot->alias_checksum = 0;
-
-- for(i = 0; i < 8; i++)
-- slot->alias_checksum = (((slot->alias_checksum&1)<<7)|((slot->alias_checksum&0xfe)>>1)) + name83[i];
-+ for(i = 0; i < MSDOS_NAME; i++)
-+ slot->alias_checksum = (((slot->alias_checksum&1)<<7)|((slot->alias_checksum&0xfe)>>1)) + dos_name[i];
-
-- for(i = 0; i < 3; i++)
-- slot->alias_checksum = (((slot->alias_checksum&1)<<7)|((slot->alias_checksum&0xfe)>>1)) + ext83[i];
--
- p = base;
-
- copy_name(slot->name0_4, 10, &p);
-@@ -1645,8 +1630,7 @@ static int add_file(char *filename, stru
- /* Get the entry from the root filesytem */
- entry = &dir->table[dir->count++];
-
-- strncpy(entry->name, name83, 8);
-- strncpy(entry->ext, ext83, 3);
-+ strncpy(entry->name, dos_name, MSDOS_NAME);
-
-
- /* If the user has it read only, then add read only to the incoming
-@@ -1665,7 +1649,7 @@ static int add_file(char *filename, stru
- ((ctime->tm_mon+1) << 5) +
- ((ctime->tm_year-80) << 9)));
-
-- entry->ctime_ms = 0;
-+ entry->ctime_cs = 0;
- entry->ctime = entry->time;
- entry->cdate = entry->date;
- entry->adate = entry->date;
-@@ -1711,6 +1695,7 @@ static int add_file(char *filename, stru
-
- exit_add:
- if (infile) close(infile);
-+ return 0;
- }
-
- /* Add a new directory to the specified directory entry, and in turn populate
-@@ -1727,10 +1712,18 @@ static void add_directory(char *filename
- struct dirent *dentry = 0;
- int remain;
- char *data;
-+ char *base;
-+ char dos_name[MSDOS_NAME+1];
-+ struct msdos_dir_slot *slot;
-+ int i;
-+ char *p;
-
- /* If the directory doesn't exist */
-- if (!rddir) return;
--
-+ if (!rddir) {
-+ printf("Error - dir does not exist: %s\n", filename);
-+ return;
-+ }
-+
- if (dir->root) {
- if (dir->count == dir->entries) {
- printf("Error - too many directory entries\n");
-@@ -1738,28 +1731,58 @@ static void add_directory(char *filename
- }
- }
- else {
-- if (dir->count == dir->entries) {
-- if (!dir->table)
-- dir->table = (struct msdos_dir_entry *) malloc(sizeof(struct msdos_dir_entry));
-- else {
-- dir->table = (struct msdos_dir_entry *) realloc(dir->table, (dir->entries + 1) *
-- sizeof(struct msdos_dir_entry));
--
-- /* Zero it out to avoid issues */
-- memset(&dir->table[dir->entries], 0, sizeof(struct msdos_dir_entry));
-- }
-- dir->entries++;
-+ /* 2 entries, one extra for long name of the directory */
-+ if (!dir->table)
-+ dir->table = (struct msdos_dir_entry *) malloc(2 * sizeof(struct msdos_dir_entry));
-+ else
-+ dir->table = (struct msdos_dir_entry *) realloc(dir->table, 2 * (dir->entries + 1) *
-+ sizeof(struct msdos_dir_entry));
-+ if (!dir->table) {
-+ printf("Error - memory allocation failed\n");
-+ goto exit_add_dir;
- }
-+ /* Zero it out to avoid issues */
-+ memset(&dir->table[dir->entries], 0, 2 * sizeof(struct msdos_dir_entry));
-+ dir->entries += 2;
- }
-
-+ printf("ADD DIR %s\n", filename);
- /* Now, create a new directory entry for the new directory */
- newdir = (struct dir_entry *) calloc(1, sizeof(struct dir_entry));
-- if (!newdir) goto exit_add_dir;
-+ if (!newdir) {
-+ printf("Error - calloc failed\n");
-+ goto exit_add_dir;
-+ }
-+
-+ /* Grab the basename of the file */
-+ base = basename(filename);
-+
-+ /* convert for dos structure */
-+ copy_filename(base, dos_name);
-+
-+ /* Make an extended name slot */
-+ slot = (struct msdos_dir_slot *) &dir->table[dir->count++];
-+ slot->id = 'A';
-+ slot->attr = 0x0F;
-+ slot->reserved = 0;
-+ slot->start = 0;
-+
-+ slot->alias_checksum = 0;
-
-+ for (i = 0; i < MSDOS_NAME; i++)
-+ slot->alias_checksum = (((slot->alias_checksum&1)<<7)|((slot->alias_checksum&0xfe)>>1)) + dos_name[i];
-+
-+ p = base;
-+
-+ copy_name(slot->name0_4, 10, &p);
-+ copy_name(slot->name5_10, 12, &p);
-+ copy_name(slot->name11_12, 4, &p);
-+
-+ /* Get the entry from the root filesytem */
- entry = &dir->table[dir->count++];
-
-- strncpy(entry->name, basename(filename), sizeof(entry->name));
--
-+ strncpy(entry->name, dos_name, MSDOS_NAME);
-+
- entry->attr = ATTR_DIR;
- ctime = localtime(&create_time);
-
-@@ -1770,25 +1793,32 @@ static void add_directory(char *filename
- ((ctime->tm_mon+1) << 5) +
- ((ctime->tm_year-80) << 9)));
-
-- entry->ctime_ms = 0;
-+ entry->ctime_cs = 0;
- entry->ctime = entry->time;
- entry->cdate = entry->date;
- entry->adate = entry->date;
-
- /* Now, read the directory */
-
-- while((dentry = readdir(rddir))) {
-+
-+ while((base[0] != '.') && (dentry = readdir(rddir))) {
- struct stat st;
- char *buffer;
--
-- if (!strcmp(dentry->d_name, ".") || !strcmp(dentry->d_name, ".."))
-- continue;
-
-- /* DOS wouldn't like a typical unix . (dot) file, so we skip those too */
-- if (dentry->d_name[0] == '.') continue;
-+ if (dentry->d_name[0] == '.') {
-+ /* dos also has . & .. directory entries */
-+ if (! ((!strcmp(dentry->d_name, ".")) || (!strcmp(dentry->d_name, "..")))) {
-+ /* ignore other .* files */
-+ printf("Error - File/Dir name is not dos compatible, ignored: %s\n", dentry->d_name);
-+ continue;
-+ }
-+ }
-
- buffer = malloc(strlen(filename) + strlen(dentry->d_name) + 3);
-- if (!buffer) continue;
-+ if (!buffer) {
-+ printf("Error - malloc failed\n");
-+ goto exit_add_dir;
-+ }
-
- sprintf(buffer, "%s/%s", filename, dentry->d_name);
- if (!stat(buffer, &st)) {
-@@ -1806,11 +1836,23 @@ static void add_directory(char *filename
- /* Now that the entire directory has been written, go ahead and write the directory
- entry as well */
-
-+ entry->size = 0; /* a directory has zero size */
-+
-+ if (base[0] == '.') { /* . & .. point to parent's cluster */
-+ goto exit_add_dir;
-+ }
-+
- entry->start = CT_LE_W(last_cluster_written);
- entry->starthi = CT_LE_W((last_cluster_written & 0xFFFF0000) >> 16);
-- entry->size = newdir->count * sizeof(struct msdos_dir_entry);
-+
-+/* . dir start points to parent */
-+ newdir->table[1].start = entry->start;
-+/* .. dir points to parent of parent*/
-+/* .. dir start is not set yet, would need more changes to the code,
-+ * but dosfsck can fix these .. entry start pointers correctly */
-+
-+ remain = newdir->count * sizeof(struct msdos_dir_entry);
-
-- remain = entry->size;
- data = (char *) newdir->table;
-
- while(remain) {
-@@ -1858,6 +1900,7 @@ static void add_root_directory(char *dir
-
- if (!newdir) {
- closedir(dir);
-+ printf("Error - calloc failed!\n");
- return;
- }
-
-@@ -1877,7 +1920,10 @@ static void add_root_directory(char *dir
- if (entry->d_name[0] == '.') continue;
-
- buffer = malloc(strlen(dirname) + strlen(entry->d_name) + 3);
-- if (!buffer) continue;
-+ if (!buffer) {
-+ printf("Error - malloc failed!\n");
-+ continue;
-+ }
-
- sprintf(buffer, "%s/%s", dirname, entry->d_name);
- if (!stat(buffer, &st)) {
-@@ -2245,6 +2291,9 @@ main (int argc, char **argv)
- if (check && listfile) /* Auto and specified bad block handling are mutually */
- die ("-c and -l are incompatible"); /* exclusive of each other! */
-
-+ if (dirname && (size_fat == 32))
-+ die ("-d is incompatible with FAT32");
-+
- if (!create) {
- check_mount (device_name); /* Is the device already mounted? */
- dev = open (device_name, O_RDWR); /* Is it a suitable device to build the FS on? */