Date: Thu, 29 Nov 2007 19:25:12 GMT From: Garrett Cooper <gcooper@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 129785 for review Message-ID: <200711291925.lATJPCvs097229@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=129785 Change 129785 by gcooper@shiina-ibook on 2007/11/29 19:24:47 - Add force functionality to pkg_db and all related function prototypes. - Style and logic consolidation. Affected files ... .. //depot/projects/soc2007/revised_fbsd_pkgtools/pkg_revised/v2/contrib/libpkg/pkg_db.c#3 edit .. //depot/projects/soc2007/revised_fbsd_pkgtools/pkg_revised/v2/contrib/libpkg/pkg_db.h#2 edit .. //depot/projects/soc2007/revised_fbsd_pkgtools/pkg_revised/v2/contrib/libpkg/pkg_db_freebsd.c#5 edit Differences ... ==== //depot/projects/soc2007/revised_fbsd_pkgtools/pkg_revised/v2/contrib/libpkg/pkg_db.c#3 (text+ko) ==== @@ -63,7 +63,7 @@ struct stat sb; db = malloc(sizeof(struct pkg_db)); - if (!db) + if (db == NULL) return NULL; /* Make a relative path into an absolute path */ @@ -79,7 +79,7 @@ db->db_base = strdup(base); } - if (!db->db_base) { + if (db->db_base == NULL) { free(db); return NULL; } @@ -88,7 +88,7 @@ if (stat(db->db_base, &sb) == -1) { pkg_db_free(db); return NULL; - } else if (!S_ISDIR(sb.st_mode)) { + } else if (S_ISDIR(sb.st_mode) == 0) { pkg_db_free(db); return NULL; } @@ -128,7 +128,7 @@ * * These are the functions to talk to a package database. * The database is created by a system dependent constructor. - * eg. pkg_db_open_freebsd() on FreeBSD systems + * e.g. pkg_db_open_freebsd() on FreeBSD systems * * @{ */ @@ -142,13 +142,16 @@ * @param scripts If true run the package's scripts * @param fake If true we will only fetch the package and report what would * have happened during the install + * @param force Force the install operation to go through (or at + * least force it to go through if the preinstall script fails..). * @param action A callback that is used to inform the user the status * of the installation * @return 0 if the package is installed, -1 otherwise */ int pkg_db_install_pkg_action(struct pkg_db *db, struct pkg *pkg, - const char *prefix, int reg, int scripts, int fake, pkg_db_action *action) + const char *prefix, int reg, int scripts, int fake, int force, + pkg_db_action *action) { if (db == NULL) return -1; @@ -221,13 +224,13 @@ pkg_db_get_installed_match_count(struct pkg_db *db, pkg_db_match *match, unsigned int count, const void *data) { - if (!db) + if (db == NULL) return NULL; if (match == NULL) match = pkg_match_all; - if (db->pkg_get_installed_match) + if (db->pkg_get_installed_match != NULL) return db->pkg_get_installed_match(db, match, count, data); return NULL; @@ -240,10 +243,7 @@ struct pkg * pkg_db_get_package(struct pkg_db *db, const char *pkg_name) { - if (!db || !pkg_name) - return NULL; - - if (db->pkg_get_package) + if (db != NULL && pkg_name != NULL && db->pkg_get_package) return db->pkg_get_package(db, pkg_name); return NULL; @@ -266,15 +266,11 @@ pkg_db_delete_package_action(struct pkg_db *db, struct pkg *pkg, int scripts, int fake, int force, int clean_dirs, pkg_db_action *action) { - if (db == NULL || pkg == NULL) - return -1; - - if (action == NULL) - return -1; - - if (db->pkg_deinstall != NULL) + if (db != NULL && pkg != NULL && action != NULL && + db->pkg_deinstall != NULL) { return db->pkg_deinstall(db, pkg, scripts, fake, force, clean_dirs, action); + } return -1; } ==== //depot/projects/soc2007/revised_fbsd_pkgtools/pkg_revised/v2/contrib/libpkg/pkg_db.h#2 (text+ko) ==== @@ -28,6 +28,9 @@ #ifndef __LIBPKG_PKG_DB_H__ #define __LIBPKG_PKG_DB_H__ + +#define PKGDB_DEPS_READAHEAD_SIZE 1024 + /* * A place to install packages to and uninstall packages from */ @@ -49,7 +52,7 @@ struct pkg_db *pkg_db_open_freebsd(const char *); int pkg_db_install_pkg_action(struct pkg_db *, struct pkg *, - const char *, int, int, int, pkg_db_action *); + const char *, int, int, int, int, pkg_db_action *); int pkg_db_is_installed(struct pkg_db *, struct pkg *); struct pkg **pkg_db_get_installed(struct pkg_db *); struct pkg **pkg_db_get_installed_match(struct pkg_db *, pkg_db_match *, ==== //depot/projects/soc2007/revised_fbsd_pkgtools/pkg_revised/v2/contrib/libpkg/pkg_db_freebsd.c#5 (text+ko) ==== @@ -176,15 +176,17 @@ * specified by the pkg_script_pre and pkg_script_post variables. * @param fake Should we actually install the package or * just report what would have happened + * @param force Force the install operation to go through (or at + * least force it to go through if the preinstall script fails..). * @param pkg_action A function to call when an action takes place - * @bug When the install fails part way through remove some files are left. + * @bug When the install fails part way through some files are left. * Remove these. * @return 0 on success, -1 on error */ static int freebsd_install_pkg_action(struct pkg_db *db, struct pkg *pkg, const char *prefix, int reg, int exec_pkg_scripts, int fake, - pkg_db_action *pkg_action) + int force, pkg_db_action *pkg_action) { struct pkg_install_data install_data; char cwd[MAXPATHLEN]; @@ -209,11 +211,12 @@ pkg_action(PKG_DB_PACKAGE, "Package name is %s", pkg_get_name(pkg)); /* Run +REQUIRE */ - pkg_action(PKG_DB_INFO, "Running ... for %s..", pkg_get_name(pkg)); + pkg_action(PKG_DB_INFO, "Running requirements... for %s..", + pkg_get_name(pkg)); if (fake == 0) { - /** @todo Check if the force flag is set */ - if (pkg_run_script(pkg, prefix, pkg_script_require) != 0) { + if (pkg_run_script(pkg, prefix, pkg_script_require) != 0 && + force == 0) { chdir(cwd); return -1; } @@ -254,12 +257,7 @@ pkg_run_script(pkg, prefix, pkg_script_post); /* - * Andrew Turner: @todo Display contents of \@display - * - * Garrett Cooper: Looking at the original pkg_install, - * this doesn't appear to be implemented other than just - * as a printf statement. What is the purpose of this - * directive? + * @todo Display contents of \@display */ chdir(cwd); @@ -289,15 +287,15 @@ is_installed = -1; - /* Does the package repo directory exist */ + /* Does the package repo directory exist? */ if (stat(dir, &sb) == 0 && S_ISDIR(sb.st_mode) != 0) { - /* The passed package is installed */ + /* pkg is installed */ free(dir); return 0; } free(dir); - /* Does the package have an origin and if so is that origin installed */ + /* Does the package have an origin; if so is that origin installed? */ if (pkg_get_origin(pkg) != NULL) { pkgs = freebsd_get_installed_match(db, pkg_match_by_origin, @@ -348,12 +346,13 @@ packages_size = sizeof(char *); packages = malloc(packages_size); - if (!packages) { + if (packages == NULL) { closedir(d); return NULL; } packages[0] = NULL; packages_pos = 0; + while((de = readdir(d)) != NULL) { struct pkg *pkg; @@ -375,11 +374,12 @@ packages[packages_pos] = NULL; /* Stop after count packages */ - if (count != 0 && packages_pos == count + 1) + if (count != 0 && packages_pos == (count + 1)) break; - } else + } else { pkg_free(pkg); + } free(dir); } closedir(d); @@ -398,6 +398,7 @@ snprintf(dir, MAXPATHLEN, "%s/var/db/pkg/%s", db->db_base, pkg_name); pkg_remove_extra_slashes(dir); return pkg_new_freebsd_installed(pkg_name, dir); + } /** @@ -433,11 +434,12 @@ deps = pkg_get_reverse_dependencies(real_pkg); /* No dependencies */ - if (deps == NULL) { + if (deps == NULL) return -1; - } + /* We have dependencies to go through.. */ else if (deps[0] != NULL) { + unsigned int pos, buf_size, buf_used; char *buf; @@ -446,6 +448,7 @@ buf = (char*) malloc(buf_size); if (buf == NULL) { + pkg_action(PKG_DB_INFO, "package '%s' is required by other packages and " "may not be deinstalled.\n" @@ -453,6 +456,7 @@ "packages (buffer memory could not be allocated)", pkg_get_name(real_pkg)); return -1; + } /* Load the package names into a buffer */ @@ -476,11 +480,11 @@ "package '%s' is required by these packages and may not be" " deinstalled%s:\n%s", pkg_get_name(real_pkg), - ( force == ? "" : "(but I'll delete it anyway)"), buf); + ( force == 0 ? "" : "(but I'll delete it anyway)"), buf); free(buf); /* Only return when the not being forced to */ - if (force != 0) + if (force == 0) return -1; } @@ -550,19 +554,26 @@ pkg_get_name(real_pkg)); if (deps != NULL) { unsigned int pos; + for (pos = 0; deps[pos] != NULL; pos++) { + struct pkgfile *file; pkg_action(PKG_DB_INFO, "Trying to remove " "dependency on package '%s' with '%s' origin.", pkg_get_name(deps[pos]), pkg_get_origin(deps[pos])); + if (fake == 0) { + file = pkg_get_control_file(deps[pos], "+REQUIRED_BY"); pkgfile_remove_line(file, pkg_get_name(real_pkg)); + } + } + } /* Do the deinstall */ @@ -654,12 +665,8 @@ } pkg_remove_extra_slashes(install_data->directory); - if (strcmp(dir, ".") == 0) { - pkg_action(PKG_DB_PACKAGE, "Change working directory to ."); - } else { - pkg_action(PKG_DB_PACKAGE, "Change working directory to %s", - install_data->directory); - } + pkg_action(PKG_DB_PACKAGE, "Change working directory to %s", + ( strcmp(dir, ".") == 0 ? "." : install_data->directory)); if (install_data->fake == 0) { pkg_dir_build(install_data->directory, 0); @@ -691,7 +698,7 @@ pkgfile_get_name(file)); pkg_action(PKG_DB_PACKAGE, "%s", pkgfile_get_name(file)); - if (!install_data->fake) + if (install_data->fake == 0) return pkgfile_write(file); return 0; } @@ -724,9 +731,10 @@ } else { if (pkgfile_unlink(file) != 0) return -1; - if (install_data->empty_dirs) + if (install_data->empty_dirs != 0) { if (pkg_dir_clean(dirname(pkgfile_get_name(file))) != 0) return -1; + } return 0; } } @@ -753,9 +761,8 @@ install_data->last_file); pkg_action(PKG_DB_PACKAGE, "Execute '%s'", the_cmd); - if (!install_data->fake) { + if (install_data->fake == 0) return pkg_exec(the_cmd); - } return 0; } @@ -794,7 +801,7 @@ pkg_action(PKG_DB_INFO, "Attempting to record package into %s..", real_dir); - if (!install_data->fake) { + if (install_data->fake == 0) { pkg_dir_build(real_dir, 0755); /* @@ -811,8 +818,8 @@ pkg_freebsd_contents_update_prefix(contents, prefix); pkgfile_free(control[pos]); - control[pos] = pkg_freebsd_contents_get_file( - contents); + control[pos] = + pkg_freebsd_contents_get_file(contents); } freebsd_install_file(pkg, pkg_action_null, data, control[pos]); @@ -878,22 +885,21 @@ assert(control[0] != NULL); /* Remove the control files */ for (pos = 0; control[pos] != NULL; pos++) { - if (!install_data->fake) { + if (install_data->fake == 0) pkgfile_unlink(control[pos]); - } } snprintf(db_dir, FILENAME_MAX, "%s" DB_LOCATION "/%s/", install_data->db->db_base, pkg_get_name(pkg)); pkg_remove_extra_slashes(db_dir); dir = pkgfile_new_from_disk(db_dir, 0); + if (dir == NULL) return -1; - if (install_data->fake) { + if (install_data->fake == 1) return 0; - } else { - return pkgfile_unlink(dir); - } + + return pkgfile_unlink(dir); } #ifdef DEAD @@ -906,7 +912,7 @@ int fake) { unsigned int i; - int state; + int new_state, state; assert(db != NULL); assert(contents != NULL); @@ -915,17 +921,18 @@ if (contents->lines[0].line_type != PKG_LINE_COMMENT) { return -1; - } else if (strcmp(contents->lines[0].data, "PKG_FORMAT_REVISION:1.1")) { + } else if (0 != strcmp(contents->lines[0].data, + "PKG_FORMAT_REVISION:1.1")) { return -1; } /* Run through a NFA to check the head */ for (i = 0; i < contents->line_count; i++) { - int new_state = -2; new_state = pkg_states[state][contents->lines[i].line_type]; - if (new_state == -1) { + + if (new_state == -1) break; - } + /* If the current line is @chdir... do it */ if (contents->lines[i].line_type == PKG_LINE_CWD) { if (freebsd_do_cwd(db, NULL, contents->lines[i].data, @@ -935,9 +942,9 @@ } state = new_state; } - if (state != 4 && state != 6) { + if (state != 4 && state != 6) return -1; - } + return i; } #endif
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200711291925.lATJPCvs097229>