[pacman-dev] [PATCH 1/3] add _alpm_access() wrapper

Florian Pritz bluewind at xinu.at
Wed Jul 6 13:34:29 EDT 2011


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 at xinu.at>
---
 lib/libalpm/util.c |   49 +++++++++++++++++++++++++++++++++++++++++++++++++
 lib/libalpm/util.h |    1 +
 2 files changed, 50 insertions(+), 0 deletions(-)

diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c
index cd7f19c..332f917 100644
--- a/lib/libalpm/util.c
+++ b/lib/libalpm/util.c
@@ -917,6 +917,55 @@ 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 describe in access()
+ * @return int value returned by access()
+ */
+
+int _alpm_access(alpm_handle_t *handle, const char *dir, const char *file, int amode)
+{
+	char *check_path = NULL;
+	size_t len = 0;
+	int ret = 0;
+
+	if (dir == NULL) {
+		len = strlen(file) + 1;
+		CALLOC(check_path, len, sizeof(char), RET_ERR(handle, ALPM_ERR_MEMORY, -1));
+		snprintf(check_path, len, "%s", file);
+	} else {
+		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);
+
+	if(ret != 0) {
+		switch(amode) {
+			case R_OK:
+				_alpm_log(handle, ALPM_LOG_DEBUG, _("\"%s\" is not readable: %s\n"), check_path, strerror(errno));
+				break;
+			case W_OK:
+				_alpm_log(handle, ALPM_LOG_DEBUG, _("\"%s\" is not writeable: %s\n"), check_path, strerror(errno));
+				break;
+			case X_OK:
+				_alpm_log(handle, ALPM_LOG_DEBUG, _("\"%s\" is not executable: %s\n"), check_path, strerror(errno));
+				break;
+			case F_OK:
+				_alpm_log(handle, ALPM_LOG_DEBUG, _("\"%s\" does not exist: %s\n"), check_path, strerror(errno));
+				break;
+		}
+	}
+	free(check_path);
+	return ret;
+}
+
 #ifndef HAVE_STRNDUP
 /* A quick and dirty implementation derived from glibc */
 static size_t strnlen(const char *s, size_t max)
diff --git a/lib/libalpm/util.h b/lib/libalpm/util.h
index 450dac9..015ed5a 100644
--- a/lib/libalpm/util.h
+++ b/lib/libalpm/util.h
@@ -115,6 +115,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 *);
-- 
1.7.6


More information about the pacman-dev mailing list