Page MenuHomeFreeBSD

D11185.id29865.diff
No OneTemporary

D11185.id29865.diff

Index: lib/libc/include/libc_private.h
===================================================================
--- lib/libc/include/libc_private.h
+++ lib/libc/include/libc_private.h
@@ -311,6 +311,7 @@
struct sigaction;
struct sockaddr;
struct stat;
+struct statfs;
struct timespec;
struct timeval;
struct timezone;
@@ -327,13 +328,16 @@
const struct timespec *, struct timespec *);
int __sys_close(int);
int __sys_connect(int, const struct sockaddr *, __socklen_t);
-__ssize_t __sys_getdirentries(int, char *, __size_t, __off_t *);
int __sys_fcntl(int, int, ...);
int __sys_fdatasync(int);
+int __sys_fstat(int fd, struct stat *);
+int __sys_fstatfs(int fd, struct statfs *);
int __sys_fstatat(int, const char *, struct stat *, int);
int __sys_fsync(int);
__pid_t __sys_fork(void);
int __sys_ftruncate(int, __off_t);
+__ssize_t __sys_getdirentries(int, char *, __size_t, __off_t *);
+int __sys_getfsstat(struct statfs *, long, int);
int __sys_gettimeofday(struct timeval *, struct timezone *);
int __sys_kevent(int, const struct kevent *, int, struct kevent *,
int, const struct timespec *);
@@ -372,6 +376,7 @@
const struct timespec *);
int __sys_sigwait(const __sigset_t *, int *);
int __sys_sigwaitinfo(const __sigset_t *, struct __siginfo *);
+int __sys_statfs(const char *, struct statfs *);
int __sys_swapcontext(struct __ucontext *,
const struct __ucontext *);
int __sys_thr_kill(long, int);
Index: lib/libc/sys/Makefile.inc
===================================================================
--- lib/libc/sys/Makefile.inc
+++ lib/libc/sys/Makefile.inc
@@ -37,6 +37,14 @@
SRCS+= getdents.c lstat.c mknod.c stat.c
+SRCS+= fstat.c fstatat.c fstatfs.c getfsstat.c statfs.c
+NOASM+= fstat.o fstatat.o fstatfs.o getfsstat.o statfs.o
+PSEUDO+= _fstat.o _fstatat.o _fstatfs.o _getfsstat.o _statfs.o
+
+SRCS+= getdirentries.c
+NOASM+= getdirentries.o
+PSEUDO+= _getdirentries.o
+
SRCS+= pipe.c
INTERPOSED = \
Index: lib/libc/sys/compat-ino64.h
===================================================================
--- /dev/null
+++ lib/libc/sys/compat-ino64.h
@@ -0,0 +1,110 @@
+/*-
+ * Copyright (c) 2017 M. Warner Losh <imp@FreeBSD.org>
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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
+ * 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.
+ *
+ * $FreeBSD$
+ */
+
+/*
+ * Forward compatibility shim to convert old stat buffer to
+ * new so we can call the old system call, but return data in
+ * the new system call's format.
+ */
+#define _WANT_FREEBSD11_STATFS
+#include <sys/fcntl.h>
+#include <sys/mount.h>
+
+#define _WANT_FREEBSD11_STAT
+#include <sys/stat.h>
+
+#include <string.h>
+
+#include "../gen/gen-compat.h"
+
+#define INO64_FIRST 12000031
+
+int freebsd11_fstat(int, struct freebsd11_stat *);
+int freebsd11_fstatat(int, const char *, struct freebsd11_stat *, int);
+int freebsd11_fstatfs(int, struct freebsd11_statfs *);
+int freebsd11_getfsstat(struct freebsd11_statfs *, long, int);
+int freebsd11_statfs(const char *, struct freebsd11_statfs *);
+
+static __inline void
+__stat11_to_stat(const struct freebsd11_stat *sb11, struct stat *sb)
+{
+
+ sb->st_dev = sb11->st_dev;
+ sb->st_ino = sb11->st_ino;
+ sb->st_mode = sb11->st_mode;
+ sb->st_nlink = sb11->st_nlink;
+ sb->st_uid = sb11->st_uid;
+ sb->st_gid = sb11->st_gid;
+ sb->st_rdev = sb11->st_rdev;
+ sb->st_size = sb11->st_size;
+ sb->st_atim = sb11->st_atim;
+ sb->st_mtim = sb11->st_mtim;
+ sb->st_ctim = sb11->st_ctim;
+ sb->st_blksize = sb11->st_blksize;
+ sb->st_blocks = sb11->st_blocks;
+ sb->st_flags = sb11->st_flags;
+ sb->st_gen = sb11->st_gen;
+ sb->st_birthtim = sb11->st_birthtim;
+#ifdef __STAT_TIME_T_EXT
+ sb->st_atim_ext = 0;
+ sb->st_mtim_ext = 0;
+ sb->st_ctim_ext = 0;
+ sb->st_btim_ext = 0;
+#endif
+ sb->st_padding0 = 0;
+ sb->st_padding1 = 0;
+ memset(sb->st_spare, 0, sizeof(sb->st_spare));
+}
+
+static __inline void
+__statfs11_to_statfs(const struct freebsd11_statfs *sf11, struct statfs *sf)
+{
+
+ sf->f_version = STATFS_VERSION;
+ sf->f_type = sf11->f_type;
+ sf->f_flags = sf11->f_flags;
+ sf->f_bsize = sf11->f_bsize;
+ sf->f_iosize = sf11->f_iosize;
+ sf->f_blocks = sf11->f_blocks;
+ sf->f_bfree = sf11->f_bfree;
+ sf->f_bavail = sf11->f_bavail;
+ sf->f_files = sf11->f_files;
+ sf->f_ffree = sf11->f_ffree;
+ sf->f_syncwrites = sf11->f_syncwrites;
+ sf->f_asyncwrites = sf11->f_asyncwrites;
+ sf->f_syncreads = sf11->f_syncreads;
+ sf->f_asyncreads = sf11->f_asyncreads;
+ sf->f_namemax = sf11->f_namemax;
+ sf->f_owner = sf11->f_owner;
+ sf->f_fsid = sf11->f_fsid;
+ memset(sf->f_spare, 0, sizeof(sf->f_spare));
+ memset(sf->f_charspare, 0, sizeof(sf->f_charspare));
+ strlcpy(sf->f_fstypename, sf11->f_fstypename, sizeof(sf->f_fstypename));
+ strlcpy(sf->f_mntfromname, sf11->f_mntfromname, sizeof(sf->f_mntfromname));
+ strlcpy(sf->f_mntonname, sf11->f_mntonname, sizeof(sf->f_mntonname));
+}
Index: lib/libc/sys/fstat.c
===================================================================
--- /dev/null
+++ lib/libc/sys/fstat.c
@@ -0,0 +1,53 @@
+/*-
+ * Copyright (c) 2017 M. Warner Losh <imp@FreeBSD.org>
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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
+ * 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 <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "namespace.h"
+#include <sys/param.h>
+#include "compat-ino64.h"
+#include <unistd.h>
+
+#include "libc_private.h"
+
+#undef fstat
+__weak_reference(_fstat, fstat);
+
+#pragma weak _fstat
+int
+_fstat(int fd, struct stat *sb)
+{
+ struct freebsd11_stat stat11;
+ int rv;
+
+ if (__getosreldate() >= INO64_FIRST)
+ return (__sys_fstat(fd, sb));
+ rv = freebsd11_fstat(fd, &stat11);
+ if (rv == 0)
+ __stat11_to_stat(&stat11, sb);
+ return (rv);
+}
Index: lib/libc/sys/fstatat.c
===================================================================
--- /dev/null
+++ lib/libc/sys/fstatat.c
@@ -0,0 +1,52 @@
+/*-
+ * Copyright (c) 2017 M. Warner Losh <imp@FreeBSD.org>
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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
+ * 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 <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "namespace.h"
+#include <sys/param.h>
+#include "compat-ino64.h"
+
+#include "libc_private.h"
+
+#undef fstatat
+__weak_reference(_fstatat, fstatat);
+
+#pragma weak _fstatat
+int
+_fstatat(int fd, const char *path, struct stat *sb, int flag)
+{
+ struct freebsd11_stat stat11;
+ int rv;
+
+ if (__getosreldate() >= INO64_FIRST)
+ return (__sys_fstatat(fd, path, sb, flag));
+ rv = freebsd11_fstatat(fd, path, &stat11, flag);
+ if (rv == 0)
+ __stat11_to_stat(&stat11, sb);
+ return (rv);
+}
Index: lib/libc/sys/fstatfs.c
===================================================================
--- /dev/null
+++ lib/libc/sys/fstatfs.c
@@ -0,0 +1,52 @@
+/*-
+ * Copyright (c) 2017 M. Warner Losh <imp@FreeBSD.org>
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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
+ * 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 <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "namespace.h"
+#include <sys/param.h>
+#include "compat-ino64.h"
+
+#include "libc_private.h"
+
+#undef fstatfs
+__weak_reference(_fstatfs, fstatfs);
+
+#pragma weak _fstatfs
+int
+_fstatfs(int fd, struct statfs *buf)
+{
+ struct freebsd11_statfs statfs11;
+ int rv;
+
+ if (__getosreldate() >= INO64_FIRST)
+ return (__sys_fstatfs(fd, buf));
+ rv = freebsd11_fstatfs(fd, &statfs11);
+ if (rv == 0)
+ __statfs11_to_statfs(&statfs11, buf);
+ return (rv);
+}
Index: lib/libc/sys/getdents.c
===================================================================
--- lib/libc/sys/getdents.c
+++ lib/libc/sys/getdents.c
@@ -36,6 +36,11 @@
ssize_t
getdents(int fd, char *buf, size_t nbytes)
{
+ /*
+ * _getdirentries knows how to call the right thing and
+ * return it in the new format. It assumes that the entire
+ * libc expecting the new format.
+ */
- return (__sys_getdirentries(fd, buf, nbytes, NULL));
+ return (_getdirentries(fd, buf, nbytes, NULL));
}
Index: lib/libc/sys/getdirentries.c
===================================================================
--- /dev/null
+++ lib/libc/sys/getdirentries.c
@@ -0,0 +1,120 @@
+/*-
+ * Copyright (c) 2017 M. Warner Losh <imp@FreeBSD.org>
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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
+ * 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 <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#define _WANT_FREEBSD11_DIRENT
+
+#include "namespace.h"
+#include <sys/param.h>
+#include "compat-ino64.h"
+#include <dirent.h>
+#include <errno.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include "libc_private.h"
+
+ssize_t freebsd11_getdirentries(int fd, char *buf, size_t nbytes, off_t *basep);
+
+static ssize_t
+__cvt_dirents_from11(const char *de11, ssize_t len11, char *de, ssize_t len)
+{
+ struct dirent *dst;
+ const struct freebsd11_dirent *src;
+ const char *edst, *esrc;
+ ssize_t rlen;
+
+ src = (const struct freebsd11_dirent *)de11;
+ dst = (struct dirent *)de;
+ esrc = de11 + len11;
+ edst = de + len;
+ while ((const char *)src < esrc && (const char *)dst < edst) {
+ rlen = roundup(offsetof(struct dirent, d_name) + src->d_namlen + 1, 8);
+ if ((const char *)dst + rlen >= edst)
+ break;
+ dst->d_fileno = src->d_fileno;
+ dst->d_off = 0; /* nothing uses it yet, so safe for now */
+ dst->d_reclen = rlen;
+ dst->d_type = src->d_type;
+ dst->d_pad0 = 0;
+ dst->d_namlen = src->d_namlen;
+ dst->d_pad1 = 0;
+ memset(dst->d_name, 0, roundup(src->d_namlen + 1, 8));
+ memcpy(dst->d_name, src->d_name, src->d_namlen);
+ dst = (struct dirent *)((char *)dst + rlen);
+ src = (const struct freebsd11_dirent *)((const char *)src + src->d_reclen);
+ }
+ return ((const char *)dst - de);
+}
+
+ssize_t
+getdirentries(int fd, char *buf, size_t nbytes, off_t *basep)
+{
+ char *oldbuf;
+ size_t len;
+ ssize_t rv;
+ int saved_errno;
+
+ if (__getosreldate() >= INO64_FIRST)
+ return (__sys_getdirentries(fd, buf, nbytes, basep));
+
+ /*
+ * We know the new dirents is larger than the olddirents, so we know
+ * this will suffice.
+ * TBD: Will this difference matter to lseek?
+ */
+ saved_errno = errno;
+ oldbuf = malloc(nbytes);
+ if (oldbuf == NULL) {
+ errno = EINVAL; /* ENOMEM not in possible list */
+ return (-1);
+ }
+ /*
+ * Because the old system call returns entries that are smaller than the
+ * new, we could wind up in a situation where we have too many to fit in
+ * the buffer with the new encoding. So sacrifice a small bit of
+ * efficiency to ensure that never happens. We pick 1/4 the size
+ * arbitrarily and round up to the next DIRBLKSIZ because that's what
+ * the readdir code does. We don't check against minimum dir size to
+ * avoid a lot of stat calls, we'll see if that's wise or not.
+ */
+ len = roundup(nbytes / 4, DIRBLKSIZ);
+ rv = freebsd11_getdirentries(fd, oldbuf, len, basep);
+ if (rv == -1) {
+ free(oldbuf);
+ return (rv);
+ }
+ rv = __cvt_dirents_from11(oldbuf, rv, buf, nbytes);
+ free(oldbuf);
+ if (rv > 0)
+ errno = saved_errno;
+
+ return (rv);
+}
Index: lib/libc/sys/getfsstat.c
===================================================================
--- /dev/null
+++ lib/libc/sys/getfsstat.c
@@ -0,0 +1,66 @@
+/*-
+ * Copyright (c) 2017 M. Warner Losh <imp@FreeBSD.org>
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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
+ * 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 <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "namespace.h"
+#include <sys/param.h>
+#include "compat-ino64.h"
+#include <sys/errno.h>
+#include <stdlib.h>
+
+#include "libc_private.h"
+
+#undef getfsstat
+__weak_reference(_getfsstat, getfsstat);
+
+#pragma weak _getfsstat
+int
+_getfsstat(struct statfs *buf, long bufsize, int flags)
+{
+ struct freebsd11_statfs *statfs11 = NULL;
+ ssize_t len = 0;
+ int rv, i;
+
+ if (__getosreldate() >= INO64_FIRST)
+ return (__sys_getfsstat(buf, bufsize, flags));
+ if (buf != NULL) {
+ len = sizeof(struct freebsd11_statfs) * /* Round down on purpose to avoid */
+ (bufsize / sizeof(struct statfs)); /* overflow on translation. */
+ statfs11 = malloc(len);
+ if (statfs11 == NULL) {
+ errno = ENOMEM;
+ return (-1);
+ }
+ }
+ rv = freebsd11_getfsstat(statfs11, len, flags);
+ if (rv != -1 && buf != NULL) {
+ for (i = 0; i < rv; i++)
+ __statfs11_to_statfs(&statfs11[i], &buf[i]);
+ }
+ return (rv);
+}
Index: lib/libc/sys/lstat.c
===================================================================
--- lib/libc/sys/lstat.c
+++ lib/libc/sys/lstat.c
@@ -1,4 +1,5 @@
/*-
+ * Copyright (c) 2017 M. Warner Losh <imp@FreeBSD.org>
* Copyright (c) 2012 Gleb Kurtsou <gleb@FreeBSD.org>
* All rights reserved.
*
@@ -29,15 +30,20 @@
#include "namespace.h"
#include <sys/param.h>
-#include <sys/fcntl.h>
-#include <sys/syscall.h>
-#include <sys/stat.h>
-#include <unistd.h>
+#include "compat-ino64.h"
+
#include "libc_private.h"
int
lstat(const char *path, struct stat *sb)
{
+ struct freebsd11_stat stat11;
+ int rv;
- return (__sys_fstatat(AT_FDCWD, path, sb, AT_SYMLINK_NOFOLLOW));
+ if (__getosreldate() >= INO64_FIRST)
+ return (__sys_fstatat(AT_FDCWD, path, sb, AT_SYMLINK_NOFOLLOW));
+ rv = freebsd11_lstat(path, &stat11);
+ if (rv == 0)
+ __stat11_to_stat(&stat11, sb);
+ return (rv);
}
Index: lib/libc/sys/stat.c
===================================================================
--- lib/libc/sys/stat.c
+++ lib/libc/sys/stat.c
@@ -1,4 +1,5 @@
/*-
+ * Copyright (c) 2017 M. Warner Losh <imp@FreeBSD.org>
* Copyright (c) 2012 Gleb Kurtsou <gleb@FreeBSD.org>
* All rights reserved.
*
@@ -29,15 +30,20 @@
#include "namespace.h"
#include <sys/param.h>
-#include <sys/fcntl.h>
-#include <sys/syscall.h>
-#include <sys/stat.h>
-#include <unistd.h>
+#include "compat-ino64.h"
+
#include "libc_private.h"
int
stat(const char *path, struct stat *sb)
{
+ struct freebsd11_stat stat11;
+ int rv;
- return (__sys_fstatat(AT_FDCWD, path, sb, 0));
+ if (__getosreldate() >= INO64_FIRST)
+ return (__sys_fstatat(AT_FDCWD, path, sb, 0));
+ rv = freebsd11_stat(path, &stat11);
+ if (rv == 0)
+ __stat11_to_stat(&stat11, sb);
+ return (rv);
}
Index: lib/libc/sys/statfs.c
===================================================================
--- /dev/null
+++ lib/libc/sys/statfs.c
@@ -0,0 +1,52 @@
+/*-
+ * Copyright (c) 2017 M. Warner Losh <imp@FreeBSD.org>
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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
+ * 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 <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "namespace.h"
+#include <sys/param.h>
+#include "compat-ino64.h"
+
+#include "libc_private.h"
+
+#undef statfs
+__weak_reference(_statfs, statfs);
+
+#pragma weak _statfs
+int
+_statfs(const char *path, struct statfs *buf)
+{
+ struct freebsd11_statfs statfs11;
+ int rv;
+
+ if (__getosreldate() >= INO64_FIRST)
+ return (__sys_statfs(path, buf));
+ rv = freebsd11_statfs(path, &statfs11);
+ if (rv == 0)
+ __statfs11_to_statfs(&statfs11, buf);
+ return (rv);
+}

File Metadata

Mime Type
text/plain
Expires
Thu, Mar 19, 8:46 AM (8 h, 53 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29956875
Default Alt Text
D11185.id29865.diff (23 KB)

Event Timeline