svn commit: samba r9629 - in branches/SOC/SAMBA_3_0/source/client: .

derrell at derrell at
Fri Aug 26 13:28:04 GMT 2005

kalim at writes:

> +                    /* test if the directory exists by opening it */
> +                    if (!((dh=smbc_opendir(rname)) < 0)) {
> +                        smbc_closedir(dh);
> +                        continue;
> +                    }

> +                    /* directory does not exist, try making it */
> +                    if (!(smbc_mkdir(rname, 755) < 0))
> +                        continue;

Be careful of this.  I haven't had a chance to check out all of your code to
see what you're doing, but if you're really just trying to see if the
directory exists, smbc_opendir() is a *really* slow way of doing it.  The
current implementation of smbc_opendir() retrieves the entire list of files in
the directory being opened!  It caches that information and returns entries as
they are requested by smbc_readdir() or smbc_getdents().

It would be better not first to check whether the directory exists.  You're
creating a race condition by doing so (i.e. what if the directory is created
by someone else immediately after you checked to see if it exists?).  Instead,
just issue your smbc_mkdir() call and check the return code.  Although there
are some not-so-meaningful errno values that occasionally get returned by
libsmbclient, I think you'll get back EEXISTS if the directory already
existed.  If it already existed, you could _then_ issue your smbc_opendir()
call if you need to enumerate the contents.


More information about the samba-cvs mailing list