summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fdisks/fdisk.c2
-rw-r--r--fdisks/fdisksgilabel.c100
-rw-r--r--fdisks/fdisksgilabel.h25
-rw-r--r--include/pt-sgi.h2
4 files changed, 68 insertions, 61 deletions
diff --git a/fdisks/fdisk.c b/fdisks/fdisk.c
index 12700ee6e..b5dd7890d 100644
--- a/fdisks/fdisk.c
+++ b/fdisks/fdisk.c
@@ -932,7 +932,7 @@ static void command_prompt(struct fdisk_context *cxt)
break;
case 'i':
if (fdisk_is_disklabel(cxt, SGI))
- create_sgiinfo(cxt);
+ sgi_create_info(cxt);
else
unknown_command(c);
break;
diff --git a/fdisks/fdisksgilabel.c b/fdisks/fdisksgilabel.c
index 8dab61522..a9507a7ac 100644
--- a/fdisks/fdisksgilabel.c
+++ b/fdisks/fdisksgilabel.c
@@ -24,8 +24,8 @@
#include <sys/stat.h> /* stat */
#include <assert.h> /* assert */
-#include <endian.h>
#include "nls.h"
+#include "all-io.h"
#include "xalloc.h"
#include "blkdev.h"
@@ -43,7 +43,62 @@ struct fdisk_sgi_label {
struct fdisk_label head; /* generic part */
};
-static sgiinfo *fill_sgiinfo(void);
+/*
+ * Information within second on-disk block
+ */
+#define SGI_INFO_MAGIC 0x00072959
+
+struct sgi_info {
+ unsigned int magic; /* looks like a magic number */
+ unsigned int a2;
+ unsigned int a3;
+ unsigned int a4;
+ unsigned int b1;
+ unsigned short b2;
+ unsigned short b3;
+ unsigned int c[16];
+ unsigned short d[3];
+ unsigned char scsi_string[50];
+ unsigned char serial[137];
+ unsigned short check1816;
+ unsigned char installer[225];
+};
+
+static struct sgi_info *sgi_new_info(void)
+{
+ struct sgi_info *info = calloc(1, sizeof(struct sgi_info));
+
+ if (!info)
+ return NULL;
+
+ info->magic = cpu_to_be32(SGI_INFO_MAGIC);
+ info->b1 = cpu_to_be32(-1);
+ info->b2 = cpu_to_be16(-1);
+ info->b3 = cpu_to_be16(1);
+
+ /* You may want to replace this string !!!!!!! */
+ strcpy((char *) info->scsi_string, "IBM OEM 0662S12 3 30");
+ strcpy((char *) info->serial, "0000");
+ info->check1816 = cpu_to_be16(18 * 256 + 16);
+ strcpy((char *) info->installer, "Sfx version 5.3, Oct 18, 1994");
+
+ return info;
+}
+
+static void sgi_free_info(struct sgi_info *info)
+{
+ free(info);
+}
+
+int sgi_create_info(struct fdisk_context *cxt)
+{
+ /* I keep SGI's habit to write the sgilabel to the second block */
+ sgilabel->volume[0].block_num = cpu_to_be32(2);
+ sgilabel->volume[0].num_bytes = cpu_to_be32(sizeof(struct sgi_info));
+ strncpy((char *) sgilabel->volume[0].name, "sgilabel", 8);
+ return 0;
+}
+
/*
* only dealing with free blocks here
@@ -311,19 +366,9 @@ sgi_set_bootfile(struct fdisk_context *cxt)
}
}
-void create_sgiinfo(struct fdisk_context *cxt)
-{
- /* I keep SGI's habit to write the sgilabel to the second block */
- sgilabel->volume[0].block_num = cpu_to_be32(2);
- sgilabel->volume[0].num_bytes = cpu_to_be32(sizeof(sgiinfo));
- strncpy((char *) sgilabel->volume[0].name, "sgilabel", 8);
-}
-
-
static int sgi_write_disklabel(struct fdisk_context *cxt)
{
-
- sgiinfo *info = NULL;
+ struct sgi_info *info = NULL;
assert(cxt);
assert(cxt->label);
@@ -349,19 +394,17 @@ static int sgi_write_disklabel(struct fdisk_context *cxt)
if (lseek(cxt->dev_fd, (off_t) infostartblock *
SECTOR_SIZE, SEEK_SET) < 0)
goto err;
-
- info = fill_sgiinfo();
+ info = sgi_new_info();
if (!info)
goto err;
-
- if (write(cxt->dev_fd, info, SECTOR_SIZE) != SECTOR_SIZE)
+ if (write_all(cxt->dev_fd, info, sizeof(*info)))
goto err;
}
- free(info);
+ sgi_free_info(info);
return 0;
err:
- free(info);
+ sgi_free_info(info);
return -errno;
}
@@ -908,25 +951,6 @@ sgi_set_ncyl(void)
/* _____________________________________________________________
*/
-static sgiinfo *fill_sgiinfo(void)
-{
- sgiinfo *info = xcalloc(1, sizeof(sgiinfo));
-
- if (!info)
- return NULL;
-
- info->magic = cpu_to_be32(SGI_INFO_MAGIC);
- info->b1 = cpu_to_be32(-1);
- info->b2 = cpu_to_be16(-1);
- info->b3 = cpu_to_be16(1);
- /* You may want to replace this string !!!!!!! */
- strcpy((char *) info->scsi_string, "IBM OEM 0662S12 3 30");
- strcpy((char *) info->serial, "0000");
- info->check1816 = cpu_to_be16(18 * 256 + 16);
- strcpy((char *) info->installer, "Sfx version 5.3, Oct 18, 1994");
- return info;
-}
-
static struct fdisk_parttype *sgi_get_parttype(struct fdisk_context *cxt, size_t n)
{
struct fdisk_parttype *t;
diff --git a/fdisks/fdisksgilabel.h b/fdisks/fdisksgilabel.h
index 0ba4cfcc0..cca694f36 100644
--- a/fdisks/fdisksgilabel.h
+++ b/fdisks/fdisksgilabel.h
@@ -15,27 +15,7 @@
#define RESEEK 0x20
#define CMDTAGQ_ENABLE 0x40
-typedef struct {
- unsigned int magic; /* looks like a magic number */
- unsigned int a2;
- unsigned int a3;
- unsigned int a4;
- unsigned int b1;
- unsigned short b2;
- unsigned short b3;
- unsigned int c[16];
- unsigned short d[3];
- unsigned char scsi_string[50];
- unsigned char serial[137];
- unsigned short check1816;
- unsigned char installer[225];
-} sgiinfo;
-
-#define SGI_LABEL_MAGIC 0x0be5a941
-#define SGI_LABEL_MAGIC_SWAPPED 0x41a9e50b
-#define SGI_INFO_MAGIC 0x00072959
-#define SGI_INFO_MAGIC_SWAPPED 0x59290700
-
+#
/* toggle flags */
#define SGI_FLAG_BOOT 1
#define SGI_FLAG_SWAP 2
@@ -49,7 +29,6 @@ extern void sgi_list_table( struct fdisk_context *cxt, int xtra );
extern int sgi_change_sysid(struct fdisk_context *cxt, int i, int sys);
extern unsigned int sgi_get_start_sector(struct fdisk_context *cxt, int i );
extern unsigned int sgi_get_num_sectors(struct fdisk_context *cxt, int i );
-extern void create_sgiinfo(struct fdisk_context *cxt);
extern void sgi_set_ilfact( void );
extern void sgi_set_rspeed( void );
extern void sgi_set_pcylcount( void );
@@ -61,4 +40,6 @@ extern int sgi_get_bootpartition(struct fdisk_context *cxt);
extern int sgi_get_swappartition(struct fdisk_context *cxt);
extern void sgi_set_bootfile(struct fdisk_context *cxt);
+extern int sgi_create_info(struct fdisk_context *cxt);
+
#endif /* FDISK_SGI_LABEL_H */
diff --git a/include/pt-sgi.h b/include/pt-sgi.h
index aef33859e..ff482babd 100644
--- a/include/pt-sgi.h
+++ b/include/pt-sgi.h
@@ -3,6 +3,8 @@
#include <stdint.h>
+#define SGI_LABEL_MAGIC 0x0be5a941
+
#define SGI_MAXPARTITIONS 16
#define SGI_MAXVOLUMES 15