1 /*
2  * config_impl.h :  private header for the config file implementation.
3  *
4  * ====================================================================
5  *    Licensed to the Apache Software Foundation (ASF) under one
6  *    or more contributor license agreements.  See the NOTICE file
7  *    distributed with this work for additional information
8  *    regarding copyright ownership.  The ASF licenses this file
9  *    to you under the Apache License, Version 2.0 (the
10  *    "License"); you may not use this file except in compliance
11  *    with the License.  You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  *    Unless required by applicable law or agreed to in writing,
16  *    software distributed under the License is distributed on an
17  *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
18  *    KIND, either express or implied.  See the License for the
19  *    specific language governing permissions and limitations
20  *    under the License.
21  * ====================================================================
22  */
23 
24 
25 
26 #ifndef SVN_LIBSVN_SUBR_CONFIG_IMPL_H
27 #define SVN_LIBSVN_SUBR_CONFIG_IMPL_H
28 
29 #define APR_WANT_STDIO
30 #include <apr_want.h>
31 
32 #include <apr_hash.h>
33 #include "svn_types.h"
34 #include "svn_string.h"
35 #include "svn_io.h"
36 #include "svn_config.h"
37 
38 #ifdef __cplusplus
39 extern "C" {
40 #endif /* __cplusplus */
41 
42 
43 /* The configuration data. This is a superhash of sections and options. */
44 struct svn_config_t
45 {
46   /* Table of cfg_section_t's. */
47   apr_hash_t *sections;
48 
49   /* Pool for hash tables, table entries and unexpanded values.
50      Also, parent pool for temporary pools. */
51   apr_pool_t *pool;
52 
53   /* Pool for expanded values -- this is separate, so that we can
54      clear it when modifying the config data. */
55   apr_pool_t *x_pool;
56 
57   /* Indicates that some values in the configuration have been expanded. */
58   svn_boolean_t x_values;
59 
60   /* Temporary string used for lookups.  (Using a stringbuf so that
61      frequent resetting is efficient.) */
62   svn_stringbuf_t *tmp_key;
63 
64   /* Temporary value used for expanded default values in svn_config_get.
65      (Using a stringbuf so that frequent resetting is efficient.) */
66   svn_stringbuf_t *tmp_value;
67 
68   /* Specifies whether section names are populated case sensitively. */
69   svn_boolean_t section_names_case_sensitive;
70 
71   /* Specifies whether option names are populated case sensitively. */
72   svn_boolean_t option_names_case_sensitive;
73 
74   /* When set, all modification attempts will be ignored.
75    * In debug mode, we will trigger an assertion. */
76   svn_boolean_t read_only;
77 };
78 
79 /* The default add-value constructor callback, used by the default
80    config parser that populates an svn_config_t. */
81 svn_error_t *svn_config__default_add_value_fn(
82     void *baton, svn_stringbuf_t *section,
83     svn_stringbuf_t *option, svn_stringbuf_t *value);
84 
85 /* Read sections and options from a file. */
86 svn_error_t *svn_config__parse_file(svn_config_t *cfg,
87                                     const char *file,
88                                     svn_boolean_t must_exist,
89                                     apr_pool_t *pool);
90 
91 /* The name of the magic [DEFAULT] section. */
92 #define SVN_CONFIG__DEFAULT_SECTION "DEFAULT"
93 
94 
95 #ifdef WIN32
96 /* Get the common or user-specific AppData folder */
97 svn_error_t *svn_config__win_config_path(const char **folder,
98                                          svn_boolean_t system_path,
99                                          apr_pool_t *result_pool,
100                                          apr_pool_t *scratch_pool);
101 
102 /* Read sections and options from the Windows Registry. */
103 svn_error_t *svn_config__parse_registry(svn_config_t *cfg,
104                                         const char *file,
105                                         svn_boolean_t must_exist,
106                                         apr_pool_t *pool);
107 
108 /* ### It's unclear to me whether this registry stuff should get the
109    double underscore or not, and if so, where the extra underscore
110    would go.  Thoughts?  -kff */
111 #  define SVN_REGISTRY_PREFIX "REGISTRY:"
112 #  define SVN_REGISTRY_PREFIX_LEN ((sizeof(SVN_REGISTRY_PREFIX)) - 1)
113 #  define SVN_REGISTRY_HKLM "HKLM\\"
114 #  define SVN_REGISTRY_HKLM_LEN ((sizeof(SVN_REGISTRY_HKLM)) - 1)
115 #  define SVN_REGISTRY_HKCU "HKCU\\"
116 #  define SVN_REGISTRY_HKCU_LEN ((sizeof(SVN_REGISTRY_HKCU)) - 1)
117 #  define SVN_REGISTRY_PATH "Software\\Tigris.org\\Subversion\\"
118 #  define SVN_REGISTRY_PATH_LEN ((sizeof(SVN_REGISTRY_PATH)) - 1)
119 #  define SVN_REGISTRY_SYS_CONFIG_PATH \
120                                SVN_REGISTRY_PREFIX     \
121                                SVN_REGISTRY_HKLM       \
122                                SVN_REGISTRY_PATH
123 #  define SVN_REGISTRY_USR_CONFIG_PATH \
124                                SVN_REGISTRY_PREFIX     \
125                                SVN_REGISTRY_HKCU       \
126                                SVN_REGISTRY_PATH
127 #endif /* WIN32 */
128 
129 /* System-wide and configuration subdirectory names.
130    NOTE: Don't use these directly; call svn_config__sys_config_path()
131    or svn_config_get_user_config_path() instead. */
132 #ifdef WIN32
133 #  define SVN_CONFIG__SUBDIRECTORY    "Subversion"
134 #elif defined __HAIKU__ /* HAIKU */
135 #  define SVN_CONFIG__SYS_DIRECTORY   "subversion"
136 #  define SVN_CONFIG__USR_DIRECTORY   "subversion"
137 #else  /* ! WIN32 && ! __HAIKU__ */
138 #  define SVN_CONFIG__SYS_DIRECTORY   "/usr/local/etc/subversion"
139 #  define SVN_CONFIG__USR_DIRECTORY   ".subversion"
140 #endif /* WIN32 */
141 
142 /* The description/instructions file in the config directory. */
143 #define SVN_CONFIG__USR_README_FILE    "README.txt"
144 
145 /* The name of the main authentication subdir in the config directory */
146 #define SVN_CONFIG__AUTH_SUBDIR        "auth"
147 
148 /* Set *PATH_P to the path to config file FNAME in the system
149    configuration area, allocated in POOL.  If FNAME is NULL, set
150    *PATH_P to the directory name of the system config area, either
151    allocated in POOL or a static constant string.
152 
153    If the system configuration area cannot be located (possible under
154    Win32), set *PATH_P to NULL regardless of FNAME.  */
155 svn_error_t *
156 svn_config__sys_config_path(const char **path_p,
157                             const char *fname,
158                             apr_pool_t *pool);
159 
160 
161 #ifdef __cplusplus
162 }
163 #endif /* __cplusplus */
164 
165 #endif /* SVN_LIBSVN_SUBR_CONFIG_IMPL_H */
166