1a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner/* Directory entry code for Window platforms.
2a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' TurnerCopyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
3a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner2006 Free Software Foundation, Inc.
4a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' TurnerThis file is part of GNU Make.
5a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
6a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' TurnerGNU Make is free software; you can redistribute it and/or modify it under the
7a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turnerterms of the GNU General Public License as published by the Free Software
8a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' TurnerFoundation; either version 2, or (at your option) any later version.
9a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
10a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' TurnerGNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
11a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' TurnerWARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' TurnerA PARTICULAR PURPOSE.  See the GNU General Public License for more details.
13a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
14a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' TurnerYou should have received a copy of the GNU General Public License along with
15a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' TurnerGNU Make; see the file COPYING.  If not, write to the Free Software
16a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' TurnerFoundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.  */
17a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
18a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
19a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner#include <sys/types.h>
20a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner#include <sys/stat.h>
21a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner#include <errno.h>
22a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner#include <string.h>
23a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner#include <stdlib.h>
24a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner#include "dirent.h"
25a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
26a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
27a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' TurnerDIR*
28a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turneropendir(const char* pDirName)
29a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner{
30a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	struct stat sb;
31a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	DIR*	pDir;
32a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	char*	pEndDirName;
33a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	int	nBufferLen;
34a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
35a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	/* sanity checks */
36a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	if (!pDirName) {
37a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		errno = EINVAL;
38a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		return NULL;
39a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	}
40a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	if (stat(pDirName, &sb) != 0) {
41a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		errno = ENOENT;
42a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		return NULL;
43a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	}
44a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	if ((sb.st_mode & S_IFMT) != S_IFDIR) {
45a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		errno = ENOTDIR;
46a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		return NULL;
47a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	}
48a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
49a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	/* allocate a DIR structure to return */
50a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	pDir = (DIR *) malloc(sizeof (DIR));
51a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
52a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	if (!pDir)
53a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		return NULL;
54a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
55a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	/* input directory name length */
56a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	nBufferLen = strlen(pDirName);
57a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
58a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	/* copy input directory name to DIR buffer */
59a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	strcpy(pDir->dir_pDirectoryName, pDirName);
60a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
61a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	/* point to end of the copied directory name */
62a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	pEndDirName = &pDir->dir_pDirectoryName[nBufferLen - 1];
63a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
64a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	/* if directory name did not end in '/' or '\', add '/' */
65a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	if ((*pEndDirName != '/') && (*pEndDirName != '\\')) {
66a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		pEndDirName++;
67a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		*pEndDirName = '/';
68a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	}
69a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
70a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	/* now append the wildcard character to the buffer */
71a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	pEndDirName++;
72a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	*pEndDirName = '*';
73a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	pEndDirName++;
74a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	*pEndDirName = '\0';
75a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
76a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	/* other values defaulted */
77a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	pDir->dir_nNumFiles = 0;
78a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	pDir->dir_hDirHandle = INVALID_HANDLE_VALUE;
79a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	pDir->dir_ulCookie = __DIRENT_COOKIE;
80a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
81a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	return pDir;
82a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner}
83a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
84a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turnervoid
85a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turnerclosedir(DIR *pDir)
86a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner{
87a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	/* got a valid pointer? */
88a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	if (!pDir) {
89a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		errno = EINVAL;
90a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		return;
91a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	}
92a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
93a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	/* sanity check that this is a DIR pointer */
94a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	if (pDir->dir_ulCookie != __DIRENT_COOKIE) {
95a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		errno = EINVAL;
96a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		return;
97a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	}
98a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
99a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	/* close the WINDOWS32 directory handle */
100a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	if (pDir->dir_hDirHandle != INVALID_HANDLE_VALUE)
101a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		FindClose(pDir->dir_hDirHandle);
102a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
103a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	free(pDir);
104a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
105a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	return;
106a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner}
107a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
108a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turnerstruct dirent *
109a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turnerreaddir(DIR* pDir)
110a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner{
111a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	WIN32_FIND_DATA wfdFindData;
112a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
113a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	if (!pDir) {
114a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		errno = EINVAL;
115a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		return NULL;
116a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	}
117a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
118a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	/* sanity check that this is a DIR pointer */
119a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	if (pDir->dir_ulCookie != __DIRENT_COOKIE) {
120a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		errno = EINVAL;
121a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		return NULL;
122a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	}
123a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
124a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	if (pDir->dir_nNumFiles == 0) {
125a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		pDir->dir_hDirHandle = FindFirstFile(pDir->dir_pDirectoryName, &wfdFindData);
126a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		if (pDir->dir_hDirHandle == INVALID_HANDLE_VALUE)
127a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner			return NULL;
128a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	} else if (!FindNextFile(pDir->dir_hDirHandle, &wfdFindData))
129a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner			return NULL;
130a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
131a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	/* bump count for next call to readdir() or telldir() */
132a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	pDir->dir_nNumFiles++;
133a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
134a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	/* fill in struct dirent values */
135a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	pDir->dir_sdReturn.d_ino = -1;
136a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	strcpy(pDir->dir_sdReturn.d_name, wfdFindData.cFileName);
137a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
138a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	return &pDir->dir_sdReturn;
139a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner}
140a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
141a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turnervoid
142a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turnerrewinddir(DIR* pDir)
143a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner{
144a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	if (!pDir) {
145a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		errno = EINVAL;
146a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		return;
147a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	}
148a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
149a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	/* sanity check that this is a DIR pointer */
150a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	if (pDir->dir_ulCookie != __DIRENT_COOKIE) {
151a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		errno = EINVAL;
152a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		return;
153a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	}
154a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
155a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	/* close the WINDOWS32 directory handle */
156a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	if (pDir->dir_hDirHandle != INVALID_HANDLE_VALUE)
157a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		if (!FindClose(pDir->dir_hDirHandle))
158a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner			errno = EBADF;
159a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
160a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	/* reset members which control readdir() */
161a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	pDir->dir_hDirHandle = INVALID_HANDLE_VALUE;
162a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	pDir->dir_nNumFiles = 0;
163a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
164a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	return;
165a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner}
166a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
167a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turnerint
168a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turnertelldir(DIR* pDir)
169a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner{
170a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	if (!pDir) {
171a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		errno = EINVAL;
172a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		return -1;
173a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	}
174a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
175a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	/* sanity check that this is a DIR pointer */
176a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	if (pDir->dir_ulCookie != __DIRENT_COOKIE) {
177a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		errno = EINVAL;
178a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		return -1;
179a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	}
180a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
181a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	/* return number of times readdir() called */
182a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	return pDir->dir_nNumFiles;
183a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner}
184a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
185a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turnervoid
186a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turnerseekdir(DIR* pDir, long nPosition)
187a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner{
188a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	if (!pDir)
189a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		return;
190a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
191a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	/* sanity check that this is a DIR pointer */
192a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	if (pDir->dir_ulCookie != __DIRENT_COOKIE)
193a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		return;
194a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
195a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	/* go back to beginning of directory */
196a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	rewinddir(pDir);
197a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
198a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	/* loop until we have found position we care about */
199a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	for (--nPosition; nPosition && readdir(pDir); nPosition--);
200a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
201a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	/* flag invalid nPosition value */
202a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	if (nPosition)
203a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner		errno = EINVAL;
204a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner
205a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner	return;
206a86d4c1bde70365cbbe874ad9ddb3f06916d2085David 'Digit' Turner}
207