diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/pacman/pacman.c | 60 | ||||
| -rw-r--r-- | src/util/testpkg.c | 48 | 
2 files changed, 72 insertions, 36 deletions
diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c index 32fbaced..f87db275 100644 --- a/src/pacman/pacman.c +++ b/src/pacman/pacman.c @@ -184,11 +184,31 @@ static void setuseragent(void)  	setenv("HTTP_USER_AGENT", agent, 0);  } +/** Free the resources. + * + * @param ret the return value + */ +static void cleanup(int ret) { +	/* free alpm library resources */ +	if(alpm_release() == -1) { +		pm_printf(PM_LOG_ERROR, alpm_strerrorlast()); +	} + +	/* free memory */ +	FREELIST(pm_targets); +	if(config) { +		config_free(config); +		config = NULL; +	} + +	exit(ret); +} +  /** Catches thrown signals. Performs necessary cleanup to ensure database is   * in a consistant state.   * @param signum the thrown signal   */ -static void cleanup(int signum) +static void handler(int signum)  {  	if(signum==SIGSEGV)  	{ @@ -207,20 +227,7 @@ static void cleanup(int signum)  		/* output a newline to be sure we clear any line we may be on */  		printf("\n");  	} - -	/* free alpm library resources */ -	if(alpm_release() == -1) { -		pm_printf(PM_LOG_ERROR, alpm_strerrorlast()); -	} - -	/* free memory */ -	FREELIST(pm_targets); -	if(config) { -		config_free(config); -		config = NULL; -	} - -	exit(signum); +	cleanup(signum);  }  /** Sets all libalpm required paths in one go. Called after the command line @@ -745,6 +752,7 @@ static int parseconfig(const char *file)  int main(int argc, char *argv[])  {  	int ret = 0; +	struct sigaction new_action, old_action;  #if defined(HAVE_GETEUID)  	/* geteuid undefined in CYGWIN */  	uid_t myuid = geteuid(); @@ -755,10 +763,24 @@ int main(int argc, char *argv[])  	mtrace();  #endif -	/* set signal handlers */ -	signal(SIGINT, cleanup); -	signal(SIGTERM, cleanup); -	signal(SIGSEGV, cleanup); +	/* Set signal handlers */ +	/* Set up the structure to specify the new action. */ +	new_action.sa_handler = handler; +	sigemptyset(&new_action.sa_mask); +	new_action.sa_flags = 0; + +	sigaction(SIGINT, NULL, &old_action); +	if(old_action.sa_handler != SIG_IGN) { +		sigaction(SIGINT, &new_action, NULL); +	} +	sigaction(SIGTERM, NULL, &old_action); +	if(old_action.sa_handler != SIG_IGN) { +		sigaction(SIGTERM, &new_action, NULL); +	} +	sigaction(SIGSEGV, NULL, &old_action); +	if(old_action.sa_handler != SIG_IGN) { +		sigaction(SIGSEGV, &new_action, NULL); +	}  	/* i18n init */  #if defined(ENABLE_NLS) diff --git a/src/util/testpkg.c b/src/util/testpkg.c index e32b013d..64056ce4 100644 --- a/src/util/testpkg.c +++ b/src/util/testpkg.c @@ -29,44 +29,58 @@  static void output_cb(pmloglevel_t level, char *fmt, va_list args)  { -	if(strlen(fmt)) { -        switch(level) { -        case PM_LOG_ERROR: printf("error: "); break; -        case PM_LOG_WARNING: printf("warning: "); break; -		default: break; -        } -		vprintf(fmt, args); -    } +	if(fmt[0] == '\0') { +		return; +	} +	switch(level) { +		case PM_LOG_ERROR: printf("error: "); break; +		case PM_LOG_WARNING: printf("warning: "); break; +		default: return; /* skip other messages */ +	} +	vprintf(fmt, args);  }  int main(int argc, char **argv)  { -    int retval = 1; /* default = false */ -    pmpkg_t *pkg = NULL; +	int retval = 1; /* default = false */ +	pmpkg_t *pkg = NULL; -    if(argc != 2) { +	if(argc != 2) {  		fprintf(stderr, "usage: %s <package file>\n", BASENAME);  		return(1);  	}  	if(alpm_initialize() == -1) { -		fprintf(stderr, "cannot initilize alpm: %s\n", alpm_strerrorlast()); -        return(1); +		fprintf(stderr, "cannot initialize alpm: %s\n", alpm_strerrorlast()); +		return(1);  	} -    /* let us get log messages from libalpm */ +	/* let us get log messages from libalpm */  	alpm_option_set_logcb(output_cb);  	if(alpm_pkg_load(argv[1], 1, &pkg) == -1 || pkg == NULL) { -        retval = 1; +		switch(pm_errno) { +			case PM_ERR_PKG_OPEN: +				printf("Cannot open the given file.\n"); +				break; +			case PM_ERR_LIBARCHIVE_ERROR: +			case PM_ERR_PKG_INVALID: +				printf("Package is invalid.\n"); +				break; +			default: +				printf("libalpm error: %s\n", alpm_strerrorlast()); +				break; +		} +		retval = 1;  	} else {  		alpm_pkg_free(pkg); -        retval = 0; +		printf("Package is valid.\n"); +		retval = 0;  	}  	if(alpm_release() == -1) {  		fprintf(stderr, "error releasing alpm: %s\n", alpm_strerrorlast());  	} -    return(retval); +	return(retval);  }  | 
