Added strerror() output on unlink failure

This commit is contained in:
Aaron Griffin 2007-01-18 16:04:05 +00:00
parent 1bea7706ae
commit f6a76dac12

View file

@ -37,6 +37,8 @@
#include <fcntl.h> #include <fcntl.h>
#include <string.h> #include <string.h>
#include <limits.h> #include <limits.h>
#include <unistd.h>
#include <errno.h>
#include <libintl.h> #include <libintl.h>
/* pacman */ /* pacman */
#include "list.h" #include "list.h"
@ -161,74 +163,74 @@ static int str_cmp(const void *s1, const void *s2)
static void unlink_file(pmpkg_t *info, pmlist_t *lp, pmlist_t *targ, static void unlink_file(pmpkg_t *info, pmlist_t *lp, pmlist_t *targ,
pmtrans_t *trans, int filenum, int *position) pmtrans_t *trans, int filenum, int *position)
{ {
struct stat buf; struct stat buf;
int nb = 0; int nb = 0;
double percent = 0.0; double percent = 0.0;
char *file = lp->data; char *file = lp->data;
char line[PATH_MAX+1]; char line[PATH_MAX+1];
char *checksum = _alpm_needbackup(file, info->backup); char *checksum = _alpm_needbackup(file, info->backup);
if ( *position != 0 ) { if ( *position != 0 ) {
percent = (double)*position / filenum; percent = (double)*position / filenum;
} if ( checksum ) { } if ( checksum ) {
nb = 1; nb = 1;
FREE(checksum); FREE(checksum);
} if ( !nb && trans->type == PM_TRANS_TYPE_UPGRADE ) { } if ( !nb && trans->type == PM_TRANS_TYPE_UPGRADE ) {
/* check noupgrade */ /* check noupgrade */
if ( _alpm_list_is_strin(file, handle->noupgrade) ) { if ( _alpm_list_is_strin(file, handle->noupgrade) ) {
nb = 1; nb = 1;
} }
} }
snprintf(line, PATH_MAX, "%s%s", handle->root, file); snprintf(line, PATH_MAX, "%s%s", handle->root, file);
if ( lstat(line, &buf) ) { if ( lstat(line, &buf) ) {
_alpm_log(PM_LOG_DEBUG, _("file %s does not exist"), file); _alpm_log(PM_LOG_DEBUG, _("file %s does not exist"), file);
return; return;
} }
if ( S_ISDIR(buf.st_mode) ) { if ( S_ISDIR(buf.st_mode) ) {
if ( rmdir(line) ) { if ( rmdir(line) ) {
/* this is okay, other pakcages are probably using it (like /usr) */ /* this is okay, other pakcages are probably using it (like /usr) */
_alpm_log(PM_LOG_DEBUG, _("keeping directory %s"), file); _alpm_log(PM_LOG_DEBUG, _("keeping directory %s"), file);
} else { } else {
_alpm_log(PM_LOG_DEBUG, _("removing directory %s"), file); _alpm_log(PM_LOG_DEBUG, _("removing directory %s"), file);
} }
} else { } else {
/* check the "skip list" before removing the file. /* check the "skip list" before removing the file.
* see the big comment block in db_find_conflicts() for an * see the big comment block in db_find_conflicts() for an
* explanation. */ * explanation. */
int skipit = 0; int skipit = 0;
pmlist_t *j; pmlist_t *j;
for ( j = trans->skiplist; j; j = j->next ) { for ( j = trans->skiplist; j; j = j->next ) {
if ( !strcmp(file, (char*)j->data) ) { if ( !strcmp(file, (char*)j->data) ) {
skipit = 1; skipit = 1;
} }
} }
if ( skipit ) { if ( skipit ) {
_alpm_log(PM_LOG_FLOW2, _("skipping removal of %s as it has moved to another package"), _alpm_log(PM_LOG_FLOW2, _("skipping removal of %s as it has moved to another package"),
file); file);
} else { } else {
/* if the file is flagged, back it up to .pacsave */ /* if the file is flagged, back it up to .pacsave */
if ( nb ) { if ( nb ) {
if ( !(trans->type == PM_TRANS_TYPE_UPGRADE) ) { if ( !(trans->type == PM_TRANS_TYPE_UPGRADE) ) {
/* if it was an upgrade, the file would be left alone because /* if it was an upgrade, the file would be left alone because
* pacman_add() would handle it */ * pacman_add() would handle it */
if ( !(trans->type & PM_TRANS_FLAG_NOSAVE) ) { if ( !(trans->type & PM_TRANS_FLAG_NOSAVE) ) {
char newpath[PATH_MAX]; char newpath[PATH_MAX];
snprintf(newpath, PATH_MAX, "%s.pacsave", line); snprintf(newpath, PATH_MAX, "%s.pacsave", line);
rename(line, newpath); rename(line, newpath);
_alpm_log(PM_LOG_WARNING, _("%s saved as %s"), file); _alpm_log(PM_LOG_WARNING, _("%s saved as %s"), file);
} }
} }
} else { } else {
_alpm_log(PM_LOG_FLOW2, _("unlinking %s"), file); _alpm_log(PM_LOG_FLOW2, _("unlinking %s"), file);
int list_count = _alpm_list_count(trans->packages); /* this way we don't have to call _alpm_list_count twice during PROGRESS */ int list_count = _alpm_list_count(trans->packages); /* this way we don't have to call _alpm_list_count twice during PROGRESS */
PROGRESS(trans, PM_TRANS_PROGRESS_REMOVE_START, info->name, (double)(percent * 100), list_count, (list_count - _alpm_list_count(targ) + 1)); PROGRESS(trans, PM_TRANS_PROGRESS_REMOVE_START, info->name, (double)(percent * 100), list_count, (list_count - _alpm_list_count(targ) + 1));
++(*position); ++(*position);
} }
if ( unlink(file) ) { if (unlink(file) == -1) {
_alpm_log(PM_LOG_ERROR, _("cannot remove file %s"), file); _alpm_log(PM_LOG_ERROR, _("cannot remove file %s: %s"), file, strerror(errno));
} }
} }
} }
} }
int _alpm_remove_commit(pmtrans_t *trans, pmdb_t *db) int _alpm_remove_commit(pmtrans_t *trans, pmdb_t *db)