/* This file is autogenerated using tools/make-loadsave.pl, DO NOT EDIT! */
/* # cat src/structs.h | tools/make-loadsave.pl > src/loadsave-autogen.c */

static hashtype_t load_hashtype_t(const char *p);
static interfacemode_t load_interfacemode_t(const char *p);
static interfacetype_t load_interfacetype_t(const char *p);
static listtype_t load_listtype_t(const char *p);
static pformat_t load_pformat_t(const char *p);
static responsetype_t load_responsetype_t(const char *p);
static sorttype_t load_sorttype_t(const char *p);
static void add_field_hashtype_t(section_t *section, const char *name, hashtype_t p);
static void add_field_interfacemode_t(section_t *section, const char *name, interfacemode_t p);
static void add_field_interfacetype_t(section_t *section, const char *name, interfacetype_t p);
static void add_field_listtype_t(section_t *section, const char *name, listtype_t p);
static void add_field_pformat_t(section_t *section, const char *name, pformat_t p);
static void add_field_responsetype_t(section_t *section, const char *name, responsetype_t p);
static void add_field_sorttype_t(section_t *section, const char *name, sorttype_t p);
static void deinit_access_entry_t(section_t *section);
static void deinit_access_t(section_t *section);
static void deinit_channel_t(section_t *section);
static void deinit_global_t(section_t *section);
static void deinit_ignore_entry_t(section_t *section);
static void deinit_ignore_list_t(section_t *section);
static void deinit_interface_t(section_t *section);
static void deinit_netset_t(section_t *section);
static void deinit_network_t(section_t *section);
static void deinit_pack_t(section_t *section);
static void deinit_packlist_t(section_t *section);
static void deinit_pool_t(section_t *section);
static void deinit_queue_t(section_t *section);
static void deinit_send_t(section_t *section);
static void deinit_settings_t(section_t *section);
static void deinit_user_t(section_t *section);
static void init_access_entry_t(section_t *section);
static void init_access_t(section_t *section);
static void init_channel_t(section_t *section);
static void init_global_t(section_t *section);
static void init_ignore_entry_t(section_t *section);
static void init_ignore_list_t(section_t *section);
static void init_interface_t(section_t *section);
static void init_netset_t(section_t *section);
static void init_network_t(section_t *section);
static void init_pack_t(section_t *section);
static void init_packlist_t(section_t *section);
static void init_pool_t(section_t *section);
static void init_queue_t(section_t *section);
static void init_send_t(section_t *section);
static void init_settings_t(section_t *section);
static void init_user_t(section_t *section);
static void load_access_entry_t(section_t *section);
static void load_access_t(section_t *section);
static void load_channel_t(section_t *section);
static void load_global_t(section_t *section);
static void load_ignore_entry_t(section_t *section);
static void load_ignore_list_t(section_t *section);
static void load_interface_t(section_t *section);
static void load_netset_t(section_t *section);
static void load_network_t(section_t *section);
static void load_pack_t(section_t *section);
static void load_packlist_t(section_t *section);
static void load_pool_t(section_t *section);
static void load_queue_t(section_t *section);
static void load_send_t(section_t *section);
static void load_settings_t(section_t *section);
static void load_user_t(section_t *section);
static void ref_count_pack_t(section_t *section);
static void save_access_entry_t(config_t *config, access_entry_t *p);
static void save_access_t(config_t *config, access_t *p);
static void save_channel_t(config_t *config, channel_t *p);
static void save_global_t(config_t *config, global_t *p);
static void save_ignore_entry_t(config_t *config, ignore_entry_t *p);
static void save_ignore_list_t(config_t *config, ignore_list_t *p);
static void save_interface_t(config_t *config, interface_t *p);
static void save_netset_t(config_t *config, netset_t *p);
static void save_network_t(config_t *config, network_t *p);
static void save_pack_t(config_t *config, pack_t *p);
static void save_packlist_t(config_t *config, packlist_t *p);
static void save_pool_t(config_t *config, pool_t *p);
static void save_queue_t(config_t *config, queue_t *p);
static void save_send_t(config_t *config, send_t *p);
static void save_settings_t(config_t *config, settings_t *p);
static void save_user_t(config_t *config, user_t *p);



static hashtype_t load_hashtype_t(const char *p) {
	if(strcmp(p,"HASH_MD5") == 0) return HASH_MD5;
	if(strcmp(p,"HASH_CRC_AND_MD5") == 0) return HASH_CRC_AND_MD5;
	if(strcmp(p,"HASH_CRC") == 0) return HASH_CRC;
	if(strcmp(p,"HASH_NONE") == 0) return HASH_NONE;
	return 0;
}


static void add_field_hashtype_t(section_t *section, const char *name, hashtype_t p) {
	switch(p) {
		case HASH_MD5:
			add_field(section,name,"HASH_MD5");
			break;
		case HASH_CRC_AND_MD5:
			add_field(section,name,"HASH_CRC_AND_MD5");
			break;
		case HASH_CRC:
			add_field(section,name,"HASH_CRC");
			break;
		case HASH_NONE:
			add_field(section,name,"HASH_NONE");
			break;
		default:
			break;
	}
}


static responsetype_t load_responsetype_t(const char *p) {
	if(strcmp(p,"RESPONSE_PRIVMSG") == 0) return RESPONSE_PRIVMSG;
	if(strcmp(p,"RESPONSE_NOTICE") == 0) return RESPONSE_NOTICE;
	return 0;
}


static void add_field_responsetype_t(section_t *section, const char *name, responsetype_t p) {
	switch(p) {
		case RESPONSE_PRIVMSG:
			add_field(section,name,"RESPONSE_PRIVMSG");
			break;
		case RESPONSE_NOTICE:
			add_field(section,name,"RESPONSE_NOTICE");
			break;
		default:
			break;
	}
}


static sorttype_t load_sorttype_t(const char *p) {
	if(strcmp(p,"SORT_I_AZ") == 0) return SORT_I_AZ;
	if(strcmp(p,"SORT_ZA") == 0) return SORT_ZA;
	if(strcmp(p,"SORT_AZ") == 0) return SORT_AZ;
	if(strcmp(p,"SORT_NONE") == 0) return SORT_NONE;
	if(strcmp(p,"SORT_I_ZA") == 0) return SORT_I_ZA;
	return 0;
}


static void add_field_sorttype_t(section_t *section, const char *name, sorttype_t p) {
	switch(p) {
		case SORT_I_AZ:
			add_field(section,name,"SORT_I_AZ");
			break;
		case SORT_ZA:
			add_field(section,name,"SORT_ZA");
			break;
		case SORT_AZ:
			add_field(section,name,"SORT_AZ");
			break;
		case SORT_NONE:
			add_field(section,name,"SORT_NONE");
			break;
		case SORT_I_ZA:
			add_field(section,name,"SORT_I_ZA");
			break;
		default:
			break;
	}
}


static pformat_t load_pformat_t(const char *p) {
	if(strcmp(p,"PFORMAT_SUMMARY") == 0) return PFORMAT_SUMMARY;
	if(strcmp(p,"PFORMAT_FULL") == 0) return PFORMAT_FULL;
	if(strcmp(p,"PFORMAT_MINIMAL") == 0) return PFORMAT_MINIMAL;
	if(strcmp(p,"PFORMAT_TAGONLY") == 0) return PFORMAT_TAGONLY;
	return 0;
}


static void add_field_pformat_t(section_t *section, const char *name, pformat_t p) {
	switch(p) {
		case PFORMAT_SUMMARY:
			add_field(section,name,"PFORMAT_SUMMARY");
			break;
		case PFORMAT_FULL:
			add_field(section,name,"PFORMAT_FULL");
			break;
		case PFORMAT_MINIMAL:
			add_field(section,name,"PFORMAT_MINIMAL");
			break;
		case PFORMAT_TAGONLY:
			add_field(section,name,"PFORMAT_TAGONLY");
			break;
		default:
			break;
	}
}


static interfacetype_t load_interfacetype_t(const char *p) {
	if(strcmp(p,"INTERFACE_CHAT") == 0) return INTERFACE_CHAT;
	if(strcmp(p,"INTERFACE_SEND") == 0) return INTERFACE_SEND;
	if(strcmp(p,"INTERFACE_RECV") == 0) return INTERFACE_RECV;
	return 0;
}


static void add_field_interfacetype_t(section_t *section, const char *name, interfacetype_t p) {
	switch(p) {
		case INTERFACE_CHAT:
			add_field(section,name,"INTERFACE_CHAT");
			break;
		case INTERFACE_SEND:
			add_field(section,name,"INTERFACE_SEND");
			break;
		case INTERFACE_RECV:
			add_field(section,name,"INTERFACE_RECV");
			break;
		default:
			break;
	}
}


static interfacemode_t load_interfacemode_t(const char *p) {
	if(strcmp(p,"IMODE_NORMAL") == 0) return IMODE_NORMAL;
	if(strcmp(p,"IMODE_REVERSE") == 0) return IMODE_REVERSE;
	if(strcmp(p,"IMODE_DCCSERVER") == 0) return IMODE_DCCSERVER;
	return 0;
}


static void add_field_interfacemode_t(section_t *section, const char *name, interfacemode_t p) {
	switch(p) {
		case IMODE_NORMAL:
			add_field(section,name,"IMODE_NORMAL");
			break;
		case IMODE_REVERSE:
			add_field(section,name,"IMODE_REVERSE");
			break;
		case IMODE_DCCSERVER:
			add_field(section,name,"IMODE_DCCSERVER");
			break;
		default:
			break;
	}
}


static listtype_t load_listtype_t(const char *p) {
	if(strcmp(p,"LIST_TAGONLY") == 0) return LIST_TAGONLY;
	if(strcmp(p,"LIST_CHAT") == 0) return LIST_CHAT;
	if(strcmp(p,"LIST_NORMAL") == 0) return LIST_NORMAL;
	if(strcmp(p,"LIST_NOPACKS") == 0) return LIST_NOPACKS;
	return 0;
}


static void add_field_listtype_t(section_t *section, const char *name, listtype_t p) {
	switch(p) {
		case LIST_TAGONLY:
			add_field(section,name,"LIST_TAGONLY");
			break;
		case LIST_CHAT:
			add_field(section,name,"LIST_CHAT");
			break;
		case LIST_NORMAL:
			add_field(section,name,"LIST_NORMAL");
			break;
		case LIST_NOPACKS:
			add_field(section,name,"LIST_NOPACKS");
			break;
		default:
			break;
	}
}



static void init_ignore_entry_t(section_t *section) {
	section->ptr = alloc_ignore_entry();
}

static void deinit_ignore_entry_t(section_t *section) {
	if(section->ptr != NULL)
		free_ignore_entry((ignore_entry_t *)section->ptr);
}

static void load_ignore_entry_t(section_t *section) {
	ignore_entry_t *p = (ignore_entry_t *)section->ptr;
	char *lp;

	/* Load flags */
	lp = find_field(section,"flags");
	if(lp != NULL) {
		p->flags = load_int(lp);
	}
	
	/* Load expires */
	lp = find_field(section,"expires");
	if(lp != NULL) {
		p->expires = load_time_t(lp);
	}
	
	/* Load mask */
	lp = find_field(section,"mask");
	if(lp == NULL)
		fail_loading(section,"mask",NULL);
	else {
		p->mask = (char *)xstrdup(lp);
	}
	
}


static void save_ignore_entry_t(config_t *config, ignore_entry_t *p) {
	section_t *section = new_section("ignore_entry_t",p);

	/* Save flags */
	add_field_int(section,"flags",p->flags);
	
	/* Save expires */
	add_field_time_t(section,"expires",p->expires);
	
	/* Save mask */
	add_field_char(section,"mask",p->mask);
	
	add_section(config,section);
}


static void init_network_t(section_t *section) {
	section->ptr = alloc_network(NULL);
}

static void deinit_network_t(section_t *section) {
	if(section->ptr != NULL)
		free_network((network_t *)section->ptr);
}

static void load_network_t(section_t *section) {
	network_t *p = (network_t *)section->ptr;
	char **lpp;
	char *lp;
	int i;
	int j;
	void *vp;

	/* Load channels */
	lpp = find_fields(section,"channels",&j);
	if(lpp != NULL) {
		for(i = 0; i < j; ++i) {
			vp = find_ptr(section,lpp[i]);
			if(vp != NULL)
				PTRARR_ADD(&(p->channels),&(p->no_channels),vp);
		}
		xfree(lpp);
	}
	
	/* Load on_connects */
	lpp = find_fields(section,"on_connects",&j);
	if(lpp != NULL) {
		for(i = 0; i < j; ++i) {
			PTRARR_ADD(&(p->on_connects),&(p->no_on_connects),xstrdup(lpp[i]));
		}
		xfree(lpp);
	}
	
	/* Load name */
	lp = find_field(section,"name");
	if(lp == NULL)
		fail_loading(section,"name",NULL);
	else {
		p->name = (char *)xstrdup(lp);
	}
	
	/* Load deleted */
	lp = find_field(section,"deleted");
	if(lp != NULL) {
		p->deleted = load_time_t(lp);
	}
	
	/* Load settings */
	lp = find_field(section,"settings");
	if(lp != NULL) {
		vp = find_ptr(section,lp);
		p->settings = (netset_t *)vp;
	}
	
	/* Load servers */
	lpp = find_fields(section,"servers",&j);
	if(lpp != NULL) {
		for(i = 0; i < j; ++i) {
			PTRARR_ADD(&(p->servers),&(p->no_servers),xstrdup(lpp[i]));
		}
		xfree(lpp);
	}
	
}


static void save_network_t(config_t *config, network_t *p) {
	section_t *section = new_section("network_t",p);
	int i;

	/* Lock lock */
	LOCKR(&(p->lock));
	
	/* Save channels */
	for(i = 0; i < p->no_channels; ++i) {
		save_channel_t(config,p->channels[i]);
		add_field_ptr(section,"channels","channel_t",p->channels[i]);
	}
	
	/* Save on_connects */
	for(i = 0; i < p->no_on_connects; ++i) {
		add_field_char(section,"on_connects",p->on_connects[i]);
	}
	
	/* Save name */
	add_field_char(section,"name",p->name);
	
	/* Save deleted */
	add_field_time_t(section,"deleted",p->deleted);
	
	/* Save settings */
	save_netset_t(config,p->settings);
	add_field_ptr(section,"settings","netset_t",p->settings);
	
	/* Save servers */
	for(i = 0; i < p->no_servers; ++i) {
		add_field_char(section,"servers",p->servers[i]);
	}
	
	/* Unlock lock */
	UNLOCKR(&(p->lock));
	
	add_section(config,section);
}


static void init_global_t(section_t *section) {
	section->ptr = alloc_global();
}

static void deinit_global_t(section_t *section) {
	if(section->ptr != NULL)
		free_global((global_t *)section->ptr);
}

static void load_global_t(section_t *section) {
	global_t *p = (global_t *)section->ptr;
	char **lpp;
	char *lp;
	int i;
	int j;
	void *vp;

	/* Load users */
	lpp = find_fields(section,"users",&j);
	if(lpp != NULL) {
		for(i = 0; i < j; ++i) {
			vp = find_ptr(section,lpp[i]);
			if(vp != NULL)
				PTRARR_ADD(&(p->users),&(p->no_users),vp);
		}
		xfree(lpp);
	}
	
	/* Load interfaces */
	lpp = find_fields(section,"interfaces",&j);
	if(lpp != NULL) {
		for(i = 0; i < j; ++i) {
			vp = find_ptr(section,lpp[i]);
			if(vp != NULL)
				PTRARR_ADD(&(p->interfaces),&(p->no_interfaces),vp);
		}
		xfree(lpp);
	}
	
	/* Load ignore_list */
	lp = find_field(section,"ignore_list");
	if(lp != NULL) {
		vp = find_ptr(section,lp);
		if(p->ignore_list != NULL && vp != NULL)
			free_ignore_list(p->ignore_list);
		if(vp != NULL)
			p->ignore_list = (ignore_list_t *)vp;
	}
	
	/* Load network_settings */
	lp = find_field(section,"network_settings");
	if(lp == NULL)
		fail_loading(section,"network_settings",NULL);
	else {
		vp = find_ptr(section,lp);
		if(p->network_settings != NULL && vp != NULL)
			free_netset(p->network_settings);
		if(vp != NULL)
			p->network_settings = (netset_t *)vp;
		if(p->network_settings == NULL)
			fail_loading(section,"network_settings",lp);
	}
	
	/* Load packlists */
	lpp = find_fields(section,"packlists",&j);
	if(lpp != NULL) {
		for(i = 0; i < j; ++i) {
			vp = find_ptr(section,lpp[i]);
			if(vp != NULL)
				PTRARR_ADD(&(p->packlists),&(p->no_packlists),vp);
		}
		xfree(lpp);
	}
	
	/* Load networks */
	lpp = find_fields(section,"networks",&j);
	if(lpp != NULL) {
		for(i = 0; i < j; ++i) {
			vp = find_ptr(section,lpp[i]);
			if(vp != NULL)
				PTRARR_ADD(&(p->networks),&(p->no_networks),vp);
		}
		xfree(lpp);
	}
	
	/* Load settings */
	lp = find_field(section,"settings");
	if(lp == NULL)
		fail_loading(section,"settings",NULL);
	else {
		vp = find_ptr(section,lp);
		if(p->settings != NULL && vp != NULL)
			free_settings(p->settings);
		if(vp != NULL)
			p->settings = (settings_t *)vp;
		if(p->settings == NULL)
			fail_loading(section,"settings",lp);
	}
	
	/* Load queues */
	lpp = find_fields(section,"queues",&j);
	if(lpp != NULL) {
		for(i = 0; i < j; ++i) {
			vp = find_ptr(section,lpp[i]);
			if(vp != NULL)
				PTRARR_ADD(&(p->queues),&(p->no_queues),vp);
		}
		xfree(lpp);
	}
	
}


static void save_global_t(config_t *config, global_t *p) {
	section_t *section = new_section("global_t",p);
	int i;

	/* Lock lock */
	LOCKR(&(p->lock));
	
	/* Save users */
	for(i = 0; i < p->no_users; ++i) {
		save_user_t(config,p->users[i]);
		add_field_ptr(section,"users","user_t",p->users[i]);
	}
	
	/* Save interfaces */
	for(i = 0; i < p->no_interfaces; ++i) {
		save_interface_t(config,p->interfaces[i]);
		add_field_ptr(section,"interfaces","interface_t",p->interfaces[i]);
	}
	
	/* Save ignore_list */
	save_ignore_list_t(config,p->ignore_list);
	add_field_ptr(section,"ignore_list","ignore_list_t",p->ignore_list);
	
	/* Save network_settings */
	save_netset_t(config,p->network_settings);
	add_field_ptr(section,"network_settings","netset_t",p->network_settings);
	
	/* Save packlists */
	for(i = 0; i < p->no_packlists; ++i) {
		save_packlist_t(config,p->packlists[i]);
		add_field_ptr(section,"packlists","packlist_t",p->packlists[i]);
	}
	
	/* Save networks */
	for(i = 0; i < p->no_networks; ++i) {
		save_network_t(config,p->networks[i]);
		add_field_ptr(section,"networks","network_t",p->networks[i]);
	}
	
	/* Save settings */
	save_settings_t(config,p->settings);
	add_field_ptr(section,"settings","settings_t",p->settings);
	
	/* Save queues */
	for(i = 0; i < p->no_queues; ++i) {
		save_queue_t(config,p->queues[i]);
		add_field_ptr(section,"queues","queue_t",p->queues[i]);
	}
	
	/* Unlock lock */
	UNLOCKR(&(p->lock));
	
	add_section(config,section);
}


static void init_user_t(section_t *section) {
	section->ptr = alloc_user(NULL);
}

static void deinit_user_t(section_t *section) {
	if(section->ptr != NULL)
		free_user((user_t *)section->ptr);
}

static void load_user_t(section_t *section) {
	user_t *p = (user_t *)section->ptr;
	char **lpp;
	char *lp;
	int i;
	int j;
	void *vp;

	/* Load hosts */
	lpp = find_fields(section,"hosts",&j);
	if(lpp != NULL) {
		for(i = 0; i < j; ++i) {
			PTRARR_ADD(&(p->hosts),&(p->no_hosts),xstrdup(lpp[i]));
		}
		xfree(lpp);
	}
	
	/* Load privs */
	lp = find_field(section,"privs");
	if(lp != NULL) {
		p->privs = (char *)xstrdup(lp);
	}
	
	/* Load deleted */
	lp = find_field(section,"deleted");
	if(lp != NULL) {
		p->deleted = load_time_t(lp);
	}
	
	/* Load packlists */
	lpp = find_fields(section,"packlists",&j);
	if(lpp != NULL) {
		for(i = 0; i < j; ++i) {
			vp = find_ptr(section,lpp[i]);
			if(vp != NULL)
				PTRARR_ADD(&(p->packlists),&(p->no_packlists),vp);
		}
		xfree(lpp);
	}
	
	/* Load username */
	lp = find_field(section,"username");
	if(lp == NULL)
		fail_loading(section,"username",NULL);
	else {
		p->username = (char *)xstrdup(lp);
	}
	
	/* Load last_logon */
	lp = find_field(section,"last_logon");
	if(lp != NULL) {
		p->last_logon = load_time_t(lp);
	}
	
	/* Load password */
	lp = find_field(section,"password");
	if(lp != NULL) {
		p->password = (char *)xstrdup(lp);
	}
	
	/* Load dirs */
	lpp = find_fields(section,"dirs",&j);
	if(lpp != NULL) {
		for(i = 0; i < j; ++i) {
			PTRARR_ADD(&(p->dirs),&(p->no_dirs),xstrdup(lpp[i]));
		}
		xfree(lpp);
	}
	
	/* Load no_permitted_logons */
	lp = find_field(section,"no_permitted_logons");
	if(lp != NULL) {
		p->no_permitted_logons = load_int(lp);
	}
	
}


static void save_user_t(config_t *config, user_t *p) {
	section_t *section = new_section("user_t",p);
	int i;

	/* Lock lock */
	LOCKR(&(p->lock));
	
	/* Save hosts */
	for(i = 0; i < p->no_hosts; ++i) {
		add_field_char(section,"hosts",p->hosts[i]);
	}
	
	/* Save privs */
	add_field_char(section,"privs",p->privs);
	
	/* Save deleted */
	add_field_time_t(section,"deleted",p->deleted);
	
	/* Save packlists */
	for(i = 0; i < p->no_packlists; ++i) {
		add_field_ptr(section,"packlists","packlist_t",p->packlists[i]);
	}
	
	/* Save username */
	add_field_char(section,"username",p->username);
	
	/* Save last_logon */
	add_field_time_t(section,"last_logon",p->last_logon);
	
	/* Save password */
	add_field_char(section,"password",p->password);
	
	/* Save dirs */
	for(i = 0; i < p->no_dirs; ++i) {
		add_field_char(section,"dirs",p->dirs[i]);
	}
	
	/* Save no_permitted_logons */
	add_field_int(section,"no_permitted_logons",p->no_permitted_logons);
	
	/* Unlock lock */
	UNLOCKR(&(p->lock));
	
	add_section(config,section);
}


static void init_packlist_t(section_t *section) {
	section->ptr = alloc_packlist();
}

static void deinit_packlist_t(section_t *section) {
	if(section->ptr != NULL)
		free_packlist((packlist_t *)section->ptr);
}

static void load_packlist_t(section_t *section) {
	packlist_t *p = (packlist_t *)section->ptr;
	char **lpp;
	char *lp;
	int i;
	int j;
	void *vp;

	/* Load packs */
	lpp = find_fields(section,"packs",&j);
	if(lpp != NULL) {
		for(i = 0; i < j; ++i) {
			vp = find_ptr(section,lpp[i]);
			if(vp != NULL)
				PTRARR_ADD(&(p->packs),&(p->no_packs),vp);
		}
		xfree(lpp);
	}
	
	/* Load retries */
	lp = find_field(section,"retries");
	if(lp != NULL) {
		p->retries = load_int(lp);
	}
	
	/* Load filters */
	lpp = find_fields(section,"filters",&j);
	if(lpp != NULL) {
		for(i = 0; i < j; ++i) {
			PTRARR_ADD(&(p->filters),&(p->no_filters),xstrdup(lpp[i]));
		}
		xfree(lpp);
	}
	
	/* Load nosend_reason */
	lp = find_field(section,"nosend_reason");
	if(lp != NULL) {
		p->nosend_reason = (char *)xstrdup(lp);
	}
	
	/* Load nolist */
	lp = find_field(section,"nolist");
	if(lp != NULL) {
		p->nolist = load_time_t(lp);
	}
	
	/* Load ignore_list */
	lp = find_field(section,"ignore_list");
	if(lp != NULL) {
		vp = find_ptr(section,lp);
		if(p->ignore_list != NULL && vp != NULL)
			free_ignore_list(p->ignore_list);
		if(vp != NULL)
			p->ignore_list = (ignore_list_t *)vp;
	}
	
	/* Load dirs */
	lpp = find_fields(section,"dirs",&j);
	if(lpp != NULL) {
		for(i = 0; i < j; ++i) {
			PTRARR_ADD(&(p->dirs),&(p->no_dirs),xstrdup(lpp[i]));
		}
		xfree(lpp);
	}
	
	/* Load last_scan */
	lp = find_field(section,"last_scan");
	if(lp != NULL) {
		p->last_scan = load_time_t(lp);
	}
	
	/* Load command_limit */
	lp = find_field(section,"command_limit");
	if(lp != NULL) {
		p->command_limit = load_int(lp);
	}
	
	/* Load access */
	lp = find_field(section,"access");
	if(lp != NULL) {
		vp = find_ptr(section,lp);
		if(p->access != NULL && vp != NULL)
			free_access(p->access);
		if(vp != NULL)
			p->access = (access_t *)vp;
	}
	
	/* Load response */
	lp = find_field(section,"response");
	if(lp != NULL) {
		p->response = load_responsetype_t(lp);
	}
	
	/* Load name */
	lp = find_field(section,"name");
	if(lp == NULL)
		fail_loading(section,"name",NULL);
	else {
		p->name = (char *)xstrdup(lp);
	}
	
	/* Load deleted */
	lp = find_field(section,"deleted");
	if(lp != NULL) {
		p->deleted = load_time_t(lp);
	}
	
	/* Load no_filters */
	lp = find_field(section,"no_filters");
	if(lp != NULL) {
		p->no_filters = load_int(lp);
	}
	
	/* Load chat_interface */
	lp = find_field(section,"chat_interface");
	if(lp != NULL) {
		vp = find_ptr(section,lp);
		p->chat_interface = (interface_t *)vp;
	}
	
	/* Load dir_scan_interval */
	lp = find_field(section,"dir_scan_interval");
	if(lp != NULL) {
		p->dir_scan_interval = load_uint32_t(lp);
	}
	
	/* Load taglines */
	lpp = find_fields(section,"taglines",&j);
	if(lpp != NULL) {
		for(i = 0; i < j; ++i) {
			PTRARR_ADD(&(p->taglines),&(p->no_taglines),xstrdup(lpp[i]));
		}
		xfree(lpp);
	}
	
	/* Load nolist_reason */
	lp = find_field(section,"nolist_reason");
	if(lp != NULL) {
		p->nolist_reason = (char *)xstrdup(lp);
	}
	
	/* Load scan_depth */
	lp = find_field(section,"scan_depth");
	if(lp != NULL) {
		p->scan_depth = load_int(lp);
	}
	
	/* Load nosend */
	lp = find_field(section,"nosend");
	if(lp != NULL) {
		p->nosend = load_time_t(lp);
	}
	
	/* Load auto_sort */
	lp = find_field(section,"auto_sort");
	if(lp != NULL) {
		p->auto_sort = load_sorttype_t(lp);
	}
	
	/* Load queue */
	lp = find_field(section,"queue");
	if(lp == NULL)
		fail_loading(section,"queue",NULL);
	else {
		vp = find_ptr(section,lp);
		p->queue = (queue_t *)vp;
		if(p->queue == NULL)
			fail_loading(section,"queue",lp);
	}
	
	/* Load type */
	lp = find_field(section,"type");
	if(lp != NULL) {
		p->type = load_listtype_t(lp);
	}
	
	/* Load time_limit */
	lp = find_field(section,"time_limit");
	if(lp != NULL) {
		p->time_limit = load_int(lp);
	}
	
	/* Load hash_display */
	lp = find_field(section,"hash_display");
	if(lp != NULL) {
		p->hash_display = load_hashtype_t(lp);
	}
	
}


static void save_packlist_t(config_t *config, packlist_t *p) {
	section_t *section = new_section("packlist_t",p);
	int i;

	/* Lock lock */
	LOCKR(&(p->lock));
	
	/* Save packs */
	for(i = 0; i < p->no_packs; ++i) {
		save_pack_t(config,p->packs[i]);
		add_field_ptr(section,"packs","pack_t",p->packs[i]);
	}
	
	/* Save retries */
	add_field_int(section,"retries",p->retries);
	
	/* Save filters */
	for(i = 0; i < p->no_filters; ++i) {
		add_field_char(section,"filters",p->filters[i]);
	}
	
	/* Save nosend_reason */
	add_field_char(section,"nosend_reason",p->nosend_reason);
	
	/* Save nolist */
	add_field_time_t(section,"nolist",p->nolist);
	
	/* Save ignore_list */
	save_ignore_list_t(config,p->ignore_list);
	add_field_ptr(section,"ignore_list","ignore_list_t",p->ignore_list);
	
	/* Save dirs */
	for(i = 0; i < p->no_dirs; ++i) {
		add_field_char(section,"dirs",p->dirs[i]);
	}
	
	/* Save last_scan */
	add_field_time_t(section,"last_scan",p->last_scan);
	
	/* Save command_limit */
	add_field_int(section,"command_limit",p->command_limit);
	
	/* Save access */
	save_access_t(config,p->access);
	add_field_ptr(section,"access","access_t",p->access);
	
	/* Save response */
	add_field_responsetype_t(section,"response",p->response);
	
	/* Save name */
	add_field_char(section,"name",p->name);
	
	/* Save deleted */
	add_field_time_t(section,"deleted",p->deleted);
	
	/* Save no_filters */
	add_field_int(section,"no_filters",p->no_filters);
	
	/* Save chat_interface */
	add_field_ptr(section,"chat_interface","interface_t",p->chat_interface);
	
	/* Save dir_scan_interval */
	add_field_uint32_t(section,"dir_scan_interval",p->dir_scan_interval);
	
	/* Save taglines */
	for(i = 0; i < p->no_taglines; ++i) {
		add_field_char(section,"taglines",p->taglines[i]);
	}
	
	/* Save nolist_reason */
	add_field_char(section,"nolist_reason",p->nolist_reason);
	
	/* Save scan_depth */
	add_field_int(section,"scan_depth",p->scan_depth);
	
	/* Save nosend */
	add_field_time_t(section,"nosend",p->nosend);
	
	/* Save auto_sort */
	add_field_sorttype_t(section,"auto_sort",p->auto_sort);
	
	/* Save queue */
	add_field_ptr(section,"queue","queue_t",p->queue);
	
	/* Save type */
	add_field_listtype_t(section,"type",p->type);
	
	/* Save time_limit */
	add_field_int(section,"time_limit",p->time_limit);
	
	/* Save hash_display */
	add_field_hashtype_t(section,"hash_display",p->hash_display);
	
	/* Unlock lock */
	UNLOCKR(&(p->lock));
	
	add_section(config,section);
}


static void init_pack_t(section_t *section) {
	section->ptr = alloc_pack();
}

static void deinit_pack_t(section_t *section) {
	if(section->ptr != NULL)
		free_pack((pack_t *)section->ptr);
}

static void load_pack_t(section_t *section) {
	pack_t *p = (pack_t *)section->ptr;
	char *lp;

	/* Load crc */
	lp = find_field(section,"crc");
	if(lp != NULL) {
		p->crc = (char *)xstrdup(lp);
	}
	
	/* Load file */
	lp = find_field(section,"file");
	if(lp == NULL)
		fail_loading(section,"file",NULL);
	else {
		p->file = (char *)xstrdup(lp);
	}
	
	/* Load size */
	lp = find_field(section,"size");
	if(lp != NULL) {
		p->size = load_off_t(lp);
	}
	
	/* Load hashed */
	lp = find_field(section,"hashed");
	if(lp != NULL) {
		p->hashed = load_time_t(lp);
	}
	
	/* Load no_gets */
	lp = find_field(section,"no_gets");
	if(lp != NULL) {
		p->no_gets = load_int(lp);
	}
	
	/* Load label */
	lp = find_field(section,"label");
	if(lp != NULL) {
		p->label = (char *)xstrdup(lp);
	}
	
	/* Load md5 */
	lp = find_field(section,"md5");
	if(lp != NULL) {
		p->md5 = (char *)xstrdup(lp);
	}
	
}

static void ref_count_pack_t(section_t *section) {
	pack_t *p = (pack_t *)section->ptr;
	p->ref_count = section->ptr_ref;
}


static void save_pack_t(config_t *config, pack_t *p) {
	section_t *section = new_section("pack_t",p);

	/* Lock lock */
	RLOCKR(&(p->lock));
	
	/* Save crc */
	add_field_char(section,"crc",p->crc);
	
	/* Save file */
	add_field_char(section,"file",p->file);
	
	/* Save size */
	add_field_off_t(section,"size",p->size);
	
	/* Save hashed */
	add_field_time_t(section,"hashed",p->hashed);
	
	/* Save no_gets */
	add_field_int(section,"no_gets",p->no_gets);
	
	/* Save label */
	add_field_char(section,"label",p->label);
	
	/* Save md5 */
	add_field_char(section,"md5",p->md5);
	
	/* Unlock lock */
	RUNLOCKR(&(p->lock));
	
	add_section(config,section);
}


static void init_ignore_list_t(section_t *section) {
	section->ptr = alloc_ignore_list();
}

static void deinit_ignore_list_t(section_t *section) {
	if(section->ptr != NULL)
		free_ignore_list((ignore_list_t *)section->ptr);
}

static void load_ignore_list_t(section_t *section) {
	ignore_list_t *p = (ignore_list_t *)section->ptr;
	char **lpp;
	char *lp;
	int i;
	int j;
	void *vp;

	/* Load trigger */
	lp = find_field(section,"trigger");
	if(lp != NULL) {
		p->trigger = load_int(lp);
	}
	
	/* Load period */
	lp = find_field(section,"period");
	if(lp != NULL) {
		p->period = load_int(lp);
	}
	
	/* Load entries */
	lpp = find_fields(section,"entries",&j);
	if(lpp != NULL) {
		for(i = 0; i < j; ++i) {
			vp = find_ptr(section,lpp[i]);
			if(vp != NULL)
				PTRARR_ADD(&(p->entries),&(p->no_entries),vp);
		}
		xfree(lpp);
	}
	
	/* Load last_prune */
	lp = find_field(section,"last_prune");
	if(lp != NULL) {
		p->last_prune = load_time_t(lp);
	}
	
	/* Load log */
	lp = find_field(section,"log");
	if(lp != NULL) {
		p->log = load_int(lp);
	}
	
}


static void save_ignore_list_t(config_t *config, ignore_list_t *p) {
	section_t *section = new_section("ignore_list_t",p);
	int i;

	/* Lock lock */
	LOCKR(&(p->lock));
	
	/* Save trigger */
	add_field_int(section,"trigger",p->trigger);
	
	/* Save period */
	add_field_int(section,"period",p->period);
	
	/* Save entries */
	for(i = 0; i < p->no_entries; ++i) {
		save_ignore_entry_t(config,p->entries[i]);
		add_field_ptr(section,"entries","ignore_entry_t",p->entries[i]);
	}
	
	/* Save last_prune */
	add_field_time_t(section,"last_prune",p->last_prune);
	
	/* Save log */
	add_field_int(section,"log",p->log);
	
	/* Unlock lock */
	UNLOCKR(&(p->lock));
	
	add_section(config,section);
}


static void init_channel_t(section_t *section) {
	section->ptr = alloc_channel();
}

static void deinit_channel_t(section_t *section) {
	if(section->ptr != NULL)
		free_channel((channel_t *)section->ptr);
}

static void load_channel_t(section_t *section) {
	channel_t *p = (channel_t *)section->ptr;
	char **lpp;
	char *lp;
	int i;
	int j;

	/* Load key */
	lp = find_field(section,"key");
	if(lp != NULL) {
		p->key = (char *)xstrdup(lp);
	}
	
	/* Load nolist */
	lp = find_field(section,"nolist");
	if(lp != NULL) {
		p->nolist = load_time_t(lp);
	}
	
	/* Load plist */
	lp = find_field(section,"plist");
	if(lp != NULL) {
		p->plist = load_int(lp);
	}
	
	/* Load pformat */
	lp = find_field(section,"pformat");
	if(lp != NULL) {
		p->pformat = load_pformat_t(lp);
	}
	
	/* Load name */
	lp = find_field(section,"name");
	if(lp == NULL)
		fail_loading(section,"name",NULL);
	else {
		p->name = (char *)xstrdup(lp);
	}
	
	/* Load deleted */
	lp = find_field(section,"deleted");
	if(lp != NULL) {
		p->deleted = load_time_t(lp);
	}
	
	/* Load track_key */
	lp = find_field(section,"track_key");
	if(lp != NULL) {
		p->track_key = load_int(lp);
	}
	
	/* Load taglines */
	lpp = find_fields(section,"taglines",&j);
	if(lpp != NULL) {
		for(i = 0; i < j; ++i) {
			PTRARR_ADD(&(p->taglines),&(p->no_taglines),xstrdup(lpp[i]));
		}
		xfree(lpp);
	}
	
}


static void save_channel_t(config_t *config, channel_t *p) {
	section_t *section = new_section("channel_t",p);
	int i;

	/* Lock lock */
	LOCKR(&(p->lock));
	
	/* Save key */
	add_field_char(section,"key",p->key);
	
	/* Save nolist */
	add_field_time_t(section,"nolist",p->nolist);
	
	/* Save plist */
	add_field_int(section,"plist",p->plist);
	
	/* Save pformat */
	add_field_pformat_t(section,"pformat",p->pformat);
	
	/* Save name */
	add_field_char(section,"name",p->name);
	
	/* Save deleted */
	add_field_time_t(section,"deleted",p->deleted);
	
	/* Save track_key */
	add_field_int(section,"track_key",p->track_key);
	
	/* Save taglines */
	for(i = 0; i < p->no_taglines; ++i) {
		add_field_char(section,"taglines",p->taglines[i]);
	}
	
	/* Unlock lock */
	UNLOCKR(&(p->lock));
	
	add_section(config,section);
}


static void init_interface_t(section_t *section) {
	section->ptr = alloc_interface(load_interfacetype_t(find_field(section,"type")));
}

static void deinit_interface_t(section_t *section) {
	if(section->ptr != NULL)
		free_interface((interface_t *)section->ptr);
}

static void load_interface_t(section_t *section) {
	interface_t *p = (interface_t *)section->ptr;
	char **lpp;
	char *lp;
	int i;
	int j;
	void *vp;

	/* Load bind_ip */
	lp = find_field(section,"bind_ip");
	if(lp != NULL) {
		p->bind_ip = (char *)xstrdup(lp);
	}
	
	/* Load mode */
	lp = find_field(section,"mode");
	if(lp != NULL) {
		p->mode = load_interfacemode_t(lp);
	}
	
	/* Load dcc_port */
	lp = find_field(section,"dcc_port");
	if(lp != NULL) {
		p->dcc_port = load_unsigned_int(lp);
	}
	
	/* Load accept_per_sec */
	lp = find_field(section,"accept_per_sec");
	if(lp != NULL) {
		p->accept_per_sec = load_int(lp);
	}
	
	/* Load snd_bufsize */
	lp = find_field(section,"snd_bufsize");
	if(lp != NULL) {
		p->snd_bufsize = load_unsigned_int(lp);
	}
	
	/* Load dccserver_port */
	lp = find_field(section,"dccserver_port");
	if(lp != NULL) {
		p->dccserver_port = load_unsigned_int(lp);
	}
	
	/* Load def */
	lp = find_field(section,"def");
	if(lp != NULL) {
		p->def = load_int(lp);
	}
	
	/* Load stat_carry */
	lp = find_field(section,"stat_carry");
	if(lp != NULL) {
		p->stat_carry = load_uint32_t(lp);
	}
	
	/* Load dcc_timeout */
	lp = find_field(section,"dcc_timeout");
	if(lp != NULL) {
		p->dcc_timeout = load_unsigned_int(lp);
	}
	
	/* Load rcv_bufsize */
	lp = find_field(section,"rcv_bufsize");
	if(lp != NULL) {
		p->rcv_bufsize = load_unsigned_int(lp);
	}
	
	/* Load no_ports */
	lp = find_field(section,"no_ports");
	if(lp != NULL) {
		p->no_ports = load_unsigned_int(lp);
	}
	
	/* Load name */
	lp = find_field(section,"name");
	if(lp == NULL)
		fail_loading(section,"name",NULL);
	else {
		p->name = (char *)xstrdup(lp);
	}
	
	/* Load deleted */
	lp = find_field(section,"deleted");
	if(lp != NULL) {
		p->deleted = load_time_t(lp);
	}
	
	/* Load secure_mode */
	lp = find_field(section,"secure_mode");
	if(lp != NULL) {
		p->secure_mode = load_int(lp);
	}
	
	/* Load stat_mib */
	lp = find_field(section,"stat_mib");
	if(lp != NULL) {
		p->stat_mib = load_uint32_t(lp);
	}
	
	/* Load bandwidth */
	lp = find_field(section,"bandwidth");
	if(lp != NULL) {
		p->bandwidth = load_unsigned_int(lp);
	}
	
	/* Load record_rate */
	lp = find_field(section,"record_rate");
	if(lp != NULL) {
		p->record_rate = load_uint32_t(lp);
	}
	
	/* Load type */
	lp = find_field(section,"type");
	if(lp != NULL) {
		p->type = load_interfacetype_t(lp);
	}
	
	/* Load advertise_ip */
	lp = find_field(section,"advertise_ip");
	if(lp != NULL) {
		p->advertise_ip = (char *)xstrdup(lp);
	}
	
	/* Load dcc_packet */
	lp = find_field(section,"dcc_packet");
	if(lp != NULL) {
		p->dcc_packet = load_unsigned_int(lp);
	}
	
	/* Load send */
	if(p->type==INTERFACE_SEND) {
		/* Load send.pools */
		lpp = find_fields(section,"send.pools",&j);
		if(lpp != NULL) {
			for(i = 0; i < j; ++i) {
				vp = find_ptr(section,lpp[i]);
				if(vp != NULL)
					PTRARR_ADD(&(p->send.pools),&(p->send.no_pools),vp);
			}
			xfree(lpp);
		}
		
	}
	
	/* Load chat */
	if(p->type==INTERFACE_CHAT) {
		/* Load chat.max_no */
		lp = find_field(section,"chat.max_no");
		if(lp != NULL) {
			p->chat.max_no = load_int(lp);
		}
		
	}
	
	/* Load recv */
	if(p->type==INTERFACE_RECV) {
		/* Load recv.max_no_uploads */
		lp = find_field(section,"recv.max_no_uploads");
		if(lp != NULL) {
			p->recv.max_no_uploads = load_int(lp);
		}
		
		/* Load recv.access */
		lp = find_field(section,"recv.access");
		if(lp != NULL) {
			vp = find_ptr(section,lp);
			if(p->recv.access != NULL && vp != NULL)
				free_access(p->recv.access);
			if(vp != NULL)
				p->recv.access = (access_t *)vp;
		}
		
		/* Load recv.max_size */
		lp = find_field(section,"recv.max_size");
		if(lp != NULL) {
			p->recv.max_size = load_off_t(lp);
		}
		
		/* Load recv.dir */
		lp = find_field(section,"recv.dir");
		if(lp != NULL) {
			p->recv.dir = (char *)xstrdup(lp);
		}
		
	}
	
}


static void save_interface_t(config_t *config, interface_t *p) {
	section_t *section = new_section("interface_t",p);
	int i;

	/* Lock lock */
	LOCKR(&(p->lock));
	
	/* Save bind_ip */
	add_field_char(section,"bind_ip",p->bind_ip);
	
	/* Save send */
	if(p->type==INTERFACE_SEND) {
		/* Save send.pools */
		for(i = 0; i < p->send.no_pools; ++i) {
			save_pool_t(config,p->send.pools[i]);
			add_field_ptr(section,"send.pools","pool_t",p->send.pools[i]);
		}
		
	}
	
	/* Save mode */
	add_field_interfacemode_t(section,"mode",p->mode);
	
	/* Save dcc_port */
	add_field_unsigned_int(section,"dcc_port",p->dcc_port);
	
	/* Save accept_per_sec */
	add_field_int(section,"accept_per_sec",p->accept_per_sec);
	
	/* Save snd_bufsize */
	add_field_unsigned_int(section,"snd_bufsize",p->snd_bufsize);
	
	/* Save dccserver_port */
	add_field_unsigned_int(section,"dccserver_port",p->dccserver_port);
	
	/* Save def */
	add_field_int(section,"def",p->def);
	
	/* Save stat_carry */
	add_field_uint32_t(section,"stat_carry",p->stat_carry);
	
	/* Save dcc_timeout */
	add_field_unsigned_int(section,"dcc_timeout",p->dcc_timeout);
	
	/* Save rcv_bufsize */
	add_field_unsigned_int(section,"rcv_bufsize",p->rcv_bufsize);
	
	/* Save no_ports */
	add_field_unsigned_int(section,"no_ports",p->no_ports);
	
	/* Save name */
	add_field_char(section,"name",p->name);
	
	/* Save deleted */
	add_field_time_t(section,"deleted",p->deleted);
	
	/* Save chat */
	if(p->type==INTERFACE_CHAT) {
		/* Save chat.max_no */
		add_field_int(section,"chat.max_no",p->chat.max_no);
		
	}
	
	/* Save secure_mode */
	add_field_int(section,"secure_mode",p->secure_mode);
	
	/* Save stat_mib */
	add_field_uint32_t(section,"stat_mib",p->stat_mib);
	
	/* Save bandwidth */
	add_field_unsigned_int(section,"bandwidth",p->bandwidth);
	
	/* Save recv */
	if(p->type==INTERFACE_RECV) {
		/* Save recv.max_no_uploads */
		add_field_int(section,"recv.max_no_uploads",p->recv.max_no_uploads);
		
		/* Save recv.access */
		save_access_t(config,p->recv.access);
		add_field_ptr(section,"recv.access","access_t",p->recv.access);
		
		/* Save recv.max_size */
		add_field_off_t(section,"recv.max_size",p->recv.max_size);
		
		/* Save recv.dir */
		add_field_char(section,"recv.dir",p->recv.dir);
		
	}
	
	/* Save record_rate */
	add_field_uint32_t(section,"record_rate",p->record_rate);
	
	/* Save type */
	add_field_interfacetype_t(section,"type",p->type);
	
	/* Save advertise_ip */
	add_field_char(section,"advertise_ip",p->advertise_ip);
	
	/* Save dcc_packet */
	add_field_unsigned_int(section,"dcc_packet",p->dcc_packet);
	
	/* Unlock lock */
	UNLOCKR(&(p->lock));
	
	add_section(config,section);
}


static void init_netset_t(section_t *section) {
	section->ptr = alloc_netset();
}

static void deinit_netset_t(section_t *section) {
	if(section->ptr != NULL)
		free_netset((netset_t *)section->ptr);
}

static void load_netset_t(section_t *section) {
	netset_t *p = (netset_t *)section->ptr;
	char **lpp;
	char *lp;
	int i;
	int j;

	/* Load bind_ip */
	lp = find_field(section,"bind_ip");
	if(lp != NULL) {
		p->bind_ip = (char *)xstrdup(lp);
	}
	
	/* Load on_connect_delay */
	lp = find_field(section,"on_connect_delay");
	if(lp != NULL) {
		p->on_connect_delay = load_int(lp);
	}
	
	/* Load message_rate */
	lp = find_field(section,"message_rate");
	if(lp != NULL) {
		p->message_rate = load_float(lp);
	}
	
	/* Load no_autoconnect */
	lp = find_field(section,"no_autoconnect");
	if(lp != NULL) {
		p->no_autoconnect = load_int(lp);
	}
	
	/* Load nick */
	lp = find_field(section,"nick");
	if(lp == NULL)
		fail_loading(section,"nick",NULL);
	else {
		p->nick = (char *)xstrdup(lp);
	}
	
	/* Load realname */
	lp = find_field(section,"realname");
	if(lp == NULL)
		fail_loading(section,"realname",NULL);
	else {
		p->realname = (char *)xstrdup(lp);
	}
	
	/* Load irc_timeout */
	lp = find_field(section,"irc_timeout");
	if(lp != NULL) {
		p->irc_timeout = load_int(lp);
	}
	
	/* Load max_target */
	lp = find_field(section,"max_target");
	if(lp != NULL) {
		p->max_target = load_int(lp);
	}
	
	/* Load nick_tracking */
	lp = find_field(section,"nick_tracking");
	if(lp != NULL) {
		p->nick_tracking = load_int(lp);
	}
	
	/* Load recv_per_sec */
	lp = find_field(section,"recv_per_sec");
	if(lp != NULL) {
		p->recv_per_sec = load_int(lp);
	}
	
	/* Load join_delay */
	lp = find_field(section,"join_delay");
	if(lp != NULL) {
		p->join_delay = load_int(lp);
	}
	
	/* Load info_line */
	lp = find_field(section,"info_line");
	if(lp != NULL) {
		p->info_line = (char *)xstrdup(lp);
	}
	
	/* Load taglines */
	lpp = find_fields(section,"taglines",&j);
	if(lpp != NULL) {
		for(i = 0; i < j; ++i) {
			PTRARR_ADD(&(p->taglines),&(p->no_taglines),xstrdup(lpp[i]));
		}
		xfree(lpp);
	}
	
	/* Load average_window */
	lp = find_field(section,"average_window");
	if(lp != NULL) {
		p->average_window = load_int(lp);
	}
	
	/* Load reconnect_delay */
	lp = find_field(section,"reconnect_delay");
	if(lp != NULL) {
		p->reconnect_delay = load_int(lp);
	}
	
	/* Load message_rate_max */
	lp = find_field(section,"message_rate_max");
	if(lp != NULL) {
		p->message_rate_max = load_int(lp);
	}
	
	/* Load loginname */
	lp = find_field(section,"loginname");
	if(lp == NULL)
		fail_loading(section,"loginname",NULL);
	else {
		p->loginname = (char *)xstrdup(lp);
	}
	
}


static void save_netset_t(config_t *config, netset_t *p) {
	section_t *section = new_section("netset_t",p);
	int i;

	/* Save bind_ip */
	add_field_char(section,"bind_ip",p->bind_ip);
	
	/* Save on_connect_delay */
	add_field_int(section,"on_connect_delay",p->on_connect_delay);
	
	/* Save message_rate */
	add_field_float(section,"message_rate",p->message_rate);
	
	/* Save no_autoconnect */
	add_field_int(section,"no_autoconnect",p->no_autoconnect);
	
	/* Save nick */
	add_field_char(section,"nick",p->nick);
	
	/* Save realname */
	add_field_char(section,"realname",p->realname);
	
	/* Save irc_timeout */
	add_field_int(section,"irc_timeout",p->irc_timeout);
	
	/* Save max_target */
	add_field_int(section,"max_target",p->max_target);
	
	/* Save nick_tracking */
	add_field_int(section,"nick_tracking",p->nick_tracking);
	
	/* Save recv_per_sec */
	add_field_int(section,"recv_per_sec",p->recv_per_sec);
	
	/* Save join_delay */
	add_field_int(section,"join_delay",p->join_delay);
	
	/* Save info_line */
	add_field_char(section,"info_line",p->info_line);
	
	/* Save taglines */
	for(i = 0; i < p->no_taglines; ++i) {
		add_field_char(section,"taglines",p->taglines[i]);
	}
	
	/* Save average_window */
	add_field_int(section,"average_window",p->average_window);
	
	/* Save reconnect_delay */
	add_field_int(section,"reconnect_delay",p->reconnect_delay);
	
	/* Save message_rate_max */
	add_field_int(section,"message_rate_max",p->message_rate_max);
	
	/* Save loginname */
	add_field_char(section,"loginname",p->loginname);
	
	add_section(config,section);
}


static void init_access_t(section_t *section) {
	section->ptr = alloc_access();
}

static void deinit_access_t(section_t *section) {
	if(section->ptr != NULL)
		free_access((access_t *)section->ptr);
}

static void load_access_t(section_t *section) {
	access_t *p = (access_t *)section->ptr;
	char **lpp;
	char *lp;
	int i;
	int j;
	void *vp;

	/* Load flags */
	lp = find_field(section,"flags");
	if(lp != NULL) {
		p->flags = load_int(lp);
	}
	
	/* Load entries */
	lpp = find_fields(section,"entries",&j);
	if(lpp != NULL) {
		for(i = 0; i < j; ++i) {
			vp = find_ptr(section,lpp[i]);
			if(vp != NULL)
				PTRARR_ADD(&(p->entries),&(p->no_entries),vp);
		}
		xfree(lpp);
	}
	
}


static void save_access_t(config_t *config, access_t *p) {
	section_t *section = new_section("access_t",p);
	int i;

	/* Lock lock */
	LOCKR(&(p->lock));
	
	/* Save flags */
	add_field_int(section,"flags",p->flags);
	
	/* Save entries */
	for(i = 0; i < p->no_entries; ++i) {
		save_access_entry_t(config,p->entries[i]);
		add_field_ptr(section,"entries","access_entry_t",p->entries[i]);
	}
	
	/* Unlock lock */
	UNLOCKR(&(p->lock));
	
	add_section(config,section);
}


static void init_access_entry_t(section_t *section) {
	section->ptr = alloc_access_entry();
}

static void deinit_access_entry_t(section_t *section) {
	if(section->ptr != NULL)
		free_access_entry((access_entry_t *)section->ptr);
}

static void load_access_entry_t(section_t *section) {
	access_entry_t *p = (access_entry_t *)section->ptr;
	char *lp;
	void *vp;

	/* Load network */
	lp = find_field(section,"network");
	if(lp != NULL) {
		vp = find_ptr(section,lp);
		p->network = (network_t *)vp;
	}
	
	/* Load flags */
	lp = find_field(section,"flags");
	if(lp != NULL) {
		p->flags = load_int(lp);
	}
	
	/* Load mode */
	lp = find_field(section,"mode");
	if(lp != NULL) {
		p->mode = load_int(lp);
	}
	
	/* Load channel */
	lp = find_field(section,"channel");
	if(lp != NULL) {
		vp = find_ptr(section,lp);
		p->channel = (channel_t *)vp;
	}
	
	/* Load host */
	lp = find_field(section,"host");
	if(lp != NULL) {
		p->host = (char *)xstrdup(lp);
	}
	
}


static void save_access_entry_t(config_t *config, access_entry_t *p) {
	section_t *section = new_section("access_entry_t",p);

	/* Save network */
	add_field_ptr(section,"network","network_t",p->network);
	
	/* Save flags */
	add_field_int(section,"flags",p->flags);
	
	/* Save mode */
	add_field_int(section,"mode",p->mode);
	
	/* Save channel */
	add_field_ptr(section,"channel","channel_t",p->channel);
	
	/* Save host */
	add_field_char(section,"host",p->host);
	
	add_section(config,section);
}


static void init_queue_t(section_t *section) {
	section->ptr = alloc_queue();
}

static void deinit_queue_t(section_t *section) {
	if(section->ptr != NULL)
		free_queue((queue_t *)section->ptr);
}

static void load_queue_t(section_t *section) {
	queue_t *p = (queue_t *)section->ptr;
	char **lpp;
	char *lp;
	int i;
	int j;
	void *vp;

	/* Load priority */
	lp = find_field(section,"priority");
	if(lp != NULL) {
		p->priority = load_int(lp);
	}
	
	/* Load qsends */
	lpp = find_fields(section,"qsends",&j);
	if(lpp != NULL) {
		for(i = 0; i < j; ++i) {
			vp = find_ptr(section,lpp[i]);
			if(vp != NULL)
				PTRARR_ADD(&(p->qsends),&(p->no_qsends),vp);
		}
		xfree(lpp);
	}
	
	/* Load last_dequeue */
	lp = find_field(section,"last_dequeue");
	if(lp != NULL) {
		p->last_dequeue = load_time_t(lp);
	}
	
	/* Load last_notify */
	lp = find_field(section,"last_notify");
	if(lp != NULL) {
		p->last_notify = load_time_t(lp);
	}
	
	/* Load pool */
	lp = find_field(section,"pool");
	if(lp == NULL)
		fail_loading(section,"pool",NULL);
	else {
		vp = find_ptr(section,lp);
		p->pool = (pool_t *)vp;
		if(p->pool == NULL)
			fail_loading(section,"pool",lp);
	}
	
	/* Load notify */
	lp = find_field(section,"notify");
	if(lp != NULL) {
		p->notify = load_int(lp);
	}
	
	/* Load queues_per_user */
	lp = find_field(section,"queues_per_user");
	if(lp != NULL) {
		p->queues_per_user = load_int(lp);
	}
	
	/* Load combined_queue_limit */
	lp = find_field(section,"combined_queue_limit");
	if(lp != NULL) {
		p->combined_queue_limit = load_int(lp);
	}
	
	/* Load name */
	lp = find_field(section,"name");
	if(lp == NULL)
		fail_loading(section,"name",NULL);
	else {
		p->name = (char *)xstrdup(lp);
	}
	
	/* Load deleted */
	lp = find_field(section,"deleted");
	if(lp != NULL) {
		p->deleted = load_time_t(lp);
	}
	
	/* Load bypass_size */
	lp = find_field(section,"bypass_size");
	if(lp != NULL) {
		p->bypass_size = load_off_t(lp);
	}
	
	/* Load last_checked */
	lp = find_field(section,"last_checked");
	if(lp != NULL) {
		p->last_checked = load_time_t(lp);
	}
	
	/* Load length */
	lp = find_field(section,"length");
	if(lp != NULL) {
		p->length = load_int(lp);
	}
	
	/* Load priority_queues */
	lp = find_field(section,"priority_queues");
	if(lp != NULL) {
		p->priority_queues = load_int(lp);
	}
	
	/* Load overflow_requeue */
	lp = find_field(section,"overflow_requeue");
	if(lp != NULL) {
		p->overflow_requeue = load_int(lp);
	}
	
}


static void save_queue_t(config_t *config, queue_t *p) {
	section_t *section = new_section("queue_t",p);
	int i;

	/* Lock lock */
	LOCKR(&(p->lock));
	
	/* Save priority */
	add_field_int(section,"priority",p->priority);
	
	/* Save qsends */
	for(i = 0; i < p->no_qsends; ++i) {
		save_send_t(config,p->qsends[i]);
		add_field_ptr(section,"qsends","send_t",p->qsends[i]);
	}
	
	/* Save last_dequeue */
	add_field_time_t(section,"last_dequeue",p->last_dequeue);
	
	/* Save last_notify */
	add_field_time_t(section,"last_notify",p->last_notify);
	
	/* Save pool */
	add_field_ptr(section,"pool","pool_t",p->pool);
	
	/* Save notify */
	add_field_int(section,"notify",p->notify);
	
	/* Save queues_per_user */
	add_field_int(section,"queues_per_user",p->queues_per_user);
	
	/* Save combined_queue_limit */
	add_field_int(section,"combined_queue_limit",p->combined_queue_limit);
	
	/* Save name */
	add_field_char(section,"name",p->name);
	
	/* Save deleted */
	add_field_time_t(section,"deleted",p->deleted);
	
	/* Save bypass_size */
	add_field_off_t(section,"bypass_size",p->bypass_size);
	
	/* Save last_checked */
	add_field_time_t(section,"last_checked",p->last_checked);
	
	/* Save length */
	add_field_int(section,"length",p->length);
	
	/* Save priority_queues */
	add_field_int(section,"priority_queues",p->priority_queues);
	
	/* Save overflow_requeue */
	add_field_int(section,"overflow_requeue",p->overflow_requeue);
	
	/* Unlock lock */
	UNLOCKR(&(p->lock));
	
	add_section(config,section);
}


static void init_settings_t(section_t *section) {
	section->ptr = alloc_settings();
}

static void deinit_settings_t(section_t *section) {
	if(section->ptr != NULL)
		free_settings((settings_t *)section->ptr);
}

static void load_settings_t(section_t *section) {
	settings_t *p = (settings_t *)section->ptr;
	char **lpp;
	char *lp;
	int i;
	int j;

	/* Load autosave_interval */
	lp = find_field(section,"autosave_interval");
	if(lp != NULL) {
		p->autosave_interval = load_int(lp);
	}
	
	/* Load admin_socket */
	lp = find_field(section,"admin_socket");
	if(lp != NULL) {
		p->admin_socket = (char *)xstrdup(lp);
	}
	
	/* Load hashing_io_usage */
	lp = find_field(section,"hashing_io_usage");
	if(lp != NULL) {
		p->hashing_io_usage = load_int(lp);
	}
	
	/* Load tick_interval */
	lp = find_field(section,"tick_interval");
	if(lp != NULL) {
		p->tick_interval = load_int(lp);
	}
	
	/* Load pid */
	lp = find_field(section,"pid");
	if(lp != NULL) {
		p->pid = (char *)xstrdup(lp);
	}
	
	/* Load hash_packs */
	lp = find_field(section,"hash_packs");
	if(lp != NULL) {
		p->hash_packs = load_int(lp);
	}
	
	/* Load log_interval */
	lp = find_field(section,"log_interval");
	if(lp != NULL) {
		p->log_interval = load_int(lp);
	}
	
	/* Load scripts */
	lpp = find_fields(section,"scripts",&j);
	if(lpp != NULL) {
		for(i = 0; i < j; ++i) {
			PTRARR_ADD(&(p->scripts),&(p->no_scripts),xstrdup(lpp[i]));
		}
		xfree(lpp);
	}
	
	/* Load log */
	lp = find_field(section,"log");
	if(lp != NULL) {
		p->log = (char *)xstrdup(lp);
	}
	
	/* Load list_frequency */
	lp = find_field(section,"list_frequency");
	if(lp != NULL) {
		p->list_frequency = load_int(lp);
	}
	
}


static void save_settings_t(config_t *config, settings_t *p) {
	section_t *section = new_section("settings_t",p);
	int i;

	/* Lock lock */
	LOCKR(&(p->lock));
	
	/* Save autosave_interval */
	add_field_int(section,"autosave_interval",p->autosave_interval);
	
	/* Save admin_socket */
	add_field_char(section,"admin_socket",p->admin_socket);
	
	/* Save hashing_io_usage */
	add_field_int(section,"hashing_io_usage",p->hashing_io_usage);
	
	/* Save tick_interval */
	add_field_int(section,"tick_interval",p->tick_interval);
	
	/* Save pid */
	add_field_char(section,"pid",p->pid);
	
	/* Save hash_packs */
	add_field_int(section,"hash_packs",p->hash_packs);
	
	/* Save log_interval */
	add_field_int(section,"log_interval",p->log_interval);
	
	/* Save scripts */
	for(i = 0; i < p->no_scripts; ++i) {
		add_field_char(section,"scripts",p->scripts[i]);
	}
	
	/* Save log */
	add_field_char(section,"log",p->log);
	
	/* Save list_frequency */
	add_field_int(section,"list_frequency",p->list_frequency);
	
	/* Unlock lock */
	UNLOCKR(&(p->lock));
	
	add_section(config,section);
}


static void init_send_t(section_t *section) {
	section->ptr = alloc_send();
}

static void deinit_send_t(section_t *section) {
	if(section->ptr != NULL)
		free_send((send_t *)section->ptr);
}

static void load_send_t(section_t *section) {
	send_t *p = (send_t *)section->ptr;
	char *lp;
	void *vp;

	/* Load retries */
	lp = find_field(section,"retries");
	if(lp != NULL) {
		p->retries = load_int(lp);
	}
	
	/* Load network */
	lp = find_field(section,"network");
	if(lp == NULL)
		fail_loading(section,"network",NULL);
	else {
		vp = find_ptr(section,lp);
		p->network = (network_t *)vp;
		if(p->network == NULL)
			fail_loading(section,"network",lp);
	}
	
	/* Load connected */
	lp = find_field(section,"connected");
	if(lp != NULL) {
		p->connected = load_time_t(lp);
	}
	
	/* Load reason */
	lp = find_field(section,"reason");
	if(lp != NULL) {
		p->reason = (char *)xstrdup(lp);
	}
	
	/* Load nick */
	lp = find_field(section,"nick");
	if(lp == NULL)
		fail_loading(section,"nick",NULL);
	else {
		p->nick = (char *)xstrdup(lp);
	}
	
	/* Load last_contact */
	lp = find_field(section,"last_contact");
	if(lp != NULL) {
		p->last_contact = load_time_t(lp);
	}
	
	/* Load host */
	lp = find_field(section,"host");
	if(lp != NULL) {
		p->host = (char *)xstrdup(lp);
	}
	
	/* Load pool */
	lp = find_field(section,"pool");
	if(lp != NULL) {
		vp = find_ptr(section,lp);
		p->pool = (pool_t *)vp;
	}
	
	/* Load started */
	lp = find_field(section,"started");
	if(lp != NULL) {
		p->started = load_time_t(lp);
	}
	
	/* Load pack */
	lp = find_field(section,"pack");
	if(lp == NULL)
		fail_loading(section,"pack",NULL);
	else {
		vp = find_ptr(section,lp);
		p->pack = (pack_t *)vp;
		if(p->pack == NULL)
			fail_loading(section,"pack",lp);
	}
	
	/* Load queue */
	lp = find_field(section,"queue");
	if(lp != NULL) {
		vp = find_ptr(section,lp);
		p->queue = (queue_t *)vp;
	}
	
}


static void save_send_t(config_t *config, send_t *p) {
	section_t *section = new_section("send_t",p);

	/* Lock lock */
	LOCKR(&(p->lock));
	
	/* Save retries */
	add_field_int(section,"retries",p->retries);
	
	/* Save network */
	add_field_ptr(section,"network","network_t",p->network);
	
	/* Save connected */
	add_field_time_t(section,"connected",p->connected);
	
	/* Save reason */
	add_field_char(section,"reason",p->reason);
	
	/* Save nick */
	add_field_char(section,"nick",p->nick);
	
	/* Save last_contact */
	add_field_time_t(section,"last_contact",p->last_contact);
	
	/* Save host */
	add_field_char(section,"host",p->host);
	
	/* Save pool */
	add_field_ptr(section,"pool","pool_t",p->pool);
	
	/* Save started */
	add_field_time_t(section,"started",p->started);
	
	/* Save pack */
	save_pack_t(config,p->pack);
	add_field_ptr(section,"pack","pack_t",p->pack);
	
	/* Save queue */
	add_field_ptr(section,"queue","queue_t",p->queue);
	
	/* Unlock lock */
	UNLOCKR(&(p->lock));
	
	add_section(config,section);
}


static void init_pool_t(section_t *section) {
	section->ptr = alloc_pool();
}

static void deinit_pool_t(section_t *section) {
	if(section->ptr != NULL)
		free_pool((pool_t *)section->ptr);
}

static void load_pool_t(section_t *section) {
	pool_t *p = (pool_t *)section->ptr;
	char **lpp;
	char *lp;
	int i;
	int j;
	void *vp;

	/* Load stat_carry */
	lp = find_field(section,"stat_carry");
	if(lp != NULL) {
		p->stat_carry = load_uint32_t(lp);
	}
	
	/* Load name */
	lp = find_field(section,"name");
	if(lp == NULL)
		fail_loading(section,"name",NULL);
	else {
		p->name = (char *)xstrdup(lp);
	}
	
	/* Load dequeue_algorithm */
	lp = find_field(section,"dequeue_algorithm");
	if(lp != NULL) {
		p->dequeue_algorithm = load_int(lp);
	}
	
	/* Load deleted */
	lp = find_field(section,"deleted");
	if(lp != NULL) {
		p->deleted = load_time_t(lp);
	}
	
	/* Load record_send */
	lp = find_field(section,"record_send");
	if(lp != NULL) {
		p->record_send = load_uint32_t(lp);
	}
	
	/* Load sends_per_user */
	lp = find_field(section,"sends_per_user");
	if(lp != NULL) {
		p->sends_per_user = load_int(lp);
	}
	
	/* Load stat_mib */
	lp = find_field(section,"stat_mib");
	if(lp != NULL) {
		p->stat_mib = load_uint32_t(lp);
	}
	
	/* Load send_min_bandwidth */
	lp = find_field(section,"send_min_bandwidth");
	if(lp != NULL) {
		p->send_min_bandwidth = load_unsigned_int(lp);
	}
	
	/* Load bandwidth */
	lp = find_field(section,"bandwidth");
	if(lp != NULL) {
		p->bandwidth = load_unsigned_int(lp);
	}
	
	/* Load record_rate */
	lp = find_field(section,"record_rate");
	if(lp != NULL) {
		p->record_rate = load_uint32_t(lp);
	}
	
	/* Load sends */
	lp = find_field(section,"sends");
	if(lp != NULL) {
		p->sends = load_unsigned_int(lp);
	}
	
	/* Load send_max_bandwidth */
	lp = find_field(section,"send_max_bandwidth");
	if(lp != NULL) {
		p->send_max_bandwidth = load_unsigned_int(lp);
	}
	
	/* Load csends */
	lpp = find_fields(section,"csends",&j);
	if(lpp != NULL) {
		for(i = 0; i < j; ++i) {
			vp = find_ptr(section,lpp[i]);
			if(vp != NULL)
				PTRARR_ADD(&(p->csends),&(p->no_csends),vp);
		}
		xfree(lpp);
	}
	
}


static void save_pool_t(config_t *config, pool_t *p) {
	section_t *section = new_section("pool_t",p);
	int i;

	/* Lock lock */
	LOCKR(&(p->lock));
	
	/* Save stat_carry */
	add_field_uint32_t(section,"stat_carry",p->stat_carry);
	
	/* Save name */
	add_field_char(section,"name",p->name);
	
	/* Save dequeue_algorithm */
	add_field_int(section,"dequeue_algorithm",p->dequeue_algorithm);
	
	/* Save deleted */
	add_field_time_t(section,"deleted",p->deleted);
	
	/* Save record_send */
	add_field_uint32_t(section,"record_send",p->record_send);
	
	/* Save sends_per_user */
	add_field_int(section,"sends_per_user",p->sends_per_user);
	
	/* Save stat_mib */
	add_field_uint32_t(section,"stat_mib",p->stat_mib);
	
	/* Save send_min_bandwidth */
	add_field_unsigned_int(section,"send_min_bandwidth",p->send_min_bandwidth);
	
	/* Save bandwidth */
	add_field_unsigned_int(section,"bandwidth",p->bandwidth);
	
	/* Save record_rate */
	add_field_uint32_t(section,"record_rate",p->record_rate);
	
	/* Save sends */
	add_field_unsigned_int(section,"sends",p->sends);
	
	/* Save send_max_bandwidth */
	add_field_unsigned_int(section,"send_max_bandwidth",p->send_max_bandwidth);
	
	/* Save csends */
	for(i = 0; i < p->no_csends; ++i) {
		save_send_t(config,p->csends[i]);
		add_field_ptr(section,"csends","send_t",p->csends[i]);
	}
	
	/* Unlock lock */
	UNLOCKR(&(p->lock));
	
	add_section(config,section);
}



static struct {
	char *type;
	void (*init)(section_t *);
	void (*deinit)(section_t *);
	void (*load)(section_t *);
	void (*ref_count)(section_t *);
} _section_funcs[] = {
	{"access_entry_t", init_access_entry_t, deinit_access_entry_t, load_access_entry_t, NULL},
	{"access_t", init_access_t, deinit_access_t, load_access_t, NULL},
	{"channel_t", init_channel_t, deinit_channel_t, load_channel_t, NULL},
	{"global_t", init_global_t, deinit_global_t, load_global_t, NULL},
	{"ignore_entry_t", init_ignore_entry_t, deinit_ignore_entry_t, load_ignore_entry_t, NULL},
	{"ignore_list_t", init_ignore_list_t, deinit_ignore_list_t, load_ignore_list_t, NULL},
	{"interface_t", init_interface_t, deinit_interface_t, load_interface_t, NULL},
	{"netset_t", init_netset_t, deinit_netset_t, load_netset_t, NULL},
	{"network_t", init_network_t, deinit_network_t, load_network_t, NULL},
	{"pack_t", init_pack_t, deinit_pack_t, load_pack_t, ref_count_pack_t},
	{"packlist_t", init_packlist_t, deinit_packlist_t, load_packlist_t, NULL},
	{"pool_t", init_pool_t, deinit_pool_t, load_pool_t, NULL},
	{"queue_t", init_queue_t, deinit_queue_t, load_queue_t, NULL},
	{"send_t", init_send_t, deinit_send_t, load_send_t, NULL},
	{"settings_t", init_settings_t, deinit_settings_t, load_settings_t, NULL},
	{"user_t", init_user_t, deinit_user_t, load_user_t, NULL},
	{NULL}
};

