blob: 9dcf5828d31c3015b12e68ffb4df396abcd648f1 [file] [log] [blame] [raw]
/*
* Copyright (C) 2000-2008, Parallels, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef _MODULES_H_
#define _MODULES_H_
#include "types.h"
#include "res.h"
#define TYPE_CMD 0
#define TYPE_CONF 1
#define MOD_DIR PKGLIBDIR "/modules/"
#define MOD_INFO_SYM "vz_get_mod_info"
#define MOD_IDBITS 16
#define MOD2ID(id) (id << MOD_IDBITS)
#define MOD_PARAM2ID(m_id, p_id) \
(MOD2ID(m_id) | (0xffff & p_id))
#define PARAM2MOD(x) (x >> MOD_IDBITS)
#define GET_MOD_INFO(name) \
struct mod_info *vz_get_mod_info() \
{ \
return &name; \
}
typedef struct {
void *cfg;
void *opt;
} data_param;
struct mod_info {
void *handle;
char **actions;
int id;
char *desc;
data_param *(*alloc_data)(void);
int (*init)(data_param *data);
int (*parse_cfg)(envid_t veid, data_param *data, const char *name,
const char *rval);
int (*parse_opt)(envid_t veid, data_param *data, int opt,
const char *rval);
int (*store)(data_param *data, list_head_t *conf_head);
int (*setup)(vps_handler *h, envid_t veid, data_param *data,
int vps_state, int skip, vps_param *param);
int (*cleanup)(vps_handler *h, envid_t veid, data_param *data,
vps_param *param);
void (*free_data)(data_param *data);
struct option *(*get_opt)(data_param *data, const char *action);
const char *(*get_usage)();
};
struct mod {
char *fname;
data_param *data;
struct mod_info *mod_info;
};
struct mod_action {
int mod_count;
char *action;
struct mod *mod_list;
};
struct option *mod_make_opt(struct option *opt, struct mod_action *action,
const char *name);
int mod_save_config(struct mod_action *action, list_head_t *conf);
int mod_parse(envid_t veid, struct mod_action *action, const char *name,
int opt, const char *rval);
int mod_setup(vps_handler *h, envid_t veid, int vps_state, skipFlags skip,
struct mod_action *action, vps_param *param);
int mod_cleanup(vps_handler *h, envid_t veid, struct mod_action *action,
vps_param *param);
int is_mod_action(struct mod_info *info, const char *name);
void mod_print_usage(struct mod_action *action);
#endif /* _MODULES_H_ */