1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
|
/*
* ProFTPD - FTP server daemon
* Copyright (c) 1997, 1998 Public Flood Software
*
* 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
typedef struct module_struc module;
typedef struct modret_struc modret_t;
struct modret_struc {
module *mr_handler_module; /* which module handled this? */
int mr_error; /* !0 if error */
char *mr_numeric; /* numeric error code */
char *mr_message; /* text message */
void *data; /* add'l data -- undefined */
};
/* Possible error codes for auth handlers
*/
/* Account does not exist */
#define AUTH_NOPWD -1
/* Password mismatch */
#define AUTH_BADPWD -2
/* Password hasn't been changed recently enough */
#define AUTH_AGEPWD -3
/* Account has been disabled */
#define AUTH_DISABLEDPWD -4
/* The following macros are for creating basic modret_t, and can
* only be used inside of module handlers
*/
#define MODRET static modret_t*
#define HANDLED(cmd) mod_create_ret((cmd),\
0,NULL,NULL)
#define DECLINED(cmd) (modret_t*)NULL
#define ERROR(cmd) mod_create_ret((cmd),\
1,NULL,NULL)
#define ERROR_MSG(cmd,n,m) mod_create_ret((cmd),\
1,(n),(m))
#define ERROR_INT(cmd,n) mod_create_error((cmd),(n))
#define MODRET_ISDECLINED(x) ((x) == NULL)
#define MODRET_ISHANDLED(x) ((x) && !(x)->mr_error)
#define MODRET_ISERROR(x) ((x) && (x)->mr_error)
#define MODRET_HASNUM(x) ((x) && (x)->mr_numeric)
#define MODRET_HASMSG(x) ((x) && (x)->mr_message)
#define MODRET_ERROR(x) ((x) ? (x)->mr_error : 0)
#define MODRET_ERRNUM(x) ((x) ? (x)->mr_numeric : NULL)
#define MODRET_ERRMSG(x) ((x) ? (x)->mr_message : NULL)
#define MODRET_HASDATA(x) ((x) ? ((x)->data ? TRUE : FALSE) : FALSE)
/* private data structure returned by mod_priv* */
struct privdata {
char *tag;
union {
void *ptr_val;
int int_val;
long long_val;
char *str_val;
} value;
module *m;
};
typedef struct {
char *directive;
modret_t *(*handler)(cmd_rec*);
module *m; /* Reference to owning module
* set when module is initialized
*/
} conftable;
/* classes for command table */
#define CL_NONE 0x0
#define CL_AUTH (1 << 0)
/* USER, PASS */
#define CL_INFO (1 << 1)
/* Informational commands (PWD, SYST, etc) */
#define CL_DIRS (1 << 2)
/* Directory commands (LIST, NLST, CWD, etc) */
#define CL_READ (1 << 3)
/* File reading commands (RETR) */
#define CL_WRITE (1 << 4)
/* Writing commands (STOR, MKD, etc) */
#define CL_MISC (1 << 5)
/* Miscellaneous (RNFR/RNTO, SITE, etc) */
#define CL_ALL (CL_AUTH|CL_INFO|CL_DIRS|CL_READ| \
CL_WRITE|CL_MISC)
/* command types for command table */
#define PRE_CMD 1
#define CMD 2
#define POST_CMD 3
#define LOG_CMD 4
#define LOG_CMD_ERR 5
typedef struct {
int cmd_type; /* see above for cmd types */
char *command;
char *group; /* Command grouping */
modret_t *(*handler)(cmd_rec*);
int requires_auth; /* Authenication required? */
int interrupt_xfer; /* Allowed to issue during xfer? */
int class;
module *m;
} cmdtable;
typedef struct {
int auth_type; /* future use */
char *name;
modret_t *(*handler)(cmd_rec*);
module *m;
} authtable;
struct module_struc {
module *next,*prev;
int ver; /* API version _not_ module version */
char *name; /* Module name */
conftable *conftable; /* Configuration directive table */
cmdtable *cmdtable; /* Command table */
authtable *authtable; /* Authentication handler table */
int (*module_init)(); /* Module initialization */
int (*module_init_child)(); /* Initialize newly forked child */
int priority; /* internal use, higher == higher priority */
};
/* These are stored in modules.c */
extern conftable *m_conftable; /* Master conftable */
extern cmdtable *m_cmdtable; /* Master cmdtable */
#define ANY_MODULE ((module*)0xffffffff)
/* Prototypes */
void list_modules();
int init_modules(); /* Initialize modules */
int init_child_modules();
modret_t *call_module(module *m, modret_t *(*func)(cmd_rec*), cmd_rec *cmd);
modret_t *call_module_cmd(module *m, modret_t *(*func)(cmd_rec*), cmd_rec *cmd);
modret_t *call_module_auth(module *m, modret_t *(*func)(cmd_rec*), cmd_rec *cmd);
/* Symbol table lookup functions */
conftable *mod_find_conf_symbol(char*,int*,conftable*);
cmdtable *mod_find_cmd_symbol(char*,int*,cmdtable*);
authtable *mod_find_auth_symbol(char*,int*,authtable*);
/* This function is in main.c, but is prototyped here */
void set_auth_check(int (*ck)(cmd_rec*));
void xfer_set_data_port(p_in_addr_t*,int);
/* For use from inside module handler functions */
modret_t *mod_create_ret(cmd_rec*,unsigned char,char*,char*);
modret_t *mod_create_error(cmd_rec*,int);
modret_t *mod_create_data(cmd_rec*,void*);
privdata_t *mod_privdata_alloc(cmd_rec*,char*,int);
privdata_t *mod_privdata_find(cmd_rec*,char*,module*);
/* prototypes for auth.c */
void auth_setpwent(pool*);
void auth_endpwent(pool*);
void auth_setgrent(pool*);
void auth_endgrent(pool*);
struct passwd *auth_getpwent(pool*);
struct group *auth_getgrent(pool*);
struct passwd *auth_getpwnam(pool*,const char*);
struct passwd *auth_getpwuid(pool*,uid_t);
struct group *auth_getgrnam(pool*,const char*);
struct group *auth_getgrgid(pool*,gid_t);
int auth_authenticate(pool*,const char*,const char*);
int auth_check(pool*,const char*,const char*,const char*);
const char *auth_uid_name(pool*,uid_t);
const char *auth_gid_name(pool*,gid_t);
uid_t auth_name_uid(pool*,const char*);
gid_t auth_name_gid(pool*,const char*);
#endif /* __MODULES_H */
|