util-linux/fdisks/fdisk.h

152 lines
4.4 KiB
C
Raw Normal View History

2006-12-06 17:25:33 -06:00
/*
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"
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
#define LINUX_LVM 0x8e
#define LINUX_RAID 0xfd
2006-12-06 17:25:37 -06: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)
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 */
} __attribute__ ((packed));
2006-12-06 17:25:35 -06:00
enum menutype {
MAIN_MENU,
EXPERT_MENU,
};
enum failure {
ioctl_error,
unable_to_read,
unable_to_seek,
unable_to_write
};
2006-12-06 17:25:33 -06:00
extern int print_fdisk_menu(struct fdisk_context *cxt);
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 */
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,
2006-12-06 17:26:12 -06:00
unsigned int high, unsigned int base, char *mesg);
extern void print_menu(struct fdisk_context *cxt, enum menutype menu);
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);
2006-12-06 17:25:39 -06:00
extern sector_t get_nr_sects(struct partition *p);
2006-12-06 17:25:35 -06:00
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);
}