#endif
#ifndef NO_WRITEV
+#ifndef NETWARE
#include <sys/types.h>
+#endif
#include <sys/uio.h>
#endif
return OK;
}
else if ( (strlen(r->filename) > 7 &&
- strncasecmp(r->filename, "http://", 7) == 0)
+ strncasecmp(r->filename, "http://", 7) == 0)
|| (strlen(r->filename) > 8 &&
- strncasecmp(r->filename, "https://", 8) == 0)
+ strncasecmp(r->filename, "https://", 8) == 0)
|| (strlen(r->filename) > 9 &&
strncasecmp(r->filename, "gopher://", 9) == 0)
|| (strlen(r->filename) > 6 &&
- strncasecmp(r->filename, "ftp://", 6) == 0) ) {
+ strncasecmp(r->filename, "ftp://", 6) == 0)
+ || (strlen(r->filename) > 5 &&
+ strncasecmp(r->filename, "ldap:", 5) == 0)
+ || (strlen(r->filename) > 5 &&
+ strncasecmp(r->filename, "news:", 5) == 0)
+ || (strlen(r->filename) > 7 &&
+ strncasecmp(r->filename, "mailto:", 7) == 0)) {
/* it was finally rewritten to a remote URL */
/* skip 'scheme:' */
/* append the QUERY_STRING part */
if (r->args != NULL) {
- r->filename = ap_pstrcat(r->pool, r->filename,
- "?", r->args, NULL);
+ r->filename = ap_pstrcat(r->pool, r->filename, "?",
+ ap_escape_uri(r->pool, r->args), NULL);
}
/* determine HTTP redirect response code */
/* it was finally rewritten to a local path */
/* expand "/~user" prefix */
-#ifndef WIN32
+#if !defined(WIN32) && !defined(NETWARE)
r->filename = expand_tildepaths(r, r->filename);
#endif
rewritelog(r, 2, "local path result: %s", r->filename);
* (r->path_info was already appended by the
* rewriting engine because of the per-dir context!)
*/
- if (r->args != NULL
- && r->uri == r->unparsed_uri) {
- /* see proxy_http:proxy_http_canon() */
+ if (r->args != NULL) {
r->filename = ap_pstrcat(r->pool, r->filename,
"?", r->args, NULL);
}
return OK;
}
else if ( (strlen(r->filename) > 7 &&
- strncmp(r->filename, "http://", 7) == 0)
- || (strlen(r->filename) > 8 &&
- strncmp(r->filename, "https://", 8) == 0)
+ strncasecmp(r->filename, "http://", 7) == 0)
+ || (strlen(r->filename) > 8 &&
+ strncasecmp(r->filename, "https://", 8) == 0)
|| (strlen(r->filename) > 9 &&
- strncmp(r->filename, "gopher://", 9) == 0)
+ strncasecmp(r->filename, "gopher://", 9) == 0)
|| (strlen(r->filename) > 6 &&
- strncmp(r->filename, "ftp://", 6) == 0) ) {
+ strncasecmp(r->filename, "ftp://", 6) == 0)
+ || (strlen(r->filename) > 5 &&
+ strncasecmp(r->filename, "ldap:", 5) == 0)
+ || (strlen(r->filename) > 5 &&
+ strncasecmp(r->filename, "news:", 5) == 0)
+ || (strlen(r->filename) > 7 &&
+ strncasecmp(r->filename, "mailto:", 7) == 0)) {
/* it was finally rewritten to a remote URL */
/* because we are in a per-dir context
/* append the QUERY_STRING part */
if (r->args != NULL) {
- r->filename = ap_pstrcat(r->pool, r->filename,
- "?", r->args, NULL);
+ r->filename = ap_pstrcat(r->pool, r->filename, "?",
+ ap_escape_uri(r->pool, r->args), NULL);
}
/* determine HTTP redirect response code */
i = strlen(r->filename);
if ( prefixstrip
&& !( r->filename[0] == '/'
- || ( (i > 7 && strncasecmp(r->filename, "http://", 7) == 0)
- || (i > 8 && strncasecmp(r->filename, "https://", 8) == 0)
+ || ( (i > 7 && strncasecmp(r->filename, "http://", 7) == 0)
+ || (i > 8 && strncasecmp(r->filename, "https://", 8) == 0)
|| (i > 9 && strncasecmp(r->filename, "gopher://", 9) == 0)
- || (i > 6 && strncasecmp(r->filename, "ftp://", 6) == 0)))) {
+ || (i > 6 && strncasecmp(r->filename, "ftp://", 6) == 0)
+ || (i > 5 && strncasecmp(r->filename, "ldap:", 5) == 0)
+ || (i > 5 && strncasecmp(r->filename, "news:", 5) == 0)
+ || (i > 7 && strncasecmp(r->filename, "mailto:", 7) == 0)))) {
rewritelog(r, 3, "[per-dir %s] add per-dir prefix: %s -> %s%s",
perdir, r->filename, perdir, r->filename);
r->filename = ap_pstrcat(r->pool, perdir, r->filename, NULL);
* directly force an external HTTP redirect.
*/
i = strlen(r->filename);
- if ( (i > 7 && strncasecmp(r->filename, "http://", 7) == 0)
- || (i > 8 && strncasecmp(r->filename, "https://", 8) == 0)
+ if ( (i > 7 && strncasecmp(r->filename, "http://", 7) == 0)
+ || (i > 8 && strncasecmp(r->filename, "https://", 8) == 0)
|| (i > 9 && strncasecmp(r->filename, "gopher://", 9) == 0)
- || (i > 6 && strncasecmp(r->filename, "ftp://", 6) == 0)) {
+ || (i > 6 && strncasecmp(r->filename, "ftp://", 6) == 0)
+ || (i > 5 && strncasecmp(r->filename, "ldap:", 5) == 0)
+ || (i > 5 && strncasecmp(r->filename, "news:", 5) == 0)
+ || (i > 7 && strncasecmp(r->filename, "mailto:", 7) == 0) ) {
if (perdir == NULL) {
rewritelog(r, 2,
"implicitly forcing redirect (rc=%d) with %s",
int port;
i = strlen(r->filename);
- if (!( (i > 7 && strncasecmp(r->filename, "http://", 7) == 0)
- || (i > 8 && strncasecmp(r->filename, "https://", 8) == 0)
+ if (!( (i > 7 && strncasecmp(r->filename, "http://", 7) == 0)
+ || (i > 8 && strncasecmp(r->filename, "https://", 8) == 0)
|| (i > 9 && strncasecmp(r->filename, "gopher://", 9) == 0)
- || (i > 6 && strncasecmp(r->filename, "ftp://", 6) == 0))) {
+ || (i > 6 && strncasecmp(r->filename, "ftp://", 6) == 0)
+ || (i > 5 && strncasecmp(r->filename, "ldap:", 5) == 0)
+ || (i > 5 && strncasecmp(r->filename, "news:", 5) == 0)
+ || (i > 7 && strncasecmp(r->filename, "mailto:", 7) == 0))) {
thisserver = ap_get_server_name(r);
port = ap_get_server_port(r);
static void expand_backref_inbuffer(ap_context_t *p, char *buf, int nbuf,
backrefinfo *bri, char c)
{
- int i;
-
- if (bri->nsub < 1) {
- return;
- }
+ register int i;
- if (c != '$') {
- /* safe existing $N backrefs and replace <c>N with $N backrefs */
- for (i = 0; buf[i] != '\0' && i < nbuf; i++) {
- if (buf[i] == '$' && (buf[i+1] >= '0' && buf[i+1] <= '9')) {
- buf[i++] = '\001';
- }
- else if (buf[i] == c && (buf[i+1] >= '0' && buf[i+1] <= '9')) {
- buf[i++] = '$';
- }
+ /* protect existing $N and & backrefs and replace <c>N with $N backrefs */
+ for (i = 0; buf[i] != '\0' && i < nbuf; i++) {
+ if (buf[i] == '\\' && (buf[i+1] != '\0' && i < (nbuf-1))) {
+ i++; /* protect next */
+ }
+ else if (buf[i] == '&') {
+ buf[i] = '\001';
+ }
+ else if (c != '$' && buf[i] == '$' && (buf[i+1] >= '0' && buf[i+1] <= '9')) {
+ buf[i] = '\002';
+ i++; /* speedup */
+ }
+ else if (buf[i] == c && (buf[i+1] >= '0' && buf[i+1] <= '9')) {
+ buf[i] = '$';
+ i++; /* speedup */
}
}
- /* now apply the pregsub() function */
+ /* now apply the standard regex substitution function */
ap_cpystrn(buf, ap_pregsub(p, buf, bri->source,
- bri->nsub+1, bri->regmatch), nbuf);
+ bri->nsub+1, bri->regmatch), nbuf);
- if (c != '$') {
- /* restore the original $N backrefs */
- for (i = 0; buf[i] != '\0' && i < nbuf; i++) {
- if (buf[i] == '\001' && (buf[i+1] >= '0' && buf[i+1] <= '9')) {
- buf[i++] = '$';
- }
+ /* restore the original $N and & backrefs */
+ for (i = 0; buf[i] != '\0' && i < nbuf; i++) {
+ if (buf[i] == '\001') {
+ buf[i] = '&';
+ }
+ else if (buf[i] == '\002') {
+ buf[i] = '$';
}
}
}
** Unix /etc/passwd database information
**
*/
-#ifndef WIN32
+#if !defined(WIN32) && !defined(NETWARE)
static char *expand_tildepaths(request_rec *r, char *uri)
{
char user[LONG_STRING_LEN];
static int rewrite_rand(int l, int h)
{
- int i;
- char buf[50];
-
rewrite_rand_init();
- ap_snprintf(buf, sizeof(buf), "%.0f",
- (((double)(rand()%RAND_MAX)/RAND_MAX)*(h-l)));
- i = atoi(buf)+1;
- if (i < l) i = l;
- if (i > h) i = h;
- return i;
+
+ /* Get [0,1) and then scale to the appropriate range. Note that using
+ * a floating point value ensures that we use all bits of the rand()
+ * result. Doing an integer modulus would only use the lower-order bits
+ * which may not be as uniformly random.
+ */
+ return ((double)(rand() % RAND_MAX) / RAND_MAX) * (h - l + 1) + l;
}
static char *select_random_value_part(request_rec *r, char *value)
"file %s", lockname);
exit(1);
}
-#if !defined(OS2) && !defined(WIN32)
+#if !defined(OS2) && !defined(WIN32) && !defined(NETWARE)
/* make sure the childs have access to this file */
if (geteuid() == 0 /* is superuser */)
chown(lockname, unixd_config.user_id, -1 /* no gid change */);
LOOKAHEAD(ap_sub_req_lookup_file)
}
-#ifndef WIN32
+#if !defined(WIN32) && !defined(NETWARE)
/* Win32 has a rather different view of file ownerships.
For now, just forget it */
}
}
}
-#endif /* ndef WIN32 */
+#endif /* ndef WIN32 && NETWARE*/
if (result == NULL) {
return ap_pstrdup(r->pool, "");
return 0;
}
-
+#ifdef NETWARE
+int main(int argc, char *argv[])
+{
+ ExitThread(TSR_THREAD, 0);
+}
+#endif
+
/*EOF*/