logrotate/logrotate-3.7.8-missingok.patch
2010-04-06 10:01:15 +00:00

75 lines
2.4 KiB
Diff

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++) {