-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlist_mode.c
117 lines (102 loc) · 4.1 KB
/
list_mode.c
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
//
// Created by gosha on 15.02.2021.
//
struct disk_info {
char disk_name[256];
char major_minor_numbers[32];
char fs_type[32];
char fs_version[32];
};
void read_devices_properties(struct disk_info *device) {
char const *FS_TYPE_PROPERTY = "E:ID_FS_TYPE";
char const *FS_VERSION_PROPERTY = "E:ID_FS_VERSION";
char udev_data_file_name[32] = "/run/udev/data/b";
strcat(udev_data_file_name, device->major_minor_numbers);
FILE *fp;
char *line = NULL;
size_t len = 0;
size_t read;
fp = fopen(udev_data_file_name, "rb");
if (fp == NULL)
return;
char property_value[32];
while ((read = getline(&line, &len, fp)) != -1) {
if (startsWith(line, FS_TYPE_PROPERTY)) {
size_t property_len = strlen(FS_TYPE_PROPERTY) + 1;
strncpy(property_value, &line[property_len], read - property_len);
remove_ending_symbol(property_value, '\n');
strcpy(device->fs_type, property_value);
} else if (startsWith(line, FS_VERSION_PROPERTY)) {
size_t property_len = strlen(FS_VERSION_PROPERTY) + 1;
strncpy(property_value, &line[property_len], read - property_len);
remove_ending_symbol(property_value, '\n');
strcpy(device->fs_version, property_value);
}
}
fclose(fp);
if (line)
free(line);
}
void add_disk_partition_info(struct disk_info *info, struct dirent *sys_block_child, const char* disk_dir_name) {
char disk_dev_file_name[256] = {0};
strcpy(disk_dev_file_name, disk_dir_name);
strcat(disk_dev_file_name, "/dev");
FILE *disk_dev_file = fopen(disk_dev_file_name, "rb");
char *buffer = 0;
size_t length;
if (disk_dev_file) {
fseek(disk_dev_file, 0, SEEK_END);
length = ftell(disk_dev_file);
fseek(disk_dev_file, 0, SEEK_SET);
buffer = calloc(1, length);
fread(buffer, 1, length, disk_dev_file);
remove_ending_symbol(buffer, '\n');
fclose(disk_dev_file);
}
strcpy(info->disk_name, sys_block_child->d_name);
strcpy(info->major_minor_numbers, buffer);
read_devices_properties(info);
free(buffer);
}
void run_list_mode() {
const int32_t MAX_DISKS = 256;
const char *sys_block_path = "/sys/block/";
struct disk_info *disks = (struct disk_info *) malloc(MAX_DISKS * sizeof(struct disk_info));
struct disk_info *partitions = (struct disk_info *) malloc(MAX_DISKS * sizeof(struct disk_info));
DIR *sys_block_dir = opendir(sys_block_path);
DIR *sys_block_disk_dir;
struct dirent *sys_block_child;
struct dirent *sys_block_disk_child;
int32_t disks_counter = 0;
int32_t parts_counter = 0;
if (sys_block_dir) {
while ((sys_block_child = readdir(sys_block_dir)) != NULL) {
if (startsWith(sys_block_child->d_name, "sd")) {
char disk_dir_name[256] = {0};
strcat(disk_dir_name, sys_block_path);
strcat(disk_dir_name, sys_block_child->d_name);
add_disk_partition_info(&disks[disks_counter], sys_block_child, disk_dir_name);
disks_counter++;
sys_block_disk_dir = opendir(disk_dir_name);
while ((sys_block_disk_child = readdir(sys_block_disk_dir)) != NULL) {
if (startsWith(sys_block_disk_child->d_name, "sd")) {
char part_dir_name[256] = {0};
strcpy(part_dir_name, disk_dir_name);
append_path_part(part_dir_name, sys_block_disk_child->d_name);
add_disk_partition_info(&partitions[parts_counter], sys_block_disk_child, part_dir_name);
parts_counter++;
}
}
closedir(sys_block_disk_dir);
}
}
closedir(sys_block_dir);
}
for (int i = 0; i < disks_counter; ++i) {
printf("disk name: %s\n", disks[i].disk_name);
}
for (int i = 0; i < parts_counter; ++i) {
printf("partition name: %s (%s %s)\n",
partitions[i].disk_name, partitions[i].fs_type, partitions[i].fs_version);
}
}