Make cpio maps totally opaque.

CVS patchset: 4487
CVS date: 2001/01/22 19:11:19
This commit is contained in:
jbj 2001-01-22 19:11:19 +00:00
parent 4a0c7b16a8
commit 15439b46c0
8 changed files with 177 additions and 118 deletions

View File

@ -1,5 +1,6 @@
4.0.2 -> 4.0.3
- cpio mappings carry dirname/basename, not absolute path.
- fix: check waitpid return code.
4.0 -> 4.0.[12]
- add doxygen and lclint annotations most everywhere.

View File

@ -8,6 +8,10 @@
*/
#include "system.h"
#include <rpmlib.h>
#include "depends.h"
#include "install.h"
#include "cpio.h"
#include "rpmerr.h"
#include "debug.h"
@ -24,7 +28,7 @@
struct hardLink {
struct hardLink * next;
const char ** files; /* nlink of these, used by install */
const struct cpioFileMapping ** fileMaps;
const void ** fileMaps;
dev_t dev;
ino_t inode;
int nlink;
@ -84,9 +88,9 @@ static int mapFlags(const void * this, cpioMapFlags mask) {
return (map->mapFlags & mask);
}
static const char * mapArchivePath(const void * this) {
static /*@only@*/ const char * mapArchivePath(const void * this) {
const struct cpioFileMapping * map = this;
return map->archivePath;
return xstrdup(map->archivePath);
}
static /*@only@*/ const char * mapFsPath(const void * this) {
@ -117,33 +121,73 @@ static const char * mapMd5sum(const void * this) {
}
struct mapi {
const struct cpioFileMapping * mappings;
union {
const struct cpioFileMapping * mappings;
TFI_t fi;
} u;
int numMappings;
int i;
};
static void mapFreeIterator(/*@only@*/ void * mi) {
free(mi);
static int cpioFileMapCmp(const void * a, const void * b) {
const char * afn = ((const struct cpioFileMapping *)a)->archivePath;
const char * bfn = ((const struct cpioFileMapping *)b)->archivePath;
/* Match payloads with ./ prefixes as well. */
if (afn[0] == '.' && afn[1] == '/') afn += 2;
if (bfn[0] == '.' && bfn[1] == '/') bfn += 2;
return strcmp(afn, bfn);
}
static void * mapInitIterator(const struct cpioFileMapping * mappings,
int numMappings)
{
struct mapi * mapi = xmalloc(sizeof(*mapi));
mapi->mappings = mappings;
static const void * mapFind(const void * this, const char * hdrPath) {
const struct mapi * mapi = this;
const struct cpioFileMapping * map;
struct cpioFileMapping needle;
needle.archivePath = hdrPath;
map = bsearch(&needle, mapi->u.mappings, mapi->numMappings,
sizeof(needle), cpioFileMapCmp);
return map;
}
static const void * mapLink(const void * this) {
const struct cpioFileMapping * map = this;
return map;
}
static void mapFree(const void * this) {
return;
}
static void mapFreeIterator(/*@only@*/ void * this) {
if (this)
free(this);
}
static void * mapInitIterator(const void * this, int numMappings) {
struct mapi * mapi;
if (this == NULL)
return NULL;
mapi = xcalloc(sizeof(*mapi), 1);
mapi->u.mappings = this;
mapi->numMappings = numMappings;
mapi->i = 0;
qsort((void *)mapi->u.mappings, numMappings, sizeof(*mapi->u.mappings),
cpioFileMapCmp);
return mapi;
}
static const struct cpioFileMapping * mapNextIterator(void * mi)
{
struct mapi * mapi = mi;
static const void * mapNextIterator(void * this) {
struct mapi * mapi = this;
const struct cpioFileMapping * map;
if (!(mapi->i < mapi->numMappings))
return NULL;
map = mapi->mappings + mapi->i;
map = mapi->u.mappings + mapi->i;
mapi->i++;
return map;
}
@ -346,18 +390,6 @@ static int getNextHeader(FD_t cfd, struct cpioHeader * hdr)
return 0;
}
int cpioFileMapCmp(const void * a, const void * b)
{
const char * afn = ((const struct cpioFileMapping *)a)->archivePath;
const char * bfn = ((const struct cpioFileMapping *)b)->archivePath;
/* Match payloads with ./ prefixes as well. */
if (afn[0] == '.' && afn[1] == '/') afn += 2;
if (bfn[0] == '.' && bfn[1] == '/') bfn += 2;
return strcmp(afn, bfn);
}
/* This could trash files in the path! I'm not sure that's a good thing */
/**
* @param path directory path
@ -785,12 +817,13 @@ static int eatBytes(FD_t cfd, int amount)
}
/** @todo Verify payload MD5 sum. */
int cpioInstallArchive(FD_t cfd, const struct cpioFileMapping * mappings,
int cpioInstallArchive(FD_t cfd, const void * mappings,
int numMappings, cpioCallback cb, void * cbData,
const char ** failedFile)
{
struct cpioHeader ch, *hdr = &ch;
struct cpioFileMapping * map = NULL;
const void * mapi = mapInitIterator(mappings, numMappings);
const void * map = NULL;
struct cpioCallbackInfo cbInfo = { NULL, 0, 0, 0 };
struct hardLink * links = NULL;
struct hardLink * li = NULL;
@ -820,21 +853,17 @@ int cpioInstallArchive(FD_t cfd, const struct cpioFileMapping * mappings,
rpmError(RPMERR_BADPACKAGE, _("getNextHeader: %s\n"),
cpioStrerror(rc));
#endif
return rc;
goto exit;
}
st = &hdr->sb;
if (!strcmp(hdr->path, TRAILER))
break;
if (mappings) {
struct cpioFileMapping needle;
needle.archivePath = hdr->path;
map = bsearch(&needle, mappings, numMappings, sizeof(needle),
cpioFileMapCmp);
}
if (mapi)
map = mapFind(mapi, hdr->path);
if (mappings && !map) {
if (mapi && map == NULL) {
eatBytes(cfd, st->st_size);
} else {
if (map) {
@ -961,7 +990,11 @@ int cpioInstallArchive(FD_t cfd, const struct cpioFileMapping * mappings,
if (md5sum)
free(md5sum);
#endif
rc = 0;
exit:
if (mapi)
mapFreeIterator(mapi);
return rc;
}
@ -975,13 +1008,14 @@ int cpioInstallArchive(FD_t cfd, const struct cpioFileMapping * mappings,
* @return 0 on success
*/
static int writeFile(FD_t cfd, const struct stat * st,
const struct cpioFileMapping * map, /*@out@*/ size_t * sizep,
const void * map, /*@out@*/ size_t * sizep,
int writeData)
/*@modifies cfd, *sizep @*/
{
const char * fsPath = mapFsPath(map);
const char * archivePath = !mapFlags(map, CPIO_MAP_PATH)
? fsPath : mapArchivePath(map);
const char * archivePath = NULL;
const char * hdrPath = !mapFlags(map, CPIO_MAP_PATH)
? fsPath : (archivePath = mapArchivePath(map));
struct cpioCrcPhysicalHeader hdr;
char buf[8192], symbuf[2048];
dev_t num;
@ -1030,12 +1064,12 @@ static int writeFile(FD_t cfd, const struct stat * st,
num = major((unsigned)st->st_rdev); SET_NUM_FIELD(hdr.rdevMajor, num, buf);
num = minor((unsigned)st->st_rdev); SET_NUM_FIELD(hdr.rdevMinor, num, buf);
num = strlen(archivePath) + 1; SET_NUM_FIELD(hdr.namesize, num, buf);
num = strlen(hdrPath) + 1; SET_NUM_FIELD(hdr.namesize, num, buf);
memcpy(hdr.checksum, "00000000", 8);
if ((rc = safewrite(cfd, &hdr, PHYS_HDR_SIZE)) != PHYS_HDR_SIZE)
goto exit;
if ((rc = safewrite(cfd, archivePath, num)) != num)
if ((rc = safewrite(cfd, hdrPath, num)) != num)
goto exit;
size = PHYS_HDR_SIZE + num;
if ((rc = padoutfd(cfd, &size, 4)))
@ -1141,17 +1175,18 @@ static int writeLinkedFile(FD_t cfd, const struct hardLink * hlink,
/*@modifies cfd, *sizep, *failedFile @*/
{
struct cpioCallbackInfo cbInfo = { NULL, 0, 0, 0 };
const void * map = NULL;
size_t total = 0;
const struct cpioFileMapping * map;
size_t size;
int i, rc;
int rc = 0;
int i;
for (i = hlink->nlink - 1; i > hlink->linksLeft; i--) {
map = hlink->fileMaps[i];
if ((rc = writeFile(cfd, &hlink->sb, map, &size, 0)) != 0) {
if (failedFile)
*failedFile = mapFsPath(map);;
return rc;
*failedFile = mapFsPath(map);
goto exit;
}
total += size;
@ -1159,7 +1194,9 @@ static int writeLinkedFile(FD_t cfd, const struct hardLink * hlink,
if (cb) {
cbInfo.file = mapArchivePath(map);
cb(&cbInfo, cbData);
free((void *)cbInfo.file);
}
mapFree(map); map = NULL;
}
i = hlink->linksLeft;
@ -1168,8 +1205,8 @@ static int writeLinkedFile(FD_t cfd, const struct hardLink * hlink,
if (sizep)
*sizep = total;
if (failedFile)
*failedFile = mapFsPath(map);;
return rc;
*failedFile = mapFsPath(map);
goto exit;
}
total += size;
@ -1179,17 +1216,22 @@ static int writeLinkedFile(FD_t cfd, const struct hardLink * hlink,
if (cb) {
cbInfo.file = mapArchivePath(map);
cb(&cbInfo, cbData);
free((void *)cbInfo.file);
}
rc = 0;
return 0;
exit:
if (map)
mapFree(map);
return rc;
}
int cpioBuildArchive(FD_t cfd, const struct cpioFileMapping * mappings,
int cpioBuildArchive(FD_t cfd, const void * mappings,
int numMappings, cpioCallback cb, void * cbData,
unsigned int * archiveSize, const char ** failedFile)
{
size_t size, totalsize = 0;
int rc;
void * mapi = mapInitIterator(mappings, numMappings);
const void * map;
struct cpioCallbackInfo cbInfo = { NULL, 0, 0, 0 };
struct cpioCrcPhysicalHeader hdr;
/*@-fullinitblock@*/
@ -1197,12 +1239,12 @@ int cpioBuildArchive(FD_t cfd, const struct cpioFileMapping * mappings,
/*@=fullinitblock@*/
struct stat * st = (struct stat *) &hlinkList.sb;
struct hardLink * hlink;
void * mapi;
const struct cpioFileMapping * map;
size_t totalsize = 0;
size_t size;
int rc;
hlinkList.next = NULL;
mapi = mapInitIterator(mappings, numMappings);
while ((map = mapNextIterator(mapi)) != NULL) {
const char * fsPath;
@ -1230,7 +1272,7 @@ int cpioBuildArchive(FD_t cfd, const struct cpioFileMapping * mappings,
hlinkList.next = hlink;
}
hlink->fileMaps[--hlink->linksLeft] = map;
hlink->fileMaps[--hlink->linksLeft] = mapLink(map);
if (hlink->linksLeft == 0) {
struct hardLink * prev;
@ -1263,6 +1305,7 @@ int cpioBuildArchive(FD_t cfd, const struct cpioFileMapping * mappings,
if (cb) {
cbInfo.file = mapArchivePath(map);
cb(&cbInfo, cbData);
free((void *)cbInfo.file);
}
totalsize += size;

View File

@ -114,7 +114,7 @@ typedef void (*cpioCallback) (struct cpioCallbackInfo * filespec, void * data);
* @retval failedFile file name (malloc'ed) that caused failure (if any)
* @return 0 on success
*/
int cpioInstallArchive(FD_t cfd, const struct cpioFileMapping * mappings,
int cpioInstallArchive(FD_t cfd, const void * mappings,
int numMappings, cpioCallback cb, void * cbData,
/*@out@*/const char ** failedFile)
/*@modifies fileSystem, cfd, *failedFile @*/;
@ -130,11 +130,12 @@ int cpioInstallArchive(FD_t cfd, const struct cpioFileMapping * mappings,
* @retval failedFile file name (malloc'ed) that caused failure (if any)
* @return 0 on success
*/
int cpioBuildArchive(FD_t cfd, const struct cpioFileMapping * mappings,
int cpioBuildArchive(FD_t cfd, const void * mappings,
int numMappings, cpioCallback cb, void * cbData,
unsigned int * archiveSize, /*@out@*/const char ** failedFile)
/*@modifies fileSystem, cfd, *archiveSize, *failedFile @*/;
#ifdef DYING
/** \ingroup payload
* Compare two cpio file map entries (qsort/bsearch).
* This is designed to be qsort/bsearch compatible.
@ -143,6 +144,7 @@ int cpioBuildArchive(FD_t cfd, const struct cpioFileMapping * mappings,
* @return result of comparison
*/
int cpioFileMapCmp(const void * a, const void * b) /*@*/;
#endif
/** \ingroup payload
* Return formatted error message on payload handling failure.

View File

@ -118,6 +118,8 @@ struct transactionElement {
} u;
} ;
/**
*/
struct transactionFileInfo_s {
/* for all packages */
enum rpmTransactionType type;
@ -136,6 +138,8 @@ struct transactionFileInfo_s {
int dc; /*!< No. of directories. */
int bnlmax; /*!< Length (in bytes) of longest base name. */
int dnlmax; /*!< Length (in bytes) of longest dir name. */
int magic;
#define TFIMAGIC 0x09697923
/* these are for TR_ADDED packages */
const char ** flinks; /*!< file links (from header) */
struct availablePackage * ap;

View File

@ -190,12 +190,13 @@ static int assembleFileList(TFI_t fi, Header h,
fsizes = fi->fsizes;
actions = fi->actions;
} else {
headerGetEntry(h, RPMTAG_DIRNAMES, NULL, (void **) &dnl, NULL);
headerGetEntryMinMemory(h, RPMTAG_DIRNAMES, NULL, (void **) &dnl, NULL);
mem->dnl = dnl;
headerGetEntry(h, RPMTAG_DIRINDEXES, NULL, (void **) &dil, NULL);
headerGetEntryMinMemory(h, RPMTAG_BASENAMES,NULL, (void **) &bnl, NULL);
mem->bnl = bnl;
headerGetEntry(h, RPMTAG_BASENAMES, NULL, (void **) &bnl, NULL);
if (!headerGetEntry(h, RPMTAG_FILEMD5S, NULL, (void **) &fmd5s, NULL))
if (!headerGetEntryMinMemory(h, RPMTAG_FILEMD5S, NULL,
(void **) &fmd5s, NULL))
fmd5s = NULL;
mem->md5sums = fmd5s;
headerGetEntry(h, RPMTAG_FILEFLAGS, NULL, (void **) &fflags, NULL);
@ -591,7 +592,8 @@ static void callback(struct cpioCallbackInfo * cpioInfo, void * data)
* @param archiveSize @todo Document.
* @return 0 on success
*/
static int installArchive(FD_t fd, XFI_t files, int fileCount,
static int installArchive(const rpmTransactionSet ts, TFI_t fi,
FD_t fd, XFI_t files, int fileCount,
rpmCallbackFunction notify, rpmCallbackData notifyData,
const void * pkgKey, Header h,
/*@out@*/ const char ** specFile, int archiveSize)
@ -646,7 +648,9 @@ static int installArchive(FD_t fd, XFI_t files, int fileCount,
mappedFiles++;
}
#ifdef DYING
qsort(map, mappedFiles, sizeof(*map), cpioFileMapCmp);
#endif
}
if (notify)
@ -722,7 +726,7 @@ static int installSources(Header h, const char * rootDir, FD_t fd,
int fileCount = 0;
uint_32 * archiveSizePtr = NULL;
fileMemory fileMem = NULL;
XFI_t files = NULL;
XFI_t files = NULL, file;
int i;
const char * currDir = NULL;
uid_t currUid = getuid();
@ -797,30 +801,29 @@ static int installSources(Header h, const char * rootDir, FD_t fd,
/* we can't remap v1 packages */
assembleFileList(NULL, h, &fileMem, &fileCount, &files, 0);
for (i = 0; i < fileCount; i++) {
files[i].uid = currUid;
files[i].gid = currGid;
for (i = 0, file = files; i < fileCount; i++, file++) {
file->uid = currUid;
file->gid = currGid;
}
if (headerIsEntry(h, RPMTAG_COOKIE))
for (i = 0; i < fileCount; i++)
if (files[i].flags & RPMFILE_SPECFILE) break;
for (i = 0, file = files; i < fileCount; i++, file++)
if (file->flags & RPMFILE_SPECFILE) break;
if (i == fileCount) {
/* find the spec file by name */
for (i = 0; i < fileCount; i++) {
const char * t = files[i].cpioPath;
t += strlen(files[i].cpioPath) - 5;
for (i = 0, file = files; i < fileCount; i++, file++) {
const char * t = file->cpioPath;
t += strlen(file->cpioPath) - 5;
if (!strcmp(t, ".spec")) break;
}
}
if (i < fileCount) {
char *t = alloca(strlen(_specdir) + strlen(files[i].cpioPath) + 5);
char *t = alloca(strlen(_specdir) + strlen(file->cpioPath) + 5);
(void)stpcpy(stpcpy(t, _specdir), "/");
rpmCleanPath(t);
files[i].dn = t;
files[i].bn = files[i].cpioPath;
file->dn = t;
file->bn = file->cpioPath;
specFileIndex = i;
} else {
rpmError(RPMERR_NOSPEC,
@ -839,7 +842,7 @@ static int installSources(Header h, const char * rootDir, FD_t fd,
currDir = currentDirectory();
Chdir(_sourcedir);
if (installArchive(fd, fileCount > 0 ? files : NULL,
if (installArchive(NULL, NULL, fd, fileCount > 0 ? files : NULL,
fileCount, notify, notifyData, NULL, h,
specFileIndex >= 0 ? NULL : &specFile,
archiveSizePtr ? *archiveSizePtr : 0)) {
@ -1163,7 +1166,7 @@ int installBinaryPackage(const rpmTransactionSet ts, Header h, TFI_t fi)
}
/* the file pointer for fd is pointing at the cpio archive */
rc = installArchive(alp->fd, files, fileCount,
rc = installArchive(ts, fi, alp->fd, files, fileCount,
ts->notify, ts->notifyData, alp->key,
h, NULL, archiveSize);
if (rc)

View File

@ -1526,6 +1526,7 @@ int rpmRunTransactions( rpmTransactionSet ts,
int preTransCount;
memset(fi, 0, sizeof(*fi));
fi->magic = TFIMAGIC;
preTrans = NULL;
preTransCount = 0;

View File

@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2001-01-21 18:24-0500\n"
"POT-Creation-Date: 2001-01-22 14:07-0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -2190,55 +2190,55 @@ msgstr ""
msgid "line %d: Bad %s number: %s\n"
msgstr ""
#: lib/cpio.c:508
#: lib/cpio.c:540
#, c-format
msgid "can't rename %s to %s: %s\n"
msgstr ""
#: lib/cpio.c:514
#: lib/cpio.c:546
#, c-format
msgid "can't unlink %s: %s\n"
msgstr ""
#: lib/cpio.c:820
#: lib/cpio.c:853
#, c-format
msgid "getNextHeader: %s\n"
msgstr ""
#: lib/cpio.c:1320
#: lib/cpio.c:1363
#, c-format
msgid "(error 0x%x)"
msgstr ""
#: lib/cpio.c:1323
#: lib/cpio.c:1366
msgid "Bad magic"
msgstr ""
#: lib/cpio.c:1324
#: lib/cpio.c:1367
msgid "Bad/unreadable header"
msgstr ""
#: lib/cpio.c:1342
#: lib/cpio.c:1385
msgid "Header size too big"
msgstr ""
#: lib/cpio.c:1343
#: lib/cpio.c:1386
msgid "Unknown file type"
msgstr ""
#: lib/cpio.c:1344
#: lib/cpio.c:1387
msgid "Missing hard link"
msgstr ""
#: lib/cpio.c:1345
#: lib/cpio.c:1388
msgid "MD5 sum mismatch"
msgstr ""
#: lib/cpio.c:1346
#: lib/cpio.c:1389
msgid "Internal error"
msgstr ""
#: lib/cpio.c:1355
#: lib/cpio.c:1398
msgid " failed - "
msgstr ""
@ -2517,7 +2517,7 @@ msgstr ""
msgid "dataLength() RPM_STRING_TYPE count must be 1.\n"
msgstr ""
#: lib/header.c:207 lib/header.c:1015 lib/install.c:395
#: lib/header.c:207 lib/header.c:1015 lib/install.c:396
#, c-format
msgid "Data type %d not supported\n"
msgstr ""
@ -2602,17 +2602,17 @@ msgstr ""
msgid "(unknown type)"
msgstr ""
#: lib/install.c:220
#: lib/install.c:221
#, c-format
msgid " file: %s%s action: %s\n"
msgstr ""
#: lib/install.c:246
#: lib/install.c:247
#, c-format
msgid "user %s does not exist - using root\n"
msgstr ""
#: lib/install.c:253
#: lib/install.c:254
#, c-format
msgid "group %s does not exist - using root\n"
msgstr ""
@ -2620,90 +2620,90 @@ msgstr ""
#. this would probably be a good place to check if disk space
#. was used up - if so, we should return a different error
#. XXX FIXME: Fclose with libio destroys errno
#: lib/install.c:684
#: lib/install.c:688
#, c-format
msgid "unpacking of archive failed%s%s: %s\n"
msgstr ""
#: lib/install.c:685
#: lib/install.c:689
msgid " on file "
msgstr ""
#: lib/install.c:733
#: lib/install.c:737
msgid "installing a source package\n"
msgstr ""
#: lib/install.c:753
#: lib/install.c:757
#, c-format
msgid "cannot create sourcedir %s\n"
msgstr ""
#: lib/install.c:760 lib/install.c:790
#: lib/install.c:764 lib/install.c:794
#, c-format
msgid "cannot write to %s\n"
msgstr ""
#: lib/install.c:764
#: lib/install.c:768
#, c-format
msgid "sources in: %s\n"
msgstr ""
#: lib/install.c:784
#: lib/install.c:788
#, c-format
msgid "cannot create specdir %s\n"
msgstr ""
#: lib/install.c:794
#: lib/install.c:798
#, c-format
msgid "spec file in: %s\n"
msgstr ""
#: lib/install.c:827 lib/install.c:857
#: lib/install.c:830 lib/install.c:860
msgid "source package contains no .spec file\n"
msgstr ""
#: lib/install.c:877
#: lib/install.c:880
#, c-format
msgid "renaming %s to %s\n"
msgstr ""
#: lib/install.c:879 lib/install.c:1149 lib/uninstall.c:43
#: lib/install.c:882 lib/install.c:1152 lib/uninstall.c:43
#, c-format
msgid "rename of %s to %s failed: %s\n"
msgstr ""
#: lib/install.c:974
#: lib/install.c:977
msgid "source package expected, binary found\n"
msgstr ""
#: lib/install.c:1013
#: lib/install.c:1016
#, c-format
msgid "package: %s-%s-%s files test = %d\n"
msgstr ""
#: lib/install.c:1054
#: lib/install.c:1057
msgid "stopping install as we're running --test\n"
msgstr ""
#: lib/install.c:1059
#: lib/install.c:1062
msgid "running preinstall script (if any)\n"
msgstr ""
#: lib/install.c:1066
#: lib/install.c:1069
msgid "skipping %s-%s-%s install, %%pre scriptlet failed rc %d\n"
msgstr ""
#: lib/install.c:1103
#: lib/install.c:1106
#, c-format
msgid "%s%s created as %s\n"
msgstr ""
#: lib/install.c:1144
#: lib/install.c:1147
#, c-format
msgid "%s saved as %s\n"
msgstr ""
#: lib/install.c:1229
#: lib/install.c:1232
msgid "running postinstall scripts (if any)\n"
msgstr ""
@ -3554,7 +3554,12 @@ msgstr ""
msgid "Please contact rpm-list@redhat.com\n"
msgstr ""
#: lib/scriptlet.c:241
#: lib/scriptlet.c:231
#, c-format
msgid "execution of %s scriptlet from %s-%s-%s failed, waitpid returned %s\n"
msgstr ""
#: lib/scriptlet.c:238
#, c-format
msgid "execution of %s scriptlet from %s-%s-%s failed, exit status %d\n"
msgstr ""

View File

@ -157,6 +157,10 @@ typedef /*@abstract@*/ struct rpmlogRec_s {
const char * message;
} * rpmlogRec;
#ifdef __cplusplus
extern "C" {
#endif
/**
* Return number of rpmError() ressages.
* @return number of messages
@ -175,10 +179,6 @@ int rpmlogGetNrecs(void);
*/
void rpmlogPrint(FILE *f);
#ifdef __cplusplus
extern "C" {
#endif
/**
* Close desriptor used to write to system logger.
* @todo Implement.