off_t buffer_write(struct buffer_data *data, const void *buf, off_t length) { off_t ret = length; switch (data->type) { case BUFFER_WRITE_BUF: memcpy(data->arg.ptr, buf, length); data->arg.ptr += length; break; case BUFFER_WRITE_VBUF: varbufaddbuf((struct varbuf *)data->arg.ptr, buf, length); break; case BUFFER_WRITE_FD: ret = write(data->arg.i, buf, length); break; case BUFFER_WRITE_NULL: break; case BUFFER_WRITE_MD5: MD5Update(&(((struct buffer_write_md5ctx *)data->arg.ptr)->ctx), buf, length); break; default: internerr("unknown data type '%i' in buffer_write", data->type); } return ret; }
static bool linktosameexistingdir(const struct tar_entry *ti, const char *fname, struct varbuf *symlinkfn) { struct stat oldstab, newstab; int statr; const char *lastslash; statr= stat(fname, &oldstab); if (statr) { if (!(errno == ENOENT || errno == ELOOP || errno == ENOTDIR)) ohshite(_("failed to stat (dereference) existing symlink `%.250s'"), fname); return false; } if (!S_ISDIR(oldstab.st_mode)) return false; /* But is it to the same dir? */ varbufreset(symlinkfn); if (ti->linkname[0] == '/') { varbufaddstr(symlinkfn, instdir); } else { lastslash= strrchr(fname, '/'); assert(lastslash); varbufaddbuf(symlinkfn, fname, (lastslash - fname) + 1); } varbufaddstr(symlinkfn, ti->linkname); varbufaddc(symlinkfn, 0); statr= stat(symlinkfn->buf, &newstab); if (statr) { if (!(errno == ENOENT || errno == ELOOP || errno == ENOTDIR)) ohshite(_("failed to stat (dereference) proposed new symlink target" " `%.250s' for symlink `%.250s'"), symlinkfn->buf, fname); return false; } if (!S_ISDIR(newstab.st_mode)) return false; if (newstab.st_dev != oldstab.st_dev || newstab.st_ino != oldstab.st_ino) return false; return true; }
void show1package(const struct lstitem *head, struct pkginfo *pkg) { struct varbuf vb = VARBUF_INIT, fb = VARBUF_INIT, wb = VARBUF_INIT; /* Make sure we have package info available, even if it's all empty. */ if (!pkg->installed.valid) blankpackageperfile(&pkg->installed); while (head) { int ok; char fmt[16]; ok = 0; if (head->width > 0) snprintf(fmt, 16, "%%%s%zds", ((head->pad) ? "-" : ""), head->width); else strcpy(fmt, "%s"); if (head->type == string) { varbufprintf(&fb, fmt, head->data); ok = 1; } else if (head->type == field) { const struct fieldinfo *fip; for (fip = fieldinfos; fip->name; fip++) if (strcasecmp(head->data, fip->name) == 0) { fip->wcall(&wb, pkg, &pkg->installed, 0, fip); varbufaddc(&wb, '\0'); varbufprintf(&fb, fmt, wb.buf); varbufreset(&wb); ok = 1; break; } if (!fip->name && pkg->installed.valid) { const struct arbitraryfield *afp; for (afp = pkg->installed.arbs; afp; afp = afp->next) if (strcasecmp(head->data, afp->name) == 0) { varbufprintf(&fb, fmt, afp->value); ok = 1; break; } } } if (ok) { size_t len = strlen(fb.buf); if ((head->width > 0) && (len > head->width)) len = head->width; varbufaddbuf(&vb, fb.buf, len); } varbufreset(&fb); head = head->next; } if (vb.buf) { varbufaddc(&vb, '\0'); fputs(vb.buf, stdout); } varbuffree(&wb); varbuffree(&fb); varbuffree(&vb); }
void pkg_format_show(const struct pkg_format_node *head, struct pkginfo *pkg, struct pkginfoperfile *pif) { struct varbuf vb = VARBUF_INIT, fb = VARBUF_INIT, wb = VARBUF_INIT; while (head) { bool ok; char fmt[16]; ok = false; if (head->width > 0) snprintf(fmt, 16, "%%%s%zds", ((head->pad) ? "-" : ""), head->width); else strcpy(fmt, "%s"); if (head->type == string) { varbufprintf(&fb, fmt, head->data); ok = true; } else if (head->type == field) { const struct fieldinfo *fip; for (fip = fieldinfos; fip->name; fip++) if (strcasecmp(head->data, fip->name) == 0) { fip->wcall(&wb, pkg, pif, 0, fip); varbufaddc(&wb, '\0'); varbufprintf(&fb, fmt, wb.buf); varbufreset(&wb); ok = true; break; } if (!fip->name) { const struct arbitraryfield *afp; for (afp = pif->arbs; afp; afp = afp->next) if (strcasecmp(head->data, afp->name) == 0) { varbufprintf(&fb, fmt, afp->value); ok = true; break; } } } if (ok) { size_t len = strlen(fb.buf); if ((head->width > 0) && (len > head->width)) len = head->width; varbufaddbuf(&vb, fb.buf, len); } varbufreset(&fb); head = head->next; } if (vb.buf) { varbufaddc(&vb, '\0'); fputs(vb.buf, stdout); } varbuf_destroy(&wb); varbuf_destroy(&fb); varbuf_destroy(&vb); }