/* * Converts a bitset to an array of string values, * using one of the tables defined at the top of * the file. */ int print_flags(uint64_t status, int type, char *buffer, size_t size) { int f, first = 1; const struct flag *flags; if (!(flags = _get_flags(type))) return_0; if (!emit_to_buffer(&buffer, &size, "[")) return 0; for (f = 0; flags[f].mask; f++) { if (status & flags[f].mask) { status &= ~flags[f].mask; if ((type & STATUS_FLAG) != flags[f].kind) continue; /* Internal-only flag? */ if (!flags[f].description) continue; if (!first) { if (!emit_to_buffer(&buffer, &size, ", ")) return 0; } else first = 0; if (!emit_to_buffer(&buffer, &size, "\"%s\"", flags[f].description)) return 0; } } if (!emit_to_buffer(&buffer, &size, "]")) return 0; if (status) log_error("Metadata inconsistency: Not all flags successfully " "exported."); return 1; }
/* * Converts a bitset to an array of string values, * using one of the tables defined at the top of * the file. */ int print_flags(char *buffer, size_t size, enum pv_vg_lv_e type, int mask, uint64_t status) { int f, first = 1; const struct flag *flags; if (!(flags = _get_flags(type))) return_0; if (!emit_to_buffer(&buffer, &size, "[")) return_0; for (f = 0; flags[f].mask; f++) { if (status & flags[f].mask) { status &= ~flags[f].mask; if (mask != flags[f].kind) continue; /* Internal-only flag? */ if (!flags[f].description) continue; if (!first) { if (!emit_to_buffer(&buffer, &size, ", ")) return_0; } else first = 0; if (!emit_to_buffer(&buffer, &size, "\"%s\"", flags[f].description)) return_0; } } if (!emit_to_buffer(&buffer, &size, "]")) return_0; if (status) log_warn(INTERNAL_ERROR "Metadata inconsistency: " "Not all flags successfully exported."); return 1; }
char *alloc_printed_tags(struct dm_list *tags) { struct str_list *sl; int first = 1; size_t size = 0; char *buffer, *buf; dm_list_iterate_items(sl, tags) /* '"' + tag + '"' + ',' + ' ' */ size += strlen(sl->str) + 4; /* '[' + ']' + '\0' */ size += 3; if (!(buffer = buf = dm_malloc(size))) { log_error("Could not allocate memory for tag list buffer."); return NULL; } if (!emit_to_buffer(&buf, &size, "[")) goto_bad; dm_list_iterate_items(sl, tags) { if (!first) { if (!emit_to_buffer(&buf, &size, ", ")) goto_bad; } else first = 0; if (!emit_to_buffer(&buf, &size, "\"%s\"", sl->str)) goto_bad; } if (!emit_to_buffer(&buf, &size, "]")) goto_bad; return buffer; bad: dm_free(buffer); return_NULL; }
int print_tags(struct dm_list *tags, char *buffer, size_t size) { struct str_list *sl; int first = 1; if (!emit_to_buffer(&buffer, &size, "[")) return_0; dm_list_iterate_items(sl, tags) { if (!first) { if (!emit_to_buffer(&buffer, &size, ", ")) return_0; } else first = 0; if (!emit_to_buffer(&buffer, &size, "\"%s\"", sl->str)) return_0; } if (!emit_to_buffer(&buffer, &size, "]")) return_0; return 1; }
int print_segtype_lvflags(char *buffer, size_t size, uint64_t status) { unsigned i; const struct flag *flags = _lv_flags; buffer[0] = 0; for (i = 0; flags[i].mask; i++) if ((flags[i].kind & SEGTYPE_FLAG) && (status & flags[i].mask) && !emit_to_buffer(&buffer, &size, "+%s", flags[i].description)) return 0; return 1; }