static int _pvsegs_sub_single(struct cmd_context *cmd, struct volume_group *vg, struct pv_segment *pvseg, void *handle) { int consistent = 0; struct physical_volume *pv = pvseg->pv; int ret = ECMD_PROCESSED; if (!lock_vol(cmd, pv_vg_name(pv), LCK_VG_READ)) { log_error("Can't lock %s: skipping", pv_vg_name(pv)); return ECMD_FAILED; } if (!(vg = vg_read(cmd, pv_vg_name(pv), NULL, &consistent))) { log_error("Can't read %s: skipping", pv_vg_name(pv)); goto out; } if (!vg_check_status(vg, CLUSTERED)) { ret = ECMD_FAILED; goto out; } if (!report_object(handle, vg, NULL, pv, NULL, pvseg)) ret = ECMD_FAILED; out: unlock_vg(cmd, pv_vg_name(pv)); return ret; }
ssize_t parser_fill (Parser *parser) { unsigned char *inbuf, *inptr, *inend; ssize_t nread; size_t inlen; inbuf = parser->inbuf; inptr = parser->inptr; inend = parser->inend; inlen = inend - inptr; g_assert (inptr <= inend); /* attempt to align 'inend' with realbuf + PARSER_SCAN_HEAD */ if (inptr >= inbuf) { inbuf -= inlen < PARSER_SCAN_HEAD ? inlen : PARSER_SCAN_HEAD; memmove (inbuf, inptr, inlen); inptr = inbuf; inbuf += inlen; } else if (inptr > parser->realbuf) { size_t shift; shift = MIN (inptr - parser->realbuf, inend - inbuf); memmove (inptr - shift, inptr, inlen); inptr -= shift; inbuf = inptr + inlen; } else { /* we can't shift... */ inbuf = inend; } parser->inptr = inptr; parser->inend = inbuf; inend = parser->realbuf + PARSER_SCAN_HEAD + PARSER_SCAN_BUF - 1; if ((nread = vg_read (parser->fd, inbuf, inend - inbuf)) == -1) return -1; parser->inend += nread; return parser->inend - parser->inptr; }