Module Name:    src
Committed By:   perseant
Date:           Wed Jul 24 00:40:38 UTC 2024

Modified Files:
        src/usr.sbin/dumpexfatfs [perseant-exfatfs]: dumpexfatfs.c

Log Message:
Add -B option to allow saving bootcode to a file.

Report the first cluster of a directory in hex.  Fix the computation of
first cluster directory so we can correctly list other directories than
the root.


To generate a diff of this commit:
cvs rdiff -u -r1.1.2.4 -r1.1.2.5 src/usr.sbin/dumpexfatfs/dumpexfatfs.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.sbin/dumpexfatfs/dumpexfatfs.c
diff -u src/usr.sbin/dumpexfatfs/dumpexfatfs.c:1.1.2.4 src/usr.sbin/dumpexfatfs/dumpexfatfs.c:1.1.2.5
--- src/usr.sbin/dumpexfatfs/dumpexfatfs.c:1.1.2.4	Fri Jul 19 16:19:16 2024
+++ src/usr.sbin/dumpexfatfs/dumpexfatfs.c	Wed Jul 24 00:40:38 2024
@@ -82,8 +82,9 @@ int main(int argc, char **argv)
 {
 	int devfd, c;
 	struct exfatfs *fs;
+	char *bootcodefile = NULL;
 
-	while ((c = getopt(argc, argv, "Aabcd:fruv")) != -1) {
+	while ((c = getopt(argc, argv, "AaB:bcd:fruv")) != -1) {
 		switch (c) {
 		case 'A':
 			Aflag = !Aflag;
@@ -95,6 +96,9 @@ int main(int argc, char **argv)
 		case 'a':
 			Aflag = !Aflag;
 			break;
+		case 'B':
+			bootcodefile = optarg;
+			break;
 		case 'b':
 			Bflag = !Bflag;
 			break;
@@ -144,7 +148,7 @@ int main(int argc, char **argv)
 		
 		exit(0);
 	}
-	
+
 	if (Aflag + Bflag + Dflag + Fflag + Rflag + Uflag == 0)
 		Aflag = Bflag = Fflag = Rflag = Uflag = 1;
 	
@@ -152,6 +156,21 @@ int main(int argc, char **argv)
 	if (devfd <= 0)
 		err(1, argv[optind]);
 	
+	if (bootcodefile != NULL) {
+		/*
+		 * Extract the bootcode and write it to a file.
+		 * exFAT bootcode is 390 bytes starting at offset 120.
+		 */
+		FILE *fp;
+		char buf[390];
+		if (pread(devfd, buf, sizeof(buf), 120) < sizeof(buf))
+			err(1, argv[optind]);
+		fp = fopen(bootcodefile, "wb");
+		if (fp == NULL || fwrite(buf, 390, 1, fp) < 1)
+			err(1, argv[optind]);	
+		fclose(fp);
+	}
+	
 	/* Set dev_bshift to match dev_bsize */
 	for (dev_bshift = 0; (1 << dev_bshift) < dev_bsize; ++dev_bshift)
 		;
@@ -389,9 +408,12 @@ void print_dir(struct exfatfs *fs, uint3
 
 		printf("Reading dirent from %d/%d, physical blk 0x%x\n",
 		       (int)dirclust, (int)diroff, (unsigned)blkno);
-		bread(fs->xf_devvp, blkno, EXFATFS_LSIZE(fs), 0, &bp);
+		bread(fs->xf_devvp, blkno, EXFATFS_SSIZE(fs), 0, &bp);
 		dse = malloc(sizeof(*dse));
-		memcpy(dse, ((struct exfatfs_dse *)bp->b_data) + (diroff % EXFATFS_S2D(fs, 1)) + 1, sizeof(*dse));
+		/* The stream entry is always the second entry in a file set */
+		memcpy(dse, ((struct exfatfs_dse *)bp->b_data)
+		       + (diroff & (EXFATFS_D2DIRENT(fs, 1) - 1)) + 1,
+		       sizeof(*dse));
 		brelse(bp, 0);
 		bp = NULL;
 		clust = dse->xd_firstCluster;
@@ -400,7 +422,7 @@ void print_dir(struct exfatfs *fs, uint3
 	
 	if (action == ACTION_PRINT) {
 		printf("Directory entries:\n");
-		printf(" Reading from cluster %d\n", clust);
+		printf(" Reading from cluster %d (0x%x)\n", clust, clust);
 	}
 	for (off = 0; off * sizeof(*dfp) < maxlen; ++off) {
 		i = off % (EXFATFS_LSIZE(fs) / sizeof(*dfp));
@@ -457,7 +479,7 @@ void print_dir(struct exfatfs *fs, uint3
 				printf("\tAllocation Bitmap\n");
 				printf("\t\tFlags: %hhx\n",
 				       ((struct exfatfs_dirent_allocation_bitmap *)dp)->xd_bitmapFlags);
-				printf("\t\tFirst Cluster: %lx\n", (unsigned long)
+				printf("\t\tFirst Cluster: 0x%lx\n", (unsigned long)
 				       ((struct exfatfs_dirent_allocation_bitmap *)dp)->xd_firstCluster);
 				printf("\t\tData Length: %llu\n", (unsigned long long)
 				       ((struct exfatfs_dirent_allocation_bitmap *)dp)->xd_dataLength);
@@ -473,7 +495,7 @@ void print_dir(struct exfatfs *fs, uint3
 				printf("\tUpcase Table\n");
 				printf("\t\tChecksum: %lx\n", (unsigned long)
 				       ((struct exfatfs_dirent_upcase_table *)dp)->xd_tableChecksum);
-				printf("\t\tFirst Cluster: %lx\n", (unsigned long)
+				printf("\t\tFirst Cluster: 0x%lx\n", (unsigned long)
 				       ((struct exfatfs_dirent_upcase_table *)dp)->xd_firstCluster);
 				printf("\t\tData Length: %llu\n", (unsigned long long)
 				       ((struct exfatfs_dirent_upcase_table *)dp)->xd_dataLength);
@@ -609,7 +631,7 @@ void print_dir(struct exfatfs *fs, uint3
 				       dsp->xd_nameHash);
 				printf("\t\tValid Data Length: %llu\n",
 				       (unsigned long long)dsp->xd_validDataLength);
-				printf("\t\tFirst Cluster: %lu\n",
+				printf("\t\tFirst Cluster: 0x%lx\n",
 				       (unsigned long)dsp->xd_firstCluster);
 				printf("\t\tData Length: %llu\n",
 				       (unsigned long long)dsp->xd_dataLength);

Reply via email to