2 * 43BSD_FILE.C - 4.3BSD compatibility file syscalls
4 * Copyright (c) 1989, 1993
5 * The Regents of the University of California. All rights reserved.
6 * (c) UNIX System Laboratories, Inc.
7 * All or some portions of this file are derived from material licensed
8 * to the University of California by American Telephone and Telegraph
9 * Co. or Unix System Laboratories, Inc. and are reproduced herein with
10 * the permission of UNIX System Laboratories, Inc.
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
15 * 1. Redistributions of source code must retain the above copyright
16 * notice, this list of conditions and the following disclaimer.
17 * 2. Redistributions in binary form must reproduce the above copyright
18 * notice, this list of conditions and the following disclaimer in the
19 * documentation and/or other materials provided with the distribution.
20 * 3. All advertising materials mentioning features or use of this software
21 * must display the following acknowledgement:
22 * This product includes software developed by the University of
23 * California, Berkeley and its contributors.
24 * 4. Neither the name of the University nor the names of its contributors
25 * may be used to endorse or promote products derived from this software
26 * without specific prior written permission.
28 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
29 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
30 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
31 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
32 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
36 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
37 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
40 * $DragonFly: src/sys/emulation/43bsd/43bsd_file.c,v 1.7 2004/11/12 00:09:10 dillon Exp $
41 * from: DragonFly kern/vfs_syscalls.c,v 1.20
43 * These syscalls used to live in kern/vfs_syscalls.c. They are modified
44 * to use the new split syscalls.
47 #include "opt_compat.h"
49 #include <sys/param.h>
50 #include <sys/systm.h>
51 #include <sys/sysproto.h>
53 #include <sys/dirent.h>
54 #include <sys/fcntl.h>
56 #include <sys/filedesc.h>
57 #include <sys/kernel.h>
58 #include <sys/kern_syscall.h>
59 #include <sys/malloc.h>
60 #include <sys/mount.h>
62 #include <sys/namei.h>
63 #include <sys/nlookup.h>
64 #include <sys/vnode.h>
66 #include <vfs/union/union.h>
69 ocreat(struct ocreat_args *uap)
71 struct nlookupdata nd;
74 error = nlookup_init(&nd, uap->path, UIO_USERSPACE, NLC_FOLLOW);
76 error = kern_open(&nd, O_WRONLY | O_CREAT | O_TRUNC,
77 uap->mode, &uap->sysmsg_result);
83 oftruncate(struct oftruncate_args *uap)
87 error = kern_ftruncate(uap->fd, uap->length);
93 olseek(struct olseek_args *uap)
97 error = kern_lseek(uap->fd, uap->offset, uap->whence,
104 otruncate(struct otruncate_args *uap)
106 struct nlookupdata nd;
109 error = nlookup_init(&nd, uap->path, UIO_USERSPACE, NLC_FOLLOW);
111 error = kern_truncate(&nd, uap->length);
117 ogetdirentries(struct ogetdirentries_args *uap)
119 struct thread *td = curthread;
120 struct proc *p = td->td_proc;
123 struct uio auio, kuio;
124 struct iovec aiov, kiov;
125 struct dirent *dp, *edp;
127 int error, eofflag, readcnt;
130 /* XXX arbitrary sanity limit on `count'. */
131 if (uap->count > 64 * 1024)
133 if ((error = getvnode(p->p_fd, uap->fd, &fp)) != 0)
135 if ((fp->f_flag & FREAD) == 0)
137 vp = (struct vnode *)fp->f_data;
139 if (vp->v_type != VDIR)
141 aiov.iov_base = uap->buf;
142 aiov.iov_len = uap->count;
143 auio.uio_iov = &aiov;
145 auio.uio_rw = UIO_READ;
146 auio.uio_segflg = UIO_USERSPACE;
148 auio.uio_resid = uap->count;
149 vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
150 loff = auio.uio_offset = fp->f_offset;
151 # if (BYTE_ORDER != LITTLE_ENDIAN)
152 if (vp->v_mount->mnt_maxsymlinklen <= 0) {
153 error = VOP_READDIR(vp, &auio, fp->f_cred, &eofflag,
155 fp->f_offset = auio.uio_offset;
160 kuio.uio_iov = &kiov;
161 kuio.uio_segflg = UIO_SYSSPACE;
162 kiov.iov_len = uap->count;
163 MALLOC(dirbuf, caddr_t, uap->count, M_TEMP, M_WAITOK);
164 kiov.iov_base = dirbuf;
165 error = VOP_READDIR(vp, &kuio, fp->f_cred, &eofflag,
167 fp->f_offset = kuio.uio_offset;
169 readcnt = uap->count - kuio.uio_resid;
170 edp = (struct dirent *)&dirbuf[readcnt];
171 for (dp = (struct dirent *)dirbuf; dp < edp; ) {
172 # if (BYTE_ORDER == LITTLE_ENDIAN)
174 * The expected low byte of
175 * dp->d_namlen is our dp->d_type.
176 * The high MBZ byte of dp->d_namlen
177 * is our dp->d_namlen.
179 dp->d_type = dp->d_namlen;
183 * The dp->d_type is the high byte
184 * of the expected dp->d_namlen,
185 * so must be zero'ed.
189 if (dp->d_reclen > 0) {
190 dp = (struct dirent *)
191 ((char *)dp + dp->d_reclen);
198 error = uiomove(dirbuf, readcnt, &auio);
200 FREE(dirbuf, M_TEMP);
202 VOP_UNLOCK(vp, 0, td);
205 if (uap->count == auio.uio_resid) {
206 if (union_dircheckp) {
207 error = union_dircheckp(td, &vp, fp);
213 if ((vp->v_flag & VROOT) &&
214 (vp->v_mount->mnt_flag & MNT_UNION)) {
215 struct vnode *tvp = vp;
216 vp = vp->v_mount->mnt_vnodecovered;
218 fp->f_data = (caddr_t) vp;
224 error = copyout(&loff, uap->basep, sizeof(long));
225 uap->sysmsg_result = uap->count - auio.uio_resid;