Date: Wed, 28 Nov 2007 03:46:19 GMT From: Garrett Cooper <gcooper@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 129669 for review Message-ID: <200711280346.lAS3kJAm033860@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=129669 Change 129669 by gcooper@shiina-ibook on 2007/11/28 03:45:37 1. Correct accidental poor style on my part. 2. Add a bit more stylishy items. 3. Solve a bug in freebsd_run_script [system(3) does in fact return -1 sometimes, ya know?]. 4. Finish off most of the deinstall script support. Affected files ... .. //depot/projects/soc2007/revised_fbsd_pkgtools/pkg_revised/v2/contrib/libpkg/pkg_db_freebsd.c#3 edit .. //depot/projects/soc2007/revised_fbsd_pkgtools/pkg_revised/v2/contrib/libpkg/pkg_freebsd.c#2 edit Differences ... ==== //depot/projects/soc2007/revised_fbsd_pkgtools/pkg_revised/v2/contrib/libpkg/pkg_db_freebsd.c#3 (text+ko) ==== @@ -193,9 +193,8 @@ assert(pkg != NULL); assert(pkg_action != NULL); - if (getwd(cwd) == NULL) { + if (getwd(cwd) == NULL) return -1; - } /* Set the package environment */ if (prefix == NULL) { @@ -427,32 +426,42 @@ return -1; } - /** @todo Check if package is dependended on */ + /* + * Calculate reverse dependencies -- is this package required by + * anything else? + */ deps = pkg_get_reverse_dependencies(real_pkg); + + /* No dependencies */ if (deps == NULL) { return -1; - } else if (deps[0] != NULL) { + } + /* We have dependencies to go through.. */ + else if (deps[0] != NULL) { unsigned int pos, buf_size, buf_used; char *buf; - /* XXX */ + buf_used = 0; - buf_size = 1024; - buf = malloc(buf_size); + buf_size = PKGDB_DEPS_READAHEAD_SIZE; + 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 however an error occured " - "while retrieving the list of packages", + "may not be deinstalled.\n" + "An error occurred while retrieving the list of " + "packages (buffer memory could not be allocated)", pkg_get_name(real_pkg)); return -1; } - /* Load the names of the packages into a buffer */ + + /* Load the package names into a buffer */ for (pos = 0; deps[pos] != NULL; pos++) { size_t len; len = strlen(pkg_get_name(deps[pos])); if (buf_used + len >= buf_size) { - buf_size += 1024; + buf_size += PKGDB_DEPS_READAHEAD_SIZE; buf = realloc(buf, buf_size); } strlcat(buf, pkg_get_name(deps[pos]), buf_size); @@ -461,45 +470,79 @@ } /* - * There is a sligntly different - * message when the force flag is set + * The message is slightly different when force is set */ - if (force != 0) { - pkg_action(PKG_DB_INFO, - "package '%s' is required by these other packages " - "and may not be deinstalled (but I'll delete it " - "anyway):\n%s", pkg_get_name(real_pkg), buf); - } else { - pkg_action(PKG_DB_INFO, - "package '%s' is required by these other packages " - "and may not be deinstalled:\n%s", - pkg_get_name(real_pkg), buf); - } + pkg_action(PKG_DB_INFO, + "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); free(buf); /* Only return when the not being forced to */ if (force != 0) return -1; + } + /* + * This is equivalent to the: + * + * if (fexists(POST_DEINSTALL_FNAME)) .. else { .. } + * + * block in "pkg_install/delete/perform.c". + */ if (fake == 0 && exec_pkg_scripts != NULL) { + + /* Try +REQUIRE */ if (pkg_run_script(real_pkg, NULL, - pkg_script_require_deinstall) != 0 && !force) { - /* XXX */ - return -1; + pkg_script_require_deinstall) != 0 && + errno != ENOFILE && force == 0) { + + warnx("deinstall +REQUIRE script execution failed"); + return -1; + } + + /* +REQUIRE didn't exist; try +PRE-DEINSTALL */ + else if (errno == ENOFILE) { - if (pkg_run_script(real_pkg, NULL, pkg_script_pre_deinstall) - != 0 && !force) { - /* XXX */ - return -1; - } + /* Try +PRE-DEINSTALL */ + if (pkg_run_script(real_pkg, NULL, + pkg_script_pre_deinstall) != 0 && + errno != ENOFILE && force == 0) { + + warnx("pre-deinstall script execution failed"); + return -1; + + } + + /* +PRE-DEINSTALL didn't exist; try +DEINSTALL */ + else if (errno == ENOFILE) { + + /* Try +DEINSTALL */ + if (pkg_run_script(real_pkg, NULL, + pkg_script_deinstall) != 0 && + errno != ENOFILE && force == 0) { + warnx("deinstall +REQUIRE script execution failed"); + return -1; + } + + /* + * XXX: Else, oddly enough no deinstall scripts exist. + * + * Is this correct behavior?! + * + * According to pkg_delete(1)'s existing code, yes + * it's supposed to be this way, but logically does + * it make sense? + * + */ + + } + + } - if (pkg_run_script(real_pkg, NULL, pkg_script_deinstall) != 0 - && !force) { - /* XXX */ - return -1; - } } /* Remove the reverse dependencies */ @@ -513,7 +556,7 @@ 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) { + if (fake == 0) { file = pkg_get_control_file(deps[pos], "+REQUIRED_BY"); pkgfile_remove_line(file, @@ -531,16 +574,16 @@ deinstall_data.directory[0] = '\0'; if (pkg_deinstall(real_pkg, pkg_action, &deinstall_data, freebsd_do_chdir, freebsd_deinstall_file, - freebsd_do_exec, freebsd_deregister) != 0 && !force) { + freebsd_do_exec, freebsd_deregister) != 0 && force != 0) { return -1; } if (fake == 0 && exec_pkg_scripts == 1) { /** @todo Run +POST-DEINSTALL <pkg-name>/+DEINSTALL <pkg-name> POST-DEINSTALL */ - if (pkg_run_script(real_pkg, NULL, pkg_script_post_deinstall) - != 0 && !force) { - /* XXX */ - return -1; + if (pkg_run_script(real_pkg, NULL, pkg_script_post_deinstall) != 0 && + force != 0) { + warnx("post-deinstall script execution failed"); + return -1; } } @@ -603,7 +646,7 @@ install_data->directory); } - if (!install_data->fake) { + if (install_data->fake == 0) { pkg_dir_build(install_data->directory, 0); return chdir(install_data->directory); } ==== //depot/projects/soc2007/revised_fbsd_pkgtools/pkg_revised/v2/contrib/libpkg/pkg_freebsd.c#2 (text+ko) ==== @@ -994,7 +994,9 @@ /** * @brief Callback for pkg_run_script() - * @return 0 + * @return 0 on success + * @return -1 on fail, noop or script not found. + * If script not found, set errno to ENOFILE. */ static int freebsd_run_script(struct pkg *pkg, const char *prefix, pkg_script script) @@ -1006,6 +1008,9 @@ char *cwd; int ret = -1; + /* Make sure errno is 0.. */ + errno = 0; + assert(pkg != NULL); fpkg = pkg->data; @@ -1056,8 +1061,10 @@ } /* The script was not found so ignore it */ - if (script_file == NULL) - return 0; + if (script_file == NULL) { + errno = ENOFILE; + return -1; + } if (fpkg->pkg_type == fpkg_from_file) { /**
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200711280346.lAS3kJAm033860>