Make C configuration more insane

This commit is contained in:
Michael Spang 2009-01-17 19:14:52 -05:00
parent 62171f0c26
commit a7433ec4a7
3 changed files with 85 additions and 102 deletions

38
src/config-vars.h Normal file
View File

@ -0,0 +1,38 @@
CONFIG_STR(server_url)
CONFIG_STR(users_base)
CONFIG_STR(groups_base)
CONFIG_STR(sudo_base)
CONFIG_STR(skeleton_dir)
CONFIG_STR(homedir_mode)
CONFIG_STR(refquota)
CONFIG_STR(member_shell)
CONFIG_INT(member_min_id)
CONFIG_INT(member_max_id)
CONFIG_STR(member_home)
CONFIG_STR(member_home_acl)
CONFIG_STR(member_home_dacl)
CONFIG_STR(club_shell)
CONFIG_INT(club_min_id)
CONFIG_INT(club_max_id)
CONFIG_STR(club_home)
CONFIG_STR(club_home_acl)
CONFIG_STR(club_home_dacl)
CONFIG_STR(notify_hook)
CONFIG_STR(realm)
CONFIG_STR(admin_principal)
CONFIG_STR(admin_keytab)
CONFIG_STR(admin_bind_userid)
CONFIG_STR(admin_bind_keytab)
CONFIG_STR(sasl_realm)
CONFIG_STR(sasl_mech)
CONFIG_STR(privileged_group)

View File

@ -6,76 +6,54 @@
#include "util.h"
#define DEF_STR NULL
#define DEF_LONG LONG_MIN
#define DEF_INT LONG_MIN
char *server_url = DEF_STR;
#define CONFIG_STR(x) char *x = DEF_STR;
#define CONFIG_INT(x) long x = DEF_INT;
#include "config-vars.h"
#undef CONFIG_STR
#undef CONFIG_INT
char *users_base = DEF_STR;
char *groups_base = DEF_STR;
char *sudo_base = DEF_STR;
struct config_var_str {
const char *name;
char **p;
};
char *skeleton_dir = DEF_STR;
char *homedir_mode = DEF_STR;
char *refquota = DEF_STR;
struct config_var_int {
const char *name;
long *p;
};
char *member_shell = DEF_STR;
long member_min_id = DEF_LONG;
long member_max_id = DEF_LONG;
char *member_home = DEF_STR;
char *member_home_acl = DEF_STR;
#define CONFIG_STR(x) {#x, &x},
#define CONFIG_INT(x)
static struct config_var_str str_vars[] = {
#include "config-vars.h"
};
#undef CONFIG_STR
#undef CONFIG_INT
char *club_shell = DEF_STR;
long club_min_id = DEF_LONG;
long club_max_id = DEF_LONG;
char *club_home = DEF_STR;
char *club_home_acl = DEF_STR;
char *notify_hook = DEF_STR;
char *realm = DEF_STR;
char *admin_principal = DEF_STR;
char *admin_keytab = DEF_STR;
char *admin_bind_userid = DEF_STR;
char *admin_bind_keytab = DEF_STR;
char *sasl_realm = DEF_STR;
char *sasl_mech = DEF_STR;
char *privileged_group = DEF_STR;
static char *strvarnames[] = { "server_url", "users_base", "admin_principal",
"admin_keytab", "skeleton_dir", "homedir_mode", "refquota", "member_home",
"member_shell", "club_home", "club_shell", "realm", "admin_bind_userid",
"admin_bind_keytab", "groups_base", "privileged_group", "notify_hook",
"sasl_realm", "sasl_mech", "sudo_base", "member_home_acl",
"club_home_acl" };
static char **strvars[] = { &server_url, &users_base, &admin_principal,
&admin_keytab, &skeleton_dir, &homedir_mode, &refquota, &member_home,
&member_shell, &club_home, &club_shell, &realm, &admin_bind_userid,
&admin_bind_keytab, &groups_base, &privileged_group, &notify_hook,
&sasl_realm, &sasl_mech, &sudo_base, &member_home_acl, &club_home_acl };
static char *longvarnames[] = { "member_min_id", "member_max_id",
"club_min_id", "club_max_id" };
static long *longvars[] = { &member_min_id, &member_max_id,
&club_min_id, &club_max_id };
#define CONFIG_STR(x)
#define CONFIG_INT(x) {#x, &x},
static struct config_var_int int_vars[] = {
#include "config-vars.h"
};
#undef CONFIG_STR
#undef CONFIG_INT
void config_var(char *var, char *val) {
int i;
for (i = 0; i < sizeof(strvars)/sizeof(*strvars); i++) {
if (!strcmp(var, strvarnames[i])) {
if (!strvars[i])
free(strvars[i]);
*strvars[i] = xstrdup(val);
for (i = 0; i < sizeof(str_vars)/sizeof(*str_vars); i++) {
if (!strcmp(var, str_vars[i].name)) {
if (*str_vars[i].p)
free(*str_vars[i].p);
*str_vars[i].p = xstrdup(val);
}
}
for (i = 0; i < sizeof(longvars)/sizeof(*longvars); i++) {
if (!strcmp(var, longvarnames[i])) {
*longvars[i] = config_long(var, val);
for (i = 0; i < sizeof(int_vars)/sizeof(*int_vars); i++) {
if (!strcmp(var, int_vars[i].name)) {
*int_vars[i].p = config_long(var, val);
}
}
}
@ -85,13 +63,13 @@ void configure() {
config_parse(CONFIG_FILE);
for (i = 0; i < sizeof(strvars)/sizeof(*strvars); i++) {
if (*strvars[i] == DEF_STR)
badconf("undefined string variable: %s", strvarnames[i]);
for (i = 0; i < sizeof(str_vars)/sizeof(*str_vars); i++) {
if (*str_vars[i].p == DEF_STR)
badconf("undefined string variable: %s", str_vars[i].name);
}
for (i = 0; i < sizeof(longvars)/sizeof(*longvars); i++) {
if (*longvars[i] == DEF_LONG)
badconf("undefined long variable: %s", longvarnames[i]);
for (i = 0; i < sizeof(int_vars)/sizeof(*int_vars); i++) {
if (*int_vars[i].p == DEF_INT)
badconf("undefined integer variable: %s", int_vars[i].name);
}
}

View File

@ -1,42 +1,9 @@
#define CONFIG_FILE "/etc/csc/accounts.cf"
extern char *server_url;
extern char *users_base;
extern char *groups_base;
extern char *sudo_base;
extern char *skeleton_dir;
extern char *homedir_mode;
extern char *refquota;
extern char *member_shell;
extern long member_min_id;
extern long member_max_id;
extern char *member_home;
extern char *member_home_acl;
extern char *member_home_dacl;
extern char *club_shell;
extern long club_min_id;
extern long club_max_id;
extern char *club_home;
extern char *club_home_acl;
extern char *club_home_dacl;
extern char *notify_hook;
extern char *realm;
extern char *admin_principal;
extern char *admin_keytab;
extern char *admin_bind_userid;
extern char *admin_bind_keytab;
extern char *sasl_realm;
extern char *sasl_mech;
extern char *privileged_group;
#define CONFIG_STR(x) extern char *x;
#define CONFIG_INT(x) extern long x;
#include "config-vars.h"
#undef CONFIG_STR
#undef CONFIG_INT
void configure();