Blob Blame History Raw
diff -up logrotate-3.7.8/config.c.missingok logrotate-3.7.8/config.c
--- logrotate-3.7.8/config.c.missingok	2010-04-06 11:35:11.000000000 +0200
+++ logrotate-3.7.8/config.c	2010-04-06 11:43:37.000000000 +0200
@@ -41,6 +41,7 @@ static int defTabooCount = sizeof(defTab
 /* I shouldn't use globals here :-( */
 static char **tabooExts = NULL;
 int tabooCount = 0;
+static int glob_errno = 0;
 
 static int readConfigFile(const char *configFile, struct logInfo *defConfig);
 static int globerr(const char *pathname, int theerr);
@@ -461,8 +462,7 @@ int readAllConfigPaths(const char **path
 
 static int globerr(const char *pathname, int theerr)
 {
-    message(MESS_ERROR, "error accessing %s: %s\n", pathname,
-	    strerror(theerr));
+    glob_errno = theerr;
 
     /* We want the glob operation to abort on error, so return 1 */
     return 1;
@@ -501,6 +501,7 @@ static int readConfigFile(const char *co
     int logerror = 0;
     struct logInfo *log;
 	static unsigned recursion_depth = 0U;
+	char *globerr_msg = NULL;
 
     /* FIXME: createOwner and createGroup probably shouldn't be fixed
        length arrays -- of course, if we aren't run setuid it doesn't
@@ -1346,16 +1347,25 @@ static int readConfigFile(const char *co
 	    newlog->files = NULL;
 	    newlog->numFiles = 0;
 	    for (argNum = 0; argNum < argc && logerror != 1; argNum++) {
+		if (globerr_msg) {
+		    free(globerr_msg);
+		    globerr_msg = NULL;
+		}
+			
 		rc = glob(argv[argNum], GLOB_NOCHECK, globerr,
 			  &globResult);
 		if (rc == GLOB_ABORTED) {
 		    if (newlog->flags & LOG_FLAG_MISSINGOK)
 			continue;
 
-		    message(MESS_ERROR, "%s:%d glob failed for %s\n",
-			    configFile, lineNum, argv[argNum]);
-		    logerror = 1;
-		    break;
+          /* We don't yet know whether this stanza has "missingok"
+		     * set, so store the error message for later. */
+		    rc = asprintf(&globerr_msg, "%s:%d glob failed for %s: %s\n",
+			    configFile, lineNum, argv[argNum], strerror(glob_errno));
+		    if (rc == -1)
+			globerr_msg = NULL;
+		    
+		    globResult.gl_pathc = 0;
 		}
 
 		newlog->files =
@@ -1407,6 +1417,14 @@ duperror:
 			lineNum);
 		return 1;
 	    }
+	if (globerr_msg) {
+		if (!(newlog->flags & LOG_FLAG_MISSINGOK))
+		    message(MESS_ERROR, globerr_msg);
+		free(globerr_msg);
+		globerr_msg = NULL;
+		if (!(newlog->flags & LOG_FLAG_MISSINGOK))
+		    return 1;
+	    }
 
 	    if (newlog->oldDir) {
 		for (i = 0; i < newlog->numFiles; i++) {