samba-technical@lists.samba.org
[Top] [All Lists]

Libsmbclient - listing workgroups timeout

Subject: Libsmbclient - listing workgroups timeout
From: Henrik Zagerholm
Date: Tue, 7 Nov 2006 17:32:44 +0100
Hello list,

We are having trouble with listing workgroups and setting a timeout at the same time. It feels that the open call on "smb://" does not honor the timeout setting. The only thing that affect the time spent searching for workgrousp/ domains seems to be to set the options.browse_max_lmb_count.

Is there someway to have a high lmb_count but still be able to set a shorter timeout?

Below is a code snipppet from what we are trying to do.

Any input would be appreciated!

Cheers,
henrik

// Initiating context
    SMBCCTX *m_pSambaContext = NULL;

    m_pSambaContext = smbc_new_context();
    if( !(m_pSambaContext) )
       throw "Could not allocate new smbc context";

    m_pSambaContext->debug = 0;
    m_pSambaContext->callbacks.auth_fn = authenticate;

/* Initialize the context using the previously specified options */
     if( !smbc_init_context(m_pSambaContext) )
     {
       smbc_free_context( m_pSambaContext, 1 );
       throw "Could not initialize smbc context";
     }

     static char *pszEmptyString = "";
     if( !m_pSambaContext )
       return pszEmptyString;

   m_pSambaContext->options.browse_max_lmb_count = 3;
   m_pSambaContext->timeout = 100;

   std::string strOpen("smb://");

   std::string strWorkgroups;

   // fd < 0 if error on opendir
SMBCFILE *dir = m_pSambaContext->opendir( m_pSambaContext, strOpen.c_str() ); // <------------ This takes a lot longer time than the set timeout
   smbc_dirent *pDirEnt = 0;
   if( dir >= 0 )
   {
while( pDirEnt = m_pSambaContext->readdir(m_pSambaContext, dir) )
       {
           if( strWorkgroups.empty() )
           {
               strWorkgroups = pDirEnt->name;
               continue;
           }

           strWorkgroups += std::string(",") + pDirEnt->name;
       }

       m_pSambaContext->closedir( m_pSambaContext, dir );
   }

   if( m_pszBuffer ) delete[] m_pszBuffer;

   m_pszBuffer = new char[strWorkgroups.length() + 1];
   strcpy(m_pszBuffer, strWorkgroups.c_str());

   // comma separated string
   return m_pszBuffer;


<Prev in Thread] Current Thread [Next in Thread>