[prev in list] [next in list] [prev in thread] [next in thread]
List: qmailadmin
Subject: Re: [qmailadmin] weird problem with corrupt .dir-control file
From: Tom Collins <tom () tomlogic ! com>
Date: 2005-04-08 5:17:01
Message-ID: b0b3283de61e840ff92659ef45ad6ed2 () tomlogic ! com
[Download RAW message or body]
On Mar 28, 2005, at 9:53 AM, Dave Steinberg wrote:
> What would have really helped me would have been any of the following:
>
> - A call to perror() after failed mkdir() / chown calls. Not checking
> those return values was what bubbled up into a cryptic, misleading
> error message.
> - In r_mkdir, testing that tmpbuf either exists and is a directory, or
> doesn't exist. If its a file / link / pipe / whatever, then things
> should explode.
>
> Sadly, I don't have time to put together a patch at this time.
What do you think about this patch (cross-posted to vpopmail, since
that's where the patch was made).
This patch adds considerably more error checking to r_mkdir.
--- vpopmail.c 1 Mar 2005 01:17:37 -0000 1.28.2.17
+++ vpopmail.c 8 Apr 2005 05:16:23 -0000
@@ -31,6 +31,7 @@
#include <time.h>
#include <dirent.h>
#include <pwd.h>
+#include <errno.h>
#include "config.h"
#include "md5.h"
#include "vpopmail.h"
@@ -1800,19 +1801,40 @@
int r_mkdir(char *path, uid_t uid, gid_t gid )
{
char tmpbuf[MAX_BUFF];
+ int err;
int i;
+ struct stat sb;
+
+ if (*path == '\0') return 0;
- for(i=0;path[i]!=0;++i){
- if ( (i > 0) && (path[i] == '/') ) {
+ for(i=0; ;++i){
+ if ( (i > 0) && ((path[i] == '/') || (path[i] == '\0')) ) {
tmpbuf[i] = 0;
- if (mkdir(tmpbuf,VPOPMAIL_DIR_MODE) == 0)
+ err = mkdir(tmpbuf,VPOPMAIL_DIR_MODE);
+ if (err == 0)
chown(tmpbuf, uid, gid);
+ else if (errno != EEXIST) {
+ /* Note that if tmpbuf is a file, we'll catch the error on the
+ * next directory creation (ENOTDIR) or when we verify that the
+ * directory exists and is a directory at the end of the
function.
+ */
+ fprintf (stderr, "Unable to create directory %s: ", tmpbuf);
+ perror("");
+ return -1;
+ }
+ if (path[i] == '\0') break;
}
tmpbuf[i] = path[i];
}
- mkdir(path,VPOPMAIL_DIR_MODE);
- chown(path, uid, gid);
- return(0);
+ if (stat (path, &sb) != 0) {
+ fprintf (stderr, "Couldn't stat %s: ", path);
+ perror ("");
+ return -1;
+ } else if (! S_ISDIR(sb.st_mode)) {
+ fprintf (stderr, "Error: %s is not a directory.\n", path);
+ return -1;
+ }
+ return 0;
}
/
************************************************************************
/
--
Tom Collins - tom@tomlogic.com
QmailAdmin: http://qmailadmin.sf.net/ Vpopmail: http://vpopmail.sf.net/
You don't need a laptop to troubleshoot high-speed Internet:
sniffter.com
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic