summaryrefslogtreecommitdiff
path: root/source4/lib/util.c
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2006-01-31 00:48:57 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:51:37 -0500
commitb70009649a23ee8f0e88c1b9935e739537f4a960 (patch)
treee720a3d9862dea024fbce7b28f4a2873ab2530ce /source4/lib/util.c
parentb98a5bf92222e37eb62422f65ecc048511a8f256 (diff)
downloadsamba-b70009649a23ee8f0e88c1b9935e739537f4a960.tar.gz
samba-b70009649a23ee8f0e88c1b9935e739537f4a960.tar.bz2
samba-b70009649a23ee8f0e88c1b9935e739537f4a960.zip
r13244: Allow control of the location of the Samba3-compatible winbindd pipe
in Samba4. This allows us to start winbindd by default, including in 'make test'. This is via a new 'winbindd socket directory' parameter for utilities linked against loadparm, as well as a --with-winbindd-socket-dir option to configure (setting the default and the value for simple clients). I hope to add basic winbindd tests, to ensure continued correct operation, but at least now I don't have to manually change my 'server services' line. The other problem with the hard-coded /tmp/.winbind is that RedHat has moved this in Fedora (to /var/run I think). For this reason, this functionality should probably be ported to Samba3 as well. The default for Samba4 is PREFIX/var/run/winbind_pipe. I have also re-added the paranoia checks from Samba3 for correct permissions on the socket directory. Andrew Bartlett (This used to be commit 8866aa06ffc3896094c878e9c07b40c03826d9a7)
Diffstat (limited to 'source4/lib/util.c')
-rw-r--r--source4/lib/util.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/source4/lib/util.c b/source4/lib/util.c
index ed384572fe..7d3f21c1e8 100644
--- a/source4/lib/util.c
+++ b/source4/lib/util.c
@@ -88,6 +88,49 @@ BOOL directory_exist(const char *dname)
return ret;
}
+BOOL directory_create_or_exist(const char *dname, uid_t uid,
+ mode_t dir_perms)
+{
+ mode_t old_umask;
+ struct stat st;
+
+ old_umask = umask(0);
+ if (lstat(dname, &st) == -1) {
+ if (errno == ENOENT) {
+ /* Create directory */
+ if (mkdir(dname, dir_perms) == -1) {
+ DEBUG(0, ("error creating directory "
+ "%s: %s\n", dname,
+ strerror(errno)));
+ umask(old_umask);
+ return False;
+ }
+ } else {
+ DEBUG(0, ("lstat failed on directory %s: %s\n",
+ dname, strerror(errno)));
+ umask(old_umask);
+ return False;
+ }
+ } else {
+ /* Check ownership and permission on existing directory */
+ if (!S_ISDIR(st.st_mode)) {
+ DEBUG(0, ("directory %s isn't a directory\n",
+ dname));
+ umask(old_umask);
+ return False;
+ }
+ if ((st.st_uid != uid) ||
+ ((st.st_mode & 0777) != dir_perms)) {
+ DEBUG(0, ("invalid permissions on directory "
+ "%s\n", dname));
+ umask(old_umask);
+ return False;
+ }
+ }
+ return True;
+}
+
+
/*******************************************************************
Returns the size in bytes of the named file.
********************************************************************/