Git-Url: 
http://git.frugalware.org/gitweb/gitweb.cgi?p=fwsetup-ng.git;a=commitdiff;h=ae181c351112d4984a8077b73b91320a936c9ad8

commit ae181c351112d4984a8077b73b91320a936c9ad8
Author: James Buren <[email protected]>
Date:   Mon Oct 8 08:29:50 2012 -0500

add initial code for adding partitions

diff --git a/src/block.c b/src/block.c
index 0af296d..3cb9fb0 100644
--- a/src/block.c
+++ b/src/block.c
@@ -140,6 +140,16 @@ static bool getuuid(struct disk *disk)
}
}

+static inline long long alignsector(const struct device *device,long long 
sector)
+{
+  long long alignment = device->alignment;
+
+  if((sector % alignment) == 0)
+    return sector;
+
+  return sector + (alignment - (sector % alignment));
+}
+
extern struct device *device_open(const char *path)
{
int fd = -1;
@@ -392,6 +402,55 @@ extern void disk_new_table(struct disk *disk,const char 
*type)
disk->modified = true;
}

+extern int disk_create_partition(struct disk *disk,long long size)
+{
+  struct partition part = {0};
+
+  if(disk == 0 || disk->size < 0 || size <= 0)
+  {
+    errno = EINVAL;
+    fprintf(logfile,"%s: %s\n",__func__,strerror(errno));
+    return 0;
+  }
+
+  if(disk->size == 0)
+  {
+    part.number = 1;
+    part.start = disk->device->alignment;
+  }
+  else
+  {
+    struct partition *last = &disk->table[disk->size-1];
+    part.number = last->number + 1;
+    part.start = last->end + 1;
+  }
+
+  part.size = size / disk->device->sectorsize;
+
+  part.end = part.start + part.size - 1;
+
+  part.start = alignsector(disk->device,part.start);
+
+  part.end = alignsector(disk->device,part.end) - 1;
+
+  part.size = (part.end - part.start) + 1;
+
+  if(
+    (disk->type == DISKTYPE_DOS && part.number > 60)  ||
+    (disk->type == DISKTYPE_GPT && part.number > 128) ||
+    part.size >= disk->device->sectors
+  )
+  {
+    errno = ERANGE;
+    fprintf(logfile,"%s: %s\n",__func__,strerror(errno));
+    return 0;
+  }
+
+  memcpy(&disk->table[disk->size++],&part,sizeof(struct partition));
+
+  return part.number;
+}
+
extern void disk_delete_partition(struct disk *disk)
{
struct partition *last = 0;
_______________________________________________
Frugalware-git mailing list
[email protected]
http://frugalware.org/mailman/listinfo/frugalware-git

Reply via email to