int len = strlen(director->working_directory);
POOLMEM *cleanup = get_pool_memory(PM_MESSAGE);
POOLMEM *basename = get_pool_memory(PM_MESSAGE);
- regex_t preg1, preg2, pexc1;
+ regex_t preg1;
char prbuf[500];
const int nmatch = 30;
regmatch_t pmatch[nmatch];
berrno be;
- /* Includes */
- const char *pat1 = ".*\\.restore\\..*\\.bsr$";
- const char *pat2 = ".*\\.mail$";
-
- /* Excludes */
- const char *exc1 = ".*\\ ";
+ /* Exclude spaces and look for .mail or .restore.xx.bsr files */
+ const char *pat1 = "^[^ ]+\\.(restore\\.[^ ]+\\.bsr|mail)$";
/* Setup working directory prefix */
pm_strcpy(basename, director->working_directory);
rc = regcomp(&preg1, pat1, REG_EXTENDED);
if (rc != 0) {
regerror(rc, &preg1, prbuf, sizeof(prbuf));
- Dmsg2(500, _("Could not compile regex pattern \"%s\" ERR=%s\n"),
+ Pmsg2(000, _("Could not compile regex pattern \"%s\" ERR=%s\n"),
pat1, prbuf);
- goto get_out4;
- }
- rc = regcomp(&preg2, pat2, REG_EXTENDED);
- if (rc != 0) {
- regerror(rc, &preg2, prbuf, sizeof(prbuf));
- Pmsg2(100, _("Could not compile regex pattern \"%s\" ERR=%s\n"),
- pat2, prbuf);
- goto get_out3;
- }
-
- rc = regcomp(&pexc1, exc1, REG_EXTENDED);
- if (rc != 0) {
- regerror(rc, &pexc1, prbuf, sizeof(prbuf));
- Pmsg2(100, _("Could not compile regex pattern \"%s\" ERR=%s\n"),
- exc1, prbuf);
goto get_out2;
}
if (!(dp = opendir(director->working_directory))) {
berrno be;
- Pmsg2(100, "Failed to open working dir %s for cleanup: ERR=%s\n",
+ Pmsg2(000, "Failed to open working dir %s for cleanup: ERR=%s\n",
director->working_directory, be.bstrerror());
goto get_out1;
return;
Dmsg1(500, "Skipped: %s\n", result->d_name);
continue;
}
- rc = regexec(&pexc1, result->d_name, nmatch, pmatch, 0);
- if (rc == 0) {
- Dmsg1(500, "Excluded: %s\n", result->d_name);
- continue;
- }
/* Unlink files that match regexes */
- if (regexec(&preg1, result->d_name, nmatch, pmatch, 0) == 0 ||
- regexec(&preg2, result->d_name, nmatch, pmatch, 0) == 0) {
+ if (regexec(&preg1, result->d_name, nmatch, pmatch, 0) == 0) {
pm_strcpy(cleanup, basename);
pm_strcat(cleanup, result->d_name);
Dmsg1(100, "Unlink: %s\n", cleanup);
closedir(dp);
/* Be careful to free up the correct resources */
get_out1:
- regfree(&pexc1);
-get_out2:
- regfree(&preg2);
-get_out3:
regfree(&preg1);
-get_out4:
+get_out2:
free_pool_memory(cleanup);
free_pool_memory(basename);
}
/*
* This routine is a somewhat safer unlink in that it
- * allows you to ensure that there are no spaces in the
- * filename to be deleted, and it also allows you to run
- * a regex on the filename before excepting it. It also
- * requires the file to be in the working directory.
+ * allows you to run a regex on the filename before
+ * excepting it. It also requires the file to be in
+ * the working directory.
*/
int safer_unlink(const char *pathname, const char *regx)
{
regmatch_t pmatch[nmatch];
int rtn;
- /* Excludes */
- const char *exc1 = ".*\\ ";
-
/* Name must start with working directory */
if (strncmp(pathname, working_directory, strlen(working_directory)) != 0) {
Pmsg1(000, "Safe_unlink excluded: %s\n", pathname);
return EROFS;
}
- /* Compile regex expressions */
+ /* Compile regex expression */
rc = regcomp(&preg1, regx, REG_EXTENDED);
if (rc != 0) {
regerror(rc, &preg1, prbuf, sizeof(prbuf));
return ENOENT;
}
- rc = regcomp(&pexc1, exc1, REG_EXTENDED);
- if (rc != 0) {
- regerror(rc, &pexc1, prbuf, sizeof(prbuf));
- Pmsg2(000, _("safe_unlink could not compile regex pattern \"%s\" ERR=%s\n"),
- exc1, prbuf);
- regfree(&preg1);
- return ENOENT;
- }
-
- rc = regexec(&pexc1, pathname, nmatch, pmatch, 0);
- if (rc == 0) {
- Pmsg1(000, "safe_unlink excluded: %s\n", pathname);
- rtn = EROFS;
- goto get_out;
- }
-
/* Unlink files that match regexes */
if (regexec(&preg1, pathname, nmatch, pmatch, 0) == 0) {
Dmsg1(100, "safe_unlink unlinking: %s\n", pathname);
Pmsg2(000, "safe_unlink regex failed: regex=%s file=%s\n", regx, pathname);
rtn = EROFS;
}
-
-get_out:
regfree(&preg1);
regfree(&pexc1);
return rtn;
/* Static storage */
+/* Exclude spaces but require .mail at end */
+#define MAIL_REGEX "^[^ ]+\\.mail$"
+
/* Allow only one thread to tweak d->fd at a time */
static pthread_mutex_t fides_mutex = PTHREAD_MUTEX_INITIALIZER;
static MSGS *daemon_msgs; /* global messages */
fclose(d->fd);
d->fd = NULL;
/* Exclude spaces in mail_filename */
- safer_unlink(d->mail_filename, ".*\\.mail$");
+ safer_unlink(d->mail_filename, MAIL_REGEX);
free_pool_memory(d->mail_filename);
d->mail_filename = NULL;
Dmsg0(850, "end mail or mail on error\n");
return OK;
}
+/*
+ * Remove old .spool files written by me from the working directory.
+ */
static void cleanup_old_files()
{
DIR* dp;
int len = strlen(me->working_directory);
POOLMEM *cleanup = get_pool_memory(PM_MESSAGE);
POOLMEM *basename = get_pool_memory(PM_MESSAGE);
- regex_t preg1, pexc1;
+ regex_t preg1;
char prbuf[500];
const int nmatch = 30;
regmatch_t pmatch[nmatch];
berrno be;
- /* Includes */
- const char *pat1 = ".*\\.spool$";
-
- /* Excludes */
- const char *exc1 = ".*\\ ";
+ /* Look for .spool files but don't allow spaces */
+ const char *pat1 = "^[^ ]+\\.spool$";
/* Setup working directory prefix */
pm_strcpy(basename, me->working_directory);
rc = regcomp(&preg1, pat1, REG_EXTENDED);
if (rc != 0) {
regerror(rc, &preg1, prbuf, sizeof(prbuf));
- Dmsg2(500, _("Could not compile regex pattern \"%s\" ERR=%s\n"),
+ Pmsg2(000, _("Could not compile regex pattern \"%s\" ERR=%s\n"),
pat1, prbuf);
- goto get_out3;
- }
-
- rc = regcomp(&pexc1, exc1, REG_EXTENDED);
- if (rc != 0) {
- regerror(rc, &pexc1, prbuf, sizeof(prbuf));
- Pmsg2(100, _("Could not compile regex pattern \"%s\" ERR=%s\n"),
- exc1, prbuf);
goto get_out2;
}
if (!(dp = opendir(me->working_directory))) {
berrno be;
- Pmsg2(100, "Failed to open working dir %s for cleanup: ERR=%s\n",
+ Pmsg2(000, "Failed to open working dir %s for cleanup: ERR=%s\n",
me->working_directory, be.bstrerror());
goto get_out1;
}
- //Dmsg1(000, "my_name=%s\n", my_name);
-
entry = (struct dirent *)malloc(sizeof(struct dirent) + name_max + 1000);
while (1) {
if ((readdir_r(dp, entry, &result) != 0) || (result == NULL)) {
Dmsg1(500, "Skipped: %s\n", result->d_name);
continue;
}
- rc = regexec(&pexc1, result->d_name, nmatch, pmatch, 0);
- if (rc == 0) {
- Dmsg1(500, "Excluded: %s\n", result->d_name);
- continue;
- }
- /* Unlink files that match regexes */
+ /* Unlink files that match regex */
if (regexec(&preg1, result->d_name, nmatch, pmatch, 0) == 0) {
pm_strcpy(cleanup, basename);
pm_strcat(cleanup, result->d_name);
unlink(cleanup);
}
}
-
free(entry);
closedir(dp);
+
get_out1:
- regfree(&pexc1);
-get_out2:
regfree(&preg1);
-get_out3:
+get_out2:
free_pool_memory(cleanup);
free_pool_memory(basename);
}