summaryrefslogtreecommitdiffstats
path: root/lib/libdisk/create_chunk.c
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>1995-04-29 07:21:14 +0000
committerphk <phk@FreeBSD.org>1995-04-29 07:21:14 +0000
commit9684e60aa333602d99d67bf4386e5ea09dd26530 (patch)
treefa70e13b20375cea9c33bb00b43511f4b3042b5e /lib/libdisk/create_chunk.c
parent5cc2dacd0f6917d2ba5808d3171283232acad395 (diff)
downloadFreeBSD-src-9684e60aa333602d99d67bf4386e5ea09dd26530.zip
FreeBSD-src-9684e60aa333602d99d67bf4386e5ea09dd26530.tar.gz
Names are assigned when chunks are created.
Rules for only one fat & one extended in MBR.
Diffstat (limited to 'lib/libdisk/create_chunk.c')
-rw-r--r--lib/libdisk/create_chunk.c112
1 files changed, 110 insertions, 2 deletions
diff --git a/lib/libdisk/create_chunk.c b/lib/libdisk/create_chunk.c
index 7abcac9..82c0082 100644
--- a/lib/libdisk/create_chunk.c
+++ b/lib/libdisk/create_chunk.c
@@ -6,7 +6,7 @@
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
* ----------------------------------------------------------------------------
*
- * $Id$
+ * $Id: create_chunk.c,v 1.2 1995/04/29 01:55:20 phk Exp $
*
*/
@@ -15,11 +15,119 @@
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
+#include <sys/disklabel.h>
+#include <sys/diskslice.h>
+#include <sys/types.h>
#include <err.h>
#include "libdisk.h"
+void
+Fixup_FreeBSD_Names(struct disk *d, struct chunk *c)
+{
+ struct chunk *c1, *c2, *c3;
+ int j;
+ char *p=0;
+
+ for (c1 = c->part; c1 ; c1 = c1->next) {
+ if (c1->type == unused) continue;
+ if (c1->type == reserved) continue;
+ if (strcmp(c1->name, "X")) continue;
+ for(j=0;j<=8;j++) {
+ if (j == 2)
+ continue;
+ p = malloc(12);
+ if(!p) err(1,"malloc failed");
+ sprintf(p,"%s%c",c->name,j+'a');
+ for(c3 = c->part; c3 ; c3 = c3->next)
+ if (c3 != c1 && !strcmp(c3->name, p))
+ goto match;
+ free(c1->name);
+ c1->name = p;
+ p = 0;
+ break;
+ match:
+ continue;
+ }
+ if(p)
+ free(p);
+ }
+}
+
+void
+Fixup_Extended_Names(struct disk *d, struct chunk *c)
+{
+ struct chunk *c1, *c2, *c3;
+ int j;
+ char *p=0;
+
+ for (c1 = c->part; c1 ; c1 = c1->next) {
+ if (c1->type == freebsd)
+ Fixup_FreeBSD_Names(d,c1);
+ if (c1->type == unused) continue;
+ if (c1->type == reserved) continue;
+ if (strcmp(c1->name, "X")) continue;
+ for(j=5;j<=29;j++) {
+ p = malloc(12);
+ if(!p) err(1,"malloc failed");
+ sprintf(p,"%ss%d",c->name,j);
+ for(c3 = c->part; c3 ; c3 = c3->next)
+ if (c3 != c1 && !strcmp(c3->name, p))
+ goto match;
+ free(c1->name);
+ c1->name = p;
+ p = 0;
+ break;
+ match:
+ continue;
+ }
+ if(p)
+ free(p);
+ }
+}
+
+void
+Fixup_Names(struct disk *d)
+{
+ struct chunk *c1, *c2, *c3;
+ int i,j;
+ char *p=0;
+
+ c1 = d->chunks;
+ for(i=1,c2 = c1->part; c2 ; c2 = c2->next) {
+ if (c2->type == freebsd)
+ Fixup_FreeBSD_Names(d,c2);
+ if (c2->type == extended)
+ Fixup_Extended_Names(d,c2);
+ if (c2->type == unused)
+ continue;
+ if (c2->type == reserved)
+ continue;
+ if (strcmp(c2->name,"X"))
+ continue;
+ p = malloc(12);
+ if(!p) err(1,"malloc failed");
+ for(j=1;j<=NDOSPART;j++) {
+ sprintf(p,"%ss%d",c1->name,j);
+ for(c3 = c1->part; c3 ; c3 = c3->next)
+ if (c3 != c2 && !strcmp(c3->name, p))
+ goto match;
+ free(c2->name);
+ c2->name = p;
+ p = 0;
+ break;
+ match:
+ continue;
+ }
+ if(p)
+ free(p);
+ }
+}
+
int
Create_Chunk(struct disk *d, u_long offset, u_long size, chunk_e type, int subtype, u_long flags)
{
- return Add_Chunk(d,offset,size,"X",type,subtype,flags);
+ int i;
+ i = Add_Chunk(d,offset,size,"X",type,subtype,flags);
+ Fixup_Names(d);
+ return i;
}
OpenPOWER on IntegriCloud