~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-21 04:44:50 UTC
  • mfrom: (3841.1.5 297381-readdir)
  • Revision ID: pqm@pqm.ubuntu.com-20081121044450-xgyehkv3u1da37wg
(mbp) SunOS fixes to readdir_pyx

Show diffs side-by-side

added added

removed removed

Lines of Context:
36
36
 
37
37
cdef extern from 'unistd.h':
38
38
    int chdir(char *path)
 
39
    int close(int fd)
 
40
    int fchdir(int fd)
39
41
    char *getcwd(char *, int size)
40
42
 
41
43
cdef extern from 'stdlib.h':
49
51
    ctypedef long time_t
50
52
    ctypedef unsigned long ino_t
51
53
    ctypedef unsigned long long off_t
 
54
    ctypedef int mode_t
52
55
 
53
56
 
54
57
cdef extern from 'sys/stat.h':
69
72
    int S_ISSOCK(int mode)
70
73
 
71
74
 
 
75
cdef extern from 'fcntl.h':
 
76
    int O_RDONLY
 
77
    int open(char *pathname, int flags, mode_t mode)
 
78
 
 
79
 
72
80
cdef extern from 'Python.h':
73
81
    char * PyString_AS_STRING(object)
74
82
    ctypedef int Py_ssize_t # Required for older pyrex versions
279
287
    cdef char *name
280
288
    cdef int stat_result
281
289
    cdef _Stat statvalue
282
 
    cdef char *cwd
283
290
    global errno
 
291
    cdef int orig_dir_fd
284
292
 
285
 
    cwd = getcwd(NULL, 0)
286
 
    if path != "":
287
 
        # Avoid chdir('') because it causes problems on Sun OS
 
293
    # Avoid chdir('') because it causes problems on Sun OS, and avoid this if
 
294
    # staying in .
 
295
    if path != "" and path != '.':
 
296
        # we change into the requested directory before reading, and back at the
 
297
        # end, because that turns out to make the stat calls measurably faster than
 
298
        # passing full paths every time.
 
299
        orig_dir_fd = open(".", O_RDONLY, 0)
 
300
        if orig_dir_fd == -1:
 
301
            raise OSError(errno, strerror(errno))
288
302
        if -1 == chdir(path):
289
303
            raise OSError(errno, strerror(errno))
 
304
    else:
 
305
        orig_dir_fd = -1
 
306
 
290
307
    try:
291
308
        the_dir = opendir(".")
292
309
        if NULL == the_dir:
299
316
                # beforehand so that eof can be distinguished from errors.  See
300
317
                # <https://bugs.launchpad.net/bzr/+bug/279381>
301
318
                while True:
302
 
                    errno = 0;
 
319
                    errno = 0
303
320
                    entry = readdir(the_dir)
304
321
                    if entry == NULL and (errno == EAGAIN or errno == EINTR):
305
322
                        # try again
340
357
            if -1 == closedir(the_dir):
341
358
                raise OSError(errno, strerror(errno))
342
359
    finally:
343
 
        if -1 == chdir(cwd):
344
 
            free(cwd)
345
 
            raise OSError(errno, strerror(errno))
346
 
        free(cwd)
 
360
        if -1 != orig_dir_fd:
 
361
            failed = False
 
362
            if -1 == fchdir(orig_dir_fd):
 
363
                # try to close the original directory anyhow
 
364
                failed = True
 
365
            if -1 == close(orig_dir_fd) or failed:
 
366
                raise OSError(errno, strerror(errno))
 
367
 
347
368
    return result
348
369
 
349
370