diff options
Diffstat (limited to 'fdisks/fdisk.h')
-rw-r--r-- | fdisks/fdisk.h | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/fdisks/fdisk.h b/fdisks/fdisk.h new file mode 100644 index 000000000..51a63b228 --- /dev/null +++ b/fdisks/fdisk.h @@ -0,0 +1,253 @@ +/* + fdisk.h +*/ + +#include "c.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 ALIGN_UP 1 +#define ALIGN_DOWN 2 +#define ALIGN_NEAREST 3 + +#define LINE_LENGTH 800 + +#define IS_EXTENDED(i) \ + ((i) == EXTENDED || (i) == WIN98_EXTENDED || (i) == LINUX_EXTENDED) + +#define cround(n) (display_in_cyl_units ? ((n)/units_per_sector)+1 : (n)) +#define scround(x) (((x)+units_per_sector-1)/units_per_sector) + +/* fdisk debugging flags/options */ +#define FDISK_DEBUG_INIT (1 << 1) +#define FDISK_DEBUG_CONTEXT (1 << 2) +#define FDISK_DEBUG_TOPOLOGY (1 << 3) +#define FDISK_DEBUG_GEOMETRY (1 << 4) +#define FDISK_DEBUG_ALL 0xFFFF + +# define ON_DBG(m, x) do { \ + if ((FDISK_DEBUG_ ## m) & fdisk_debug_mask) { \ + x; \ + } \ + } while (0) + +# define DBG(m, x) do { \ + if ((FDISK_DEBUG_ ## m) & fdisk_debug_mask) { \ + fprintf(stderr, "%d: fdisk: %8s: ", getpid(), # m); \ + x; \ + } \ + } while (0) + +# define DBG_FLUSH do { \ + if (fdisk_debug_mask && \ + fdisk_debug_mask != FDISK_DEBUG_INIT) \ + fflush(stderr); \ + } while(0) + +static inline void __attribute__ ((__format__ (__printf__, 1, 2))) +dbgprint(const char *mesg, ...) +{ + va_list ap; + va_start(ap, mesg); + vfprintf(stderr, mesg, ap); + va_end(ap); + fputc('\n', stderr); +} + +extern int fdisk_debug_mask; +extern void fdisk_init_debug(int mask); + +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 +}; + +typedef unsigned long long sector_t; + +/* + * Legacy CHS based geometry + */ +struct fdisk_geometry { + unsigned int heads; + sector_t sectors; + sector_t cylinders; +}; + +struct fdisk_context { + int dev_fd; /* device descriptor */ + char *dev_path; /* device path */ + unsigned char *mbr; /* buffer with master boot record */ + + /* topology */ + unsigned long io_size; /* I/O size used by fdisk */ + unsigned long optimal_io_size; /* optional I/O returned by device */ + unsigned long min_io_size; /* minimal I/O size */ + unsigned long phy_sector_size; /* physical size */ + unsigned long sector_size; /* logical size */ + unsigned long alignment_offset; + + /* geometry */ + sector_t total_sectors; /* in logical sectors */ + struct fdisk_geometry geom; +}; + +extern struct fdisk_context *fdisk_new_context_from_filename(const char *fname, int readonly); +extern int fdisk_dev_has_topology(struct fdisk_context *cxt); +extern int fdisk_dev_sectsz_is_default(struct fdisk_context *cxt); +extern void fdisk_free_context(struct fdisk_context *cxt); +extern void fdisk_mbr_zeroize(struct fdisk_context *cxt); +extern void fdisk_geom_set_cyls(struct fdisk_context *cxt); + +/* prototypes for fdisk.c */ +extern char *disk_device, *line_ptr; +extern int fd, partitions; +extern unsigned int display_in_cyl_units, units_per_sector; +extern void change_units(struct fdisk_context *cxt); +extern void fatal(struct fdisk_context *cxt, enum failure why); +extern int get_partition(struct fdisk_context *cxt, int warn, int max); +extern void list_types(struct systypes *sys); +extern int read_line (int *asked); +extern char read_char(char *mesg); +extern int read_hex(struct systypes *sys); +extern void reread_partition_table(struct fdisk_context *cxt, int leave); +extern struct partition *get_part_table(int); +extern int valid_part_table_flag(unsigned char *b); +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(enum menutype); +extern void print_partition_size(struct fdisk_context *cxt, int num, sector_t start, sector_t stop, int sysid); + +extern void fill_bounds(sector_t *first, sector_t *last); +extern unsigned int heads, cylinders; +extern sector_t sectors; +extern char *partition_type(unsigned char type); +extern void update_units(struct fdisk_context *cxt); +extern char read_chars(char *mesg); +extern void set_changed(int); +extern void set_all_unchanged(void); +extern int warn_geometry(struct fdisk_context *cxt); +extern void warn_limits(struct fdisk_context *cxt); +extern void warn_alignment(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); +extern sector_t align_lba(struct fdisk_context *cxt, sector_t lba, int direction); +extern int get_partition_dflt(struct fdisk_context *cxt, int warn, int max, int dflt); +extern void update_sector_offset(struct fdisk_context *cxt); +extern void get_partition_table_geometry(struct fdisk_context *cxt, + unsigned int *ph, unsigned int *ps); + +#define PLURAL 0 +#define SINGULAR 1 +extern const char * str_units(int); + +extern sector_t get_nr_sects(struct partition *p); + +enum labeltype { + DOS_LABEL = 1, + SUN_LABEL = 2, + SGI_LABEL = 4, + AIX_LABEL = 8, + OSF_LABEL = 16, + MAC_LABEL = 32, + ANY_LABEL = -1 +}; + +extern enum labeltype disklabel; +extern int MBRbuffer_changed; +extern unsigned long grain; + +/* 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 void seek_sector(struct fdisk_context *cxt, sector_t secno) +{ + off_t offset = (off_t) secno * cxt->sector_size; + if (lseek(cxt->dev_fd, offset, SEEK_SET) == (off_t) -1) + fatal(cxt, unable_to_seek); +} + +static inline void read_sector(struct fdisk_context *cxt, sector_t secno, unsigned char *buf) +{ + seek_sector(cxt, secno); + if (read(cxt->dev_fd, buf, cxt->sector_size) != (ssize_t) cxt->sector_size) + fatal(cxt, unable_to_read); +} + +static inline void write_sector(struct fdisk_context *cxt, sector_t secno, unsigned char *buf) +{ + seek_sector(cxt, secno); + if (write(cxt->dev_fd, buf, cxt->sector_size) != (ssize_t) cxt->sector_size) + fatal(cxt, unable_to_write); +} + +static inline sector_t get_start_sect(struct partition *p) +{ + return read4_little_endian(p->start4); +} + +static inline int is_cleared_partition(struct partition *p) +{ + return !(!p || p->boot_ind || p->head || p->sector || p->cyl || + p->sys_ind || p->end_head || p->end_sector || p->end_cyl || + get_start_sect(p) || get_nr_sects(p)); +} |