static int on_config_mruby_handler_path(h2o_configurator_command_t *cmd, h2o_configurator_context_t *ctx, yoml_t *node) { struct mruby_configurator_t *self = (void *)cmd->configurator; if (node->data.scalar[0] == '\0') { self->vars->mruby_handler_path = h2o_iovec_init(NULL, 0); } else { self->vars->mruby_handler_path = h2o_iovec_init(node->data.scalar, strlen(node->data.scalar)); h2o_mruby_register(ctx->pathconf, self->vars); } return 0; }
static int on_config_mruby_handler_file(h2o_configurator_command_t *cmd, h2o_configurator_context_t *ctx, yoml_t *node) { struct mruby_configurator_t *self = (void *)cmd->configurator; FILE *fp = NULL; h2o_iovec_t buf = {}; int ret = -1; /* open and read file */ if ((fp = fopen(node->data.scalar, "rt")) == NULL) { h2o_configurator_errprintf(cmd, node, "failed to open file: %s:%s", node->data.scalar, strerror(errno)); goto Exit; } while (!feof(fp)) { buf.base = h2o_mem_realloc(buf.base, buf.len + 65536); buf.len += fread(buf.base + buf.len, 1, 65536, fp); if (ferror(fp)) { h2o_configurator_errprintf(cmd, node, "I/O error occurred while reading file:%s:%s", node->data.scalar, strerror(errno)); goto Exit; } } /* set source */ self->vars->source = buf; buf.base = NULL; self->vars->path = node->data.scalar; /* the value is retained until the end of the configuration phase */ self->vars->lineno = 0; /* check if there is any error in source */ char errbuf[1024]; if (!compile_test(self->vars, errbuf)) { h2o_configurator_errprintf(cmd, node, "failed to compile file:%s:%s", node->data.scalar, errbuf); goto Exit; } /* register */ h2o_mruby_register(ctx->pathconf, self->vars); ret = 0; Exit: if (fp != NULL) fclose(fp); if (buf.base != NULL) free(buf.base); return ret; }
static int on_config_mruby_handler(h2o_configurator_command_t *cmd, h2o_configurator_context_t *ctx, yoml_t *node) { struct mruby_configurator_t *self = (void *)cmd->configurator; /* set source */ self->vars->source = h2o_strdup(NULL, node->data.scalar, SIZE_MAX); self->vars->path = node->filename; self->vars->lineno = (int)node->line; /* check if there is any error in source */ char errbuf[1024]; if (!compile_test(self->vars, errbuf)) { h2o_configurator_errprintf(cmd, node, "ruby compile error:%s", errbuf); return -1; } /* register */ h2o_mruby_register(ctx->pathconf, self->vars); return 0; }