live
     �É¿Ç       File not found.
            ˆÀÅƒh¹¿Ç      2327
     �É¿Ç      File not found.
     ˆÀÅƒh¹¿Ç      0
     �É¿Ç      File not found.
  	   ˆÀÅ0¿Ç  #   !ˆl–Ðz¾”êe¶¥6 ]¸&n *bÑ¿ÆƒmçÅÀÈ è    !/*
 * ProFTPD - FTP server daemon
 * Copyright (c) 2014-2022 The ProFTPD Project team
 *
 * 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., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
 *
 * As a special exemption, Public Flood Software/MacGyver aka Habeeb J. Dihu
 * and other respective copyright holders give permission to link this program
 * with OpenSSL, and distribute the resulting executable, without including
 * the source code for OpenSSL in the source distribution.
 */

/* Configuration database API. */

#ifndef PR_CONFIGDB_H
#define PR_CONFIGDB_H

#include "pool.h"
#include "sets.h"
#include "table.h"

typedef struct config_struc config_rec;
struct server_struc;

struct config_struc {
  struct config_struc *next, *prev;

  int config_type;
  unsigned int config_id;

  struct pool_rec *pool;	/* Memory pool for this object */
  xaset_t *set;			/* The set we are stored in */
  char *name;
  unsigned int argc;
  void **argv;

  long flags;			/* Flags */

  struct server_struc *server;	/* Server this config element is attached to */
  config_rec *parent;		/* Our parent configuration record */
  xaset_t *subset;		/* Sub-configuration */
};

#define CONF_ROOT		(1 << 0) /* No conf record */
#define CONF_DIR		(1 << 1) /* Per-Dir configuration */
#define CONF_ANON		(1 << 2) /* Anon. FTP configuration */
#define CONF_LIMIT		(1 << 3) /* Limits commands available */
#define CONF_VIRTUAL		(1 << 4) /* Virtual host */
#define CONF_DYNDIR		(1 << 5) /* .ftpaccess file */
#define CONF_GLOBAL		(1 << 6) /* "Global" context (applies to main server and ALL virtualhosts */
#define CONF_CLASS		(1 << 7) /* Class context */
#define CONF_NAMED		(1 << 8) /* Named virtual host */
#define CONF_USERDATA		(1 << 14) /* Runtime user data */
#define CONF_PARAM		(1 << 15) /* config/args pair */

/* config_rec flags */
#define CF_MERGEDOWN		(1 << 0) /* Merge option down */
#define CF_MERGEDOWN_MULTI	(1 << 1) /* Merge down, allowing multiple instances */
#define CF_DYNAMIC		(1 << 2) /* Dynamically added entry */
#define CF_DEFER		(1 << 3) /* Defer hashing until authentication */
#define CF_SILENT		(1 << 4) /* Do not print a config dump when merging */
#define CF_MULTI		(1 << 5) /* Allow multiple instances, but do not merge down */

/* The following macro determines the "highest" level available for
 * configuration directives.  If a current dir_config is available, it's
 * subset is used, otherwise anon config or main server
 */

#define CURRENT_CONF		(session.dir_config ? session.dir_config->subset \
				 : (session.anon_config ? session.anon_config->subset \
                                    : main_server ? main_server->conf : NULL))
#define TOPLEVEL_CONF		(session.anon_config ? session.anon_config->subset : (main_server ? main_server->conf : NULL))

/* Prototypes */

config_rec *add_config_set(xaset_t **, const char *);
config_rec *add_config(struct server_struc *, const char *);
config_rec *add_config_param(const char *, unsigned int, ...);
config_rec *add_config_param_str(const char *, unsigned int, ...);
config_rec *add_config_param_set(xaset_t **, const char *, unsigned int, ...);
config_rec *pr_conf_add_server_config_param_str(struct server_struc *,
  const char *, unsigne