qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Jim C. Brown" <jbrown106@phreaker.net>
To: Jean-Michel POURE <jm@poure.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] Utilities directory
Date: Mon, 28 Jun 2004 16:24:06 -0400	[thread overview]
Message-ID: <20040628202406.GA32072@jbrown.mylinuxbox.org> (raw)
In-Reply-To: <200406281519.53354.jm@poure.com>

[-- Attachment #1: Type: text/plain, Size: 1257 bytes --]

On Mon, Jun 28, 2004 at 03:19:52PM +0200, Jean-Michel POURE wrote:
> Le samedi 26 Juin 2004 17:12, Hetz Ben Hamo a ?crit :
> > The first utility comes from James C Brown, which lets you mount a
> > partition from a virtual hard disk to a mount point (in Linux as a host).
> 
> Dearn James,
> 
> I am trying to mount the first partition as explained in lomount -h and my 
> computer is stuck with 99% activity. Is this normal?
> 
> Basically, I did:
> lomount -t ext3 -diskimage hda.img -partition 1 /mnt/qemu
> 
> where /mnt/qemu is the mount point
> as root
> 
> Cheers,
> Jean-Michel

I just checked http://www.dad-answers.com/qemu/utilities/QEMU-HD-Mounter/qemu-hd-mounter.tar.gz
and it is a version that has the infinite looping bug (if it can't find the
partition in the disk image, it keeps searching forever).

Fixed version is attached here. It is not likely to work either, but it will
report an error instead of hanging forever.

To be sure what is going on, I'll need to see the output from this lomount
(be sure to compile with -DDEBUG) and from the command "fdisk -lu hda.img".
Knowing what version of fdisk you have (fdisk -v) is helpful as well.

-- 
Infinite complexity begets infinite beauty.
Infinite precision begets infinite perfection.

[-- Attachment #2: lomount.c --]
[-- Type: text/plain, Size: 2873 bytes --]

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>

#define BUF 4096
#define TEMPFILE "/tmp/temp.minix"

int partnum(char * diskimage, FILE * temp, int * pnum)
{
	int num=0, c, i;
	char buf[BUF], buf2[BUF];
	strncpy(buf, diskimage, BUF);
	strncat(buf, "%d", BUF-strlen(buf));
	fscanf(temp, buf, pnum); /* skip start of line */
#ifdef DEBUG
	printf("pnum = %d\n", *pnum);
#endif
	c = fgetc(temp);
	while (c == ' ' || c == '*' || c == '@')
	{
		c = fgetc(temp);
#ifdef DEBUG
		printf("c = %d ", c);
#endif
	}
	/*ungetc(c, temp);
	fscanf(temp, "%d", &num);*/
#ifdef DEBUG
	printf("c = %d\n", c);
#endif
	buf2[0] = c;
	c = fgetc(temp);
	i = 1;
	while (c == '0' || c == '1' || c == '2' || c == '3' || c == '4' || c == '5' || c == '6' || c == '7' || c == '8' || c == '9')
	{
		buf2[i] = c;
		c = fgetc(temp);
		i++;
	}
	buf2[i] = '\0';
	num = atoi(buf2);
#ifdef DEBUG
	printf("buf2 = %s num = %d\n", buf2, num);
#endif
	fgets(buf, BUF, temp); /* skip rest of line */
	return num;
}

int main(int argc, char ** argv)
{
	FILE * temp;
	char buf[BUF], argv2[BUF], diskimage[BUF];
	int partition = 1, sec1, sec2, num = 0, pnum = 0, len = BUF, i, f = 0;
	int pressed_key=0;
	for (i = 1; i < argc; i ++)
	{
		if (strncmp(argv[i], "-diskimage", BUF)==0)
		{
			strncpy(diskimage, argv[i+1], BUF);
			i++; f = 1;
		}
		else if (strncmp(argv[i], "-partition", BUF)==0)
		{
			partition = atoi(argv[i+1]);
			i++;
			if (partition < 1) partition = 1;
		}
		else
		{
			strncat(argv2, argv[i], len);
			strncat(argv2, " ", len-1);
			len -= strlen(argv[i]);
			len--;
		}
	}
	if (!f)
	{
		printf("You must specify -diskimage and -partition\n");
		printf("ex. lomount -t fs-type -diskimage hda.img -partition 1 /mnt\n");
		return 0;
	}
	snprintf(buf, BUF, "/sbin/fdisk -lu %s > %s 2>&1", diskimage, TEMPFILE);
	system(buf);
	temp = fopen(TEMPFILE, "r");

	do
	{
		fgets(buf, BUF, temp); /* skip until we get "Disk" */
#ifdef DEBUG
		printf("spare line: %s\n", buf);
#endif
		
	} while (strncasecmp(buf, "Disk", 4)!=0);
	//fgets(buf, BUF, temp); //skip once more
	fscanf(temp, "Units = sectors of %d * %d\n", &sec1, &sec2);
#ifdef DEBUG
	printf("sec1: %d sec2: %d\n", sec1, sec2);
#endif
	fgets(buf, BUF, temp); /* skip sixth line */
#ifdef DEBUG
	printf("spare line: %s\n", buf);
#endif
	while (pnum != partition)
	{
		num = partnum(diskimage, temp, &pnum);
		if (feof(temp))
		{
/* This means that we went through the entire file, but we couldn't find the
partition that we were told to mount. If we get here it means something
fishy is going on (or the user had a typo). */
			printf("Partition %d was not found in %s.\n", partition, diskimage);
			fclose(temp);
			return 1;
		}
	}
	fclose(temp);
	pnum = sec1 * sec2 * num;
#ifdef DEBUG
	printf("offset = %d\n", pnum);
#endif
	snprintf(buf, BUF, "mount -oloop,offset=%d %s %s", pnum, diskimage, argv2);
	system(buf);
	return 0;
}

      reply	other threads:[~2004-06-28 20:29 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-06-26 15:12 [Qemu-devel] Utilities directory Hetz Ben Hamo
2004-06-28 13:19 ` Jean-Michel POURE
2004-06-28 20:24   ` Jim C. Brown [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20040628202406.GA32072@jbrown.mylinuxbox.org \
    --to=jbrown106@phreaker.net \
    --cc=jm@poure.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).