summaryrefslogtreecommitdiff
path: root/libc/misc/dirent/telldir.c
blob: 8c13a9c23612862ede05ab5df4ebd97f18614c6b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <dirent.h>
#include <errno.h>
#include <unistd.h>
#include "dirstream.h"


long int telldir(DIR * dir)
{
	off_t offset;

	if (!dir) {
		__set_errno(EBADF);
		return -1;
	}

	switch (dir->dd_getdents) {
	case no_getdents:
		/* We are running the old kernel. This is the starting offset
		   of the next readdir(). */
		offset = lseek(dir->dd_fd, 0, SEEK_CUR);
		break;

	case unknown:
		/* readdir () is not called yet. but seekdir () may be called. */
	case have_getdents:
		/* The next entry. */
		offset = dir->dd_nextoff;
		break;

	default:
		__set_errno(EBADF);
		offset = -1;
	}

	return offset;
}