Deleted Added
full compact
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 ---