summaryrefslogtreecommitdiffstats
path: root/include/sysfs.h
blob: 6b08bbed5efb9cccecfba53a8484088a6873f8d4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
 * Copyright (C) 2011 Karel Zak <kzak@redhat.com>
 */
#ifndef UTIL_LINUX_SYSFS_H
#define UTIL_LINUX_SYSFS_H


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <inttypes.h>
#include <dirent.h>

struct sysfs_cxt {
	dev_t	devno;
	int	dir_fd;		/* /sys/block/<name> */
	char	*dir_path;
	struct sysfs_cxt *parent;

	unsigned int	scsi_host,
			scsi_channel,
			scsi_target,
			scsi_lun;

	unsigned int	has_hctl : 1;
};

#define UL_SYSFSCXT_EMPTY { 0, -1, NULL, NULL, 0, 0, 0, 0, 0 }

extern char *sysfs_devno_attribute_path(dev_t devno, char *buf,
                                 size_t bufsiz, const char *attr);
extern int sysfs_devno_has_attribute(dev_t devno, const char *attr);
extern char *sysfs_devno_path(dev_t devno, char *buf, size_t bufsiz);
extern char *sysfs_devno_to_devpath(dev_t devno, char *buf, size_t bufsiz);
extern dev_t sysfs_devname_to_devno(const char *name, const char *parent);

extern int sysfs_init(struct sysfs_cxt *cxt, dev_t devno, struct sysfs_cxt *parent)
					__attribute__ ((warn_unused_result));
extern void sysfs_deinit(struct sysfs_cxt *cxt);

extern DIR *sysfs_opendir(struct sysfs_cxt *cxt, const char *attr);

extern int sysfs_stat(struct sysfs_cxt *cxt, const char *attr, struct stat *st);
extern ssize_t sysfs_readlink(struct sysfs_cxt *cxt, const char *attr,
	                   char *buf, size_t bufsiz);
extern int sysfs_has_attribute(struct sysfs_cxt *cxt, const char *attr);

extern int sysfs_scanf(struct sysfs_cxt *cxt,  const char *attr,
		       const char *fmt, ...)
		        __attribute__ ((format (scanf, 3, 4)));

extern int sysfs_read_s64(struct sysfs_cxt *cxt, const char *attr, int64_t *res);
extern int sysfs_read_u64(struct sysfs_cxt *cxt, const char *attr, uint64_t *res);
extern int sysfs_read_int(struct sysfs_cxt *cxt, const char *attr, int *res);

extern int sysfs_write_string(struct sysfs_cxt *cxt, const char *attr, const char *str);
extern int sysfs_write_u64(struct sysfs_cxt *cxt, const char *attr, uint64_t num);

extern char *sysfs_get_devname(struct sysfs_cxt *cxt, char *buf, size_t bufsiz);

extern char *sysfs_strdup(struct sysfs_cxt *cxt, const char *attr);

extern int sysfs_count_dirents(struct sysfs_cxt *cxt, const char *attr);
extern int sysfs_count_partitions(struct sysfs_cxt *cxt, const char *devname);
extern dev_t sysfs_partno_to_devno(struct sysfs_cxt *cxt, int partno);
extern char *sysfs_get_slave(struct sysfs_cxt *cxt);

extern char *sysfs_get_devchain(struct sysfs_cxt *cxt, char *buf, size_t bufsz);
extern int sysfs_next_subsystem(struct sysfs_cxt *cxt, char *devchain, char **subsys);
extern int sysfs_is_hotpluggable(struct sysfs_cxt *cxt);

extern int sysfs_is_partition_dirent(DIR *dir, struct dirent *d,
			const char *parent_name);

extern int sysfs_devno_to_wholedisk(dev_t dev, char *diskname,
            size_t len, dev_t *diskdevno);

extern int sysfs_devno_is_lvm_private(dev_t devno);
extern int sysfs_devno_is_wholedisk(dev_t devno);

extern int sysfs_scsi_get_hctl(struct sysfs_cxt *cxt, int *h,
			       int *c, int *t, int *l);
extern char *sysfs_scsi_host_strdup_attribute(struct sysfs_cxt *cxt,
                const char *type, const char *attr);
extern int sysfs_scsi_host_is(struct sysfs_cxt *cxt, const char *type);
extern int sysfs_scsi_has_attribute(struct sysfs_cxt *cxt, const char *attr);
extern int sysfs_scsi_path_contains(struct sysfs_cxt *cxt, const char *pattern);

/**
 * sysfs_devname_to_dev_name:
 * @name: devname to be converted in place
 *
 * Linux kernel linux/drivers/base/core.c: device_get_devnode()
 * defines a replacement of '!' in the /sys device name by '/' in the
 * /dev device name. This helper replaces all ocurrences of '!' in
 * @name by '/' to convert from /sys to /dev.
 */
static inline void sysfs_devname_to_dev_name (char *name)
{
	char *c;

	if (name)
		while ((c = strchr(name, '!')))
			c[0] = '/';
}

/**
 * sysfs_dev_name_to_devname:
 * @name: devname to be converted in place
 *
 * Linux kernel linux/drivers/base/core.c: device_get_devnode()
 * defines a replacement of '!' in the /sys device name by '/' in the
 * /dev device name. This helper replaces all ocurrences of '/' in
 * @name by '!' to convert from /dev to /sys.
 */
static inline void sysfs_dev_name_to_devname (char *name)
{
	char *c;

	if (name)
		while ((c = strchr(name, '/')))
			c[0] = '!';
}

#endif /* UTIL_LINUX_SYSFS_H */