randy 97/09/14 15:19:04
Modified: src/main util.c util_date.c util_date.h util_md5.c util_md5.h util_script.c util_script.h util_snprintf.c Log: indent Revision Changes Path 1.69 +693 -594 apachen/src/main/util.c Index: util.c =================================================================== RCS file: /export/home/cvs/apachen/src/main/util.c,v retrieving revision 1.68 retrieving revision 1.69 diff -u -r1.68 -r1.69 --- util.c 1997/08/28 01:37:00 1.68 +++ util.c 1997/09/14 22:18:57 1.69 @@ -61,51 +61,56 @@ #include "httpd.h" #include "http_conf_globals.h" /* for user_id & group_id */ -const char month_snames[12][4] = { - "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" +const char month_snames[12][4] = +{ + "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; -API_EXPORT(char *) get_time() { +API_EXPORT(char *) get_time() +{ time_t t; char *time_string; - t=time(NULL); + t = time(NULL); time_string = ctime(&t); time_string[strlen(time_string) - 1] = '\0'; return (time_string); } -API_EXPORT(char *) ht_time(pool *p, time_t t, const char *fmt, int gmt) { +API_EXPORT(char *) ht_time(pool *p, time_t t, const char *fmt, int gmt) +{ char ts[MAX_STRING_LEN]; struct tm *tms; tms = (gmt ? gmtime(&t) : localtime(&t)); /* check return code? */ - strftime(ts,MAX_STRING_LEN,fmt,tms); - return pstrdup (p, ts); + strftime(ts, MAX_STRING_LEN, fmt, tms); + return pstrdup(p, ts); } -API_EXPORT(char *) gm_timestr_822(pool *p, time_t sec) { - static const char *const days[7]= - {"Sun","Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; +API_EXPORT(char *) gm_timestr_822(pool *p, time_t sec) +{ + static const char *const days[7] = + {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; char ts[50]; struct tm *tms; tms = gmtime(&sec); -/* RFC date format; as strftime '%a, %d %b %Y %T GMT' */ - ap_snprintf(ts, sizeof(ts), - "%s, %.2d %s %d %.2d:%.2d:%.2d GMT", days[tms->tm_wday], - tms->tm_mday, month_snames[tms->tm_mon], tms->tm_year + 1900, - tms->tm_hour, tms->tm_min, tms->tm_sec); + /* RFC date format; as strftime '%a, %d %b %Y %T GMT' */ + ap_snprintf(ts, sizeof(ts), + "%s, %.2d %s %d %.2d:%.2d:%.2d GMT", days[tms->tm_wday], + tms->tm_mday, month_snames[tms->tm_mon], tms->tm_year + 1900, + tms->tm_hour, tms->tm_min, tms->tm_sec); - return pstrdup (p, ts); + return pstrdup(p, ts); } /* What a pain in the ass. */ #if defined(HAVE_GMTOFF) -API_EXPORT(struct tm *) get_gmtoff(int *tz) { +API_EXPORT(struct tm *) get_gmtoff(int *tz) +{ time_t tt = time(NULL); struct tm *t; @@ -114,18 +119,19 @@ return t; } #else -API_EXPORT(struct tm *) get_gmtoff(int *tz) { +API_EXPORT(struct tm *) get_gmtoff(int *tz) +{ time_t tt = time(NULL); struct tm gmt; struct tm *t; int days, hours, minutes; /* Assume we are never more than 24 hours away. */ - gmt = *gmtime(&tt); /* remember gmtime/localtime return ptr to static */ - t = localtime(&tt); /* buffer... so be careful */ + gmt = *gmtime(&tt); /* remember gmtime/localtime return ptr to static */ + t = localtime(&tt); /* buffer... so be careful */ days = t->tm_yday - gmt.tm_yday; hours = ((days < -1 ? 24 : 1 < days ? -24 : days * 24) - + t->tm_hour - gmt.tm_hour); + + t->tm_hour - gmt.tm_hour); minutes = hours * 60 + t->tm_min - gmt.tm_min; *tz = minutes; return t; @@ -133,62 +139,65 @@ #endif -/* Match = 0, NoMatch = 1, Abort = -1 */ -/* Based loosely on sections of wildmat.c by Rich Salz +/* Match = 0, NoMatch = 1, Abort = -1 + * Based loosely on sections of wildmat.c by Rich Salz * Hmmm... shouldn't this really go component by component? */ -API_EXPORT(int) strcmp_match(const char *str, const char *exp) { - int x,y; +API_EXPORT(int) strcmp_match(const char *str, const char *exp) +{ + int x, y; - for(x=0,y=0;exp[y];++y,++x) { - if((!str[x]) && (exp[y] != '*')) - return -1; - if(exp[y] == '*') { - while(exp[++y] == '*'); - if(!exp[y]) - return 0; - while(str[x]) { - int ret; - if((ret = strcmp_match(&str[x++],&exp[y])) != 1) - return ret; - } - return -1; - } else - if((exp[y] != '?') && (str[x] != exp[y])) - return 1; + for (x = 0, y = 0; exp[y]; ++y, ++x) { + if ((!str[x]) && (exp[y] != '*')) + return -1; + if (exp[y] == '*') { + while (exp[++y] == '*'); + if (!exp[y]) + return 0; + while (str[x]) { + int ret; + if ((ret = strcmp_match(&str[x++], &exp[y])) != 1) + return ret; + } + return -1; + } + else if ((exp[y] != '?') && (str[x] != exp[y])) + return 1; } return (str[x] != '\0'); } -API_EXPORT(int) strcasecmp_match(const char *str, const char *exp) { - int x,y; +API_EXPORT(int) strcasecmp_match(const char *str, const char *exp) +{ + int x, y; - for(x=0,y=0;exp[y];++y,++x) { - if((!str[x]) && (exp[y] != '*')) - return -1; - if(exp[y] == '*') { - while(exp[++y] == '*'); - if(!exp[y]) - return 0; - while(str[x]) { - int ret; - if((ret = strcasecmp_match(&str[x++],&exp[y])) != 1) - return ret; - } - return -1; - } else - if((exp[y] != '?') && (tolower(str[x]) != tolower(exp[y]))) - return 1; + for (x = 0, y = 0; exp[y]; ++y, ++x) { + if ((!str[x]) && (exp[y] != '*')) + return -1; + if (exp[y] == '*') { + while (exp[++y] == '*'); + if (!exp[y]) + return 0; + while (str[x]) { + int ret; + if ((ret = strcasecmp_match(&str[x++], &exp[y])) != 1) + return ret; + } + return -1; + } + else if ((exp[y] != '?') && (tolower(str[x]) != tolower(exp[y]))) + return 1; } return (str[x] != '\0'); } -API_EXPORT(int) is_matchexp(const char *str) { +API_EXPORT(int) is_matchexp(const char *str) +{ register int x; - for(x=0;str[x];x++) - if((str[x] == '*') || (str[x] == '?')) - return 1; + for (x = 0; str[x]; x++) + if ((str[x] == '*') || (str[x] == '?')) + return 1; return 0; } @@ -207,15 +216,18 @@ */ API_EXPORT(char *) pregsub(pool *p, const char *input, const char *source, - size_t nmatch, regmatch_t pmatch[]) { + size_t nmatch, regmatch_t pmatch[]) +{ const char *src = input; char *dest, *dst; char c; size_t no; int len; - if (!source) return NULL; - if (!nmatch) return pstrdup(p, src); + if (!source) + return NULL; + if (!nmatch) + return pstrdup(p, src); /* First pass, find the size */ @@ -228,12 +240,13 @@ no = *src++ - '0'; else no = 10; - - if (no > 9) { /* Ordinary character. */ + + if (no > 9) { /* Ordinary character. */ if (c == '\\' && (*src == '$' || *src == '&')) c = *src++; len++; - } else if (no < nmatch && pmatch[no].rm_so < pmatch[no].rm_eo) { + } + else if (no < nmatch && pmatch[no].rm_so < pmatch[no].rm_eo) { len += pmatch[no].rm_eo - pmatch[no].rm_so; } @@ -252,22 +265,23 @@ no = *src++ - '0'; else no = 10; - - if (no > 9) { /* Ordinary character. */ + + if (no > 9) { /* Ordinary character. */ if (c == '\\' && (*src == '$' || *src == '&')) c = *src++; *dst++ = c; - } else if (no < nmatch && pmatch[no].rm_so < pmatch[no].rm_eo) { + } + else if (no < nmatch && pmatch[no].rm_so < pmatch[no].rm_eo) { len = pmatch[no].rm_eo - pmatch[no].rm_so; strncpy(dst, source + pmatch[no].rm_so, len); dst += len; - if (*(dst-1) == '\0') /* strncpy hit NULL. */ + if (*(dst - 1) == '\0') /* strncpy hit NULL. */ return NULL; } } *dst = '\0'; - + return dest; } @@ -281,62 +295,70 @@ /* Four paseses, as per RFC 1808 */ /* a) remove ./ path segments */ - for (l=0, w=0; name[l] != '\0';) - { - if (name[l] == '.' && name[l+1] == '/' && (l == 0 || name[l-1] == '/')) + for (l = 0, w = 0; name[l] != '\0';) { + if (name[l] == '.' && name[l + 1] == '/' && (l == 0 || name[l - 1] == '/')) l += 2; else name[w++] = name[l++]; } /* b) remove trailing . path, segment */ - if (w == 1 && name[0] == '.') w--; - else if (w > 1 && name[w-1] == '.' && name[w-2] == '/') w--; + if (w == 1 && name[0] == '.') + w--; + else if (w > 1 && name[w - 1] == '.' && name[w - 2] == '/') + w--; name[w] = '\0'; /* c) remove all xx/../ segments. (including leading ../ and /../) */ l = 0; - while(name[l]!='\0') { - if(name[l] == '.' && name[l+1] == '.' && name[l+2] == '/' && - (l == 0 || name[l-1] == '/')) { - register int m=l+3,n; - - l=l-2; - if(l>=0) { - while(l >= 0 && name[l] != '/') l--; - l++; - } - else l=0; - n=l; - while((name[n]=name[m])) (++n,++m); - } - else ++l; + while (name[l] != '\0') { + if (name[l] == '.' && name[l + 1] == '.' && name[l + 2] == '/' && + (l == 0 || name[l - 1] == '/')) { + register int m = l + 3, n; + + l = l - 2; + if (l >= 0) { + while (l >= 0 && name[l] != '/') + l--; + l++; + } + else + l = 0; + n = l; + while ((name[n] = name[m])) + (++n, ++m); + } + else + ++l; } /* d) remove trailing xx/.. segment. */ - if (l == 2 && name[0] == '.' && name[1] == '.') name[0] = '\0'; - else if (l > 2 && name[l-1] == '.' && name[l-2] == '.' && name[l-3] == '/') - { + if (l == 2 && name[0] == '.' && name[1] == '.') + name[0] = '\0'; + else if (l > 2 && name[l - 1] == '.' && name[l - 2] == '.' && name[l - 3] == '/') { l = l - 4; - if (l >= 0) - { - while (l >= 0 && name[l] != '/') l--; + if (l >= 0) { + while (l >= 0 && name[l] != '/') + l--; l++; } - else l = 0; + else + l = 0; name[l] = '\0'; } -} +} -API_EXPORT(void) no2slash(char *name) { - register int x,y; +API_EXPORT(void) no2slash(char *name) +{ + register int x, y; - for(x=0; name[x];) - if(x && (name[x-1] == '/') && (name[x] == '/')) - for(y=x+1;name[y-1];y++) - name[y-1] = name[y]; - else x++; + for (x = 0; name[x];) + if (x && (name[x - 1] == '/') && (name[x] == '/')) + for (y = x + 1; name[y - 1]; y++) + name[y - 1] = name[y]; + else + x++; } @@ -352,15 +374,16 @@ * /a/b, 3 ==> /a/b/ * /a/b, 4 ==> /a/b/ */ -API_EXPORT(char *) make_dirstr_prefix (char *d, const char *s, int n) +API_EXPORT(char *) make_dirstr_prefix(char *d, const char *s, int n) { - for(;;) { + for (;;) { *d = *s; if (*d == '\0') { *d = '/'; break; } - if (*d == '/' && (--n) == 0 ) break; + if (*d == '/' && (--n) == 0) + break; ++d; ++s; } @@ -372,19 +395,19 @@ /* * return the parent directory name including trailing / of the file s */ -API_EXPORT(char *) make_dirstr_parent (pool *p, const char *s) +API_EXPORT(char *) make_dirstr_parent(pool *p, const char *s) { - char *last_slash = strrchr (s, '/'); + char *last_slash = strrchr(s, '/'); char *d; int l; if (last_slash == NULL) { /* XXX: well this is really broken if this happens */ - return (pstrdup (p,"/")); + return (pstrdup(p, "/")); } - l = (last_slash-s)+1; - d = palloc (p, l+1); - memcpy (d, s, l); + l = (last_slash - s) + 1; + d = palloc(p, l + 1); + memcpy(d, s, l); d[l] = 0; return (d); } @@ -394,32 +417,35 @@ * This function is deprecated. Use one of the preceeding two functions * which are faster. */ -API_EXPORT(char *) make_dirstr(pool *p, const char *s, int n) { - register int x,f; +API_EXPORT(char *) make_dirstr(pool *p, const char *s, int n) +{ + register int x, f; char *res; - for(x=0,f=0;s[x];x++) { - if(s[x] == '/') - if((++f) == n) { + for (x = 0, f = 0; s[x]; x++) { + if (s[x] == '/') + if ((++f) == n) { res = palloc(p, x + 2); - strncpy (res, s, x); + strncpy(res, s, x); res[x] = '/'; - res[x+1] = '\0'; - return res; - } + res[x + 1] = '\0'; + return res; + } } if (s[strlen(s) - 1] == '/') - return pstrdup (p, s); + return pstrdup(p, s); else - return pstrcat (p, s, "/", NULL); + return pstrcat(p, s, "/", NULL); } -API_EXPORT(int) count_dirs(const char *path) { - register int x,n; +API_EXPORT(int) count_dirs(const char *path) +{ + register int x, n; - for(x=0,n=0;path[x];x++) - if(path[x] == '/') n++; + for (x = 0, n = 0; path[x]; x++) + if (path[x] == '/') + n++; return n; } @@ -429,100 +455,106 @@ const char *x; char buf[HUGE_STRING_LEN]; - x = strrchr (file, '/'); + x = strrchr(file, '/'); if (x == NULL) { - chdir (file); - } else if (x - file < sizeof(buf)-1) { - memcpy (buf, file, x - file); + chdir(file); + } + else if (x - file < sizeof(buf) - 1) { + memcpy(buf, file, x - file); buf[x - file] = '\0'; - chdir (buf); + chdir(buf); } /* XXX: well, this is a silly function, no method of reporting an * error... ah well. */ } -API_EXPORT(char *) getword_nc(pool* atrans, char **line, char stop) - { - return getword(atrans,(const char **)line,stop); - } +API_EXPORT(char *) getword_nc(pool *atrans, char **line, char stop) +{ + return getword(atrans, (const char **) line, stop); +} -API_EXPORT(char *) getword(pool* atrans, const char **line, char stop) { +API_EXPORT(char *) getword(pool *atrans, const char **line, char stop) +{ int pos = ind(*line, stop); char *res; if (pos == -1) { - res = pstrdup (atrans, *line); - *line += strlen (*line); + res = pstrdup(atrans, *line); + *line += strlen(*line); return res; } - + res = palloc(atrans, pos + 1); - strncpy (res, *line, pos); + strncpy(res, *line, pos); res[pos] = '\0'; - - while ((*line)[pos] == stop) ++pos; - + + while ((*line)[pos] == stop) + ++pos; + *line += pos; - + return res; } -API_EXPORT(char *) getword_white_nc(pool* atrans, char **line) +API_EXPORT(char *) getword_white_nc(pool *atrans, char **line) { - return getword_white(atrans,(const char **)line); + return getword_white(atrans, (const char **) line); } -API_EXPORT(char *) getword_white(pool* atrans, const char **line) { +API_EXPORT(char *) getword_white(pool *atrans, const char **line) +{ int pos = -1, x; char *res; - for(x=0;(*line)[x];x++) { - if (isspace((*line)[x])) { - pos=x; - break; - } - } + for (x = 0; (*line)[x]; x++) { + if (isspace((*line)[x])) { + pos = x; + break; + } + } if (pos == -1) { - res = pstrdup (atrans, *line); - *line += strlen (*line); - return res; + res = pstrdup(atrans, *line); + *line += strlen(*line); + return res; } res = palloc(atrans, pos + 1); - strncpy (res, *line, pos); + strncpy(res, *line, pos); res[pos] = '\0'; - while (isspace((*line)[pos])) ++pos; + while (isspace((*line)[pos])) + ++pos; *line += pos; return res; } -API_EXPORT(char *) getword_nulls_nc(pool* atrans, char **line, char stop) +API_EXPORT(char *) getword_nulls_nc(pool *atrans, char **line, char stop) { - return getword_nulls(atrans,(const char **)line,stop); + return getword_nulls(atrans, (const char **) line, stop); } -API_EXPORT(char *) getword_nulls(pool* atrans, const char **line, char stop) { +API_EXPORT(char *) getword_nulls(pool *atrans, const char **line, char stop) +{ int pos = ind(*line, stop); char *res; if (pos == -1) { - res = pstrdup (atrans, *line); - *line += strlen (*line); + res = pstrdup(atrans, *line); + *line += strlen(*line); return res; } - + res = palloc(atrans, pos + 1); - strncpy (res, *line, pos); + strncpy(res, *line, pos); res[pos] = '\0'; - + ++pos; - + *line += pos; - + return res; } @@ -530,15 +562,15 @@ * all honored */ -static char *substring_conf (pool *p, const char *start, int len, char quote) +static char *substring_conf(pool *p, const char *start, int len, char quote) { - char *result = palloc (p, len + 2); + char *result = palloc(p, len + 2); char *resp = result; int i; for (i = 0; i < len; ++i) { - if (start[i] == '\\' && (start[i+1] == '/' - || (quote && start[i+1] == quote))) + if (start[i] == '\\' && (start[i + 1] == '/' + || (quote && start[i + 1] == quote))) *resp++ = start[++i]; else *resp++ = start[i]; @@ -548,42 +580,48 @@ return result; } -API_EXPORT(char *) getword_conf_nc(pool* p, char **line) { - return getword_conf(p,(const char **)line); +API_EXPORT(char *) getword_conf_nc(pool *p, char **line) +{ + return getword_conf(p, (const char **) line); } -API_EXPORT(char *) getword_conf(pool* p, const char **line) { +API_EXPORT(char *) getword_conf(pool *p, const char **line) +{ const char *str = *line, *strend; char *res; char quote; - while (*str && isspace (*str)) - ++str; + while (*str && isspace(*str)) + ++str; if (!*str) { - *line = str; - return ""; + *line = str; + return ""; } if ((quote = *str) == '"' || quote == '\'') { - strend = str + 1; + strend = str + 1; while (*strend && *strend != quote) { if (*strend == '\\' && strend[1] && strend[1] == quote) strend += 2; - else ++strend; + else + ++strend; } - res = substring_conf (p, str + 1, strend - str - 1, quote); + res = substring_conf(p, str + 1, strend - str - 1, quote); - if (*strend == quote) ++strend; - } else { - strend = str; - while (*strend && !isspace (*strend)) + if (*strend == quote) + ++strend; + } + else { + strend = str; + while (*strend && !isspace(*strend)) ++strend; - res = substring_conf (p, str, strend - str, 0); + res = substring_conf(p, str, strend - str, 0); } - while (*strend && isspace(*strend)) ++ strend; + while (*strend && isspace(*strend)) + ++strend; *line = strend; return res; } @@ -591,56 +629,61 @@ #ifdef UNDEF /* this function is dangerous, and superceded by getword_white, so don't use it */ -void cfg_getword(char *word, char *line) { - int x=0,y; - - for(x=0;line[x] && isspace(line[x]);x++); - y=0; - while(1) { - if(!(word[y] = line[x])) - break; - if(isspace(line[x])) - if((!x) || (line[x-1] != '\\')) - break; - if(line[x] != '\\') ++y; - ++x; +void cfg_getword(char *word, char *line) +{ + int x = 0, y; + + for (x = 0; line[x] && isspace(line[x]); x++); + y = 0; + while (1) { + if (!(word[y] = line[x])) + break; + if (isspace(line[x])) + if ((!x) || (line[x - 1] != '\\')) + break; + if (line[x] != '\\') + ++y; + ++x; } word[y] = '\0'; - while(line[x] && isspace(line[x])) ++x; - for(y=0;(line[y] = line[x]);++x,++y); + while (line[x] && isspace(line[x])) + ++x; + for (y = 0; (line[y] = line[x]); ++x, ++y); } #endif -API_EXPORT(int) cfg_getline(char *s, int n, FILE *f) { - register int i=0, c; +API_EXPORT(int) cfg_getline(char *s, int n, FILE *f) +{ + register int i = 0, c; s[0] = '\0'; /* skip leading whitespace */ do { - c = getc(f); + c = getc(f); } while (c == '\t' || c == ' '); - if(c == EOF) + if (c == EOF) return 1; - while(1) { - if((c == '\t') || (c == ' ')) { - s[i++] = ' '; - while((c == '\t') || (c == ' ')) - c = getc(f); - } - if(c == CR) { - c = getc(f); - } - if(c == EOF || c == 0x4 || c == LF || i == (n-1)) { - /* blast trailing whitespace */ - while(i && (s[i-1] == ' ')) --i; - s[i] = '\0'; + while (1) { + if ((c == '\t') || (c == ' ')) { + s[i++] = ' '; + while ((c == '\t') || (c == ' ')) + c = getc(f); + } + if (c == CR) { + c = getc(f); + } + if (c == EOF || c == 0x4 || c == LF || i == (n - 1)) { + /* blast trailing whitespace */ + while (i && (s[i - 1] == ' ')) + --i; + s[i] = '\0'; return 0; - } - s[i] = c; - ++i; - c = getc(f); + } + s[i] = c; + ++i; + c = getc(f); } } @@ -650,160 +693,175 @@ * by whitespace at the caller's option. */ -API_EXPORT(char *) get_token (pool *p, char **accept_line, int accept_white) +API_EXPORT(char *) get_token(pool *p, char **accept_line, int accept_white) { char *ptr = *accept_line; char *tok_start; char *token; int tok_len; - + /* Find first non-white byte */ - + while (*ptr && isspace(*ptr)) - ++ptr; + ++ptr; tok_start = ptr; - + /* find token end, skipping over quoted strings. * (comments are already gone). */ - + while (*ptr && (accept_white || !isspace(*ptr)) - && *ptr != ';' && *ptr != ',') - { + && *ptr != ';' && *ptr != ',') { if (*ptr++ == '"') while (*ptr) - if (*ptr++ == '"') break; + if (*ptr++ == '"') + break; } - + tok_len = ptr - tok_start; - token = palloc (p, tok_len + 1); - strncpy (token, tok_start, tok_len); + token = palloc(p, tok_len + 1); + strncpy(token, tok_start, tok_len); token[tok_len] = '\0'; - + /* Advance accept_line pointer to the next non-white byte */ while (*ptr && isspace(*ptr)) - ++ptr; + ++ptr; *accept_line = ptr; return token; } -static char* tspecials = " \t()<>@,;:\\/[]?={}"; +static char *tspecials = " \t()<>@,;:\\/[]?={}"; /* Next HTTP token from a header line. Warning --- destructive! * Use only with a copy! */ -static char *next_token (char **toks) { +static char *next_token(char **toks) +{ char *cp = *toks; char *ret; - while (*cp && (iscntrl (*cp) || strchr (tspecials, *cp))) { - if (*cp == '"') - while (*cp && (*cp != '"')) ++cp; + while (*cp && (iscntrl(*cp) || strchr(tspecials, *cp))) { + if (*cp == '"') + while (*cp && (*cp != '"')) + ++cp; else - ++cp; + ++cp; } - if (!*cp) ret = NULL; + if (!*cp) + ret = NULL; else { - ret = cp; + ret = cp; - while (*cp && !iscntrl(*cp) && !strchr (tspecials, *cp)) - ++cp; + while (*cp && !iscntrl(*cp) && !strchr(tspecials, *cp)) + ++cp; - if (*cp) { - *toks = cp + 1; - *cp = '\0'; + if (*cp) { + *toks = cp + 1; + *cp = '\0'; } - else *toks = cp; + else + *toks = cp; } return ret; } -API_EXPORT(int) find_token (pool *p, const char *line, const char *tok) { +API_EXPORT(int) find_token(pool *p, const char *line, const char *tok) +{ char *ltok; char *lcopy; - if (!line) return 0; + if (!line) + return 0; - lcopy = pstrdup (p, line); - while ((ltok = next_token (&lcopy))) - if (!strcasecmp (ltok, tok)) - return 1; + lcopy = pstrdup(p, line); + while ((ltok = next_token(&lcopy))) + if (!strcasecmp(ltok, tok)) + return 1; return 0; } -API_EXPORT(int) find_last_token (pool *p, const char *line, const char *tok) +API_EXPORT(int) find_last_token(pool *p, const char *line, const char *tok) { int llen, tlen, lidx; - if (!line) return 0; + if (!line) + return 0; llen = strlen(line); tlen = strlen(tok); lidx = llen - tlen; if ((lidx < 0) || - ((lidx > 0) && !(isspace(line[lidx-1]) || line[lidx-1] == ','))) - return 0; + ((lidx > 0) && !(isspace(line[lidx - 1]) || line[lidx - 1] == ','))) + return 0; return (strncasecmp(&line[lidx], tok, tlen) == 0); } -API_EXPORT(char *) escape_shell_cmd(pool *p, const char *s) { - register int x,y,l; +API_EXPORT(char *) escape_shell_cmd(pool *p, const char *s) +{ + register int x, y, l; char *cmd; - l=strlen(s); - cmd = palloc (p, 2 * l + 1); /* Be safe */ - strcpy (cmd, s); - - for(x=0;cmd[x];x++) { - + l = strlen(s); + cmd = palloc(p, 2 * l + 1); /* Be safe */ + strcpy(cmd, s); + + for (x = 0; cmd[x]; x++) { + #if defined(__EMX__) || defined(WIN32) - /* Don't allow '&' in parameters under OS/2. */ - /* This can be used to send commands to the shell. */ - if (cmd[x] == '&') { - cmd[x] = ' '; - } + /* Don't allow '&' in parameters under OS/2. */ + /* This can be used to send commands to the shell. */ + if (cmd[x] == '&') { + cmd[x] = ' '; + } #endif - if(ind("&;`'\"|*?~<>^()[]{}$\\\n",cmd[x]) != -1){ - for(y=l+1;y>x;y--) - cmd[y] = cmd[y-1]; - l++; /* length has been increased */ - cmd[x] = '\\'; - x++; /* skip the character */ - } + if (ind("&;`'\"|*?~<>^()[]{}$\\\n", cmd[x]) != -1) { + for (y = l + 1; y > x; y--) + cmd[y] = cmd[y - 1]; + l++; /* length has been increased */ + cmd[x] = '\\'; + x++; /* skip the character */ + } } return cmd; } -void plustospace(char *str) { +void plustospace(char *str) +{ register int x; - for(x=0;str[x];x++) if(str[x] == '+') str[x] = ' '; + for (x = 0; str[x]; x++) + if (str[x] == '+') + str[x] = ' '; } -void spacetoplus(char *str) { +void spacetoplus(char *str) +{ register int x; - for(x=0;str[x];x++) if(str[x] == ' ') str[x] = '+'; + for (x = 0; str[x]; x++) + if (str[x] == ' ') + str[x] = '+'; } -static char x2c(const char *what) { +static char x2c(const char *what) +{ register char digit; - digit = ((what[0] >= 'A') ? ((what[0] & 0xdf) - 'A')+10 : (what[0] - '0')); + digit = ((what[0] >= 'A') ? ((what[0] & 0xdf) - 'A') + 10 : (what[0] - '0')); digit *= 16; - digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A')+10 : (what[1] - '0')); - return(digit); + digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A') + 10 : (what[1] - '0')); + return (digit); } /* @@ -816,117 +874,120 @@ * decoding %2f -> / (a special character) * returns NOT_FOUND */ -API_EXPORT(int) unescape_url(char *url) { - register int x,y, badesc, badpath; +API_EXPORT(int) unescape_url(char *url) +{ + register int x, y, badesc, badpath; badesc = 0; badpath = 0; - for(x=0,y=0;url[y];++x,++y) { - if (url[y] != '%') url[x] = url[y]; - else - { - if (!isxdigit(url[y+1]) || !isxdigit(url[y+2])) - { + for (x = 0, y = 0; url[y]; ++x, ++y) { + if (url[y] != '%') + url[x] = url[y]; + else { + if (!isxdigit(url[y + 1]) || !isxdigit(url[y + 2])) { badesc = 1; url[x] = '%'; - } else - { - url[x] = x2c(&url[y+1]); + } + else { + url[x] = x2c(&url[y + 1]); y += 2; - if (url[x] == '/' || url[x] == '\0') badpath = 1; + if (url[x] == '/' || url[x] == '\0') + badpath = 1; } - } + } } url[x] = '\0'; - if (badesc) return BAD_REQUEST; - else if (badpath) return NOT_FOUND; - else return OK; + if (badesc) + return BAD_REQUEST; + else if (badpath) + return NOT_FOUND; + else + return OK; } API_EXPORT(char *) construct_server(pool *p, const char *hostname, - unsigned port) { - char portnum[22]; - /* Long enough, even if port > 16 bits for some reason */ - + unsigned port) +{ + char portnum[22]; + /* Long enough, even if port > 16 bits for some reason */ + if (port == DEFAULT_PORT) - return pstrdup (p, hostname); + return pstrdup(p, hostname); else { - ap_snprintf (portnum, sizeof(portnum), "%u", port); - return pstrcat (p, hostname, ":", portnum, NULL); + ap_snprintf(portnum, sizeof(portnum), "%u", port); + return pstrcat(p, hostname, ":", portnum, NULL); } } -API_EXPORT(char *) construct_url(pool *p, const char *uri, const server_rec *s) { - return pstrcat (p, "http://", - construct_server(p, s->server_hostname, s->port), - uri, NULL); +API_EXPORT(char *) construct_url(pool *p, const char *uri, const server_rec *s) +{ + return pstrcat(p, "http://", + construct_server(p, s->server_hostname, s->port), + uri, NULL); } #define c2x(what,where) sprintf(where,"%%%02x",(unsigned char)what) /* -escape_path_segment() escapes a path segment, as defined in RFC 1808. This -routine is (should be) OS independent. + * escape_path_segment() escapes a path segment, as defined in RFC 1808. This + * routine is (should be) OS independent. + * + * os_escape_path() converts an OS path to a URL, in an OS dependent way. In all + * cases if a ':' occurs before the first '/' in the URL, the URL should be + * prefixed with "./" (or the ':' escaped). In the case of Unix, this means + * leaving '/' alone, but otherwise doing what escape_path_segment() does. For + * efficiency reasons, we don't use escape_path_segment(), which is provided for + * reference. Again, RFC 1808 is where this stuff is defined. + * + * If partial is set, os_escape_path() assumes that the path will be appended to + * something with a '/' in it (and thus does not prefix "./"). + */ -os_escape_path() converts an OS path to a URL, in an OS dependent way. In all -cases if a ':' occurs before the first '/' in the URL, the URL should be -prefixed with "./" (or the ':' escaped). In the case of Unix, this means -leaving '/' alone, but otherwise doing what escape_path_segment() does. For -efficiency reasons, we don't use escape_path_segment(), which is provided for -reference. Again, RFC 1808 is where this stuff is defined. - -If partial is set, os_escape_path() assumes that the path will be appended to -something with a '/' in it (and thus does not prefix "./"). -*/ - -API_EXPORT(char *) escape_path_segment(pool *p, const char *segment) { - register int x,y; - char *copy = palloc (p, 3 * strlen (segment) + 1); - - for(x=0,y=0; segment[x]; x++,y++) { - char c=segment[x]; - if((c < 'A' || c > 'Z') && (c < 'a' || c > 'z') && (c < '0' || c >'9') - && ind("$-_.+!*'(),:@&=~",c) == -1) - { - c2x(c,©[y]); - y+=2; +API_EXPORT(char *) escape_path_segment(pool *p, const char *segment) +{ + register int x, y; + char *copy = palloc(p, 3 * strlen(segment) + 1); + + for (x = 0, y = 0; segment[x]; x++, y++) { + char c = segment[x]; + if ((c < 'A' || c > 'Z') && (c < 'a' || c > 'z') && (c < '0' || c > '9') + && ind("$-_.+!*'(),:@&=~", c) == -1) { + c2x(c, ©[y]); + y += 2; } - else - copy[y]=c; + else + copy[y] = c; } copy[y] = '\0'; return copy; } -API_EXPORT(char *) os_escape_path(pool *p,const char *path,int partial) { - char *copy=palloc(p,3*strlen(path)+3); - char *s=copy; - - if(!partial) - { - int colon=ind(path,':'); - int slash=ind(path,'/'); - - if(colon >= 0 && (colon < slash || slash < 0)) - { - *s++='.'; - *s++='/'; - } - } - for( ; *path ; ++path) - { - char c=*path; - if((c < 'A' || c > 'Z') && (c < 'a' || c > 'z') && (c < '0' || c >'9') - && ind("$-_.+!*'(),:@&=/~",c) == -1) - { - c2x(c,s); - s+=3; +API_EXPORT(char *) os_escape_path(pool *p, const char *path, int partial) +{ + char *copy = palloc(p, 3 * strlen(path) + 3); + char *s = copy; + + if (!partial) { + int colon = ind(path, ':'); + int slash = ind(path, '/'); + + if (colon >= 0 && (colon < slash || slash < 0)) { + *s++ = '.'; + *s++ = '/'; } - else - *s++=c; } - *s='\0'; - return copy; + for (; *path; ++path) { + char c = *path; + if ((c < 'A' || c > 'Z') && (c < 'a' || c > 'z') && (c < '0' || c > '9') + && ind("$-_.+!*'(),:@&=/~", c) == -1) { + c2x(c, s); + s += 3; + } + else + *s++ = c; + } + *s = '\0'; + return copy; } /* escape_uri is now a macro for os_escape_path */ @@ -936,141 +997,155 @@ int i, j; char *x; -/* first, count the number of extra characters */ - for (i=0, j=0; s[i] != '\0'; i++) - if (s[i] == '<' || s[i] == '>') j += 3; - else if (s[i] == '&') j += 4; + /* first, count the number of extra characters */ + for (i = 0, j = 0; s[i] != '\0'; i++) + if (s[i] == '<' || s[i] == '>') + j += 3; + else if (s[i] == '&') + j += 4; - if (j == 0) return pstrdup(p, s); + if (j == 0) + return pstrdup(p, s); x = palloc(p, i + j + 1); - for (i=0, j=0; s[i] != '\0'; i++, j++) - if (s[i] == '<') - { + for (i = 0, j = 0; s[i] != '\0'; i++, j++) + if (s[i] == '<') { memcpy(&x[j], "<", 4); j += 3; - } else if (s[i] == '>') - { + } + else if (s[i] == '>') { memcpy(&x[j], ">", 4); j += 3; - } else if (s[i] == '&') - { + } + else if (s[i] == '&') { memcpy(&x[j], "&", 5); j += 4; - } else - x[j] = s[i]; + } + else + x[j] = s[i]; x[j] = '\0'; return x; } -API_EXPORT(int) is_directory(const char *path) { +API_EXPORT(int) is_directory(const char *path) +{ struct stat finfo; - if(stat(path,&finfo) == -1) - return 0; /* in error condition, just return no */ + if (stat(path, &finfo) == -1) + return 0; /* in error condition, just return no */ - return(S_ISDIR(finfo.st_mode)); + return (S_ISDIR(finfo.st_mode)); } API_EXPORT(char *) make_full_path(pool *a, const char *src1, - const char *src2) { + const char *src2) +{ register int x; x = strlen(src1); - if (x == 0) return pstrcat (a, "/", src2, NULL); + if (x == 0) + return pstrcat(a, "/", src2, NULL); - if (src1[x - 1] != '/') return pstrcat (a, src1, "/", src2, NULL); - else return pstrcat (a, src1, src2, NULL); + if (src1[x - 1] != '/') + return pstrcat(a, src1, "/", src2, NULL); + else + return pstrcat(a, src1, src2, NULL); } /* * Check for an absoluteURI syntax (see section 3.2 in RFC2068). */ -API_EXPORT(int) is_url(const char *u) { +API_EXPORT(int) is_url(const char *u) +{ register int x; for (x = 0; u[x] != ':'; x++) { - if ((! u[x]) || - ((! isalpha(u[x])) && (! isdigit(u[x])) && + if ((!u[x]) || + ((!isalpha(u[x])) && (!isdigit(u[x])) && (u[x] != '+') && (u[x] != '-') && (u[x] != '.'))) { - return 0; + return 0; } } - return (x ? 1 : 0); /* If the first character is ':', it's broken, too */ + return (x ? 1 : 0); /* If the first character is ':', it's broken, too */ } -API_EXPORT(int) can_exec(const struct stat *finfo) { +API_EXPORT(int) can_exec(const struct stat *finfo) +{ #ifdef MULTIPLE_GROUPS - int cnt; + int cnt; #endif #if defined(__EMX__) || defined(WIN32) /* OS/2 dosen't have Users and Groups */ return 1; -#else - if(user_id == finfo->st_uid) - if(finfo->st_mode & S_IXUSR) - return 1; - if(group_id == finfo->st_gid) - if(finfo->st_mode & S_IXGRP) - return 1; +#else + if (user_id == finfo->st_uid) + if (finfo->st_mode & S_IXUSR) + return 1; + if (group_id == finfo->st_gid) + if (finfo->st_mode & S_IXGRP) + return 1; #ifdef MULTIPLE_GROUPS - for(cnt=0; cnt < NGROUPS_MAX; cnt++) { - if(group_id_list[cnt] == finfo->st_gid) - if(finfo->st_mode & S_IXGRP) - return 1; + for (cnt = 0; cnt < NGROUPS_MAX; cnt++) { + if (group_id_list[cnt] == finfo->st_gid) + if (finfo->st_mode & S_IXGRP) + return 1; } #endif return (finfo->st_mode & S_IXOTH); -#endif +#endif } #ifdef NEED_STRDUP -char *strdup (const char *str) +char *strdup(const char *str) { - char *dup; + char *dup; - if(!(dup = (char *)malloc (strlen (str) + 1))) - return NULL; - dup = strcpy (dup, str); + if (!(dup = (char *) malloc(strlen(str) + 1))) + return NULL; + dup = strcpy(dup, str); - return dup; + return dup; } #endif /* The following two routines were donated for SVR4 by Andreas Vogel */ #ifdef NEED_STRCASECMP -int strcasecmp (const char *a, const char *b) +int strcasecmp(const char *a, const char *b) { const char *p = a; const char *q = b; - for (p = a, q = b; *p && *q; p++, q++) - { - int diff = tolower(*p) - tolower(*q); - if (diff) return diff; - } - if (*p) return 1; /* p was longer than q */ - if (*q) return -1; /* p was shorter than q */ - return 0; /* Exact match */ + for (p = a, q = b; *p && *q; p++, q++) { + int diff = tolower(*p) - tolower(*q); + if (diff) + return diff; + } + if (*p) + return 1; /* p was longer than q */ + if (*q) + return -1; /* p was shorter than q */ + return 0; /* Exact match */ } #endif #ifdef NEED_STRNCASECMP -int strncasecmp (const char *a, const char *b, int n) +int strncasecmp(const char *a, const char *b, int n) { const char *p = a; const char *q = b; - for (p = a, q = b; /*NOTHING*/; p++, q++) - { - int diff; - if (p == a + n) return 0; /* Match up to n characters */ - if (!(*p && *q)) return *p - *q; - diff = tolower(*p) - tolower(*q); - if (diff) return diff; + for (p = a, q = b; /*NOTHING */ ; p++, q++) { + int diff; + if (p == a + n) + return 0; /* Match up to n characters */ + if (!(*p && *q)) + return *p - *q; + diff = tolower(*p) - tolower(*q); + if (diff) + return diff; } - /*NOTREACHED*/ + /*NOTREACHED */ } #endif @@ -1081,196 +1156,210 @@ { #if defined(QNX) || defined(MPE) || defined(BEOS) /* QNX, MPE and BeOS do not appear to support supplementary groups. */ - return 0; + return 0; #else /* ndef QNX */ - gid_t groups[NGROUPS_MAX]; - struct group *g; - int index = 0; + gid_t groups[NGROUPS_MAX]; + struct group *g; + int index = 0; - setgrent(); + setgrent(); - groups[index++] = basegid; + groups[index++] = basegid; - while (index < NGROUPS_MAX && ((g = getgrent()) != NULL)) - if (g->gr_gid != basegid) - { - char **names; + while (index < NGROUPS_MAX && ((g = getgrent()) != NULL)) + if (g->gr_gid != basegid) { + char **names; - for (names = g->gr_mem; *names != NULL; ++names) - if (!strcmp(*names, name)) - groups[index++] = g->gr_gid; - } + for (names = g->gr_mem; *names != NULL; ++names) + if (!strcmp(*names, name)) + groups[index++] = g->gr_gid; + } - endgrent(); + endgrent(); - return setgroups(index, groups); + return setgroups(index, groups); #endif /* def QNX */ } #endif /* def NEED_INITGROUPS */ #ifdef NEED_WAITPID -/* From [EMAIL PROTECTED] */ -/* this is not ideal but it works for SVR3 variants */ -/* httpd does not use the options so this doesn't implement them */ +/* From [EMAIL PROTECTED] + * this is not ideal but it works for SVR3 variants + * httpd does not use the options so this doesn't implement them + */ int waitpid(pid_t pid, int *statusp, int options) { int tmp_pid; - if ( kill ( pid,0 ) == -1) { - errno=ECHILD; - return -1; + if (kill(pid, 0) == -1) { + errno = ECHILD; + return -1; } - while ((( tmp_pid = wait(statusp)) != pid) && ( tmp_pid != -1 )); + while (((tmp_pid = wait(statusp)) != pid) && (tmp_pid != -1)); return tmp_pid; } #endif -API_EXPORT(int) ind(const char *s, char c) { +API_EXPORT(int) ind(const char *s, char c) +{ register int x; - for(x=0;s[x];x++) - if(s[x] == c) return x; + for (x = 0; s[x]; x++) + if (s[x] == c) + return x; return -1; } -API_EXPORT(int) rind(const char *s, char c) { +API_EXPORT(int) rind(const char *s, char c) +{ register int x; - for(x=strlen(s)-1;x != -1;x--) - if(s[x] == c) return x; + for (x = strlen(s) - 1; x != -1; x--) + if (s[x] == c) + return x; return -1; } -API_EXPORT(void) str_tolower(char *str) { - while(*str) { - *str = tolower(*str); - ++str; +API_EXPORT(void) str_tolower(char *str) +{ + while (*str) { + *str = tolower(*str); + ++str; } } - -API_EXPORT(uid_t) uname2id(const char *name) { + +API_EXPORT(uid_t) uname2id(const char *name) +{ #ifdef WIN32 - return(1); + return (1); #else struct passwd *ent; - if(name[0] == '#') - return(atoi(&name[1])); + if (name[0] == '#') + return (atoi(&name[1])); - if(!(ent = getpwnam(name))) { - fprintf(stderr,"httpd: bad user name %s\n",name); - exit(1); + if (!(ent = getpwnam(name))) { + fprintf(stderr, "httpd: bad user name %s\n", name); + exit(1); } - return(ent->pw_uid); + return (ent->pw_uid); #endif } -API_EXPORT(gid_t) gname2id(const char *name) { +API_EXPORT(gid_t) gname2id(const char *name) +{ #ifdef WIN32 - return(1); + return (1); #else struct group *ent; - if(name[0] == '#') - return(atoi(&name[1])); + if (name[0] == '#') + return (atoi(&name[1])); - if(!(ent = getgrnam(name))) { - fprintf(stderr,"httpd: bad group name %s\n",name); - exit(1); + if (!(ent = getgrnam(name))) { + fprintf(stderr, "httpd: bad group name %s\n", name); + exit(1); } - return(ent->gr_gid); + return (ent->gr_gid); #endif } #if 0 -int get_portnum(int sd) { +int get_portnum(int sd) +{ struct sockaddr addr; int len; len = sizeof(struct sockaddr); - if(getsockname(sd,&addr,&len) < 0) - return -1; - return ntohs(((struct sockaddr_in *)&addr)->sin_port); + if (getsockname(sd, &addr, &len) < 0) + return -1; + return ntohs(((struct sockaddr_in *) &addr)->sin_port); } -struct in_addr get_local_addr(int sd) { +struct in_addr get_local_addr(int sd) +{ struct sockaddr addr; int len; len = sizeof(struct sockaddr); - if(getsockname(sd,&addr,&len) < 0) { - perror ("getsockname"); - fprintf (stderr, "Can't get local host address!\n"); + if (getsockname(sd, &addr, &len) < 0) { + perror("getsockname"); + fprintf(stderr, "Can't get local host address!\n"); exit(1); } - - return ((struct sockaddr_in *)&addr)->sin_addr; + + return ((struct sockaddr_in *) &addr)->sin_addr; } + #endif /* * Parses a host of the form <address>[:port] * :port is permitted if 'port' is not NULL */ -unsigned long get_virthost_addr (const char *w, unsigned short *ports) { +unsigned long get_virthost_addr(const char *w, unsigned short *ports) +{ struct hostent *hep; unsigned long my_addr; char *p; p = strchr(w, ':'); - if (ports != NULL) - { + if (ports != NULL) { *ports = 0; - if (p != NULL && strcmp(p+1, "*") != 0) *ports = atoi(p+1); + if (p != NULL && strcmp(p + 1, "*") != 0) + *ports = atoi(p + 1); } - if (p != NULL) *p = '\0'; - if (strcmp(w, "*") == 0) - { - if (p != NULL) *p = ':'; + if (p != NULL) + *p = '\0'; + if (strcmp(w, "*") == 0) { + if (p != NULL) + *p = ':'; return htonl(INADDR_ANY); } - + my_addr = ap_inet_addr(w); - if (my_addr != INADDR_NONE) - { - if (p != NULL) *p = ':'; + if (my_addr != INADDR_NONE) { + if (p != NULL) + *p = ':'; return my_addr; } hep = gethostbyname(w); - + if ((!hep) || (hep->h_addrtype != AF_INET || !hep->h_addr_list[0])) { - fprintf (stderr, "Cannot resolve host name %s --- exiting!\n", w); + fprintf(stderr, "Cannot resolve host name %s --- exiting!\n", w); exit(1); } - + if (hep->h_addr_list[1]) { fprintf(stderr, "Host %s has multiple addresses ---\n", w); fprintf(stderr, "you must choose one explicitly for use as\n"); fprintf(stderr, "a virtual host. Exiting!!!\n"); exit(1); } - - if (p != NULL) *p = ':'; - return ((struct in_addr *)(hep->h_addr))->s_addr; + if (p != NULL) + *p = ':'; + + return ((struct in_addr *) (hep->h_addr))->s_addr; } -static char *find_fqdn(pool *a, struct hostent *p) { +static char *find_fqdn(pool *a, struct hostent *p) +{ int x; - if(ind(p->h_name,'.') == -1) { - for(x=0;p->h_aliases[x];++x) { - if((ind(p->h_aliases[x],'.') != -1) && - (!strncmp(p->h_aliases[x],p->h_name,strlen(p->h_name)))) - return pstrdup(a, p->h_aliases[x]); - } - return NULL; + if (ind(p->h_name, '.') == -1) { + for (x = 0; p->h_aliases[x]; ++x) { + if ((ind(p->h_aliases[x], '.') != -1) && + (!strncmp(p->h_aliases[x], p->h_name, strlen(p->h_name)))) + return pstrdup(a, p->h_aliases[x]); + } + return NULL; } - return pstrdup(a, (void *)p->h_name); + return pstrdup(a, (void *) p->h_name); } char *get_local_host(pool *a) @@ -1278,18 +1367,18 @@ #ifndef MAXHOSTNAMELEN #define MAXHOSTNAMELEN 256 #endif - char str[MAXHOSTNAMELEN+1]; + char str[MAXHOSTNAMELEN + 1]; char *server_hostname; struct hostent *p; - if( gethostname( str, sizeof( str ) - 1 ) != 0 ) { - perror( "Unable to gethostname" ); + if (gethostname(str, sizeof(str) - 1) != 0) { + perror("Unable to gethostname"); exit(1); } str[MAXHOSTNAMELEN] = '\0'; - if((!(p=gethostbyname(str))) || (!(server_hostname = find_fqdn(a, p)))) { - fprintf(stderr,"httpd: cannot determine local host name.\n"); - fprintf(stderr,"Use ServerName to set it manually.\n"); + if ((!(p = gethostbyname(str))) || (!(server_hostname = find_fqdn(a, p)))) { + fprintf(stderr, "httpd: cannot determine local host name.\n"); + fprintf(stderr, "Use ServerName to set it manually.\n"); exit(1); } @@ -1297,82 +1386,91 @@ } /* aaaack but it's fast and const should make it shared text page. */ -const int pr2six[256]={ - 64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64, - 64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,62,64,64,64,63, - 52,53,54,55,56,57,58,59,60,61,64,64,64,64,64,64,64,0,1,2,3,4,5,6,7,8,9, - 10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,64,64,64,64,64,64,26,27, - 28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51, - 64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64, - 64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64, - 64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64, - 64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64, - 64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64, - 64,64,64,64,64,64,64,64,64,64,64,64,64 +const int pr2six[256] = +{ + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64, 64, 0, 1, 2, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 64, 64, 64, 64, 64, 64, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 }; -API_EXPORT(char *) uudecode(pool *p, const char *bufcoded) { +API_EXPORT(char *) uudecode(pool *p, const char *bufcoded) +{ int nbytesdecoded; register const unsigned char *bufin; register char *bufplain; register unsigned char *bufout; register int nprbytes; - + /* Strip leading whitespace. */ - - while(*bufcoded==' ' || *bufcoded == '\t') bufcoded++; - + + while (*bufcoded == ' ' || *bufcoded == '\t') + bufcoded++; + /* Figure out how many characters are in the input buffer. * Allocate this many from the per-transaction pool for the result. */ - bufin = (const unsigned char *)bufcoded; - while(pr2six[*(bufin++)] <= 63); - nprbytes = (bufin - (const unsigned char *)bufcoded) - 1; - nbytesdecoded = ((nprbytes+3)/4) * 3; + bufin = (const unsigned char *) bufcoded; + while (pr2six[*(bufin++)] <= 63); + nprbytes = (bufin - (const unsigned char *) bufcoded) - 1; + nbytesdecoded = ((nprbytes + 3) / 4) * 3; bufplain = palloc(p, nbytesdecoded + 1); - bufout = (unsigned char *)bufplain; - - bufin = (const unsigned char *)bufcoded; - + bufout = (unsigned char *) bufplain; + + bufin = (const unsigned char *) bufcoded; + while (nprbytes > 0) { - *(bufout++) = - (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4); - *(bufout++) = - (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2); - *(bufout++) = - (unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]); - bufin += 4; - nprbytes -= 4; - } - - if(nprbytes & 03) { - if(pr2six[bufin[-2]] > 63) - nbytesdecoded -= 2; - else - nbytesdecoded -= 1; + *(bufout++) = + (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4); + *(bufout++) = + (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2); + *(bufout++) = + (unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]); + bufin += 4; + nprbytes -= 4; + } + + if (nprbytes & 03) { + if (pr2six[bufin[-2]] > 63) + nbytesdecoded -= 2; + else + nbytesdecoded -= 1; } bufplain[nbytesdecoded] = '\0'; return bufplain; } #ifdef __EMX__ -void os2pathname(char *path) { +void os2pathname(char *path) +{ char newpath[MAX_STRING_LEN]; int loop; int offset; offset = 0; - for (loop=0; loop < (strlen(path) + 1) && loop < sizeof(newpath)-1; loop++) { - if (path[loop] == '/') { - newpath[offset] = '\\'; - /* - offset = offset + 1; - newpath[offset] = '\\'; - */ - } else - newpath[offset] = path[loop]; - offset = offset + 1; + for (loop = 0; loop < (strlen(path) + 1) && loop < sizeof(newpath) - 1; loop++) { + if (path[loop] == '/') { + newpath[offset] = '\\'; + /* + offset = offset + 1; + newpath[offset] = '\\'; + */ + } + else + newpath[offset] = path[loop]; + offset = offset + 1; }; /* Debugging code */ /* fprintf(stderr, "%s \n", newpath); */ @@ -1384,7 +1482,8 @@ #ifdef NEED_STRERROR char * -strerror (int err) { + strerror(int err) +{ char *p; extern char *const sys_errlist[]; @@ -1395,7 +1494,7 @@ #endif #ifndef NO_SLACK -int ap_slack (int fd, int line) +int ap_slack(int fd, int line) { #if !defined(F_DUPFD) return fd; @@ -1404,9 +1503,9 @@ #ifdef HIGH_SLACK_LINE if (line == AP_SLACK_HIGH && fd < HIGH_SLACK_LINE) { - new_fd = fcntl (fd, F_DUPFD, HIGH_SLACK_LINE); + new_fd = fcntl(fd, F_DUPFD, HIGH_SLACK_LINE); if (new_fd != -1) { - close (fd); + close(fd); return new_fd; } } @@ -1415,11 +1514,11 @@ if (fd >= LOW_SLACK_LINE) { return fd; } - new_fd = fcntl (fd, F_DUPFD, LOW_SLACK_LINE); + new_fd = fcntl(fd, F_DUPFD, LOW_SLACK_LINE); if (new_fd == -1) { - return fd; + return fd; } - close (fd); + close(fd); return new_fd; #endif } @@ -1428,6 +1527,6 @@ #if defined(NEED_DIFFTIME) double difftime(time_t time1, time_t time0) { - return(time1 - time0); + return (time1 - time0); } #endif 1.5 +109 -90 apachen/src/main/util_date.c Index: util_date.c =================================================================== RCS file: /export/home/cvs/apachen/src/main/util_date.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- util_date.c 1997/07/19 20:16:15 1.4 +++ util_date.c 1997/09/14 22:18:58 1.5 @@ -83,27 +83,41 @@ char d; for (i = 0; i < 256; i++) { - d = data[i]; - switch (mask[i]) { - case '\0': return (d == '\0'); - - case '*': return 1; - - case '@': if (!isupper(d)) return 0; - break; - case '$': if (!islower(d)) return 0; - break; - case '#': if (!isdigit(d)) return 0; - break; - case '&': if (!isxdigit(d)) return 0; - break; - case '~': if ((d != ' ') && !isdigit(d)) return 0; - break; - default: if (mask[i] != d) return 0; - break; - } + d = data[i]; + switch (mask[i]) { + case '\0': + return (d == '\0'); + + case '*': + return 1; + + case '@': + if (!isupper(d)) + return 0; + break; + case '$': + if (!islower(d)) + return 0; + break; + case '#': + if (!isdigit(d)) + return 0; + break; + case '&': + if (!isxdigit(d)) + return 0; + break; + case '~': + if ((d != ' ') && !isdigit(d)) + return 0; + break; + default: + if (mask[i] != d) + return 0; + break; + } } - return 0; /* We only get here if mask is corrupted (exceeds 256) */ + return 0; /* We only get here if mask is corrupted (exceeds 256) */ } /* @@ -117,34 +131,35 @@ * * This routine is intended to be very fast, much faster than mktime(). */ -time_t tm2sec(const struct tm *t) +time_t tm2sec(const struct tm * t) { - int year; + int year; time_t days; const int dayoffset[12] = - {306, 337, 0, 31, 61, 92, 122, 153, 184, 214, 245, 275}; + {306, 337, 0, 31, 61, 92, 122, 153, 184, 214, 245, 275}; year = t->tm_year; if (year < 70 || ((sizeof(time_t) <= 4) && (year >= 138))) - return BAD_DATE; + return BAD_DATE; /* shift new year to 1st March in order to make leap year calc easy */ - if (t->tm_mon < 2) year--; + if (t->tm_mon < 2) + year--; /* Find number of days since 1st March 1900 (in the Gregorian calendar). */ - days = year * 365 + year/4 - year/100 + (year/100 + 3)/4; + days = year * 365 + year / 4 - year / 100 + (year / 100 + 3) / 4; days += dayoffset[t->tm_mon] + t->tm_mday - 1; - days -= 25508; /* 1 jan 1970 is 25508 days since 1 mar 1900 */ + days -= 25508; /* 1 jan 1970 is 25508 days since 1 mar 1900 */ days = ((days * 24 + t->tm_hour) * 60 + t->tm_min) * 60 + t->tm_sec; if (days < 0) - return BAD_DATE; /* must have overflowed */ + return BAD_DATE; /* must have overflowed */ else - return days; /* must be a valid time */ + return days; /* must be a valid time */ } /* @@ -199,99 +214,103 @@ struct tm ds; int mint, mon; const char *monstr, *timstr; - const int months[12] = { - ('J' << 16) | ( 'a' << 8) | 'n', ('F' << 16) | ( 'e' << 8) | 'b', - ('M' << 16) | ( 'a' << 8) | 'r', ('A' << 16) | ( 'p' << 8) | 'r', - ('M' << 16) | ( 'a' << 8) | 'y', ('J' << 16) | ( 'u' << 8) | 'n', - ('J' << 16) | ( 'u' << 8) | 'l', ('A' << 16) | ( 'u' << 8) | 'g', - ('S' << 16) | ( 'e' << 8) | 'p', ('O' << 16) | ( 'c' << 8) | 't', - ('N' << 16) | ( 'o' << 8) | 'v', ('D' << 16) | ( 'e' << 8) | 'c'}; + const int months[12] = + { + ('J' << 16) | ('a' << 8) | 'n', ('F' << 16) | ('e' << 8) | 'b', + ('M' << 16) | ('a' << 8) | 'r', ('A' << 16) | ('p' << 8) | 'r', + ('M' << 16) | ('a' << 8) | 'y', ('J' << 16) | ('u' << 8) | 'n', + ('J' << 16) | ('u' << 8) | 'l', ('A' << 16) | ('u' << 8) | 'g', + ('S' << 16) | ('e' << 8) | 'p', ('O' << 16) | ('c' << 8) | 't', + ('N' << 16) | ('o' << 8) | 'v', ('D' << 16) | ('e' << 8) | 'c'}; if (!date) - return BAD_DATE; + return BAD_DATE; - while (*date && isspace(*date)) /* Find first non-whitespace char */ - ++date; + while (*date && isspace(*date)) /* Find first non-whitespace char */ + ++date; if (*date == '\0') - return BAD_DATE; + return BAD_DATE; - if ((date = strchr(date,' ')) == NULL) /* Find space after weekday */ - return BAD_DATE; + if ((date = strchr(date, ' ')) == NULL) /* Find space after weekday */ + return BAD_DATE; - ++date; /* Now pointing to first char after space, which should be */ - /* start of the actual date information for all 3 formats. */ - - if (checkmask(date, "## @$$ #### ##:##:## *")) { /* RFC 1123 format */ - ds.tm_year = ((date[7] - '0') * 10 + (date[8] - '0') - 19) * 100; - if (ds.tm_year < 0) - return BAD_DATE; + ++date; /* Now pointing to first char after space, which should be */ + /* start of the actual date information for all 3 formats. */ - ds.tm_year += ((date[9] - '0') * 10) + (date[10] - '0'); + if (checkmask(date, "## @$$ #### ##:##:## *")) { /* RFC 1123 format */ + ds.tm_year = ((date[7] - '0') * 10 + (date[8] - '0') - 19) * 100; + if (ds.tm_year < 0) + return BAD_DATE; - ds.tm_mday = ((date[0] - '0') * 10) + (date[1] - '0'); + ds.tm_year += ((date[9] - '0') * 10) + (date[10] - '0'); - monstr = date + 3; - timstr = date + 12; + ds.tm_mday = ((date[0] - '0') * 10) + (date[1] - '0'); + + monstr = date + 3; + timstr = date + 12; } - else if (checkmask(date, "[EMAIL PROTECTED] ##:##:## *")) { /* RFC 850 format */ - ds.tm_year = ((date[7] - '0') * 10) + (date[8] - '0'); - if (ds.tm_year < 70) - ds.tm_year += 100; + else if (checkmask(date, "[EMAIL PROTECTED] ##:##:## *")) { /* RFC 850 format */ + ds.tm_year = ((date[7] - '0') * 10) + (date[8] - '0'); + if (ds.tm_year < 70) + ds.tm_year += 100; - ds.tm_mday = ((date[0] - '0') * 10) + (date[1] - '0'); + ds.tm_mday = ((date[0] - '0') * 10) + (date[1] - '0'); - monstr = date + 3; - timstr = date + 10; + monstr = date + 3; + timstr = date + 10; } - else if (checkmask(date, "@$$ ~# ##:##:## ####*")) { /* asctime format */ - ds.tm_year = ((date[16] - '0') * 10 + (date[17] - '0') - 19) * 100; - if (ds.tm_year < 0) - return BAD_DATE; - - ds.tm_year += ((date[18] - '0') * 10) + (date[19] - '0'); - - if (date[4] == ' ') - ds.tm_mday = 0; - else - ds.tm_mday = (date[4] - '0') * 10; + else if (checkmask(date, "@$$ ~# ##:##:## ####*")) { /* asctime format */ + ds.tm_year = ((date[16] - '0') * 10 + (date[17] - '0') - 19) * 100; + if (ds.tm_year < 0) + return BAD_DATE; + + ds.tm_year += ((date[18] - '0') * 10) + (date[19] - '0'); + + if (date[4] == ' ') + ds.tm_mday = 0; + else + ds.tm_mday = (date[4] - '0') * 10; - ds.tm_mday += (date[5] - '0'); + ds.tm_mday += (date[5] - '0'); - monstr = date; - timstr = date + 7; + monstr = date; + timstr = date + 7; } - else return BAD_DATE; + else + return BAD_DATE; if (ds.tm_mday <= 0 || ds.tm_mday > 31) - return BAD_DATE; + return BAD_DATE; ds.tm_hour = ((timstr[0] - '0') * 10) + (timstr[1] - '0'); - ds.tm_min = ((timstr[3] - '0') * 10) + (timstr[4] - '0'); - ds.tm_sec = ((timstr[6] - '0') * 10) + (timstr[7] - '0'); + ds.tm_min = ((timstr[3] - '0') * 10) + (timstr[4] - '0'); + ds.tm_sec = ((timstr[6] - '0') * 10) + (timstr[7] - '0'); if ((ds.tm_hour > 23) || (ds.tm_min > 59) || (ds.tm_sec > 61)) - return BAD_DATE; + return BAD_DATE; mint = (monstr[0] << 16) | (monstr[1] << 8) | monstr[2]; - for (mon=0; mon < 12; mon++) - if (mint == months[mon]) - break; + for (mon = 0; mon < 12; mon++) + if (mint == months[mon]) + break; if (mon == 12) - return BAD_DATE; - + return BAD_DATE; + if ((ds.tm_mday == 31) && (mon == 3 || mon == 5 || mon == 8 || mon == 10)) - return BAD_DATE; + return BAD_DATE; /* February gets special check for leapyear */ - if ((mon == 1) && ((ds.tm_mday > 29) || - ((ds.tm_mday == 29) && ((ds.tm_year & 3) || - (((ds.tm_year % 100) == 0) && (((ds.tm_year % 400) != 100))))))) - return BAD_DATE; + if ((mon == 1) && + ((ds.tm_mday > 29) + || ((ds.tm_mday == 29) + && ((ds.tm_year & 3) + || (((ds.tm_year % 100) == 0) + && (((ds.tm_year % 400) != 100))))))) + return BAD_DATE; ds.tm_mon = mon; return tm2sec(&ds); } - 1.5 +3 -3 apachen/src/main/util_date.h Index: util_date.h =================================================================== RCS file: /export/home/cvs/apachen/src/main/util_date.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- util_date.h 1997/07/19 20:16:15 1.4 +++ util_date.h 1997/09/14 22:18:58 1.5 @@ -62,6 +62,6 @@ #define BAD_DATE (time_t)0 -API_EXPORT(int) checkmask (const char *data, const char *mask); -time_t tm2sec (const struct tm *t); -API_EXPORT(time_t) parseHTTPdate (const char *date); +API_EXPORT(int) checkmask(const char *data, const char *mask); +time_t tm2sec(const struct tm *t); +API_EXPORT(time_t) parseHTTPdate(const char *date); 1.10 +16 -17 apachen/src/main/util_md5.c Index: util_md5.c =================================================================== RCS file: /export/home/cvs/apachen/src/main/util_md5.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- util_md5.c 1997/09/02 16:12:09 1.9 +++ util_md5.c 1997/09/14 22:18:59 1.10 @@ -82,23 +82,23 @@ #include "httpd.h" #include "util_md5.h" -API_EXPORT(char *) ap_md5 (pool *p, unsigned char *string) +API_EXPORT(char *) ap_md5(pool *p, unsigned char *string) { AP_MD5_CTX my_md5; unsigned char hash[16]; char *r, result[33]; int i; - + /* * Take the MD5 hash of the string argument. */ MD5Init(&my_md5); - MD5Update(&my_md5, string, strlen((const char *)string)); + MD5Update(&my_md5, string, strlen((const char *) string)); MD5Final(hash, &my_md5); - for (i=0, r=result; i<16; i++, r+=2) - sprintf(r, "%02x", hash[i]); + for (i = 0, r = result; i < 16; i++, r += 2) + sprintf(r, "%02x", hash[i]); *r = '\0'; return pstrdup(p, result); @@ -147,26 +147,26 @@ */ static char basis_64[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; -API_EXPORT(char *) ap_md5contextTo64(pool *a, AP_MD5_CTX *context) +API_EXPORT(char *) ap_md5contextTo64(pool *a, AP_MD5_CTX * context) { unsigned char digest[18]; char *encodedDigest; int i; char *p; - encodedDigest = (char *)pcalloc(a, 25 * sizeof(char)); + encodedDigest = (char *) pcalloc(a, 25 * sizeof(char)); MD5Final(digest, context); - digest[sizeof(digest)-1] = digest[sizeof(digest)-2] = 0; + digest[sizeof(digest) - 1] = digest[sizeof(digest) - 2] = 0; p = encodedDigest; - for (i=0; i < sizeof(digest); i+=3) { - *p++ = basis_64[digest[i]>>2]; - *p++ = basis_64[((digest[i] & 0x3)<<4) | ((int)(digest[i+1] & 0xF0)>>4)]; - *p++ = basis_64[((digest[i+1] & 0xF)<<2) | ((int)(digest[i+2] & 0xC0)>>6)]; - *p++ = basis_64[digest[i+2] & 0x3F]; + for (i = 0; i < sizeof(digest); i += 3) { + *p++ = basis_64[digest[i] >> 2]; + *p++ = basis_64[((digest[i] & 0x3) << 4) | ((int) (digest[i + 1] & 0xF0) >> 4)]; + *p++ = basis_64[((digest[i + 1] & 0xF) << 2) | ((int) (digest[i + 2] & 0xC0) >> 6)]; + *p++ = basis_64[digest[i + 2] & 0x3F]; } *p-- = '\0'; *p-- = '='; @@ -183,10 +183,9 @@ MD5Init(&context); while ((nbytes = fread(buf, 1, sizeof(buf), infile))) { - length += nbytes; - MD5Update(&context, buf, nbytes); + length += nbytes; + MD5Update(&context, buf, nbytes); } rewind(infile); return ap_md5contextTo64(p, &context); } - 1.8 +1 -2 apachen/src/main/util_md5.h Index: util_md5.h =================================================================== RCS file: /export/home/cvs/apachen/src/main/util_md5.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- util_md5.h 1997/09/02 16:12:10 1.7 +++ util_md5.h 1997/09/14 22:18:59 1.8 @@ -53,6 +53,5 @@ #include "md5.h" API_EXPORT(char *) ap_md5(pool *a, unsigned char *string); -API_EXPORT(char *) ap_md5contextTo64(pool *p, AP_MD5_CTX *context); +API_EXPORT(char *) ap_md5contextTo64(pool *p, AP_MD5_CTX * context); API_EXPORT(char *) ap_md5digest(pool *p, FILE *infile); - 1.73 +430 -395 apachen/src/main/util_script.c Index: util_script.c =================================================================== RCS file: /export/home/cvs/apachen/src/main/util_script.c,v retrieving revision 1.72 retrieving revision 1.73 diff -u -r1.72 -r1.73 --- util_script.c 1997/09/13 12:15:39 1.72 +++ util_script.c 1997/09/14 22:18:59 1.73 @@ -58,7 +58,7 @@ #include "http_log.h" #include "http_protocol.h" #include "http_core.h" /* For document_root. Sigh... */ -#include "http_request.h" /* for sub_req_lookup_uri() */ +#include "http_request.h" /* for sub_req_lookup_uri() */ #include "util_script.h" #include "util_date.h" /* For parseHTTPdate() */ @@ -68,7 +68,7 @@ * in one place (if only to avoid creating inter-module dependancies * where there don't have to be). */ - + #define MALFORMED_MESSAGE "malformed header from script. Bad header=" #define MALFORMED_HEADER_LENGTH_TO_SHOW 30 @@ -81,7 +81,7 @@ * "+" is the separator between keyword arguments. */ static char **create_argv(pool *p, char *path, char *user, char *group, - char *av0, const char *args) + char *av0, const char *args) { int x, numwords; char **av; @@ -91,26 +91,27 @@ /* count the number of keywords */ for (x = 0, numwords = 1; args[x]; x++) - if (args[x] == '+') ++numwords; + if (args[x] == '+') + ++numwords; if (numwords > APACHE_ARG_MAX - 5) { - numwords = APACHE_ARG_MAX - 5; /* Truncate args to prevent overrun */ + numwords = APACHE_ARG_MAX - 5; /* Truncate args to prevent overrun */ } - av = (char **)palloc(p, (numwords + 5) * sizeof(char *)); + av = (char **) palloc(p, (numwords + 5) * sizeof(char *)); if (path) - av[idx++] = path; + av[idx++] = path; if (user) - av[idx++] = user; + av[idx++] = user; if (group) - av[idx++] = group; + av[idx++] = group; av[idx++] = av0; for (x = 1; x <= numwords; x++) { - w = getword_nulls(p, &args, '+'); - unescape_url(w); - av[idx++] = escape_shell_cmd(p, w); + w = getword_nulls(p, &args, '+'); + unescape_url(w); + av[idx++] = escape_shell_cmd(p, w); } av[idx] = NULL; return av; @@ -119,30 +120,34 @@ static char *http2env(pool *a, char *w) { - char *res = pstrcat (a, "HTTP_", w, NULL); + char *res = pstrcat(a, "HTTP_", w, NULL); char *cp = res; - + while (*++cp) - if (*cp == '-') *cp = '_'; - else *cp = toupper(*cp); + if (*cp == '-') + *cp = '_'; + else + *cp = toupper(*cp); return res; } API_EXPORT(char **) create_environment(pool *p, table *t) { - array_header *env_arr = table_elts (t); - table_entry *elts = (table_entry *)env_arr->elts; - char **env = (char **)palloc (p, (env_arr->nelts + 2) *sizeof (char *)); + array_header *env_arr = table_elts(t); + table_entry *elts = (table_entry *) env_arr->elts; + char **env = (char **) palloc(p, (env_arr->nelts + 2) * sizeof(char *)); int i, j; char *tz; j = 0; tz = getenv("TZ"); - if (tz!= NULL) env[j++] = pstrcat(p, "TZ=", tz, NULL); + if (tz != NULL) + env[j++] = pstrcat(p, "TZ=", tz, NULL); for (i = 0; i < env_arr->nelts; ++i) { - if (!elts[i].key) continue; - env[j++] = pstrcat (p, elts[i].key, "=", elts[i].val, NULL); + if (!elts[i].key) + continue; + env[j++] = pstrcat(p, elts[i].key, "=", elts[i].val, NULL); } env[j] = NULL; @@ -155,65 +160,71 @@ server_rec *s = r->server; conn_rec *c = r->connection; const char *rem_logname; - - char port[40],*env_path; - - array_header *hdrs_arr = table_elts (r->headers_in); - table_entry *hdrs = (table_entry *)hdrs_arr->elts; + + char port[40], *env_path; + + array_header *hdrs_arr = table_elts(r->headers_in); + table_entry *hdrs = (table_entry *) hdrs_arr->elts; int i; - + /* First, add environment vars from headers... this is as per * CGI specs, though other sorts of scripting interfaces see * the same vars... */ - + for (i = 0; i < hdrs_arr->nelts; ++i) { - if (!hdrs[i].key) continue; + if (!hdrs[i].key) + continue; /* A few headers are special cased --- Authorization to prevent * rogue scripts from capturing passwords; content-type and -length * for no particular reason. */ - - if (!strcasecmp (hdrs[i].key, "Content-type")) - table_set (e, "CONTENT_TYPE", hdrs[i].val); - else if (!strcasecmp (hdrs[i].key, "Content-length")) - table_set (e, "CONTENT_LENGTH", hdrs[i].val); - else if (!strcasecmp (hdrs[i].key, "Authorization")) + + if (!strcasecmp(hdrs[i].key, "Content-type")) + table_set(e, "CONTENT_TYPE", hdrs[i].val); + else if (!strcasecmp(hdrs[i].key, "Content-length")) + table_set(e, "CONTENT_LENGTH", hdrs[i].val); + else if (!strcasecmp(hdrs[i].key, "Authorization")) continue; else - table_set (e, http2env (r->pool, hdrs[i].key), hdrs[i].val); + table_set(e, http2env(r->pool, hdrs[i].key), hdrs[i].val); } - + ap_snprintf(port, sizeof(port), "%u", s->port); - if(!(env_path = getenv("PATH"))) - env_path=DEFAULT_PATH; - - table_set (e, "PATH", env_path); - table_set (e, "SERVER_SOFTWARE", SERVER_VERSION); - table_set (e, "SERVER_NAME", s->server_hostname); - table_set (e, "SERVER_PORT", port); - table_set (e, "REMOTE_HOST", - get_remote_host(c, r->per_dir_config, REMOTE_NAME)); - table_set (e, "REMOTE_ADDR", c->remote_ip); - table_set (e, "DOCUMENT_ROOT", document_root(r)); /* Apache */ - table_set (e, "SERVER_ADMIN", s->server_admin); /* Apache */ - table_set (e, "SCRIPT_FILENAME", r->filename); /* Apache */ - + if (!(env_path = getenv("PATH"))) + env_path = DEFAULT_PATH; + + table_set(e, "PATH", env_path); + table_set(e, "SERVER_SOFTWARE", SERVER_VERSION); + table_set(e, "SERVER_NAME", s->server_hostname); + table_set(e, "SERVER_PORT", port); + table_set(e, "REMOTE_HOST", + get_remote_host(c, r->per_dir_config, REMOTE_NAME)); + table_set(e, "REMOTE_ADDR", c->remote_ip); + table_set(e, "DOCUMENT_ROOT", document_root(r)); /* Apache */ + table_set(e, "SERVER_ADMIN", s->server_admin); /* Apache */ + table_set(e, "SCRIPT_FILENAME", r->filename); /* Apache */ + ap_snprintf(port, sizeof(port), "%d", ntohs(c->remote_addr.sin_port)); - table_set (e, "REMOTE_PORT", port); /* Apache */ + table_set(e, "REMOTE_PORT", port); /* Apache */ - if (c->user) table_set(e, "REMOTE_USER", c->user); - if (c->auth_type) table_set(e, "AUTH_TYPE", c->auth_type); + if (c->user) + table_set(e, "REMOTE_USER", c->user); + if (c->auth_type) + table_set(e, "AUTH_TYPE", c->auth_type); rem_logname = get_remote_logname(r); - if (rem_logname) table_set(e, "REMOTE_IDENT", rem_logname); - + if (rem_logname) + table_set(e, "REMOTE_IDENT", rem_logname); + /* Apache custom error responses. If we have redirected set two new vars */ - + if (r->prev) { - if (r->prev->args) table_set(e,"REDIRECT_QUERY_STRING", r->prev->args); - if (r->prev->uri) table_set (e, "REDIRECT_URL", r->prev->uri); + if (r->prev->args) + table_set(e, "REDIRECT_QUERY_STRING", r->prev->args); + if (r->prev->uri) + table_set(e, "REDIRECT_URL", r->prev->uri); } } @@ -222,7 +233,7 @@ * and find as much of the two that match as possible. */ -API_EXPORT(int) find_path_info (char *uri, char *path_info) +API_EXPORT(int) find_path_info(char *uri, char *path_info) { int lu = strlen(uri); int lp = strlen(path_info); @@ -230,7 +241,7 @@ while (lu-- && lp-- && uri[lu] == path_info[lp]); if (lu == -1) - lu=0; + lu = 0; while (uri[lu] != '\0' && uri[lu] != '/') lu++; @@ -246,16 +257,19 @@ char *first, *last; if (r->the_request == NULL) - return (char *)pcalloc(r->pool, 1); + return (char *) pcalloc(r->pool, 1); - first = r->the_request; /* use the request-line */ + first = r->the_request; /* use the request-line */ - while (*first && !isspace(*first)) ++first; /* skip over the method */ - while (isspace(*first)) ++first; /* and the space(s) */ + while (*first && !isspace(*first)) + ++first; /* skip over the method */ + while (isspace(*first)) + ++first; /* and the space(s) */ last = first; - while (*last && !isspace(*last)) ++last; /* end at next whitespace */ - + while (*last && !isspace(*last)) + ++last; /* end at next whitespace */ + return pstrndup(r->pool, first, last - first); } @@ -263,61 +277,63 @@ { table *e = r->subprocess_env; - table_set (e, "GATEWAY_INTERFACE","CGI/1.1"); - table_set (e, "SERVER_PROTOCOL", r->protocol); - table_set (e, "REQUEST_METHOD", r->method); - table_set (e, "QUERY_STRING", r->args ? r->args : ""); - table_set (e, "REQUEST_URI", original_uri(r)); + table_set(e, "GATEWAY_INTERFACE", "CGI/1.1"); + table_set(e, "SERVER_PROTOCOL", r->protocol); + table_set(e, "REQUEST_METHOD", r->method); + table_set(e, "QUERY_STRING", r->args ? r->args : ""); + table_set(e, "REQUEST_URI", original_uri(r)); /* Note that the code below special-cases scripts run from includes, * because it "knows" that the sub_request has been hacked to have the * args and path_info of the original request, and not any that may have * come with the script URI in the include command. Ugh. */ - - if (!strcmp (r->protocol, "INCLUDED")) { - table_set (e, "SCRIPT_NAME", r->uri); + + if (!strcmp(r->protocol, "INCLUDED")) { + table_set(e, "SCRIPT_NAME", r->uri); if (r->path_info && *r->path_info) - table_set (e, "PATH_INFO", r->path_info); - } else if (!r->path_info || !*r->path_info) { - table_set (e, "SCRIPT_NAME", r->uri); - } else { - int path_info_start = find_path_info (r->uri, r->path_info); + table_set(e, "PATH_INFO", r->path_info); + } + else if (!r->path_info || !*r->path_info) { + table_set(e, "SCRIPT_NAME", r->uri); + } + else { + int path_info_start = find_path_info(r->uri, r->path_info); - table_set (e, "SCRIPT_NAME", pstrndup(r->pool, r->uri, - path_info_start)); + table_set(e, "SCRIPT_NAME", pstrndup(r->pool, r->uri, + path_info_start)); - table_set (e, "PATH_INFO", r->path_info); + table_set(e, "PATH_INFO", r->path_info); } - + if (r->path_info && r->path_info[0]) { /* - * To get PATH_TRANSLATED, treat PATH_INFO as a URI path. + * To get PATH_TRANSLATED, treat PATH_INFO as a URI path. * Need to re-escape it for this, since the entire URI was * un-escaped before we determined where the PATH_INFO began. - */ - request_rec *pa_req = sub_req_lookup_uri( - escape_uri(r->pool, r->path_info), r); - + */ + request_rec *pa_req = sub_req_lookup_uri(escape_uri(r->pool, r->path_info), + r); + /* Don't bother destroying pa_req --- it's only created in * child processes which are about to jettison their address * space anyway. BTW, we concatenate filename and path_info * from the sub_request to be compatible in case the PATH_INFO * is pointing to an object which doesn't exist. */ - + if (pa_req->filename) { #ifdef WIN32 char buffer[HUGE_STRING_LEN]; #endif - char *pt = pstrcat (r->pool, pa_req->filename, pa_req->path_info, - NULL); + char *pt = pstrcat(r->pool, pa_req->filename, pa_req->path_info, + NULL); #ifdef WIN32 /* We need to make this a real Windows path name */ GetFullPathName(pt, HUGE_STRING_LEN, buffer, NULL); - table_set (e, "PATH_TRANSLATED", pstrdup(r->pool, buffer)); + table_set(e, "PATH_TRANSLATED", pstrdup(r->pool, buffer)); #else - table_set (e, "PATH_TRANSLATED", pt); + table_set(e, "PATH_TRANSLATED", pt); #endif } } @@ -325,36 +341,39 @@ static int scan_script_header_err_core(request_rec *r, char *buffer, - int (*getsfunc)(char *, int, void *), void *getsfunc_data) + int (*getsfunc) (char *, int, void *), void *getsfunc_data) { char x[MAX_STRING_LEN]; char *w, *l; int p; int cgi_status = HTTP_OK; - if (buffer) *buffer = '\0'; + if (buffer) + *buffer = '\0'; w = buffer ? buffer : x; - hard_timeout ("read script header", r); - - while(1) { + hard_timeout("read script header", r); - if ((*getsfunc)(w, MAX_STRING_LEN-1, getsfunc_data) == 0) { - kill_timeout (r); + while (1) { + + if ((*getsfunc) (w, MAX_STRING_LEN - 1, getsfunc_data) == 0) { + kill_timeout(r); aplog_error(APLOG_MARK, APLOG_ERR, r->server, "Premature end of script headers: %s", r->filename); return SERVER_ERROR; - } + } /* Delete terminal (CR?)LF */ - + p = strlen(w); - if (p > 0 && w[p-1] == '\n') { - if (p > 1 && w[p-2] == '\015') w[p-2] = '\0'; - else w[p-1] = '\0'; + if (p > 0 && w[p - 1] == '\n') { + if (p > 1 && w[p - 2] == '\015') + w[p - 2] = '\0'; + else + w[p - 1] = '\0'; } - /* + /* * If we've finished reading the headers, check to make sure any * HTTP/1.1 conditions are met. If so, we're done; normal processing * will handle the script's output. If not, just return the error. @@ -366,156 +385,160 @@ * However, we don't have the information to do that, so we have to * leave it to an upper layer. */ - if (w[0] == '\0') { + if (w[0] == '\0') { int cond_status = OK; - kill_timeout (r); + kill_timeout(r); if ((cgi_status == HTTP_OK) && (r->method_number == M_GET)) { cond_status = meets_conditions(r); } return cond_status; } - + /* if we see a bogus header don't ignore it. Shout and scream */ - - if (!(l = strchr(w,':'))) { - char malformed[(sizeof MALFORMED_MESSAGE)+1+MALFORMED_HEADER_LENGTH_TO_SHOW]; - strcpy(malformed, MALFORMED_MESSAGE); - strncat(malformed, w, MALFORMED_HEADER_LENGTH_TO_SHOW); + + if (!(l = strchr(w, ':'))) { + char malformed[(sizeof MALFORMED_MESSAGE) + 1 + MALFORMED_HEADER_LENGTH_TO_SHOW]; + strcpy(malformed, MALFORMED_MESSAGE); + strncat(malformed, w, MALFORMED_HEADER_LENGTH_TO_SHOW); if (!buffer) - /* Soak up all the script output --- may save an outright kill */ - while ((*getsfunc)(w, MAX_STRING_LEN-1, getsfunc_data)) - continue; - - kill_timeout (r); + /* Soak up all the script output --- may save an outright kill */ + while ((*getsfunc) (w, MAX_STRING_LEN - 1, getsfunc_data)) + continue; + + kill_timeout(r); aplog_error(APLOG_MARK, APLOG_ERR, r->server, "%s: %s", malformed, r->filename); return SERVER_ERROR; - } + } - *l++ = '\0'; - while (*l && isspace (*l)) ++l; - - if(!strcasecmp(w,"Content-type")) { + *l++ = '\0'; + while (*l && isspace(*l)) + ++l; + + if (!strcasecmp(w, "Content-type")) { /* Nuke trailing whitespace */ - + char *endp = l + strlen(l) - 1; - while (endp > l && isspace(*endp)) *endp-- = '\0'; - - r->content_type = pstrdup (r->pool, l); - } - else if(!strcasecmp(w,"Status")) { - sscanf(l, "%d", &r->status); - r->status_line = pstrdup(r->pool, l); - } - else if(!strcasecmp(w,"Location")) { - table_set (r->headers_out, w, l); - } - else if(!strcasecmp(w,"Content-Length")) { - table_set (r->headers_out, w, l); - } - else if(!strcasecmp(w,"Transfer-Encoding")) { - table_set (r->headers_out, w, l); - } -/* - * If the script gave us a Last-Modified header, we can't just pass it on - * blindly because of restrictions on future values. - */ - else if (!strcasecmp(w, "Last-Modified")) { + while (endp > l && isspace(*endp)) + *endp-- = '\0'; + + r->content_type = pstrdup(r->pool, l); + } + else if (!strcasecmp(w, "Status")) { + sscanf(l, "%d", &r->status); + r->status_line = pstrdup(r->pool, l); + } + else if (!strcasecmp(w, "Location")) { + table_set(r->headers_out, w, l); + } + else if (!strcasecmp(w, "Content-Length")) { + table_set(r->headers_out, w, l); + } + else if (!strcasecmp(w, "Transfer-Encoding")) { + table_set(r->headers_out, w, l); + } + /* + * If the script gave us a Last-Modified header, we can't just + * pass it on blindly because of restrictions on future values. + */ + else if (!strcasecmp(w, "Last-Modified")) { time_t mtime = parseHTTPdate(l); update_mtime(r, mtime); set_last_modified(r); - } -/* - * If the script returned a specific status, that's what we'll use - otherwise - * we assume 200 OK. - */ - else if (!strcasecmp(w, "Status")) { - table_set (r->headers_out, w, l); + } + /* + * If the script returned a specific status, that's what + * we'll use - otherwise we assume 200 OK. + */ + else if (!strcasecmp(w, "Status")) { + table_set(r->headers_out, w, l); cgi_status = atoi(l); - } + } -/* The HTTP specification says that it is legal to merge duplicate - * headers into one. Some browsers that support Cookies don't like - * merged headers and prefer that each Set-Cookie header is sent - * separately. Lets humour those browsers. - */ - else if(!strcasecmp(w, "Set-Cookie")) { + /* The HTTP specification says that it is legal to merge duplicate + * headers into one. Some browsers that support Cookies don't like + * merged headers and prefer that each Set-Cookie header is sent + * separately. Lets humour those browsers. + */ + else if (!strcasecmp(w, "Set-Cookie")) { table_add(r->err_headers_out, w, l); } - else { - table_merge (r->err_headers_out, w, l); - } + else { + table_merge(r->err_headers_out, w, l); + } } } -static int getsfunc_FILE (char *buf, int len, void *f) +static int getsfunc_FILE(char *buf, int len, void *f) { - return fgets (buf, len, (FILE *)f) != NULL; + return fgets(buf, len, (FILE *) f) != NULL; } API_EXPORT(int) scan_script_header_err(request_rec *r, FILE *f, char *buffer) { - return scan_script_header_err_core (r, buffer, getsfunc_FILE, f); + return scan_script_header_err_core(r, buffer, getsfunc_FILE, f); } -static int getsfunc_BUFF (char *w, int len, void *fb) +static int getsfunc_BUFF(char *w, int len, void *fb) { - return bgets (w, len, (BUFF *)fb) > 0; + return bgets(w, len, (BUFF *) fb) > 0; } API_EXPORT(int) scan_script_header_err_buff(request_rec *r, BUFF *fb, - char *buffer) + char *buffer) { - return scan_script_header_err_core (r, buffer, getsfunc_BUFF, fb); + return scan_script_header_err_core(r, buffer, getsfunc_BUFF, fb); } -API_EXPORT(void) send_size(size_t size, request_rec *r) { +API_EXPORT(void) send_size(size_t size, request_rec *r) +{ char ss[20]; - if(size == -1) - strcpy(ss, " -"); - else if(!size) - strcpy(ss, " 0k"); - else if(size < 1024) - strcpy(ss, " 1k"); - else if(size < 1048576) - ap_snprintf(ss, sizeof(ss), "%4dk", (size + 512) / 1024); - else if(size < 103809024) + if (size == -1) + strcpy(ss, " -"); + else if (!size) + strcpy(ss, " 0k"); + else if (size < 1024) + strcpy(ss, " 1k"); + else if (size < 1048576) + ap_snprintf(ss, sizeof(ss), "%4dk", (size + 512) / 1024); + else if (size < 103809024) ap_snprintf(ss, sizeof(ss), "%4.1fM", size / 1048576.0); else - ap_snprintf(ss, sizeof(ss), "%4dM", (size + 524288) / 1048576); + ap_snprintf(ss, sizeof(ss), "%4dM", (size + 524288) / 1048576); rputs(ss, r); } #if defined(__EMX__) || defined(WIN32) static char **create_argv_cmd(pool *p, char *av0, const char *args, char *path) { - register int x,n; + register int x, n; char **av; char *w; - for(x=0,n=2;args[x];x++) - if(args[x] == '+') ++n; + for (x = 0, n = 2; args[x]; x++) + if (args[x] == '+') + ++n; /* Add extra strings to array. */ n = n + 2; - av = (char **)palloc(p, (n+1)*sizeof(char *)); + av = (char **) palloc(p, (n + 1) * sizeof(char *)); av[0] = av0; /* Now insert the extra strings we made room for above. */ av[1] = strdup("/C"); av[2] = strdup(path); - for(x=(1+2);x<n;x++) { - w = getword(p, &args, '+'); - unescape_url(w); - av[x] = escape_shell_cmd(p, w); + for (x = (1 + 2); x < n; x++) { + w = getword(p, &args, '+'); + unescape_url(w); + av[x] = escape_shell_cmd(p, w); } av[n] = NULL; return av; @@ -523,14 +546,14 @@ #endif -API_EXPORT(int) call_exec (request_rec *r, char *argv0, char **env, int shellcmd) +API_EXPORT(int) call_exec(request_rec *r, char *argv0, char **env, int shellcmd) { int pid = 0; #if defined(RLIMIT_CPU) || defined(RLIMIT_NPROC) || \ defined(RLIMIT_DATA) || defined(RLIMIT_VMEM) core_dir_config *conf = - (core_dir_config *)get_module_config(r->per_dir_config, &core_module); + (core_dir_config *) get_module_config(r->per_dir_config, &core_module); #endif @@ -542,280 +565,292 @@ #ifdef RLIMIT_CPU if (conf->limit_cpu != NULL) - if ((setrlimit (RLIMIT_CPU, conf->limit_cpu)) != 0) + if ((setrlimit(RLIMIT_CPU, conf->limit_cpu)) != 0) aplog_error(APLOG_MARK, APLOG_ERR, r->server, "setrlimit: failed to set CPU usage limit"); #endif #ifdef RLIMIT_NPROC if (conf->limit_nproc != NULL) - if ((setrlimit (RLIMIT_NPROC, conf->limit_nproc)) != 0) + if ((setrlimit(RLIMIT_NPROC, conf->limit_nproc)) != 0) aplog_error(APLOG_MARK, APLOG_ERR, r->server, "setrlimit: failed to set process limit"); #endif #ifdef RLIMIT_DATA if (conf->limit_mem != NULL) - if ((setrlimit (RLIMIT_DATA, conf->limit_mem)) != 0) + if ((setrlimit(RLIMIT_DATA, conf->limit_mem)) != 0) aplog_error(APLOG_MARK, APLOG_ERR, r->server, "setrlimit: failed to set memory usage limit"); #endif #ifdef RLIMIT_VMEM if (conf->limit_mem != NULL) - if ((setrlimit (RLIMIT_VMEM, conf->limit_mem)) != 0) + if ((setrlimit(RLIMIT_VMEM, conf->limit_mem)) != 0) aplog_error(APLOG_MARK, APLOG_ERR, r->server, "setrlimit: failed to set memory usage limit"); #endif - -#ifdef __EMX__ + +#ifdef __EMX__ { - /* Additions by Alec Kloss, to allow exec'ing of scripts under OS/2 */ - int is_script; - char interpreter[2048]; /* hope this is large enough for the interpreter path */ - FILE * program; - program = fopen (r->filename, "r"); - if (!program) { - char err_string[HUGE_STRING_LEN]; - ap_snprintf(err_string, sizeof(err_string), "open of %s failed", r->filename); - - /* write(2, err_string, strlen(err_string)); */ - /* exit(0); */ - aplog_error(APLOG_MARK, APLOG_ERR, r->server, "fopen: %s", err_string); - return(pid); - } - fgets(interpreter, sizeof(interpreter), program); - fclose(program); - if (!strncmp (interpreter, "#!", 2)) { - is_script = 1; - interpreter[strlen(interpreter)-1] = '\0'; - } + /* Additions by Alec Kloss, to allow exec'ing of scripts under OS/2 */ + int is_script; + char interpreter[2048]; /* hope this is large enough for the interpreter path */ + FILE *program; + program = fopen(r->filename, "r"); + if (!program) { + char err_string[HUGE_STRING_LEN]; + ap_snprintf(err_string, sizeof(err_string), "open of %s failed", r->filename); + + /* write(2, err_string, strlen(err_string)); */ + /* exit(0); */ + aplog_error(APLOG_MARK, APLOG_ERR, r->server, "fopen: %s", err_string); + return (pid); + } + fgets(interpreter, sizeof(interpreter), program); + fclose(program); + if (!strncmp(interpreter, "#!", 2)) { + is_script = 1; + interpreter[strlen(interpreter) - 1] = '\0'; + } else { - is_script = 0; - } + is_script = 0; + } - if ((!r->args) || (!r->args[0]) || (ind(r->args,'=') >= 0)) { - int emxloop; - char *emxtemp; - - /* For OS/2 place the variables in the current - enviornment then it will be inherited. This way - the program will also get all of OS/2's other SETs. */ - for (emxloop=0; ((emxtemp = env[emxloop]) != NULL); emxloop++) - putenv(emxtemp); - - /* Additions by Alec Kloss, to allow exec'ing of scripts under OS/2 */ - if (is_script) { - /* here's the stuff to run the interpreter */ - execl (interpreter+2, interpreter+2, r->filename, NULL); - } else - - if (strstr(strupr(r->filename), ".CMD") > 0) { - /* Special case to allow use of REXX commands as scripts. */ - os2pathname(r->filename); - execl("CMD.EXE", "CMD.EXE", "/C", r->filename, NULL); + if ((!r->args) || (!r->args[0]) || (ind(r->args, '=') >= 0)) { + int emxloop; + char *emxtemp; + + /* For OS/2 place the variables in the current + * enviornment then it will be inherited. This way + * the program will also get all of OS/2's other SETs. + */ + for (emxloop = 0; ((emxtemp = env[emxloop]) != NULL); emxloop++) + putenv(emxtemp); + + /* Additions by Alec Kloss, to allow exec'ing of scripts under OS/2 */ + if (is_script) { + /* here's the stuff to run the interpreter */ + execl(interpreter + 2, interpreter + 2, r->filename, NULL); + } + else if (strstr(strupr(r->filename), ".CMD") > 0) { + /* Special case to allow use of REXX commands as scripts. */ + os2pathname(r->filename); + execl("CMD.EXE", "CMD.EXE", "/C", r->filename, NULL); + } + else { + execl(r->filename, argv0, NULL); + } } else { - execl(r->filename, argv0, NULL); - } - } - else { - int emxloop; - char *emxtemp; - - /* For OS/2 place the variables in the current - environment so that they will be inherited. This way - the program will also get all of OS/2's other SETs. */ - for (emxloop=0; ((emxtemp = env[emxloop]) != NULL); emxloop++) - putenv(emxtemp); - - if (strstr(strupr(r->filename), ".CMD") > 0) { - /* Special case to allow use of REXX commands as scripts. */ - os2pathname(r->filename); - execv("CMD.EXE", create_argv_cmd(r->pool, argv0, r->args, r->filename)); + int emxloop; + char *emxtemp; + + /* For OS/2 place the variables in the current + * environment so that they will be inherited. This way + * the program will also get all of OS/2's other SETs. + */ + for (emxloop = 0; ((emxtemp = env[emxloop]) != NULL); emxloop++) + putenv(emxtemp); + + if (strstr(strupr(r->filename), ".CMD") > 0) { + /* Special case to allow use of REXX commands as scripts. */ + os2pathname(r->filename); + execv("CMD.EXE", create_argv_cmd(r->pool, argv0, r->args, r->filename)); + } + else + execv(r->filename, + create_argv(r->pool, NULL, NULL, NULL, argv0, r->args)); } - else - execv(r->filename, - create_argv(r->pool, NULL, NULL, NULL, argv0, r->args)); - } - return(pid); + return (pid); } #elif defined(WIN32) { - /* Adapted from work by Alec Kloss, to allow exec'ing of scripts under OS/2 */ - int is_script = 0; - int is_binary = 0; - char interpreter[2048]; /* hope this is large enough for the interpreter path */ - FILE * program; - int i, sz; - char *dot; - char *exename; - int is_exe = 0; - - interpreter[0] = 0; - - exename = strrchr(r->filename, '/'); - if(!exename) - exename = strrchr(r->filename, '\\'); - if(!exename) - exename = r->filename; - else - exename++; - dot = strrchr(exename, '.'); - if(dot) - { - if(!strcasecmp(dot, ".BAT") || - !strcasecmp(dot, ".EXE") || - !strcasecmp(dot, ".COM")) - is_exe = 1; - } - - if (!is_exe) { - program = fopen (r->filename, "rb"); - if (!program) { - char err_string[HUGE_STRING_LEN]; - ap_snprintf(err_string, sizeof(err_string), + /* Adapted from work by Alec Kloss, to allow exec'ing of scripts under OS/2 */ + int is_script = 0; + int is_binary = 0; + char interpreter[2048]; /* hope this is large enough for the interpreter path */ + FILE *program; + int i, sz; + char *dot; + char *exename; + int is_exe = 0; + + interpreter[0] = 0; + + exename = strrchr(r->filename, '/'); + if (!exename) + exename = strrchr(r->filename, '\\'); + if (!exename) + exename = r->filename; + else + exename++; + dot = strrchr(exename, '.'); + if (dot) { + if (!strcasecmp(dot, ".BAT") || + !strcasecmp(dot, ".EXE") || + !strcasecmp(dot, ".COM")) + is_exe = 1; + } + + if (!is_exe) { + program = fopen(r->filename, "rb"); + if (!program) { + char err_string[HUGE_STRING_LEN]; + ap_snprintf(err_string, sizeof(err_string), "open of %s failed", r->filename); - /* write(2, err_string, strlen(err_string)); */ - /* exit(0); */ - aplog_error(APLOG_MARK, APLOG_ERR, r->server, "fopen: %s", err_string); - return(pid); - } - sz = fread(interpreter, 1, sizeof(interpreter)-1, program); - if (sz < 0) { - char err_string[HUGE_STRING_LEN]; - ap_snprintf(err_string, sizeof(err_string), + /* write(2, err_string, strlen(err_string)); */ + /* exit(0); */ + aplog_error(APLOG_MARK, APLOG_ERR, r->server, "fopen: %s", err_string); + return (pid); + } + sz = fread(interpreter, 1, sizeof(interpreter) - 1, program); + if (sz < 0) { + char err_string[HUGE_STRING_LEN]; + ap_snprintf(err_string, sizeof(err_string), "open of %s failed", r->filename); - aplog_error(APLOG_MARK, APLOG_ERR, r->server, "fread: %s", err_string); - fclose(program); - return(pid); - } - interpreter[sz] = 0; - fclose (program); - if (!strncmp (interpreter, "#!", 2)) { - is_script = 1; - for(i=2; i<sizeof(interpreter); i++) - { - if((interpreter[i] == '\r') || - (interpreter[i] == '\n')) - break; - } - interpreter[i] = 0; - } else { - /* - * check and see how many control chars. On - * that basis, I will classify it as a text - * or binary file - */ - int ctrl = 0; - - for(i=0; i<sz; i++) - { - static char *spec = "\r\n\t"; - if(iscntrl(interpreter[i]) && !strchr(spec, interpreter[i])) - ctrl++; - } - if(ctrl > sz/10) - is_binary = 1; - else - is_binary = 0; - - } - } - - if ((!r->args) || (!r->args[0]) || (ind(r->args,'=') >= 0)) { - if (is_exe || is_binary) { - pid = spawnle(_P_NOWAIT, r->filename, r->filename, NULL, env); - } else if(is_script) { - pid = spawnle(_P_NOWAIT, interpreter+2, interpreter+2, r->filename, NULL, env); - } else { - pid = spawnle(_P_NOWAIT, "CMD.EXE", "CMD.EXE", "/C", r->filename, NULL, env); - } - } - else { - if (is_exe || is_binary) { - pid = spawnve(_P_NOWAIT, r->filename, create_argv(r->pool, argv0, NULL, NULL, r->args, (void *)NULL), env); - } else if(is_script) { - ap_assert(0); - pid = spawnve(_P_NOWAIT, interpreter+2, create_argv(r->pool, interpreter+2, NULL, NULL, r->filename, r->args), env); - } else { - pid = spawnve(_P_NOWAIT, "CMD.EXE", create_argv_cmd(r->pool, argv0, r->args, r->filename), env); - } - } - return(pid); + aplog_error(APLOG_MARK, APLOG_ERR, r->server, "fread: %s", err_string); + fclose(program); + return (pid); + } + interpreter[sz] = 0; + fclose(program); + if (!strncmp(interpreter, "#!", 2)) { + is_script = 1; + for (i = 2; i < sizeof(interpreter); i++) { + if ((interpreter[i] == '\r') || + (interpreter[i] == '\n')) + break; + } + interpreter[i] = 0; + } + else { + /* + * check and see how many control chars. On + * that basis, I will classify it as a text + * or binary file + */ + int ctrl = 0; + + for (i = 0; i < sz; i++) { + static char *spec = "\r\n\t"; + if (iscntrl(interpreter[i]) && !strchr(spec, interpreter[i])) + ctrl++; + } + if (ctrl > sz / 10) + is_binary = 1; + else + is_binary = 0; + + } + } + + if ((!r->args) || (!r->args[0]) || (ind(r->args, '=') >= 0)) { + if (is_exe || is_binary) { + pid = spawnle(_P_NOWAIT, r->filename, r->filename, NULL, env); + } + else if (is_script) { + pid = spawnle(_P_NOWAIT, interpreter + 2, interpreter + 2, + r->filename, NULL, env); + } + else { + pid = spawnle(_P_NOWAIT, "CMD.EXE", "CMD.EXE", "/C", + r->filename, NULL, env); + } + } + else { + if (is_exe || is_binary) { + pid = spawnve(_P_NOWAIT, r->filename, + create_argv(r->pool, argv0, NULL, NULL, r->args, + (void *) NULL), env); + } + else if (is_script) { + ap_assert(0); + pid = spawnve(_P_NOWAIT, interpreter + 2, + create_argv(r->pool, interpreter + 2, NULL, NULL, + r->filename, r->args), env); + } + else { + pid = spawnve(_P_NOWAIT, "CMD.EXE", + create_argv_cmd(r->pool, argv0, r->args, + r->filename), env); + } + } + return (pid); } #else - if ( suexec_enabled && - ((r->server->server_uid != user_id) || - (r->server->server_gid != group_id) || - (!strncmp("/~",r->uri,2))) ) { + if (suexec_enabled && + ((r->server->server_uid != user_id) || + (r->server->server_gid != group_id) || + (!strncmp("/~", r->uri, 2)))) { char *execuser, *grpname; struct passwd *pw; struct group *gr; - if (!strncmp("/~",r->uri,2)) { + if (!strncmp("/~", r->uri, 2)) { gid_t user_gid; char *username = pstrdup(r->pool, r->uri + 2); int pos = ind(username, '/'); - if (pos >= 0) username[pos] = '\0'; + if (pos >= 0) + username[pos] = '\0'; if ((pw = getpwnam(username)) == NULL) { - aplog_error(APLOG_MARK, APLOG_ERR, r->server, + aplog_error(APLOG_MARK, APLOG_ERR, r->server, "getpwnam: invalid username %s", username); - return(pid); + return (pid); } execuser = pstrcat(r->pool, "~", pw->pw_name, NULL); user_gid = pw->pw_gid; if ((gr = getgrgid(user_gid)) == NULL) { - if ((grpname = palloc (r->pool, 16)) == NULL) - return(pid); - else - ap_snprintf(grpname, 16, "%d", user_gid); + if ((grpname = palloc(r->pool, 16)) == NULL) + return (pid); + else + ap_snprintf(grpname, 16, "%d", user_gid); } else - grpname = gr->gr_name; + grpname = gr->gr_name; } else { - if ((pw = getpwuid (r->server->server_uid)) == NULL) { + if ((pw = getpwuid(r->server->server_uid)) == NULL) { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "getpwuid: invalid userid %d", r->server->server_uid); - return(pid); + "getpwuid: invalid userid %d", r->server->server_uid); + return (pid); } execuser = pstrdup(r->pool, pw->pw_name); - if ((gr = getgrgid (r->server->server_gid)) == NULL) { + if ((gr = getgrgid(r->server->server_gid)) == NULL) { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "getgrgid: invalid groupid %d", r->server->server_gid); - return(pid); + "getgrgid: invalid groupid %d", r->server->server_gid); + return (pid); } grpname = gr->gr_name; } - - if (shellcmd) + + if (shellcmd) execle(SUEXEC_BIN, SUEXEC_BIN, execuser, grpname, argv0, NULL, env); - else if((!r->args) || (!r->args[0]) || (ind(r->args,'=') >= 0)) + else if ((!r->args) || (!r->args[0]) || (ind(r->args, '=') >= 0)) execle(SUEXEC_BIN, SUEXEC_BIN, execuser, grpname, argv0, NULL, env); - else { - execve(SUEXEC_BIN, + else { + execve(SUEXEC_BIN, create_argv(r->pool, SUEXEC_BIN, execuser, grpname, - argv0, r->args), - env); + argv0, r->args), + env); } } else { - if (shellcmd) + if (shellcmd) execle(SHELL_PATH, SHELL_PATH, "-c", argv0, NULL, env); - - else if((!r->args) || (!r->args[0]) || (ind(r->args,'=') >= 0)) + + else if ((!r->args) || (!r->args[0]) || (ind(r->args, '=') >= 0)) execle(r->filename, argv0, NULL, env); else execve(r->filename, - create_argv(r->pool, NULL, NULL, NULL, argv0, r->args), - env); + create_argv(r->pool, NULL, NULL, NULL, argv0, r->args), + env); } - return(pid); + return (pid); #endif } 1.23 +1 -2 apachen/src/main/util_script.h Index: util_script.h =================================================================== RCS file: /export/home/cvs/apachen/src/main/util_script.h,v retrieving revision 1.22 retrieving revision 1.23 diff -u -r1.22 -r1.23 --- util_script.h 1997/07/24 04:24:00 1.22 +++ util_script.h 1997/09/14 22:18:59 1.23 @@ -66,5 +66,4 @@ API_EXPORT(int) scan_script_header_err(request_rec *r, FILE *f, char *buffer); API_EXPORT(int) scan_script_header_err_buff(request_rec *r, BUFF *f, char *buffer); API_EXPORT(void) send_size(size_t size, request_rec *r); -API_EXPORT(int) call_exec (request_rec *r, char *argv0, char **env, int shellcmd); - +API_EXPORT(int) call_exec(request_rec *r, char *argv0, char **env, int shellcmd); 1.9 +23 -28 apachen/src/main/util_snprintf.c Index: util_snprintf.c =================================================================== RCS file: /export/home/cvs/apachen/src/main/util_snprintf.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- util_snprintf.c 1997/07/21 12:27:16 1.8 +++ util_snprintf.c 1997/09/14 22:19:00 1.9 @@ -67,9 +67,9 @@ #ifdef HAVE_CVT -# define ap_ecvt ecvt -# define ap_fcvt fcvt -# define ap_gcvt gcvt +#define ap_ecvt ecvt +#define ap_fcvt fcvt +#define ap_gcvt gcvt #else @@ -87,8 +87,7 @@ #define NDIG 80 -static char * - ap_cvt(double arg, int ndigits, int *decpt, int *sign, int eflag) +static char *ap_cvt(double arg, int ndigits, int *decpt, int *sign, int eflag) { register int r2; double fi, fj; @@ -162,14 +161,12 @@ return (buf); } -static char * - ap_ecvt(double arg, int ndigits, int *decpt, int *sign) +static char *ap_ecvt(double arg, int ndigits, int *decpt, int *sign) { return (ap_cvt(arg, ndigits, decpt, sign, 1)); } -static char * - ap_fcvt(double arg, int ndigits, int *decpt, int *sign) +static char *ap_fcvt(double arg, int ndigits, int *decpt, int *sign) { return (ap_cvt(arg, ndigits, decpt, sign, 0)); } @@ -179,8 +176,7 @@ * minimal length string */ -static char * - ap_gcvt(double number, int ndigit, char *buf) +static char *ap_gcvt(double number, int ndigit, char *buf) { int sign, decpt; register char *p1, *p2; @@ -250,9 +246,9 @@ #define INT_NULL ((int *)0) #define WIDE_INT long -typedef WIDE_INT wide_int; -typedef unsigned WIDE_INT u_wide_int; -typedef int bool_int; +typedef WIDE_INT wide_int; +typedef unsigned WIDE_INT u_wide_int; +typedef int bool_int; #define S_NULL "(null)" #define S_NULL_LEN 6 @@ -352,9 +348,9 @@ * which is a pointer to the END of the buffer + 1 (i.e. if the buffer * is declared as buf[ 100 ], buf_end should be &buf[ 100 ]) */ -static char * - conv_10(register wide_int num, register bool_int is_unsigned, - register bool_int * is_negative, char *buf_end, register int *len) +static char *conv_10(register wide_int num, register bool_int is_unsigned, + register bool_int *is_negative, char *buf_end, + register int *len) { register char *p = buf_end; register u_wide_int magnitude; @@ -378,7 +374,7 @@ if (*is_negative) { wide_int t = num + 1; - magnitude = ((u_wide_int) - t) + 1; + magnitude = ((u_wide_int) -t) + 1; } else magnitude = (u_wide_int) num; @@ -390,7 +386,7 @@ do { register u_wide_int new_magnitude = magnitude / 10; - *--p = (char)(magnitude - new_magnitude * 10 + '0'); + *--p = (char) (magnitude - new_magnitude * 10 + '0'); magnitude = new_magnitude; } while (magnitude); @@ -409,7 +405,7 @@ */ static char * conv_fp(register char format, register double num, -boolean_e add_dp, int precision, bool_int * is_negative, char *buf, int *len) +boolean_e add_dp, int precision, bool_int *is_negative, char *buf, int *len) { register char *s = buf; register char *p; @@ -500,9 +496,8 @@ * which is a pointer to the END of the buffer + 1 (i.e. if the buffer * is declared as buf[ 100 ], buf_end should be &buf[ 100 ]) */ -static char * - conv_p2(register u_wide_int num, register int nbits, - char format, char *buf_end, register int *len) +static char *conv_p2(register u_wide_int num, register int nbits, + char format, char *buf_end, register int *len) { register int mask = (1 << nbits) - 1; register char *p = buf_end; @@ -524,8 +519,8 @@ /* * Do format conversion placing the output in buffer */ -static int format_converter(register buffy * odp, const char *fmt, - va_list ap) +static int format_converter(register buffy *odp, const char *fmt, + va_list ap) { register char *sp; register char *bep; @@ -828,8 +823,8 @@ ui_num = (u_wide_int) va_arg(ap, char *); if (sizeof(char *) <= sizeof(u_wide_int)) - s = conv_p2(ui_num, 4, 'x', - &num_buf[NUM_BUF_SIZE], &s_len); + s = conv_p2(ui_num, 4, 'x', + &num_buf[NUM_BUF_SIZE], &s_len); else { s = "%p"; s_len = 2; @@ -947,4 +942,4 @@ return (cc); } -#endif /* HAVE_SNPRINTF */ +#endif /* HAVE_SNPRINTF */