X-Git-Url: http://git.samba.org/samba.git/?p=tprouty%2Fsamba.git;a=blobdiff_plain;f=source%2Fsmbd%2Fdmapi.c;h=127d1627cf05ba3058e5698d9a92979d14d74180;hp=2188924d4b8518638b48d7695a764077d6d31a13;hb=b0132e94fc5fef936aa766fb99a306b3628e9f07;hpb=0ebbfc867c71002eaf921f4f4d8aa7d7b78973a7
diff --git a/source/smbd/dmapi.c b/source/smbd/dmapi.c
index 2188924d4b..127d1627cf 100644
--- a/source/smbd/dmapi.c
+++ b/source/smbd/dmapi.c
@@ -6,7 +6,7 @@
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
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
@@ -15,8 +15,7 @@
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.
+ along with this program. If not, see .
*/
#include "includes.h"
@@ -24,12 +23,6 @@
#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; }
@@ -40,10 +33,14 @@ BOOL dmapi_have_session(void) { return False; }
#ifdef HAVE_XFS_DMAPI_H
#include
-#endif
-
-#ifdef HAVE_SYS_DMI_H
+#elif defined(HAVE_SYS_DMI_H)
#include
+#elif defined(HAVE_SYS_JFSDMAPI_H)
+#include
+#elif defined(HAVE_SYS_DMAPI_H)
+#include
+#elif defined(HAVE_DMAPI_H)
+#include
#endif
#define DMAPI_SESSION_NAME "samba"
@@ -154,7 +151,9 @@ retry:
/* No session already defined. */
if (dmapi_session == DM_NO_SESSION) {
- err = dm_create_session(DM_NO_SESSION, DMAPI_SESSION_NAME,
+ err = dm_create_session(DM_NO_SESSION,
+ CONST_DISCARD(char *,
+ DMAPI_SESSION_NAME),
&dmapi_session);
if (err < 0) {
DEBUGADD(DMAPI_TRACE,
@@ -244,6 +243,13 @@ uint32 dmapi_file_flags(const char * const path)
}
}
+ /* AIX has DMAPI but no POSIX capablities support. In this case,
+ * we need to be root to do DMAPI manipulations.
+ */
+#ifndef HAVE_POSIX_CAPABILITIES
+ become_root();
+#endif
+
err = dm_path_to_handle(CONST_DISCARD(char *, path),
&dm_handle, &dm_handle_len);
if (err < 0) {
@@ -251,7 +257,7 @@ uint32 dmapi_file_flags(const char * const path)
path, strerror(errno)));
if (errno != EPERM) {
- return 0;
+ goto done;
}
/* Linux capabilities are broken in that changing our
@@ -269,7 +275,7 @@ uint32 dmapi_file_flags(const char * const path)
DEBUG(DMAPI_TRACE,
("retrying dm_path_to_handle(%s): %s\n",
path, strerror(errno)));
- return 0;
+ goto done;
}
}
@@ -279,7 +285,7 @@ uint32 dmapi_file_flags(const char * const path)
DEBUG(DMAPI_TRACE, ("dm_get_eventlist(%s): %s\n",
path, strerror(errno)));
dm_handle_free(dm_handle, dm_handle_len);
- return 0;
+ goto done;
}
/* We figure that the only reason a DMAPI application would be
@@ -298,6 +304,12 @@ uint32 dmapi_file_flags(const char * const path)
DEBUG(DMAPI_TRACE, ("%s is OFFLINE\n", path));
}
+done:
+
+#ifndef HAVE_POSIX_CAPABILITIES
+ unbecome_root();
+#endif
+
return flags;
}