/* called when a client connects to a share */ static int tsmsm_connect(struct vfs_handle_struct *handle, const char *service, const char *user) { struct tsmsm_struct *tsmd; const char *fres; const char *tsmname; int ret = SMB_VFS_NEXT_CONNECT(handle, service, user); if (ret < 0) { return ret; } tsmd = talloc_zero(handle, struct tsmsm_struct); if (!tsmd) { SMB_VFS_NEXT_DISCONNECT(handle); DEBUG(0,("tsmsm_connect: out of memory!\n")); return -1; } if (!dmapi_have_session()) { SMB_VFS_NEXT_DISCONNECT(handle); DEBUG(0,("tsmsm_connect: no DMAPI session for Samba is available!\n")); TALLOC_FREE(tsmd); return -1; } tsmname = (handle->param ? handle->param : "tsmsm"); /* Get 'hsm script' and 'dmapi attribute' parameters to tsmd context */ tsmd->hsmscript = lp_parm_talloc_string(SNUM(handle->conn), tsmname, "hsm script", NULL); talloc_steal(tsmd, tsmd->hsmscript); tsmd->attrib_name = lp_parm_talloc_string(SNUM(handle->conn), tsmname, "dmapi attribute", DM_ATTRIB_OBJECT); talloc_steal(tsmd, tsmd->attrib_name); tsmd->attrib_value = lp_parm_talloc_string(SNUM(handle->conn), "tsmsm", "dmapi value", NULL); talloc_steal(tsmd, tsmd->attrib_value); /* retrieve 'online ratio'. In case of error default to FILE_IS_ONLINE_RATIO */ fres = lp_parm_const_string(SNUM(handle->conn), tsmname, "online ratio", NULL); if (fres == NULL) { tsmd->online_ratio = FILE_IS_ONLINE_RATIO; } else { tsmd->online_ratio = strtof(fres, NULL); if (tsmd->online_ratio > 1.0 || tsmd->online_ratio <= 0.0) { DEBUG(1, ("tsmsm_connect: invalid online ration %f - using %f.\n", tsmd->online_ratio, (float)FILE_IS_ONLINE_RATIO)); } } /* Store the private data. */ SMB_VFS_HANDLE_SET_DATA(handle, tsmd, tsmsm_free_data, struct tsmsm_struct, return -1); return 0; }
static uint32 set_offline_flag(connection_struct *conn, const char *const path) { if (ISDOT(path) || ISDOTDOT(path)) { return 0; } if (!lp_dmapi_support(SNUM(conn)) || !dmapi_have_session()) { return 0; } return dmapi_file_flags(path); }