svn commit: r185345 - head/sbin/newfs_msdos

Luigi Rizzo luigi at FreeBSD.org
Wed Nov 26 13:05:04 PST 2008


Author: luigi
Date: Wed Nov 26 21:05:03 2008
New Revision: 185345
URL: http://svn.freebsd.org/changeset/base/185345

Log:
  Create a fake geometry (16 heads, 64 sectors) when dealing with
  a plain file and a geometry is not explicitly supplied through
  command line or disktab entry.
  
  This way you can a FAT image on a file as simply as this:
  
  	newfs_msdos ./some/file
  
  (right now you need a much longer command
  
  	newfs_msdos -h 32 -u 64 -S 512 -s $total_blocks -o 0 ./some/file
  
  Will be merged after 7.1 and 6.4 are released.
  See also the related PR which suggests a similar change.
  
  PR:		bin/121182
  MFC after:	4 weeks

Modified:
  head/sbin/newfs_msdos/newfs_msdos.c

Modified: head/sbin/newfs_msdos/newfs_msdos.c
==============================================================================
--- head/sbin/newfs_msdos/newfs_msdos.c	Wed Nov 26 20:52:26 2008	(r185344)
+++ head/sbin/newfs_msdos/newfs_msdos.c	Wed Nov 26 21:05:03 2008	(r185345)
@@ -725,9 +725,20 @@ getdiskinfo(int fd, const char *fname, c
 
     /* Maybe it's a floppy drive */
     if (lp == NULL) {
-	if (ioctl(fd, DIOCGMEDIASIZE, &ms) == -1)
-	    errx(1, "Cannot get disk size, %s", strerror(errno));
-	if (ioctl(fd, FD_GTYPE, &type) != -1) {
+	if (ioctl(fd, DIOCGMEDIASIZE, &ms) == -1) {
+	    struct stat st;
+
+	    bzero(&st, sizeof(st));
+	    if (fstat(fd, &st))
+		err(1, "Cannot get disk size");
+	    /* create a fake geometry for a file image */
+	    ms = st.st_size;
+	    dlp.d_secsize = 512;
+	    dlp.d_nsectors = 64;
+	    dlp.d_ntracks = 32;
+	    dlp.d_secperunit = ms / dlp.d_secsize;
+	    lp = &dlp;
+	} else if (ioctl(fd, FD_GTYPE, &type) != -1) {
 	    dlp.d_secsize = 128 << type.secsize;
 	    dlp.d_nsectors = type.sectrac;
 	    dlp.d_ntracks = type.heads;


More information about the svn-src-head mailing list