Minor improvements for autopart and setupcd

This commit is contained in:
Ben Gras 2005-07-13 14:59:43 +00:00
parent e2a0ddf863
commit 0348b8d0ca
2 changed files with 145 additions and 145 deletions

View file

@ -54,7 +54,7 @@ Num Sort Type
#define DEV_FD0 0x200 /* Device number of /dev/fd0 */ #define DEV_FD0 0x200 /* Device number of /dev/fd0 */
#define DEV_C0D0 0x300 /* Device number of /dev/c0d0 */ #define DEV_C0D0 0x300 /* Device number of /dev/c0d0 */
#define MIN_REGION_MB 80 #define MIN_REGION_MB 180
#define MIN_REGION_SECTORS (1024*1024*MIN_REGION_MB/SECTOR_SIZE) #define MIN_REGION_SECTORS (1024*1024*MIN_REGION_MB/SECTOR_SIZE)
#define MAX_REGION_MB 4095 #define MAX_REGION_MB 4095
@ -374,7 +374,7 @@ struct part_entry table[1 + NR_PARTITIONS];
int existing[1 + NR_PARTITIONS]; int existing[1 + NR_PARTITIONS];
unsigned long offset= 0, extbase= 0, extsize; unsigned long offset= 0, extbase= 0, extsize;
int submerged= 0; int submerged= 0;
char sort_index[1 + NR_PARTITIONS]; char sort_index[1 + NR_PARTITIONS], sort_order[1 + NR_PARTITIONS];
unsigned cylinders= 1, heads= 1, sectors= 1, secpcyl= 1; unsigned cylinders= 1, heads= 1, sectors= 1, secpcyl= 1;
unsigned alt_cyls= 1, alt_heads= 1, alt_secs= 1; unsigned alt_cyls= 1, alt_heads= 1, alt_secs= 1;
int precise= 0; int precise= 0;
@ -389,21 +389,20 @@ void sort(void)
/* Let the sort_index array show the order partitions are sorted in. */ /* Let the sort_index array show the order partitions are sorted in. */
{ {
int i, j; int i, j;
int idx[1 + NR_PARTITIONS];
for (i= 1; i <= NR_PARTITIONS; i++) idx[i]= i; for (i= 1; i <= NR_PARTITIONS; i++) sort_order[i]= i;
for (i= 1; i <= NR_PARTITIONS; i++) { for (i= 1; i <= NR_PARTITIONS; i++) {
for (j= 1; j <= NR_PARTITIONS-1; j++) { for (j= 1; j <= NR_PARTITIONS-1; j++) {
int sj= idx[j], sj1= idx[j+1]; int sj= sort_order[j], sj1= sort_order[j+1];
if (sortbase(&table[sj]) > sortbase(&table[sj1])) { if (sortbase(&table[sj]) > sortbase(&table[sj1])) {
idx[j]= sj1; sort_order[j]= sj1;
idx[j+1]= sj; sort_order[j+1]= sj;
} }
} }
} }
for (i= 1; i <= NR_PARTITIONS; i++) sort_index[idx[i]]= i; for (i= 1; i <= NR_PARTITIONS; i++) sort_index[sort_order[i]]= i;
} }
void dos2chs(unsigned char *dos, unsigned *chs) void dos2chs(unsigned char *dos, unsigned *chs)
@ -1679,17 +1678,6 @@ ssize_t boot_readwrite(int rw)
return r; return r;
} }
int bigenough(region_t *reg)
{
int sectors;
if(reg->used_part)
sectors = reg->used_part->size;
else
sectors = reg->free_sec_last - reg->free_sec_start + 1;
return sectors >= MIN_REGION_SECTORS;
}
int cylinderalign(region_t *reg) int cylinderalign(region_t *reg)
{ {
if(reg->used_part) { if(reg->used_part) {
@ -1701,7 +1689,7 @@ int cylinderalign(region_t *reg)
reg->used_part->size -= extra; reg->used_part->size -= extra;
} }
if((reg->used_part->size+1) % secpcyl) { if((reg->used_part->size+1) % secpcyl) {
reg->used_part->size -= secpcyl - (reg->used_part->size % secpcyl); reg->used_part->size -= secpcyl - ((reg->used_part->size + 1) % secpcyl);
} }
return reg->used_part->size > 0; return reg->used_part->size > 0;
} }
@ -1710,9 +1698,9 @@ int cylinderalign(region_t *reg)
/* Start is unaligned. Round up. */ /* Start is unaligned. Round up. */
reg->free_sec_start += secpcyl - (reg->free_sec_start % secpcyl); reg->free_sec_start += secpcyl - (reg->free_sec_start % secpcyl);
} }
if(reg->free_sec_last % secpcyl) { if((reg->free_sec_last+1) % secpcyl) {
/* End is unaligned. Round down. */ /* End is unaligned. Round down. */
reg->free_sec_last -= reg->free_sec_last % secpcyl; reg->free_sec_last -= (reg->free_sec_last+1) % secpcyl;
} }
/* Return nonzero if anything remains of the region after rounding. */ /* Return nonzero if anything remains of the region after rounding. */
@ -1744,7 +1732,7 @@ void m_read(int ev, object_t *op)
} }
if(probing) { if(probing) {
v = HZ/2; v = 2*HZ;
ioctl(device, DIOCTIMEOUT, &v); ioctl(device, DIOCTIMEOUT, &v);
} }
@ -1822,7 +1810,7 @@ void m_read(int ev, object_t *op)
/* Create region data used in autopart mode. */ /* Create region data used in autopart mode. */
free_regions = used_regions = nr_regions = nr_partitions = 0; free_regions = used_regions = nr_regions = nr_partitions = 0;
for(si = 1; si <= NR_PARTITIONS; si++) { for(si = 1; si <= NR_PARTITIONS; si++) {
i = sort_index[si]; i = sort_order[si];
if(i < 1 || i > NR_PARTITIONS) { if(i < 1 || i > NR_PARTITIONS) {
printf("Sorry, something unexpected has happened (%d out of range).\n", i); printf("Sorry, something unexpected has happened (%d out of range).\n", i);
exit(1); exit(1);
@ -1835,16 +1823,15 @@ void m_read(int ev, object_t *op)
regions[nr_regions].free_sec_start = free_sec; regions[nr_regions].free_sec_start = free_sec;
regions[nr_regions].free_sec_last = table[i].lowsec-1; regions[nr_regions].free_sec_last = table[i].lowsec-1;
regions[nr_regions].used_part = NULL; regions[nr_regions].used_part = NULL;
if(cylinderalign(&regions[nr_regions]) && if(cylinderalign(&regions[nr_regions])) {
bigenough(&regions[nr_regions])) {
nr_regions++; nr_regions++;
free_regions++; free_regions++;
} }
} }
if(autopartmode && si > 1) { if(autopartmode && si > 1) {
if(table[i].lowsec < table[sort_index[si-1]].lowsec || if(table[i].lowsec < table[sort_order[si-1]].lowsec ||
table[i].lowsec < table[sort_index[si-1]].lowsec + table[sort_index[si-1]].size) { table[i].lowsec < table[sort_order[si-1]].lowsec + table[sort_order[si-1]].size) {
printf("Sanity check failed - partitions overlap.\n" printf("Sanity check failed - partitions overlap.\n"
"Please use expert mode to correct it.\n"); "Please use expert mode to correct it.\n");
exit(1); exit(1);
@ -1855,19 +1842,16 @@ void m_read(int ev, object_t *op)
free_sec = table[i].lowsec+table[i].size; free_sec = table[i].lowsec+table[i].size;
nr_partitions++; nr_partitions++;
if(bigenough(&regions[nr_regions])) {
nr_regions++; nr_regions++;
used_regions++; used_regions++;
} }
}
/* Special case: space after partitions. */ /* Special case: space after partitions. */
if(free_sec < table[0].size-1) { if(free_sec < table[0].size-1) {
regions[nr_regions].free_sec_start = free_sec; regions[nr_regions].free_sec_start = free_sec;
regions[nr_regions].free_sec_last = table[0].lowsec + table[0].size-1; regions[nr_regions].free_sec_last = table[0].lowsec + table[0].size-1;
regions[nr_regions].used_part = NULL; regions[nr_regions].used_part = NULL;
if(cylinderalign(&regions[nr_regions]) && if(cylinderalign(&regions[nr_regions])) {
bigenough(&regions[nr_regions])) {
nr_regions++; nr_regions++;
free_regions++; free_regions++;
} }
@ -1895,9 +1879,8 @@ void m_write(int ev, object_t *op)
if (bootblock[510] != 0x55 || bootblock[511] != 0xAA) { if (bootblock[510] != 0x55 || bootblock[511] != 0xAA) {
/* Invalid boot block, warn user. */ /* Invalid boot block, warn user. */
stat_start(1); stat_start(1);
printf("Warning: About to write a new table on %s", if(!autopartmode) printf("Warning: About to write a new table on %s",
curdev->subname); curdev->subname);
if(autopartmode) printf("\n");
stat_end(5); stat_end(5);
} }
if (extbase != 0) { if (extbase != 0) {
@ -2196,8 +2179,11 @@ void mainloop(void)
char * char *
prettysizeprint(int kb) prettysizeprint(int kb)
{ {
static char str[20]; int toosmall = 0;
static char str[200];
char unit = 'k'; char unit = 'k';
if(MIN_REGION_SECTORS > kb*2)
toosmall = 1;
if(kb >= 5*1024) { if(kb >= 5*1024) {
kb /= 1024; kb /= 1024;
unit = 'M'; unit = 'M';
@ -2206,7 +2192,8 @@ prettysizeprint(int kb)
unit = 'G'; unit = 'G';
} }
} }
sprintf(str, "%d%cB", kb, unit); sprintf(str, "%d%cB%s", kb, unit,
toosmall ? " - too small for MINIX" : "");
return str; return str;
} }
@ -2237,10 +2224,8 @@ select_region(void)
do { do {
reg = regions; reg = regions;
printf("\nI've found the following region%s on this disk (%s).\n" printf("\nI've found the following region%s on this disk (%s).\n\n",
"(I'm only showing ones of at least %dMB.)\n\n", SORNOT(nr_regions), prettysizeprint(table[0].size/2));
SORNOT(nr_regions), prettysizeprint(table[0].size/2),
MIN_REGION_MB);
for(r = 0; r < nr_regions; r++, reg++) { for(r = 0; r < nr_regions; r++, reg++) {
unsigned long units; unsigned long units;
if(reg->used_part) { if(reg->used_part) {
@ -2385,7 +2370,7 @@ select_disk(void)
} }
int int
scribble_region(region_t *reg) scribble_region(region_t *reg, struct part_entry **pe)
{ {
int ex, trunc = 0, changed = 0, i; int ex, trunc = 0, changed = 0, i;
struct part_entry *newpart; struct part_entry *newpart;
@ -2405,7 +2390,7 @@ scribble_region(region_t *reg)
} }
} }
if(trunc) { if(trunc) {
printf("\nShrunk region to %dMB.\n", MAX_REGION_MB); printf("\nWill only use %dMB.\n", MAX_REGION_MB);
} }
if(!reg->used_part) { if(!reg->used_part) {
for(i = 1; i <= NR_PARTITIONS; i++) for(i = 1; i <= NR_PARTITIONS; i++)
@ -2422,15 +2407,17 @@ scribble_region(region_t *reg)
changed = 1; changed = 1;
} else newpart = reg->used_part; } else newpart = reg->used_part;
newpart->sysind = MINIX_PART; newpart->sysind = MINIX_PART;
*pe = newpart;
changed = 1; changed = 1;
return changed; return changed;
} }
int int
do_autopart(void) do_autopart(int resultfd)
{ {
region_t *r; region_t *r;
struct part_entry *pe;
nordonly = 1; nordonly = 1;
probing = 1; probing = 1;
@ -2456,10 +2443,35 @@ do_autopart(void)
} while(!r); } while(!r);
/* Write things. */ /* Write things. */
if(scribble_region(r)) { if(scribble_region(r, &pe)) {
int i, found = -1;
char partbuf[100];
dirty = 1; dirty = 1;
m_write('w', NULL); m_write('w', NULL);
return !dirty; if(dirty) return 1;
/* Retrieve partition number in sorted order that we
* have scribbled in.
*/
sort();
for(i = 1; i <= NR_PARTITIONS; i++) {
if(table[sort_order[i]].lowsec == pe->lowsec) {
if(found > 0) {
fprintf(stderr, "Internal error (1).\n");
return 1;
}
found = i;
}
}
if(found < 1) {
fprintf(stderr, "Internal error (2).\n");
return 1;
}
sprintf(partbuf, "%sp%d\n", curdev->name, found-1);
if(resultfd >= 0 && write(resultfd, partbuf, strlen(partbuf)) < strlen(partbuf)) {
fprintf(stderr, "Couldn't write result.\n");
return 1;
}
return 0;
} }
return 1; return 1;
@ -2472,6 +2484,7 @@ int main(int argc, char **argv)
struct part_entry *pe; struct part_entry *pe;
char *name; char *name;
int autopart = 0; int autopart = 0;
int resultfd = -1;
/* Autopilot mode if invoked as autopart. */ /* Autopilot mode if invoked as autopart. */
if(!(name = strrchr(argv[0], '/'))) name = argv[0]; if(!(name = strrchr(argv[0], '/'))) name = argv[0];
@ -2529,6 +2542,25 @@ int main(int argc, char **argv)
op= newobject(O_SIZE, OF_MOD, r, 69, 9); op->entry= pe; op= newobject(O_SIZE, OF_MOD, r, 69, 9); op->entry= pe;
op= newobject(O_KB, OF_MOD, r, 79, 9); op->entry= pe; op= newobject(O_KB, OF_MOD, r, 79, 9); op->entry= pe;
} }
} else {
int c;
/* autopart uses getopt() */
while((c = getopt(argc, argv, "f:")) != EOF) {
switch(c) {
case 'f':
unlink(optarg);
if((resultfd=open(optarg, O_CREAT | O_WRONLY | O_TRUNC)) < 0) {
perror(optarg);
return 1;
}
break;
default:
fprintf(stderr, "Unknown option\n");
return 1;
}
}
argc--;
argv++;
} }
for (i= 1; i < argc; i++) newdevice(argv[i], 0, 0); for (i= 1; i < argc; i++) newdevice(argv[i], 0, 0);
@ -2541,11 +2573,14 @@ int main(int argc, char **argv)
} }
if(autopart) { if(autopart) {
int r;
if (firstdev == nil) { if (firstdev == nil) {
fprintf(stderr, "autopart couldn't find any devices.\n"); fprintf(stderr, "autopart couldn't find any devices.\n");
return 1; return 1;
} }
return do_autopart(); r = do_autopart(resultfd);
if(resultfd >= 0) { close(resultfd); }
return r;
} }
if (firstdev != nil) { if (firstdev != nil) {

View file

@ -26,70 +26,12 @@ EOF
while getopts '' opt; do usage; done while getopts '' opt; do usage; done
shift `expr $OPTIND - 1` shift `expr $OPTIND - 1`
# Installing a floppy set? if [ "$USER" != root ]
case $# in then echo "Please run setupcd as root."
0) # No, we're installing a skeleton system on the hard disk. exit 1
;;
1)
cd "$1" || exit
# Annoying message still there?
grep "'setup /usr'" /etc/issue >/dev/null 2>&1 && rm -f /etc/issue
if [ -t 0 ]
then
size=bad
while [ "$size" = bad ]
do
echo -n "\
What is the size of the images on the diskettes? [all] "; read size
case $size in
''|360|720|1200|1440)
;;
*) echo "Sorry, I don't believe \"$size\", try again." >&2
size=bad
esac
done
drive=
while [ -z "$drive" ]
do
echo -n "What floppy drive to use? [0] "; read drive
case $drive in
'') drive=0
;;
[01])
;;
*) echo "It must be 0 or 1, not \"$drive\"."
drive=
esac
done
vol -r $size /dev/fd$drive | uncompress | tar xvfp -
else
# Standard input is where we can get our files from.
uncompress | tar xvfp -
fi fi
echo Done.
exit
;;
*)
usage
esac
# Installing Minix on the hard disk. # Installing Minix on the hard disk.
# Must be in / or we can't mount or umount.
if [ ! -f /CD ]
then
case "`pwd`" in
/?*)
echo "Please type 'cd /' first, you are locking up `pwd`" >&2
exit 1
esac
fi
case "$0" in case "$0" in
/tmp/*) /tmp/*)
@ -116,19 +58,6 @@ case $thisroot:$fdusr in
/dev/fd*:/dev/fd*) fdroot=$thisroot # ROOT is mounted directly /dev/fd*:/dev/fd*) fdroot=$thisroot # ROOT is mounted directly
;; ;;
*) fdroot=$thisroot # ? *) fdroot=$thisroot # ?
if [ -f /CD ]
then
:
else
echo -n "\
It looks like Minix has been installed on disk already. Are you sure you
know what you are doing? [n] "
read yn
case "$yn" in
[yY]*|sure) ;;
*) exit
esac
fi
esac esac
echo -n "\ echo -n "\
@ -157,6 +86,25 @@ echo -n "
Keyboard type? [us-std] "; read keymap Keyboard type? [us-std] "; read keymap
test -n "$keymap" && loadkeys "/usr/lib/keymaps/$keymap.map" test -n "$keymap" && loadkeys "/usr/lib/keymaps/$keymap.map"
echo -n "Welcome to Minix partitioning. Do you want to
follow the (A)utomatic or the e(X)pert mode? Expert mode drops
you into part to let you edit your partition table to taste.
Automatic mode is much easier, but can't handle all cases. In
cases it can't handle, it will tell you to use expert mode.
Please choose, A for Automatic, or X for Expert: "
read ch
case "$ch" in
[Aa]*) auto="1" ;;
[Xx]*) auto="" ;;
*) echo "Unrecognized response."; exit 1;
esac
primary=
if [ -z "$auto" ]
then
# Expert mode
echo -n " echo -n "
Minix needs one primary partition of at about 210 MB for a full install Minix needs one primary partition of at about 210 MB for a full install
with sources. (The full install also fits in about 180 MB, but it with sources. (The full install also fits in about 180 MB, but it
@ -178,7 +126,6 @@ make. (See the devices section in usage(8) on Minix device names.)
:" :"
read ret read ret
primary=
while [ -z "$primary" ] while [ -z "$primary" ]
do do
part || exit part || exit
@ -188,11 +135,38 @@ Please finish the name of the primary partition you have created:
(Just type RETURN if you want to rerun \"part\") /dev/" (Just type RETURN if you want to rerun \"part\") /dev/"
read primary read primary
done done
else
# Automatic mode
while [ -z "$primary" ]
do
PF="/tmp/pf"
echo -n "Press return to enter the autopart tool, or DEL to abort.
:"
read ret
if autopart -f$PF
then if [ -s "$PF" ]
then
bd="`cat $PF`"
if [ -b "$bd" ]
then primary="$bd"
else echo "Funny device $bd from autopart."
fi
else
echo "Didn't find output from autopart."
fi
else echo "Autopart tool failed. Trying again."
fi
done
fi
root=${primary}s0 root=${primary}s0
swap=${primary}s1 swap=${primary}s1
usr=${primary}s2 usr=${primary}s2
echo "$root $usr"
exit 1
hex2int() hex2int()
{ {
# Translate hexadecimal to integer. # Translate hexadecimal to integer.
@ -345,18 +319,9 @@ Copying $fdroot to /dev/$root
mkfs /dev/$root || exit mkfs /dev/$root || exit
mount /dev/$root /mnt || exit mount /dev/$root /mnt || exit
if [ -d /boot ] # Running from the installation CD.
then
# Running from the floppy itself (or installation CD).
cpdir -vx / /mnt || exit cpdir -vx / /mnt || exit
chmod 555 /mnt/usr chmod 555 /mnt/usr
else
# Running from the RAM disk, root image is on a floppy.
mount $fdroot /root || exit
cpdir -v /root /mnt || exit
umount $fdroot || exit
cpdir -f /dev /mnt/dev # Copy any extra MAKEDEV'd devices
fi
# CD remnants that aren't for the installed system # CD remnants that aren't for the installed system
rm /mnt/etc/issue /mnt/CD 2>/dev/null rm /mnt/etc/issue /mnt/CD 2>/dev/null