dovecot-1.2: Moved user-friendly EACCES error message generation...

dovecot at dovecot.org dovecot at dovecot.org
Sat Feb 21 00:36:31 EET 2009


details:   http://hg.dovecot.org/dovecot-1.2/rev/6ec819adfde3
changeset: 8759:6ec819adfde3
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Feb 20 17:35:49 2009 -0500
description:
Moved user-friendly EACCES error message generation to lib/.

diffstat:

4 files changed, 99 insertions(+), 74 deletions(-)
src/lib-storage/mail-error.c |   77 +------------------------------------
src/lib/Makefile.am          |    2 
src/lib/eacces-error.c       |   86 ++++++++++++++++++++++++++++++++++++++++++
src/lib/eacces-error.h       |    8 +++

diffs (220 lines):

diff -r f810b81c8e05 -r 6ec819adfde3 src/lib-storage/mail-error.c
--- a/src/lib-storage/mail-error.c	Fri Feb 20 17:11:25 2009 -0500
+++ b/src/lib-storage/mail-error.c	Fri Feb 20 17:35:49 2009 -0500
@@ -1,13 +1,8 @@
 /* Copyright (c) 2007-2009 Dovecot authors, see the included COPYING file */
 
 #include "lib.h"
-#include "str.h"
+#include "eacces-error.h"
 #include "mail-error.h"
-
-#include <sys/stat.h>
-#include <unistd.h>
-#include <pwd.h>
-#include <grp.h>
 
 bool mail_error_from_errno(enum mail_error *error_r,
 			   const char **error_string_r)
@@ -28,78 +23,12 @@ bool mail_error_from_errno(enum mail_err
 	return TRUE;
 }
 
-static const char *
-mail_error_eacces_msg_full(const char *func, const char *path, bool creating)
-{
-	const char *prev_path = path, *dir = "/", *p;
-	const struct passwd *pw;
-	const struct group *group;
-	string_t *errmsg;
-	struct stat st;
-	int ret = -1;
-
-	errmsg = t_str_new(256);
-	str_printfa(errmsg, "%s(%s) failed: Permission denied (euid=%s",
-		    func, path, dec2str(geteuid()));
-
-	pw = getpwuid(geteuid());
-	if (pw != NULL)
-		str_printfa(errmsg, "(%s)", pw->pw_name);
-
-	str_printfa(errmsg, " egid=%s", dec2str(getegid()));
-	group = getgrgid(getegid());
-	if (group != NULL)
-		str_printfa(errmsg, "(%s)", group->gr_name);
-
-	while ((p = strrchr(prev_path, '/')) != NULL) {
-		dir = t_strdup_until(prev_path, p);
-		ret = stat(dir, &st);
-		if (ret == 0)
-			break;
-		if (errno == EACCES) {
-			/* see if we have access to parent directory */
-		} else if (errno == ENOENT && creating) {
-			/* probably mkdir_parents() failed here, find the first
-			   parent directory we couldn't create */
-		} else {
-			/* some other error, can't handle it */
-			str_printfa(errmsg, " stat(%s) failed: %m", dir);
-			break;
-		}
-		prev_path = dir;
-		dir = "/";
-	}
-
-	if (ret == 0) {
-		/* dir is the first parent directory we can stat() */
-		if (access(dir, X_OK) < 0) {
-			if (errno == EACCES)
-				str_printfa(errmsg, " missing +x perm: %s", dir);
-			else
-				str_printfa(errmsg, " access(%s, x) failed: %m", dir);
-		} else if (creating && access(dir, W_OK) < 0) {
-			if (errno == EACCES)
-				str_printfa(errmsg, " missing +w perm: %s", dir);
-			else
-				str_printfa(errmsg, " access(%s, w) failed: %m", dir);
-		} else if (prev_path == path && access(path, R_OK) < 0) {
-			if (errno == EACCES)
-				str_printfa(errmsg, " missing +r perm: %s", path);
-			else
-				str_printfa(errmsg, " access(%s, r) failed: %m", path);
-		} else
-			str_printfa(errmsg, " UNIX perms seem ok, ACL problem?");
-	}
-	str_append_c(errmsg, ')');
-	return str_c(errmsg);
-}
-
 const char *mail_error_eacces_msg(const char *func, const char *path)
 {
-	return mail_error_eacces_msg_full(func, path, FALSE);
+	return eacces_error_get(func, path);
 }
 
 const char *mail_error_create_eacces_msg(const char *func, const char *path)
 {
-	return mail_error_eacces_msg_full(func, path, TRUE);
+	return eacces_error_get_creating(func, path);
 }
diff -r f810b81c8e05 -r 6ec819adfde3 src/lib/Makefile.am
--- a/src/lib/Makefile.am	Fri Feb 20 17:11:25 2009 -0500
+++ b/src/lib/Makefile.am	Fri Feb 20 17:35:49 2009 -0500
@@ -20,6 +20,7 @@ liblib_a_SOURCES = \
 	compat.c \
 	crc32.c \
 	data-stack.c \
+	eacces-error.c \
 	env-util.c \
 	failures.c \
 	fd-close-on-exec.c \
@@ -121,6 +122,7 @@ headers = \
 	compat.h \
 	crc32.h \
 	data-stack.h \
+	eacces-error.h \
 	env-util.h \
 	failures.h \
 	fd-close-on-exec.h \
diff -r f810b81c8e05 -r 6ec819adfde3 src/lib/eacces-error.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lib/eacces-error.c	Fri Feb 20 17:35:49 2009 -0500
@@ -0,0 +1,86 @@
+/* Copyright (c) 2007-2009 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "str.h"
+#include "eacces-error.h"
+
+#include <sys/stat.h>
+#include <unistd.h>
+#include <pwd.h>
+#include <grp.h>
+
+static const char *
+eacces_error_get_full(const char *func, const char *path, bool creating)
+{
+	const char *prev_path = path, *dir = "/", *p;
+	const struct passwd *pw;
+	const struct group *group;
+	string_t *errmsg;
+	struct stat st;
+	int ret = -1;
+
+	errmsg = t_str_new(256);
+	str_printfa(errmsg, "%s(%s) failed: Permission denied (euid=%s",
+		    func, path, dec2str(geteuid()));
+
+	pw = getpwuid(geteuid());
+	if (pw != NULL)
+		str_printfa(errmsg, "(%s)", pw->pw_name);
+
+	str_printfa(errmsg, " egid=%s", dec2str(getegid()));
+	group = getgrgid(getegid());
+	if (group != NULL)
+		str_printfa(errmsg, "(%s)", group->gr_name);
+
+	while ((p = strrchr(prev_path, '/')) != NULL) {
+		dir = t_strdup_until(prev_path, p);
+		ret = stat(dir, &st);
+		if (ret == 0)
+			break;
+		if (errno == EACCES) {
+			/* see if we have access to parent directory */
+		} else if (errno == ENOENT && creating) {
+			/* probably mkdir_parents() failed here, find the first
+			   parent directory we couldn't create */
+		} else {
+			/* some other error, can't handle it */
+			str_printfa(errmsg, " stat(%s) failed: %m", dir);
+			break;
+		}
+		prev_path = dir;
+		dir = "/";
+	}
+
+	if (ret == 0) {
+		/* dir is the first parent directory we can stat() */
+		if (access(dir, X_OK) < 0) {
+			if (errno == EACCES)
+				str_printfa(errmsg, " missing +x perm: %s", dir);
+			else
+				str_printfa(errmsg, " access(%s, x) failed: %m", dir);
+		} else if (creating && access(dir, W_OK) < 0) {
+			if (errno == EACCES)
+				str_printfa(errmsg, " missing +w perm: %s", dir);
+			else
+				str_printfa(errmsg, " access(%s, w) failed: %m", dir);
+		} else if (prev_path == path && access(path, R_OK) < 0) {
+			if (errno == EACCES)
+				str_printfa(errmsg, " missing +r perm: %s", path);
+			else
+				str_printfa(errmsg, " access(%s, r) failed: %m", path);
+		} else
+			str_printfa(errmsg, " UNIX perms seem ok, ACL problem?");
+	}
+	str_append_c(errmsg, ')');
+	return str_c(errmsg);
+}
+
+const char *eacces_error_get(const char *func, const char *path)
+{
+	return eacces_error_get_full(func, path, FALSE);
+}
+
+const char *eacces_error_get_creating(const char *func, const char *path)
+{
+	return eacces_error_get_full(func, path, TRUE);
+}
diff -r f810b81c8e05 -r 6ec819adfde3 src/lib/eacces-error.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lib/eacces-error.h	Fri Feb 20 17:35:49 2009 -0500
@@ -0,0 +1,8 @@
+#ifndef EACCES_ERROR_H
+#define EACCES_ERROR_H
+
+/* Return a user-friendly error message for EACCES failures. */
+const char *eacces_error_get(const char *func, const char *path);
+const char *eacces_error_get_creating(const char *func, const char *path);
+
+#endif


More information about the dovecot-cvs mailing list