modules.h
上传用户:pycemail
上传日期:2007-01-04
资源大小:329k
文件大小:6k
源码类别:

Ftp客户端

开发平台:

Unix_Linux

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