2 * Unix SMB/CIFS implementation.
5 * Copyright (C) Todd Stecher, 2009
6 * Copyright (C) Tim Prouty, 2009
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, see <http://www.gnu.org/licenses/>.
23 #include "smbd/smbd.h"
24 #include "onefs_config.h"
26 #include <ifs/ifs_syscalls.h>
28 #define ONEFS_DATA_FASTBUF 10
30 struct onefs_vfs_share_config vfs_share_config
[ONEFS_DATA_FASTBUF
];
31 struct onefs_vfs_share_config
*pvfs_share_config
;
33 static void onefs_load_faketimestamp_config(struct connection_struct
*conn
,
34 struct onefs_vfs_share_config
*cfg
)
37 int snum
= SNUM(conn
);
39 parm
= lp_parm_string_list(snum
, PARM_ONEFS_TYPE
, PARM_ATIME_NOW
,
40 PARM_ATIME_NOW_DEFAULT
);
43 cfg
->init_flags
|= ONEFS_VFS_CONFIG_FAKETIMESTAMPS
;
44 set_namearray(&cfg
->atime_now_list
,*parm
);
47 parm
= lp_parm_string_list(snum
, PARM_ONEFS_TYPE
, PARM_CTIME_NOW
,
48 PARM_CTIME_NOW_DEFAULT
);
51 cfg
->init_flags
|= ONEFS_VFS_CONFIG_FAKETIMESTAMPS
;
52 set_namearray(&cfg
->ctime_now_list
,*parm
);
55 parm
= lp_parm_string_list(snum
, PARM_ONEFS_TYPE
, PARM_MTIME_NOW
,
56 PARM_MTIME_NOW_DEFAULT
);
59 cfg
->init_flags
|= ONEFS_VFS_CONFIG_FAKETIMESTAMPS
;
60 set_namearray(&cfg
->mtime_now_list
,*parm
);
63 parm
= lp_parm_string_list(snum
, PARM_ONEFS_TYPE
, PARM_ATIME_STATIC
,
64 PARM_ATIME_STATIC_DEFAULT
);
67 cfg
->init_flags
|= ONEFS_VFS_CONFIG_FAKETIMESTAMPS
;
68 set_namearray(&cfg
->atime_static_list
,*parm
);
71 parm
= lp_parm_string_list(snum
, PARM_ONEFS_TYPE
, PARM_MTIME_STATIC
,
72 PARM_MTIME_STATIC_DEFAULT
);
75 cfg
->init_flags
|= ONEFS_VFS_CONFIG_FAKETIMESTAMPS
;
76 set_namearray(&cfg
->mtime_static_list
,*parm
);
79 cfg
->atime_slop
= lp_parm_int(snum
, PARM_ONEFS_TYPE
, PARM_ATIME_SLOP
,
80 PARM_ATIME_SLOP_DEFAULT
);
81 cfg
->ctime_slop
= lp_parm_int(snum
, PARM_ONEFS_TYPE
, PARM_CTIME_SLOP
,
82 PARM_CTIME_SLOP_DEFAULT
);
83 cfg
->mtime_slop
= lp_parm_int(snum
, PARM_ONEFS_TYPE
, PARM_MTIME_SLOP
,
84 PARM_MTIME_SLOP_DEFAULT
);
88 * Set onefs-specific vfs global config parameters.
90 * Since changes in these parameters require calling syscalls, we only want to
91 * call them when the configuration actually changes.
93 static void onefs_load_global_config(connection_struct
*conn
)
95 static struct onefs_vfs_global_config global_config
;
96 bool dot_snap_child_accessible
;
97 bool dot_snap_child_visible
;
98 bool dot_snap_root_accessible
;
99 bool dot_snap_root_visible
;
101 bool reconfig_dso
= false;
102 bool reconfig_tilde
= false;
104 /* Check if this is the first time setting the config options. */
105 if (!(global_config
.init_flags
& ONEFS_VFS_CONFIG_INITIALIZED
)) {
106 global_config
.init_flags
|= ONEFS_VFS_CONFIG_INITIALIZED
;
108 /* Set process encoding */
109 onefs_sys_config_enc();
112 reconfig_tilde
= true;
115 /* Get the dot snap options from the conf. */
116 dot_snap_child_accessible
=
117 lp_parm_bool(SNUM(conn
), PARM_ONEFS_TYPE
,
118 PARM_DOT_SNAP_CHILD_ACCESSIBLE
,
119 PARM_DOT_SNAP_CHILD_ACCESSIBLE_DEFAULT
);
120 dot_snap_child_visible
=
121 lp_parm_bool(SNUM(conn
), PARM_ONEFS_TYPE
,
122 PARM_DOT_SNAP_CHILD_VISIBLE
,
123 PARM_DOT_SNAP_CHILD_VISIBLE_DEFAULT
);
124 dot_snap_root_accessible
=
125 lp_parm_bool(SNUM(conn
), PARM_ONEFS_TYPE
,
126 PARM_DOT_SNAP_ROOT_ACCESSIBLE
,
127 PARM_DOT_SNAP_ROOT_ACCESSIBLE_DEFAULT
);
128 dot_snap_root_visible
=
129 lp_parm_bool(SNUM(conn
), PARM_ONEFS_TYPE
,
130 PARM_DOT_SNAP_ROOT_VISIBLE
,
131 PARM_DOT_SNAP_ROOT_VISIBLE_DEFAULT
);
133 lp_parm_bool(SNUM(conn
), PARM_ONEFS_TYPE
,
135 PARM_DOT_SNAP_TILDE_DEFAULT
);
137 /* Check if any of the dot snap options need updating. */
138 if (dot_snap_child_accessible
!=
139 global_config
.dot_snap_child_accessible
) {
140 global_config
.dot_snap_child_accessible
=
141 dot_snap_child_accessible
;
144 if (dot_snap_child_visible
!=
145 global_config
.dot_snap_child_visible
) {
146 global_config
.dot_snap_child_visible
=
147 dot_snap_child_visible
;
150 if (dot_snap_root_accessible
!=
151 global_config
.dot_snap_root_accessible
) {
152 global_config
.dot_snap_root_accessible
=
153 dot_snap_root_accessible
;
156 if (dot_snap_root_visible
!=
157 global_config
.dot_snap_root_visible
) {
158 global_config
.dot_snap_root_visible
=
159 dot_snap_root_visible
;
162 if (dot_snap_tilde
!= global_config
.dot_snap_tilde
) {
163 global_config
.dot_snap_tilde
= dot_snap_tilde
;
164 reconfig_tilde
= true;
167 /* If a dot snap option has changed update the process. */
169 onefs_sys_config_snap_opt(&global_config
);
172 /* If the dot snap tilde option has changed update the process. */
173 if (reconfig_tilde
) {
174 onefs_sys_config_tilde(&global_config
);
178 int onefs_load_config(connection_struct
*conn
)
180 int snum
= SNUM(conn
);
181 int share_count
= lp_numservices();
184 if (!pvfs_share_config
) {
186 if (share_count
<= ONEFS_DATA_FASTBUF
)
187 pvfs_share_config
= vfs_share_config
;
190 SMB_MALLOC_ARRAY(struct onefs_vfs_share_config
,
192 if (!pvfs_share_config
) {
197 memset(pvfs_share_config
, 0,
198 (sizeof(struct onefs_vfs_share_config
) *
203 if ((pvfs_share_config
[snum
].init_flags
&
204 ONEFS_VFS_CONFIG_INITIALIZED
) == 0) {
205 pvfs_share_config
[snum
].init_flags
=
206 ONEFS_VFS_CONFIG_INITIALIZED
;
207 onefs_load_faketimestamp_config(conn
,
208 &pvfs_share_config
[snum
]);
212 onefs_load_global_config(conn
);
217 bool onefs_get_config(int snum
, int config_type
,
218 struct onefs_vfs_share_config
*cfg
)
220 if ((pvfs_share_config
!= NULL
) &&
221 (pvfs_share_config
[snum
].init_flags
& config_type
))
222 *cfg
= pvfs_share_config
[snum
];
231 * Set the per-process encoding, ignoring errors.
233 void onefs_sys_config_enc(void)
237 ret
= enc_set_proc(ENC_UTF8
);
239 DEBUG(0, ("Setting process encoding failed: %s\n",
245 * Set the per-process .snpashot directory options, ignoring errors.
247 void onefs_sys_config_snap_opt(struct onefs_vfs_global_config
*global_config
)
249 struct ifs_dotsnap_options dso
;
253 dso
.sub_accessible
= global_config
->dot_snap_child_accessible
;
254 dso
.sub_visible
= global_config
->dot_snap_child_visible
;
255 dso
.root_accessible
= global_config
->dot_snap_root_accessible
;
256 dso
.root_visible
= global_config
->dot_snap_root_visible
;
258 ret
= ifs_set_dotsnap_options(&dso
);
260 DEBUG(0, ("Setting snapshot visibility/accessibility "
261 "failed: %s\n", strerror(errno
)));
266 * Set the per-process flag saying whether or not to accept ~snapshot
267 * as an alternative name for .snapshot directories.
269 void onefs_sys_config_tilde(struct onefs_vfs_global_config
*global_config
)
273 ret
= ifs_tilde_snapshot(global_config
->dot_snap_tilde
);
275 DEBUG(0, ("Setting snapshot tilde failed: %s\n",