⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 loadparm.c

📁 Rsync 3.0.5 source code
💻 C
📖 第 1 页 / 共 2 页
字号:
/* 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 + -