From owner-freebsd-current@FreeBSD.ORG Tue Nov 25 09:36:48 2008 Return-Path: Delivered-To: current@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 5638B1065672 for ; Tue, 25 Nov 2008 09:36:48 +0000 (UTC) (envelope-from luigi@onelab2.iet.unipi.it) Received: from onelab2.iet.unipi.it (onelab2.iet.unipi.it [131.114.9.129]) by mx1.freebsd.org (Postfix) with ESMTP id 1D13E8FC1A for ; Tue, 25 Nov 2008 09:36:48 +0000 (UTC) (envelope-from luigi@onelab2.iet.unipi.it) Received: by onelab2.iet.unipi.it (Postfix, from userid 275) id BEC4273098; Tue, 25 Nov 2008 10:41:25 +0100 (CET) Date: Tue, 25 Nov 2008 10:41:25 +0100 From: Luigi Rizzo To: current@freebsd.org Message-ID: <20081125094125.GA18669@onelab2.iet.unipi.it> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.2.3i Cc: Subject: small newfs_msdos addition X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 25 Nov 2008 09:36:48 -0000 If there are no objections I'd like to commit the small patch below to newfs_msdos.c -- all it does is create a fake geometry if it cannot get the media size, which is handy when you want to create a filesystem image on a regular file. Before the patch you need to do newfs_msdos -h 32 -s 64 -o 0 -S 512 -s `du -k /the/file` /the/file after the patch it becomes newfs_msdos /the/file which is a bit more friendly especially if you have to type it manually. cheers luigi > svn diff head/sbin Index: head/sbin/newfs_msdos/newfs_msdos.c =================================================================== --- head/sbin/newfs_msdos/newfs_msdos.c (revision 185290) +++ head/sbin/newfs_msdos/newfs_msdos.c (working copy) @@ -725,9 +725,20 @@ /* 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;