2006-12-06 17:25:33 -06:00
|
|
|
/*
|
|
|
|
fdisk.h
|
|
|
|
*/
|
|
|
|
|
2009-10-15 18:26:46 -05:00
|
|
|
#include "c.h"
|
|
|
|
|
2012-11-30 08:29:03 -06:00
|
|
|
/* Let's temporary include private libfdisk header file. The final libfdisk.h
|
|
|
|
* maybe included when fdisk.c and libfdisk code will be completely spit.
|
|
|
|
*/
|
|
|
|
#include "fdiskP.h"
|
|
|
|
|
|
|
|
|
2006-12-06 17:25:37 -06:00
|
|
|
#define DEFAULT_SECTOR_SIZE 512
|
|
|
|
#define MAX_SECTOR_SIZE 2048
|
|
|
|
#define SECTOR_SIZE 512 /* still used in BSD code */
|
2006-12-06 17:25:35 -06:00
|
|
|
#define MAXIMUM_PARTS 60
|
|
|
|
|
2006-12-06 17:25:37 -06:00
|
|
|
#define ACTIVE_FLAG 0x80
|
|
|
|
|
|
|
|
#define EXTENDED 0x05
|
|
|
|
#define WIN98_EXTENDED 0x0f
|
|
|
|
#define LINUX_PARTITION 0x81
|
|
|
|
#define LINUX_SWAP 0x82
|
|
|
|
#define LINUX_NATIVE 0x83
|
|
|
|
#define LINUX_EXTENDED 0x85
|
2006-12-06 17:25:46 -06:00
|
|
|
#define LINUX_LVM 0x8e
|
|
|
|
#define LINUX_RAID 0xfd
|
2006-12-06 17:25:37 -06:00
|
|
|
|
2012-05-06 07:10:18 -05:00
|
|
|
|
|
|
|
#define LINE_LENGTH 800
|
|
|
|
|
2006-12-06 17:25:37 -06:00
|
|
|
#define IS_EXTENDED(i) \
|
|
|
|
((i) == EXTENDED || (i) == WIN98_EXTENDED || (i) == LINUX_EXTENDED)
|
|
|
|
|
2013-02-11 09:38:20 -06:00
|
|
|
extern void toggle_units(struct fdisk_context *cxt);
|
|
|
|
|
|
|
|
static inline unsigned long
|
|
|
|
scround(struct fdisk_context *cxt, unsigned long num)
|
|
|
|
{
|
|
|
|
unsigned long un = fdisk_context_get_units_per_sector(cxt);
|
|
|
|
return (num + un - 1) / un;
|
|
|
|
}
|
2006-12-06 17:25:33 -06:00
|
|
|
|
2006-12-06 17:25:35 -06:00
|
|
|
struct partition {
|
|
|
|
unsigned char boot_ind; /* 0x80 - active */
|
|
|
|
unsigned char head; /* starting head */
|
|
|
|
unsigned char sector; /* starting sector */
|
|
|
|
unsigned char cyl; /* starting cylinder */
|
|
|
|
unsigned char sys_ind; /* What partition type */
|
|
|
|
unsigned char end_head; /* end head */
|
|
|
|
unsigned char end_sector; /* end sector */
|
|
|
|
unsigned char end_cyl; /* end cylinder */
|
|
|
|
unsigned char start4[4]; /* starting sector counting from 0 */
|
|
|
|
unsigned char size4[4]; /* nr of sectors in partition */
|
2012-01-05 10:01:19 -06:00
|
|
|
} __attribute__ ((packed));
|
2006-12-06 17:25:35 -06:00
|
|
|
|
2011-11-09 12:04:12 -06:00
|
|
|
enum menutype {
|
|
|
|
MAIN_MENU,
|
|
|
|
EXPERT_MENU,
|
|
|
|
};
|
|
|
|
|
2012-04-27 06:23:51 -05:00
|
|
|
enum failure {
|
|
|
|
ioctl_error,
|
|
|
|
unable_to_read,
|
|
|
|
unable_to_seek,
|
|
|
|
unable_to_write
|
|
|
|
};
|
2006-12-06 17:25:33 -06:00
|
|
|
|
2013-01-28 09:16:11 -06:00
|
|
|
|
|
|
|
extern int ask_callback(struct fdisk_context *cxt, struct fdisk_ask *ask,
|
|
|
|
void *data __attribute__((__unused__)));
|
|
|
|
|
2006-12-06 17:25:33 -06:00
|
|
|
/* prototypes for fdisk.c */
|
2012-07-24 03:52:09 -05:00
|
|
|
extern char *line_ptr;
|
2012-07-24 02:54:52 -05:00
|
|
|
|
2012-05-27 14:44:04 -05:00
|
|
|
extern void fatal(struct fdisk_context *cxt, enum failure why);
|
2012-09-24 06:24:09 -05:00
|
|
|
extern void list_partition_types(struct fdisk_context *cxt);
|
2013-01-18 09:11:40 -06:00
|
|
|
extern int read_line(struct fdisk_context *cxt, int *asked);
|
|
|
|
extern char read_char(struct fdisk_context *cxt, char *mesg);
|
2012-09-25 03:23:36 -05:00
|
|
|
extern struct fdisk_parttype *read_partition_type(struct fdisk_context *cxt);
|
2012-05-27 14:44:04 -05:00
|
|
|
extern void reread_partition_table(struct fdisk_context *cxt, int leave);
|
2006-12-06 17:25:43 -06:00
|
|
|
extern struct partition *get_part_table(int);
|
2012-06-03 13:15:17 -05:00
|
|
|
extern unsigned int read_int(struct fdisk_context *cxt,
|
|
|
|
unsigned int low, unsigned int dflt,
|
2006-12-06 17:26:12 -06:00
|
|
|
unsigned int high, unsigned int base, char *mesg);
|
2012-11-25 22:25:49 -06:00
|
|
|
extern void print_menu(struct fdisk_context *cxt, enum menutype menu);
|
2006-12-06 17:25:43 -06:00
|
|
|
|
2012-09-24 04:30:26 -05:00
|
|
|
extern char *partition_type(struct fdisk_context *cxt, unsigned char type);
|
2013-01-18 09:11:40 -06:00
|
|
|
extern char read_chars(struct fdisk_context *cxt, char *mesg);
|
2012-06-17 11:10:33 -05:00
|
|
|
extern int warn_geometry(struct fdisk_context *cxt);
|
2012-06-03 13:15:17 -05:00
|
|
|
extern void warn_limits(struct fdisk_context *cxt);
|
|
|
|
extern unsigned int read_int_with_suffix(struct fdisk_context *cxt,
|
|
|
|
unsigned int low, unsigned int dflt, unsigned int high,
|
2012-05-06 07:10:18 -05:00
|
|
|
unsigned int base, char *mesg, int *is_suffix_used);
|
2006-12-06 17:25:39 -06:00
|
|
|
|
2012-05-27 14:44:13 -05:00
|
|
|
extern sector_t get_nr_sects(struct partition *p);
|
2006-12-06 17:25:35 -06:00
|
|
|
|
2012-12-03 09:22:17 -06:00
|
|
|
extern int nowarn;
|
2012-06-03 13:15:20 -05:00
|
|
|
|
2012-04-28 17:02:45 -05:00
|
|
|
/* start_sect and nr_sects are stored little endian on all machines */
|
|
|
|
/* moreover, they are not aligned correctly */
|
2012-05-02 07:05:51 -05:00
|
|
|
static inline void
|
2012-04-28 17:02:45 -05:00
|
|
|
store4_little_endian(unsigned char *cp, unsigned int val) {
|
|
|
|
cp[0] = (val & 0xff);
|
|
|
|
cp[1] = ((val >> 8) & 0xff);
|
|
|
|
cp[2] = ((val >> 16) & 0xff);
|
|
|
|
cp[3] = ((val >> 24) & 0xff);
|
|
|
|
}
|
|
|
|
|
2012-05-02 07:05:51 -05:00
|
|
|
static inline unsigned int read4_little_endian(const unsigned char *cp)
|
2012-04-28 17:02:45 -05:00
|
|
|
{
|
|
|
|
return (unsigned int)(cp[0]) + ((unsigned int)(cp[1]) << 8)
|
|
|
|
+ ((unsigned int)(cp[2]) << 16)
|
|
|
|
+ ((unsigned int)(cp[3]) << 24);
|
|
|
|
}
|
|
|
|
|
2012-05-27 14:44:13 -05:00
|
|
|
static inline void set_nr_sects(struct partition *p, sector_t nr_sects)
|
2012-04-28 17:02:45 -05:00
|
|
|
{
|
|
|
|
store4_little_endian(p->size4, nr_sects);
|
|
|
|
}
|
|
|
|
|
2012-05-02 07:05:51 -05:00
|
|
|
static inline void set_start_sect(struct partition *p, unsigned int start_sect)
|
2012-04-28 17:02:45 -05:00
|
|
|
{
|
|
|
|
store4_little_endian(p->start4, start_sect);
|
|
|
|
}
|
|
|
|
|
2012-11-30 04:54:10 -06:00
|
|
|
static inline int seek_sector(struct fdisk_context *cxt, sector_t secno)
|
2012-04-28 17:02:45 -05:00
|
|
|
{
|
2012-06-03 13:15:17 -05:00
|
|
|
off_t offset = (off_t) secno * cxt->sector_size;
|
2012-11-30 04:54:10 -06:00
|
|
|
|
|
|
|
return lseek(cxt->dev_fd, offset, SEEK_SET) == (off_t) -1 ? -errno : 0;
|
2012-04-28 17:02:45 -05:00
|
|
|
}
|
|
|
|
|
2012-11-30 04:54:10 -06:00
|
|
|
static inline int read_sector(struct fdisk_context *cxt, sector_t secno, unsigned char *buf)
|
2012-04-28 17:02:45 -05:00
|
|
|
{
|
2012-11-30 04:54:10 -06:00
|
|
|
int rc = seek_sector(cxt, secno);
|
|
|
|
|
|
|
|
if (rc < 0)
|
|
|
|
return rc;
|
|
|
|
|
|
|
|
return read(cxt->dev_fd, buf, cxt->sector_size) !=
|
|
|
|
(ssize_t) cxt->sector_size ? -errno : 0;
|
2012-04-28 17:02:45 -05:00
|
|
|
}
|
|
|
|
|
2012-05-27 14:44:13 -05:00
|
|
|
static inline sector_t get_start_sect(struct partition *p)
|
2012-04-28 17:02:45 -05:00
|
|
|
{
|
|
|
|
return read4_little_endian(p->start4);
|
|
|
|
}
|
|
|
|
|