| /* |
| fdisk.h |
| */ |
| |
| #include "c.h" |
| |
| /* 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" |
| |
| |
| #define DEFAULT_SECTOR_SIZE 512 |
| #define MAX_SECTOR_SIZE 2048 |
| #define SECTOR_SIZE 512 /* still used in BSD code */ |
| #define MAXIMUM_PARTS 60 |
| |
| #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 |
| #define LINUX_LVM 0x8e |
| #define LINUX_RAID 0xfd |
| |
| |
| #define LINE_LENGTH 800 |
| |
| #define IS_EXTENDED(i) \ |
| ((i) == EXTENDED || (i) == WIN98_EXTENDED || (i) == LINUX_EXTENDED) |
| |
| 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; |
| } |
| |
| 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 */ |
| } __attribute__ ((packed)); |
| |
| enum menutype { |
| MAIN_MENU, |
| EXPERT_MENU, |
| }; |
| |
| enum failure { |
| ioctl_error, |
| unable_to_read, |
| unable_to_seek, |
| unable_to_write |
| }; |
| |
| |
| extern int ask_callback(struct fdisk_context *cxt, struct fdisk_ask *ask, |
| void *data __attribute__((__unused__))); |
| |
| /* prototypes for fdisk.c */ |
| extern char *line_ptr; |
| |
| extern void fatal(struct fdisk_context *cxt, enum failure why); |
| extern void list_partition_types(struct fdisk_context *cxt); |
| extern int read_line(struct fdisk_context *cxt, int *asked); |
| extern char read_char(struct fdisk_context *cxt, char *mesg); |
| extern struct fdisk_parttype *read_partition_type(struct fdisk_context *cxt); |
| extern void reread_partition_table(struct fdisk_context *cxt, int leave); |
| extern struct partition *get_part_table(int); |
| extern unsigned int read_int(struct fdisk_context *cxt, |
| unsigned int low, unsigned int dflt, |
| unsigned int high, unsigned int base, char *mesg); |
| extern void print_menu(struct fdisk_context *cxt, enum menutype menu); |
| extern void print_partition_size(struct fdisk_context *cxt, int num, sector_t start, sector_t stop, int sysid); |
| |
| extern char *partition_type(struct fdisk_context *cxt, unsigned char type); |
| extern char read_chars(struct fdisk_context *cxt, char *mesg); |
| extern int warn_geometry(struct fdisk_context *cxt); |
| 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, |
| unsigned int base, char *mesg, int *is_suffix_used); |
| |
| #define PLURAL 0 |
| #define SINGULAR 1 |
| |
| extern sector_t get_nr_sects(struct partition *p); |
| |
| extern int nowarn; |
| |
| /* start_sect and nr_sects are stored little endian on all machines */ |
| /* moreover, they are not aligned correctly */ |
| static inline void |
| 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); |
| } |
| |
| static inline unsigned int read4_little_endian(const unsigned char *cp) |
| { |
| return (unsigned int)(cp[0]) + ((unsigned int)(cp[1]) << 8) |
| + ((unsigned int)(cp[2]) << 16) |
| + ((unsigned int)(cp[3]) << 24); |
| } |
| |
| static inline void set_nr_sects(struct partition *p, sector_t nr_sects) |
| { |
| store4_little_endian(p->size4, nr_sects); |
| } |
| |
| static inline void set_start_sect(struct partition *p, unsigned int start_sect) |
| { |
| store4_little_endian(p->start4, start_sect); |
| } |
| |
| static inline int seek_sector(struct fdisk_context *cxt, sector_t secno) |
| { |
| off_t offset = (off_t) secno * cxt->sector_size; |
| |
| return lseek(cxt->dev_fd, offset, SEEK_SET) == (off_t) -1 ? -errno : 0; |
| } |
| |
| static inline int read_sector(struct fdisk_context *cxt, sector_t secno, unsigned char *buf) |
| { |
| 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; |
| } |
| |
| static inline sector_t get_start_sect(struct partition *p) |
| { |
| return read4_little_endian(p->start4); |
| } |
| |