diff options
author | DongHun Kwak <dh0128.kwak@samsung.com> | 2022-01-14 10:51:43 +0900 |
---|---|---|
committer | DongHun Kwak <dh0128.kwak@samsung.com> | 2022-01-14 10:51:43 +0900 |
commit | 1f0988e68435f0d7a471e7aac191c87f7db4d09d (patch) | |
tree | 612442ec92e194944a41618fd695f30d9c3082fa /mformat.c | |
parent | e09dd35edaa16ccfa9ef005b231800fddf2419da (diff) | |
download | mtools-1f0988e68435f0d7a471e7aac191c87f7db4d09d.tar.gz mtools-1f0988e68435f0d7a471e7aac191c87f7db4d09d.tar.bz2 mtools-1f0988e68435f0d7a471e7aac191c87f7db4d09d.zip |
Imported Upstream version 4.0.31upstream/4.0.31
Diffstat (limited to 'mformat.c')
-rw-r--r-- | mformat.c | 221 |
1 files changed, 116 insertions, 105 deletions
@@ -27,7 +27,6 @@ #include "fsP.h" #include "file.h" #include "plain_io.h" -#include "floppyd_io.h" #include "nameclash.h" #include "buffer.h" #ifdef HAVE_ASSERT_H @@ -182,9 +181,9 @@ static int comp_fat_bits(Fs_t *Fs, int estimate, TOTAL_DISK_SIZE((bits), Fs->sector_size, (clusters), \ Fs->num_fat, MAX_BYTES_PER_CLUSTER/Fs->sector_size) - if(tot_sectors > MAX_DISK_SIZE(12, FAT12-1)) + if(tot_sectors > MAX_DISK_SIZE(12u, FAT12-1)) needed_fat_bits = 16; - if(fat32 || tot_sectors > MAX_DISK_SIZE(16, FAT16-1)) + if(fat32 || tot_sectors > MAX_DISK_SIZE(16u, FAT16-1)) needed_fat_bits = 32; #undef MAX_DISK_SIZE @@ -753,7 +752,7 @@ void mformat(int argc, char **argv, int dummy UNUSEDP) NORETURN; void mformat(int argc, char **argv, int dummy UNUSEDP) { int r; /* generic return value */ - Fs_t Fs; + Fs_t *Fs; unsigned int hs; int hs_set; unsigned int arguse_2m = 0; @@ -818,22 +817,28 @@ void mformat(int argc, char **argv, int dummy UNUSEDP) serial = 0; fsVersion = 0; - Fs.cluster_size = 0; - Fs.refs = 1; - Fs.dir_len = 0; + Fs = New(Fs_t); + if (!Fs) { + fprintf(stderr, "Out of memory\n"); + exit(1); + } + + Fs->cluster_size = 0; + Fs->refs = 1; + Fs->dir_len = 0; if(getenv("MTOOLS_DIR_LEN")) { - Fs.dir_len = atou16(getenv("MTOOLS_DIR_LEN")); - if(Fs.dir_len <= 0) - Fs.dir_len=0; + Fs->dir_len = atou16(getenv("MTOOLS_DIR_LEN")); + if(Fs->dir_len <= 0) + Fs->dir_len=0; } - Fs.fat_len = 0; - Fs.num_fat = 2; + Fs->fat_len = 0; + Fs->num_fat = 2; if(getenv("MTOOLS_NFATS")) { - Fs.num_fat = atou8(getenv("MTOOLS_NFATS")); - if(Fs.num_fat <= 0) - Fs.num_fat=2; + Fs->num_fat = atou8(getenv("MTOOLS_NFATS")); + if(Fs->num_fat <= 0) + Fs->num_fat=2; } - Fs.Class = &FsClass; + Fs->Class = &FsClass; rate_0 = mtools_rate_0; rate_any = mtools_rate_any; @@ -972,14 +977,14 @@ void mformat(int argc, char **argv, int dummy UNUSEDP) break; case 'c': - Fs.cluster_size = atoui(optarg); + Fs->cluster_size = atoui(optarg); break; case 'r': - Fs.dir_len = strtou16(optarg,&endptr,0); + Fs->dir_len = strtou16(optarg,&endptr,0); break; case 'L': - Fs.fat_len = strtoui(optarg,&endptr,0); + Fs->fat_len = strtoui(optarg,&endptr,0); break; @@ -1004,7 +1009,7 @@ void mformat(int argc, char **argv, int dummy UNUSEDP) argheads = atou16(optarg); break; case 'd': - Fs.num_fat = atou8(optarg); + Fs->num_fat = atou8(optarg); break; case 'm': mediaDesc = strtou8(optarg,&endptr,0); @@ -1052,10 +1057,10 @@ void mformat(int argc, char **argv, int dummy UNUSEDP) /* check out a drive whose letter and parameters match */ sprintf(errmsg, "Drive '%c:' not supported", drive); - Fs.Direct = NULL; + Fs->Direct = NULL; blocksize = 0; for(dev=devices;dev->drive;dev++) { - FREE(&(Fs.Direct)); + FREE(&(Fs->Direct)); /* drive letter */ if (dev->drive != drive) continue; @@ -1075,52 +1080,58 @@ void mformat(int argc, char **argv, int dummy UNUSEDP) #endif #ifdef USE_XDF - if(!format_xdf) + if(format_xdf) used_dev.misc_flags |= USE_XDF_FLAG; #endif if(tot_sectors) used_dev.tot_sectors = tot_sectors; - Fs.Direct = OpenImage(&used_dev, dev, name, + Fs->Direct = OpenImage(&used_dev, dev, name, O_RDWR|create, errmsg, ALWAYS_GET_GEOMETRY, O_RDWR, - &maxSize, NULL, &info); + &maxSize, NULL, +#ifdef USE_XDF + &info +#else + NULL +#endif + ); #ifdef USE_XDF - if(Fs.Direct && info.FatSize) { - if(!Fs.fat_len) - Fs.fat_len = info.FatSize; - if(!Fs.dir_len) - Fs.dir_len = info.RootDirSize; + if(Fs->Direct && info.FatSize) { + if(!Fs->fat_len) + Fs->fat_len = info.FatSize; + if(!Fs->dir_len) + Fs->dir_len = info.RootDirSize; } #endif - if (!Fs.Direct) + if (!Fs->Direct) continue; if(!tot_sectors) tot_sectors = used_dev.tot_sectors; - Fs.sector_size = 512; + Fs->sector_size = 512; if( !(used_dev.use_2m & 0x7f)) { - Fs.sector_size = (uint16_t) (128u << (used_dev.ssize & 0x7f)); + Fs->sector_size = (uint16_t) (128u << (used_dev.ssize & 0x7f)); } - SET_INT(Fs.sector_size, msize); + SET_INT(Fs->sector_size, msize); { unsigned int j; for(j = 0; j < 31; j++) { - if (Fs.sector_size == (unsigned int) (1 << j)) { - Fs.sectorShift = j; + if (Fs->sector_size == (unsigned int) (1 << j)) { + Fs->sectorShift = j; break; } } - Fs.sectorMask = Fs.sector_size - 1; + Fs->sectorMask = Fs->sector_size - 1; } - if(!used_dev.blocksize || used_dev.blocksize < Fs.sector_size) - blocksize = Fs.sector_size; + if(!used_dev.blocksize || used_dev.blocksize < Fs->sector_size) + blocksize = Fs->sector_size; else blocksize = used_dev.blocksize; @@ -1130,15 +1141,15 @@ void mformat(int argc, char **argv, int dummy UNUSEDP) if((mt_size_t) tot_sectors * blocksize > maxSize) { snprintf(errmsg, sizeof(errmsg)-1, "Requested size too large\n"); - FREE(&Fs.Direct); + FREE(&Fs->Direct); continue; } /* do a "test" read */ if (!create && - READS(Fs.Direct, &boot.characters, 0, Fs.sector_size) != - (signed int) Fs.sector_size) { + READS(Fs->Direct, &boot.characters, 0, Fs->sector_size) != + (signed int) Fs->sector_size) { #ifdef HAVE_SNPRINTF snprintf(errmsg, sizeof(errmsg)-1, "Error reading from '%s', wrong parameters?", @@ -1148,7 +1159,7 @@ void mformat(int argc, char **argv, int dummy UNUSEDP) "Error reading from '%s', wrong parameters?", name); #endif - FREE(&Fs.Direct); + FREE(&Fs->Direct); continue; } break; @@ -1156,13 +1167,14 @@ void mformat(int argc, char **argv, int dummy UNUSEDP) /* print error msg if needed */ if ( dev->drive == 0 ){ - FREE(&Fs.Direct); + FREE(&Fs->Direct); fprintf(stderr,"%s: %s\n", argv[0],errmsg); exit(1); } /* calculate the total number of sectors */ - if(tot_sectors == 0) { + if(tot_sectors == 0 && + used_dev.heads && used_dev.sectors && used_dev.tracks) { uint32_t sect_per_track = used_dev.heads*used_dev.sectors; mt_off_t rtot_sectors = used_dev.tracks*(mt_off_t)sect_per_track; @@ -1178,9 +1190,9 @@ void mformat(int argc, char **argv, int dummy UNUSEDP) /* create the image file if needed */ if (create) { - WRITES(Fs.Direct, &boot.characters, - sectorsToBytes((Stream_t*)&Fs, tot_sectors-1), - Fs.sector_size); + WRITES(Fs->Direct, &boot.characters, + sectorsToBytes((Stream_t*)Fs, tot_sectors-1), + Fs->sector_size); } /* the boot sector */ @@ -1202,15 +1214,15 @@ void mformat(int argc, char **argv, int dummy UNUSEDP) close(fd); } if(!keepBoot && !(used_dev.use_2m & 0x7f)) - memset(boot.characters, '\0', Fs.sector_size); + memset(boot.characters, '\0', Fs->sector_size); - Fs.Next = buf_init(Fs.Direct, - blocksize * used_dev.heads * used_dev.sectors, - blocksize * used_dev.heads * used_dev.sectors, - blocksize); - Fs.Buffer = 0; + Fs->Next = buf_init(Fs->Direct, + blocksize * used_dev.heads * used_dev.sectors, + blocksize * used_dev.heads * used_dev.sectors, + blocksize); + Fs->Buffer = 0; - boot.boot.nfat = Fs.num_fat; + boot.boot.nfat = Fs->num_fat; if(!keepBoot) set_word(&boot.bytes[510], 0xaa55); @@ -1218,7 +1230,7 @@ void mformat(int argc, char **argv, int dummy UNUSEDP) set_word(boot.boot.nsect, used_dev.sectors); set_word(boot.boot.nheads, used_dev.heads); - used_dev.fat_bits = comp_fat_bits(&Fs,used_dev.fat_bits, tot_sectors, fat32); + used_dev.fat_bits = comp_fat_bits(Fs,used_dev.fat_bits, tot_sectors, fat32); if(!keepBoot && !(used_dev.use_2m & 0x7f)) { if(!used_dev.partition) { @@ -1235,8 +1247,8 @@ void mformat(int argc, char **argv, int dummy UNUSEDP) } if(used_dev.fat_bits == 32) { - Fs.primaryFat = 0; - Fs.writeAllFats = 1; + Fs->primaryFat = 0; + Fs->writeAllFats = 1; if(resvSects) { if(resvSects < 3) { fprintf(stderr, @@ -1246,20 +1258,20 @@ void mformat(int argc, char **argv, int dummy UNUSEDP) if(resvSects <= backupBoot && !backupBootSet) backupBoot = resvSects - 1; - Fs.fat_start = resvSects; + Fs->fat_start = resvSects; } else - Fs.fat_start = 32; + Fs->fat_start = 32; - if(Fs.fat_start <= backupBoot) { + if(Fs->fat_start <= backupBoot) { fprintf(stderr, - "Reserved sectors (%d) must be more than backupBoot (%d)\n", Fs.fat_start, backupBoot); + "Reserved sectors (%d) must be more than backupBoot (%d)\n", Fs->fat_start, backupBoot); backupBoot = 6; - Fs.fat_start = 32; + Fs->fat_start = 32; } - calc_fs_parameters_32(tot_sectors, &Fs, &boot); + calc_fs_parameters_32(tot_sectors, Fs, &boot); - Fs.clus_start = Fs.num_fat * Fs.fat_len + Fs.fat_start; + Fs->clus_start = Fs->num_fat * Fs->fat_len + Fs->fat_start; /* extension flags: mirror fats, and use #0 as primary */ set_word(boot.boot.ext.fat32.extFlags,0); @@ -1268,37 +1280,37 @@ void mformat(int argc, char **argv, int dummy UNUSEDP) set_word(boot.boot.ext.fat32.fsVersion,fsVersion); /* root directory */ - set_dword(boot.boot.ext.fat32.rootCluster, Fs.rootCluster = 2); + set_dword(boot.boot.ext.fat32.rootCluster, Fs->rootCluster = 2); /* info sector */ - set_word(boot.boot.ext.fat32.infoSector, Fs.infoSectorLoc = 1); - Fs.infoSectorLoc = 1; + set_word(boot.boot.ext.fat32.infoSector, Fs->infoSectorLoc = 1); + Fs->infoSectorLoc = 1; /* no backup boot sector */ set_word(boot.boot.ext.fat32.backupBoot, backupBoot); labelBlock = & boot.boot.ext.fat32.labelBlock; } else { - Fs.infoSectorLoc = 0; + Fs->infoSectorLoc = 0; if(resvSects) { if(resvSects < 1) { fprintf(stderr, "Reserved sectors need to be at least 1\n"); resvSects = 1; } - Fs.fat_start = resvSects; + Fs->fat_start = resvSects; } else - Fs.fat_start = 1; - calc_fs_parameters(&used_dev, tot_sectors, &Fs, &boot); - Fs.dir_start = Fs.num_fat * Fs.fat_len + Fs.fat_start; - Fs.clus_start = Fs.dir_start + Fs.dir_len; + Fs->fat_start = 1; + calc_fs_parameters(&used_dev, tot_sectors, Fs, &boot); + Fs->dir_start = Fs->num_fat * Fs->fat_len + Fs->fat_start; + Fs->clus_start = Fs->dir_start + Fs->dir_len; labelBlock = & boot.boot.ext.old.labelBlock; } /* Set the codepage */ - Fs.cp = cp_open(used_dev.codepage); - if(Fs.cp == NULL) + Fs->cp = cp_open(used_dev.codepage); + if(Fs->cp == NULL) exit(1); if (!keepBoot) @@ -1313,17 +1325,17 @@ void mformat(int argc, char **argv, int dummy UNUSEDP) if (!serial_set) serial=(uint32_t) random(); set_dword(labelBlock->serial, serial); - label_name_pc(GET_DOSCONVERT((Stream_t *)&Fs), + label_name_pc(GET_DOSCONVERT((Stream_t *)Fs), label[0] ? label : "NO NAME ", 0, &mangled, &shortlabel); strncpy(labelBlock->label, shortlabel.base, 8); strncpy(labelBlock->label+8, shortlabel.ext, 3); - sprintf(labelBlock->fat_type, "FAT%2.2d ", Fs.fat_bits); + sprintf(labelBlock->fat_type, "FAT%2.2d ", Fs->fat_bits); labelBlock->fat_type[7] = ' '; - set_word(boot.boot.secsiz, Fs.sector_size); - boot.boot.clsiz = (unsigned char) Fs.cluster_size; - set_word(boot.boot.nrsvsect, Fs.fat_start); + set_word(boot.boot.secsiz, Fs->sector_size); + boot.boot.clsiz = (unsigned char) Fs->cluster_size; + set_word(boot.boot.nrsvsect, Fs->fat_start); bootOffset = init_geometry_boot(&boot, &used_dev, sectors0, rate_0, rate_any, @@ -1350,42 +1362,41 @@ void mformat(int argc, char **argv, int dummy UNUSEDP) boot.boot.jump[2] = 0x90; } if(used_dev.use_2m & 0x7f) - Fs.num_fat = 1; + Fs->num_fat = 1; if(haveMediaDesc) boot.boot.descr=mediaDesc; - Fs.lastFatSectorNr = 0; - Fs.lastFatSectorData = 0; - zero_fat(&Fs, boot.boot.descr); - Fs.freeSpace = Fs.num_clus; - Fs.last = 2; + Fs->lastFatSectorNr = 0; + Fs->lastFatSectorData = 0; + zero_fat(Fs, boot.boot.descr); + Fs->freeSpace = Fs->num_clus; + Fs->last = 2; #ifdef USE_XDF if(format_xdf) for(i=0; - i < (info.BadSectors+Fs.cluster_size-1)/Fs.cluster_size; + i < (info.BadSectors+Fs->cluster_size-1)/Fs->cluster_size; i++) - fatEncode(&Fs, i+2, 0xfff7); + fatEncode(Fs, i+2, 0xfff7); #endif - format_root(&Fs, label, &boot); - WRITES((Stream_t *)&Fs, boot.characters, - (mt_off_t) 0, Fs.sector_size); - - if(used_dev.fat_bits == 32) { - WRITES((Stream_t *)&Fs, boot.characters, - (mt_off_t) backupBoot * Fs.sector_size, Fs.sector_size); + format_root(Fs, label, &boot); + if(WRITES((Stream_t *)Fs, boot.characters, + (mt_off_t) 0, Fs->sector_size) < 0) { + fprintf(stderr, "Error writing boot sector\n"); + exit(1); } - if(Fs.fat_bits == 32 && WORD_S(ext.fat32.backupBoot) != MAX16) { - WRITES((Stream_t *)&Fs, boot.characters, - sectorsToBytes((Stream_t*)&Fs, - WORD_S(ext.fat32.backupBoot)), - Fs.sector_size); + if(Fs->fat_bits == 32 && WORD_S(ext.fat32.backupBoot) != MAX16) { + if(WRITES((Stream_t *)Fs, boot.characters, + sectorsToBytes((Stream_t*)Fs, + WORD_S(ext.fat32.backupBoot)), + Fs->sector_size) < 0) { + fprintf(stderr, "Error writing backup boot sector\n"); + exit(1); + } } - FLUSH((Stream_t *)&Fs); /* flushes Fs. - * This triggers the writing of the FAT */ - FREE(&Fs.Next); - Fs.Class->freeFunc((Stream_t *)&Fs); + + FREE((Stream_t **)&Fs); #ifdef USE_XDF if(format_xdf && isatty(0) && !getenv("MTOOLS_USE_XDF")) fprintf(stderr, |