* file named AUTHORS, in the root directory of this distribution.
*/
/*
- * $Id: match.c,v 1.21 2005/10/11 01:17:00 vectro Exp $
+ * $Id: match.c,v 1.23 2006/05/25 01:47:12 johnfranks Exp $
*
* functions for checking and matching regular expressions
*/
#include "amanda.h"
-#include "regex.h"
+#include <regex.h>
-char *validate_regexp(regex)
-char *regex;
+static int match_word(const char *glob, const char *word, const char separator);
+
+char *
+validate_regexp(
+ const char * regex)
{
regex_t regc;
int result;
if ((result = regcomp(®c, regex,
REG_EXTENDED|REG_NOSUB|REG_NEWLINE)) != 0) {
- regerror(result, ®c, errmsg, sizeof(errmsg));
+ regerror(result, ®c, errmsg, SIZEOF(errmsg));
return errmsg;
}
return NULL;
}
-char *clean_regex(regex)
-char *regex;
+char *
+clean_regex(
+ const char * regex)
{
char *result;
int j;
result[j++]='\\';
result[j++]=regex[i];
}
- result[j++] = '\0';
+ result[j] = '\0';
return result;
}
-int match(regex, str)
-char *regex, *str;
+int
+match(
+ const char * regex,
+ const char * str)
{
regex_t regc;
int result;
if((result = regcomp(®c, regex,
REG_EXTENDED|REG_NOSUB|REG_NEWLINE)) != 0) {
- regerror(result, ®c, errmsg, sizeof(errmsg));
- error("regex \"%s\": %s", regex, errmsg);
+ regerror(result, ®c, errmsg, SIZEOF(errmsg));
+ error(_("regex \"%s\": %s"), regex, errmsg);
+ /*NOTREACHED*/
}
if((result = regexec(®c, str, 0, 0, 0)) != 0
&& result != REG_NOMATCH) {
- regerror(result, ®c, errmsg, sizeof(errmsg));
- error("regex \"%s\": %s", regex, errmsg);
+ regerror(result, ®c, errmsg, SIZEOF(errmsg));
+ error(_("regex \"%s\": %s"), regex, errmsg);
+ /*NOTREACHED*/
}
regfree(®c);
return result == 0;
}
-char *validate_glob(glob)
-char *glob;
+int
+match_no_newline(
+ const char * regex,
+ const char * str)
{
- char *regex = NULL;
+ regex_t regc;
+ int result;
+ char errmsg[STR_SIZE];
+
+ if((result = regcomp(®c, regex,
+ REG_EXTENDED|REG_NOSUB)) != 0) {
+ regerror(result, ®c, errmsg, SIZEOF(errmsg));
+ error(_("regex \"%s\": %s"), regex, errmsg);
+ /*NOTREACHED*/
+ }
+
+ if((result = regexec(®c, str, 0, 0, 0)) != 0
+ && result != REG_NOMATCH) {
+ regerror(result, ®c, errmsg, SIZEOF(errmsg));
+ error(_("regex \"%s\": %s"), regex, errmsg);
+ /*NOTREACHED*/
+ }
+
+ regfree(®c);
+
+ return result == 0;
+}
+
+char *
+validate_glob(
+ const char * glob)
+{
+ char *regex;
regex_t regc;
int result;
static char errmsg[STR_SIZE];
regex = glob_to_regex(glob);
if ((result = regcomp(®c, regex,
REG_EXTENDED|REG_NOSUB|REG_NEWLINE)) != 0) {
- regerror(result, ®c, errmsg, sizeof(errmsg));
+ regerror(result, ®c, errmsg, SIZEOF(errmsg));
amfree(regex);
return errmsg;
}
return NULL;
}
-int match_glob(glob, str)
-char *glob, *str;
+int
+match_glob(
+ const char * glob,
+ const char * str)
{
- char *regex = NULL;
+ char *regex;
regex_t regc;
int result;
char errmsg[STR_SIZE];
regex = glob_to_regex(glob);
if((result = regcomp(®c, regex,
REG_EXTENDED|REG_NOSUB|REG_NEWLINE)) != 0) {
- regerror(result, ®c, errmsg, sizeof(errmsg));
- error("glob \"%s\" -> regex \"%s\": %s", glob, regex, errmsg);
+ regerror(result, ®c, errmsg, SIZEOF(errmsg));
+ error(_("glob \"%s\" -> regex \"%s\": %s"), glob, regex, errmsg);
+ /*NOTREACHED*/
}
if((result = regexec(®c, str, 0, 0, 0)) != 0
&& result != REG_NOMATCH) {
- regerror(result, ®c, errmsg, sizeof(errmsg));
- error("glob \"%s\" -> regex \"%s\": %s", glob, regex, errmsg);
+ regerror(result, ®c, errmsg, SIZEOF(errmsg));
+ error(_("glob \"%s\" -> regex \"%s\": %s"), glob, regex, errmsg);
+ /*NOTREACHED*/
}
regfree(®c);
return result == 0;
}
-char *glob_to_regex(glob)
-char *glob;
+char *
+glob_to_regex(
+ const char * glob)
{
char *regex;
char *r;
last_ch = '\0';
for (ch = *glob++; ch != '\0'; last_ch = ch, ch = *glob++) {
if (last_ch == '\\') {
- *r++ = ch;
+ *r++ = (char)ch;
ch = '\0'; /* so last_ch != '\\' next time */
} else if (last_ch == '[' && ch == '!') {
*r++ = '^';
} else if (ch == '\\') {
- *r++ = ch;
+ *r++ = (char)ch;
} else if (ch == '*' || ch == '?') {
*r++ = '[';
*r++ = '^';
|| ch == '$'
|| ch == '|') {
*r++ = '\\';
- *r++ = ch;
+ *r++ = (char)ch;
} else {
- *r++ = ch;
+ *r++ = (char)ch;
}
}
if (last_ch != '\\') {
}
-int match_tar(glob, str)
-char *glob, *str;
+int
+match_tar(
+ const char * glob,
+ const char * str)
{
- char *regex = NULL;
+ char *regex;
regex_t regc;
int result;
char errmsg[STR_SIZE];
regex = tar_to_regex(glob);
if((result = regcomp(®c, regex,
REG_EXTENDED|REG_NOSUB|REG_NEWLINE)) != 0) {
- regerror(result, ®c, errmsg, sizeof(errmsg));
- error("glob \"%s\" -> regex \"%s\": %s", glob, regex, errmsg);
+ regerror(result, ®c, errmsg, SIZEOF(errmsg));
+ error(_("glob \"%s\" -> regex \"%s\": %s"), glob, regex, errmsg);
+ /*NOTREACHED*/
}
if((result = regexec(®c, str, 0, 0, 0)) != 0
&& result != REG_NOMATCH) {
- regerror(result, ®c, errmsg, sizeof(errmsg));
- error("glob \"%s\" -> regex \"%s\": %s", glob, regex, errmsg);
+ regerror(result, ®c, errmsg, SIZEOF(errmsg));
+ error(_("glob \"%s\" -> regex \"%s\": %s"), glob, regex, errmsg);
+ /*NOTREACHED*/
}
regfree(®c);
return result == 0;
}
-char *tar_to_regex(glob)
-char *glob;
+char *
+tar_to_regex(
+ const char * glob)
{
char *regex;
char *r;
last_ch = '\0';
for (ch = *glob++; ch != '\0'; last_ch = ch, ch = *glob++) {
if (last_ch == '\\') {
- *r++ = ch;
+ *r++ = (char)ch;
ch = '\0'; /* so last_ch != '\\' next time */
} else if (last_ch == '[' && ch == '!') {
*r++ = '^';
} else if (ch == '\\') {
- *r++ = ch;
+ *r++ = (char)ch;
} else if (ch == '*') {
*r++ = '.';
*r++ = '*';
|| ch == '$'
|| ch == '|') {
*r++ = '\\';
- *r++ = ch;
+ *r++ = (char)ch;
} else {
- *r++ = ch;
+ *r++ = (char)ch;
}
}
if (last_ch != '\\') {
}
-int match_word(glob, word, separator)
-char *glob, *word;
-char separator;
+static int
+match_word(
+ const char * glob,
+ const char * word,
+ const char separator)
{
char *regex;
char *r;
size_t lenword;
char *nword;
char *nglob;
- char *g, *w;
+ char *g;
+ const char *w;
int i;
lenword = strlen(word);
for (ch = *g++; ch != '\0'; last_ch = ch, ch = *g++) {
next_ch = *g;
if (last_ch == '\\') {
- *r++ = ch;
+ *r++ = (char)ch;
ch = '\0'; /* so last_ch != '\\' next time */
} else if (last_ch == '[' && ch == '!') {
*r++ = '^';
} else if (ch == '\\') {
- *r++ = ch;
+ *r++ = (char)ch;
} else if (ch == '*' || ch == '?') {
if(ch == '*' && next_ch == '*') {
*r++ = '.';
*r++ = '\\';
*r++ = separator;
}
- *r++ = ch;
+ *r++ = (char)ch;
} else if ( ch == '('
|| ch == ')'
|| ch == '{'
|| ch == '$'
|| ch == '|') {
*r++ = '\\';
- *r++ = ch;
+ *r++ = (char)ch;
} else {
- *r++ = ch;
+ *r++ = (char)ch;
}
}
if(last_ch != '\\') {
}
-int match_host(glob, host)
-char *glob, *host;
+int
+match_host(
+ const char * glob,
+ const char * host)
{
char *lglob, *lhost;
- char *c, *d;
+ char *c;
+ const char *d;
int i;
lglob = (char *)alloc(strlen(glob)+1);
c = lglob, d=glob;
while( *d != '\0')
- *c++ = tolower(*d++);
+ *c++ = (char)tolower(*d++);
*c = *d;
lhost = (char *)alloc(strlen(host)+1);
c = lhost, d=host;
while( *d != '\0')
- *c++ = tolower(*d++);
+ *c++ = (char)tolower(*d++);
*c = *d;
- i = match_word(lglob, lhost, '.');
+ i = match_word(lglob, lhost, (int)'.');
amfree(lglob);
amfree(lhost);
return i;
}
-int match_disk(glob, disk)
-char *glob, *disk;
+int
+match_disk(
+ const char * glob,
+ const char * disk)
{
return match_word(glob, disk, '/');
}
-int match_datestamp(dateexp, datestamp)
-char *dateexp, *datestamp;
+static int
+alldigits(
+ const char *str)
+{
+ while (*str) {
+ if (!isdigit((int)*(str++)))
+ return 0;
+ }
+ return 1;
+}
+
+int
+match_datestamp(
+ const char * dateexp,
+ const char * datestamp)
{
char *dash;
size_t len, len_suffix;
- int len_prefix;
+ size_t len_prefix;
char firstdate[100], lastdate[100];
char mydateexp[100];
int match_exact;
if(strlen(dateexp) >= 100 || strlen(dateexp) < 1) {
- error("Illegal datestamp expression %s",dateexp);
+ goto illegal;
}
+ /* strip and ignore an initial "^" */
if(dateexp[0] == '^') {
- strncpy(mydateexp, dateexp+1, strlen(dateexp)-1);
- mydateexp[strlen(dateexp)-1] = '\0';
+ strncpy(mydateexp, dateexp+1, sizeof(mydateexp)-1);
+ mydateexp[sizeof(mydateexp)-1] = '\0';
}
else {
- strncpy(mydateexp, dateexp, strlen(dateexp));
- mydateexp[strlen(dateexp)] = '\0';
+ strncpy(mydateexp, dateexp, sizeof(mydateexp)-1);
+ mydateexp[sizeof(mydateexp)-1] = '\0';
}
- if(mydateexp[strlen(mydateexp)] == '$') {
+ if(mydateexp[strlen(mydateexp)-1] == '$') {
match_exact = 1;
- mydateexp[strlen(mydateexp)] = '\0';
+ mydateexp[strlen(mydateexp)-1] = '\0'; /* strip the trailing $ */
}
else
match_exact = 0;
+ /* a single dash represents a date range */
if((dash = strchr(mydateexp,'-'))) {
- if(match_exact == 1) {
- error("Illegal datestamp expression %s",dateexp);
+ if(match_exact == 1 || strchr(dash+1, '-')) {
+ goto illegal;
}
- len = dash - mydateexp;
- len_suffix = strlen(dash) - 1;
- len_prefix = len - len_suffix;
- if(len_prefix < 0) {
- error("Illegal datestamp expression %s",dateexp);
- }
+ /* format: XXXYYYY-ZZZZ, indicating dates XXXYYYY to XXXZZZZ */
+
+ len = (size_t)(dash - mydateexp); /* length of XXXYYYY */
+ len_suffix = strlen(dash) - 1; /* length of ZZZZ */
+ if (len_suffix > len) goto illegal;
+ len_prefix = len - len_suffix; /* length of XXX */
dash++;
+
strncpy(firstdate, mydateexp, len);
firstdate[len] = '\0';
strncpy(lastdate, mydateexp, len_prefix);
strncpy(&(lastdate[len_prefix]), dash, len_suffix);
lastdate[len] = '\0';
+ if (!alldigits(firstdate) || !alldigits(lastdate))
+ goto illegal;
+ if (strncmp(firstdate, lastdate, strlen(firstdate)) > 0)
+ goto illegal;
return ((strncmp(datestamp, firstdate, strlen(firstdate)) >= 0) &&
(strncmp(datestamp, lastdate , strlen(lastdate)) <= 0));
}
else {
+ if (!alldigits(mydateexp))
+ goto illegal;
if(match_exact == 1) {
return (strcmp(datestamp, mydateexp) == 0);
}
return (strncmp(datestamp, mydateexp, strlen(mydateexp)) == 0);
}
}
+illegal:
+ error(_("Illegal datestamp expression %s"),dateexp);
+ /*NOTREACHED*/
}
-int match_level(levelexp, level)
-char *levelexp, *level;
+int
+match_level(
+ const char * levelexp,
+ const char * level)
{
char *dash;
size_t len, len_suffix;
- int len_prefix;
+ size_t len_prefix;
char lowend[100], highend[100];
char mylevelexp[100];
int match_exact;
if(strlen(levelexp) >= 100 || strlen(levelexp) < 1) {
- error("Illegal level expression %s",levelexp);
+ error(_("Illegal level expression %s"),levelexp);
+ /*NOTREACHED*/
}
if(levelexp[0] == '^') {
if((dash = strchr(mylevelexp,'-'))) {
if(match_exact == 1) {
- error("Illegal level expression %s",levelexp);
+ error(_("Illegal level expression %s"),levelexp);
+ /*NOTREACHED*/
}
- len = dash - mylevelexp;
+ len = (size_t)(dash - mylevelexp);
len_suffix = strlen(dash) - 1;
len_prefix = len - len_suffix;
- if(len_prefix < 0) {
- error("Illegal level expression %s",levelexp);
- }
-
dash++;
strncpy(lowend, mylevelexp, len);
lowend[len] = '\0';