#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <libsmbclient.h>

typedef SMBCFILE * (*smbc_opendir_fn)(SMBCCTX *c,
                                      const char *fname);
#define smbc_setDebug(ctx, d)	\
			ctx->debug = d
#define smbc_setFunctionAuthDataWithContext(ctx, func)  { \
                        ctx->callbacks.auth_fn = NULL; \
                        smbc_option_set (ctx, "auth_function", \
                                        (void *) func); \
                        }

#define smbc_getFunctionOpendir(ctx)	ctx->opendir

#if defined(HAVE_SAMBA_FLAGS) && defined(SMB_CTX_FLAG_USE_KERBEROS) && defined(SMB_CTX_FLAG_FALLBACK_AFTER_KERBEROS)
	#define smbc_setOptionUseKerberos(ctx, val)		\
					ctx->flags |= SMB_CTX_FLAG_USE_KERBEROS
#else 					
	#define smbc_setOptionUseKerberos(ctx, val)		{  }	
#endif	

#if defined(HAVE_SAMBA_FLAGS) && defined(SMB_CTX_FLAG_USE_KERBEROS) && defined(SMB_CTX_FLAG_FALLBACK_AFTER_KERBEROS)
	#define smbc_setOptionFallbackAfterKerberos(ctx, val)	\
			ctx->flags |= SMB_CTX_FLAG_FALLBACK_AFTER_KERBEROS
#else 					
	#define smbc_setOptionFallbackAfterKerberos(ctx, val)	{  }	
#endif	

#if defined(HAVE_SAMBA_FLAGS) && defined(SMBCCTX_FLAG_NO_AUTO_ANONYMOUS_LOGON)
	#define smbc_setOptionNoAutoAnonymousLogin(ctx, val)    \
                        ctx->flags |= SMBCCTX_FLAG_NO_AUTO_ANONYMOUS_LOGON
#else                                   
	#define smbc_setOptionNoAutoAnonymousLogin(ctx, val)    {  }    
#endif  

#define smbc_setWorkgroup(ctx, data)	\
			ctx->workgroup = strdup (data)

static void
auth_callback (SMBCCTX *context,
               const char *server_name, const char *share_name,
               char *domain_out, int domainmaxlen,
               char *username_out, int unmaxlen,
               char *password_out, int pwmaxlen)
{
  char *ask_password, *ask_user, *ask_domain;
  strncpy (password_out, "", pwmaxlen);
  strncpy (username_out, "", unmaxlen);
}

int main (int argc, char **argv) {

SMBCCTX *smb_context;
SMBCFILE *dir;
smbc_opendir_fn smbc_opendir;

smb_context = smbc_new_context ();
smbc_setDebug (smb_context, 4);
smbc_setFunctionAuthDataWithContext (smb_context, auth_callback);
smbc_setWorkgroup (smb_context, "WORKGROUP");
smb_context->flags = 0;
smbc_setOptionUseKerberos (smb_context, 1);
smbc_setOptionFallbackAfterKerberos (smb_context, 1);
smbc_setOptionNoAutoAnonymousLogin (smb_context, 1);
if (!smbc_init_context (smb_context)) {
	printf("initialization failed: %s.\n",strerror(errno));
	exit(1);
}
smbc_opendir = smbc_getFunctionOpendir (smb_context);
dir = smbc_opendir (smb_context, (const char*)"smb://");
printf ("%s\n", strerror (errno));
printf ("dir: %p\n",dir);
return 0;
}
