From owner-svn-soc-all@FreeBSD.ORG Fri Jun 17 22:30:15 2011 Return-Path: Delivered-To: svn-soc-all@FreeBSD.org Received: from socsvn.FreeBSD.org (unknown [IPv6:2001:4f8:fff6::2f]) by hub.freebsd.org (Postfix) with SMTP id A1802106564A for ; Fri, 17 Jun 2011 22:30:13 +0000 (UTC) (envelope-from gk@FreeBSD.org) Received: by socsvn.FreeBSD.org (sSMTP sendmail emulation); Fri, 17 Jun 2011 22:30:13 +0000 Date: Fri, 17 Jun 2011 22:30:13 +0000 From: gk@FreeBSD.org To: svn-soc-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Message-Id: <20110617223013.A1802106564A@hub.freebsd.org> Cc: Subject: socsvn commit: r223371 - in soc2011/gk/ino64-head/lib/libc: gen include sys X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 17 Jun 2011 22:30:15 -0000 Author: gk Date: Fri Jun 17 22:30:13 2011 New Revision: 223371 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=223371 Log: libc: readdir, getdirentries Added: soc2011/gk/ino64-head/lib/libc/gen/dirent-compat.h - copied, changed from r223370, soc2011/gk/ino64-head/lib/libc/include/compat.h soc2011/gk/ino64-head/lib/libc/gen/readdir-compat8.c (contents, props changed) soc2011/gk/ino64-head/lib/libc/gen/scandir-compat8.c (contents, props changed) Modified: soc2011/gk/ino64-head/lib/libc/gen/Makefile.inc soc2011/gk/ino64-head/lib/libc/gen/Symbol.map soc2011/gk/ino64-head/lib/libc/include/compat.h soc2011/gk/ino64-head/lib/libc/sys/Symbol.map Modified: soc2011/gk/ino64-head/lib/libc/gen/Makefile.inc ============================================================================== --- soc2011/gk/ino64-head/lib/libc/gen/Makefile.inc Fri Jun 17 22:29:57 2011 (r223370) +++ soc2011/gk/ino64-head/lib/libc/gen/Makefile.inc Fri Jun 17 22:30:13 2011 (r223371) @@ -24,8 +24,8 @@ nlist.c nrand48.c opendir.c \ pause.c pmadvise.c popen.c posix_spawn.c \ psignal.c pututxline.c pw_scan.c pwcache.c \ - raise.c readdir.c readpassphrase.c rewinddir.c \ - scandir.c seed48.c seekdir.c semctl.c \ + raise.c readdir.c readdir-compat8.c readpassphrase.c rewinddir.c \ + scandir.c scandir-compat8.c seed48.c seekdir.c semctl.c \ setdomainname.c sethostname.c setjmperr.c setmode.c \ setproctitle.c setprogname.c siginterrupt.c siglist.c signal.c \ sigsetops.c sleep.c srand48.c statvfs.c stringlist.c strtofflags.c \ Modified: soc2011/gk/ino64-head/lib/libc/gen/Symbol.map ============================================================================== --- soc2011/gk/ino64-head/lib/libc/gen/Symbol.map Fri Jun 17 22:29:57 2011 (r223370) +++ soc2011/gk/ino64-head/lib/libc/gen/Symbol.map Fri Jun 17 22:30:13 2011 (r223371) @@ -225,13 +225,9 @@ pclose; psignal; raise; - readdir; - readdir_r; readpassphrase; getpass; rewinddir; - scandir; - alphasort; seed48; seekdir; user_from_uid; @@ -357,6 +353,7 @@ }; FBSD_1.2 { + alphasort; basename_r; cfmakesane; dirfd; @@ -367,6 +364,9 @@ getutxline; getutxuser; pututxline; + readdir; + readdir_r; + scandir; sem_close; sem_destroy; sem_getvalue; Copied and modified: soc2011/gk/ino64-head/lib/libc/gen/dirent-compat.h (from r223370, soc2011/gk/ino64-head/lib/libc/include/compat.h) ============================================================================== --- soc2011/gk/ino64-head/lib/libc/include/compat.h Fri Jun 17 22:29:57 2011 (r223370, copy source) +++ soc2011/gk/ino64-head/lib/libc/gen/dirent-compat.h Fri Jun 17 22:30:13 2011 (r223371) @@ -1,7 +1,6 @@ -/*- - * Copyright (c) 2009 Advanced Computing Technologies LLC - * Written by: John H. Baldwin - * All rights reserved. +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -11,11 +10,14 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) @@ -23,36 +25,22 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -/* - * This file defines compatiblity symbol versions for old system calls. It - * is included in all generated system call files. */ -#ifndef __LIBC_COMPAT_H__ -#define __LIBC_COMPAT_H__ - -#define __sym_compat(sym,impl,verid) \ - .symver impl, sym@verid - -__sym_compat(__semctl, freebsd7___semctl, FBSD_1.0); -__sym_compat(msgctl, freebsd7_msgctl, FBSD_1.0); -__sym_compat(shmctl, freebsd7_shmctl, FBSD_1.0); - -__sym_compat(nfstat, freebsd8_nfstat, FBSD_1.0); -__sym_compat(nlstat, freebsd8_nlstat, FBSD_1.0); -__sym_compat(nstat, freebsd8_nstat, FBSD_1.0); - -__sym_compat(fhstat, freebsd8_fhstat, FBSD_1.0); -__sym_compat(fstat, freebsd8_fstat, FBSD_1.0); -__sym_compat(fstatat, freebsd8_fstatat, FBSD_1.1); -__sym_compat(lstat, freebsd8_lstat, FBSD_1.0); -__sym_compat(stat, freebsd8_stat, FBSD_1.0); - -#undef __sym_compat +#ifndef _DIRENT_COMPAT_H_ +#define _DIRENT_COMPAT_H_ -#endif /* __LIBC_COMPAT_H__ */ +#define FREEBSD8_DIRSIZ(dp) \ + (sizeof(struct freebsd8_dirent) - sizeof((dp)->d_name) + \ + (((dp)->d_namlen + 1 + 3) &~ 3)) + +struct freebsd8_stat; + +struct freebsd8_dirent *freebsd8_readdir(DIR *); +int freebsd8_readdir_r(DIR *, struct freebsd8_dirent *, + struct freebsd8_dirent **); +int freebsd8_stat(const char *, struct freebsd8_stat *); +int freebsd8_lstat(const char *, struct freebsd8_stat *); +int freebsd8_fstat(int, struct freebsd8_stat *); +#endif /* _DIRENT_COMPAT_H_ */ Added: soc2011/gk/ino64-head/lib/libc/gen/readdir-compat8.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2011/gk/ino64-head/lib/libc/gen/readdir-compat8.c Fri Jun 17 22:30:13 2011 (r223371) @@ -0,0 +1,111 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "namespace.h" +#include +#include +#include +#include +#include +#include +#include +#include "un-namespace.h" + +#include "libc_private.h" +#include "dirent-compat.h" +#include "dirent-private.h" +#include "telldir.h" + +static int +freebsd8_cvtdirent(struct freebsd8_dirent *dstdp, struct dirent *srcdp) +{ + if (srcdp->d_namlen > sizeof(dstdp->d_name) - 1) + return (ENAMETOOLONG); + dstdp->d_type = srcdp->d_type; + dstdp->d_namlen = srcdp->d_namlen; + dstdp->d_fileno = srcdp->d_fileno; /* truncate */ + dstdp->d_reclen = FREEBSD8_DIRSIZ(dstdp); + bcopy(srcdp->d_name, dstdp->d_name, dstdp->d_namlen); + bzero(dstdp->d_name + dstdp->d_namlen, + dstdp->d_reclen - offsetof(struct freebsd8_dirent, d_name) - + dstdp->d_namlen); + return (0); +} + +struct freebsd8_dirent * +freebsd8_readdir(DIR *dirp) +{ + static struct freebsd8_dirent *compatbuf; + struct freebsd8_dirent *dstdp; + struct dirent *dp; + + if (__isthreaded) + _pthread_mutex_lock(&dirp->dd_lock); +again: + dp = _readdir_unlocked(dirp, 1); + if (dp != NULL) { + if (compatbuf == NULL) + compatbuf = malloc(sizeof(struct freebsd8_dirent)); + if (freebsd8_cvtdirent(compatbuf, dp) != 0) + goto again; + dstdp = compatbuf; + } else + dstdp = NULL; + if (__isthreaded) + _pthread_mutex_unlock(&dirp->dd_lock); + + return (dstdp); +} + +int +freebsd8_readdir_r(DIR *dirp, struct freebsd8_dirent *entry, + struct freebsd8_dirent **result) +{ + struct dirent xentry; + struct dirent *xresult; + int error; + +again: + error = readdir_r(dirp, &xentry, &xresult); + + if (error != 0) + return (error); + if (xresult != NULL) { + if (freebsd8_cvtdirent(entry, &xentry) != 0) + goto again; + } else + *result = NULL; + return (0); +} + +__sym_compat(readdir, freebsd8_readdir, FBSD_1.0); +__sym_compat(readdir_r, freebsd8_readdir_r, FBSD_1.0); Added: soc2011/gk/ino64-head/lib/libc/gen/scandir-compat8.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2011/gk/ino64-head/lib/libc/gen/scandir-compat8.c Fri Jun 17 22:30:13 2011 (r223371) @@ -0,0 +1,129 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "namespace.h" +#include +#include +#include +#include "un-namespace.h" + +#include "dirent-compat.h" + +static int alphasort_thunk(void *thunk, const void *p1, const void *p2); + +static int +alphasort_thunk(void *thunk, const void *p1, const void *p2) +{ + int (*dc)(const struct dirent **, const struct dirent **); + + dc = *(int (**)(const struct dirent **, const struct dirent **))thunk; + return (dc((const struct dirent **)p1, (const struct dirent **)p2)); +} + +int +freebsd8_alphasort(const struct freebsd8_dirent **d1, + const struct freebsd8_dirent **d2) +{ + + return (strcoll((*d1)->d_name, (*d2)->d_name)); +} + +int +freebsd8_scandir(const char *dirname, struct freebsd8_dirent ***namelist, + int (*select)(const struct freebsd8_dirent *), + int (*dcomp)(const struct freebsd8_dirent **, + const struct freebsd8_dirent **)) +{ + struct freebsd8_dirent *d, *p, **names = NULL; + size_t nitems = 0; + long arraysz; + DIR *dirp; + + if ((dirp = opendir(dirname)) == NULL) + return(-1); + + arraysz = 32; /* initial estimate of the array size */ + names = (struct freebsd8_dirent **)malloc( + arraysz * sizeof(struct freebsd8_dirent *)); + if (names == NULL) + goto fail; + + while ((d = freebsd8_readdir(dirp)) != NULL) { + if (select != NULL && !(*select)(d)) + continue; /* just selected names */ + /* + * Make a minimum size copy of the data + */ + p = (struct freebsd8_dirent *)malloc(FREEBSD8_DIRSIZ(d)); + if (p == NULL) + goto fail; + p->d_fileno = d->d_fileno; + p->d_type = d->d_type; + p->d_reclen = d->d_reclen; + p->d_namlen = d->d_namlen; + bcopy(d->d_name, p->d_name, p->d_namlen + 1); + /* + * Check to make sure the array has space left and + * realloc the maximum size. + */ + if (nitems >= arraysz) { + struct freebsd8_dirent **names2; + + names2 = (struct freebsd8_dirent **)realloc( + (char *)names, + (arraysz * 2) * sizeof(struct freebsd8_dirent *)); + if (names2 == NULL) { + free(p); + goto fail; + } + names = names2; + arraysz *= 2; + } + names[nitems++] = p; + } + closedir(dirp); + if (nitems && dcomp != NULL) + qsort_r(names, nitems, sizeof(struct freebsd8_dirent *), + &dcomp, alphasort_thunk); + *namelist = names; + return (nitems); + +fail: + while (nitems > 0) + free(names[--nitems]); + free(names); + closedir(dirp); + return (-1); +} + +__sym_compat(alphasort, freebsd8_alphasort, FBSD_1.0); +__sym_compat(scandir, freebsd8_scandir, FBSD_1.0); Modified: soc2011/gk/ino64-head/lib/libc/include/compat.h ============================================================================== --- soc2011/gk/ino64-head/lib/libc/include/compat.h Fri Jun 17 22:29:57 2011 (r223370) +++ soc2011/gk/ino64-head/lib/libc/include/compat.h Fri Jun 17 22:30:13 2011 (r223371) @@ -52,6 +52,9 @@ __sym_compat(lstat, freebsd8_lstat, FBSD_1.0); __sym_compat(stat, freebsd8_stat, FBSD_1.0); +__sym_compat(getdents, freebsd8_getdents, FBSD_1.0); +__sym_compat(getdirentries, freebsd8_getdirentries, FBSD_1.0); + #undef __sym_compat #endif /* __LIBC_COMPAT_H__ */ Modified: soc2011/gk/ino64-head/lib/libc/sys/Symbol.map ============================================================================== --- soc2011/gk/ino64-head/lib/libc/sys/Symbol.map Fri Jun 17 22:29:57 2011 (r223370) +++ soc2011/gk/ino64-head/lib/libc/sys/Symbol.map Fri Jun 17 22:30:13 2011 (r223371) @@ -99,8 +99,6 @@ getaudit_addr; getauid; getcontext; - getdents; - getdirentries; getdtablesize; getegid; geteuid; @@ -358,6 +356,8 @@ fhstat; fstat; fstatat; + getdents; + getdirentries; getloginclass; lstat; posix_fallocate;