summaryrefslogtreecommitdiffstats
path: root/lib/libdisk/disk.c
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>1995-04-29 04:50:39 +0000
committerphk <phk@FreeBSD.org>1995-04-29 04:50:39 +0000
commit2d7a4f877663391b68a6e1c33ae81e279ed1829e (patch)
tree93e62248a2edb7eab68f190d22aede8b60667cce /lib/libdisk/disk.c
parent093fd20263c83b8fbfb88a7cdb49236a80c9448a (diff)
downloadFreeBSD-src-2d7a4f877663391b68a6e1c33ae81e279ed1829e.zip
FreeBSD-src-2d7a4f877663391b68a6e1c33ae81e279ed1829e.tar.gz
Even More stuff. Disk_Names() is here amongst other things.
Diffstat (limited to 'lib/libdisk/disk.c')
-rw-r--r--lib/libdisk/disk.c115
1 files changed, 100 insertions, 15 deletions
diff --git a/lib/libdisk/disk.c b/lib/libdisk/disk.c
index 154e687..482a9cd 100644
--- a/lib/libdisk/disk.c
+++ b/lib/libdisk/disk.c
@@ -6,7 +6,7 @@
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
* ----------------------------------------------------------------------------
*
- * $Id: disk.c,v 1.2 1995/04/29 01:55:21 phk Exp $
+ * $Id: disk.c,v 1.3 1995/04/29 04:00:55 phk Exp $
*
*/
@@ -17,6 +17,7 @@
#include <string.h>
#include <err.h>
#include <sys/types.h>
+#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/disklabel.h>
#include <sys/diskslice.h>
@@ -64,9 +65,11 @@ Int_Open_Disk(char *name, u_long size)
if (!size)
size = ds.dss_slices[WHOLE_DISK_SLICE].ds_size;
- Add_Chunk(d, 0, size, name,whole,0,0);
+ if (Add_Chunk(d, 0, size, name,whole,0,0))
+ warn("Failed to add 'whole' chunk");
if (ds.dss_slices[COMPATIBILITY_SLICE].ds_offset)
- Add_Chunk(d, 0, 1, "-",reserved,0,0);
+ if (Add_Chunk(d, 0, 1, "-",reserved,0,0))
+ warn("Failed to add MBR chunk");
for(i=BASE_SLICE;i<ds.dss_nslices;i++) {
char sname[20];
@@ -93,11 +96,13 @@ Int_Open_Disk(char *name, u_long size)
break;
}
flags |= CHUNK_ALIGN;
- Add_Chunk(d,ds.dss_slices[i].ds_offset,
- ds.dss_slices[i].ds_size, sname,ce,subtype,flags);
+ if (Add_Chunk(d,ds.dss_slices[i].ds_offset,
+ ds.dss_slices[i].ds_size, sname,ce,subtype,flags))
+ warn("failed to add chunk for slice %d",i - 1);
if (ce == extended)
- Add_Chunk(d,ds.dss_slices[i].ds_offset,
- 1, "-",reserved, subtype, flags);
+ if (Add_Chunk(d,ds.dss_slices[i].ds_offset,
+ 1, "-",reserved, subtype, flags))
+ warn("failed to add MBR chunk for slice %d",i - 1);
if (ds.dss_slices[i].ds_type == 0xa5) {
struct disklabel *dl;
int j;
@@ -105,18 +110,26 @@ Int_Open_Disk(char *name, u_long size)
dl = read_disklabel(fd,
ds.dss_slices[i].ds_offset + LABELSECTOR);
if(dl) {
+ char pname[20];
for(j=0; j < dl->d_npartitions; j++) {
- char pname[20];
sprintf(pname,"%s%c",sname,j+'a');
- if (j == 2)
+ if (j == 2 || j == 3)
continue;
if (!dl->d_partitions[j].p_size)
continue;
- Add_Chunk(d,
+ if (Add_Chunk(d,
dl->d_partitions[j].p_offset,
dl->d_partitions[j].p_size,
- pname,part,0,0);
+ pname,part,0,0))
+ warn("Failed to add chunk for partition %c",j + 'a');
}
+ sprintf(pname,"%sd",sname);
+ if (!dl->d_partitions[3].p_size)
+ continue;
+ Add_Chunk(d,
+ dl->d_partitions[3].p_offset,
+ dl->d_partitions[3].p_size,
+ pname,part,0,0);
}
free(dl);
}
@@ -138,10 +151,11 @@ Debug_Disk(struct disk *d)
void
Free_Disk(struct disk *d)
{
- if(d->chunks)
- Free_Chunk(d->chunks);
- if(d->name)
- free(d->name);
+ if(d->chunks) Free_Chunk(d->chunks);
+ if(d->name) free(d->name);
+ if(d->bootmgr) free(d->bootmgr);
+ if(d->boot1) free(d->boot1);
+ if(d->boot2) free(d->boot2);
free(d);
}
@@ -155,6 +169,18 @@ Clone_Disk(struct disk *d)
*d2 = *d;
d2->name = strdup(d2->name);
d2->chunks = Clone_Chunk(d2->chunks);
+ if(d2->bootmgr) {
+ d2->bootmgr = malloc(DOSPARTOFF);
+ memcpy(d2->bootmgr,d->bootmgr,DOSPARTOFF);
+ }
+ if(d2->boot1) {
+ d2->boot1 = malloc(512);
+ memcpy(d2->boot1,d->boot1,512);
+ }
+ if(d2->boot2) {
+ d2->boot2 = malloc(512*7);
+ memcpy(d2->boot2,d->boot2,512*7);
+ }
return d2;
}
@@ -165,3 +191,62 @@ Collapse_Disk(struct disk *d)
while(Collapse_Chunk(d,d->chunks))
;
}
+
+static char * device_list[] = {"wd","sd",0};
+
+char **
+Disk_Names()
+{
+ int i,j,k;
+ char disk[25];
+ char diskname[25];
+ struct stat st;
+ struct diskslices ds;
+ int fd;
+ static char **disks;
+
+ disks = malloc(sizeof *disks * (1 + MAX_NO_DISKS));
+ memset(disks,0,sizeof *disks * (1 + MAX_NO_DISKS));
+ k = 0;
+ for (j = 0; device_list[j]; j++) {
+ for (i = 0; i < 10; i++) {
+ sprintf(diskname, "%s%d", device_list[j], i);
+ sprintf(disk, "/dev/r%s", diskname);
+ if (stat(disk, &st) || !(st.st_mode & S_IFCHR))
+ continue;
+ if ((fd = open(disk, O_RDWR)) == -1)
+ continue;
+ if (ioctl(fd, DIOCGSLICEINFO, &ds) == -1) {
+ close(fd);
+ continue;
+ }
+ disks[k++] = strdup(diskname);
+ if(k == MAX_NO_DISKS)
+ return disks;
+ }
+ }
+ return disks;
+}
+
+void
+Set_Boot_Mgr(struct disk *d, u_char *b)
+{
+ if (d->bootmgr)
+ free(d->bootmgr);
+ d->bootmgr = malloc(DOSPARTOFF);
+ if(!d->bootmgr) err(1,"malloc failed");
+ memcpy(d->bootmgr,b,DOSPARTOFF);
+}
+
+void
+Set_Boot_Blocks(struct disk *d, u_char *b1, u_char *b2)
+{
+ if (d->boot1) free(d->boot1);
+ d->boot1 = malloc(512);
+ if(!d->boot1) err(1,"malloc failed");
+ memcpy(d->boot1,b1,512);
+ if (d->boot2) free(d->boot2);
+ d->boot2 = malloc(7*512);
+ if(!d->boot2) err(1,"malloc failed");
+ memcpy(d->boot2,b2,7*512);
+}
OpenPOWER on IntegriCloud