From 6e869f4fbb28932ff8137666d2bd1b766040ca96 Mon Sep 17 00:00:00 2001 From: William Brown Date: Tue, 3 Jan 2017 13:15:34 +1000 Subject: [PATCH] Ticket 48797 - Add freebsd support to ns-slapd: main Fix Description: This patch adds the final component of support to allow operation on freebsd. This includes the disk monitoring code, heimdal kerberos changes and correction of an ldbm error code. https://fedorahosted.org/389/ticket/48797 Author: wibrown Review by: ??? --- ldap/servers/plugins/pwdstorage/crypt_pwd.c | 2 +- ldap/servers/slapd/back-ldbm/ldbm_entryrdn.c | 2 +- ldap/servers/slapd/daemon.c | 30 +++++++++++++++++++++------- ldap/servers/slapd/getsocketpeer.c | 7 +++++++ ldap/servers/slapd/localhost.c | 2 +- ldap/servers/slapd/main.c | 11 ++++++++-- ldap/servers/slapd/tools/pwenc.c | 2 +- ldap/servers/slapd/uniqueidgen.c | 5 +++++ ldap/servers/slapd/uuid.c | 4 ++++ 9 files changed, 52 insertions(+), 13 deletions(-) diff --git a/ldap/servers/plugins/pwdstorage/crypt_pwd.c b/ldap/servers/plugins/pwdstorage/crypt_pwd.c index 0fd3b85..dfd5af9 100644 --- a/ldap/servers/plugins/pwdstorage/crypt_pwd.c +++ b/ldap/servers/plugins/pwdstorage/crypt_pwd.c @@ -20,7 +20,7 @@ #include #include #include -#if defined( hpux ) || defined (LINUX) +#if defined( hpux ) || defined (LINUX) || defined (__FreeBSD__) #ifndef __USE_XOPEN #define __USE_XOPEN /* linux */ #endif /* __USE_XOPEN */ diff --git a/ldap/servers/slapd/back-ldbm/ldbm_entryrdn.c b/ldap/servers/slapd/back-ldbm/ldbm_entryrdn.c index ad33efa..5d7eb0b 100644 --- a/ldap/servers/slapd/back-ldbm/ldbm_entryrdn.c +++ b/ldap/servers/slapd/back-ldbm/ldbm_entryrdn.c @@ -1601,7 +1601,7 @@ _entryrdn_open_index(backend *be, struct attrinfo **ai, DB **dbp) /* Open the entryrdn index */ ainfo_get(be, LDBM_ENTRYRDN_STR, ai); if (NULL == *ai) { - rc = ENODATA; + rc = -2; goto bail; } inst = (ldbm_instance *)be->be_instance_info; diff --git a/ldap/servers/slapd/daemon.c b/ldap/servers/slapd/daemon.c index 4e1dc5e..a37c8c6 100644 --- a/ldap/servers/slapd/daemon.c +++ b/ldap/servers/slapd/daemon.c @@ -39,10 +39,14 @@ #endif /* NEED_FILIO */ /* for some reason, linux tty stuff defines CTIME */ #include +#if defined(LINUX) || defined(__FreeBSD__) #ifdef LINUX #undef CTIME #include -#else +#endif /* linux*/ +#include +#include +#else /* Linux or fbsd */ #include #include #endif @@ -346,7 +350,7 @@ disk_mon_get_mount_point(char *dir) return NULL; } -#else /* Linux */ +#elif LINUX /* Linux */ char * disk_mon_get_mount_point(char *dir) { @@ -376,6 +380,17 @@ disk_mon_get_mount_point(char *dir) return NULL; } +#elif __FreeBSD__ +char * +disk_mon_get_mount_point(char *dir) +{ + struct statfs sb; + if (statfs(dir, &sb) != 0) { + return NULL; + } + + return slapi_ch_strdup(sb.f_mntonname); +} #endif /* @@ -387,8 +402,9 @@ disk_mon_add_dir(char ***list, char *directory) { char *dir = disk_mon_get_mount_point(directory); - if(dir == NULL) + if(dir == NULL) { return; + } if(!charray_inlist(*list,dir)){ slapi_ch_array_add(list, dir); @@ -444,7 +460,7 @@ disk_mon_get_dirs(char ***list, int logs_critical){ char * disk_mon_check_diskspace(char **dirs, PRUint64 threshold, PRUint64 *disk_space) { -#ifdef LINUX +#if defined(LINUX) || defined(__FreeBSD__) struct statfs buf; #else struct statvfs buf; @@ -457,10 +473,10 @@ disk_mon_check_diskspace(char **dirs, PRUint64 threshold, PRUint64 *disk_space) int i = 0; for(i = 0; dirs && dirs[i]; i++){ -#ifndef LINUX - if (statvfs(dirs[i], &buf) != -1) -#else +#if defined(LINUX) || defined(__FreeBSD__) if (statfs(dirs[i], &buf) != -1) +#else + if (statvfs(dirs[i], &buf) != -1) #endif { LL_UI2L(freeBytes, buf.f_bavail); diff --git a/ldap/servers/slapd/getsocketpeer.c b/ldap/servers/slapd/getsocketpeer.c index 2a738a1..ce43b40 100644 --- a/ldap/servers/slapd/getsocketpeer.c +++ b/ldap/servers/slapd/getsocketpeer.c @@ -94,10 +94,13 @@ int slapd_get_socket_peer(PRFileDesc *nspr_fd, uid_t *uid, gid_t *gid) iov.iov_len = sizeof(dummy); msg.msg_iov = &iov; msg.msg_iovlen = 1; +#ifndef __FreeBSD__ msg.msg_accrights = (caddr_t)&pass_sd; msg.msg_accrightslen = sizeof(pass_sd); /* Initialize it with 8 bytes. If recvmsg is successful, 4 is supposed to be returned. */ + +#endif /* Since PR_SockOpt_Nonblocking is set to the socket, recvmsg returns immediately if no data is waiting to be received. @@ -107,7 +110,11 @@ int slapd_get_socket_peer(PRFileDesc *nspr_fd, uid_t *uid, gid_t *gid) while ((rc = recvmsg(fd, &msg, MSG_PEEK)) < 0 && (EAGAIN == (myerrno = errno)) && retrycnt-- >= 0) ; +#ifdef __FreeBSD__ + if (rc >= 0) +#else if (rc >= 0 && msg.msg_accrightslen == sizeof(int)) +#endif { struct stat st; diff --git a/ldap/servers/slapd/localhost.c b/ldap/servers/slapd/localhost.c index f48fa49..e702c70 100644 --- a/ldap/servers/slapd/localhost.c +++ b/ldap/servers/slapd/localhost.c @@ -24,7 +24,7 @@ #include #include #include "slap.h" -#if defined(USE_SYSCONF) || defined(LINUX) +#if defined(USE_SYSCONF) || defined(LINUX) || defined( __FreeBSD__ ) #include #endif /* USE_SYSCONF */ diff --git a/ldap/servers/slapd/main.c b/ldap/servers/slapd/main.c index a59b7d5..2f12b2f 100644 --- a/ldap/servers/slapd/main.c +++ b/ldap/servers/slapd/main.c @@ -11,7 +11,9 @@ # include #endif -#include +/* This was malloc.h - but it's moved to stdlib.h on most platforms, and FBSD is strict */ +/* Make it stdlib.h, and revert to malloc.h with ifdefs if we have issues here. WB 2016 */ +#include #include #undef OFF #undef LITTLE_ENDIAN @@ -31,7 +33,7 @@ #include #include #include /* getpwnam */ -#if !defined(LINUX) +#if !defined(LINUX) && !defined(__FreeBSD__) union semun { int val; struct semid_ds *buf; @@ -60,6 +62,11 @@ union semun { #include "smrtheap.h" #endif +#ifdef LINUX +/* For mallopt. Should be removed soon. */ +#include +#endif + /* Forward Declarations */ static void register_objects(void); static void process_command_line(int argc, char **argv, char *myname, char **extraname); diff --git a/ldap/servers/slapd/tools/pwenc.c b/ldap/servers/slapd/tools/pwenc.c index caea653..58a38cc 100644 --- a/ldap/servers/slapd/tools/pwenc.c +++ b/ldap/servers/slapd/tools/pwenc.c @@ -16,7 +16,7 @@ #include #include #include -#if defined(LINUX) /* I bet other Unix would like +#if defined(LINUX) || defined(__FreeBSD__) /* I bet other Unix would like * this flag. But don't want to * break other builds so far */ #include diff --git a/ldap/servers/slapd/uniqueidgen.c b/ldap/servers/slapd/uniqueidgen.c index 6ac0799..372ab69 100644 --- a/ldap/servers/slapd/uniqueidgen.c +++ b/ldap/servers/slapd/uniqueidgen.c @@ -16,7 +16,12 @@ #include #include #include + +/* What platforms actually need this? */ +#ifdef HAVE_SYS_SYSINFO_H #include +#endif + #include #include "nspr.h" #include "slap.h" diff --git a/ldap/servers/slapd/uuid.c b/ldap/servers/slapd/uuid.c index 9b1b561..96b4c26 100644 --- a/ldap/servers/slapd/uuid.c +++ b/ldap/servers/slapd/uuid.c @@ -40,7 +40,11 @@ #include #include #include + +#ifdef HAVE_SYS_SYSINFO_H #include +#endif + #include #include /* gethostname() */ #include "slap.h" -- 1.8.3.1