Skip to content

Commit bc0b946

Browse files
committed
Process command-line arguments to print partition name, file system
type, or partition flags. An optional disk device of interest may also be provided by the user.
1 parent 8cff728 commit bc0b946

File tree

1 file changed

+88
-15
lines changed

1 file changed

+88
-15
lines changed

src/partinfo.c

Lines changed: 88 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,89 @@
88
#include <stdio.h>
99
#include <parted/parted.h>
1010

11-
int main(int argc, char **argv)
11+
typedef enum {
12+
OP_NONE,
13+
OP_FLAGS,
14+
OP_FSTYPE,
15+
OP_NAME
16+
} op_t;
17+
18+
void usage(char *programname, int exit_code)
19+
{
20+
printf("Syntax: %s <option> [disk]\n\n", programname);
21+
printf("Available options are:\n"
22+
" --flags print partition flags\n"
23+
" --fstype print partition file system type\n"
24+
" --name print partition name\n"
25+
"\n");
26+
exit(exit_code);
27+
}
28+
29+
size_t print_flags(PedPartition *part, char *buf, size_t n, size_t left)
1230
{
1331
PedPartitionFlag flag = 0;
32+
size_t count = 0;
33+
34+
while ((flag = ped_partition_flag_next(flag))) {
35+
if (ped_partition_get_flag(part, flag) && left > 0) {
36+
size_t bytecount = snprintf(&buf[n], left, "%s,", ped_partition_flag_get_name(flag));
37+
count += bytecount;
38+
left -= bytecount;
39+
n += bytecount;
40+
}
41+
}
42+
if (buf[n-1] == ',')
43+
buf[n-1] = '\0';
44+
return count;
45+
}
46+
47+
size_t print_fstype(PedPartition *part, char *buf, size_t n, size_t left)
48+
{
49+
const PedFileSystemType *fstype = part->fs_type;
50+
size_t count = 0;
51+
52+
if (fstype && fstype->name)
53+
count = snprintf(&buf[n], left, "%s", fstype->name);
54+
return count;
55+
}
56+
57+
size_t print_name(PedPartition *part, char *buf, size_t n, size_t left)
58+
{
59+
const PedDiskType *disktype = part->disk->type;
60+
const char *name;
61+
size_t count = 0;
62+
63+
if (disktype && disktype->name && !strcasecmp(disktype->name, "msdos")) {
64+
/* msdos partition tables don't support labeling partition */
65+
return 0;
66+
}
67+
name = ped_partition_get_name(part);
68+
if (name)
69+
count += snprintf(&buf[n], left, "%s", name);
70+
return count;
71+
}
72+
73+
int main(int argc, char **argv)
74+
{
1475
PedPartition *part = NULL;
1576
PedDevice *dev = NULL;
1677
PedDisk *disk = NULL;
1778
char *user_dev;
18-
char buf[128];
19-
size_t n = 0, left = sizeof(buf) - 1;
79+
op_t op = OP_NONE;
2080

21-
user_dev = argc > 1 ? argv[1] : NULL;
81+
if (argc == 1)
82+
usage(argv[0], 1);
83+
else if (! strcasecmp(argv[1], "--flags"))
84+
op = OP_FLAGS;
85+
else if (! strcasecmp(argv[1], "--fstype"))
86+
op = OP_FSTYPE;
87+
else if (! strcasecmp(argv[1], "--name"))
88+
op = OP_NAME;
89+
else {
90+
printf("Invalid option '%s'\n\n", argv[1]);
91+
usage(argv[0], 1);
92+
}
93+
user_dev = argc > 2 ? argv[2] : NULL;
2294

2395
ped_device_probe_all();
2496
while ((dev = ped_device_get_next(dev))) {
@@ -28,21 +100,22 @@ int main(int argc, char **argv)
28100
while ((part = ped_disk_next_partition(disk, part))) {
29101
if (part->num < 0)
30102
continue;
103+
104+
char buf[512];
31105
memset(buf, 0, sizeof(buf));
106+
size_t n = 0, left = sizeof(buf) - 1;
107+
32108
n += snprintf(buf, left, "%s%d:", dev->path, part->num);
33109
left -= n;
34-
while ((flag = ped_partition_flag_next(flag))) {
35-
if (ped_partition_get_flag(part, flag) && left > 0) {
36-
n += snprintf(&buf[n], left, "%s,", ped_partition_flag_get_name(flag));
37-
left -= n;
38-
}
39-
}
40-
if (buf[n-1] == ',')
41-
buf[n-1] = '\0';
110+
111+
if (op == OP_FLAGS)
112+
print_flags(part, buf, n, left);
113+
else if (op == OP_FSTYPE)
114+
print_fstype(part, buf, n, left);
115+
else if (op == OP_NAME)
116+
print_name(part, buf, n, left);
117+
42118
printf("%s\n", buf);
43-
left = sizeof(buf) - 1;
44-
flag = 0;
45-
n = 0;
46119
}
47120
part = NULL;
48121
ped_disk_destroy(disk);

0 commit comments

Comments
 (0)