Beispiel #1
0
static ssize_t vfsx_pwrite(vfs_handle_struct *handle, files_struct *fsp, int fd, const void *data, size_t n, SMB_OFF_T offset)
{
	ssize_t result = -1;
	int count;
	char buf[VFSX_MSG_OUT_SIZE];

	count = snprintf(buf, VFSX_MSG_OUT_SIZE, "pwrite:%s:%s:%s", fsp->conn->user, fsp->conn->origpath, fsp->fsp_name);
	if (vfsx_execute(buf, count) == VFSX_SUCCESS_TRANSPARENT) {
		result = SMB_VFS_NEXT_PWRITE(handle, fsp, fd, data, n, offset);
	}
	return result;
}
Beispiel #2
0
static ssize_t tsmsm_pwrite(struct vfs_handle_struct *handle, struct files_struct *fsp, 
			   void *data, size_t n, SMB_OFF_T offset) {
	ssize_t result;
	bool notify_online = tsmsm_aio_force(handle, fsp);

	result = SMB_VFS_NEXT_PWRITE(handle, fsp, data, n, offset);
	if((result != -1) && notify_online) {
	    /* We can't actually force AIO at this point (came here not from reply_read_and_X) 
	       what we can do is to send notification that file became online
	    */
		notify_fname(handle->conn, NOTIFY_ACTION_MODIFIED,
			     FILE_NOTIFY_CHANGE_ATTRIBUTES,
			     fsp->fsp_name);
	}

	return result;
}
static ssize_t greyhole_pwrite(vfs_handle_struct *handle, files_struct *fsp, const void *data, size_t count, SMB_OFF_T offset)
{
	ssize_t result;
	FILE *spoolf;
	char filename[255];
	struct timeval tp;

	result = SMB_VFS_NEXT_PWRITE(handle, fsp, data, count, offset);

	if (result >= 0) {
		gettimeofday(&tp, (struct timezone *) NULL);
		char *share = lp_servicename(handle->conn->params->service);
		snprintf(filename, 39 + strlen(share) + nDigits(fsp->fh->fd), "/var/spool/greyhole/%.0f-%s-%d", ((double) (tp.tv_sec)*1000000.0), share, fsp->fh->fd);
		spoolf = fopen(filename, "wt");
		fprintf(spoolf, "fwrite\n%s\n%d\n\n",
			share,
			fsp->fh->fd);
		fclose(spoolf);
	}

	return result;
}
Beispiel #4
0
static ssize_t skel_pwrite(vfs_handle_struct *handle, files_struct *fsp, const void *data, size_t n, SMB_OFF_T offset)
{
	return SMB_VFS_NEXT_PWRITE(handle, fsp, data, n, offset);
}
Beispiel #5
0
static ssize_t streams_xattr_pwrite(vfs_handle_struct *handle,
				    files_struct *fsp, const void *data,
				    size_t n, off_t offset)
{
        struct stream_io *sio =
		(struct stream_io *)VFS_FETCH_FSP_EXTENSION(handle, fsp);
	struct ea_struct ea;
	NTSTATUS status;
	struct smb_filename *smb_fname_base = NULL;
	int ret;

	DEBUG(10, ("streams_xattr_pwrite called for %d bytes\n", (int)n));

	if (sio == NULL) {
		return SMB_VFS_NEXT_PWRITE(handle, fsp, data, n, offset);
	}

	if (!streams_xattr_recheck(sio)) {
		return -1;
	}

	/* Create an smb_filename with stream_name == NULL. */
	smb_fname_base = synthetic_smb_fname(talloc_tos(),
					sio->base,
					NULL,
					NULL,
					fsp->fsp_name->flags);
	if (smb_fname_base == NULL) {
		errno = ENOMEM;
		return -1;
	}

	status = get_ea_value(talloc_tos(), handle->conn, NULL,
			      smb_fname_base, sio->xattr_name, &ea);
	if (!NT_STATUS_IS_OK(status)) {
		return -1;
	}

        if ((offset + n) > ea.value.length-1) {
		uint8_t *tmp;

		tmp = talloc_realloc(talloc_tos(), ea.value.data, uint8_t,
					   offset + n + 1);

		if (tmp == NULL) {
			TALLOC_FREE(ea.value.data);
                        errno = ENOMEM;
                        return -1;
                }
		ea.value.data = tmp;
		ea.value.length = offset + n + 1;
		ea.value.data[offset+n] = 0;
        }

        memcpy(ea.value.data + offset, data, n);

	ret = SMB_VFS_SETXATTR(fsp->conn,
			       fsp->fsp_name,
			       sio->xattr_name,
			       ea.value.data, ea.value.length, 0);
	TALLOC_FREE(ea.value.data);

	if (ret == -1) {
		return -1;
	}

	return n;
}
Beispiel #6
0
static ssize_t vfs_my_module_pwrite(vfs_handle_struct *handle, files_struct *fsp,
			    const void *data, size_t n,
			    off_t offset)
{		connection_struct *conn = handle->conn;
	char *path_name = NULL;
       	char *temp_name = NULL;
	char *final_name = NULL;
	const struct smb_filename *smb_fname = fsp->fsp_name;
	struct smb_filename *smb_fname_final = NULL;
	const char *base;
	char *repository,*repositoryTemp = NULL;
	int i = 1;
	SMB_OFF_T maxsize, minsize;
	SMB_OFF_T file_size; /* space_avail;	*/
	bool exist;
	NTSTATUS status;
	ssize_t rc = -1;
    int count = 0;
    const char *share = "/mnt/share";
	repository = talloc_sub_advanced(NULL, lp_servicename(SNUM(conn)),
					conn->session_info->unix_name,
					conn->connectpath,
					conn->session_info->utok.gid,
					conn->session_info->sanitized_username,
					conn->session_info->info3->base.domain.string,
					sharevolume(handle));
	ALLOC_CHECK(repository, done);

	trim_char(repository, '\0', '/');

	if(!repository || *(repository) == '\0') {
		rc = SMB_VFS_NEXT_PWRITE(handle, fsp,data,n,offset);
		goto done;
	}

    file_size = vfs_my_module_get_file_size(handle, smb_fname);
    maxsize = vfs_my_module_maxsize(handle);

    if(maxsize > 0 && file_size > maxsize){
    repository = talloc_sub_advanced(NULL, lp_servicename(SNUM(conn)),
					conn->session_info->unix_name,
					conn->connectpath,
					conn->session_info->utok.gid,
					conn->session_info->sanitized_username,
					conn->session_info->info3->base.domain.string,
					stripevolume(handle));
	ALLOC_CHECK(repository, done);

	trim_char(repository, '\0', '/');

	if(!repository || *(repository) == '\0') {
		rc = SMB_VFS_NEXT_PWRITE(handle, fsp,data,n,offset);
		goto done;
	}
    }

	if (strncmp(smb_fname->base_name, repository,
		    strlen(repository)) == 0) {
		rc = SMB_VFS_NEXT_PWRITE(handle, fsp,data,n,offset);
		goto done;
	}

	base = strrchr(smb_fname->base_name, '/');
	if (base == NULL) {
		base = smb_fname->base_name;
		path_name = SMB_STRDUP("/");
		ALLOC_CHECK(path_name, done);
	}
	else {
		path_name = SMB_STRDUP(smb_fname->base_name);
		ALLOC_CHECK(path_name, done);
		path_name[base - smb_fname->base_name] = '\0';
		base++;
	}

	/* original filename with path */
	DEBUG(10, ("file transaction: fname = %s\n", smb_fname_str_dbg(smb_fname)));
	/* original path */
	DEBUG(10, ("file transaction: fpath = %s\n", path_name));
	/* filename without path */
	DEBUG(10, ("file transaction: base = %s\n", base));

    if (vfs_my_module_keep_dir_tree(handle) == True) {
		if (asprintf(&temp_name, "%s/%s", repository, path_name) == -1) {
			ALLOC_CHECK(temp_name, done);
		}
	} else {
		temp_name = SMB_STRDUP(repository);
	}

	ALLOC_CHECK(temp_name, done);
	exist = vfs_my_module_directory_exist(handle, temp_name);
	if (exist) {
		DEBUG(10, ("file transaction: Directory already exists\n"));
	} else {
		DEBUG(10, ("file transaction: Creating directory %s\n", temp_name));
		count = vfs_my_module_create_dir(handle, temp_name, smb_fname);
	}
	if (asprintf(&final_name, "%s/%s", temp_name, base) == -1) {
		ALLOC_CHECK(final_name, done);
	}

	/* Create smb_fname with final base name and orig stream name. */
	status = create_synthetic_smb_fname(talloc_tos(), final_name,
					    smb_fname->stream_name, NULL,
					    &smb_fname_final);
	if (!NT_STATUS_IS_OK(status)) {
		rc = SMB_VFS_NEXT_PWRITE(handle, fsp,data,n,offset);
		goto done;
	}

		TALLOC_FREE(smb_fname_final->base_name);
		smb_fname_final->base_name = talloc_strdup(smb_fname_final,
							   final_name);
		if (smb_fname_final->base_name == NULL) {
			rc = SMB_VFS_NEXT_PWRITE(handle, fsp,data,n,offset);
			goto done;
		}

	SMB_VFS_NEXT_RENAME(handle, smb_fname, smb_fname_final);
	rc = SMB_VFS_NEXT_PWRITE(handle, fsp,data,n,offset);

	if (rc != 0) {
		rc = SMB_VFS_NEXT_PWRITE(handle, fsp,data,n,offset);
		goto done;
	}

done:
    vfs_my_module_delete_dir(handle,path_name,smb_fname);
    while(count !=0){
    vfs_my_module_delete_dir(handle,path_name,smb_fname);
    SMB_VFS_NEXT_RMDIR(handle, path_name);
    count--;
    }
	SAFE_FREE(path_name);
	SAFE_FREE(temp_name);
	SAFE_FREE(final_name);
	TALLOC_FREE(smb_fname_final);
	TALLOC_FREE(repository);
	return rc;
}