]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/slapadd.c
ITS#8127 fix ftello for Win32
[openldap] / servers / slapd / slapadd.c
index 8b339928e8200bc917b2df6cd5c8103831f6b4b1..d89d2eff2aeb8543d47f25f0d21c50bf08afce59 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2013 The OpenLDAP Foundation.
+ * Copyright 1998-2015 The OpenLDAP Foundation.
  * Portions Copyright 1998-2003 Kurt D. Zeilenga.
  * Portions Copyright 2003 IBM Corporation.
  * All rights reserved.
 
 #include "slapcommon.h"
 
+#ifdef _WIN32
+# ifdef __WIN64__
+# define ftello(fp)    _ftelli64(fp)
+# else
+/* Ideally we would use _ftelli64 but that was only available
+ * starting in MSVCR80.DLL. The approach used here is inaccurate
+ * because returning the underlying file handle's file pointer
+ * doesn't take the stdio buffer offset into account. But, it
+ * works with all versions of MSVCRT.
+ */
+# define ftello(fp)    _telli64(fileno(fp))
+# endif
+#endif
+
+extern int slap_DN_strict;     /* dn.c */
+
 static char csnbuf[ LDAP_PVT_CSNSTR_BUFSIZE ];
 
 typedef struct Erec {
@@ -96,15 +112,23 @@ again:
        {
                BackendDB *bd;
                Entry *e;
+               int prev_DN_strict;
 
                if ( erec->lineno < jumpline )
                        goto again;
 
+               if ( !dbnum ) {
+                       prev_DN_strict = slap_DN_strict;
+                       slap_DN_strict = 0;
+               }
                e = str2entry2( buf, checkvals );
+               if ( !dbnum ) {
+                       slap_DN_strict = prev_DN_strict;
+               }
 
                if ( enable_meter )
                        lutil_meter_update( &meter,
-                                        ftell( ldiffp->fp ),
+                                        ftello( ldiffp->fp ),
                                         0);
 
                if( e == NULL ) {
@@ -473,7 +497,7 @@ slapadd( int argc, char **argv )
        bvtext.bv_val[0] = '\0';
 
        if ( enable_meter ) {
-               lutil_meter_update( &meter, ftell( ldiffp->fp ), 1);
+               lutil_meter_update( &meter, ftello( ldiffp->fp ), 1);
                lutil_meter_close( &meter );
        }