readdir.c (174221) | readdir.c (178772) |
---|---|
1/* 2 * Copyright (c) 1983, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 17 unchanged lines hidden (view full) --- 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 */ 29 30#if defined(LIBC_SCCS) && !defined(lint) 31static char sccsid[] = "@(#)readdir.c 8.3 (Berkeley) 9/29/94"; 32#endif /* LIBC_SCCS and not lint */ 33#include <sys/cdefs.h> | 1/* 2 * Copyright (c) 1983, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 17 unchanged lines hidden (view full) --- 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 */ 29 30#if defined(LIBC_SCCS) && !defined(lint) 31static char sccsid[] = "@(#)readdir.c 8.3 (Berkeley) 9/29/94"; 32#endif /* LIBC_SCCS and not lint */ 33#include <sys/cdefs.h> |
34__FBSDID("$FreeBSD: head/lib/libc/gen/readdir.c 174221 2007-12-03 14:33:51Z des $"); | 34__FBSDID("$FreeBSD: head/lib/libc/gen/readdir.c 178772 2008-05-05 14:05:23Z kib $"); |
35 36#include "namespace.h" 37#include <sys/param.h> 38#include <dirent.h> 39#include <errno.h> 40#include <string.h> 41#include <pthread.h> 42#include "un-namespace.h" 43 44#include "libc_private.h" 45#include "telldir.h" 46 47/* 48 * get next entry in a directory. 49 */ 50struct dirent * | 35 36#include "namespace.h" 37#include <sys/param.h> 38#include <dirent.h> 39#include <errno.h> 40#include <string.h> 41#include <pthread.h> 42#include "un-namespace.h" 43 44#include "libc_private.h" 45#include "telldir.h" 46 47/* 48 * get next entry in a directory. 49 */ 50struct dirent * |
51_readdir_unlocked(dirp) | 51_readdir_unlocked(dirp, skip) |
52 DIR *dirp; | 52 DIR *dirp; |
53 int skip; |
|
53{ 54 struct dirent *dp; 55 56 for (;;) { 57 if (dirp->dd_loc >= dirp->dd_size) { 58 if (dirp->dd_flags & __DTF_READALL) 59 return (NULL); 60 dirp->dd_loc = 0; --- 6 unchanged lines hidden (view full) --- 67 } 68 dp = (struct dirent *)(dirp->dd_buf + dirp->dd_loc); 69 if ((long)dp & 03L) /* bogus pointer check */ 70 return (NULL); 71 if (dp->d_reclen <= 0 || 72 dp->d_reclen > dirp->dd_len + 1 - dirp->dd_loc) 73 return (NULL); 74 dirp->dd_loc += dp->d_reclen; | 54{ 55 struct dirent *dp; 56 57 for (;;) { 58 if (dirp->dd_loc >= dirp->dd_size) { 59 if (dirp->dd_flags & __DTF_READALL) 60 return (NULL); 61 dirp->dd_loc = 0; --- 6 unchanged lines hidden (view full) --- 68 } 69 dp = (struct dirent *)(dirp->dd_buf + dirp->dd_loc); 70 if ((long)dp & 03L) /* bogus pointer check */ 71 return (NULL); 72 if (dp->d_reclen <= 0 || 73 dp->d_reclen > dirp->dd_len + 1 - dirp->dd_loc) 74 return (NULL); 75 dirp->dd_loc += dp->d_reclen; |
75 if (dp->d_ino == 0) | 76 if (dp->d_ino == 0 && skip) |
76 continue; 77 if (dp->d_type == DT_WHT && (dirp->dd_flags & DTF_HIDEW)) 78 continue; 79 return (dp); 80 } 81} 82 83struct dirent * 84readdir(dirp) 85 DIR *dirp; 86{ 87 struct dirent *dp; 88 89 if (__isthreaded) { 90 _pthread_mutex_lock(&dirp->dd_lock); | 77 continue; 78 if (dp->d_type == DT_WHT && (dirp->dd_flags & DTF_HIDEW)) 79 continue; 80 return (dp); 81 } 82} 83 84struct dirent * 85readdir(dirp) 86 DIR *dirp; 87{ 88 struct dirent *dp; 89 90 if (__isthreaded) { 91 _pthread_mutex_lock(&dirp->dd_lock); |
91 dp = _readdir_unlocked(dirp); | 92 dp = _readdir_unlocked(dirp, 1); |
92 _pthread_mutex_unlock(&dirp->dd_lock); 93 } 94 else | 93 _pthread_mutex_unlock(&dirp->dd_lock); 94 } 95 else |
95 dp = _readdir_unlocked(dirp); | 96 dp = _readdir_unlocked(dirp, 1); |
96 return (dp); 97} 98 99int 100readdir_r(dirp, entry, result) 101 DIR *dirp; 102 struct dirent *entry; 103 struct dirent **result; 104{ 105 struct dirent *dp; 106 int saved_errno; 107 108 saved_errno = errno; 109 errno = 0; 110 if (__isthreaded) { 111 _pthread_mutex_lock(&dirp->dd_lock); | 97 return (dp); 98} 99 100int 101readdir_r(dirp, entry, result) 102 DIR *dirp; 103 struct dirent *entry; 104 struct dirent **result; 105{ 106 struct dirent *dp; 107 int saved_errno; 108 109 saved_errno = errno; 110 errno = 0; 111 if (__isthreaded) { 112 _pthread_mutex_lock(&dirp->dd_lock); |
112 if ((dp = _readdir_unlocked(dirp)) != NULL) | 113 if ((dp = _readdir_unlocked(dirp, 1)) != NULL) |
113 memcpy(entry, dp, _GENERIC_DIRSIZ(dp)); 114 _pthread_mutex_unlock(&dirp->dd_lock); 115 } | 114 memcpy(entry, dp, _GENERIC_DIRSIZ(dp)); 115 _pthread_mutex_unlock(&dirp->dd_lock); 116 } |
116 else if ((dp = _readdir_unlocked(dirp)) != NULL) | 117 else if ((dp = _readdir_unlocked(dirp, 1)) != NULL) |
117 memcpy(entry, dp, _GENERIC_DIRSIZ(dp)); 118 119 if (errno != 0) { 120 if (dp == NULL) 121 return (errno); 122 } else 123 errno = saved_errno; 124 125 if (dp != NULL) 126 *result = entry; 127 else 128 *result = NULL; 129 130 return (0); 131} | 118 memcpy(entry, dp, _GENERIC_DIRSIZ(dp)); 119 120 if (errno != 0) { 121 if (dp == NULL) 122 return (errno); 123 } else 124 errno = saved_errno; 125 126 if (dp != NULL) 127 *result = entry; 128 else 129 *result = NULL; 130 131 return (0); 132} |