From: Jim Jagielski Date: Tue, 29 Dec 2015 22:40:21 +0000 (+0000) Subject: Ok... allow for getting "words" by also allowing the X-Git-Tag: 2.5.0-alpha~2483 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d8838f491b8a1766596b5068c5f903a848378095;p=thirdparty%2Fapache%2Fhttpd.git Ok... allow for getting "words" by also allowing the use of curlies... That is: "Hello World" Foo Bar and {Hello World} Foo Bar will both return the same if using ap_getword_conf2() git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1722243 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/include/ap_mmn.h b/include/ap_mmn.h index 7e05d865829..db83904ba13 100644 --- a/include/ap_mmn.h +++ b/include/ap_mmn.h @@ -496,6 +496,7 @@ * conn_rec. * 20150222.6 (2.5.0-dev) Add async_filter to conn_rec. * 20150222.7 (2.5.0-dev) Add ap_casecmpstr[n](); + * 20150222.8 (2.5.0-dev) Add ap_getword_conf2[_nc](); */ #define MODULE_MAGIC_COOKIE 0x41503235UL /* "AP25" */ diff --git a/include/httpd.h b/include/httpd.h index 1ac9a23f2e9..eda314c7cf7 100644 --- a/include/httpd.h +++ b/include/httpd.h @@ -1532,6 +1532,25 @@ AP_DECLARE(char *) ap_getword_conf(apr_pool_t *p, const char **line); */ AP_DECLARE(char *) ap_getword_conf_nc(apr_pool_t *p, char **line); +/** + * Get the second word in the string paying attention to quoting. + * The format {...} can be used instead of quotes with this implementation + * @param p The pool to allocate from + * @param line The line to traverse + * @return A copy of the string + */ +AP_DECLARE(char *) ap_getword_conf2(apr_pool_t *p, const char **line); + +/** + * Get the second word in the string paying attention to quoting + * The format {...} can be used instead of quotes with this implementation + * @param p The pool to allocate from + * @param line The line to traverse + * @return A copy of the string + * @note The same as ap_getword_conf2(), except it doesn't use const char **. + */ +AP_DECLARE(char *) ap_getword_conf2_nc(apr_pool_t *p, char **line); + /** * Check a string for any config define or environment variable construct * and replace each of them by the value of that variable, if it exists. diff --git a/server/util.c b/server/util.c index 62299f7c303..0f709de826f 100644 --- a/server/util.c +++ b/server/util.c @@ -772,16 +772,12 @@ static char *substring_conf(apr_pool_t *p, const char *start, int len, #endif } -AP_DECLARE(char *) ap_getword_conf_nc(apr_pool_t *p, char **line) -{ - return ap_getword_conf(p, (const char **) line); -} - -AP_DECLARE(char *) ap_getword_conf(apr_pool_t *p, const char **line) +static char *getword_conf_ex(apr_pool_t *p, const char **line, int curlyok) { const char *str = *line, *strend; char *res; char quote; + char curly = '{'; while (apr_isspace(*str)) ++str; @@ -791,7 +787,11 @@ AP_DECLARE(char *) ap_getword_conf(apr_pool_t *p, const char **line) return ""; } - if ((quote = *str) == '"' || quote == '\'') { + if ((quote = *str) == '"' || quote == '\'' || quote == (curlyok ? curly : '\'')) { + if (quote == curly) { + /* only true if curlyok and we matched */ + quote = '}'; + } strend = str + 1; while (*strend && *strend != quote) { if (*strend == '\\' && strend[1] && @@ -821,6 +821,26 @@ AP_DECLARE(char *) ap_getword_conf(apr_pool_t *p, const char **line) return res; } +AP_DECLARE(char *) ap_getword_conf_nc(apr_pool_t *p, char **line) +{ + return getword_conf_ex(p, (const char **) line, 0); +} + +AP_DECLARE(char *) ap_getword_conf(apr_pool_t *p, const char **line) +{ + return getword_conf_ex(p, line, 0); +} + +AP_DECLARE(char *) ap_getword_conf2_nc(apr_pool_t *p, char **line) +{ + return getword_conf_ex(p, (const char **) line, 1); +} + +AP_DECLARE(char *) ap_getword_conf2(apr_pool_t *p, const char **line) +{ + return getword_conf_ex(p, line, 1); +} + AP_DECLARE(int) ap_cfg_closefile(ap_configfile_t *cfp) { #ifdef DEBUG