Index: dosfstools-3.0.10/src/dosfslabel.c =================================================================== --- dosfstools-3.0.10.orig/src/dosfslabel.c +++ dosfstools-3.0.10/src/dosfslabel.c @@ -29,6 +29,7 @@ #include #include #include +#include #include "common.h" #include "dosfsck.h" @@ -89,7 +90,14 @@ int main(int argc, char *argv[]) rw = 0; char *device = NULL; - char *label = NULL; + char label[11]; + + int i; + + loff_t offset; + DIR_ENT de; + + memset(&fs, 0, sizeof(fs)); check_atari(); @@ -105,19 +113,31 @@ int main(int argc, char *argv[]) device = argv[1]; if (argc == 3) { - label = argv[2]; - if (strlen(label) > 11) { + if (strlen(argv[2]) > 11) { fprintf(stderr, "dosfslabel: labels can be no longer than 11 characters\n"); exit(1); } + strncpy(label, argv[2], 11); + for (i = 0; i < 11; i++) + if (islower(label[i])) + { + fprintf(stderr, + "dosfslabel: labels cannot contain lower case characters\n"); + exit(1); + } rw = 1; } fs_open(device, rw); read_boot(&fs); + read_fat(&fs); if (!rw) { - fprintf(stdout, "%s\n", fs.label); + offset = find_volume_de(&fs, &de); + if (offset == 0) + fprintf(stdout, "%s\n", fs.label); + else + fprintf(stdout, "%.8s%.3s\n", de.name, de.ext); exit(0); } Index: dosfstools-3.0.10/src/mkdosfs.c =================================================================== --- dosfstools-3.0.10.orig/src/mkdosfs.c +++ dosfstools-3.0.10/src/mkdosfs.c @@ -105,6 +105,7 @@ #define HARD_SECTOR_SIZE 512 #define SECTORS_PER_BLOCK ( BLOCK_SIZE / HARD_SECTOR_SIZE ) +#define NO_NAME "NO NAME " /* Macro definitions */ @@ -285,7 +286,7 @@ static int verbose = 0; /* Default to v static long volume_id; /* Volume ID number */ static time_t create_time; /* Creation time */ static struct timeval create_timeval; /* Creation time */ -static char volume_name[] = " "; /* Volume name */ +static char volume_name[] = NO_NAME; /* Volume name */ static unsigned long long blocks; /* Number of blocks in filesystem */ static int sector_size = 512; /* Size of a logical sector */ static int sector_size_set = 0; /* User selected sector size */ @@ -1248,7 +1249,7 @@ setup_tables (void) } printf ("Volume ID is %08lx, ", volume_id & (atari_format ? 0x00ffffff : 0xffffffff)); - if ( strcmp(volume_name, " ") ) + if ( strcmp(volume_name, NO_NAME) ) printf("volume label %s.\n", volume_name); else printf("no volume label.\n"); @@ -1287,7 +1288,7 @@ setup_tables (void) } memset(root_dir, 0, size_root_dir); - if ( memcmp(volume_name, " ", 11) ) + if ( memcmp(volume_name, NO_NAME, 11) ) { struct msdos_dir_entry *de = &root_dir[0]; memcpy(de->name, volume_name, 8); @@ -1630,6 +1631,8 @@ main (int argc, char **argv) case 'n': /* n : Volume name */ sprintf(volume_name, "%-11.11s", optarg); + for (i = 0; i < 11; i++) + volume_name[i] = toupper(volume_name[i]); break; case 'r': /* r : Root directory entries */ Index: dosfstools-3.0.10/src/boot.c =================================================================== --- dosfstools-3.0.10.orig/src/boot.c +++ dosfstools-3.0.10/src/boot.c @@ -34,6 +34,7 @@ #include "fat.h" #include "io.h" #include "boot.h" +#include "check.h" #define ROUND_TO_MULTIPLE(n,m) ((n) && (m) ? (n)+(m)-1-((n)-1)%(m) : 0) @@ -453,7 +454,7 @@ static void write_boot_label(DOS_FS *fs, fs_write(fs->backupboot_start, sizeof(b), &b); } -static loff_t find_volume_de(DOS_FS *fs, DIR_ENT *de) +loff_t find_volume_de(DOS_FS *fs, DIR_ENT *de) { unsigned long cluster; loff_t offset; @@ -492,7 +493,10 @@ static void write_volume_label(DOS_FS *f offset = find_volume_de(fs, &de); if (offset == 0) - return; + { + offset = alloc_rootdir_entry(fs, &de, label); + /*return 0;*/ + } memcpy(de.name, label, 11); de.time = CT_LE_W((unsigned short)((mtime->tm_sec >> 1) + @@ -501,7 +505,16 @@ static void write_volume_label(DOS_FS *f de.date = CT_LE_W((unsigned short)(mtime->tm_mday + ((mtime->tm_mon+1) << 5) + ((mtime->tm_year-80) << 9))); - fs_write(offset, sizeof(DIR_ENT), &de); + de.attr = ATTR_VOLUME; + de.ctime_ms = 0; + de.ctime = de.time; + de.cdate = de.date; + de.adate = de.date; + de.starthi = CT_LE_W(0); + de.start = CT_LE_W(0); + de.size = CT_LE_L(0); + + fs_write(offset, sizeof(DIR_ENT), &de); } void write_label(DOS_FS *fs, char *label) Index: dosfstools-3.0.10/src/check.c =================================================================== --- dosfstools-3.0.10.orig/src/check.c +++ dosfstools-3.0.10/src/check.c @@ -133,8 +133,8 @@ loff_t alloc_rootdir_entry(DOS_FS *fs, D while (1) { char expanded[12]; sprintf(expanded, pattern, curr_num); - memcpy(de->name+4, expanded, 4); - memcpy(de->ext, expanded+4, 3); + memcpy(de->name, expanded, 8); + memcpy(de->ext, expanded+8, 3); clu_num = fs->root_cluster; i = 0; offset2 = cluster_start(fs,clu_num); Index: dosfstools-3.0.10/src/boot.h =================================================================== --- dosfstools-3.0.10.orig/src/boot.h +++ dosfstools-3.0.10/src/boot.h @@ -25,6 +25,7 @@ void read_boot(DOS_FS *fs); void write_label(DOS_FS *fs, char *label); +loff_t find_volume_de(DOS_FS *fs, DIR_ENT *de); /* Reads the boot sector from the currently open device and initializes *FS */