Implement in many places support for managing file user,group and permissions
This commit is contained in:
parent
790de907fe
commit
95d368a12a
@ -101,12 +101,18 @@ int SQLite_print_contents_subtree(sqlite3 *db,
|
||||
"name STRING, firstchild INTEGER, next INTEGER, parent INTEGER, numproviders INTEGER"
|
||||
/* struct headerList **provider; */
|
||||
|
||||
#define SQLITE_TABLE_packages_files_rel "id INTEGER PRIMARY KEY, id_package INTEGER, id_file INTEGER, name STRING, version STRING, release STRING"
|
||||
#define SQLITE_TABLE_packages_files_rel "id INTEGER PRIMARY KEY, id_package INTEGER, id_file INTEGER, "\
|
||||
"id_user INTEGER, id_group INTEGER, flags INTEGER, "\
|
||||
"name STRING, version STRING, release STRING"
|
||||
#define SQLITE_TABLE_fileusers "id INTEGER PRIMARY KEY, name STRING"
|
||||
#define SQLITE_TABLE_filegroups "id INTEGER PRIMARY KEY, name STRING"
|
||||
|
||||
int generateSQLite_files(struct configTag* ct, sqlite3 *db, int arch) {
|
||||
|
||||
int i;
|
||||
struct headerList* currpackage;
|
||||
struct fileUserList *fileUser = ct->fileuserlist[arch];
|
||||
struct fileGroupList *fileGroup = ct->filegrouplist[arch];
|
||||
|
||||
snprintf(sqlite3_query, PATH_MAX, "packages_files_rel");
|
||||
SQLite_init_table(db, sqlite3_query, SQLITE_TABLE_packages_files_rel);
|
||||
@ -114,22 +120,60 @@ int generateSQLite_files(struct configTag* ct, sqlite3 *db, int arch) {
|
||||
snprintf(sqlite3_query, PATH_MAX, "files");
|
||||
SQLite_init_table(db, sqlite3_query, SQLITE_TABLE_files);
|
||||
|
||||
snprintf(sqlite3_query, PATH_MAX, "fileusers");
|
||||
SQLite_init_table(db, sqlite3_query, SQLITE_TABLE_fileusers);
|
||||
|
||||
snprintf(sqlite3_query, PATH_MAX, "filegroups");
|
||||
SQLite_init_table(db, sqlite3_query, SQLITE_TABLE_filegroups);
|
||||
|
||||
while (fileUser) {
|
||||
snprintf(sqlite3_query, PATH_MAX, "INSERT INTO fileusers VALUES(%d,?);",
|
||||
fileUser->id);
|
||||
if (sqlite3_prepare_v2(db, sqlite3_query, -1, &stmt, NULL)) {
|
||||
fprintf(stderr, "ERROR: sqlite3_prepare_v2: %s (%s)\n", sqlite3_errmsg(db), sqlite3_query);
|
||||
return 1;
|
||||
}
|
||||
sqlite3_bind_text(stmt, 1, fileUser->name, -1, SQLITE_STATIC);
|
||||
if (sqlite3_step(stmt) != SQLITE_DONE) {
|
||||
fprintf(stderr, "ERROR: sqlite3_step: %s (%s)\n", sqlite3_query, sqlite3_errmsg(db));
|
||||
return 3;
|
||||
}
|
||||
sqlite3_finalize(stmt);
|
||||
fileUser = fileUser->next;
|
||||
}
|
||||
|
||||
while (fileGroup) {
|
||||
snprintf(sqlite3_query, PATH_MAX, "INSERT INTO filegroups VALUES(%d,?);",
|
||||
fileGroup->id);
|
||||
if (sqlite3_prepare_v2(db, sqlite3_query, -1, &stmt, NULL)) {
|
||||
fprintf(stderr, "ERROR: sqlite3_prepare_v2: %s (%s)\n", sqlite3_errmsg(db), sqlite3_query);
|
||||
return 1;
|
||||
}
|
||||
sqlite3_bind_text(stmt, 1, fileGroup->name, -1, SQLITE_STATIC);
|
||||
if (sqlite3_step(stmt) != SQLITE_DONE) {
|
||||
fprintf(stderr, "ERROR: sqlite3_step: %s (%s)\n", sqlite3_query, sqlite3_errmsg(db));
|
||||
return 3;
|
||||
}
|
||||
sqlite3_finalize(stmt);
|
||||
fileGroup = fileGroup->next;
|
||||
}
|
||||
|
||||
SQLite_begin_transaction(db);
|
||||
if (SQLite_print_contents_subtree(db, ct->filetree[arch], ct, arch)) return 1;
|
||||
|
||||
/* if (sqlite3_finalize(stmt)) {
|
||||
fprintf(stderr, "ERROR: SQLite: (%s) %s", sqlite3_query, sqlite3_errmsg(db));
|
||||
}*/
|
||||
|
||||
currpackage = ct->headerlist[arch];
|
||||
while (currpackage) {
|
||||
/* packages <-> files relations */
|
||||
for (i = 0; i < currpackage->filenamecount; i++) {
|
||||
snprintf(sqlite3_query, PATH_MAX, "INSERT INTO packages_files_rel VALUES(NULL,%d,%d,?,?,?);",
|
||||
snprintf(sqlite3_query, PATH_MAX, "INSERT INTO packages_files_rel VALUES(NULL,%d,%d,%d,%d,%d,?,?,?);",
|
||||
currpackage->id,
|
||||
currpackage->file[i]->id);
|
||||
currpackage->file[i]->id,
|
||||
currpackage->fileuser[i]->id,
|
||||
currpackage->filegroup[i]->id,
|
||||
currpackage->fileflags[i]);
|
||||
if (sqlite3_prepare_v2(db, sqlite3_query, -1, &stmt, NULL)) {
|
||||
fprintf(stderr, "ERROR: sqlite3_prepare_v2: %s (%s)\n", sqlite3_errmsg(db), sqlite3_query);
|
||||
return 1;
|
||||
}
|
||||
sqlite3_bind_text(stmt, 1, currpackage->name, -1, SQLITE_STATIC);
|
||||
sqlite3_bind_text(stmt, 2, currpackage->version, -1, SQLITE_STATIC);
|
||||
@ -174,6 +218,7 @@ int generateSQLite_provided(struct configTag* ct, sqlite3 *db, int arch) {
|
||||
sqlite3_bind_text(stmt, 1, provided->name, -1, SQLITE_STATIC);
|
||||
if (sqlite3_step(stmt) != SQLITE_DONE) {
|
||||
fprintf(stderr, "ERROR: SQLite: (%s) %s\n", sqlite3_query, sqlite3_errmsg(db));
|
||||
return 1;
|
||||
}
|
||||
sqlite3_finalize(stmt);
|
||||
provided = provided->next;
|
||||
@ -279,6 +324,7 @@ generateSQLite_packages(struct configTag *ct, sqlite3 *db, int arch) {
|
||||
currpackage->sourceheader->id);
|
||||
if (sqlite3_prepare_v2(db, sqlite3_query, -1, &stmt, NULL)) {
|
||||
fprintf(stderr, "ERROR: SQLite: (%s) %s\n", sqlite3_query, sqlite3_errmsg(db));
|
||||
return 1;
|
||||
}
|
||||
|
||||
sqlite3_bind_text(stmt, 1, currpackage->name, -1, SQLITE_STATIC);
|
||||
@ -543,8 +589,8 @@ generateSQLite(struct configTag *ct)
|
||||
return 1;
|
||||
}
|
||||
|
||||
generateSQLite_packages(ct, db, i);
|
||||
generateSQLite_provided(ct, db, i);
|
||||
if (generateSQLite_packages(ct, db, i)) return 1;
|
||||
if (generateSQLite_provided(ct, db, i)) return 1;
|
||||
sqlite3_close(db);
|
||||
}
|
||||
|
||||
|
@ -1203,10 +1203,10 @@ main(int argc, char *argv[])
|
||||
} // if (genheader_mode)
|
||||
|
||||
if (mode & MODE_SQLITE3) {
|
||||
if (!quietmode) printf("Generating sqlite3 databases...\n");
|
||||
if (!quietmode) printf("Generating SQLite databases...\n");
|
||||
logmsg(LOG_DEBUG,"generateSQLite3 - start");
|
||||
if (generateSQLite(configtag)) {
|
||||
logmsg(LOG_ERROR, "could not generate sqlite3 databases; aborting.");
|
||||
logmsg(LOG_ERROR, "could not generate SQLite databases; aborting.");
|
||||
exit(1);
|
||||
}
|
||||
logmsg(LOG_DEBUG,"generateSQLite3 - done");
|
||||
|
@ -190,6 +190,26 @@ void printTagsLine(const char* arch, const char* tag, const char* group, const c
|
||||
tag, group, license);
|
||||
}
|
||||
|
||||
char* expandFileFlags(long flags, char *buffer) {
|
||||
int special = flags >> 9 & 7;
|
||||
int type = flags >> 12;
|
||||
|
||||
sprintf(buffer,"----------");
|
||||
if (special & 1) buffer[9]='t'; else if (flags & 1<<6) buffer[9]='x';
|
||||
if (flags & 1<<1) buffer[8]='w';
|
||||
if (flags & 1<<2) buffer[7]='r';
|
||||
if (special & 2) buffer[6]='s'; else if (flags & 1<<6) buffer[6]='x';
|
||||
if (flags & 1<<4) buffer[5]='w';
|
||||
if (flags & 1<<5) buffer[4]='r';
|
||||
if (special & 4) buffer[3]='s'; else if (flags & 1<<6) buffer[3]='x';
|
||||
if (flags & 1<<7) buffer[2]='w';
|
||||
if (flags & 1<<8) buffer[1]='r';
|
||||
if (type & 4) buffer[0]='d';
|
||||
else if (type & 2) buffer[0]='l';
|
||||
else if (type != 8) buffer[0] = (flags >> 12) + '0';
|
||||
return buffer;
|
||||
}
|
||||
|
||||
char* resolveFilePath(sqlite3 *db, long id, char *buffer) {
|
||||
|
||||
long currid = id;
|
||||
@ -732,15 +752,23 @@ void printPackageData() {
|
||||
/* files list */
|
||||
snprintf(dbname, PATH_MAX, "%s%s-%s-files.db", ct->repository_dir, ct->tag, query_arch);
|
||||
if (!sqlite3_open_v2(dbname, &dbf, SQLITE_OPEN_READONLY, NULL)) {
|
||||
printf("<br><br>%s:<br>", _("Files list"));
|
||||
snprintf(sql, PATH_MAX, "SELECT * FROM packages_files_rel WHERE name='%s'", query_package);
|
||||
printf("<br><br>%s:<br><table style=\"font-family:courier\">", _("Files list"));
|
||||
snprintf(sql, PATH_MAX, "SELECT * FROM packages_files_rel,fileusers,filegroups WHERE"
|
||||
" packages_files_rel.name='%s' AND"
|
||||
" packages_files_rel.id_user=fileusers.id AND "
|
||||
" packages_files_rel.id_group=filegroups.id", query_package);
|
||||
if (sqlite3_prepare_v2(dbf, sql, strlen(sql), &stmt1, NULL) == SQLITE_OK) {
|
||||
while (sqlite3_step(stmt1) == SQLITE_ROW) {
|
||||
printf(" %s<br>", resolveFilePath(dbf, sqlite3_column_int(stmt1,sqlite3_find_column_id(stmt1, NULL, "id_file")), buffer));
|
||||
printf("<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>",
|
||||
sqlite3_column_text(stmt1,sqlite3_find_column_id(stmt1, "fileusers", "name")),
|
||||
sqlite3_column_text(stmt1,sqlite3_find_column_id(stmt1, "filegroups", "name")),
|
||||
expandFileFlags(sqlite3_column_int(stmt1,sqlite3_find_column_id(stmt1, NULL, "flags")), sql),
|
||||
resolveFilePath(dbf, sqlite3_column_int(stmt1,sqlite3_find_column_id(stmt1, NULL, "id_file")), buffer));
|
||||
}
|
||||
sqlite3_finalize(stmt1);
|
||||
}
|
||||
sqlite3_close(dbf);
|
||||
printf("</table>");
|
||||
}
|
||||
sqlite3_close(dbs);
|
||||
}
|
||||
|
@ -153,7 +153,7 @@ struct configTag* read_configuration(const char *confFile)
|
||||
} else {
|
||||
configsection = CONF_REP_SECTION;
|
||||
|
||||
newconfigtag = malloc(sizeof(struct configTag));
|
||||
newconfigtag = calloc(1, sizeof(struct configTag));
|
||||
if (!newconfigtag) {
|
||||
fprintf(stderr, "The system is out of memory\n");
|
||||
return NULL;
|
||||
@ -161,23 +161,11 @@ struct configTag* read_configuration(const char *confFile)
|
||||
|
||||
newconfigtag->tag =
|
||||
(char *) strndup(&vartok[1], strlen(vartok) - 2);
|
||||
newconfigtag->repository_dir = NULL;
|
||||
newconfigtag->repository_source_dir = NULL;
|
||||
curraltrep = 0;
|
||||
for (i = 0; i<ALT_REPS_MAX; i++) newconfigtag->repository[i] = NULL;
|
||||
newconfigtag->html_dir = NULL;
|
||||
newconfigtag->download_prefix = NULL;
|
||||
newconfigtag->download_dir = NULL;
|
||||
newconfigtag->showfile_prefix = NULL;
|
||||
for (i = 0; i<ARCHS_MAX; i++) {
|
||||
newconfigtag->arch[i] = configdefaults.arch[i];
|
||||
newconfigtag->headerlist[i] = NULL;
|
||||
newconfigtag->filetree[i]=NULL;
|
||||
for (j = 0; j<PROVIDEDLIST_IDX_SIZE; j++)
|
||||
newconfigtag->providedlist_idx[i][j]=NULL;
|
||||
}
|
||||
newconfigtag->configdefaults = &configdefaults;
|
||||
newconfigtag->headersourcelist = NULL;
|
||||
|
||||
if (configdefaults.html_basedir) {
|
||||
strncpy(buf, configdefaults.html_basedir, PATH_MAX);
|
||||
|
@ -502,6 +502,7 @@ findOrCreateFileTreeBrother(struct fileTree* *first,char* findname, int arch)
|
||||
return currdir;
|
||||
}
|
||||
|
||||
|
||||
struct fileTree*
|
||||
findOrCreateFileTreeEntry(struct fileTree* *first,char* findname, int arch)
|
||||
{
|
||||
@ -539,6 +540,48 @@ findOrCreateFileTreeEntry(struct fileTree* *first,char* findname, int arch)
|
||||
return currdir;
|
||||
}
|
||||
|
||||
struct fileUserList*
|
||||
findOrCreateFileUserListEntry(struct fileUserList* *first,char* name, int arch)
|
||||
{
|
||||
static long id[ARCHS_MAX] = { 0, 0, 0, 0, 0 };
|
||||
struct fileUserList *curr = *first, *prev = NULL, *newf = NULL;
|
||||
int i;
|
||||
|
||||
while (curr && (i=strcmp(curr->name,name)) < 0) {
|
||||
prev = curr;
|
||||
curr = curr->next;
|
||||
}
|
||||
if (curr && (i == 0)) return curr;
|
||||
newf = malloc(sizeof(struct fileUserList));
|
||||
newf->name = strdup(name);
|
||||
newf->id = ++id[arch];
|
||||
if (prev) prev->next = newf; else *first = newf;
|
||||
if (curr) newf->next = curr; else newf->next = NULL;
|
||||
if (!*first) *first = newf;
|
||||
return newf;
|
||||
}
|
||||
|
||||
struct fileGroupList*
|
||||
findOrCreateFileGroupListEntry(struct fileGroupList* *first,char* name, int arch)
|
||||
{
|
||||
static long id[ARCHS_MAX] = { 0, 0, 0, 0, 0 };
|
||||
struct fileGroupList *curr = *first, *prev = NULL, *newf = NULL;
|
||||
int i;
|
||||
|
||||
while (curr && ((i=strcmp(curr->name,name)) < 0)) {
|
||||
prev = curr;
|
||||
curr = curr->next;
|
||||
}
|
||||
if (curr && (i == 0)) return curr;
|
||||
newf = malloc(sizeof(struct fileGroupList));
|
||||
newf->name = strdup(name);
|
||||
newf->id = ++id[arch];
|
||||
if (prev) prev->next = newf; else *first = newf;
|
||||
if (curr) newf->next = curr; else newf->next = NULL;
|
||||
if (!*first) *first = newf;
|
||||
return newf;
|
||||
}
|
||||
|
||||
static long sourceid = 0;
|
||||
|
||||
int
|
||||
@ -553,7 +596,8 @@ addToSourceHeaderList(struct headerSourceList **headersourcelist, struct configT
|
||||
Header h;
|
||||
char filepath[bufsize + 1];
|
||||
int n, j, arch, *dirindexes, filenamescount, dirnamescount;
|
||||
char **basenames, **dirnames;
|
||||
int_16 *fileflags;
|
||||
char **basenames, **dirnames, **usernames, **groupnames;
|
||||
const char* errstr;
|
||||
int requirecount;
|
||||
char **requireversion, **requirename;
|
||||
@ -602,8 +646,9 @@ addToSourceHeaderList(struct headerSourceList **headersourcelist, struct configT
|
||||
"%s: unable to read header (%s); skipping.",namelist[cnt]->d_name, errstr);
|
||||
} else {
|
||||
|
||||
getPackageFilenames(h, &dirindexes, &dirnames, &dirnamescount,
|
||||
&basenames, &filenamescount);
|
||||
getPackageFiles(h, &dirindexes, &dirnames, &dirnamescount,
|
||||
&basenames, &filenamescount,
|
||||
&usernames, &groupnames, &fileflags);
|
||||
|
||||
newheadersourcelist =
|
||||
malloc(sizeof(struct headerSourceList));
|
||||
@ -797,11 +842,14 @@ addToHeaderList(struct configTag *ct,
|
||||
char *filename=NULL;
|
||||
long i ,j , k, n, altn[ALT_REPS_MAX];
|
||||
int altrepository=0, obsoletecount, providecount, requirecount,
|
||||
filenamecount, dirnamecount, *dirindex;
|
||||
filenamecount, dirnamecount,
|
||||
*dirindex;
|
||||
int_16 *fileflags;
|
||||
char **obsoletename, **obsoleteversion,
|
||||
**providename, **provideversion,
|
||||
**requirename, **requireversion,
|
||||
**basename, **dirname, **newversion;
|
||||
**basename, **dirname, **newversion,
|
||||
**fileusername, **filegroupname;
|
||||
const char* errstr;
|
||||
uint_32 *requireflags, *obsoleteflags, *provideflags;
|
||||
#if RPM_VERSION >= 0x040100
|
||||
@ -915,8 +963,9 @@ addToHeaderList(struct configTag *ct,
|
||||
&provideversion, &providecount);
|
||||
getPackageRequires(h, &requirename, &requireflags,
|
||||
&requireversion, &requirecount);
|
||||
getPackageFilenames(h, &dirindex, &dirname, &dirnamecount,
|
||||
&basename, &filenamecount);
|
||||
getPackageFiles(h, &dirindex, &dirname, &dirnamecount,
|
||||
&basename, &filenamecount,
|
||||
&fileusername, &filegroupname, &fileflags);
|
||||
|
||||
newheaderlist = malloc(sizeof(struct headerList));
|
||||
if (newheaderlist == NULL) {
|
||||
@ -1052,9 +1101,20 @@ addToHeaderList(struct configTag *ct,
|
||||
|
||||
newheaderlist->file =
|
||||
malloc(sizeof(struct fileTree*) * filenamecount);
|
||||
newheaderlist->fileflags =
|
||||
malloc(sizeof(int_16 *) * filenamecount);
|
||||
newheaderlist->fileuser =
|
||||
malloc(sizeof(struct fileUserList *) * filenamecount);
|
||||
newheaderlist->filegroup =
|
||||
malloc(sizeof(char *) * filenamecount);
|
||||
for (j=0; j<filenamecount; j++) {
|
||||
snprintf(filename,bufsize,"%s%s",dirname[dirindex[j]],basename[j]);
|
||||
newheaderlist->file[j] = findOrCreateFileTreeEntry(&ct->filetree[arch],filename,arch);
|
||||
newheaderlist->file[j] = findOrCreateFileTreeEntry(&ct->filetree[arch], filename, arch);
|
||||
newheaderlist->fileflags[j] = fileflags[j];
|
||||
newheaderlist->fileuser[j] = findOrCreateFileUserListEntry(&ct->fileuserlist[arch], fileusername[j], arch);
|
||||
free(fileusername[j]);
|
||||
newheaderlist->filegroup[j] = findOrCreateFileGroupListEntry(&ct->filegrouplist[arch], filegroupname[j], arch);
|
||||
free(filegroupname[j]);
|
||||
if (newheaderlist->file[j]->numproviders == 0) {
|
||||
newheaderlist->file[j]->numproviders++;
|
||||
newheaderlist->file[j]->provider=malloc(sizeof(struct headerList*));
|
||||
|
@ -37,6 +37,8 @@ struct configTag {
|
||||
struct headerSourceList *headersourcelist;
|
||||
struct providedList *providedlist_idx[ARCHS_MAX][PROVIDEDLIST_IDX_SIZE];
|
||||
struct fileTree *filetree[ARCHS_MAX];
|
||||
struct fileUserList *fileuserlist[ARCHS_MAX];
|
||||
struct fileGroupList *filegrouplist[ARCHS_MAX];
|
||||
struct headerStats stats;
|
||||
struct configTag *next;
|
||||
void *db[ARCHS_MAX + 1];
|
||||
|
@ -44,6 +44,18 @@ struct fileTree {
|
||||
long id;
|
||||
};
|
||||
|
||||
struct fileUserList {
|
||||
char *name;
|
||||
struct fileUserList* next;
|
||||
long id;
|
||||
};
|
||||
|
||||
struct fileGroupList {
|
||||
char *name;
|
||||
struct fileGroupList* next;
|
||||
long id;
|
||||
};
|
||||
|
||||
struct warningList {
|
||||
char* text;
|
||||
struct warningList *next;
|
||||
@ -81,6 +93,9 @@ struct headerList {
|
||||
struct providedList **provided;
|
||||
int filenamecount;
|
||||
struct fileTree **file;
|
||||
int_16 *fileflags;
|
||||
struct fileUserList **fileuser;
|
||||
struct fileGroupList **filegroup;
|
||||
int recursed;
|
||||
struct requireList *requirelist;
|
||||
struct headerList *next, *nextbrother;
|
||||
|
@ -45,10 +45,12 @@ int getPackageObsoletes(
|
||||
Header h, char ***obsoletename, uint_32 **obsoleteflags,
|
||||
char ***obsoleteversion, int *obsoletecount);
|
||||
|
||||
int getPackageFilenames(
|
||||
Header h, int **dirindexes,
|
||||
char ***dirnames, int *dirnamescount,
|
||||
char ***basenames, int *filenamescount);
|
||||
int
|
||||
getPackageFiles(Header h, int **dirindexes,
|
||||
char ***dirnames, int *dirnamescount,
|
||||
char ***basenames, int *filenamescount,
|
||||
char ***usernames, char ***groupnames,
|
||||
int_16 **fileflags);
|
||||
|
||||
int rpmnamecmp(char *filename1, char *filename2, int checkver);
|
||||
|
||||
|
@ -227,20 +227,20 @@ void *headerGetUIntArrayEntry(Header h, const int tag, int *count) {
|
||||
*count = he->c;
|
||||
switch (he->t) {
|
||||
case RPM_UINT8_TYPE:
|
||||
ret = memndup(he->p.ui8p, he->c * sizeof(he->p.ui8p));
|
||||
ret = memndup(he->p.ui8p, *count);
|
||||
break;
|
||||
case RPM_UINT16_TYPE:
|
||||
ret = memndup(he->p.ui16p, he->c * sizeof(he->p.ui16p));
|
||||
ret = memndup(he->p.ui16p, *count * 2);
|
||||
break;
|
||||
case RPM_UINT32_TYPE:
|
||||
ret = memndup(he->p.ui32p, he->c * sizeof(he->p.ui32p));
|
||||
ret = memndup(he->p.ui32p, *count * 4);
|
||||
//int i;
|
||||
//for (i=0; i<he->c; i++) {
|
||||
// printf("%d ",((int_32 *)ret)[i]);
|
||||
//}
|
||||
break;
|
||||
case RPM_UINT64_TYPE:
|
||||
ret = memndup(he->p.ui64p, he->c * sizeof(he->p.ui64p));
|
||||
ret = memndup(he->p.ui64p, *count * 8);
|
||||
break;
|
||||
default:
|
||||
ret = NULL;
|
||||
@ -248,10 +248,10 @@ void *headerGetUIntArrayEntry(Header h, const int tag, int *count) {
|
||||
}
|
||||
}
|
||||
|
||||
//unsigned int i;
|
||||
//for (i=0; i < he->c; i++) {
|
||||
//fprintf(stderr," headerGetUIntArrayEntry tag:%d value:%ld\n", he->tag, ((rpmuint32_t*)ret)[i]);
|
||||
//}
|
||||
/*unsigned int i;
|
||||
for (i=0; i < he->c; i++) {
|
||||
fprintf(stderr," headerGetUIntArrayEntry tag:%d value:%ld\n", he->tag, ((rpmuint32_t*)ret)[i]);
|
||||
}*/
|
||||
he->p.ptr = _free(he->p.ptr);
|
||||
return ret;
|
||||
}
|
||||
@ -290,9 +290,11 @@ getPackageObsoletes(Header h, char ***obsoletename, uint_32 **obsoleteflags,
|
||||
}
|
||||
|
||||
int
|
||||
getPackageFilenames(Header h, int **dirindexes,
|
||||
getPackageFiles(Header h, int **dirindexes,
|
||||
char ***dirnames, int *dirnamescount,
|
||||
char ***basenames, int *filenamescount)
|
||||
char ***basenames, int *filenamescount,
|
||||
char ***usernames, char ***groupnames,
|
||||
int_16 **fileflags)
|
||||
{
|
||||
int count;
|
||||
|
||||
@ -300,6 +302,9 @@ getPackageFilenames(Header h, int **dirindexes,
|
||||
*dirindexes = headerGetUIntArrayEntry(h, RPMTAG_DIRINDEXES, &count);
|
||||
*dirnames = headerGetStringArrayEntry(h, RPMTAG_DIRNAMES, dirnamescount);
|
||||
*basenames = headerGetStringArrayEntry(h, RPMTAG_BASENAMES, filenamescount);
|
||||
*usernames = headerGetStringArrayEntry(h, RPMTAG_FILEUSERNAME, &count);
|
||||
*groupnames = headerGetStringArrayEntry(h, RPMTAG_FILEGROUPNAME, &count);
|
||||
*fileflags = headerGetUIntArrayEntry(h, RPMTAG_FILEMODES, &count);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user