autopart, setupcd updates

This commit is contained in:
Ben Gras 2005-07-22 18:30:40 +00:00
parent d5516193f3
commit b9e585c81c
5 changed files with 104 additions and 52 deletions

View file

@ -41,6 +41,7 @@ all install clean::
cd ftpd && $(MAKE) $@ cd ftpd && $(MAKE) $@
cd ftpd200 && $(MAKE) $@ cd ftpd200 && $(MAKE) $@
cd ibm && $(MAKE) $@ cd ibm && $(MAKE) $@
cd indent && $(MAKE) $@
cd kermit && $(MAKE) $@ cd kermit && $(MAKE) $@
cd m4 && $(MAKE) $@ cd m4 && $(MAKE) $@
cd make && $(MAKE) $@ cd make && $(MAKE) $@

View file

@ -13,6 +13,7 @@ ALL = \
loadfont \ loadfont \
loadkeys \ loadkeys \
mixer \ mixer \
autopart \
part \ part \
partition \ partition \
playwave \ playwave \

View file

@ -237,7 +237,8 @@ typedef struct region {
* entry (used_part is non-NULL) or free space (free_* * entry (used_part is non-NULL) or free space (free_*
* contains data). * contains data).
*/ */
struct part_entry *used_part; struct part_entry used_part;
int is_used_part;
int free_sec_start, free_sec_last; int free_sec_start, free_sec_last;
} region_t; } region_t;
@ -251,6 +252,13 @@ int nordonly = 0;
device_t *firstdev= nil, *curdev; device_t *firstdev= nil, *curdev;
#define MAX_DEVICES 100
static struct {
device_t *dev;
int nr_partitions, free_regions, used_regions, sectors, nr_regions;
region_t regions[NR_REGIONS];
} devices[MAX_DEVICES];
void newdevice(char *name, int scanning, int disk_only) void newdevice(char *name, int scanning, int disk_only)
/* Add a device to the device list. If scanning is set then we are reading /* Add a device to the device list. If scanning is set then we are reading
* /dev, so insert the device in device number order and make /dev/c0d0 current. * /dev, so insert the device in device number order and make /dev/c0d0 current.
@ -1680,18 +1688,18 @@ ssize_t boot_readwrite(int rw)
int cylinderalign(region_t *reg) int cylinderalign(region_t *reg)
{ {
if(reg->used_part) { if(reg->is_used_part) {
if(reg->used_part->lowsec != table[0].lowsec + sectors if(reg->used_part.lowsec != table[0].lowsec + sectors
&& (reg->used_part->lowsec % secpcyl)) { && (reg->used_part.lowsec % secpcyl)) {
int extra; int extra;
extra = secpcyl - (reg->used_part->lowsec % secpcyl); extra = secpcyl - (reg->used_part.lowsec % secpcyl);
reg->used_part->lowsec += extra; reg->used_part.lowsec += extra;
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 + 1) % secpcyl); reg->used_part.size -= secpcyl - ((reg->used_part.size + 1) % secpcyl);
} }
return reg->used_part->size > 0; return reg->used_part.size > 0;
} }
if(reg->free_sec_start != table[0].lowsec + sectors && (reg->free_sec_start % secpcyl)) { if(reg->free_sec_start != table[0].lowsec + sectors && (reg->free_sec_start % secpcyl)) {
@ -1822,7 +1830,7 @@ void m_read(int ev, object_t *op)
/* Free region before this partition. */ /* Free region before this partition. */
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].is_used_part = 0;
if(cylinderalign(&regions[nr_regions])) { if(cylinderalign(&regions[nr_regions])) {
nr_regions++; nr_regions++;
free_regions++; free_regions++;
@ -1838,7 +1846,7 @@ void m_read(int ev, object_t *op)
} }
} }
regions[nr_regions].used_part = &table[i]; memcpy(&regions[nr_regions].used_part, &table[i], sizeof(table[i]));
free_sec = table[i].lowsec+table[i].size; free_sec = table[i].lowsec+table[i].size;
nr_partitions++; nr_partitions++;
@ -1850,7 +1858,7 @@ void m_read(int ev, object_t *op)
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].is_used_part = 0;
if(cylinderalign(&regions[nr_regions])) { if(cylinderalign(&regions[nr_regions])) {
nr_regions++; nr_regions++;
free_regions++; free_regions++;
@ -2192,11 +2200,40 @@ prettysizeprint(int kb)
unit = 'G'; unit = 'G';
} }
} }
sprintf(str, "%d%cB%s", kb, unit, sprintf(str, "%d %cB%s", kb, unit,
toosmall ? " - too small for MINIX" : ""); toosmall ? " - too small for MINIX3" : "");
return str; return str;
} }
void
printregions(region_t *theregions, int indent, int p_nr_partitions, int p_free_regions, int p_nr_regions)
{
int r, nofree = 0;
region_t *reg;
reg = theregions;
if((p_nr_partitions >= NR_PARTITIONS || !p_free_regions) && p_free_regions)
nofree = 1;
for(r = 0; r < p_nr_regions; r++, reg++) {
unsigned long units;
if(reg->is_used_part) {
char *name;
name = typ2txt(reg->used_part.sysind);
if(!name || strlen(name) < 2)
name = "unknown system";
printf("%*s\033[31m%2d. in use by %s", indent, "", r, name);
units = reg->used_part.size / 2;
printf("\033[0m (%s)\n", prettysizeprint(units));
} else if(!nofree) {
printf("%*s\033[36m%2d. free space", indent, "", r);
units = ((reg->free_sec_last - reg->free_sec_start+1))/2;
printf("\033[0m (%s)\n", prettysizeprint(units));
}
}
return;
}
region_t * region_t *
select_region(void) select_region(void)
{ {
@ -2223,25 +2260,9 @@ select_region(void)
} }
do { do {
reg = regions;
printf("\nI've found the following region%s on this disk (%s).\n\n", printf("\nI've found the following region%s on this disk (%s).\n\n",
SORNOT(nr_regions), prettysizeprint(table[0].size/2)); SORNOT(nr_regions), prettysizeprint(table[0].size/2));
for(r = 0; r < nr_regions; r++, reg++) { printregions(regions, 0, nr_partitions, free_regions, nr_regions);
unsigned long units;
if(reg->used_part) {
char *name;
name = typ2txt(reg->used_part->sysind);
if(!name || strlen(name) < 2)
name = "unknown system";
printf("\033[31m%2d. in use by %s", r, name);
units = reg->used_part->size / 2;
printf("\033[0m (%s)\n", prettysizeprint(units));
} else if(!nofree) {
printf("\033[36m%2d. free space", r);
units = ((reg->free_sec_last - reg->free_sec_start+1))/2;
printf("\033[0m (%s)\n", prettysizeprint(units));
}
}
if(nofree) { if(nofree) {
printf("\nOnly the expert mode can free a slot to use the free space.\n"); printf("\nOnly the expert mode can free a slot to use the free space.\n");
@ -2262,7 +2283,7 @@ select_region(void)
continue; continue;
} }
if(nofree && !regions[rn].used_part) { if(nofree && !regions[rn].is_used_part) {
printf("That region number isn't available.\n"); printf("That region number isn't available.\n");
continue; continue;
} }
@ -2285,11 +2306,7 @@ select_region(void)
device_t * device_t *
select_disk(void) select_disk(void)
{ {
#define MAX_DEVICES 100
static struct {
device_t *dev;
int free_regions, used_regions, sectors;
} devices[MAX_DEVICES];
int i, choice, drives; int i, choice, drives;
static char line[500]; static char line[500];
@ -2306,8 +2323,11 @@ select_disk(void)
if(device >= 0) { if(device >= 0) {
devices[i].dev = curdev; devices[i].dev = curdev;
devices[i].free_regions = free_regions; devices[i].free_regions = free_regions;
devices[i].nr_regions = nr_regions;
devices[i].nr_partitions = nr_partitions;
devices[i].used_regions = used_regions; devices[i].used_regions = used_regions;
devices[i].sectors = table[0].size; devices[i].sectors = table[0].size;
memcpy(devices[i].regions, regions, sizeof(regions));
i++; i++;
} }
@ -2338,7 +2358,13 @@ select_disk(void)
printf(", %d unallocated one%s ", printf(", %d unallocated one%s ",
devices[i].free_regions, SORNOT(devices[i].free_regions)); devices[i].free_regions, SORNOT(devices[i].free_regions));
} }
printf(" (%s)\n", prettysizeprint(devices[i].sectors/2)); printf(" (%s)\n\n", prettysizeprint(devices[i].sectors/2));
printf("regions :%d %d %d\n",
i, devices[i].nr_partitions, devices[i].free_regions);
printregions(devices[i].regions, 8,
devices[i].nr_partitions,
devices[i].free_regions,
devices[i].nr_regions);
} }
if(drives > 1) { if(drives > 1) {
@ -2374,13 +2400,13 @@ 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;
if(reg->used_part && reg->used_part->size > MAX_REGION_SECTORS) { if(reg->is_used_part && reg->used_part.size > MAX_REGION_SECTORS) {
reg->used_part->size = MAX_REGION_SECTORS; reg->used_part.size = MAX_REGION_SECTORS;
trunc = 1; trunc = 1;
changed = 1; changed = 1;
cylinderalign(reg); cylinderalign(reg);
} }
if(!reg->used_part) { if(!reg->is_used_part) {
ex = reg->free_sec_last - reg->free_sec_start + 1; ex = reg->free_sec_last - reg->free_sec_start + 1;
if(ex > MAX_REGION_SECTORS) { if(ex > MAX_REGION_SECTORS) {
reg->free_sec_last -= ex - MAX_REGION_SECTORS; reg->free_sec_last -= ex - MAX_REGION_SECTORS;
@ -2392,7 +2418,7 @@ scribble_region(region_t *reg, struct part_entry **pe)
if(trunc) { if(trunc) {
printf("\nWill only use %dMB.\n", MAX_REGION_MB); printf("\nWill only use %dMB.\n", MAX_REGION_MB);
} }
if(!reg->used_part) { if(!reg->is_used_part) {
for(i = 1; i <= NR_PARTITIONS; i++) for(i = 1; i <= NR_PARTITIONS; i++)
if(table[i].sysind == NO_PART) if(table[i].sysind == NO_PART)
break; break;
@ -2405,7 +2431,7 @@ scribble_region(region_t *reg, struct part_entry **pe)
newpart->lowsec = reg->free_sec_start; newpart->lowsec = reg->free_sec_start;
newpart->size = reg->free_sec_last - reg->free_sec_start + 1; newpart->size = reg->free_sec_last - reg->free_sec_start + 1;
changed = 1; changed = 1;
} else newpart = reg->used_part; } else newpart = &reg->used_part;
newpart->sysind = MINIX_PART; newpart->sysind = MINIX_PART;
*pe = newpart; *pe = newpart;
changed = 1; changed = 1;
@ -2444,6 +2470,7 @@ do_autopart(int resultfd)
/* Write things. */ /* Write things. */
if(scribble_region(r, &pe)) { if(scribble_region(r, &pe)) {
char *name;
int i, found = -1; int i, found = -1;
char partbuf[100]; char partbuf[100];
dirty = 1; dirty = 1;
@ -2466,7 +2493,10 @@ do_autopart(int resultfd)
fprintf(stderr, "Internal error (2).\n"); fprintf(stderr, "Internal error (2).\n");
return 1; return 1;
} }
sprintf(partbuf, "%sp%d\n", curdev->name, found-1); name=strrchr(curdev->name, '/');
if(!name) name = curdev->name;
else name++;
sprintf(partbuf, "%sp%d\n", name, found-1);
if(resultfd >= 0 && write(resultfd, partbuf, strlen(partbuf)) < strlen(partbuf)) { if(resultfd >= 0 && write(resultfd, partbuf, strlen(partbuf)) < strlen(partbuf)) {
fprintf(stderr, "Couldn't write result.\n"); fprintf(stderr, "Couldn't write result.\n");
return 1; return 1;

View file

@ -238,7 +238,7 @@ struct proc *pt;
printf("Nonzero if held by busy syscall: 0x%04.4x\n", pt->p_ntf_held); /* int */ printf("Nonzero if held by busy syscall: 0x%04.4x\n", pt->p_ntf_held); /* int */
printf("Next in chain of held-up processes: 0x%04.4x\n", pt->p_ntf_nextheld); /* struct proc * */ printf("Next in chain of held-up processes: 0x%04.4x\n", pt->p_ntf_nextheld); /* struct proc * */
#endif #endif
printf("SENDING, RECEIVING, etc.: 0x%04.4x\n", pt->p_flags); /* int */ printf("SENDING, RECEIVING, etc.: 0x%04.4x\n", pt->p_rts_flags); /* int */
#if 0 #if 0
printf("Memory map: 0x%04.4x\n", pt->p_map[NR_LOCAL_SEGS]); /* struct mem_map */ printf("Memory map: 0x%04.4x\n", pt->p_map[NR_LOCAL_SEGS]); /* struct mem_map */
#endif #endif

View file

@ -193,7 +193,7 @@ echo "3. A different Ethernet card is installed (no networking)"
echo "" echo ""
echo "You can always change your mind after the install." echo "You can always change your mind after the install."
echo "" echo ""
echo "Choice? " echo -n "Choice? "
read eth read eth
driver="" driver=""
inetparams="" inetparams=""
@ -224,6 +224,27 @@ i86)
*) test $memsize -lt 6144 && swapadv=$(expr 6144 - $memsize) *) test $memsize -lt 6144 && swapadv=$(expr 6144 - $memsize)
esac esac
blockdefault=8
echo "\
The default block size on the disk is $blockdefault KB. However, sizes of 1 to $blockdefault KB
are also supported. If you have a small disk or small RAM you may want less
than $blockdefault KB, in which case type a block size from 1 to 8 (1, 2, 4 or $blockdefault are
suggested values). Otherwise hit ENTER for the default of $blockdefault KB blocks, which
should be fine in most cases."
while [ -z "$blocksize" ]
do echo -n "Block size [$blockdefault KB]? "
read blocksize
if [ -z "$blocksize" ]
then blocksize=$blockdefault
fi
if [ $blocksize -gt $blockdefault -o $blocksize -lt 1 ]
then echo "$blocksize bogus block size. 1-$blockdefault please."
blocksize=""
fi
done
echo -n " echo -n "
How much swap space would you like? Swapspace is only needed if this How much swap space would you like? Swapspace is only needed if this
system is memory starved, like a 16-bit system with less then 2M, or a system is memory starved, like a 16-bit system with less then 2M, or a
@ -263,12 +284,11 @@ else
# Forget about swap. # Forget about swap.
swap= swap=
fi fi
echo " echo "
Migrating to disk... Migrating to disk...
" "
mkfs /dev/$usr mkfs -B $blocksize /dev/$usr
echo "\ echo "\
Scanning /dev/$usr for bad blocks. (Hit DEL to stop the scan if you are Scanning /dev/$usr for bad blocks. (Hit DEL to stop the scan if you are
absolutely sure that there can not be any bad blocks. Otherwise just wait.)" absolutely sure that there can not be any bad blocks. Otherwise just wait.)"
@ -314,7 +334,7 @@ echo "
Copying $fdroot to /dev/$root Copying $fdroot to /dev/$root
" "
mkfs /dev/$root || exit mkfs -B $blocksize /dev/$root || exit
mount /dev/$root /mnt || exit mount /dev/$root /mnt || exit
# Running from the installation CD. # Running from the installation CD.
cpdir -vx / /mnt || exit cpdir -vx / /mnt || exit
@ -357,14 +377,14 @@ if [ $cache -eq 0 ]; then cache=; else cache="ramsize=$cache"; fi
# Make bootable. # Make bootable.
installboot -d /dev/$root /usr/mdec/bootblock /boot/boot >/dev/null || exit installboot -d /dev/$root /usr/mdec/bootblock /boot/boot >/dev/null || exit
edparams /dev/$root "rootdev=$root; ramimagedev=$root; $cache; $inetparams; save" || exit edparams /dev/$root "rootdev=$root; ramimagedev=$root; $cache; $inetparams; main() { delay 2000; boot }; save" || exit
pfile="/usr/src/tools/fdbootparams" pfile="/usr/src/tools/fdbootparams"
echo "Remembering boot parameters in ${pfile}." echo "Remembering boot parameters in ${pfile}."
echo "rootdev=$root; ramimagedev=$root; $cache; save" >$pfile || exit echo "rootdev=$root; ramimagedev=$root; $cache; save" >$pfile || exit
sync sync
echo " echo "
Please type 'halt' to exit Minix. Please type 'shutdown' to exit Minix.
You can type 'boot $primary' to try the newly installed Minix system. See You can type 'boot $primary' to try the newly installed Minix system. See
\"TESTING\" in the usage manual." \"TESTING\" in the usage manual."