mirror of
https://github.com/samba-team/samba.git
synced 2025-01-26 10:04:02 +03:00
r14669: Remove duplicate source caused by running patch(1) once too often.
(This used to be commit 0ebbfc867c71002eaf921f4f4d8aa7d7b78973a7)
This commit is contained in:
parent
40d0707827
commit
a7d1a32b14
@ -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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user