tar: fix obscure case when name is "" and prefix is not ""
[oweals/busybox.git] / archival / dpkg.c
index 0ca2704a1dfa8356eac760a14f5d682601832dd0..1280ca03d8d00c189e57ab9f38974c0e80d6f82d 100644 (file)
@@ -582,10 +582,10 @@ static int read_package_field(const char *package_buffer, char **field_name, cha
 
 static unsigned fill_package_struct(char *control_buffer)
 {
-       static const char *const field_names[] = { "Package", "Version",
-               "Pre-Depends", "Depends","Replaces", "Provides",
-               "Conflicts", "Suggests", "Recommends", "Enhances", NULL
-       };
+       static const char field_names[] ALIGN1 =
+               "Package\0""Version\0"
+               "Pre-Depends\0""Depends\0""Replaces\0""Provides\0"
+               "Conflicts\0""Suggests\0""Recommends\0""Enhances\0";
 
        common_node_t *new_node = xzalloc(sizeof(common_node_t));
        char *field_name;
@@ -602,10 +602,10 @@ static unsigned fill_package_struct(char *control_buffer)
                                &field_name, &field_value);
 
                if (field_name == NULL) {
-                       goto fill_package_struct_cleanup; /* Oh no, the dreaded goto statement ! */
+                       goto fill_package_struct_cleanup;
                }
 
-               field_num = index_in_str_array(field_names, field_name);
+               field_num = index_in_strings(field_names, field_name);
                switch (field_num) {
                case 0: /* Package */
                        new_node->name = search_name_hashtable(field_value);
@@ -712,9 +712,9 @@ static void set_status(const unsigned status_node_num, const char *new_value, co
 
 static const char *describe_status(int status_num)
 {
-       int status_want, status_state ;
+       int status_want, status_state;
        if (status_hashtable[status_num] == NULL || status_hashtable[status_num]->status == 0)
-               return "is not installed or flagged to be installed\n";
+               return "is not installed or flagged to be installed";
 
        status_want = get_status(status_num, 1);
        status_state = get_status(status_num, 3);
@@ -745,7 +745,7 @@ static void index_status_file(const char *filename)
        unsigned status_num;
 
        status_file = xfopen(filename, "r");
-       while ((control_buffer = xmalloc_fgets_str(status_file, "\n\n")) != NULL) {
+       while ((control_buffer = xmalloc_fgetline_str(status_file, "\n\n")) != NULL) {
                const unsigned package_num = fill_package_struct(control_buffer);
                if (package_num != -1) {
                        status_node = xmalloc(sizeof(status_node_t));
@@ -798,7 +798,7 @@ static void write_status_file(deb_file_t **deb_file)
        int i = 0;
 
        /* Update previously known packages */
-       while ((control_buffer = xmalloc_fgets_str(old_status_file, "\n\n")) != NULL) {
+       while ((control_buffer = xmalloc_fgetline_str(old_status_file, "\n\n")) != NULL) {
                tmp_string = strstr(control_buffer, "Package:");
                if (tmp_string == NULL) {
                        continue;
@@ -913,20 +913,16 @@ static void write_status_file(deb_file_t **deb_file)
        fclose(old_status_file);
        fclose(new_status_file);
 
-
        /* Create a separate backfile to dpkg */
        if (rename("/var/lib/dpkg/status", "/var/lib/dpkg/status.udeb.bak") == -1) {
-               struct stat stat_buf;
-               xstat("/var/lib/dpkg/status", &stat_buf);
+               if (errno != ENOENT)
+                       bb_error_msg_and_die("cannot create backup status file");
                /* Its ok if renaming the status file fails because status
                 * file doesnt exist, maybe we are starting from scratch */
                bb_error_msg("no status file found, creating new one");
        }
 
-       if (rename("/var/lib/dpkg/status.udeb", "/var/lib/dpkg/status") == -1) {
-               bb_error_msg_and_die("DANGER: cannot create status file, "
-                       "you need to manually repair your status file");
-       }
+       xrename("/var/lib/dpkg/status.udeb", "/var/lib/dpkg/status");
 }
 
 /* This function returns TRUE if the given package can satisfy a
@@ -953,7 +949,7 @@ static int package_satisfies_dependency(int package, int depend_type)
        return 0;
 }
 
-static int check_deps(deb_file_t **deb_file, int deb_start, int dep_max_count)
+static int check_deps(deb_file_t **deb_file, int deb_start /*, int dep_max_count - ?? */)
 {
        int *conflicts = NULL;
        int conflicts_num = 0;
@@ -1166,7 +1162,7 @@ static char **create_list(const char *filename)
                return NULL;
        }
 
-       while ((line = xmalloc_getline(list_stream)) != NULL) {
+       while ((line = xmalloc_fgetline(list_stream)) != NULL) {
                file_list = xrealloc(file_list, sizeof(char *) * (count + 2));
                file_list[count] = line;
                count++;
@@ -1227,7 +1223,7 @@ static int run_package_script(const char *package_name, const char *script_type)
        return result;
 }
 
-static const char *all_control_files[] = {
+static const char *const all_control_files[] = {
        "preinst", "postinst", "prerm", "postrm",
        "list", "md5sums", "shlibs", "conffiles",
        "config", "templates", NULL
@@ -1344,7 +1340,7 @@ static void remove_package(const unsigned package_num, int noisy)
        free_array(exclude_files);
 
        /* rename <package>.conffile to <package>.list */
-       rename(conffile_name, list_name);
+       xrename(conffile_name, list_name);
 
        /* Change package status */
        set_status(status_num, "config-files", 3);
@@ -1412,10 +1408,10 @@ static void init_archive_deb_control(archive_handle_t *ar_handle)
        tar_handle->src_fd = ar_handle->src_fd;
 
        /* We don't care about data.tar.* or debian-binary, just control.tar.* */
-#ifdef CONFIG_FEATURE_DEB_TAR_GZ
+#if ENABLE_FEATURE_DEB_TAR_GZ
        llist_add_to(&(ar_handle->accept), (char*)"control.tar.gz");
 #endif
-#ifdef CONFIG_FEATURE_DEB_TAR_BZ2
+#if ENABLE_FEATURE_DEB_TAR_BZ2
        llist_add_to(&(ar_handle->accept), (char*)"control.tar.bz2");
 #endif
 
@@ -1432,10 +1428,10 @@ static void init_archive_deb_data(archive_handle_t *ar_handle)
        tar_handle->src_fd = ar_handle->src_fd;
 
        /* We don't care about control.tar.* or debian-binary, just data.tar.* */
-#ifdef CONFIG_FEATURE_DEB_TAR_GZ
+#if ENABLE_FEATURE_DEB_TAR_GZ
        llist_add_to(&(ar_handle->accept), (char*)"data.tar.gz");
 #endif
-#ifdef CONFIG_FEATURE_DEB_TAR_BZ2
+#if ENABLE_FEATURE_DEB_TAR_BZ2
        llist_add_to(&(ar_handle->accept), (char*)"data.tar.bz2");
 #endif
 
@@ -1557,7 +1553,7 @@ static void configure_package(deb_file_t *deb_file)
        set_status(status_num, "installed", 3);
 }
 
-int dpkg_main(int argc, char **argv);
+int dpkg_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int dpkg_main(int argc, char **argv)
 {
        deb_file_t **deb_file = NULL;
@@ -1579,7 +1575,7 @@ int dpkg_main(int argc, char **argv)
                OPT_unpack = 0x40,
        };
 
-       opt = getopt32(argc, argv, "CF:ilPru", &str_f);
+       opt = getopt32(argv, "CF:ilPru", &str_f);
        //if (opt & OPT_configure) ... // -C
        if (opt & OPT_force_ignore_depends) { // -F (--force in official dpkg)
                if (strcmp(str_f, "depends"))
@@ -1693,7 +1689,7 @@ int dpkg_main(int argc, char **argv)
 
        /* Check that the deb file arguments are installable */
        if (!(opt & OPT_force_ignore_depends)) {
-               if (!check_deps(deb_file, 0, deb_count)) {
+               if (!check_deps(deb_file, 0 /*, deb_count*/)) {
                        bb_error_msg_and_die("dependency check failed");
                }
        }