summaryrefslogtreecommitdiff
path: root/source3/modules/vfs_recycle.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/modules/vfs_recycle.c')
-rw-r--r--source3/modules/vfs_recycle.c70
1 files changed, 25 insertions, 45 deletions
diff --git a/source3/modules/vfs_recycle.c b/source3/modules/vfs_recycle.c
index 22f61b4b33..3e6825041e 100644
--- a/source3/modules/vfs_recycle.c
+++ b/source3/modules/vfs_recycle.c
@@ -35,33 +35,9 @@ static int vfs_recycle_debug_level = DBGC_VFS;
#undef DBGC_CLASS
#define DBGC_CLASS vfs_recycle_debug_level
-static int recycle_connect(vfs_handle_struct *handle, const char *service, const char *user);
-static void recycle_disconnect(vfs_handle_struct *handle);
static int recycle_unlink(vfs_handle_struct *handle,
const struct smb_filename *smb_fname);
-static int recycle_connect(vfs_handle_struct *handle, const char *service, const char *user)
-{
- int ret = SMB_VFS_NEXT_CONNECT(handle, service, user);
-
- if (ret < 0) {
- return ret;
- }
-
- DEBUG(10,("recycle_connect() connect to service[%s] as user[%s].\n",
- service,user));
-
- return 0;
-}
-
-static void recycle_disconnect(vfs_handle_struct *handle)
-{
- DEBUG(10,("recycle_disconnect() connect to service[%s].\n",
- lp_servicename(SNUM(handle->conn))));
-
- SMB_VFS_NEXT_DISCONNECT(handle);
-}
-
static const char *recycle_repository(vfs_handle_struct *handle)
{
const char *tmp_str = NULL;
@@ -150,9 +126,9 @@ static const char **recycle_noversions(vfs_handle_struct *handle)
return tmp_lp;
}
-static SMB_OFF_T recycle_maxsize(vfs_handle_struct *handle)
+static off_t recycle_maxsize(vfs_handle_struct *handle)
{
- SMB_OFF_T maxsize;
+ off_t maxsize;
maxsize = conv_str_size(lp_parm_const_string(SNUM(handle->conn),
"recycle", "maxsize", NULL));
@@ -162,9 +138,9 @@ static SMB_OFF_T recycle_maxsize(vfs_handle_struct *handle)
return maxsize;
}
-static SMB_OFF_T recycle_minsize(vfs_handle_struct *handle)
+static off_t recycle_minsize(vfs_handle_struct *handle)
{
- SMB_OFF_T minsize;
+ off_t minsize;
minsize = conv_str_size(lp_parm_const_string(SNUM(handle->conn),
"recycle", "minsize", NULL));
@@ -249,23 +225,23 @@ static bool recycle_file_exist(vfs_handle_struct *handle,
* @param fname file name
* @return size in bytes
**/
-static SMB_OFF_T recycle_get_file_size(vfs_handle_struct *handle,
+static off_t recycle_get_file_size(vfs_handle_struct *handle,
const struct smb_filename *smb_fname)
{
struct smb_filename *smb_fname_tmp = NULL;
NTSTATUS status;
- SMB_OFF_T size;
+ off_t size;
status = copy_smb_filename(talloc_tos(), smb_fname, &smb_fname_tmp);
if (!NT_STATUS_IS_OK(status)) {
- size = (SMB_OFF_T)0;
+ size = (off_t)0;
goto out;
}
if (SMB_VFS_STAT(handle->conn, smb_fname_tmp) != 0) {
DEBUG(0,("recycle: stat for %s returned %s\n",
smb_fname_str_dbg(smb_fname_tmp), strerror(errno)));
- size = (SMB_OFF_T)0;
+ size = (off_t)0;
goto out;
}
@@ -304,13 +280,17 @@ static bool recycle_create_dir(vfs_handle_struct *handle, const char *dname)
*new_dir = '\0';
if (dname[0] == '/') {
/* Absolute path. */
- safe_strcat(new_dir,"/",len);
+ if (strlcat(new_dir,"/",len+1) >= len+1) {
+ goto done;
+ }
}
/* Create directory tree if neccessary */
for(token = strtok_r(tok_str, "/", &saveptr); token;
token = strtok_r(NULL, "/", &saveptr)) {
- safe_strcat(new_dir, token, len);
+ if (strlcat(new_dir, token, len+1) >= len+1) {
+ goto done;
+ }
if (recycle_directory_exist(handle, new_dir))
DEBUG(10, ("recycle: dir %s already exists\n", new_dir));
else {
@@ -321,7 +301,9 @@ static bool recycle_create_dir(vfs_handle_struct *handle, const char *dname)
goto done;
}
}
- safe_strcat(new_dir, "/", len);
+ if (strlcat(new_dir, "/", len+1) >= len+1) {
+ goto done;
+ }
mode = recycle_subdir_mode(handle);
}
@@ -460,18 +442,18 @@ static int recycle_unlink(vfs_handle_struct *handle,
const char *base;
char *repository = NULL;
int i = 1;
- SMB_OFF_T maxsize, minsize;
- SMB_OFF_T file_size; /* space_avail; */
+ off_t maxsize, minsize;
+ off_t file_size; /* space_avail; */
bool exist;
NTSTATUS status;
int rc = -1;
- repository = talloc_sub_advanced(NULL, lp_servicename(SNUM(conn)),
- conn->session_info->unix_name,
+ repository = talloc_sub_advanced(NULL, lp_servicename(talloc_tos(), SNUM(conn)),
+ conn->session_info->unix_info->unix_name,
conn->connectpath,
- conn->session_info->utok.gid,
- conn->session_info->sanitized_username,
- conn->session_info->info3->base.domain.string,
+ conn->session_info->unix_token->gid,
+ conn->session_info->unix_info->sanitized_username,
+ conn->session_info->info->domain_name,
recycle_repository(handle));
ALLOC_CHECK(repository, done);
/* shouldn't we allow absolute path names here? --metze */
@@ -663,9 +645,7 @@ done:
}
static struct vfs_fn_pointers vfs_recycle_fns = {
- .connect_fn = recycle_connect,
- .disconnect = recycle_disconnect,
- .unlink = recycle_unlink
+ .unlink_fn = recycle_unlink
};
NTSTATUS vfs_recycle_init(void);