[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

disks.c: write_label (Re: src/distrib/utils/sysinst/install.c)



>                                            千葉市中央区長洲
>                                                    藤原  誠
From: 藤原  誠 / Makoto Fujiwara <makoto@ki.nu>
Subject: get_real_geom() Re: src/distrib/utils/sysinst/geom.c
Date: Wed, 20 Jun 2001 21:35:22 +0900

藤原> src/distrib/utils/sysinst/install.c
藤原> から呼ばれている
藤原> src/distrib/utils/sysinst/geom.c
藤原> の中の get_real_geom(disk, l)
藤原> は正しく Apple label を読んでいるのかな

藤原> 3. 
藤原>   a: Standard
藤原>   b: Standard with X
藤原>   c: Custom
藤原>   d: Use Existing
藤原> で d: を選ぶと

藤原> 4.
藤原> c: 19077  0   19076  unused

藤原> しか表示されないのは何か変だなぁと思っている訳です。

これは例によって、勘違いがありました。
問題は 
  /usr/src/distrib/utils/sysinst/arch/macppc/md.c の中の
	case 3: 
            ....
	case 4: /* Use Existing  */
以下に、何も書いてないことでした。この辺を(添付のように)少し変更すると、
上に挙げた操作で disk label が表示されるようにはなりました。
ところが、
http://cvsweb.netbsd.org/cgi-bin/cvsweb.cgi/basesrc/distrib/utils/sysinst/install.c
の中に、
        if (write_disklabel() != 0)
                return;
という部分があって、これは、
http://cvsweb.netbsd.org/cgi-bin/cvsweb.cgi/basesrc/distrib/utils/sysinst/disks.c
の
-------------------------------------------
write_disklabel (void)
{

#ifdef DISKLABEL_CMD
        /* disklabel the disk */
        return run_prog(RUN_DISPLAY, MSG_cmdfail,
            "%s %s %s", DISKLABEL_CMD, diskdev, bsddiskname);
#endif
        return 0;
}
-------------------------------------------
のように make 時には切換出来るようになっているのですが、実行時に
Apple map の時には飛ばして、BSD label の時には実行するというよう
に切換える必要があると思うのですが、どうすると良いでしょうか。

・install.c を書換えてよい
・DISKLABEL_CMD の中にコードを埋込む
・その他

そうして更に、その
Apple map of BSD label をどうやって判別するかというのもあります。

(付けたものは一応途中までは動きますが、まだ修正途中のものです)

--- /usr/src/distrib/utils/sysinst/arch/macppc/md.c-oo	Sun Jan 14 20:22:26 2001
+++ md.c	Sat Jun 23 09:53:02 2001
@@ -138,11 +138,25 @@
 {
 	const char *bootfile = target_expand("/boot");	/*XXX*/
 
+	if (md_get_info()) {
+	 
+	  printf ("Proceeding for installboot.\n");
+process_menu(MENU_noyes);
+	if (!yesno) { 	msg_display(MSG_abort);
+		process_menu(MENU_ok);
+		return 0;}
+
 	printf (msg_string(MSG_dobootblks), diskdev);
 	cp_to_target("/usr/mdec/ofwboot", "/boot");
 	sync();
 	run_prog(RUN_DISPLAY, NULL, "/usr/mdec/installboot %s %s /dev/r%sa",
 	    bootfile,  "/usr/mdec/bootxx", diskdev);
+	 }
+	else {
+	  printf (msg_string(MSG_applelabelexists), diskdev);
+	  printf ("Label looks like Apples one. Will not run installboot\n");
+process_menu(MENU_noyes);}
+
 	return 0;
 }
 
@@ -163,6 +177,8 @@
 	char isize[20];
 	int maxpart = getmaxpartitions();
 
+	struct disklabel disklabel;
+
 	/*
 	 * Initialize global variables that track  space used on this disk.
 	 * Standard 4.3BSD 8-partition labels always cover whole disk.
@@ -318,10 +334,26 @@
 			remain = fsdsize - partstart;
 			part++;
 		}
+	case 4: /* Use Existing  */
+		if (get_real_geom(diskdev,&disklabel ) == 0) {
+			msg_display(MSG_abort);	/* XXX more informative */
+		}
 
+		for (i = 0; i < maxpart; i++) {
+#define p disklabel.d_partitions[i]
+			bsdlabel[i].pi_size = p.p_size;
+			bsdlabel[i].pi_offset = p.p_offset;
+			if (i != RAW_PART) {
+				bsdlabel[i].pi_fstype = p.p_fstype;
+				bsdlabel[i].pi_bsize = p.p_fsize * p.p_frag;
+				bsdlabel[i].pi_fsize = p.p_fsize;
+				/* menu to get fsmount[] entry */
+#undef p
+			} else
+				bsdlabel[i].pi_fstype = FS_UNUSED;
+		}
 		break;
 	}
-
 
 	/*
 	 * OK, we have a partition table. Give the user the chance to

---
(藤原)
http://www.ki.nu/software/NetBSD/iBook2/