2009-01-11 05:45:45 +03:00
|
|
|
/* $NetBSD: svr4_stat.c,v 1.69 2009/01/11 02:45:50 christos Exp $ */
|
1994-10-26 08:27:43 +03:00
|
|
|
|
1998-09-04 23:54:37 +04:00
|
|
|
/*-
|
2008-03-22 00:54:58 +03:00
|
|
|
* Copyright (c) 1994, 2008 The NetBSD Foundation, Inc.
|
1994-10-24 20:37:34 +03:00
|
|
|
* All rights reserved.
|
|
|
|
*
|
1998-09-04 23:54:37 +04:00
|
|
|
* This code is derived from software contributed to The NetBSD Foundation
|
|
|
|
* by Christos Zoulas.
|
|
|
|
*
|
1994-10-24 20:37:34 +03:00
|
|
|
* 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.
|
|
|
|
*
|
1998-09-04 23:54:37 +04:00
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
|
1994-10-24 20:37:34 +03:00
|
|
|
*/
|
|
|
|
|
2001-11-13 05:07:52 +03:00
|
|
|
#include <sys/cdefs.h>
|
2009-01-11 05:45:45 +03:00
|
|
|
__KERNEL_RCSID(0, "$NetBSD: svr4_stat.c,v 1.69 2009/01/11 02:45:50 christos Exp $");
|
2001-11-13 05:07:52 +03:00
|
|
|
|
1994-10-24 20:37:34 +03:00
|
|
|
#include <sys/param.h>
|
|
|
|
#include <sys/systm.h>
|
|
|
|
#include <sys/namei.h>
|
|
|
|
#include <sys/proc.h>
|
|
|
|
#include <sys/file.h>
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <sys/filedesc.h>
|
|
|
|
#include <sys/ioctl.h>
|
|
|
|
#include <sys/kernel.h>
|
|
|
|
#include <sys/mount.h>
|
|
|
|
#include <sys/malloc.h>
|
2007-03-11 00:40:23 +03:00
|
|
|
#include <sys/namei.h>
|
1996-02-10 20:12:31 +03:00
|
|
|
#include <sys/unistd.h>
|
1994-10-24 20:37:34 +03:00
|
|
|
|
1994-11-14 09:10:37 +03:00
|
|
|
#include <sys/time.h>
|
|
|
|
#include <sys/ucred.h>
|
2000-06-28 19:39:24 +04:00
|
|
|
#include <uvm/uvm_extern.h>
|
1994-11-14 09:10:37 +03:00
|
|
|
#include <sys/sysctl.h>
|
|
|
|
|
1994-10-24 20:37:34 +03:00
|
|
|
#include <sys/syscallargs.h>
|
2007-03-11 00:40:23 +03:00
|
|
|
#include <sys/vfs_syscalls.h>
|
1994-10-24 20:37:34 +03:00
|
|
|
|
|
|
|
#include <compat/svr4/svr4_types.h>
|
1994-11-18 05:53:37 +03:00
|
|
|
#include <compat/svr4/svr4_signal.h>
|
1999-09-07 22:20:18 +04:00
|
|
|
#include <compat/svr4/svr4_lwp.h>
|
|
|
|
#include <compat/svr4/svr4_ucontext.h>
|
1994-10-24 20:37:34 +03:00
|
|
|
#include <compat/svr4/svr4_syscallargs.h>
|
|
|
|
#include <compat/svr4/svr4_util.h>
|
|
|
|
#include <compat/svr4/svr4_stat.h>
|
|
|
|
#include <compat/svr4/svr4_ustat.h>
|
|
|
|
#include <compat/svr4/svr4_fuser.h>
|
|
|
|
#include <compat/svr4/svr4_utsname.h>
|
1994-11-14 09:10:37 +03:00
|
|
|
#include <compat/svr4/svr4_systeminfo.h>
|
1995-12-19 21:27:02 +03:00
|
|
|
#include <compat/svr4/svr4_time.h>
|
1996-04-11 16:46:41 +04:00
|
|
|
#include <compat/svr4/svr4_socket.h>
|
1994-10-29 03:43:14 +03:00
|
|
|
|
2000-04-07 11:02:11 +04:00
|
|
|
#ifdef __sparc__
|
2005-02-27 01:58:54 +03:00
|
|
|
/*
|
1995-06-28 02:12:47 +04:00
|
|
|
* Solaris-2.4 on the sparc has the old stat call using the new
|
|
|
|
* stat data structure...
|
|
|
|
*/
|
|
|
|
# define SVR4_NO_OSTAT
|
|
|
|
#endif
|
|
|
|
|
2007-12-04 21:40:07 +03:00
|
|
|
static void bsd_to_svr4_xstat(struct stat *, struct svr4_xstat *);
|
|
|
|
static void bsd_to_svr4_stat64(struct stat *, struct svr4_stat64 *);
|
2007-12-21 02:02:38 +03:00
|
|
|
|
|
|
|
struct svr4_ustat_args {
|
|
|
|
syscallarg(svr4_dev_t) dev;
|
|
|
|
syscallarg(struct svr4_ustat *) name;
|
|
|
|
};
|
|
|
|
|
|
|
|
int svr4_ustat(struct lwp *, const struct svr4_ustat_args *, register_t *);
|
2007-12-04 21:40:07 +03:00
|
|
|
static int svr4_to_bsd_pathconf(int);
|
1995-10-14 23:24:14 +03:00
|
|
|
|
1996-04-11 16:46:41 +04:00
|
|
|
/*
|
|
|
|
* SVR4 uses named pipes as named sockets, so we tell programs
|
|
|
|
* that sockets are named pipes with mode 0
|
|
|
|
*/
|
|
|
|
#define BSD_TO_SVR4_MODE(mode) (S_ISSOCK(mode) ? S_IFIFO : (mode))
|
|
|
|
|
1995-10-14 23:24:14 +03:00
|
|
|
|
|
|
|
#ifndef SVR4_NO_OSTAT
|
2007-12-04 21:40:07 +03:00
|
|
|
static void bsd_to_svr4_stat(struct stat *, struct svr4_stat *);
|
1995-10-14 23:24:14 +03:00
|
|
|
|
1994-10-24 20:37:34 +03:00
|
|
|
static void
|
2007-12-08 21:35:53 +03:00
|
|
|
bsd_to_svr4_stat(struct stat *st, struct svr4_stat *st4)
|
1994-10-24 20:37:34 +03:00
|
|
|
{
|
1998-08-10 00:36:58 +04:00
|
|
|
memset(st4, 0, sizeof(*st4));
|
1997-11-17 01:50:55 +03:00
|
|
|
st4->st_dev = bsd_to_svr4_odev_t(st->st_dev);
|
1994-10-29 03:43:14 +03:00
|
|
|
st4->st_ino = st->st_ino;
|
1996-04-11 16:46:41 +04:00
|
|
|
st4->st_mode = BSD_TO_SVR4_MODE(st->st_mode);
|
1994-10-29 03:43:14 +03:00
|
|
|
st4->st_nlink = st->st_nlink;
|
|
|
|
st4->st_uid = st->st_uid;
|
|
|
|
st4->st_gid = st->st_gid;
|
1997-11-17 01:50:55 +03:00
|
|
|
st4->st_rdev = bsd_to_svr4_odev_t(st->st_rdev);
|
1994-10-29 03:43:14 +03:00
|
|
|
st4->st_size = st->st_size;
|
1996-02-01 03:18:04 +03:00
|
|
|
st4->st_atim = st->st_atimespec.tv_sec;
|
|
|
|
st4->st_mtim = st->st_mtimespec.tv_sec;
|
|
|
|
st4->st_ctim = st->st_ctimespec.tv_sec;
|
1994-10-24 20:37:34 +03:00
|
|
|
}
|
1995-10-14 23:24:14 +03:00
|
|
|
#endif
|
|
|
|
|
1994-10-24 20:37:34 +03:00
|
|
|
|
|
|
|
static void
|
2007-12-08 21:35:53 +03:00
|
|
|
bsd_to_svr4_xstat(struct stat *st, struct svr4_xstat *st4)
|
1994-10-24 20:37:34 +03:00
|
|
|
{
|
1998-08-10 00:36:58 +04:00
|
|
|
memset(st4, 0, sizeof(*st4));
|
1997-11-17 01:50:55 +03:00
|
|
|
st4->st_dev = bsd_to_svr4_dev_t(st->st_dev);
|
1994-10-29 03:43:14 +03:00
|
|
|
st4->st_ino = st->st_ino;
|
1996-04-11 16:46:41 +04:00
|
|
|
st4->st_mode = BSD_TO_SVR4_MODE(st->st_mode);
|
1994-10-29 03:43:14 +03:00
|
|
|
st4->st_nlink = st->st_nlink;
|
|
|
|
st4->st_uid = st->st_uid;
|
|
|
|
st4->st_gid = st->st_gid;
|
1997-11-17 01:50:55 +03:00
|
|
|
st4->st_rdev = bsd_to_svr4_dev_t(st->st_rdev);
|
1994-10-29 03:43:14 +03:00
|
|
|
st4->st_size = st->st_size;
|
2001-02-22 02:53:00 +03:00
|
|
|
st4->st_atim.tv_sec = st->st_atimespec.tv_sec;
|
|
|
|
st4->st_atim.tv_nsec = st->st_atimespec.tv_nsec;
|
|
|
|
st4->st_mtim.tv_sec = st->st_mtimespec.tv_sec;
|
|
|
|
st4->st_mtim.tv_nsec = st->st_mtimespec.tv_nsec;
|
|
|
|
st4->st_ctim.tv_sec = st->st_ctimespec.tv_sec;
|
|
|
|
st4->st_ctim.tv_nsec = st->st_ctimespec.tv_nsec;
|
1994-10-29 03:43:14 +03:00
|
|
|
st4->st_blksize = st->st_blksize;
|
|
|
|
st4->st_blocks = st->st_blocks;
|
2003-05-16 18:36:30 +04:00
|
|
|
strlcpy(st4->st_fstype, "unknown", sizeof(st4->st_fstype));
|
1994-10-24 20:37:34 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
1997-07-22 03:02:34 +04:00
|
|
|
static void
|
2007-12-08 21:35:53 +03:00
|
|
|
bsd_to_svr4_stat64(struct stat *st, struct svr4_stat64 *st4)
|
1997-07-22 03:02:34 +04:00
|
|
|
{
|
1998-08-10 00:36:58 +04:00
|
|
|
memset(st4, 0, sizeof(*st4));
|
1997-11-17 01:50:55 +03:00
|
|
|
st4->st_dev = bsd_to_svr4_dev_t(st->st_dev);
|
1997-07-22 03:02:34 +04:00
|
|
|
st4->st_ino = st->st_ino;
|
|
|
|
st4->st_mode = BSD_TO_SVR4_MODE(st->st_mode);
|
|
|
|
st4->st_nlink = st->st_nlink;
|
|
|
|
st4->st_uid = st->st_uid;
|
|
|
|
st4->st_gid = st->st_gid;
|
1997-11-17 01:50:55 +03:00
|
|
|
st4->st_rdev = bsd_to_svr4_dev_t(st->st_rdev);
|
1997-07-22 03:02:34 +04:00
|
|
|
st4->st_size = st->st_size;
|
2001-02-22 02:53:00 +03:00
|
|
|
st4->st_atim.tv_sec = st->st_atimespec.tv_sec;
|
|
|
|
st4->st_atim.tv_nsec = st->st_atimespec.tv_nsec;
|
|
|
|
st4->st_mtim.tv_sec = st->st_mtimespec.tv_sec;
|
|
|
|
st4->st_mtim.tv_nsec = st->st_mtimespec.tv_nsec;
|
|
|
|
st4->st_ctim.tv_sec = st->st_ctimespec.tv_sec;
|
|
|
|
st4->st_ctim.tv_nsec = st->st_ctimespec.tv_nsec;
|
1997-07-22 03:02:34 +04:00
|
|
|
st4->st_blksize = st->st_blksize;
|
|
|
|
st4->st_blocks = st->st_blocks;
|
2003-05-16 18:36:30 +04:00
|
|
|
strlcpy(st4->st_fstype, "unknown", sizeof(st4->st_fstype));
|
1997-07-22 03:02:34 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
1994-10-24 20:37:34 +03:00
|
|
|
int
|
2007-12-21 02:02:38 +03:00
|
|
|
svr4_sys_stat(struct lwp *l, const struct svr4_sys_stat_args *uap, register_t *retval)
|
1994-10-24 20:37:34 +03:00
|
|
|
{
|
1995-06-28 02:12:47 +04:00
|
|
|
#ifdef SVR4_NO_OSTAT
|
1995-10-07 09:25:19 +03:00
|
|
|
struct svr4_sys_xstat_args cup;
|
1995-06-28 02:12:47 +04:00
|
|
|
|
|
|
|
SCARG(&cup, two) = 2;
|
|
|
|
SCARG(&cup, path) = SCARG(uap, path);
|
|
|
|
SCARG(&cup, ub) = (struct svr4_xstat *) SCARG(uap, ub);
|
2003-01-18 11:44:26 +03:00
|
|
|
return svr4_sys_xstat(l, &cup, retval);
|
1995-06-28 02:12:47 +04:00
|
|
|
#else
|
1994-10-29 03:43:14 +03:00
|
|
|
struct stat st;
|
|
|
|
struct svr4_stat svr4_st;
|
|
|
|
int error;
|
1994-10-24 20:37:34 +03:00
|
|
|
|
2008-03-22 00:54:58 +03:00
|
|
|
error = do_sys_stat(SCARG(uap, path), FOLLOW, &st);
|
2007-03-11 00:40:23 +03:00
|
|
|
if (error != 0)
|
1994-10-29 03:43:14 +03:00
|
|
|
return error;
|
1994-10-24 20:37:34 +03:00
|
|
|
|
1994-10-29 03:43:14 +03:00
|
|
|
bsd_to_svr4_stat(&st, &svr4_st);
|
1994-10-24 20:37:34 +03:00
|
|
|
|
1996-04-11 16:46:41 +04:00
|
|
|
if (S_ISSOCK(st.st_mode))
|
2007-03-11 00:40:23 +03:00
|
|
|
(void) svr4_add_socket(l->l_proc, SCARG(uap, path), &st);
|
1996-04-11 16:46:41 +04:00
|
|
|
|
2007-03-11 00:40:23 +03:00
|
|
|
return copyout(&svr4_st, SCARG(uap, ub), sizeof svr4_st);
|
1995-06-28 02:12:47 +04:00
|
|
|
#endif
|
1994-10-24 20:37:34 +03:00
|
|
|
}
|
|
|
|
|
1997-07-22 03:02:34 +04:00
|
|
|
|
1994-10-24 20:37:34 +03:00
|
|
|
int
|
2007-12-21 02:02:38 +03:00
|
|
|
svr4_sys_lstat(struct lwp *l, const struct svr4_sys_lstat_args *uap, register_t *retval)
|
1994-10-24 20:37:34 +03:00
|
|
|
{
|
1995-06-28 02:12:47 +04:00
|
|
|
#ifdef SVR4_NO_OSTAT
|
1995-10-07 09:25:19 +03:00
|
|
|
struct svr4_sys_lxstat_args cup;
|
1995-06-28 02:12:47 +04:00
|
|
|
|
|
|
|
SCARG(&cup, two) = 2;
|
|
|
|
SCARG(&cup, path) = SCARG(uap, path);
|
|
|
|
SCARG(&cup, ub) = (struct svr4_xstat *) SCARG(uap, ub);
|
2003-01-18 11:44:26 +03:00
|
|
|
return svr4_sys_lxstat(l, &cup, retval);
|
1995-06-28 02:12:47 +04:00
|
|
|
#else
|
1994-10-29 03:43:14 +03:00
|
|
|
struct stat st;
|
|
|
|
struct svr4_stat svr4_st;
|
|
|
|
int error;
|
1994-10-24 20:37:34 +03:00
|
|
|
|
2008-03-22 00:54:58 +03:00
|
|
|
error = do_sys_stat(SCARG(uap, path), NOFOLLOW, &st);
|
2007-03-11 00:40:23 +03:00
|
|
|
if (error != 0)
|
1994-10-29 03:43:14 +03:00
|
|
|
return error;
|
1994-10-24 20:37:34 +03:00
|
|
|
|
1994-10-29 03:43:14 +03:00
|
|
|
bsd_to_svr4_stat(&st, &svr4_st);
|
1994-10-24 20:37:34 +03:00
|
|
|
|
1996-04-11 16:46:41 +04:00
|
|
|
if (S_ISSOCK(st.st_mode))
|
2007-03-11 00:40:23 +03:00
|
|
|
(void) svr4_add_socket(l->l_proc, SCARG(uap, path), &st);
|
1994-10-24 20:37:34 +03:00
|
|
|
|
2007-03-11 00:40:23 +03:00
|
|
|
return copyout(&svr4_st, SCARG(uap, ub), sizeof svr4_st);
|
1995-06-28 02:12:47 +04:00
|
|
|
#endif
|
1994-10-24 20:37:34 +03:00
|
|
|
}
|
|
|
|
|
1997-07-22 03:02:34 +04:00
|
|
|
|
1994-10-24 20:37:34 +03:00
|
|
|
int
|
2007-12-21 02:02:38 +03:00
|
|
|
svr4_sys_fstat(struct lwp *l, const struct svr4_sys_fstat_args *uap, register_t *retval)
|
1994-10-24 20:37:34 +03:00
|
|
|
{
|
1995-06-28 02:12:47 +04:00
|
|
|
#ifdef SVR4_NO_OSTAT
|
1995-10-07 09:25:19 +03:00
|
|
|
struct svr4_sys_fxstat_args cup;
|
1995-06-28 02:12:47 +04:00
|
|
|
|
|
|
|
SCARG(&cup, two) = 2;
|
|
|
|
SCARG(&cup, fd) = SCARG(uap, fd);
|
|
|
|
SCARG(&cup, sb) = (struct svr4_xstat *) SCARG(uap, sb);
|
2003-01-18 11:44:26 +03:00
|
|
|
return svr4_sys_fxstat(l, &cup, retval);
|
1995-06-28 02:12:47 +04:00
|
|
|
#else
|
1994-10-29 03:43:14 +03:00
|
|
|
struct stat st;
|
|
|
|
struct svr4_stat svr4_st;
|
|
|
|
int error;
|
1994-10-24 20:37:34 +03:00
|
|
|
|
2008-03-22 00:54:58 +03:00
|
|
|
error = do_sys_fstat(SCARG(uap, fd), &st);
|
2007-03-11 00:40:23 +03:00
|
|
|
if (error != 0)
|
1994-10-29 03:43:14 +03:00
|
|
|
return error;
|
1994-10-24 20:37:34 +03:00
|
|
|
|
1994-10-29 03:43:14 +03:00
|
|
|
bsd_to_svr4_stat(&st, &svr4_st);
|
1994-10-24 20:37:34 +03:00
|
|
|
|
2007-03-11 00:40:23 +03:00
|
|
|
return copyout(&svr4_st, SCARG(uap, sb), sizeof svr4_st);
|
1995-06-28 02:12:47 +04:00
|
|
|
#endif
|
1994-10-24 20:37:34 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int
|
2007-12-21 02:02:38 +03:00
|
|
|
svr4_sys_xstat(struct lwp *l, const struct svr4_sys_xstat_args *uap, register_t *retval)
|
1994-10-24 20:37:34 +03:00
|
|
|
{
|
1994-10-29 03:43:14 +03:00
|
|
|
struct stat st;
|
|
|
|
struct svr4_xstat svr4_st;
|
|
|
|
int error;
|
1994-10-24 20:37:34 +03:00
|
|
|
|
2008-03-22 00:54:58 +03:00
|
|
|
error = do_sys_stat(SCARG(uap, path), FOLLOW, &st);
|
2007-03-11 00:40:23 +03:00
|
|
|
if (error != 0)
|
1994-10-29 03:43:14 +03:00
|
|
|
return error;
|
1994-10-24 20:37:34 +03:00
|
|
|
|
1994-10-29 03:43:14 +03:00
|
|
|
bsd_to_svr4_xstat(&st, &svr4_st);
|
1994-10-24 20:37:34 +03:00
|
|
|
|
1996-04-11 16:46:41 +04:00
|
|
|
if (S_ISSOCK(st.st_mode))
|
2007-03-11 00:40:23 +03:00
|
|
|
(void) svr4_add_socket(l->l_proc, SCARG(uap, path), &st);
|
1996-04-11 16:46:41 +04:00
|
|
|
|
2007-03-11 00:40:23 +03:00
|
|
|
return copyout(&svr4_st, SCARG(uap, ub), sizeof svr4_st);
|
1994-10-24 20:37:34 +03:00
|
|
|
}
|
|
|
|
|
1997-07-22 03:02:34 +04:00
|
|
|
|
1994-10-24 20:37:34 +03:00
|
|
|
int
|
2007-12-21 02:02:38 +03:00
|
|
|
svr4_sys_lxstat(struct lwp *l, const struct svr4_sys_lxstat_args *uap, register_t *retval)
|
1994-10-24 20:37:34 +03:00
|
|
|
{
|
1994-10-29 03:43:14 +03:00
|
|
|
struct stat st;
|
|
|
|
struct svr4_xstat svr4_st;
|
|
|
|
int error;
|
1994-10-24 20:37:34 +03:00
|
|
|
|
2008-03-22 00:54:58 +03:00
|
|
|
error = do_sys_stat(SCARG(uap, path), NOFOLLOW, &st);
|
2007-03-11 00:40:23 +03:00
|
|
|
if (error != 0)
|
1994-10-29 03:43:14 +03:00
|
|
|
return error;
|
1994-10-24 20:37:34 +03:00
|
|
|
|
1994-10-29 03:43:14 +03:00
|
|
|
bsd_to_svr4_xstat(&st, &svr4_st);
|
1994-10-24 20:37:34 +03:00
|
|
|
|
1996-04-11 16:46:41 +04:00
|
|
|
if (S_ISSOCK(st.st_mode))
|
2007-03-11 00:40:23 +03:00
|
|
|
(void) svr4_add_socket(l->l_proc, SCARG(uap, path), &st);
|
1994-10-24 20:37:34 +03:00
|
|
|
|
2007-03-11 00:40:23 +03:00
|
|
|
return copyout(&svr4_st, SCARG(uap, ub), sizeof svr4_st);
|
1994-10-24 20:37:34 +03:00
|
|
|
}
|
|
|
|
|
1997-07-22 03:02:34 +04:00
|
|
|
|
1994-10-24 20:37:34 +03:00
|
|
|
int
|
2007-12-21 02:02:38 +03:00
|
|
|
svr4_sys_fxstat(struct lwp *l, const struct svr4_sys_fxstat_args *uap, register_t *retval)
|
1994-10-24 20:37:34 +03:00
|
|
|
{
|
1994-10-29 03:43:14 +03:00
|
|
|
struct stat st;
|
|
|
|
struct svr4_xstat svr4_st;
|
|
|
|
int error;
|
1994-10-24 20:37:34 +03:00
|
|
|
|
2008-03-22 00:54:58 +03:00
|
|
|
error = do_sys_fstat(SCARG(uap, fd), &st);
|
2007-03-11 00:40:23 +03:00
|
|
|
if (error != 0)
|
1994-10-29 03:43:14 +03:00
|
|
|
return error;
|
1994-10-24 20:37:34 +03:00
|
|
|
|
1994-10-29 03:43:14 +03:00
|
|
|
bsd_to_svr4_xstat(&st, &svr4_st);
|
1994-10-24 20:37:34 +03:00
|
|
|
|
2007-03-11 00:40:23 +03:00
|
|
|
return copyout(&svr4_st, SCARG(uap, sb), sizeof svr4_st);
|
1994-10-24 20:37:34 +03:00
|
|
|
}
|
|
|
|
|
1997-07-22 03:02:34 +04:00
|
|
|
|
|
|
|
int
|
2007-12-21 02:02:38 +03:00
|
|
|
svr4_sys_stat64(struct lwp *l, const struct svr4_sys_stat64_args *uap, register_t *retval)
|
1997-07-22 03:02:34 +04:00
|
|
|
{
|
|
|
|
struct stat st;
|
|
|
|
struct svr4_stat64 svr4_st;
|
|
|
|
int error;
|
|
|
|
|
2008-03-22 00:54:58 +03:00
|
|
|
error = do_sys_stat(SCARG(uap, path), FOLLOW, &st);
|
2007-03-11 00:40:23 +03:00
|
|
|
if (error != 0)
|
1997-07-22 03:02:34 +04:00
|
|
|
return error;
|
|
|
|
|
|
|
|
bsd_to_svr4_stat64(&st, &svr4_st);
|
|
|
|
|
|
|
|
if (S_ISSOCK(st.st_mode))
|
2007-03-11 00:40:23 +03:00
|
|
|
(void) svr4_add_socket(l->l_proc, SCARG(uap, path), &st);
|
1997-07-22 03:02:34 +04:00
|
|
|
|
2007-03-11 00:40:23 +03:00
|
|
|
return copyout(&svr4_st, SCARG(uap, sb), sizeof svr4_st);
|
1997-07-22 03:02:34 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int
|
2007-12-21 02:02:38 +03:00
|
|
|
svr4_sys_lstat64(struct lwp *l, const struct svr4_sys_lstat64_args *uap, register_t *retval)
|
1997-07-22 03:02:34 +04:00
|
|
|
{
|
|
|
|
struct stat st;
|
|
|
|
struct svr4_stat64 svr4_st;
|
|
|
|
int error;
|
|
|
|
|
2008-03-22 00:54:58 +03:00
|
|
|
error = do_sys_stat(SCARG(uap, path), NOFOLLOW, &st);
|
2007-03-11 00:40:23 +03:00
|
|
|
if (error != 0)
|
1997-07-22 03:02:34 +04:00
|
|
|
return error;
|
|
|
|
|
|
|
|
bsd_to_svr4_stat64(&st, &svr4_st);
|
|
|
|
|
|
|
|
if (S_ISSOCK(st.st_mode))
|
2007-03-11 00:40:23 +03:00
|
|
|
(void) svr4_add_socket(l->l_proc, SCARG(uap, path), &st);
|
1997-07-22 03:02:34 +04:00
|
|
|
|
2007-03-11 00:40:23 +03:00
|
|
|
return copyout(&svr4_st, SCARG(uap, sb), sizeof svr4_st);
|
1997-07-22 03:02:34 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int
|
2007-12-21 02:02:38 +03:00
|
|
|
svr4_sys_fstat64(struct lwp *l, const struct svr4_sys_fstat64_args *uap, register_t *retval)
|
1997-07-22 03:02:34 +04:00
|
|
|
{
|
|
|
|
struct svr4_stat64 svr4_st;
|
2007-03-11 00:40:23 +03:00
|
|
|
struct stat st;
|
1997-07-22 03:02:34 +04:00
|
|
|
int error;
|
|
|
|
|
2008-03-22 00:54:58 +03:00
|
|
|
error = do_sys_fstat(SCARG(uap, fd), &st);
|
2007-03-11 00:40:23 +03:00
|
|
|
if (error != 0)
|
1997-07-22 03:02:34 +04:00
|
|
|
return error;
|
|
|
|
|
|
|
|
bsd_to_svr4_stat64(&st, &svr4_st);
|
|
|
|
|
2007-03-11 00:40:23 +03:00
|
|
|
return copyout(&svr4_st, SCARG(uap, sb), sizeof svr4_st);
|
1997-07-22 03:02:34 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
1994-10-24 20:37:34 +03:00
|
|
|
int
|
2007-12-21 02:02:38 +03:00
|
|
|
svr4_ustat(struct lwp *l, const struct svr4_ustat_args *uap, register_t *retval)
|
1996-02-10 02:12:14 +03:00
|
|
|
{
|
2007-12-21 02:02:38 +03:00
|
|
|
/* {
|
1995-10-07 09:25:19 +03:00
|
|
|
syscallarg(svr4_dev_t) dev;
|
|
|
|
syscallarg(struct svr4_ustat *) name;
|
2007-12-21 02:02:38 +03:00
|
|
|
} */
|
1994-10-29 03:43:14 +03:00
|
|
|
struct svr4_ustat us;
|
|
|
|
int error;
|
1994-10-24 20:37:34 +03:00
|
|
|
|
1998-08-10 00:36:58 +04:00
|
|
|
memset(&us, 0, sizeof us);
|
1994-10-24 20:37:34 +03:00
|
|
|
|
1994-10-29 03:43:14 +03:00
|
|
|
/*
|
|
|
|
* XXX: should set f_tfree and f_tinode at least
|
|
|
|
* How do we translate dev -> fstat? (and then to svr4_ustat)
|
|
|
|
*/
|
1995-10-14 23:24:14 +03:00
|
|
|
if ((error = copyout(&us, SCARG(uap, name), sizeof us)) != 0)
|
1994-10-29 03:43:14 +03:00
|
|
|
return (error);
|
1994-10-24 20:37:34 +03:00
|
|
|
|
1994-10-29 03:43:14 +03:00
|
|
|
return 0;
|
1994-10-24 20:37:34 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int
|
2007-12-21 02:02:38 +03:00
|
|
|
svr4_sys_uname(struct lwp *l, const struct svr4_sys_uname_args *uap, register_t *retval)
|
1994-10-24 20:37:34 +03:00
|
|
|
{
|
2006-06-13 06:31:28 +04:00
|
|
|
struct svr4_utsname *sut;
|
|
|
|
int error;
|
1994-10-29 03:43:14 +03:00
|
|
|
|
2006-06-13 06:31:28 +04:00
|
|
|
sut = malloc(sizeof(*sut), M_TEMP, M_WAITOK|M_ZERO);
|
1994-10-29 03:43:14 +03:00
|
|
|
|
2006-06-13 06:31:28 +04:00
|
|
|
(void)strncpy(sut->sysname, ostype, sizeof(sut->sysname));
|
|
|
|
sut->sysname[sizeof(sut->sysname) - 1] = '\0';
|
1995-01-10 03:04:03 +03:00
|
|
|
|
2006-06-13 06:31:28 +04:00
|
|
|
(void)strncpy(sut->nodename, hostname, sizeof(sut->nodename));
|
|
|
|
sut->nodename[sizeof(sut->nodename) - 1] = '\0';
|
1995-01-10 03:04:03 +03:00
|
|
|
|
2006-06-13 06:31:28 +04:00
|
|
|
(void)strncpy(sut->release, osrelease, sizeof(sut->release));
|
|
|
|
sut->release[sizeof(sut->release) - 1] = '\0';
|
1995-01-10 03:04:03 +03:00
|
|
|
|
2006-06-13 06:31:28 +04:00
|
|
|
(void)strncpy(sut->version, version, sizeof(sut->version));
|
|
|
|
sut->version[sizeof(sut->version) - 1] = '\0';
|
1995-01-10 03:04:03 +03:00
|
|
|
|
2006-06-13 06:31:28 +04:00
|
|
|
(void)strncpy(sut->machine, machine, sizeof(sut->machine));
|
|
|
|
sut->machine[sizeof(sut->machine) - 1] = '\0';
|
1995-01-10 03:04:03 +03:00
|
|
|
|
2006-06-13 06:31:28 +04:00
|
|
|
error = copyout(sut, SCARG(uap, name), sizeof(*sut));
|
|
|
|
free(sut, M_TEMP);
|
|
|
|
return error;
|
1994-10-24 20:37:34 +03:00
|
|
|
}
|
|
|
|
|
1997-07-22 03:02:34 +04:00
|
|
|
|
1994-11-14 09:10:37 +03:00
|
|
|
int
|
2007-12-21 02:02:38 +03:00
|
|
|
svr4_sys_systeminfo(struct lwp *l, const struct svr4_sys_systeminfo_args *uap, register_t *retval)
|
1994-11-14 09:10:37 +03:00
|
|
|
{
|
2000-07-14 22:26:46 +04:00
|
|
|
const char *str = NULL;
|
Dynamic sysctl.
Gone are the old kern_sysctl(), cpu_sysctl(), hw_sysctl(),
vfs_sysctl(), etc, routines, along with sysctl_int() et al. Now all
nodes are registered with the tree, and nodes can be added (or
removed) easily, and I/O to and from the tree is handled generically.
Since the nodes are registered with the tree, the mapping from name to
number (and back again) can now be discovered, instead of having to be
hard coded. Adding new nodes to the tree is likewise much simpler --
the new infrastructure handles almost all the work for simple types,
and just about anything else can be done with a small helper function.
All existing nodes are where they were before (numerically speaking),
so all existing consumers of sysctl information should notice no
difference.
PS - I'm sorry, but there's a distinct lack of documentation at the
moment. I'm working on sysctl(3/8/9) right now, and I promise to
watch out for buses.
2003-12-04 22:38:21 +03:00
|
|
|
int name[2];
|
1994-11-14 09:10:37 +03:00
|
|
|
int error;
|
1998-12-10 20:06:13 +03:00
|
|
|
size_t len;
|
|
|
|
char buf[256];
|
1995-01-10 03:04:03 +03:00
|
|
|
|
1994-11-14 09:10:37 +03:00
|
|
|
u_int rlen = SCARG(uap, len);
|
|
|
|
|
|
|
|
switch (SCARG(uap, what)) {
|
|
|
|
case SVR4_SI_SYSNAME:
|
1995-01-10 03:04:03 +03:00
|
|
|
str = ostype;
|
1994-11-14 09:10:37 +03:00
|
|
|
break;
|
|
|
|
|
|
|
|
case SVR4_SI_HOSTNAME:
|
1995-01-10 03:04:03 +03:00
|
|
|
str = hostname;
|
|
|
|
break;
|
1994-11-14 09:10:37 +03:00
|
|
|
|
|
|
|
case SVR4_SI_RELEASE:
|
1995-01-10 03:04:03 +03:00
|
|
|
str = osrelease;
|
1994-11-14 09:10:37 +03:00
|
|
|
break;
|
|
|
|
|
|
|
|
case SVR4_SI_VERSION:
|
1995-01-10 03:04:03 +03:00
|
|
|
str = version;
|
1994-11-14 09:10:37 +03:00
|
|
|
break;
|
|
|
|
|
|
|
|
case SVR4_SI_MACHINE:
|
1995-01-10 03:04:03 +03:00
|
|
|
str = machine;
|
1994-11-14 09:10:37 +03:00
|
|
|
break;
|
|
|
|
|
|
|
|
case SVR4_SI_ARCHITECTURE:
|
1999-01-21 01:09:17 +03:00
|
|
|
str = machine_arch;
|
1994-11-14 09:10:37 +03:00
|
|
|
break;
|
|
|
|
|
2005-07-28 07:50:52 +04:00
|
|
|
case SVR4_SI_ISALIST:
|
|
|
|
#if defined(__sparc__)
|
|
|
|
str = "sparcv9 sparcv9-fsmuld sparcv8 sparcv8-fsmuld sparcv7 sparc";
|
|
|
|
#elif defined(__i386__)
|
|
|
|
str = "i386";
|
|
|
|
#else
|
|
|
|
str = "unknown";
|
|
|
|
#endif
|
|
|
|
break;
|
|
|
|
|
1994-11-14 09:10:37 +03:00
|
|
|
case SVR4_SI_HW_SERIAL:
|
2004-04-19 06:55:40 +04:00
|
|
|
snprintf(buf, sizeof(buf), "%lu", hostid);
|
|
|
|
str = buf;
|
1994-11-14 09:10:37 +03:00
|
|
|
break;
|
|
|
|
|
|
|
|
case SVR4_SI_HW_PROVIDER:
|
1995-01-10 03:04:03 +03:00
|
|
|
str = ostype;
|
1994-11-14 09:10:37 +03:00
|
|
|
break;
|
|
|
|
|
|
|
|
case SVR4_SI_SRPC_DOMAIN:
|
1995-01-10 03:04:03 +03:00
|
|
|
str = domainname;
|
|
|
|
break;
|
1994-11-14 09:10:37 +03:00
|
|
|
|
1996-04-22 05:16:04 +04:00
|
|
|
case SVR4_SI_PLATFORM:
|
2005-07-28 07:50:52 +04:00
|
|
|
#if defined(__i386__)
|
1998-12-10 20:06:13 +03:00
|
|
|
str = "i86pc";
|
2005-07-28 07:50:52 +04:00
|
|
|
#elif defined(__sparc__)
|
|
|
|
#elif defined(__sparc__)
|
|
|
|
{
|
|
|
|
extern char machine_model[];
|
|
|
|
|
|
|
|
str = machine_model;
|
|
|
|
}
|
1997-07-22 03:02:34 +04:00
|
|
|
#else
|
1998-12-10 20:06:13 +03:00
|
|
|
str = "unknown";
|
1997-07-22 03:02:34 +04:00
|
|
|
#endif
|
1996-04-22 05:16:04 +04:00
|
|
|
break;
|
|
|
|
|
|
|
|
case SVR4_SI_KERB_REALM:
|
|
|
|
str = "unsupported";
|
|
|
|
break;
|
|
|
|
|
1994-11-14 09:10:37 +03:00
|
|
|
case SVR4_SI_SET_HOSTNAME:
|
Dynamic sysctl.
Gone are the old kern_sysctl(), cpu_sysctl(), hw_sysctl(),
vfs_sysctl(), etc, routines, along with sysctl_int() et al. Now all
nodes are registered with the tree, and nodes can be added (or
removed) easily, and I/O to and from the tree is handled generically.
Since the nodes are registered with the tree, the mapping from name to
number (and back again) can now be discovered, instead of having to be
hard coded. Adding new nodes to the tree is likewise much simpler --
the new infrastructure handles almost all the work for simple types,
and just about anything else can be done with a small helper function.
All existing nodes are where they were before (numerically speaking),
so all existing consumers of sysctl information should notice no
difference.
PS - I'm sorry, but there's a distinct lack of documentation at the
moment. I'm working on sysctl(3/8/9) right now, and I promise to
watch out for buses.
2003-12-04 22:38:21 +03:00
|
|
|
name[1] = KERN_HOSTNAME;
|
1998-12-10 20:06:13 +03:00
|
|
|
break;
|
1994-11-14 09:10:37 +03:00
|
|
|
|
|
|
|
case SVR4_SI_SET_SRPC_DOMAIN:
|
Dynamic sysctl.
Gone are the old kern_sysctl(), cpu_sysctl(), hw_sysctl(),
vfs_sysctl(), etc, routines, along with sysctl_int() et al. Now all
nodes are registered with the tree, and nodes can be added (or
removed) easily, and I/O to and from the tree is handled generically.
Since the nodes are registered with the tree, the mapping from name to
number (and back again) can now be discovered, instead of having to be
hard coded. Adding new nodes to the tree is likewise much simpler --
the new infrastructure handles almost all the work for simple types,
and just about anything else can be done with a small helper function.
All existing nodes are where they were before (numerically speaking),
so all existing consumers of sysctl information should notice no
difference.
PS - I'm sorry, but there's a distinct lack of documentation at the
moment. I'm working on sysctl(3/8/9) right now, and I promise to
watch out for buses.
2003-12-04 22:38:21 +03:00
|
|
|
name[1] = KERN_DOMAINNAME;
|
1998-12-10 20:06:13 +03:00
|
|
|
break;
|
1994-11-14 09:10:37 +03:00
|
|
|
|
1996-04-22 05:16:04 +04:00
|
|
|
case SVR4_SI_SET_KERB_REALM:
|
|
|
|
return 0;
|
|
|
|
|
1994-11-14 09:10:37 +03:00
|
|
|
default:
|
|
|
|
DPRINTF(("Bad systeminfo command %d\n", SCARG(uap, what)));
|
|
|
|
return ENOSYS;
|
|
|
|
}
|
|
|
|
|
1998-12-10 20:06:13 +03:00
|
|
|
if (str) {
|
|
|
|
len = strlen(str) + 1;
|
2005-07-28 07:50:52 +04:00
|
|
|
if (len < rlen)
|
|
|
|
rlen = len;
|
1998-12-10 20:06:13 +03:00
|
|
|
|
|
|
|
if (SCARG(uap, buf)) {
|
2005-07-28 07:50:52 +04:00
|
|
|
error = copyout(str, SCARG(uap, buf), rlen);
|
1998-12-10 20:06:13 +03:00
|
|
|
if (error)
|
|
|
|
return error;
|
2005-07-28 07:50:52 +04:00
|
|
|
if (rlen > 0) {
|
|
|
|
/* make sure we are NULL terminated */
|
|
|
|
buf[0] = '\0';
|
|
|
|
error = copyout(buf,
|
|
|
|
&(SCARG(uap, buf)[rlen - 1]), 1);
|
|
|
|
}
|
1998-12-10 20:06:13 +03:00
|
|
|
}
|
|
|
|
else
|
|
|
|
error = 0;
|
|
|
|
}
|
|
|
|
else {
|
Dynamic sysctl.
Gone are the old kern_sysctl(), cpu_sysctl(), hw_sysctl(),
vfs_sysctl(), etc, routines, along with sysctl_int() et al. Now all
nodes are registered with the tree, and nodes can be added (or
removed) easily, and I/O to and from the tree is handled generically.
Since the nodes are registered with the tree, the mapping from name to
number (and back again) can now be discovered, instead of having to be
hard coded. Adding new nodes to the tree is likewise much simpler --
the new infrastructure handles almost all the work for simple types,
and just about anything else can be done with a small helper function.
All existing nodes are where they were before (numerically speaking),
so all existing consumers of sysctl information should notice no
difference.
PS - I'm sorry, but there's a distinct lack of documentation at the
moment. I'm working on sysctl(3/8/9) right now, and I promise to
watch out for buses.
2003-12-04 22:38:21 +03:00
|
|
|
/*
|
2005-02-27 01:58:54 +03:00
|
|
|
* looks redundant to do this, but actually it retrieves "len"
|
Dynamic sysctl.
Gone are the old kern_sysctl(), cpu_sysctl(), hw_sysctl(),
vfs_sysctl(), etc, routines, along with sysctl_int() et al. Now all
nodes are registered with the tree, and nodes can be added (or
removed) easily, and I/O to and from the tree is handled generically.
Since the nodes are registered with the tree, the mapping from name to
number (and back again) can now be discovered, instead of having to be
hard coded. Adding new nodes to the tree is likewise much simpler --
the new infrastructure handles almost all the work for simple types,
and just about anything else can be done with a small helper function.
All existing nodes are where they were before (numerically speaking),
so all existing consumers of sysctl information should notice no
difference.
PS - I'm sorry, but there's a distinct lack of documentation at the
moment. I'm working on sysctl(3/8/9) right now, and I promise to
watch out for buses.
2003-12-04 22:38:21 +03:00
|
|
|
*/
|
1998-12-10 20:06:13 +03:00
|
|
|
error = copyinstr(SCARG(uap, buf), buf, sizeof(buf), &len);
|
|
|
|
if (error)
|
|
|
|
return error;
|
Dynamic sysctl.
Gone are the old kern_sysctl(), cpu_sysctl(), hw_sysctl(),
vfs_sysctl(), etc, routines, along with sysctl_int() et al. Now all
nodes are registered with the tree, and nodes can be added (or
removed) easily, and I/O to and from the tree is handled generically.
Since the nodes are registered with the tree, the mapping from name to
number (and back again) can now be discovered, instead of having to be
hard coded. Adding new nodes to the tree is likewise much simpler --
the new infrastructure handles almost all the work for simple types,
and just about anything else can be done with a small helper function.
All existing nodes are where they were before (numerically speaking),
so all existing consumers of sysctl information should notice no
difference.
PS - I'm sorry, but there's a distinct lack of documentation at the
moment. I'm working on sysctl(3/8/9) right now, and I promise to
watch out for buses.
2003-12-04 22:38:21 +03:00
|
|
|
name[0] = CTL_KERN;
|
|
|
|
error = old_sysctl(&name[0], 2, 0, 0, SCARG(uap, buf), len, l);
|
1998-12-10 20:06:13 +03:00
|
|
|
}
|
1994-11-14 09:10:37 +03:00
|
|
|
|
1998-12-10 20:06:13 +03:00
|
|
|
*retval = len;
|
|
|
|
return error;
|
1994-11-14 09:10:37 +03:00
|
|
|
}
|
|
|
|
|
1994-10-24 20:37:34 +03:00
|
|
|
|
|
|
|
int
|
2007-12-21 02:02:38 +03:00
|
|
|
svr4_sys_utssys(struct lwp *l, const struct svr4_sys_utssys_args *uap, register_t *retval)
|
1994-10-24 20:37:34 +03:00
|
|
|
{
|
1995-09-20 02:10:11 +04:00
|
|
|
|
1994-10-29 03:43:14 +03:00
|
|
|
switch (SCARG(uap, sel)) {
|
1995-03-31 07:06:17 +04:00
|
|
|
case 0: /* uname(2) */
|
|
|
|
{
|
1995-10-07 09:25:19 +03:00
|
|
|
struct svr4_sys_uname_args ua;
|
1995-03-31 07:06:17 +04:00
|
|
|
SCARG(&ua, name) = SCARG(uap, a1);
|
2003-01-18 11:44:26 +03:00
|
|
|
return svr4_sys_uname(l, &ua, retval);
|
1995-03-31 07:06:17 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
case 2: /* ustat(2) */
|
|
|
|
{
|
|
|
|
struct svr4_ustat_args ua;
|
|
|
|
SCARG(&ua, dev) = (svr4_dev_t) SCARG(uap, a2);
|
|
|
|
SCARG(&ua, name) = SCARG(uap, a1);
|
2003-01-18 11:44:26 +03:00
|
|
|
return svr4_ustat(l, &ua, retval);
|
1995-03-31 07:06:17 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
case 3: /* fusers(2) */
|
|
|
|
return ENOSYS;
|
1994-10-29 03:43:14 +03:00
|
|
|
|
|
|
|
default:
|
|
|
|
return ENOSYS;
|
|
|
|
}
|
1994-10-24 20:37:34 +03:00
|
|
|
}
|
1995-12-19 10:12:53 +03:00
|
|
|
|
|
|
|
|
|
|
|
int
|
2007-12-21 02:02:38 +03:00
|
|
|
svr4_sys_utime(struct lwp *l, const struct svr4_sys_utime_args *uap, register_t *retval)
|
1995-12-19 10:12:53 +03:00
|
|
|
{
|
|
|
|
struct svr4_utimbuf ub;
|
2007-05-12 21:28:19 +04:00
|
|
|
struct timeval tbuf[2], *tvp;
|
1995-12-19 10:12:53 +03:00
|
|
|
int error;
|
|
|
|
|
1997-11-04 00:33:07 +03:00
|
|
|
if (SCARG(uap, ubuf) != NULL) {
|
1995-12-19 10:12:53 +03:00
|
|
|
if ((error = copyin(SCARG(uap, ubuf), &ub, sizeof(ub))) != 0)
|
|
|
|
return error;
|
|
|
|
tbuf[0].tv_sec = ub.actime;
|
|
|
|
tbuf[0].tv_usec = 0;
|
|
|
|
tbuf[1].tv_sec = ub.modtime;
|
|
|
|
tbuf[1].tv_usec = 0;
|
2007-05-12 21:28:19 +04:00
|
|
|
tvp = tbuf;
|
|
|
|
} else
|
|
|
|
tvp = NULL;
|
|
|
|
|
|
|
|
return do_sys_utimes(l, NULL, SCARG(uap, path), FOLLOW,
|
|
|
|
tvp, UIO_SYSSPACE);
|
1995-12-19 10:12:53 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int
|
2007-12-21 02:02:38 +03:00
|
|
|
svr4_sys_utimes(struct lwp *l, const struct svr4_sys_utimes_args *uap, register_t *retval)
|
1995-12-19 10:12:53 +03:00
|
|
|
{
|
2009-01-11 05:45:45 +03:00
|
|
|
return compat_50_sys_utimes(l, (const void *)uap, retval);
|
1995-12-19 10:12:53 +03:00
|
|
|
}
|
1996-02-10 20:12:31 +03:00
|
|
|
|
|
|
|
|
|
|
|
static int
|
2007-12-08 21:35:53 +03:00
|
|
|
svr4_to_bsd_pathconf(int name)
|
1996-02-10 20:12:31 +03:00
|
|
|
{
|
|
|
|
switch (name) {
|
|
|
|
case SVR4_PC_LINK_MAX:
|
|
|
|
return _PC_LINK_MAX;
|
|
|
|
|
|
|
|
case SVR4_PC_MAX_CANON:
|
|
|
|
return _PC_MAX_CANON;
|
|
|
|
|
|
|
|
case SVR4_PC_MAX_INPUT:
|
|
|
|
return _PC_MAX_INPUT;
|
|
|
|
|
|
|
|
case SVR4_PC_NAME_MAX:
|
|
|
|
return _PC_NAME_MAX;
|
|
|
|
|
|
|
|
case SVR4_PC_PATH_MAX:
|
|
|
|
return _PC_PATH_MAX;
|
|
|
|
|
|
|
|
case SVR4_PC_PIPE_BUF:
|
|
|
|
return _PC_PIPE_BUF;
|
|
|
|
|
|
|
|
case SVR4_PC_NO_TRUNC:
|
|
|
|
return _PC_NO_TRUNC;
|
|
|
|
|
|
|
|
case SVR4_PC_VDISABLE:
|
|
|
|
return _PC_VDISABLE;
|
|
|
|
|
|
|
|
case SVR4_PC_CHOWN_RESTRICTED:
|
|
|
|
return _PC_CHOWN_RESTRICTED;
|
|
|
|
|
1998-08-03 18:23:30 +04:00
|
|
|
case SVR4_PC_SYNC_IO:
|
|
|
|
return _PC_SYNC_IO;
|
|
|
|
|
1999-03-23 17:57:00 +03:00
|
|
|
case SVR4_PC_FILESIZEBITS:
|
|
|
|
return _PC_FILESIZEBITS;
|
|
|
|
|
1996-02-10 20:12:31 +03:00
|
|
|
case SVR4_PC_ASYNC_IO:
|
|
|
|
case SVR4_PC_PRIO_IO:
|
|
|
|
/* Not supported */
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
default:
|
|
|
|
/* Invalid */
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int
|
2007-12-21 02:02:38 +03:00
|
|
|
svr4_sys_pathconf(struct lwp *l, const struct svr4_sys_pathconf_args *uap, register_t *retval)
|
1996-02-10 20:12:31 +03:00
|
|
|
{
|
2007-12-21 02:02:38 +03:00
|
|
|
struct sys_pathconf_args bsd_ua;
|
1996-02-10 20:12:31 +03:00
|
|
|
|
2007-12-21 02:02:38 +03:00
|
|
|
SCARG(&bsd_ua, path) = SCARG(uap, path);
|
|
|
|
SCARG(&bsd_ua, name) = svr4_to_bsd_pathconf(SCARG(uap, name));
|
1996-02-10 20:12:31 +03:00
|
|
|
|
2007-12-21 02:02:38 +03:00
|
|
|
switch (SCARG(&bsd_ua, name)) {
|
1996-02-10 20:12:31 +03:00
|
|
|
case -1:
|
|
|
|
*retval = -1;
|
|
|
|
return EINVAL;
|
|
|
|
case 0:
|
|
|
|
*retval = 0;
|
|
|
|
return 0;
|
|
|
|
default:
|
2007-12-21 02:02:38 +03:00
|
|
|
return sys_pathconf(l, &bsd_ua, retval);
|
1996-02-10 20:12:31 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1997-07-22 03:02:34 +04:00
|
|
|
|
1996-02-10 20:12:31 +03:00
|
|
|
int
|
2007-12-21 02:02:38 +03:00
|
|
|
svr4_sys_fpathconf(struct lwp *l, const struct svr4_sys_fpathconf_args *uap, register_t *retval)
|
1996-02-10 20:12:31 +03:00
|
|
|
{
|
2007-12-21 02:02:38 +03:00
|
|
|
struct sys_fpathconf_args bsd_ua;
|
1996-02-10 20:12:31 +03:00
|
|
|
|
2007-12-21 02:02:38 +03:00
|
|
|
SCARG(&bsd_ua, fd) = SCARG(uap, fd);
|
|
|
|
SCARG(&bsd_ua, name) = svr4_to_bsd_pathconf(SCARG(uap, name));
|
1996-02-10 20:12:31 +03:00
|
|
|
|
2007-12-21 02:02:38 +03:00
|
|
|
switch (SCARG(&bsd_ua, name)) {
|
1996-02-10 20:12:31 +03:00
|
|
|
case -1:
|
|
|
|
*retval = -1;
|
|
|
|
return EINVAL;
|
|
|
|
case 0:
|
|
|
|
*retval = 0;
|
|
|
|
return 0;
|
|
|
|
default:
|
2007-12-21 02:02:38 +03:00
|
|
|
return sys_fpathconf(l, &bsd_ua, retval);
|
1996-02-10 20:12:31 +03:00
|
|
|
}
|
|
|
|
}
|