Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 25 Nov 2008 13:15:16 +0200
From:      Andriy Gapon <avg@icyb.net.ua>
To:        Luigi Rizzo <rizzo@iet.unipi.it>, current@freebsd.org
Subject:   Re: small newfs_msdos addition
Message-ID:  <492BDE44.7060402@icyb.net.ua>
In-Reply-To: <20081125094125.GA18669@onelab2.iet.unipi.it>
References:  <20081125094125.GA18669@onelab2.iet.unipi.it>

next in thread | previous in thread | raw e-mail | index | archive | help
on 25/11/2008 11:41 Luigi Rizzo said the following:
> 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;

Please also consider this PR:
http://www.freebsd.org/cgi/query-pr.cgi?pr=bin/121182
and this message from phk in a related thread:
http://lists.freebsd.org/pipermail/freebsd-fs/2008-February/004483.html

-- 
Andriy Gapon



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?492BDE44.7060402>