aboutsummaryrefslogtreecommitdiffstats
path: root/ossl_config.c
diff options
context:
space:
mode:
Diffstat (limited to 'ossl_config.c')
-rw-r--r--ossl_config.c186
1 files changed, 186 insertions, 0 deletions
diff --git a/ossl_config.c b/ossl_config.c
new file mode 100644
index 0000000..48936d8
--- /dev/null
+++ b/ossl_config.c
@@ -0,0 +1,186 @@
+/*
+ * $Id$
+ * 'OpenSSL for Ruby' project
+ * Copyright (C) 2001 Michal Rokos <m.rokos@sh.cvut.cz>
+ * All rights reserved.
+ */
+/*
+ * This program is licenced under the same licence as Ruby.
+ * (See the file 'LICENCE'.)
+ */
+/*
+ * WILL BE DROPPED OUT!?!???
+ *
+#include "ossl.h"
+
+#define MakeConfig(obj, configp) {\
+ obj = Data_Make_Struct(cConfig, ossl_config, 0, ossl_config_free, configp);\
+ configp->ossl_type = T_OSSL_CONFIG;\
+}
+
+#define GetConfig(obj, configp) {\
+ OSSL_Check_Type(obj, T_OSSL_CONFIG);\
+ Data_Get_Struct(obj, ossl_config, configp);\
+}
+
+typedef struct ossl_config_st {
+ int ossl_type;
+ LHASH *config;
+} ossl_config;
+
+/*
+ * It's not ready!
+ *
+typedef struct ossl_configsect_st {
+ int ossl_type;
+ STACK_OF(CONF_VALUE) *section;
+} ossl_configsect;
+ *
+
+VALUE cConfig;
+VALUE eConfigError;
+VALUE cConfigSection;
+
+static void
+ossl_config_free(ossl_config *configp)
+{
+ if (configp) {
+ if (configp->config) CONF_free(configp->config);
+ free(configp);
+ }
+}
+
+/*
+static void ossl_config_section_free(ossl_configsect *sectp)
+{
+ if (configp) {
+ if (configp->section) sk_CONF_VALUE_pop_free(configp->
+ free(sectp);
+}
+ *
+
+static VALUE
+ossl_config_s_new(int argc, VALUE *argv, VALUE klass)
+{
+ ossl_config *configp = NULL;
+ VALUE obj;
+
+ MakeConfig(obj, configp);
+ rb_obj_call_init(obj, argc, argv);
+
+ return obj;
+}
+
+static VALUE
+ossl_config_initialize(int argc, VALUE* argv, VALUE self)
+{
+ ossl_config *configp = NULL;
+ int err_line = 0;
+ VALUE path;
+
+ GetConfig(self, configp);
+ rb_scan_args(argc, argv, "1", &path);
+
+ Check_Type(path, T_STRING);
+
+ configp->config = NULL;
+ configp->config = CONF_load(configp->config, RSTRING(path)->ptr, &err_line);
+
+ if (configp->config == NULL) {
+ if (err_line <= 0)
+ rb_raise(eConfigError, "wrong config file %s", RSTRING(path)->ptr);
+ else
+ rb_raise(eConfigError, "error on line %ld in config file %s", err_line, RSTRING(path)->ptr);
+ }
+
+ return self;
+}
+
+static VALUE
+ossl_config_get_string(VALUE self, VALUE section, VALUE item)
+{
+ ossl_config *configp = NULL;
+ char *sect = NULL;
+ char *string = NULL;
+
+ GetConfig(self, configp);
+
+ if (!NIL_P(section)) {
+ Check_Type(section, T_STRING);
+ sect = RSTRING(section)->ptr;
+ }
+ Check_Type(item, T_STRING);
+
+ string = CONF_get_string(configp->config, sect, RSTRING(item)->ptr);
+
+ return rb_str_new2(string);
+}
+
+static VALUE
+ossl_config_get_number(VALUE self, VALUE section, VALUE item)
+{
+ ossl_config *configp = NULL;
+ char *sect = NULL;
+ long number;
+
+ GetConfig(self, configp);
+
+ if (!NIL_P(section)) {
+ Check_Type(section, T_STRING);
+ sect = RSTRING(section)->ptr;
+ }
+ Check_Type(item, T_STRING);
+
+ number = CONF_get_number(configp->config, sect, RSTRING(item)->ptr);
+ return INT2NUM(number);
+}
+
+/*
+ * TO BE REWORKED
+ *
+static VALUE
+ossl_config_get_section(VALUE self, VALUE section)
+{
+ ossl_config *configp = NULL;
+ VALUE obj;
+ ossl_configsect_st *ps;
+
+ Check_Type(section, T_STRING);
+
+ GetConfig(self, p);
+
+ obj = Data_Make_Struct(cOSSLConfigSection, ossl_configsect_st, 0, ossl_config_section_free, ps);
+ memset(ps, 0, sizeof(ossl_configsect_st));
+
+ ps->section = CONF_get_section(p->config, RSTRING(section)->ptr);
+
+ if (ps->section == NULL)
+ return Qnil;
+ else
+ return obj;
+}
+ *
+
+void
+Init_ossl_config(VALUE mOSSL)
+{
+ eConfigError = rb_define_class_under(mOSSL, "ConfigError", rb_eStandardError);
+
+ cConfig = rb_define_class_under(mOSSL, "Config", rb_cObject);
+ rb_define_singleton_method(cConfig, "new", ossl_config_s_new, -1);
+ rb_define_method(cConfig, "initialize", ossl_config_initialize, -1);
+ rb_define_method(cConfig, "get_string", ossl_config_get_string, 2);
+ rb_define_method(cConfig, "get_number", ossl_config_get_number, 2);
+/*
+ * TODO:
+ * rework
+ rb_define_method(cConfig, "get_section", ossl_config_get_section, 1);
+ cConfigSection = rb_define_class_under(mOSSL, "ConfigSection", rb_cObject);
+ rb_undef_method(CLASS_OF(cConfigSection), "new");
+ *
+}
+ *
+ * CONFIG...
+ * TO BE DROPPED OUT??
+ */
+