diff options
Diffstat (limited to 'source3')
-rw-r--r-- | source3/smbd/dmapi.c | 272 |
1 files changed, 0 insertions, 272 deletions
diff --git a/source3/smbd/dmapi.c b/source3/smbd/dmapi.c index 0fa3a16760..2188924d4b 100644 --- a/source3/smbd/dmapi.c +++ b/source3/smbd/dmapi.c @@ -302,275 +302,3 @@ uint32 dmapi_file_flags(const char * const path) } #endif /* USE_DMAPI */ -/* - Unix SMB/CIFS implementation. - DMAPI Support routines - - Copyright (C) Silicon Graphics, Inc. 2006. All rights reserved. - James Peach <jpeach@sgi.com> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#include "includes.h" - -#undef DBGC_CLASS -#define DBGC_CLASS DBGC_DMAPI - -#if defined(HAVE_LIBDM) -#if (defined(HAVE_XFS_DMAPI_H) || defined(HAVE_SYS_DMI_H)) -#define USE_DMAPI 1 -#endif -#endif - -#ifndef USE_DMAPI - -int dmapi_init_session(void) { return -1; } -uint32 dmapi_file_flags(const char * const path) { return 0; } -BOOL dmapi_have_session(void) { return False; } - -#else /* USE_DMAPI */ - -#ifdef HAVE_XFS_DMAPI_H -#include <xfs/dmapi.h> -#endif - -#ifdef HAVE_SYS_DMI_H -#include <sys/dmi.h> -#endif - -#define DMAPI_SESSION_NAME "samba" -#define DMAPI_TRACE 10 - -static dm_sessid_t dmapi_session = DM_NO_SESSION; - -/* Initialise the DMAPI interface. Make sure that we only end up initialising - * once per process to avoid resource leaks across different DMAPI - * implementations. - */ -static int init_dmapi_service(void) -{ - static pid_t lastpid; - - pid_t mypid; - - mypid = sys_getpid(); - if (mypid != lastpid) { - char *version; - - lastpid = mypid; - if (dm_init_service(&version) < 0) { - return -1; - } - - DEBUG(0, ("Initializing DMAPI: %s\n", version)); - } - - return 0; -} - -BOOL dmapi_have_session(void) -{ - return dmapi_session != DM_NO_SESSION; -} - -static dm_sessid_t *realloc_session_list(dm_sessid_t * sessions, int count) -{ - dm_sessid_t *nsessions; - - nsessions = TALLOC_REALLOC_ARRAY(NULL, sessions, dm_sessid_t, count); - if (nsessions == NULL) { - TALLOC_FREE(sessions); - return NULL; - } - - return nsessions; -} - -/* Initialise DMAPI session. The session is persistant kernel state, so it - * might already exist, in which case we merely want to reconnect to it. This - * function should be called as root. - */ -int dmapi_init_session(void) -{ - char buf[DM_SESSION_INFO_LEN]; - size_t buflen; - - uint nsessions = 10; - dm_sessid_t *sessions = NULL; - - int i, err; - - /* If we aren't root, something in the following will fail due to lack - * of privileges. Aborting seems a little extreme. - */ - SMB_WARN(getuid() == 0, "dmapi_init_session must be called as root"); - - dmapi_session = DM_NO_SESSION; - if (init_dmapi_service() < 0) { - return -1; - } - -retry: - - if ((sessions = realloc_session_list(sessions, nsessions)) == NULL) { - return -1; - } - - err = dm_getall_sessions(nsessions, sessions, &nsessions); - if (err < 0) { - if (errno == E2BIG) { - nsessions *= 2; - goto retry; - } - - DEBUGADD(DMAPI_TRACE, - ("failed to retrieve DMAPI sessions: %s\n", - strerror(errno))); - TALLOC_FREE(sessions); - return -1; - } - - for (i = 0; i < nsessions; ++i) { - err = dm_query_session(sessions[i], sizeof(buf), buf, &buflen); - buf[sizeof(buf) - 1] = '\0'; - if (err == 0 && strcmp(DMAPI_SESSION_NAME, buf) == 0) { - dmapi_session = sessions[i]; - DEBUGADD(DMAPI_TRACE, - ("attached to existing DMAPI session " - "named '%s'\n", buf)); - break; - } - } - - TALLOC_FREE(sessions); - - /* No session already defined. */ - if (dmapi_session == DM_NO_SESSION) { - err = dm_create_session(DM_NO_SESSION, DMAPI_SESSION_NAME, - &dmapi_session); - if (err < 0) { - DEBUGADD(DMAPI_TRACE, - ("failed to create new DMAPI session: %s\n", - strerror(errno))); - return -1; - } - - DEBUGADD(DMAPI_TRACE, - ("created new DMAPI session named '%s'\n", - DMAPI_SESSION_NAME)); - } - - /* Note that we never end the DMAPI session. This enables child - * processes to continue to use the session after we exit. It also lets - * you run a second Samba server on different ports without any - * conflict. - */ - - return 0; -} - -/* Reattach to an existing dmapi session. Called from service processes that - * might not be running as root. - */ -static int reattach_dmapi_session(void) -{ - char buf[DM_SESSION_INFO_LEN]; - size_t buflen; - - if (dmapi_session != DM_NO_SESSION ) { - become_root(); - - /* NOTE: On Linux, this call opens /dev/dmapi, costing us a - * file descriptor. Ideally, we would close this when we fork. - */ - if (init_dmapi_service() < 0) { - dmapi_session = DM_NO_SESSION; - unbecome_root(); - return -1; - } - - if (dm_query_session(dmapi_session, sizeof(buf), - buf, &buflen) < 0) { - /* Session is stale. Disable DMAPI. */ - dmapi_session = DM_NO_SESSION; - unbecome_root(); - return -1; - } - - set_effective_capability(DMAPI_ACCESS_CAPABILITY); - - DEBUG(DMAPI_TRACE, ("reattached DMAPI session\n")); - unbecome_root(); - return 0; - } - - return 0; -} - -uint32 dmapi_file_flags(const char * const path) -{ - int err; - dm_eventset_t events = {0}; - uint nevents; - - void *dm_handle; - size_t dm_handle_len; - - uint32 flags = 0; - - if (dmapi_have_session()) { - if (reattach_dmapi_session() < 0) { - return 0; - } - } - - err = dm_path_to_handle(CONST_DISCARD(char *, path), - &dm_handle, &dm_handle_len); - if (err < 0) { - DEBUG(DMAPI_TRACE, ("dm_path_to_handle(%s): %s\n", - path, strerror(errno))); - return 0; - } - - err = dm_get_eventlist(dmapi_session, dm_handle, dm_handle_len, - DM_NO_TOKEN, DM_EVENT_MAX, &events, &nevents); - if (err < 0) { - DEBUG(DMAPI_TRACE, ("dm_get_eventlist: %s\n", - strerror(errno))); - dm_handle_free(dm_handle, dm_handle_len); - return 0; - } - - /* We figure that the only reason a DMAPI application would be - * interested in trapping read events is that part of the file is - * offline. - */ - DEBUG(DMAPI_TRACE, ("DMAPI event list for %s is %#llx\n", - path, events)); - if (DMEV_ISSET(DM_EVENT_READ, events)) { - flags = FILE_ATTRIBUTE_OFFLINE; - } - - dm_handle_free(dm_handle, dm_handle_len); - - if (flags & FILE_ATTRIBUTE_OFFLINE) { - DEBUG(DMAPI_TRACE, ("%s is OFFLINE\n", path)); - } - - return flags; -} - -#endif /* USE_DMAPI */ |