Skip to content

Commit 31ea7fa

Browse files
committed
libfdisk: add fdisk_label_get_fields_ids_all()
The current fdisk_label_get_fields_ids() is too smart as it differentiate between details mode etc. It's useful for default output, but in some cases it's better to provide all output fields. Signed-off-by: Karel Zak <kzak@redhat.com>
1 parent 3e3b51b commit 31ea7fa

4 files changed

Lines changed: 53 additions & 5 deletions

File tree

libfdisk/docs/libfdisk-sections.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ fdisk_is_label
101101
fdisk_label_get_field
102102
fdisk_label_get_field_by_name
103103
fdisk_label_get_fields_ids
104+
fdisk_label_get_fields_ids_all
104105
fdisk_label_get_name
105106
fdisk_label_get_nparttypes
106107
fdisk_label_get_parttype

libfdisk/src/label.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,47 @@ int fdisk_label_get_fields_ids(
156156
return 0;
157157
}
158158

159+
/**
160+
* fdisk_label_get_fields_ids_all
161+
* @lb: label (or NULL for the current label)
162+
* @cxt: context
163+
* @ids: returns allocated array with FDISK_FIELD_* IDs
164+
* @nids: returns number of items in fields
165+
*
166+
* This function returns all fields for the label.
167+
*
168+
* Returns: 0 on success, otherwise, a corresponding error.
169+
*/
170+
int fdisk_label_get_fields_ids_all(
171+
const struct fdisk_label *lb,
172+
struct fdisk_context *cxt,
173+
int **ids, size_t *nids)
174+
{
175+
size_t i, n;
176+
int *c;
177+
178+
assert(cxt);
179+
180+
if (!lb)
181+
lb = cxt->label;
182+
if (!lb)
183+
return -EINVAL;
184+
if (!lb->fields || !lb->nfields)
185+
return -ENOSYS;
186+
c = calloc(lb->nfields, sizeof(int));
187+
if (!c)
188+
return -ENOMEM;
189+
for (n = 0, i = 0; i < lb->nfields; i++)
190+
c[n++] = lb->fields[i].id;
191+
if (ids)
192+
*ids = c;
193+
else
194+
free(c);
195+
if (nids)
196+
*nids = n;
197+
return 0;
198+
}
199+
159200
/**
160201
* fdisk_label_get_field:
161202
* @lb: label

libfdisk/src/libfdisk.h.in

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,11 @@ extern int fdisk_label_get_fields_ids(
308308
struct fdisk_context *cxt,
309309
int **ids, size_t *nids);
310310

311+
extern int fdisk_label_get_fields_ids_all(
312+
const struct fdisk_label *lb,
313+
struct fdisk_context *cxt,
314+
int **ids, size_t *nids);
315+
311316
extern const struct fdisk_field *fdisk_label_get_field(const struct fdisk_label *lb, int id);
312317
extern const struct fdisk_field *fdisk_label_get_field_by_name(
313318
const struct fdisk_label *lb,

libfdisk/src/libfdisk.sym

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -241,12 +241,13 @@ local:
241241
};
242242

243243
FDISK_2.27 {
244-
fdisk_script_set_fgets;
245-
fdisk_script_set_userdata;
246-
fdisk_script_get_userdata;
247244
fdisk_enable_bootbits_protection;
248-
fdisk_has_protected_bootbits;
249-
fdisk_table_get_partition_by_partno;
250245
fdisk_gpt_get_partition_attrs;
251246
fdisk_gpt_set_partition_attrs;
247+
fdisk_has_protected_bootbits;
248+
fdisk_label_get_fields_ids_all;
249+
fdisk_script_get_userdata;
250+
fdisk_script_set_fgets;
251+
fdisk_script_set_userdata;
252+
fdisk_table_get_partition_by_partno;
252253
} FDISK_2.26;

0 commit comments

Comments
 (0)