1/*
2 * ioconf: ioconf configuration file handling code
3 * Original code (C) 2004 by Red Hat (Charlie Bennett <ccb@redhat.com>)
4 *
5 * Modified and maintained by Sebastien GODARD (sysstat <at> orange.fr)
6 */
7
8#ifndef _IOCONF_H
9#define _IOCONF_H
10
11#include "sysconfig.h"
12
13#define IOC_NAMELEN	31
14#define IOC_DESCLEN	63
15#define IOC_DEVLEN	47
16#define IOC_MAXMINOR	2047
17#define IOC_LINESIZ	255
18#define IOC_PARTLEN	7
19#define IOC_FMTLEN	15
20
21#ifndef MAX_BLKDEV
22#define MAX_BLKDEV	255
23#endif
24
25#define K_NODEV	"nodev"
26
27#define IS_WHOLE(maj,min)	((min % ioconf[maj]->blkp->pcount) == 0)
28
29/*
30 * When is C going to get templates?
31 */
32#define IOC_ALLOC(P,TYPE,SIZE)			\
33     do {					\
34         if (P == NULL) {			\
35              P = (TYPE *) malloc(SIZE);	\
36              if (P == NULL) {			\
37                   perror("malloc");		\
38                   ioc_free();			\
39                   return 0;			\
40              }					\
41         }					\
42     }						\
43     while (0)
44/* That dummy while allows ';' on the line that invokes the macro... */
45
46
47struct blk_config {
48	char name[IOC_NAMELEN + 1];	/* device basename */
49	char cfmt[IOC_FMTLEN + 1];	/* controller format string */
50	char dfmt[IOC_FMTLEN + 1];	/* disk format string */
51	char pfmt[IOC_FMTLEN + 1];	/* partition format string */
52	/* ctrlno is in the ioc_entry */
53	unsigned int ctrl_explicit;	/* use "cN" in name */
54	unsigned int dcount;		/* number of devices handled by this major */
55	unsigned int pcount;		/* partitions per device */
56	char desc[IOC_DESCLEN + 1];
57	/* disk info unit # conversion function */
58	char *(*cconv)(unsigned int);
59
60	/* extension properties (all this for initrd?) */
61	char ext_name[IOC_NAMELEN + 1];
62	unsigned int ext;		/* flag - this is an extension record */
63	unsigned int ext_minor;		/* which minor does this apply to */
64};
65
66#define BLK_CONFIG_SIZE	(sizeof(struct blk_config))
67
68
69struct ioc_entry {
70	int live;			/* is this a Direct entry? */
71	unsigned int ctrlno;		/* controller number */
72	unsigned int basemajor;		/* Major number of the template */
73	char *desc;			/* (dynamic) per-controller description */
74	struct blk_config *blkp;	/* the real info, may be a shared ref */
75};
76
77#define IOC_ENTRY_SIZE	(sizeof(struct ioc_entry))
78
79
80extern int   ioc_iswhole(unsigned int, unsigned int);
81extern char *ioc_name(unsigned int, unsigned int);
82extern char *transform_devmapname(unsigned int, unsigned int);
83
84#endif
85