* Copyright (c) 1992, 1993
* The Regents of the University of California. All rights reserved.
* This software was developed by the Computer Systems Engineering group
* at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
* contributed to Berkeley.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 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.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 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
* @(#)news_compat.c 8.1 (Berkeley) 6/11/93
* from: $Hdr: sun_misc.c,v 1.12 92/07/12 13:26:10 torek Exp $
* NEWS-OS compatibility module.
* NEWS-OS system calls that are implemented differently in BSD are
#include <sys/filedesc.h>
#include <sys/resource.h>
#include <sys/resourcevar.h>
#include <sys/signalvar.h>
#include <miscfs/specfs/specdev.h>
/* here is the sun layout (not used directly): */
/* and the BSD layout: */
* Read Sun-style directory entries. We suck them into kernel space so
* that they can be massaged before being copied out to user code. Like
* SunOS, we squish out `empty' entries.
* This is quite ugly, but what do you expect from compatibility code?
struct sun_getdents_args
{
sun_getdents(p
, uap
, retval
)
register struct sun_getdents_args
*uap
;
register struct vnode
*vp
;
register caddr_t inp
, buf
; /* BSD-format */
register int len
, reclen
; /* BSD-format */
register caddr_t outp
; /* Sun-format */
register int resid
; /* Sun-format */
off_t off
; /* true file offset */
long soff
; /* Sun file offset */
int buflen
, error
, eofflag
;
#define SUN_RECLEN(reclen) (reclen + sizeof(long))
if ((error
= getvnode(p
->p_fd
, uap
->fd
, &fp
)) != 0)
if ((fp
->f_flag
& FREAD
) == 0)
vp
= (struct vnode
*)fp
->f_data
;
if (vp
->v_type
!= VDIR
) /* XXX vnode readdir op should do this */
buflen
= min(MAXBSIZE
, uap
->nbytes
);
buf
= malloc(buflen
, M_TEMP
, M_WAITOK
);
auio
.uio_segflg
= UIO_SYSSPACE
;
* First we read into the malloc'ed buffer, then
* we massage it into user space, one record at a time.
if (error
= VOP_READDIR(vp
, &auio
, fp
->f_cred
, &eofflag
))
if ((len
= buflen
- auio
.uio_resid
) == 0)
for (; len
> 0; len
-= reclen
) {
reclen
= ((struct bsd_dirent
*)inp
)->d_reclen
;
off
+= reclen
; /* each entry points to next */
if (((struct bsd_dirent
*)inp
)->d_fileno
== 0) {
inp
+= reclen
; /* it is a hole; squish it out */
if (reclen
> len
|| resid
< SUN_RECLEN(reclen
)) {
/* entry too big for buffer, so just stop */
/* copy out a Sun-shaped dirent */
((struct bsd_dirent
*)inp
)->d_reclen
= SUN_RECLEN(reclen
);
if ((error
= copyout((caddr_t
)&soff
, outp
, sizeof soff
)) != 0 ||
(error
= copyout(inp
, outp
+ sizeof soff
, reclen
)) != 0)
/* advance past this real entry */
/* advance output past Sun-shaped entry */
outp
+= SUN_RECLEN(reclen
);
resid
-= SUN_RECLEN(reclen
);
/* if we squished out the whole block, try again */
fp
->f_offset
= off
; /* update the vnode offset */
*retval
= uap
->nbytes
- resid
;
char sun_domainname
[MAXDOMAINNAME
];
int sun_domainnamelen
= 1;
struct sun_getdomainname_args
{
sun_getdomainname(p
, uap
, retval
)
struct sun_getdomainname_args
*uap
;
register int l
= min(uap
->namelen
, sun_domainnamelen
+ 1);
return (copyout(sun_domainname
, uap
->name
, l
));
struct sun_setdomainname_args
{
sun_setdomainname(p
, uap
, retval
)
struct sun_setdomainname_args
*uap
;
register int l
= uap
->namelen
, error
;
return (EINVAL
); /* ??? ENAMETOOLONG? */
if (error
= suser(p
->p_ucred
, &p
->p_acflag
))
if (error
= copyin(uap
->name
, sun_domainname
, l
))
struct news_setenvp_args
{
news_setenvp(p
, args
, retval
)
struct news_setenvp_args
*args
;
struct news_sysnews_args
{
int arg1
, arg2
, arg3
, arg4
;
news_sysnews(p
, args
, retval
)
struct news_sysnews_args
*args
;