add _alpm_access() wrapper

This is a wrapper function for access() which logs some debug
information and eases handling in case of split directory and filename.

Signed-off-by: Florian Pritz <bluewind@xinu.at>
Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
Florian Pritz 2011-07-06 17:22:59 +02:00 committed by Dan McGee
parent 48e2a1a119
commit 29a96bcfe1
2 changed files with 48 additions and 0 deletions

View File

@ -959,6 +959,53 @@ long _alpm_parsedate(const char *line)
return atol(line);
}
/**
* Wrapper around access() which takes a dir and file argument
* separately and generates an appropriate error message.
* If dir is NULL file will be treated as the whole path.
* @param handle an alpm handle
* @param dir directory path ending with and slash
* @param file filename
* @param amode access mode as described in access()
* @return int value returned by access()
*/
int _alpm_access(alpm_handle_t *handle, const char *dir, const char *file, int amode)
{
size_t len = 0;
int ret = 0;
if (dir) {
char *check_path;
len = strlen(dir) + strlen(file) + 1;
CALLOC(check_path, len, sizeof(char), RET_ERR(handle, ALPM_ERR_MEMORY, -1));
snprintf(check_path, len, "%s%s", dir, file);
ret = access(check_path, amode);
free(check_path);
} else {
dir = "";
ret = access(file, amode);
}
if(ret != 0) {
if (amode & R_OK) {
_alpm_log(handle, ALPM_LOG_DEBUG, _("\"%s%s\" is not readable: %s\n"), dir, file, strerror(errno));
}
if (amode & W_OK) {
_alpm_log(handle, ALPM_LOG_DEBUG, _("\"%s%s\" is not writable: %s\n"), dir, file, strerror(errno));
}
if (amode & X_OK) {
_alpm_log(handle, ALPM_LOG_DEBUG, _("\"%s%s\" is not executable: %s\n"), dir, file, strerror(errno));
}
if (amode == F_OK) {
_alpm_log(handle, ALPM_LOG_DEBUG, _("\"%s%s\" does not exist: %s\n"), dir, file, strerror(errno));
}
}
return ret;
}
#ifndef HAVE_STRNDUP
/* A quick and dirty implementation derived from glibc */
static size_t strnlen(const char *s, size_t max)

View File

@ -116,6 +116,7 @@ unsigned long _alpm_hash_sdbm(const char *str);
long _alpm_parsedate(const char *line);
int _alpm_raw_cmp(const char *first, const char *second);
int _alpm_raw_ncmp(const char *first, const char *second, size_t max);
int _alpm_access(alpm_handle_t *handle, const char *dir, const char *file, int amode);
#ifndef HAVE_STRSEP
char *strsep(char **, const char *);