From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.33) id 1Bf2kX-0001XO-RM for qemu-devel@nongnu.org; Mon, 28 Jun 2004 16:29:09 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.33) id 1Bf2kV-0001Ww-Nc for qemu-devel@nongnu.org; Mon, 28 Jun 2004 16:29:09 -0400 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.33) id 1Bf2kV-0001Wt-JZ for qemu-devel@nongnu.org; Mon, 28 Jun 2004 16:29:07 -0400 Received: from [38.113.3.61] (helo=babyruth.hotpop.com) by monty-python.gnu.org with esmtp (Exim 4.34) id 1Bf2if-0007cy-A3 for qemu-devel@nongnu.org; Mon, 28 Jun 2004 16:27:13 -0400 Received: from phreaker.net (kubrick.hotpop.com [38.113.3.103]) by babyruth.hotpop.com (Postfix) with SMTP id DAAF768A8C1 for ; Mon, 28 Jun 2004 19:45:45 +0000 (UTC) Date: Mon, 28 Jun 2004 16:24:06 -0400 From: "Jim C. Brown" Subject: Re: [Qemu-devel] Utilities directory Message-ID: <20040628202406.GA32072@jbrown.mylinuxbox.org> References: <40DD9246.7080007@witch.dyndns.org> <200406281519.53354.jm@poure.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="45Z9DzgjV8m4Oswq" Content-Disposition: inline In-Reply-To: <200406281519.53354.jm@poure.com> Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Jean-Michel POURE Cc: qemu-devel@nongnu.org --45Z9DzgjV8m4Oswq Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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. --45Z9DzgjV8m4Oswq Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="lomount.c" #include #include #include #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; } --45Z9DzgjV8m4Oswq--