int            debug = 0;
 char           *infile = NULL;
 int            dont = 0;
+int            nocanon = 0;
 int            referrals = 0;
 int            verbose = 0;
 int            ldif = 0;
 N_("  -I         use SASL Interactive mode\n"),
 N_("  -M         enable Manage DSA IT control (-MM to make critical)\n"),
 N_("  -n         show what would be done but don't actually do it\n"),
+N_("  -N         do not use reverse DNS to canonicalize SASL host name\n"),
 N_("  -O props   SASL security properties\n"),
 N_("  -o <opt>[=<optparam] general options\n"),
 N_("             nettimeout=<timeout> (in seconds, or \"none\" or \"max\")\n"),
                case 'n':       /* print operations, don't actually do them */
                        dont++;
                        break;
+               case 'N':
+                       nocanon++;
+                       break;
                case 'o':
                        control = ber_strdup( optarg );
                        if ( (cvalue = strchr( control, '=' )) != NULL ) {
                        exit( EXIT_FAILURE );
                }
 
+               /* canon */
+               if( ldap_set_option( ld, LDAP_OPT_X_SASL_NOCANON,
+                       nocanon ? LDAP_OPT_ON : LDAP_OPT_OFF ) != LDAP_OPT_SUCCESS )
+               {
+                       fprintf( stderr, "Could not set LDAP_OPT_X_SASL_NOCANON %s\n",
+                               nocanon ? "on" : "off" );
+                       exit( EXIT_FAILURE );
+               }
                if( ldap_set_option( ld, LDAP_OPT_PROTOCOL_VERSION, &protocol )
                        != LDAP_OPT_SUCCESS )
                {
 
 
 
 const char options[] = "z"
-       "Cd:D:e:h:H:IMnO:o:p:P:QR:U:vVw:WxX:y:Y:Z";
+       "Cd:D:e:h:H:IMnNO:o:p:P:QR:U:vVw:WxX:y:Y:Z";
 
 #ifdef LDAP_CONTROL_DONTUSECOPY
 int dontUseCopy = 0;
 
 
 
 const char options[] = "r"
-       "cd:D:e:f:h:H:IMnO:o:p:P:QR:U:vVw:WxX:y:Y:z:Z";
+       "cd:D:e:f:h:H:IMnNO:o:p:P:QR:U:vVw:WxX:y:Y:z:Z";
 
 int
 handle_private_option( int i )
 
 
 
 const char options[] = ""
-       "d:D:e:h:H:InO:o:p:QR:U:vVw:WxX:y:Y:Z";
+       "d:D:e:h:H:InNO:o:p:QR:U:vVw:WxX:y:Y:Z";
 
 int
 handle_private_option( int i )
 
 
 
 const char options[] = "aE:rS:"
-       "cd:D:e:f:h:H:IMnO:o:p:P:QR:U:vVw:WxX:y:Y:Z";
+       "cd:D:e:f:h:H:IMnNO:o:p:P:QR:U:vVw:WxX:y:Y:Z";
 
 int
 handle_private_option( int i )
 
 
 
 const char options[] = "rs:"
-       "cd:D:e:f:h:H:IMnO:o:p:P:QR:U:vVw:WxX:y:Y:Z";
+       "cd:D:e:f:h:H:IMnNO:o:p:P:QR:U:vVw:WxX:y:Y:Z";
 
 int
 handle_private_option( int i )
 
 
 
 const char options[] = "a:As:St:T:"
-       "d:D:e:h:H:InO:o:p:QR:U:vVw:WxX:y:Y:Z";
+       "d:D:e:h:H:InNO:o:p:QR:U:vVw:WxX:y:Y:Z";
 
 int
 handle_private_option( int i )
 
 
 
 const char options[] = "a:Ab:cE:F:l:Ls:S:tT:uz:"
-       "Cd:D:e:f:h:H:IMnO:o:p:P:QR:U:vVw:WxX:y:Y:Z";
+       "Cd:D:e:f:h:H:IMnNO:o:p:P:QR:U:vVw:WxX:y:Y:Z";
 
 int
 handle_private_option( int i )
 
 
 
 const char options[] = ""
-       "d:D:e:h:H:InO:o:p:QR:U:vVw:WxX:y:Y:Z";
+       "d:D:e:h:H:InNO:o:p:QR:U:vVw:WxX:y:Y:Z";
 
 int
 handle_private_option( int i )
 
 #define LDAP_OPT_X_SASL_SSF_MAX                        0x6108
 #define LDAP_OPT_X_SASL_MAXBUFSIZE             0x6109
 #define LDAP_OPT_X_SASL_MECHLIST               0x610a /* read-only */
+#define LDAP_OPT_X_SASL_NOCANON                        0x610b
 
 /* OpenLDAP GSSAPI options */
 #define LDAP_OPT_X_GSSAPI_DO_NOT_FREE_CONTEXT      0x6200
 
        }
 
        {
-               char *saslhost = ldap_host_connected_to( ld->ld_defconn->lconn_sb,
+               char *saslhost;
+               int nocanon = (int)LDAP_BOOL_GET( &ld->ld_options,
+                       LDAP_BOOL_SASL_NOCANON );
+
+               /* If we don't need to canonicalize just use the host
+                * from the LDAP URI.
+                */
+               if ( nocanon )
+                       saslhost = ld->ld_defconn->lconn_server->lud_host;
+               else 
+                       saslhost = ldap_host_connected_to( ld->ld_defconn->lconn_sb,
                        "localhost" );
                rc = ldap_int_sasl_open( ld, ld->ld_defconn, saslhost );
-               LDAP_FREE( saslhost );
+               if ( !nocanon )
+                       LDAP_FREE( saslhost );
        }
 
        if ( rc != LDAP_SUCCESS ) return rc;
                case LDAP_OPT_X_SASL_MAXBUFSIZE:
                        *(ber_len_t *)arg = ld->ld_options.ldo_sasl_secprops.maxbufsize;
                        break;
+               case LDAP_OPT_X_SASL_NOCANON:
+                       *(int *)arg = (int) LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_SASL_NOCANON );
+                       break;
 
                case LDAP_OPT_X_SASL_SECPROPS:
                        /* this option is write only */
        case LDAP_OPT_X_SASL_MAXBUFSIZE:
                ld->ld_options.ldo_sasl_secprops.maxbufsize = *(ber_len_t *)arg;
                break;
+       case LDAP_OPT_X_SASL_NOCANON:
+               if ( arg == LDAP_OPT_OFF ) {
+                       LDAP_BOOL_CLR(&ld->ld_options, LDAP_BOOL_SASL_NOCANON );
+               } else {
+                       LDAP_BOOL_SET(&ld->ld_options, LDAP_BOOL_SASL_NOCANON );
+               }
+               break;
 
        case LDAP_OPT_X_SASL_SECPROPS: {
                int sc;
 
        {1, ATTR_STRING,        "SASL_AUTHZID",         NULL,
                offsetof(struct ldapoptions, ldo_def_sasl_authzid)},
        {0, ATTR_SASL,          "SASL_SECPROPS",        NULL,   LDAP_OPT_X_SASL_SECPROPS},
+       {0, ATTR_BOOL,          "SASL_NOCANON", NULL,   LDAP_BOOL_SASL_NOCANON},
 #endif
 
 #ifdef HAVE_GSSAPI
 
 #define LDAP_BOOL_RESTART              1
 #define LDAP_BOOL_TLS                  3
 #define        LDAP_BOOL_CONNECT_ASYNC         4
+#define        LDAP_BOOL_SASL_NOCANON          5
 
 #define LDAP_BOOLEANS  unsigned long
 #define LDAP_BOOL(n)   ((LDAP_BOOLEANS)1 << (n))