~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/_readdir_pyx.pyx

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2008-11-20 04:57:30 UTC
  • mfrom: (3841.1.3 trivial)
  • Revision ID: pqm@pqm.ubuntu.com-20081120045730-d6ik8z5dfnzcnab6
(mbp) don't call chdir(''), which fails on SunOS

Show diffs side-by-side

added added

removed removed

Lines of Context:
283
283
    global errno
284
284
 
285
285
    cwd = getcwd(NULL, 0)
286
 
    if -1 == chdir(path):
287
 
        raise OSError(errno, strerror(errno))
288
 
    the_dir = opendir(".")
289
 
    if NULL == the_dir:
290
 
        raise OSError(errno, strerror(errno))
291
 
    result = []
 
286
    if path != "":
 
287
        # Avoid chdir('') because it causes problems on Sun OS
 
288
        if -1 == chdir(path):
 
289
            raise OSError(errno, strerror(errno))
292
290
    try:
293
 
        entry = &sentinel
294
 
        while entry != NULL:
295
 
            # Unlike most libc functions, readdir needs errno set to 0
296
 
            # beforehand so that eof can be distinguished from errors.  See
297
 
            # <https://bugs.launchpad.net/bzr/+bug/279381>
298
 
            while True:
299
 
                errno = 0;
300
 
                entry = readdir(the_dir)
301
 
                if entry == NULL and (errno == EAGAIN or errno == EINTR):
302
 
                    # try again
303
 
                    continue
304
 
                else:
305
 
                    break
306
 
            if entry == NULL:
307
 
                if errno == ENOTDIR or errno == 0:
308
 
                    # We see ENOTDIR at the end of a normal directory.
309
 
                    # As ENOTDIR for read_dir(file) is triggered on opendir,
310
 
                    # we consider ENOTDIR to be 'no error'.
311
 
                    continue
312
 
                else:
313
 
                    raise OSError(errno, strerror(errno))
314
 
            name = entry.d_name
315
 
            if not (name[0] == c"." and (
316
 
                (name[1] == 0) or 
317
 
                (name[1] == c"." and name[2] == 0))
318
 
                ):
319
 
                statvalue = _Stat()
320
 
                stat_result = lstat(entry.d_name, &statvalue._st)
321
 
                if stat_result != 0:
322
 
                    if errno != ENOENT:
 
291
        the_dir = opendir(".")
 
292
        if NULL == the_dir:
 
293
            raise OSError(errno, strerror(errno))
 
294
        try:
 
295
            result = []
 
296
            entry = &sentinel
 
297
            while entry != NULL:
 
298
                # Unlike most libc functions, readdir needs errno set to 0
 
299
                # beforehand so that eof can be distinguished from errors.  See
 
300
                # <https://bugs.launchpad.net/bzr/+bug/279381>
 
301
                while True:
 
302
                    errno = 0;
 
303
                    entry = readdir(the_dir)
 
304
                    if entry == NULL and (errno == EAGAIN or errno == EINTR):
 
305
                        # try again
 
306
                        continue
 
307
                    else:
 
308
                        break
 
309
                if entry == NULL:
 
310
                    if errno == ENOTDIR or errno == 0:
 
311
                        # We see ENOTDIR at the end of a normal directory.
 
312
                        # As ENOTDIR for read_dir(file) is triggered on opendir,
 
313
                        # we consider ENOTDIR to be 'no error'.
 
314
                        continue
 
315
                    else:
323
316
                        raise OSError(errno, strerror(errno))
324
 
                    else:
325
 
                        kind = _missing
326
 
                        statvalue = None
327
 
                # We append a 5-tuple that can be modified in-place by the C
328
 
                # api:
329
 
                # inode to sort on (to replace with top_path)
330
 
                # name (to keep)
331
 
                # kind (None, to set)
332
 
                # statvalue (to keep)
333
 
                # abspath (None, to set)
334
 
                PyList_Append(result, (entry.d_ino, entry.d_name, None,
335
 
                    statvalue, None))
 
317
                name = entry.d_name
 
318
                if not (name[0] == c"." and (
 
319
                    (name[1] == 0) or 
 
320
                    (name[1] == c"." and name[2] == 0))
 
321
                    ):
 
322
                    statvalue = _Stat()
 
323
                    stat_result = lstat(entry.d_name, &statvalue._st)
 
324
                    if stat_result != 0:
 
325
                        if errno != ENOENT:
 
326
                            raise OSError(errno, strerror(errno))
 
327
                        else:
 
328
                            kind = _missing
 
329
                            statvalue = None
 
330
                    # We append a 5-tuple that can be modified in-place by the C
 
331
                    # api:
 
332
                    # inode to sort on (to replace with top_path)
 
333
                    # name (to keep)
 
334
                    # kind (None, to set)
 
335
                    # statvalue (to keep)
 
336
                    # abspath (None, to set)
 
337
                    PyList_Append(result, (entry.d_ino, entry.d_name, None,
 
338
                        statvalue, None))
 
339
        finally:
 
340
            if -1 == closedir(the_dir):
 
341
                raise OSError(errno, strerror(errno))
336
342
    finally:
337
343
        if -1 == chdir(cwd):
338
344
            free(cwd)
339
345
            raise OSError(errno, strerror(errno))
340
346
        free(cwd)
341
 
        if -1 == closedir(the_dir):
342
 
            raise OSError(errno, strerror(errno))
343
347
    return result
344
348
 
345
349