position of ldappr.h

"Xu, Qiang (FXSGSC)" <[email protected]> Thu, 8 Apr 2010 16:23:10 +0800
Newsgroups gmane.comp.mozilla.devel.directory
Message-ID <D8C9BC7FFCF8154FB7141EB8DB609C172F10B08211@SGPAPHQ-EXSCC01.dc01.fujixerox.net>
Hi, list: 

Just come across a strange problem when using prldap_init() in MozLDAP. The problem is, ldap.h and ldappr.h must be included right after system includes, like stdio.h, otherwise, it won't compile.

A typical scenario is: 
===========================================================
/* Makefile */
...
INCDIRS +=  $(CM_WORKAREA)/thirdpty/ldap/1.3b/ldap/include \
                    $(CM_WORKAREA)/thirdpty/ldap/1.3b/ldap/include/nspr
...


/* aba_ldap_interface.c, wrong version */
#include <stdio.h>
#include <ctype.h>   
#include <string.h>
#include <sys/utsname.h>
#include <sys/time.h>
#include <pthread.h>

#include "cfgAttr.h"

#include "ldap.h"
#include "ldappr.h" //xq
...


/* compile result */
In file included from /home/qxu/4.0_SP2/uk_dbl/thirdpty/ldap/1.3b/ldap/include/nspr/nspr.h:49,
                 from /home/qxu/4.0_SP2/uk_dbl/thirdpty/ldap/1.3b/ldap/include/ldappr.h:26,
                 from aba_ldap_interface.c:131:
/home/qxu/4.0_SP2/uk_dbl/thirdpty/ldap/1.3b/ldap/include/nspr/prio.h:206: warning: no semicolon at end of struct or union
/home/qxu/4.0_SP2/uk_dbl/thirdpty/ldap/1.3b/ldap/include/nspr/prio.h:206: parse error before "static"
/home/qxu/4.0_SP2/uk_dbl/thirdpty/ldap/1.3b/ldap/include/nspr/prio.h:249: field `mcaddr' has incomplete type
/home/qxu/4.0_SP2/uk_dbl/thirdpty/ldap/1.3b/ldap/include/nspr/prio.h:250: field `ifaddr' has incomplete type
/home/qxu/4.0_SP2/uk_dbl/thirdpty/ldap/1.3b/ldap/include/nspr/prio.h:251: confused by earlier errors, bailing out


/* aba_ldap_interface.c, correct version */
#include <stdio.h>
#include <ctype.h>   
#include <string.h>
#include <sys/utsname.h>
#include <sys/time.h>
#include <pthread.h>

#include "ldap.h"
#include "ldappr.h" //xq

#include "cfgAttr.h"
...
===========================================================
cfgAttr.h is our own header, while ldap.h and ldappr.h are headers of MozLDAP. It seems any header of our own will make the compiling unsuccessful.

prldap_init() is declared in ldappr.h, which in turn includes nspr.h and prio.h.
===========================================================
/* ldappr.h */
#ifndef LDAP_PR_H
#define LDAP_PR_H

#include "nspr.h"

/*
 * ldappr.h - prototypes for functions that tie libldap into NSPR (Netscape
 *      Portable Runtime).
 */

#ifdef __cplusplus
extern "C" {
#endif
/*
 * Function: prldap_init().
 *
 * Create a new LDAP session handle, but with NSPR I/O, threading, and DNS
 * functions installed.
 *
 * Pass a non-zero value for the 'shared' parameter if you plan to use
 * this LDAP * handle from more than one thread.
 *
 * Returns an LDAP session handle (or NULL if an error occurs).
 */
LDAP * LDAP_CALL prldap_init( const char *defhost, int defport, int shared );
...


/* nspr.h */
#ifndef nspr_h___
#define nspr_h___

...
#include "prio.h"
...


/* prio.h */
#ifndef prio_h___
#define prio_h___

#include "prlong.h"
#include "prtime.h"
#include "prinrval.h"
#include "prinet.h"
...
union PRNetAddr {
    struct {
        PRUint16 family;                /* address family (0x00ff maskable) */
#ifdef XP_BEOS
        char data[10];                  /* Be has a smaller structure */
#else
        char data[14];                  /* raw address data */
#endif
    } raw;
    struct {
        PRUint16 family;                /* address family (AF_INET) */
        PRUint16 port;                  /* port number */
        PRUint32 ip;                    /* The actual 32 bits of address */
#ifdef XP_BEOS
        char pad[4];                    /* Be has a smaller structure */
#else
        char pad[8];
#endif
    } inet;
    struct {
        PRUint16 family;                /* address family (AF_INET6) */
        PRUint16 port;                  /* port number */
        PRUint32 flowinfo;              /* routing information */
        PRIPv6Addr ip;                  /* the actual 128 bits of address */
        PRUint32 scope_id;              /* set of interfaces for a scope */
    } ipv6;
#if defined(XP_UNIX) || defined(XP_OS2)
    struct {                            /* Unix domain socket address */
        PRUint16 family;                /* address family (AF_UNIX) */
#ifdef XP_OS2
        char path[108];                 /* null-terminated pathname */
                                        /* bind fails if size is not 108. */
#else
        char path[104];                 /* null-terminated pathname */
#endif
    } local; //Line 206
#endif
};
...
typedef struct PRMcastRequest {
	PRNetAddr mcaddr;			/* IP multicast address of group */ //Line 249
	PRNetAddr ifaddr;			/* local IP address of interface */ //Line 250
} PRMcastRequest;
===========================================================
The compiling errors suggested it can't recognize the data structure PRNetAddr in Line 206 of prio.h. However, I can't see there is anything wrong with these headers. Just unable to understand why ldappr.h must be included immediately after system header. Any help?

Thanks,
Xu Qiang