You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by ma...@hyperreal.org on 1997/10/26 21:20:08 UTC
cvs commit: apachen/src/modules/standard mod_auth.c mod_digest.c mod_imap.c mod_info.c mod_mime.c
martin 97/10/26 12:20:08
Modified: src CHANGES
src/main http_config.c http_config.h http_core.c httpd.h
util.c
src/modules/standard mod_auth.c mod_digest.c mod_imap.c
mod_info.c mod_mime.c
Log:
Invent new structure and associated methods to handle config file
reading. Add "custom" hook to use config file cfg_getline() on
something which is not a FILE
Reviewed by: Paul +1, Dean +1
Revision Changes Path
1.476 +4 -0 apachen/src/CHANGES
Index: CHANGES
===================================================================
RCS file: /home/cvs/apachen/src/CHANGES,v
retrieving revision 1.475
retrieving revision 1.476
diff -u -u -r1.475 -r1.476
--- CHANGES 1997/10/26 13:43:27 1.475
+++ CHANGES 1997/10/26 20:19:14 1.476
@@ -1,4 +1,8 @@
Changes with Apache 1.3b3
+ *) Invent new structure and associated methods to handle config file
+ reading. Add "custom" hook to use config file cfg_getline() on
+ something which is not a FILE* [Martin Kraemer]
+
*) Make single-exe Windows install. [Ben Laurie and Eric Esselink]
*) Make CGI work under Win95. [Ben Laurie and Paul Sutton]
1.84 +10 -16 apachen/src/main/http_config.c
Index: http_config.c
===================================================================
RCS file: /home/cvs/apachen/src/main/http_config.c,v
retrieving revision 1.83
retrieving revision 1.84
diff -u -u -r1.83 -r1.84
--- http_config.c 1997/10/22 20:29:35 1.83
+++ http_config.c 1997/10/26 20:19:37 1.84
@@ -793,7 +793,6 @@
const command_rec *cmd;
module *mod = top_module;
- ++parms->config_line;
if ((l[0] == '#') || (!l[0]))
return NULL;
@@ -834,7 +833,7 @@
{
char l[MAX_STRING_LEN];
- while (!(cfg_getline(l, MAX_STRING_LEN, parms->infile))) {
+ while (!(cfg_getline(l, MAX_STRING_LEN, parms->config_file))) {
const char *errmsg = handle_command(parms, config, l);
if (errmsg)
return errmsg;
@@ -888,7 +887,7 @@
*/
cmd_parms default_parms =
-{NULL, 0, -1, NULL, 0, NULL, NULL, NULL, NULL};
+{NULL, 0, -1, NULL, NULL, NULL, NULL, NULL, NULL};
API_EXPORT(char *) server_root_relative(pool *p, char *file)
{
@@ -899,7 +898,6 @@
void process_resource_config(server_rec *s, char *fname, pool *p, pool *ptemp)
{
- FILE *cfg;
const char *errmsg;
cmd_parms parms;
struct stat finfo;
@@ -915,38 +913,35 @@
/* GCC's initialization extensions are soooo nice here... */
parms = default_parms;
- parms.config_file = fname;
parms.pool = p;
parms.temp_pool = ptemp;
parms.server = s;
parms.override = (RSRC_CONF | OR_ALL) & ~(OR_AUTHCFG | OR_LIMIT);
- if (!(cfg = fopen(fname, "r"))) {
+ if (!(parms.config_file = pcfg_openfile(p,fname))) {
perror("fopen");
fprintf(stderr, "httpd: could not open document config file %s\n",
fname);
exit(1);
}
- parms.infile = cfg;
-
errmsg = srm_command_loop(&parms, s->lookup_defaults);
if (errmsg) {
fprintf(stderr, "Syntax error on line %d of %s:\n",
- parms.config_line, fname);
+ parms.config_file->line_number, fname);
fprintf(stderr, "%s\n", errmsg);
exit(1);
}
- fclose(cfg);
+ cfg_closefile(parms.config_file);
}
int parse_htaccess(void **result, request_rec *r, int override,
const char *d, const char *access_name)
{
- FILE *f = NULL;
+ configfile_t *f = NULL;
cmd_parms parms;
const char *errmsg;
char *filename = NULL;
@@ -973,17 +968,16 @@
while (!f && access_name[0]) {
char *w = getword_conf(r->pool, &access_name);
filename = make_full_path(r->pool, d, w);
- f = pfopen(r->pool, filename, "r");
+ f = pcfg_openfile(r->pool, filename);
}
if (f) {
dc = create_per_dir_config(r->pool);
- parms.infile = f;
- parms.config_file = filename;
+ parms.config_file = f;
errmsg = srm_command_loop(&parms, dc);
- pfclose(r->pool, f);
+ cfg_closefile(f);
if (errmsg) {
aplog_error(APLOG_MARK, APLOG_ALERT, r->server, "%s: %s", filename, errmsg);
@@ -997,7 +991,7 @@
dc = NULL;
else {
aplog_error(APLOG_MARK, APLOG_CRIT, r->server,
- "%s pfopen: unable to check htaccess file, ensure it is readable",
+ "%s pcfg_openfile: unable to check htaccess file, ensure it is readable",
filename);
return HTTP_FORBIDDEN;
}
1.54 +1 -3 apachen/src/main/http_config.h
Index: http_config.h
===================================================================
RCS file: /home/cvs/apachen/src/main/http_config.h,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -u -r1.53 -r1.54
--- http_config.h 1997/10/22 20:29:36 1.53
+++ http_config.h 1997/10/26 20:19:38 1.54
@@ -135,9 +135,7 @@
int override; /* Which allow-override bits are set */
int limited; /* Which methods are <Limit>ed */
- char *config_file; /* Filename cmd read from */
- int config_line; /* Line cmd read from */
- FILE *infile; /* fd for more lines (not currently used) */
+ configfile_t *config_file; /* Config file structure from pcfg_openfile() */
pool *pool; /* Pool to allocate new storage in */
pool *temp_pool; /* Pool for scratch memory; persists during
1.133 +1 -1 apachen/src/main/http_core.c
Index: http_core.c
===================================================================
RCS file: /home/cvs/apachen/src/main/http_core.c,v
retrieving revision 1.132
retrieving revision 1.133
diff -u -u -r1.132 -r1.133
--- http_core.c 1997/10/22 21:49:45 1.132
+++ http_core.c 1997/10/26 20:19:39 1.133
@@ -994,7 +994,7 @@
if ((!not && found) || (not && !found))
return NULL;
- while (nest && !(cfg_getline (l, MAX_STRING_LEN, cmd->infile))) {
+ while (nest && !(cfg_getline (l, MAX_STRING_LEN, cmd->config_file))) {
if (!strncasecmp(l, "<IfModule", 9))
nest++;
if (!strcasecmp(l, "</IfModule>"))
1.164 +28 -1 apachen/src/main/httpd.h
Index: httpd.h
===================================================================
RCS file: /home/cvs/apachen/src/main/httpd.h,v
retrieving revision 1.163
retrieving revision 1.164
diff -u -u -r1.163 -r1.164
--- httpd.h 1997/10/25 22:35:17 1.163
+++ httpd.h 1997/10/26 20:19:40 1.164
@@ -806,7 +806,34 @@
API_EXPORT(int) ind(const char *, char); /* Sigh... */
API_EXPORT(int) rind(const char *, char);
-API_EXPORT(int) cfg_getline(char *s, int n, FILE *f);
+/* Common structure for reading of config files / passwd files etc. */
+typedef struct {
+ int (*getch) (void *param); /* a getc()-like function */
+ void *(*getstr) (void *buf, size_t bufsiz, void *param); /* a fgets()-like function */
+ int (*close) (void *param); /* a fclose()-like function */
+ void *param; /* the argument passed to getc()/close()/gets() */
+ const char *name; /* the filename / description */
+ unsigned line_number; /* current line number, starting at 1 */
+} configfile_t;
+
+/* Open a configfile_t as FILE, return open configfile_t struct pointer */
+API_EXPORT(configfile_t *) pcfg_openfile(pool *p, const char *name);
+
+/* Allocate a configfile_t handle with user defined functions and params */
+API_EXPORT(configfile_t *) pcfg_open_custom(pool *p, const char *descr,
+ void *param,
+ int(*getc)(void*),
+ void *(*gets) (void *buf, size_t bufsiz, void *param),
+ int(*close)(void*));
+
+/* Read one line from open configfile_t, strip LF, increase line number */
+API_EXPORT(int) cfg_getline(char *buf, size_t bufsize, configfile_t *cfp);
+
+/* Read one char from open configfile_t, increase line number upon LF */
+API_EXPORT(int) cfg_getc(configfile_t *cfp);
+
+/* Detach from open configfile_t, calling the close handler */
+API_EXPORT(int) cfg_closefile(configfile_t *fp);
#ifdef NEED_STRERROR
char *strerror(int err);
1.73 +147 -28 apachen/src/main/util.c
Index: util.c
===================================================================
RCS file: /home/cvs/apachen/src/main/util.c,v
retrieving revision 1.72
retrieving revision 1.73
diff -u -u -r1.72 -r1.73
--- util.c 1997/10/22 20:29:50 1.72
+++ util.c 1997/10/26 20:19:40 1.73
@@ -59,8 +59,16 @@
*
*/
+/* Debugging aid:
+ * #define DEBUG to trace all cfg_open*()/cfg_closefile() calls
+ * #define DEBUG_CFG_LINES to trace every line read from the config files
+ */
+
#include "httpd.h"
#include "http_conf_globals.h" /* for user_id & group_id */
+#if defined(DEBUG)||defined(DEBUG_CFG_LINES)
+#include "http_log.h"
+#endif
const char month_snames[12][4] =
{
@@ -653,40 +661,151 @@
}
#endif
-API_EXPORT(int) cfg_getline(char *s, int n, FILE *f)
+
+/* Open a configfile_t as FILE, return open configfile_t struct pointer */
+API_EXPORT(configfile_t *) pcfg_openfile(pool *p, const char *name)
{
- register int i = 0, c;
+ configfile_t *new_cfg;
+ FILE *file = fopen(name, "r");
+
+#ifdef DEBUG
+ aplog_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, NULL, "Opening config file %s (%s)", name, file == NULL ? strerror(errno) : "successful");
+#endif
- s[0] = '\0';
- /* skip leading whitespace */
- do {
- c = getc(f);
- } while (c == '\t' || c == ' ');
+ if (file == NULL)
+ return NULL;
- if (c == EOF)
- return 1;
+ new_cfg = palloc(p, sizeof (*new_cfg));
+ new_cfg->param = file;
+ new_cfg->name = pstrdup(p, name);
+ new_cfg->getch = (int(*)(void*))fgetc;
+ new_cfg->getstr = (void *(*)(void *,size_t,void *))fgets;
+ new_cfg->close = (int(*)(void*))fclose;
+ new_cfg->line_number = 0;
+ return new_cfg;
+}
- 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);
+
+/* Allocate a configfile_t handle with user defined functions and params */
+API_EXPORT(configfile_t *) pcfg_open_custom(pool *p, const char *descr,
+ void *param,
+ int(*getch)(void*),
+ void *(*getstr) (void *buf, size_t bufsiz, void *param),
+ int(*close)(void*))
+{
+ configfile_t *new_cfg = palloc(p, sizeof (*new_cfg));
+#ifdef DEBUG
+ aplog_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, NULL, "Opening config handler %s", descr);
+#endif
+ new_cfg->param = param;
+ new_cfg->name = descr;
+ new_cfg->getch = getch;
+ new_cfg->getstr = getstr;
+ new_cfg->close = close;
+ new_cfg->line_number = 0;
+ return new_cfg;
+}
+
+
+/* Read one character from a configfile_t */
+API_EXPORT(int) cfg_getc(configfile_t *cfp)
+{
+ register int ch = cfp->getch(cfp->param);
+ if (ch == LF)
+ ++cfp->line_number;
+ return ch;
+}
+
+
+/* Read one line from open configfile_t, strip LF, increase line number */
+/* If custom handler does not define a getstr() function, read char by char */
+API_EXPORT(int) cfg_getline(char *buf, size_t bufsize, configfile_t *cfp)
+{
+ /* If a "get string" function is defined, use it */
+ if (cfp->getstr != NULL) {
+ char *src, *dst;
+ ++cfp->line_number;
+ if (cfp->getstr(buf, bufsize, cfp->param) == NULL)
+ return 1;
+
+ /* Compress the line, reducing all blanks and tabs to one space.
+ * Leading and trailing white space is eliminated completely
+ */
+ src = dst = buf;
+ while (isspace(*src))
+ ++src;
+ while (*src != '\0')
+ {
+ /* Copy words */
+ while (!isspace(*dst = *src) && *src != '\0') {
+ ++src;
+ ++dst;
+ }
+ *dst++ = ' ';
+ while (isspace(*src))
+ ++src;
+ }
+ *dst = '\0';
+ /* blast trailing whitespace */
+ while (--dst >= buf && isspace(*dst))
+ *dst = '\0';
+
+#ifdef DEBUG_CFG_LINES
+ aplog_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, NULL, "Read config: %s", buf);
+#endif
+ return 0;
+ } else {
+ /* No "get string" function defined; read character by character */
+ register int c;
+ register size_t i = 0;
+
+ buf[0] = '\0';
+ /* skip leading whitespace */
+ do {
+ c = cfp->getch(cfp->param);
+ } while (c == '\t' || c == ' ');
+
+ if (c == EOF)
+ return 1;
+
+ while (1) {
+ if ((c == '\t') || (c == ' ')) {
+ buf[i++] = ' ';
+ while ((c == '\t') || (c == ' '))
+ c = cfp->getch(cfp->param);
+ }
+ if (c == CR) {
+ /* silently ignore CR (_assume_ that a LF follows) */
+ c = cfp->getch(cfp->param);
+ } else if (c == LF) {
+ /* increase line number and return on LF */
+ ++cfp->line_number;
+ }
+ if (c == EOF || c == 0x4 || c == LF || i == (bufsize - 1)) {
+ /* blast trailing whitespace */
+ while (i > 0 && isspace(buf[i - 1]))
+ --i;
+ buf[i] = '\0';
+#ifdef DEBUG_CFG_LINES
+ aplog_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, NULL, "Read config: %s", buf);
+#endif
+ return 0;
+ }
+ buf[i] = c;
+ ++i;
+ c = cfp->getch(cfp->param);
+ }
}
}
+
+API_EXPORT(int) cfg_closefile(configfile_t *fp)
+{
+#ifdef DEBUG
+ aplog_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, NULL, "Done with config file %s", fp->name);
+#endif
+ return (fp->close == NULL) ? 0 : fp->close(fp->param);
+}
+
/* Retrieve a token, spacing over it and returning a pointer to
* the first non-white byte afterwards. Note that these tokens
1.30 +10 -7 apachen/src/modules/standard/mod_auth.c
Index: mod_auth.c
===================================================================
RCS file: /home/cvs/apachen/src/modules/standard/mod_auth.c,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -u -r1.29 -r1.30
--- mod_auth.c 1997/10/22 20:30:14 1.29
+++ mod_auth.c 1997/10/26 20:20:03 1.30
@@ -117,11 +117,11 @@
static char *get_pw(request_rec *r, char *user, char *auth_pwfile)
{
- FILE *f;
+ configfile_t *f;
char l[MAX_STRING_LEN];
const char *rpw, *w;
- if (!(f = pfopen(r->pool, auth_pwfile, "r"))) {
+ if (!(f = pcfg_openfile(r->pool, auth_pwfile))) {
aplog_error(APLOG_MARK, APLOG_ERR, r->server,
"Could not open password file: %s", auth_pwfile);
return NULL;
@@ -133,24 +133,27 @@
w = getword(r->pool, &rpw, ':');
if (!strcmp(user, w)) {
- pfclose(r->pool, f);
+ cfg_closefile(f);
return getword(r->pool, &rpw, ':');
}
}
- pfclose(r->pool, f);
+ cfg_closefile(f);
return NULL;
}
static table *groups_for_user(pool *p, char *user, char *grpfile)
{
- FILE *f;
+ configfile_t *f;
table *grps = make_table(p, 15);
pool *sp;
char l[MAX_STRING_LEN];
const char *group_name, *ll, *w;
- if (!(f = pfopen(p, grpfile, "r")))
+ if (!(f = pcfg_openfile(p, grpfile))) {
+/*add? aplog_error(APLOG_MARK, APLOG_ERR, NULL,
+ "Could not open group file: %s", grpfile);*/
return NULL;
+ }
sp = make_sub_pool(p);
@@ -170,7 +173,7 @@
}
}
}
- pfclose(p, f);
+ cfg_closefile(f);
destroy_pool(sp);
return grps;
}
1.26 +4 -4 apachen/src/modules/standard/mod_digest.c
Index: mod_digest.c
===================================================================
RCS file: /home/cvs/apachen/src/modules/standard/mod_digest.c,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -u -r1.25 -r1.26
--- mod_digest.c 1997/10/22 20:30:18 1.25
+++ mod_digest.c 1997/10/26 20:20:04 1.26
@@ -102,12 +102,12 @@
char *get_hash(request_rec *r, char *user, char *auth_pwfile)
{
- FILE *f;
+ configfile_t *f;
char l[MAX_STRING_LEN];
const char *rpw;
char *w, *x;
- if (!(f = pfopen(r->pool, auth_pwfile, "r"))) {
+ if (!(f = pcfg_openfile(r->pool, auth_pwfile))) {
aplog_error(APLOG_MARK, APLOG_ERR, r->server,
"Could not open password file: %s", auth_pwfile);
return NULL;
@@ -120,11 +120,11 @@
x = getword(r->pool, &rpw, ':');
if (x && w && !strcmp(user, w) && !strcmp(auth_name(r), x)) {
- pfclose(r->pool, f);
+ cfg_closefile(f);
return pstrdup(r->pool, rpw);
}
}
- pfclose(r->pool, f);
+ cfg_closefile(f);
return NULL;
}
1.35 +6 -6 apachen/src/modules/standard/mod_imap.c
Index: mod_imap.c
===================================================================
RCS file: /home/cvs/apachen/src/modules/standard/mod_imap.c,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -u -r1.34 -r1.35
--- mod_imap.c 1997/10/22 20:30:21 1.34
+++ mod_imap.c 1997/10/26 20:20:04 1.35
@@ -654,12 +654,12 @@
char *imap_base = icr->imap_base ?
icr->imap_base : IMAP_BASE_DEFAULT;
- FILE *imap;
+ configfile_t *imap;
if (r->method_number != M_GET)
return DECLINED;
- imap = pfopen(r->pool, r->filename, "r");
+ imap = pcfg_openfile(r->pool, r->filename);
if (!imap)
return NOT_FOUND;
@@ -780,7 +780,7 @@
if (!strcasecmp(directive, "poly")) { /* poly */
if (pointinpoly(testpoint, pointarray)) {
- pfclose(r->pool, imap);
+ cfg_closefile(imap);
imap_url(r, base, value, redirect);
return (imap_reply(r, redirect));
}
@@ -790,7 +790,7 @@
if (!strcasecmp(directive, "circle")) { /* circle */
if (pointincircle(testpoint, pointarray)) {
- pfclose(r->pool, imap);
+ cfg_closefile(imap);
imap_url(r, base, value, redirect);
return (imap_reply(r, redirect));
}
@@ -800,7 +800,7 @@
if (!strcasecmp(directive, "rect")) { /* rect */
if (pointinrect(testpoint, pointarray)) {
- pfclose(r->pool, imap);
+ cfg_closefile(imap);
imap_url(r, base, value, redirect);
return (imap_reply(r, redirect));
}
@@ -819,7 +819,7 @@
} /* nothing matched, so we get another line! */
- pfclose(r->pool, imap); /* we are done with the map file, so close it */
+ cfg_closefile(imap); /* we are done with the map file, so close it */
if (showmenu) {
menu_footer(r); /* finish the menu and we are done */
1.31 +3 -3 apachen/src/modules/standard/mod_info.c
Index: mod_info.c
===================================================================
RCS file: /home/cvs/apachen/src/modules/standard/mod_info.c,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -u -r1.30 -r1.31
--- mod_info.c 1997/10/22 20:30:23 1.30
+++ mod_info.c 1997/10/26 20:20:05 1.31
@@ -155,11 +155,11 @@
request_rec *r)
{
char s[MAX_STRING_LEN];
- FILE *fp;
+ configfile_t *fp;
info_cfg_lines *new, *ret = NULL, *prev = NULL;
char *t, *tt, o, *msg;
- fp = pfopen(p, filename, "r");
+ fp = pcfg_openfile(p, filename);
if (!fp) {
msg = pstrcat(r->pool, "mod_info: couldn't open config file ",
filename, NULL);
@@ -199,7 +199,7 @@
}
prev = new;
}
- pfclose(p, fp);
+ cfg_closefile(fp);
return (ret);
}
1.27 +3 -3 apachen/src/modules/standard/mod_mime.c
Index: mod_mime.c
===================================================================
RCS file: /home/cvs/apachen/src/modules/standard/mod_mime.c,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -u -r1.26 -r1.27
--- mod_mime.c 1997/10/22 20:30:25 1.26
+++ mod_mime.c 1997/10/26 20:20:05 1.27
@@ -190,7 +190,7 @@
static void init_mime(server_rec *s, pool *p)
{
- FILE *f;
+ configfile_t *f;
char l[MAX_STRING_LEN];
int x;
char *types_confname = get_module_config(s->module_config, &mime_module);
@@ -200,7 +200,7 @@
types_confname = server_root_relative(p, types_confname);
- if (!(f = fopen(types_confname, "r"))) {
+ if (!(f = pcfg_openfile(p, types_confname))) {
perror("fopen");
fprintf(stderr, "httpd: could not open mime types file %s\n",
types_confname);
@@ -223,7 +223,7 @@
table_set(hash_buckets[hash(ext[0])], ext, ct);
}
}
- fclose(f);
+ cfg_closefile(f);
}
/* note that the proxy module uses this via mime_find_ct */