telldir.c (69841) | telldir.c (71579) |
---|---|
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 --- 16 unchanged lines hidden (view full) --- 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * | 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 --- 16 unchanged lines hidden (view full) --- 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * |
33 * $FreeBSD: head/lib/libc/gen/telldir.c 69841 2000-12-11 04:00:36Z deischen $ | 33 * $FreeBSD: head/lib/libc/gen/telldir.c 71579 2001-01-24 13:01:12Z deischen $ |
34 */ 35 36#if defined(LIBC_SCCS) && !defined(lint) 37static char sccsid[] = "@(#)telldir.c 8.1 (Berkeley) 6/4/93"; 38#endif /* LIBC_SCCS and not lint */ 39 | 34 */ 35 36#if defined(LIBC_SCCS) && !defined(lint) 37static char sccsid[] = "@(#)telldir.c 8.1 (Berkeley) 6/4/93"; 38#endif /* LIBC_SCCS and not lint */ 39 |
40#include "namespace.h" |
|
40#include <sys/param.h> 41#include <sys/queue.h> 42#include <dirent.h> | 41#include <sys/param.h> 42#include <sys/queue.h> 43#include <dirent.h> |
44#include <pthread.h> |
|
43#include <stdlib.h> 44#include <unistd.h> | 45#include <stdlib.h> 46#include <unistd.h> |
47#include "un-namespace.h" |
|
45 | 48 |
49#include "libc_private.h" |
|
46#include "telldir.h" 47 48/* 49 * The option SINGLEUSE may be defined to say that a telldir 50 * cookie may be used only once before it is freed. This option 51 * is used to avoid having memory usage grow without bound. 52 */ 53#define SINGLEUSE --- 4 unchanged lines hidden (view full) --- 58long 59telldir(dirp) 60 DIR *dirp; 61{ 62 struct ddloc *lp; 63 64 if ((lp = (struct ddloc *)malloc(sizeof(struct ddloc))) == NULL) 65 return (-1); | 50#include "telldir.h" 51 52/* 53 * The option SINGLEUSE may be defined to say that a telldir 54 * cookie may be used only once before it is freed. This option 55 * is used to avoid having memory usage grow without bound. 56 */ 57#define SINGLEUSE --- 4 unchanged lines hidden (view full) --- 62long 63telldir(dirp) 64 DIR *dirp; 65{ 66 struct ddloc *lp; 67 68 if ((lp = (struct ddloc *)malloc(sizeof(struct ddloc))) == NULL) 69 return (-1); |
70 if (__isthreaded) 71 _pthread_mutex_lock((pthread_mutex_t *)&dirp->dd_lock); |
|
66 lp->loc_index = dirp->dd_td->td_loccnt++; 67 lp->loc_seek = dirp->dd_seek; 68 lp->loc_loc = dirp->dd_loc; 69 LIST_INSERT_HEAD(&dirp->dd_td->td_locq, lp, loc_lqe); | 72 lp->loc_index = dirp->dd_td->td_loccnt++; 73 lp->loc_seek = dirp->dd_seek; 74 lp->loc_loc = dirp->dd_loc; 75 LIST_INSERT_HEAD(&dirp->dd_td->td_locq, lp, loc_lqe); |
76 if (__isthreaded) 77 _pthread_mutex_unlock((pthread_mutex_t *)&dirp->dd_lock); |
|
70 return (lp->loc_index); 71} 72 73/* 74 * seek to an entry in a directory. 75 * Only values returned by "telldir" should be passed to seekdir. 76 */ 77void --- 11 unchanged lines hidden (view full) --- 89 if (lp == NULL) 90 return; 91 if (lp->loc_loc == dirp->dd_loc && lp->loc_seek == dirp->dd_seek) 92 goto found; 93 (void) lseek(dirp->dd_fd, (off_t)lp->loc_seek, SEEK_SET); 94 dirp->dd_seek = lp->loc_seek; 95 dirp->dd_loc = 0; 96 while (dirp->dd_loc < lp->loc_loc) { | 78 return (lp->loc_index); 79} 80 81/* 82 * seek to an entry in a directory. 83 * Only values returned by "telldir" should be passed to seekdir. 84 */ 85void --- 11 unchanged lines hidden (view full) --- 97 if (lp == NULL) 98 return; 99 if (lp->loc_loc == dirp->dd_loc && lp->loc_seek == dirp->dd_seek) 100 goto found; 101 (void) lseek(dirp->dd_fd, (off_t)lp->loc_seek, SEEK_SET); 102 dirp->dd_seek = lp->loc_seek; 103 dirp->dd_loc = 0; 104 while (dirp->dd_loc < lp->loc_loc) { |
97 dp = readdir(dirp); | 105 dp = _readdir_unlocked(dirp); |
98 if (dp == NULL) 99 break; 100 } 101found: 102#ifdef SINGLEUSE 103 LIST_REMOVE(lp, loc_lqe); 104 free((caddr_t)lp); 105#endif --- 20 unchanged lines hidden --- | 106 if (dp == NULL) 107 break; 108 } 109found: 110#ifdef SINGLEUSE 111 LIST_REMOVE(lp, loc_lqe); 112 free((caddr_t)lp); 113#endif --- 20 unchanged lines hidden --- |