summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>1999-03-27 21:16:58 +0000
committeralc <alc@FreeBSD.org>1999-03-27 21:16:58 +0000
commitc9eccc7347cc4051a3db16f68f3a854908494917 (patch)
tree5921615b06b186f28e5d3133d7bc1b1a43ab944d
parent807da996a2d52fdc0c28d408fabc635bb3c681d4 (diff)
downloadFreeBSD-src-c9eccc7347cc4051a3db16f68f3a854908494917.zip
FreeBSD-src-c9eccc7347cc4051a3db16f68f3a854908494917.tar.gz
Added pread and pwrite. These functions are defined by the X/Open
Threads Extension. (Note: We use the same syscall numbers as NetBSD.) Submitted by: John Plevyak <jplevyak@inktomi.com>
-rw-r--r--sys/kern/init_sysent.c4
-rw-r--r--sys/kern/sys_generic.c133
-rw-r--r--sys/kern/syscalls.c4
-rw-r--r--sys/kern/syscalls.master6
-rw-r--r--sys/sys/syscall-hide.h2
-rw-r--r--sys/sys/syscall.h2
-rw-r--r--sys/sys/syscall.mk2
-rw-r--r--sys/sys/sysproto.h14
8 files changed, 159 insertions, 8 deletions
diff --git a/sys/kern/init_sysent.c b/sys/kern/init_sysent.c
index c31ed46..c258380 100644
--- a/sys/kern/init_sysent.c
+++ b/sys/kern/init_sysent.c
@@ -192,8 +192,8 @@ struct sysent sysent[] = {
{ 6, (sy_call_t *)msgsys }, /* 170 = msgsys */
{ 4, (sy_call_t *)shmsys }, /* 171 = shmsys */
{ 0, (sy_call_t *)nosys }, /* 172 = nosys */
- { 0, (sy_call_t *)nosys }, /* 173 = nosys */
- { 0, (sy_call_t *)nosys }, /* 174 = nosys */
+ { 5, (sy_call_t *)pread }, /* 173 = pread */
+ { 5, (sy_call_t *)pwrite }, /* 174 = pwrite */
{ 0, (sy_call_t *)nosys }, /* 175 = nosys */
{ 1, (sy_call_t *)ntp_adjtime }, /* 176 = ntp_adjtime */
{ 0, (sy_call_t *)nosys }, /* 177 = sfork */
diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c
index b607f71..e19fed8 100644
--- a/sys/kern/sys_generic.c
+++ b/sys/kern/sys_generic.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)sys_generic.c 8.5 (Berkeley) 1/21/94
- * $Id: sys_generic.c,v 1.44 1999/01/27 21:49:57 dillon Exp $
+ * $Id: sys_generic.c,v 1.45 1999/01/29 08:10:35 bde Exp $
*/
#include "opt_ktrace.h"
@@ -132,6 +132,70 @@ read(p, uap)
}
/*
+ * pread system call.
+ */
+#ifndef _SYS_SYSPROTO_H_
+struct pread_args {
+ int fd;
+ void *buf;
+ size_t nbyte;
+ off_t offset;
+};
+#endif
+/* ARGSUSED */
+int
+pread(p, uap)
+ struct proc *p;
+ register struct pread_args *uap;
+{
+ register struct file *fp;
+ register struct filedesc *fdp = p->p_fd;
+ struct uio auio;
+ struct iovec aiov;
+ long cnt, error = 0;
+#ifdef KTRACE
+ struct iovec ktriov;
+#endif
+
+ if (((u_int)uap->fd) >= fdp->fd_nfiles ||
+ (fp = fdp->fd_ofiles[uap->fd]) == NULL ||
+ (fp->f_flag & FREAD) == 0)
+ return (EBADF);
+ if (fp->f_type != DTYPE_VNODE)
+ return (ESPIPE);
+ aiov.iov_base = (caddr_t)uap->buf;
+ aiov.iov_len = uap->nbyte;
+ auio.uio_iov = &aiov;
+ auio.uio_iovcnt = 1;
+ auio.uio_offset = uap->offset;
+ if (uap->nbyte > INT_MAX)
+ return (EINVAL);
+ auio.uio_resid = uap->nbyte;
+ auio.uio_rw = UIO_READ;
+ auio.uio_segflg = UIO_USERSPACE;
+ auio.uio_procp = p;
+#ifdef KTRACE
+ /*
+ * if tracing, save a copy of iovec
+ */
+ if (KTRPOINT(p, KTR_GENIO))
+ ktriov = aiov;
+#endif
+ cnt = uap->nbyte;
+ if ((error = (*fp->f_ops->fo_read)(fp, &auio, fp->f_cred)))
+ if (auio.uio_resid != cnt && (error == ERESTART ||
+ error == EINTR || error == EWOULDBLOCK))
+ error = 0;
+ cnt -= auio.uio_resid;
+#ifdef KTRACE
+ if (KTRPOINT(p, KTR_GENIO) && error == 0)
+ ktrgenio(p->p_tracep, uap->fd, UIO_READ, &ktriov, cnt, error);
+#endif
+ p->p_retval[0] = cnt;
+ return (error);
+}
+
+/*
* Scatter read system call.
*/
#ifndef _SYS_SYSPROTO_H_
@@ -285,6 +349,73 @@ write(p, uap)
}
/*
+ * pwrite system call
+ */
+#ifndef _SYS_SYSPROTO_H_
+struct pwrite_args {
+ int fd;
+ const void *buf;
+ size_t nbyte;
+ off_t offset;
+};
+#endif
+int
+pwrite(p, uap)
+ struct proc *p;
+ register struct pwrite_args *uap;
+{
+ register struct file *fp;
+ register struct filedesc *fdp = p->p_fd;
+ struct uio auio;
+ struct iovec aiov;
+ long cnt, error = 0;
+#ifdef KTRACE
+ struct iovec ktriov;
+#endif
+
+ if (((u_int)uap->fd) >= fdp->fd_nfiles ||
+ (fp = fdp->fd_ofiles[uap->fd]) == NULL ||
+ (fp->f_flag & FWRITE) == 0)
+ return (EBADF);
+ if (fp->f_type != DTYPE_VNODE)
+ return (ESPIPE);
+ aiov.iov_base = (caddr_t)uap->buf;
+ aiov.iov_len = uap->nbyte;
+ auio.uio_iov = &aiov;
+ auio.uio_iovcnt = 1;
+ auio.uio_offset = uap->offset;
+ if (uap->nbyte > INT_MAX)
+ return (EINVAL);
+ auio.uio_resid = uap->nbyte;
+ auio.uio_rw = UIO_WRITE;
+ auio.uio_segflg = UIO_USERSPACE;
+ auio.uio_procp = p;
+#ifdef KTRACE
+ /*
+ * if tracing, save a copy of iovec
+ */
+ if (KTRPOINT(p, KTR_GENIO))
+ ktriov = aiov;
+#endif
+ cnt = uap->nbyte;
+ if ((error = (*fp->f_ops->fo_write)(fp, &auio, fp->f_cred))) {
+ if (auio.uio_resid != cnt && (error == ERESTART ||
+ error == EINTR || error == EWOULDBLOCK))
+ error = 0;
+ if (error == EPIPE)
+ psignal(p, SIGPIPE);
+ }
+ cnt -= auio.uio_resid;
+#ifdef KTRACE
+ if (KTRPOINT(p, KTR_GENIO) && error == 0)
+ ktrgenio(p->p_tracep, uap->fd, UIO_WRITE,
+ &ktriov, cnt, error);
+#endif
+ p->p_retval[0] = cnt;
+ return (error);
+}
+
+/*
* Gather write system call
*/
#ifndef _SYS_SYSPROTO_H_
diff --git a/sys/kern/syscalls.c b/sys/kern/syscalls.c
index 22e9e8e..d0d12f3 100644
--- a/sys/kern/syscalls.c
+++ b/sys/kern/syscalls.c
@@ -179,8 +179,8 @@ char *syscallnames[] = {
"msgsys", /* 170 = msgsys */
"shmsys", /* 171 = shmsys */
"#172", /* 172 = nosys */
- "#173", /* 173 = nosys */
- "#174", /* 174 = nosys */
+ "pread", /* 173 = pread */
+ "pwrite", /* 174 = pwrite */
"#175", /* 175 = nosys */
"ntp_adjtime", /* 176 = ntp_adjtime */
"#177", /* 177 = sfork */
diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master
index 6772363..30b39c4 100644
--- a/sys/kern/syscalls.master
+++ b/sys/kern/syscalls.master
@@ -1,4 +1,4 @@
- $Id: syscalls.master,v 1.54 1998/11/05 14:28:24 dg Exp $
+ $Id: syscalls.master,v 1.55 1998/11/11 12:45:14 peter Exp $
; from: @(#)syscalls.master 8.2 (Berkeley) 1/13/94
;
; System call name/number master file.
@@ -266,8 +266,8 @@
171 STD BSD { int shmsys(int which, int a2, int a3, int a4); }
; XXX should be { int shmsys(int which, ...); }
172 UNIMPL NOHIDE nosys
-173 UNIMPL NOHIDE nosys
-174 UNIMPL NOHIDE nosys
+173 STD POSIX { ssize_t pread(int fd, void *buf, size_t nbyte, off_t offset); }
+174 STD POSIX { ssize_t pwrite(int fd, const void *buf, size_t nbyte, off_t offset); }
175 UNIMPL NOHIDE nosys
176 STD BSD { int ntp_adjtime(struct timex *tp); }
177 UNIMPL NOHIDE sfork (BSD/OS 2.x)
diff --git a/sys/sys/syscall-hide.h b/sys/sys/syscall-hide.h
index 814bfec..11b5b2c 100644
--- a/sys/sys/syscall-hide.h
+++ b/sys/sys/syscall-hide.h
@@ -158,6 +158,8 @@ HIDE_BSD(rtprio)
HIDE_BSD(semsys)
HIDE_BSD(msgsys)
HIDE_BSD(shmsys)
+HIDE_POSIX(pread)
+HIDE_POSIX(pwrite)
HIDE_BSD(ntp_adjtime)
HIDE_POSIX(setgid)
HIDE_BSD(setegid)
diff --git a/sys/sys/syscall.h b/sys/sys/syscall.h
index 464ea91..b4fcab9 100644
--- a/sys/sys/syscall.h
+++ b/sys/sys/syscall.h
@@ -166,6 +166,8 @@
#define SYS_semsys 169
#define SYS_msgsys 170
#define SYS_shmsys 171
+#define SYS_pread 173
+#define SYS_pwrite 174
#define SYS_ntp_adjtime 176
#define SYS_setgid 181
#define SYS_setegid 182
diff --git a/sys/sys/syscall.mk b/sys/sys/syscall.mk
index 581290a..9e7e23c 100644
--- a/sys/sys/syscall.mk
+++ b/sys/sys/syscall.mk
@@ -123,6 +123,8 @@ MIASM = \
semsys.o \
msgsys.o \
shmsys.o \
+ pread.o \
+ pwrite.o \
ntp_adjtime.o \
setgid.o \
setegid.o \
diff --git a/sys/sys/sysproto.h b/sys/sys/sysproto.h
index 71f9492..7a7d1bc 100644
--- a/sys/sys/sysproto.h
+++ b/sys/sys/sysproto.h
@@ -542,6 +542,18 @@ struct shmsys_args {
int a3; char a3_[PAD_(int)];
int a4; char a4_[PAD_(int)];
};
+struct pread_args {
+ int fd; char fd_[PAD_(int)];
+ void * buf; char buf_[PAD_(void *)];
+ size_t nbyte; char nbyte_[PAD_(size_t)];
+ off_t offset; char offset_[PAD_(off_t)];
+};
+struct pwrite_args {
+ int fd; char fd_[PAD_(int)];
+ const void * buf; char buf_[PAD_(const void *)];
+ size_t nbyte; char nbyte_[PAD_(size_t)];
+ off_t offset; char offset_[PAD_(off_t)];
+};
struct ntp_adjtime_args {
struct timex * tp; char tp_[PAD_(struct timex *)];
};
@@ -1014,6 +1026,8 @@ int rtprio __P((struct proc *, struct rtprio_args *));
int semsys __P((struct proc *, struct semsys_args *));
int msgsys __P((struct proc *, struct msgsys_args *));
int shmsys __P((struct proc *, struct shmsys_args *));
+int pread __P((struct proc *, struct pread_args *));
+int pwrite __P((struct proc *, struct pwrite_args *));
int ntp_adjtime __P((struct proc *, struct ntp_adjtime_args *));
int setgid __P((struct proc *, struct setgid_args *));
int setegid __P((struct proc *, struct setegid_args *));
OpenPOWER on IntegriCloud