📄 loadparm.c
字号:
/* This is based on loadparm.c from Samba, written by Andrew Tridgell and Karl Auer *//* * 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 3 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, visit the http://fsf.org website. *//* some fixes * * Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org> *//* * Load parameters. * * This module provides suitable callback functions for the params * module. It builds the internal table of service details which is * then used by the rest of the server. * * To add a parameter: * * 1) add it to the global or service structure definition * 2) add it to the parm_table * 3) add it to the list of available functions (eg: using FN_GLOBAL_STRING()) * 4) If it's a global then initialise it in init_globals. If a local * (ie. service) parameter then initialise it in the sDefault structure * * * Notes: * The configuration file is processed sequentially for speed. It is NOT * accessed randomly as happens in 'real' Windows. For this reason, there * is a fair bit of sequence-dependent code here - ie., code which assumes * that certain things happen before others. In particular, the code which * happens at the boundary between sections is delicately poised, so be * careful! * *//* TODO: Parameter to set debug level on server. */#include "rsync.h"#include "ifuncs.h"#define PTR_DIFF(p1,p2) ((ptrdiff_t)(((char *)(p1)) - (char *)(p2)))#define strequal(a,b) (strcasecmp(a,b)==0)#define BOOLSTR(b) ((b) ? "Yes" : "No")typedef char pstring[1024];#define pstrcpy(a,b) strlcpy(a,b,sizeof(pstring))#ifndef LOG_DAEMON#define LOG_DAEMON 0#endif#define DEFAULT_DONT_COMPRESS "*.gz *.zip *.z *.rpm *.deb *.iso *.bz2" \ " *.t[gb]z *.7z *.mp[34] *.mov *.avi *.ogg *.jpg *.jpeg"/* the following are used by loadparm for option lists */typedef enum{ P_BOOL,P_BOOLREV,P_CHAR,P_INTEGER,P_OCTAL, P_PATH,P_STRING,P_GSTRING,P_ENUM,P_SEP} parm_type;typedef enum{ P_LOCAL,P_GLOBAL,P_SEPARATOR,P_NONE} parm_class;struct enum_list { int value; char *name;};struct parm_struct{ char *label; parm_type type; parm_class class; void *ptr; struct enum_list *enum_list; unsigned flags;};#ifndef GLOBAL_NAME#define GLOBAL_NAME "global"#endif/* some helpful bits */#define pSERVICE(i) ServicePtrs[i]#define iSERVICE(i) (*pSERVICE(i))#define LP_SNUM_OK(iService) (((iService) >= 0) && ((iService) < iNumServices))/* * This structure describes global (ie., server-wide) parameters. */typedef struct{ char *bind_address; char *motd_file; char *pid_file; char *socket_options; int rsync_port;} global;static global Globals;/* * This structure describes a single service. Their order must match the * initializers below, which you can accomplish by keeping each sub-section * sorted. (e.g. in vim, just visually select each subsection and use !sort.) */typedef struct{ char *auth_users; char *charset; char *comment; char *dont_compress; char *exclude; char *exclude_from; char *filter; char *gid; char *hosts_allow; char *hosts_deny; char *include; char *include_from; char *incoming_chmod; char *lock_file; char *log_file; char *log_format; char *name; char *outgoing_chmod; char *path; char *postxfer_exec; char *prexfer_exec; char *refuse_options; char *secrets_file; char *temp_dir; char *uid; int max_connections; int max_verbosity; int syslog_facility; int timeout; BOOL fake_super; BOOL ignore_errors; BOOL ignore_nonreadable; BOOL list; BOOL munge_symlinks; BOOL numeric_ids; BOOL read_only; BOOL strict_modes; BOOL transfer_logging; BOOL use_chroot; BOOL write_only;} service;/* This is a default service used to prime a services structure. In order * to make these easy to keep sorted in the same way as the variables * above, use the variable name in the leading comment, including a * trailing ';' (to avoid a sorting problem with trailing digits). */static service sDefault ={ /* auth_users; */ NULL, /* charset; */ NULL, /* comment; */ NULL, /* dont_compress; */ DEFAULT_DONT_COMPRESS, /* exclude; */ NULL, /* exclude_from; */ NULL, /* filter; */ NULL, /* gid; */ NOBODY_GROUP, /* hosts_allow; */ NULL, /* hosts_deny; */ NULL, /* include; */ NULL, /* include_from; */ NULL, /* incoming_chmod; */ NULL, /* lock_file; */ DEFAULT_LOCK_FILE, /* log_file; */ NULL, /* log_format; */ "%o %h [%a] %m (%u) %f %l", /* name; */ NULL, /* outgoing_chmod; */ NULL, /* path; */ NULL, /* postxfer_exec; */ NULL, /* prexfer_exec; */ NULL, /* refuse_options; */ NULL, /* secrets_file; */ NULL, /* temp_dir; */ NULL, /* uid; */ NOBODY_USER, /* max_connections; */ 0, /* max_verbosity; */ 1, /* syslog_facility; */ LOG_DAEMON, /* timeout; */ 0, /* fake_super; */ False, /* ignore_errors; */ False, /* ignore_nonreadable; */ False, /* list; */ True, /* munge_symlinks; */ (BOOL)-1, /* numeric_ids; */ (BOOL)-1, /* read_only; */ True, /* strict_modes; */ True, /* transfer_logging; */ False, /* use_chroot; */ True, /* write_only; */ False,};/* local variables */static service **ServicePtrs = NULL;static int iNumServices = 0;static int iServiceIndex = 0;static BOOL bInGlobalSection = True;#define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))static struct enum_list enum_facilities[] = {#ifdef LOG_AUTH { LOG_AUTH, "auth" },#endif#ifdef LOG_AUTHPRIV { LOG_AUTHPRIV, "authpriv" },#endif#ifdef LOG_CRON { LOG_CRON, "cron" },#endif#ifdef LOG_DAEMON { LOG_DAEMON, "daemon" },#endif#ifdef LOG_FTP { LOG_FTP, "ftp" },#endif#ifdef LOG_KERN { LOG_KERN, "kern" },#endif#ifdef LOG_LPR { LOG_LPR, "lpr" },#endif#ifdef LOG_MAIL { LOG_MAIL, "mail" },#endif#ifdef LOG_NEWS { LOG_NEWS, "news" },#endif#ifdef LOG_AUTH { LOG_AUTH, "security" },#endif#ifdef LOG_SYSLOG { LOG_SYSLOG, "syslog" },#endif#ifdef LOG_USER { LOG_USER, "user" },#endif#ifdef LOG_UUCP { LOG_UUCP, "uucp" },#endif#ifdef LOG_LOCAL0 { LOG_LOCAL0, "local0" },#endif#ifdef LOG_LOCAL1 { LOG_LOCAL1, "local1" },#endif#ifdef LOG_LOCAL2 { LOG_LOCAL2, "local2" },#endif#ifdef LOG_LOCAL3 { LOG_LOCAL3, "local3" },#endif#ifdef LOG_LOCAL4 { LOG_LOCAL4, "local4" },#endif#ifdef LOG_LOCAL5 { LOG_LOCAL5, "local5" },#endif#ifdef LOG_LOCAL6 { LOG_LOCAL6, "local6" },#endif#ifdef LOG_LOCAL7 { LOG_LOCAL7, "local7" },#endif { -1, NULL }};/* note that we do not initialise the defaults union - it is not allowed in ANSI C */static struct parm_struct parm_table[] ={ {"address", P_STRING, P_GLOBAL,&Globals.bind_address, NULL,0}, {"motd file", P_STRING, P_GLOBAL,&Globals.motd_file, NULL,0}, {"pid file", P_STRING, P_GLOBAL,&Globals.pid_file, NULL,0}, {"port", P_INTEGER,P_GLOBAL,&Globals.rsync_port, NULL,0}, {"socket options", P_STRING, P_GLOBAL,&Globals.socket_options, NULL,0}, {"auth users", P_STRING, P_LOCAL, &sDefault.auth_users, NULL,0}, {"charset", P_STRING, P_LOCAL, &sDefault.charset, NULL,0}, {"comment", P_STRING, P_LOCAL, &sDefault.comment, NULL,0}, {"dont compress", P_STRING, P_LOCAL, &sDefault.dont_compress, NULL,0}, {"exclude from", P_STRING, P_LOCAL, &sDefault.exclude_from, NULL,0}, {"exclude", P_STRING, P_LOCAL, &sDefault.exclude, NULL,0}, {"fake super", P_BOOL, P_LOCAL, &sDefault.fake_super, NULL,0}, {"filter", P_STRING, P_LOCAL, &sDefault.filter, NULL,0}, {"gid", P_STRING, P_LOCAL, &sDefault.gid, NULL,0}, {"hosts allow", P_STRING, P_LOCAL, &sDefault.hosts_allow, NULL,0}, {"hosts deny", P_STRING, P_LOCAL, &sDefault.hosts_deny, NULL,0}, {"ignore errors", P_BOOL, P_LOCAL, &sDefault.ignore_errors, NULL,0}, {"ignore nonreadable",P_BOOL, P_LOCAL, &sDefault.ignore_nonreadable,NULL,0}, {"include from", P_STRING, P_LOCAL, &sDefault.include_from, NULL,0}, {"include", P_STRING, P_LOCAL, &sDefault.include, NULL,0}, {"incoming chmod", P_STRING, P_LOCAL, &sDefault.incoming_chmod, NULL,0}, {"list", P_BOOL, P_LOCAL, &sDefault.list, NULL,0}, {"lock file", P_STRING, P_LOCAL, &sDefault.lock_file, NULL,0}, {"log file", P_STRING, P_LOCAL, &sDefault.log_file, NULL,0}, {"log format", P_STRING, P_LOCAL, &sDefault.log_format, NULL,0}, {"max connections", P_INTEGER,P_LOCAL, &sDefault.max_connections, NULL,0}, {"max verbosity", P_INTEGER,P_LOCAL, &sDefault.max_verbosity, NULL,0}, {"munge symlinks", P_BOOL, P_LOCAL, &sDefault.munge_symlinks, NULL,0}, {"name", P_STRING, P_LOCAL, &sDefault.name, NULL,0}, {"numeric ids", P_BOOL, P_LOCAL, &sDefault.numeric_ids, NULL,0}, {"outgoing chmod", P_STRING, P_LOCAL, &sDefault.outgoing_chmod, NULL,0}, {"path", P_PATH, P_LOCAL, &sDefault.path, NULL,0},#ifdef HAVE_PUTENV {"post-xfer exec", P_STRING, P_LOCAL, &sDefault.postxfer_exec, NULL,0}, {"pre-xfer exec", P_STRING, P_LOCAL, &sDefault.prexfer_exec, NULL,0},#endif {"read only", P_BOOL, P_LOCAL, &sDefault.read_only, NULL,0}, {"refuse options", P_STRING, P_LOCAL, &sDefault.refuse_options, NULL,0}, {"secrets file", P_STRING, P_LOCAL, &sDefault.secrets_file, NULL,0}, {"strict modes", P_BOOL, P_LOCAL, &sDefault.strict_modes, NULL,0}, {"syslog facility", P_ENUM, P_LOCAL, &sDefault.syslog_facility,enum_facilities,0}, {"temp dir", P_PATH, P_LOCAL, &sDefault.temp_dir, NULL,0}, {"timeout", P_INTEGER,P_LOCAL, &sDefault.timeout, NULL,0}, {"transfer logging", P_BOOL, P_LOCAL, &sDefault.transfer_logging, NULL,0}, {"uid", P_STRING, P_LOCAL, &sDefault.uid, NULL,0}, {"use chroot", P_BOOL, P_LOCAL, &sDefault.use_chroot, NULL,0}, {"write only", P_BOOL, P_LOCAL, &sDefault.write_only, NULL,0}, {NULL, P_BOOL, P_NONE, NULL, NULL,0}};/**************************************************************************** Initialise the global parameter structure.***************************************************************************/static void init_globals(void){ memset(&Globals, 0, sizeof Globals);}/**************************************************************************** Initialise the sDefault parameter structure.***************************************************************************/static void init_locals(void){}/* In this section all the functions that are used to access the parameters from the rest of the program are defined*/#define FN_GLOBAL_STRING(fn_name,ptr) \ char *fn_name(void) {return(*(char **)(ptr) ? *(char **)(ptr) : "");}#define FN_GLOBAL_BOOL(fn_name,ptr) \ BOOL fn_name(void) {return(*(BOOL *)(ptr));}#define FN_GLOBAL_CHAR(fn_name,ptr) \ char fn_name(void) {return(*(char *)(ptr));}#define FN_GLOBAL_INTEGER(fn_name,ptr) \ int fn_name(void) {return(*(int *)(ptr));}#define FN_LOCAL_STRING(fn_name,val) \ char *fn_name(int i) {return((LP_SNUM_OK(i)&&pSERVICE(i)->val)?pSERVICE(i)->val : (sDefault.val?sDefault.val:""));}#define FN_LOCAL_BOOL(fn_name,val) \ BOOL fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}#define FN_LOCAL_CHAR(fn_name,val) \ char fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}#define FN_LOCAL_INTEGER(fn_name,val) \ int fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}FN_GLOBAL_STRING(lp_bind_address, &Globals.bind_address)FN_GLOBAL_STRING(lp_motd_file, &Globals.motd_file)FN_GLOBAL_STRING(lp_pid_file, &Globals.pid_file)FN_GLOBAL_STRING(lp_socket_options, &Globals.socket_options)FN_GLOBAL_INTEGER(lp_rsync_port, &Globals.rsync_port)FN_LOCAL_STRING(lp_auth_users, auth_users)FN_LOCAL_STRING(lp_charset, charset)FN_LOCAL_STRING(lp_comment, comment)FN_LOCAL_STRING(lp_dont_compress, dont_compress)FN_LOCAL_STRING(lp_exclude, exclude)FN_LOCAL_STRING(lp_exclude_from, exclude_from)FN_LOCAL_STRING(lp_filter, filter)FN_LOCAL_STRING(lp_gid, gid)FN_LOCAL_STRING(lp_hosts_allow, hosts_allow)FN_LOCAL_STRING(lp_hosts_deny, hosts_deny)FN_LOCAL_STRING(lp_include, include)FN_LOCAL_STRING(lp_include_from, include_from)FN_LOCAL_STRING(lp_incoming_chmod, incoming_chmod)FN_LOCAL_STRING(lp_lock_file, lock_file)FN_LOCAL_STRING(lp_log_file, log_file)FN_LOCAL_STRING(lp_log_format, log_format)FN_LOCAL_STRING(lp_name, name)FN_LOCAL_STRING(lp_outgoing_chmod, outgoing_chmod)FN_LOCAL_STRING(lp_path, path)FN_LOCAL_STRING(lp_postxfer_exec, postxfer_exec)FN_LOCAL_STRING(lp_prexfer_exec, prexfer_exec)FN_LOCAL_STRING(lp_refuse_options, refuse_options)FN_LOCAL_STRING(lp_secrets_file, secrets_file)FN_LOCAL_STRING(lp_temp_dir, temp_dir)FN_LOCAL_STRING(lp_uid, uid)FN_LOCAL_INTEGER(lp_max_connections, max_connections)FN_LOCAL_INTEGER(lp_max_verbosity, max_verbosity)FN_LOCAL_INTEGER(lp_syslog_facility, syslog_facility)FN_LOCAL_INTEGER(lp_timeout, timeout)FN_LOCAL_BOOL(lp_fake_super, fake_super)FN_LOCAL_BOOL(lp_ignore_errors, ignore_errors)FN_LOCAL_BOOL(lp_ignore_nonreadable, ignore_nonreadable)FN_LOCAL_BOOL(lp_list, list)FN_LOCAL_BOOL(lp_munge_symlinks, munge_symlinks)FN_LOCAL_BOOL(lp_numeric_ids, numeric_ids)FN_LOCAL_BOOL(lp_read_only, read_only)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -