mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +03:00
Reporting uses line-at-a-time output.
This commit is contained in:
parent
fc52c6d5dd
commit
0e3d94526a
@ -1,5 +1,7 @@
|
|||||||
Version 2.00.16 -
|
Version 2.00.16 -
|
||||||
=============================
|
=============================
|
||||||
|
Reporting uses line-at-a-time output.
|
||||||
|
lvm2 format sets unlimited_vols format flag.
|
||||||
Internal-only metadata flag support.
|
Internal-only metadata flag support.
|
||||||
Basic checking for presence of device-mapper targets.
|
Basic checking for presence of device-mapper targets.
|
||||||
Separate out polldaemon.
|
Separate out polldaemon.
|
||||||
|
@ -261,6 +261,8 @@ static int _lvstatus_disp(struct report_handle *rh, struct field *field,
|
|||||||
|
|
||||||
if (lv->status & PVMOVE)
|
if (lv->status & PVMOVE)
|
||||||
repstr[0] = 'p';
|
repstr[0] = 'p';
|
||||||
|
else if (lv->status & MIRRORED)
|
||||||
|
repstr[0] = 'm';
|
||||||
else if (lv_is_origin(lv))
|
else if (lv_is_origin(lv))
|
||||||
repstr[0] = 'o';
|
repstr[0] = 'o';
|
||||||
else if (find_cow(lv))
|
else if (find_cow(lv))
|
||||||
@ -730,7 +732,7 @@ static int _copypercent_disp(struct report_handle *rh, struct field *field,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(lv->status & PVMOVE) ||
|
if ((!(lv->status & PVMOVE) && !(lv->status & MIRRORED)) ||
|
||||||
!lv_mirror_percent(lv, 0, &percent, NULL)) {
|
!lv_mirror_percent(lv, 0, &percent, NULL)) {
|
||||||
field->report_string = "";
|
field->report_string = "";
|
||||||
*sortval = UINT64_C(0);
|
*sortval = UINT64_C(0);
|
||||||
@ -1123,32 +1125,58 @@ static int _report_headings(void *handle)
|
|||||||
struct report_handle *rh = handle;
|
struct report_handle *rh = handle;
|
||||||
struct list *fh;
|
struct list *fh;
|
||||||
struct field_properties *fp;
|
struct field_properties *fp;
|
||||||
|
const char *heading;
|
||||||
|
char buf[1024];
|
||||||
|
|
||||||
if (rh->flags & RH_HEADINGS_PRINTED)
|
if (rh->flags & RH_HEADINGS_PRINTED)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
rh->flags |= RH_HEADINGS_PRINTED;
|
||||||
|
|
||||||
if (!(rh->flags & RH_HEADINGS))
|
if (!(rh->flags & RH_HEADINGS))
|
||||||
goto out;
|
return 1;
|
||||||
|
|
||||||
|
if (!pool_begin_object(rh->mem, 128)) {
|
||||||
|
log_error("pool_begin_object failed for headings");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* First heading line */
|
/* First heading line */
|
||||||
list_iterate(fh, &rh->field_props) {
|
list_iterate(fh, &rh->field_props) {
|
||||||
fp = list_item(fh, struct field_properties);
|
fp = list_item(fh, struct field_properties);
|
||||||
if (fp->flags & FLD_HIDDEN)
|
if (fp->flags & FLD_HIDDEN)
|
||||||
continue;
|
continue;
|
||||||
if (rh->flags & RH_ALIGNED)
|
|
||||||
printf("%-*.*s", fp->width, fp->width,
|
|
||||||
_fields[fp->field_num].heading);
|
|
||||||
else
|
|
||||||
printf("%s", _fields[fp->field_num].heading);
|
|
||||||
if (!list_end(&rh->field_props, fh))
|
|
||||||
printf("%s", rh->separator);
|
|
||||||
}
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
out:
|
heading = _fields[fp->field_num].heading;
|
||||||
rh->flags |= RH_HEADINGS_PRINTED;
|
if (rh->flags & RH_ALIGNED) {
|
||||||
|
if (lvm_snprintf(buf, sizeof(buf), "%-*.*s",
|
||||||
|
fp->width, fp->width, heading) < 0) {
|
||||||
|
log_error("snprintf heading failed");
|
||||||
|
pool_end_object(rh->mem);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (!pool_grow_object(rh->mem, buf, fp->width))
|
||||||
|
goto bad;
|
||||||
|
} else if (!pool_grow_object(rh->mem, heading, strlen(heading)))
|
||||||
|
goto bad;
|
||||||
|
|
||||||
|
if (!list_end(&rh->field_props, fh))
|
||||||
|
if (!pool_grow_object(rh->mem, rh->separator,
|
||||||
|
strlen(rh->separator)))
|
||||||
|
goto bad;
|
||||||
|
}
|
||||||
|
if (!pool_grow_object(rh->mem, "\0", 1)) {
|
||||||
|
log_error("pool_grow_object failed");
|
||||||
|
goto bad;
|
||||||
|
}
|
||||||
|
log_print("%s", (char *) pool_end_object(rh->mem));
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
bad:
|
||||||
|
log_error("Failed to generate report headings for printing");
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1233,6 +1261,9 @@ int report_output(void *handle)
|
|||||||
struct list *fh, *rowh, *ftmp, *rtmp;
|
struct list *fh, *rowh, *ftmp, *rtmp;
|
||||||
struct row *row = NULL;
|
struct row *row = NULL;
|
||||||
struct field *field;
|
struct field *field;
|
||||||
|
const char *repstr;
|
||||||
|
char buf[4096];
|
||||||
|
int width;
|
||||||
|
|
||||||
if (list_empty(&rh->rows))
|
if (list_empty(&rh->rows))
|
||||||
return 1;
|
return 1;
|
||||||
@ -1247,26 +1278,53 @@ int report_output(void *handle)
|
|||||||
|
|
||||||
/* Print and clear buffer */
|
/* Print and clear buffer */
|
||||||
list_iterate_safe(rowh, rtmp, &rh->rows) {
|
list_iterate_safe(rowh, rtmp, &rh->rows) {
|
||||||
|
if (!pool_begin_object(rh->mem, 512)) {
|
||||||
|
log_error("pool_begin_object failed for row");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
row = list_item(rowh, struct row);
|
row = list_item(rowh, struct row);
|
||||||
list_iterate_safe(fh, ftmp, &row->fields) {
|
list_iterate_safe(fh, ftmp, &row->fields) {
|
||||||
field = list_item(fh, struct field);
|
field = list_item(fh, struct field);
|
||||||
if (field->props->flags & FLD_HIDDEN)
|
if (field->props->flags & FLD_HIDDEN)
|
||||||
continue;
|
continue;
|
||||||
if (!(rh->flags & RH_ALIGNED))
|
|
||||||
printf("%s", field->report_string);
|
repstr = field->report_string;
|
||||||
else if (field->props->flags & FLD_ALIGN_LEFT)
|
width = field->props->width;
|
||||||
printf("%-*.*s", field->props->width,
|
if (!(rh->flags & RH_ALIGNED)) {
|
||||||
field->props->width,
|
if (!pool_grow_object(rh->mem, repstr,
|
||||||
field->report_string);
|
strlen(repstr)))
|
||||||
else if (field->props->flags & FLD_ALIGN_RIGHT)
|
goto bad;
|
||||||
printf("%*.*s", field->props->width,
|
} else if (field->props->flags & FLD_ALIGN_LEFT) {
|
||||||
field->props->width,
|
if (lvm_snprintf(buf, sizeof(buf), "%-*.*s",
|
||||||
field->report_string);
|
width, width, repstr) < 0) {
|
||||||
|
log_error("snprintf repstr failed");
|
||||||
|
pool_end_object(rh->mem);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (!pool_grow_object(rh->mem, buf, width))
|
||||||
|
goto bad;
|
||||||
|
} else if (field->props->flags & FLD_ALIGN_RIGHT) {
|
||||||
|
if (lvm_snprintf(buf, sizeof(buf), "%*.*s",
|
||||||
|
width, width, repstr) < 0) {
|
||||||
|
log_error("snprintf repstr failed");
|
||||||
|
pool_end_object(rh->mem);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (!pool_grow_object(rh->mem, buf, width))
|
||||||
|
goto bad;
|
||||||
|
}
|
||||||
|
|
||||||
if (!list_end(&row->fields, fh))
|
if (!list_end(&row->fields, fh))
|
||||||
printf("%s", rh->separator);
|
if (!pool_grow_object(rh->mem, rh->separator,
|
||||||
|
strlen(rh->separator)))
|
||||||
|
goto bad;
|
||||||
list_del(&field->list);
|
list_del(&field->list);
|
||||||
}
|
}
|
||||||
printf("\n");
|
if (!pool_grow_object(rh->mem, "\0", 1)) {
|
||||||
|
log_error("pool_grow_object failed for row");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
log_print("%s", (char *) pool_end_object(rh->mem));
|
||||||
list_del(&row->list);
|
list_del(&row->list);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1274,4 +1332,8 @@ int report_output(void *handle)
|
|||||||
pool_free(rh->mem, row);
|
pool_free(rh->mem, row);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
bad:
|
||||||
|
log_error("Failed to generate row for printing");
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user