build system: "make hosttools" doesn't exist, remove it from "make help"
[oweals/busybox.git] / archival / rpm.c
index b506f1779fa34fb037c593dfc33b2fcee1b41e72..885eddd643876213ca04e73ae8eaad3c2b79d8c4 100644 (file)
@@ -7,6 +7,15 @@
  * Licensed under GPLv2 or later, see file LICENSE in this source tree.
  */
 
+//config:config RPM
+//config:      bool "rpm"
+//config:      default y
+//config:      help
+//config:        Mini RPM applet - queries and extracts RPM packages.
+
+//applet:IF_RPM(APPLET(rpm, BB_DIR_BIN, BB_SUID_DROP))
+//kbuild:lib-$(CONFIG_RPM) += rpm.o
+
 //usage:#define rpm_trivial_usage
 //usage:       "-i PACKAGE.rpm; rpm -qp[ildc] PACKAGE.rpm"
 //usage:#define rpm_full_usage "\n\n"
@@ -305,16 +314,17 @@ int rpm_main(int argc, char **argv)
 
        while (*argv) {
                int rpm_fd;
-               unsigned offset;
+               unsigned mapsize;
                const char *source_rpm;
 
                rpm_fd = xopen(*argv++, O_RDONLY);
                G.mytags = rpm_gettags(rpm_fd, &G.tagcount);
                if (!G.mytags)
                        bb_error_msg_and_die("error reading rpm header");
-               offset = xlseek(rpm_fd, 0, SEEK_CUR);
+               mapsize = xlseek(rpm_fd, 0, SEEK_CUR);
+               mapsize = (mapsize + pagesize) & -(int)pagesize;
                /* Some NOMMU systems prefer MAP_PRIVATE over MAP_SHARED */
-               G.map = mmap(0, (offset + pagesize) & (-(int)pagesize), PROT_READ, MAP_PRIVATE, rpm_fd, 0);
+               G.map = mmap(0, mapsize, PROT_READ, MAP_PRIVATE, rpm_fd, 0);
 //FIXME: error check?
 
                source_rpm = rpm_getstr(TAG_SOURCERPM, 0);
@@ -386,6 +396,7 @@ int rpm_main(int argc, char **argv)
                                }
                        }
                }
+               munmap(G.map, mapsize);
                free(G.mytags);
                close(rpm_fd);
        }