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