2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these librararies and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* $XConsortium: getdents.c /main/3 1995/11/01 17:22:56 rswiston $ */
24 /***************************************************************
26 * AT&T - PROPRIETARY *
28 * THIS IS PROPRIETARY SOURCE CODE LICENSED BY *
31 * Copyright (c) 1995 AT&T Corp. *
32 * All Rights Reserved *
34 * This software is licensed by AT&T Corp. *
35 * under the terms and conditions of the license in *
36 * http://www.research.att.com/orgs/ssr/book/reuse *
38 * This software was created by the *
39 * Software Engineering Research Department *
40 * AT&T Bell Laboratories *
42 * For further information contact *
43 * gsf@research.att.com *
45 ***************************************************************/
47 /* : : generated by proto : : */
49 #if !defined(__PROTO__)
50 #if defined(__STDC__) || defined(__cplusplus) || defined(_proto) || defined(c_plusplus)
51 #if defined(__cplusplus)
52 #define __MANGLE__ "C"
57 #define __PROTO__(x) x
59 #define __PARAM__(n,o) n
60 #if !defined(__STDC__) && !defined(__cplusplus)
61 #if !defined(c_plusplus)
72 #define __PROTO__(x) ()
73 #define __OTORP__(x) x
74 #define __PARAM__(n,o) o
82 #if defined(__cplusplus) || defined(c_plusplus)
83 #define __VARARG__ ...
87 #if defined(__STDARG__)
88 #define __VA_START__(p,a) va_start(p,a)
90 #define __VA_START__(p,a) va_start(p)
95 #if _dir_ok || _lib_getdents
104 * read directory entries into directory block
106 * NOTE: directory entries must fit within DIRBLKSIZ boundaries
110 #define MAXNAMLEN 255
114 extern __MANGLE__ int dirread __PROTO__((int, char*, int));
116 #if _lib_getdirentries
117 extern __MANGLE__ int getdirentries __PROTO__((int, char*, int, long*));
121 getdents __PARAM__((int fd, __V_* buf, size_t siz), (fd, buf, siz)) __OTORP__(int fd; __V_* buf; size_t siz;){
129 if (fstat(fd, &st)) return(-1);
130 if (!S_ISDIR(st.st_mode))
139 #if _lib_getdirentries
142 return(getdirentries(fd, buf, siz, &off));
147 register char* sp; /* system */
148 register struct dirent* up; /* user */
156 sp = (char*)buf + siz - m - 1;
157 if (!(n = dirread(fd, sp, m))) return(0);
160 up = (struct dirent*)buf;
162 while (sp < (char*)buf + siz - m + n)
165 while (*sp >= '0' && *sp <= '9')
166 i = 10 * i + *sp++ - '0';
167 while (*sp && *sp != '\t') sp++;
172 while ((*u = *sp++) && u < up->d_name + MAXNAMLEN) u++;
174 up->d_reclen = sizeof(struct dirent) - sizeof(up->d_name) + (up->d_namlen = u - up->d_name) + 1;
175 up->d_reclen = roundof(up->d_reclen, 8);
176 up = (struct dirent*)((char*)up + up->d_reclen);
179 return((char*)up - (char*)buf);
183 #if _mem_d_reclen_direct
184 return(read(fd, buf, siz));
188 #define MAXREC roundof(sizeof(*up)-sizeof(up->d_name)+sizeof(sp->d_name)+1,8)
190 register struct direct* sp; /* system */
191 register struct dirent* up; /* user */
196 char tmp[sizeof(sp->d_name) + 1];
199 * we assume sizeof(struct dirent) > sizeof(struct direct)
202 up = (struct dirent*)buf;
203 n = (siz / MAXREC) * sizeof(struct direct);
204 if ((!(m = n & ~511) || m < MAXREC) && (!(m = n & ~255) || m < MAXREC)) m = n;
207 if ((n = read(fd, (char*)buf + siz - m, m)) <= 0) break;
208 sp = (struct direct*)((char*)buf + siz - m);
209 while (sp < (struct direct*)((char*)buf + siz - m + n))
213 up->d_fileno = sp->d_ino;
216 while (s < sp->d_name + sizeof(sp->d_name) && *s)
219 strcpy(up->d_name, tmp);
220 up->d_reclen = sizeof(struct dirent) - sizeof(up->d_name) + (up->d_namlen = u - tmp) + 1;
221 up->d_reclen = roundof(up->d_reclen, 8);
222 up = (struct dirent*)((char*)up + up->d_reclen);
226 } while (up == (struct dirent*)buf);
227 return((char*)up - (char*)buf);