[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
sysinst for New generation Mac (Re: macppc/macppc/disksubr.c)
> Thu Jun 28 14:42:09 2001
> 千葉市中央区長洲
> 藤原 誠
> makoto@ki.nu
> それと、ioctl() の src はどこにあるのでしょうか。(いつも済みません)
筒井さん> どういう経路で呼ばれるのかは忘れましたが、 wd の ioctl 自体は
筒井さん> sys/dev/ata/wd.c:wdioctl() で、実際に error になっているのは
筒井さん> sys/arch/macppc/macppc/disksubr.c:setdisklabel() だと思います。
筒井さん> ちょっと眺めただけですが、 writedisklabel() とか setdisklabel()
筒井さん> とかにも xxx_mac_label() みたいな処理がいるってことなんでしょうか。
筒井さん、いつもありがとうございます。
これにかかわっていると、とても僕には終りそうになかったので、そ
の問題は別途解決していただくとして :-) とりあえず、newfs の結
果を無視するようにして sysinst を作って見ました。一応動きます。
macppc 専用という感じで、どうしようもないですが、これで一応入
ります。
・mount point は手で指定する必要がある。
・使わない区画だからと言って mount point を指定しないでおくと
/dev/wd0i ffs rw 1 1
のような行を作ってくれるので、mount -a すると
mount: /etc/fstab, 4: Missing fields
などと言っておこられる
・表示される文字は必ずしも分りやすくなっていない
・sysinst が終って、起動する時には
boot parameter は人間が考えて入力する必要があるので、
分り難い
これって
| To: gnats-bugs@gnats.netbsd.org
| Subject: install/12631: sysinst on NetBSD/macppc needs to offer option of leaving partition info intact
| From: mbw@netbsd.org
に返事するようにメールを書いてもいいものなのでしょうか。
それとも中身をもう少しましにしてからの方がいいのでしょうか。
(良く見ると表示文字が不適切なところがあるので、このままでは
だめです。)
OK ? a: NO b:yes の時に OK なのに a: NO と入れる必要がある
というような部分です
#ifdef macppc って有効でしょうか ?
実行形式も次のところに置いて見ます。
ftp://ftp.ki.nu/pub/NetBSD/port-macppc/netbsd-1.5W.GENERIC_MD.gz
diff -ur 20010604/distrib/utils/sysinst/arch/macppc/md.c src/distrib/utils/sysinst/arch/macppc/md.c
--- 20010604/distrib/utils/sysinst/arch/macppc/md.c Sun Jan 14 20:22:26 2001
+++ src/distrib/utils/sysinst/arch/macppc/md.c Thu Jun 28 14:09:47 2001
@@ -61,6 +61,7 @@
#define PART_RAW C
#define PART_USR G
+extern int hfs_exist (const char *);
int
md_get_info()
{
@@ -138,11 +139,23 @@
{
const char *bootfile = target_expand("/boot"); /*XXX*/
+ if (! hfs_exist(diskdev)) {
+ 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 ("\nLabel looks like Apples one. Will not run installboot. OK?\n");
+process_menu(MENU_noyes);}
return 0;
}
@@ -163,6 +176,7 @@
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,7 +332,24 @@
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;
}
@@ -391,4 +422,28 @@
toggle_getit (11);
toggle_getit (12);
toggle_getit (13);
+}
+/* added for macppc only*/
+int
+hfs_exist(dev)
+ const char *dev;
+{
+ /* partinfo parts[16]; */
+ int i, maxpart;
+ int hfs = 0;
+ /*
+ if (pp == NULL) {
+ emptylabel(parts);
+ if (incorelabel(dev, parts) < 0)
+ return -1;
+ }
+ */
+ maxpart = getmaxpartitions();
+ printf(" ** maxpart(%d)\n",maxpart);
+ for (i = 0; i < maxpart; i++) {
+ if (bsdlabel[i].pi_fstype == FS_HFS) {
+ hfs++;
+ }
+ }
+ return hfs;
}
diff -ur 20010604/distrib/utils/sysinst/arch/macppc/menus.md.en src/distrib/utils/sysinst/arch/macppc/menus.md.en
--- 20010604/distrib/utils/sysinst/arch/macppc/menus.md.en Sat Jan 13 02:24:04 2001
+++ src/distrib/utils/sysinst/arch/macppc/menus.md.en Sun Jun 24 06:06:01 2001
@@ -53,6 +53,14 @@
option "Change f", action { editpart = F;}, sub menu edfspart;
option "Change g", action { editpart = G;}, sub menu edfspart;
option "Change h", action { editpart = H;}, sub menu edfspart;
+ option "Change i", action { editpart = I;}, sub menu edfspart;
+ option "Change j", action { editpart = J;}, sub menu edfspart;
+ option "Change k", action { editpart = K;}, sub menu edfspart;
+ option "Change l", action { editpart = L;}, sub menu edfspart;
+ option "Change m", action { editpart = M;}, sub menu edfspart;
+ option "Change n", action { editpart = N;}, sub menu edfspart;
+ option "Change o", action { editpart = O;}, sub menu edfspart;
+ option "Change p", action { editpart = P;}, sub menu edfspart;
option "Set new allocation size", action { reask_sizemult(dlcylsize); };
menu md_distcustom, x=26, y=5, exit, title "Selection toggles inclusion";
diff -ur 20010604/distrib/utils/sysinst/arch/macppc/msg.md.en src/distrib/utils/sysinst/arch/macppc/msg.md.en
--- 20010604/distrib/utils/sysinst/arch/macppc/msg.md.en Sat Jan 13 02:24:04 2001
+++ src/distrib/utils/sysinst/arch/macppc/msg.md.en Thu Jun 28 14:19:47 2001
@@ -80,3 +80,7 @@
message askfspart
{The next partition is /dev/%s%c. You have %d %s left on your disk.
Partition size? }
+
+message applelabelexists
+{The Apple type partition label found on %s. Install boot will not be
+done. ok? }
diff -ur 20010604/distrib/utils/sysinst/defs.h src/distrib/utils/sysinst/defs.h
--- 20010604/distrib/utils/sysinst/defs.h Thu Jun 28 13:59:55 2001
+++ src/distrib/utils/sysinst/defs.h Thu Jun 28 14:11:44 2001
@@ -278,7 +278,9 @@
void md_init (void);
void md_set_sizemultname (void);
void md_set_no_x (void);
-
+#ifdef macppc
+int hfs_exist(const char *);
+#endif
/* from main.c */
void toplevel (void);
diff -ur 20010604/distrib/utils/sysinst/disks.c src/distrib/utils/sysinst/disks.c
--- 20010604/distrib/utils/sysinst/disks.c Mon Jan 15 20:37:20 2001
+++ src/distrib/utils/sysinst/disks.c Thu Jun 28 14:12:30 2001
@@ -235,12 +235,34 @@
write_disklabel (void)
{
+#ifndef macppc
#ifdef DISKLABEL_CMD
/* disklabel the disk */
return run_prog(RUN_DISPLAY, MSG_cmdfail,
"%s %s %s", DISKLABEL_CMD, diskdev, bsddiskname);
#endif
return 0;
+#else
+/*
+For macppc only, check if HFS partition exists and if found,
+not to write disk label
+*/
+if ( hfs_exist(diskdev)) {
+ printf("HFS partition exists,\nskip writing disklabel\n");
+ sleep (2);
+ return 0;
+ }
+ else {
+ printf ("HFS partition DOES NOT exist, writing disklabel\n");
+ sleep (2);
+#ifdef DISKLABEL_CMD
+ /* disklabel the disk */
+ return run_prog(RUN_DISPLAY, MSG_cmdfail,
+ "%s %s %s", DISKLABEL_CMD, diskdev, bsddiskname);
+#endif
+ return 0;
+ }
+#endif
}
int
@@ -280,6 +302,9 @@
"/sbin/newfs" : "/sbin/newfs_lfs", partname);
else
error = 0;
+#ifdef macppc
+ if ( hfs_exist(diskdev)) error = 0; /* XXX MacOS special */
+#endif
if (*mountpoint && error == 0) {
snprintf(devname, STRSIZE, "/dev/%s", partname);
if (partno > 0) /* XXX strcmp(mountpoint, "/") ? XXX */
---
(藤原)
http://www.ki.nu/software/NetBSD/iBook2/
http://www.ki.nu/software/namazu/tutorial/