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
This commit is contained in:
Luigi Rizzo 2008-11-26 21:05:03 +00:00
parent 0206cdb846
commit 045651ec1e
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=185345

View File

@ -725,9 +725,20 @@ getdiskinfo(int fd, const char *fname, const char *dtype, __unused int oflag,
/* 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;