You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by dg...@hyperreal.org on 1998/01/21 23:11:04 UTC
cvs commit: apachen/src/main http_config.c util.c
dgaudet 98/01/21 14:11:04
Modified: src CHANGES
src/main http_config.c util.c
Log:
Clean up the -C/-c implementation.
Submitted by: Martin Kraemer
Reviewed by: Dean Gaudet, Doug MacEachern, Jim Jagielski
Revision Changes Path
1.577 +1 -1 apachen/src/CHANGES
Index: CHANGES
===================================================================
RCS file: /export/home/cvs/apachen/src/CHANGES,v
retrieving revision 1.576
retrieving revision 1.577
diff -u -r1.576 -r1.577
--- CHANGES 1998/01/21 22:05:43 1.576
+++ CHANGES 1998/01/21 22:10:59 1.577
@@ -78,7 +78,7 @@
-c "directive" : process directive after reading config files
example:
httpd -C "PerlModule Apache::httpd_conf"
- [Doug MacEachern]
+ [Doug MacEachern, Martin Kraemer]
*) WIN32: Fix the execution of CGIs that are scripts and called
with path info that does not have an '=' in.
1.94 +54 -21 apachen/src/main/http_config.c
Index: http_config.c
===================================================================
RCS file: /export/home/cvs/apachen/src/main/http_config.c,v
retrieving revision 1.93
retrieving revision 1.94
diff -u -r1.93 -r1.94
--- http_config.c 1998/01/13 23:11:09 1.93
+++ http_config.c 1998/01/21 22:11:01 1.94
@@ -908,40 +908,73 @@
return make_full_path(p, server_root, file);
}
+
+/* This structure and the following functions are needed for the
+ * table-based config file reading. They are passed to the
+ * cfg_open_custom() routine.
+ */
+
+/* Structure to be passed to cfg_open_custom(): it contains an
+ * index which is incremented from 0 to nelts on each call to
+ * cfg_getline() (which in turn calls arr_elts_getstr())
+ * and an array_header pointer for the string array.
+ */
+typedef struct {
+ array_header *array;
+ int curr_idx;
+} arr_elts_param_t;
+
+
+/* arr_elts_getstr() returns the next line from the string array. */
+static void *arr_elts_getstr(void *buf, size_t bufsiz, void *param)
+{
+ arr_elts_param_t *arr_param = (arr_elts_param_t *) param;
+
+ /* End of array reached? */
+ if (++arr_param->curr_idx > arr_param->array->nelts)
+ return NULL;
+
+ /* return the line */
+ ap_cpystrn(buf, ((char **) arr_param->array->elts)[arr_param->curr_idx - 1], bufsiz);
+
+ return buf;
+}
+
+
+/* arr_elts_close(): dummy close routine (makes sure no more lines can be read) */
+static int arr_elts_close(void *param)
+{
+ arr_elts_param_t *arr_param = (arr_elts_param_t *) param;
+ arr_param->curr_idx = arr_param->array->nelts;
+ return 0;
+}
+
void process_command_config(server_rec *s, array_header *arr, pool *p, pool *ptemp)
{
const char *errmsg;
cmd_parms parms;
- int i;
- char **lines = (char **)arr->elts;
+ arr_elts_param_t arr_parms;
+
+ arr_parms.curr_idx = 0;
+ arr_parms.array = arr;
parms = default_parms;
parms.pool = p;
parms.temp_pool = ptemp;
parms.server = s;
parms.override = (RSRC_CONF | OR_ALL) & ~(OR_AUTHCFG | OR_LIMIT);
- parms.config_file = pcfg_openfile(p, NULL);
+ parms.config_file = pcfg_open_custom(p, "-c/-C directives",
+ &arr_parms, NULL,
+ arr_elts_getstr, arr_elts_close);
- for (i = 0; i < arr->nelts; ++i) {
- char *line = lines[i];
+ errmsg = srm_command_loop(&parms, s->lookup_defaults);
-#ifdef MOD_PERL
- if(!(strncmp(line, "PerlModule ", 11))) {
- const char *perl_cmd_module(cmd_parms *parms, void *dummy, char *arg);
- line += 11;
- (void)perl_cmd_module(&parms, s->lookup_defaults, line);
- continue;
- }
-#endif
-
- errmsg = handle_command(&parms, s->lookup_defaults, line);
-
- if (errmsg) {
- fprintf(stderr, "Syntax error in command: `%s'\n", lines[i]);
- fprintf(stderr, "%s\n", errmsg);
- exit(1);
- }
+ if (errmsg) {
+ fprintf(stderr, "Syntax error in -C/-c directive:\n%s\n", errmsg);
+ exit(1);
}
+
+ cfg_closefile(parms.config_file);
}
void process_resource_config(server_rec *s, char *fname, pool *p, pool *ptemp)
1.89 +33 -16 apachen/src/main/util.c
Index: util.c
===================================================================
RCS file: /export/home/cvs/apachen/src/main/util.c,v
retrieving revision 1.88
retrieving revision 1.89
diff -u -r1.88 -r1.89
--- util.c 1998/01/20 01:48:47 1.88
+++ util.c 1998/01/21 22:11:02 1.89
@@ -674,26 +674,43 @@
{
configfile_t *new_cfg;
FILE *file;
+#ifdef unvoted_DISALLOW_DEVICE_ACCESS
+ struct stat stbuf;
+#endif
+
+ if (name == NULL) {
+ aplog_error(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, NULL,
+ "Internal error: pcfg_openfile() called with NULL filename");
+ return NULL;
+ }
+ file = fopen(name, "r");
#ifdef DEBUG
- aplog_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, NULL,
- "Opening config file %s (%s)",
- name ? name : "NULL",
- (name && (file == NULL)) ? strerror(errno) : "successful");
+ aplog_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, NULL,
+ "Opening config file %s (%s)",
+ name, (file == NULL) ? strerror(errno) : "successful");
#endif
+ if (file == NULL)
+ return NULL;
- if (name != NULL) {
- file = fopen(name, "r");
- if (file == NULL)
- return NULL;
+#ifdef unvoted_DISALLOW_DEVICE_ACCESS
+ if (strcmp(name, "/dev/null") != 0 &&
+ fstat(fileno(file), &stbuf) == 0 &&
+ !S_ISREG(stbuf.st_mode)) {
+ aplog_error(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, NULL,
+ "Access to file %s denied by server: not a regular file",
+ name);
+ fclose(file);
+ return NULL;
}
+#endif
- new_cfg = palloc(p, sizeof (*new_cfg));
+ 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->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;
}
@@ -702,13 +719,13 @@
/* 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*),
+ int(*getch)(void *),
void *(*getstr) (void *buf, size_t bufsiz, void *param),
- int(*close_func)(void*))
+ int(*close_func)(void *))
{
- configfile_t *new_cfg = palloc(p, sizeof (*new_cfg));
+ 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);
+ aplog_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, NULL, "Opening config handler %s", descr);
#endif
new_cfg->param = param;
new_cfg->name = descr;