| 1627 | |
| 1628 | |
| 1629 | AP_DECLARE(const char *) ap_soak_end_container(cmd_parms *cmd, char *directive) |
| 1630 | { |
| 1631 | struct ap_varbuf vb; |
| 1632 | const char *args; |
| 1633 | char *cmd_name; |
| 1634 | apr_status_t rc; |
| 1635 | apr_size_t max_len = VARBUF_MAX_LEN; |
| 1636 | if (cmd->pool == cmd->temp_pool) |
| 1637 | max_len = HUGE_STRING_LEN; /* lower limit for .htaccess */ |
| 1638 | |
| 1639 | ap_varbuf_init(cmd->temp_pool, &vb, VARBUF_INIT_LEN); |
| 1640 | |
| 1641 | while ((rc = ap_varbuf_cfg_getline(&vb, cmd->config_file, max_len)) |
| 1642 | == APR_SUCCESS) { |
| 1643 | args = vb.buf; |
| 1644 | |
| 1645 | cmd_name = ap_getword_conf(cmd->temp_pool, &args); |
| 1646 | if (cmd_name[0] == '<') { |
| 1647 | if (cmd_name[1] == '/') { |
| 1648 | cmd_name[strlen(cmd_name) - 1] = '\0'; |
| 1649 | |
| 1650 | if (ap_cstr_casecmp(cmd_name + 2, directive + 1) != 0) { |
| 1651 | return apr_pstrcat(cmd->pool, "Expected </", |
| 1652 | directive + 1, "> but saw ", |
| 1653 | cmd_name, ">", NULL); |
| 1654 | } |
| 1655 | |
| 1656 | ap_varbuf_free(&vb); |
| 1657 | return NULL; /* found end of container */ |
| 1658 | } |
| 1659 | else { |
| 1660 | const char *msg; |
| 1661 | |
| 1662 | if (*args == '\0' && cmd_name[strlen(cmd_name) - 1] == '>') { |
| 1663 | cmd_name[strlen(cmd_name) - 1] = '\0'; |
| 1664 | } |
| 1665 | |
| 1666 | if ((msg = ap_soak_end_container(cmd, cmd_name)) != NULL) { |
| 1667 | return msg; |
| 1668 | } |
| 1669 | } |
| 1670 | } |
| 1671 | } |
| 1672 | if (rc != APR_EOF && rc != APR_SUCCESS) |
| 1673 | return ap_pcfg_strerror(cmd->temp_pool, cmd->config_file, rc); |
| 1674 | |
| 1675 | return apr_pstrcat(cmd->pool, "Expected </", |
| 1676 | directive + 1, "> before end of configuration", |
| 1677 | NULL); |
| 1678 | } |
| 1679 | |
| 1680 | static const char *execute_now(char *cmd_line, const char *args, |
| 1681 | cmd_parms *parms, |
no test coverage detected