OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [uClibc/] [libc/] [misc/] [dirent/] [readdir64_r.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1325 phoenix
#include <features.h>
2
#ifdef __UCLIBC_HAS_LFS__
3
#if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS != 64 
4
#undef _FILE_OFFSET_BITS
5
#define _FILE_OFFSET_BITS   64
6
#endif
7
#ifndef __USE_LARGEFILE64
8
# define __USE_LARGEFILE64      1
9
#endif
10
/* We absolutely do _NOT_ want interfaces silently
11
 * renamed under us or very bad things will happen... */
12
#ifdef __USE_FILE_OFFSET64
13
# undef __USE_FILE_OFFSET64
14
#endif
15
#include <errno.h>
16
#include <stdlib.h>
17
#include <string.h>
18
#include <unistd.h>
19
#include <dirent.h>
20
#include "dirstream.h"
21
 
22
 
23
int readdir64_r(DIR *dir, struct dirent64 *entry, struct dirent64 **result)
24
{
25
        int ret;
26
        ssize_t bytes;
27
        struct dirent64 *de;
28
 
29
        if (!dir) {
30
            __set_errno(EBADF);
31
            return(EBADF);
32
        }
33
        de = NULL;
34
 
35
#ifdef __UCLIBC_HAS_THREADS__
36
        __pthread_mutex_lock(&(dir->dd_lock));
37
#endif
38
 
39
        do {
40
            if (dir->dd_size <= dir->dd_nextloc) {
41
                /* read dir->dd_max bytes of directory entries. */
42
                bytes = __getdents64(dir->dd_fd, dir->dd_buf, dir->dd_max);
43
                if (bytes <= 0) {
44
                    *result = NULL;
45
                    ret = errno;
46
                    goto all_done;
47
                }
48
                dir->dd_size = bytes;
49
                dir->dd_nextloc = 0;
50
            }
51
 
52
            de = (struct dirent64 *) (((char *) dir->dd_buf) + dir->dd_nextloc);
53
 
54
            /* Am I right? H.J. */
55
            dir->dd_nextloc += de->d_reclen;
56
 
57
            /* We have to save the next offset here. */
58
            dir->dd_nextoff = de->d_off;
59
            /* Skip deleted files.  */
60
        } while (de->d_ino == 0);
61
 
62
        if (de == NULL) {
63
            *result = NULL;
64
        } else {
65
            *result = memcpy (entry, de, de->d_reclen);
66
        }
67
        ret = 0;
68
 
69
all_done:
70
 
71
#ifdef __UCLIBC_HAS_THREADS__
72
        __pthread_mutex_unlock(&(dir->dd_lock));
73
#endif
74
        return((de != NULL)? 0 : ret);
75
}
76
#endif /* __UCLIBC_HAS_LFS__ */
77
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.