ldap/servers/plugins/pwdstorage/crypt_pwd.c | 2 -
ldap/servers/slapd/back-ldbm/ldbm_entryrdn.c | 7 +++++-
ldap/servers/slapd/daemon.c | 30 ++++++++++++++++++++-------
ldap/servers/slapd/getsocketpeer.c | 7 ++++++
ldap/servers/slapd/ldaputil.c | 26 +++++++++++++++++++++++
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 +++
10 files changed, 83 insertions(+), 13 deletions(-)
New commits:
commit 4ce95a75b83db054aff205aeae22794bc309a426
Author: William Brown <wibrown(a)redhat.com>
Date: Thu May 12 16:50:46 2016 +1000
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: nhosoi, lslebodn (thanks!)
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 <string.h>
#include <sys/types.h>
#include <sys/socket.h>
-#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..e6e0af3 100644
--- a/ldap/servers/slapd/back-ldbm/ldbm_entryrdn.c
+++ b/ldap/servers/slapd/back-ldbm/ldbm_entryrdn.c
@@ -1601,7 +1601,12 @@ _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;
+ /*
+ * ENODATA exists on linux, but not other platforms. Change to -1, as
+ * all callers to this function only ever check != 0.
+ */
+ slapi_log_err(SLAPI_LOG_ERR, "_entryrdn_open_index", "EntryRDN str
for attrinfo is null, unable to proceed.\n");
+ rc = -1;
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 <stdio.h>
+#if defined(LINUX) || defined(__FreeBSD__)
#ifdef LINUX
#undef CTIME
#include <sys/statfs.h>
-#else
+#endif /* linux*/
+#include <sys/param.h>
+#include <sys/mount.h>
+#else /* Linux or fbsd */
#include <sys/statvfs.h>
#include <sys/mnttab.h>
#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/ldaputil.c b/ldap/servers/slapd/ldaputil.c
index e5b7c56..ca16588 100644
--- a/ldap/servers/slapd/ldaputil.c
+++ b/ldap/servers/slapd/ldaputil.c
@@ -66,6 +66,15 @@
#include <ldap_ssl.h>
#include <ldappr.h>
#else
+
+#ifdef HAVE_HEIMDAL_KERBEROS
+#include <com_err.h>
+#endif
+
+#ifndef MAX_KEYTAB_NAME_LEN
+#define MAX_KEYTAB_NAME_LEN 1100
+#endif
+
/* need mutex around ldap_initialize - see
https://fedorahosted.org/389/ticket/348 */
static PRCallOnceType ol_init_callOnce = {0,0,0};
static PRLock *ol_init_lock = NULL;
@@ -1667,7 +1676,11 @@ show_one_credential(int authtracelevel,
char *logname = "show_one_credential";
krb5_error_code rc;
char *name = NULL, *sname = NULL;
+#ifdef HAVE_HEIMDAL_KERBEROS
+ krb5_timestamp startts, endts, renewts;
+#else
char startts[BUFSIZ], endts[BUFSIZ], renewts[BUFSIZ];
+#endif
if ((rc = krb5_unparse_name(ctx, cred->client, &name))) {
slapi_log_err(SLAPI_LOG_ERR, logname,
@@ -1684,6 +1697,13 @@ show_one_credential(int authtracelevel,
if (!cred->times.starttime) {
cred->times.starttime = cred->times.authtime;
}
+#ifdef HAVE_HEIMDAL_KERBEROS
+ slapi_log_error(authtracelevel, logname,
+ "\tKerberos credential: client [%s] server [%s] "
+ "start time [%s] end time [%s] renew time [%s] "
+ "flags [0x%x]\n", name, sname, ctime(&startts),
ctime(&endts),
+ ctime(&renewts), (uint32_t)cred->flags.i);
+#else
krb5_timestamp_to_sfstring((krb5_timestamp)cred->times.starttime,
startts, sizeof(startts), NULL);
krb5_timestamp_to_sfstring((krb5_timestamp)cred->times.endtime,
@@ -1696,6 +1716,7 @@ show_one_credential(int authtracelevel,
"start time [%s] end time [%s] renew time [%s] "
"flags [0x%x]\n", name, sname, startts, endts,
renewts, (uint32_t)cred->ticket_flags);
+#endif
cleanup:
krb5_free_unparsed_name(ctx, name);
@@ -1796,8 +1817,13 @@ credentials_are_valid(
order to set mcreds.server required in order
to use krb5_cc_retrieve_creds() */
/* get default realm first */
+#ifdef HAVE_HEIMDAL_KERBEROS
+ realm_str = krb5_principal_get_realm(ctx, princ);
+ realm_len = krb5_realm_length(realm_str);
+#else
realm_len = krb5_princ_realm(ctx, princ)->length;
realm_str = krb5_princ_realm(ctx, princ)->data;
+#endif
tgs_princ_name = slapi_ch_smprintf("%s/%*s@%*s", KRB5_TGS_NAME,
realm_len, realm_str,
realm_len, realm_str);
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 <resolv.h>
#include <errno.h>
#include "slap.h"
-#if defined(USE_SYSCONF) || defined(LINUX)
+#if defined(USE_SYSCONF) || defined(LINUX) || defined( __FreeBSD__ )
#include <unistd.h>
#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 <config.h>
#endif
-#include <malloc.h>
+/* 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 <stdlib.h>
#include <ldap.h>
#undef OFF
#undef LITTLE_ENDIAN
@@ -31,7 +33,7 @@
#include <arpa/inet.h>
#include <netdb.h>
#include <pwd.h> /* 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 <malloc.h>
+#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 <sys/errno.h>
#include <sys/param.h>
#include <sys/types.h>
-#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 <unistd.h>
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 <string.h>
#include <sys/types.h>
#include <sys/time.h>
+
+/* What platforms actually need this? */
+#ifdef HAVE_SYS_SYSINFO_H
#include <sys/sysinfo.h>
+#endif
+
#include <sys/utsname.h>
#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 <pk11func.h>
#include <sys/types.h>
#include <sys/time.h>
+
+#ifdef HAVE_SYS_SYSINFO_H
#include <sys/sysinfo.h>
+#endif
+
#include <sys/utsname.h>
#include <unistd.h> /* gethostname() */
#include "slap.h"