int mode;
int rc;
int count;
- int numPackages;
+ int numPackages, packageOffsetsAlloced;
int * packageOffsets;
char ** arg;
int numFailed = 0;
rpmMessage(RPMMESS_DEBUG, "counting packages to uninstall\n");
for (arg = argv, numPackages = 0; *arg; arg++, numPackages++)
;
- rpmMessage(RPMMESS_DEBUG, "found %d packages to uninstall\n", numPackages);
- packageOffsets = alloca(sizeof(int *) * numPackages);
+ packageOffsetsAlloced = numPackages;
+ packageOffsets = malloc(sizeof(int *) * packageOffsetsAlloced);
if (uninstallFlags & RPMUNINSTALL_TEST)
mode = O_RDONLY;
}
j = 0;
- for (arg = argv, numPackages = 0; *arg; arg++, numPackages++) {
+ numPackages = 0;
+ for (arg = argv; *arg; arg++) {
rc = findPackageByLabel(db, *arg, &matches);
if (rc == 1) {
fprintf(stderr, "package %s is not installed\n", *arg);
for (i = 0; i < matches.count; i++)
if (matches.recs[i].recOffset) count++;
- if (count > 1) {
+ if (count > 1 && !(interfaceFlags & UNINSTALL_ALLMATCHES)) {
fprintf(stderr, "\"%s\" specifies multiple packages\n", *arg);
numFailed++;
}
else {
+ numPackages += matches.count;
+ if (numPackages > packageOffsetsAlloced) {
+ packageOffsetsAlloced = numPackages + 5;
+ packageOffsets = realloc(packageOffsets,
+ sizeof(int *) * packageOffsetsAlloced);
+ }
for (i = 0; i < matches.count; i++) {
if (matches.recs[i].recOffset) {
packageOffsets[j++] = matches.recs[i].recOffset;
dbiFreeIndexRecord(matches);
}
}
- numPackages = j;
+
+ rpmMessage(RPMMESS_DEBUG, "found %d packages to uninstall\n", numPackages);
if (!(interfaceFlags & UNINSTALL_NODEPS)) {
rpmdep = rpmdepDependencies(db);
rpmdbClose(db);
+ free(packageOffsets);
+
return numFailed;
}