Apply by doing:
cd /usr/src
patch -p0 < 013_procfs.patch
And then rebuild your kernel.
Index: libkern.h
===================================================================
RCS file: /cvs/src/sys/lib/libkern/libkern.h,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- sys/lib/libkern/libkern.h 2000/06/16 20:20:30 1.15
+++ libkern.h 2000/12/18 18:40:44 1.16
@@ -1,4 +1,4 @@
-/* $OpenBSD: libkern.h,v 1.15 2000/06/16 20:20:30 millert Exp $ */
+/* $OpenBSD: libkern.h,v 1.16 2000/12/18 18:40:44 provos Exp $ */
/* $NetBSD: libkern.h,v 1.7 1996/03/14 18:52:08 christos Exp $ */
/*-
@@ -167,6 +167,8 @@
char *strcat __P((char *, const char *));
char *strcpy __P((char *, const char *));
char *strncpy __P((char *, const char *, size_t));
+size_t strlcpy __P((char *, const char *, size_t));
+size_t strlcat __P((char *, const char *, size_t));
int strcmp __P((const char *, const char *));
int strncmp __P((const char *, const char *, size_t));
int strncasecmp __P((const char *, const char *, size_t));
Index: strlcat.c
===================================================================
RCS file: sys/lib/libkern/strlcat.c
diff -N sys/lib/libkern/strlcat.c
--- /dev/null Mon Dec 18 20:11:18 2000
+++ sys/lib/libkern/strlcat.c Mon Dec 18 20:19:00 2000
@@ -0,0 +1,76 @@
+/* $OpenBSD: strlcat.c,v 1.1 2000/12/18 18:40:44 provos Exp $ */
+
+/*
+ * Copyright (c) 1998 Todd C. Miller <
[email protected]>
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``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 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.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char *rcsid = "$OpenBSD: strlcat.c,v 1.1 2000/12/18 18:40:44 provos Exp $";
+#endif /* LIBC_SCCS and not lint */
+
+#if !defined(_KERNEL) && !defined(_STANDALONE)
+#include <sys/types.h>
+#include <string.h>
+#else
+#include <lib/libkern/libkern.h>
+#endif
+
+/*
+ * Appends src to string dst of size siz (unlike strncat, siz is the
+ * full size of dst, not space left). At most siz-1 characters
+ * will be copied. Always NUL terminates (unless siz == 0).
+ * Returns strlen(initial dst) + strlen(src); if retval >= siz,
+ * truncation occurred.
+ */
+size_t strlcat(dst, src, siz)
+ char *dst;
+ const char *src;
+ size_t siz;
+{
+ register char *d = dst;
+ register const char *s = src;
+ register size_t n = siz;
+ size_t dlen;
+
+ /* Find the end of dst and adjust bytes left but don't go past end */
+ while (*d != '\0' && n-- != 0)
+ d++;
+ dlen = d - dst;
+ n = siz - dlen;
+
+ if (n == 0)
+ return(dlen + strlen(s));
+ while (*s != '\0') {
+ if (n != 1) {
+ *d++ = *s;
+ n--;
+ }
+ s++;
+ }
+ *d = '\0';
+
+ return(dlen + (s - src)); /* count does not include NUL */
+}
Index: strlcpy.c
===================================================================
RCS file: sys/lib/libkern/strlcpy.c
diff -N sys/lib/libkern/strlcpy.c
--- /dev/null Mon Dec 18 20:11:18 2000
+++ sys/lib/libkern/strlcpy.c Mon Dec 18 20:19:00 2000
@@ -0,0 +1,72 @@
+/* $OpenBSD: strlcpy.c,v 1.1 2000/12/18 18:40:45 provos Exp $ */
+
+/*
+ * Copyright (c) 1998 Todd C. Miller <
[email protected]>
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``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 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.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char *rcsid = "$OpenBSD: strlcpy.c,v 1.1 2000/12/18 18:40:45 provos Exp $";
+#endif /* LIBC_SCCS and not lint */
+
+#if !defined(_KERNEL) && !defined(_STANDALONE)
+#include <sys/types.h>
+#include <string.h>
+#else
+#include <lib/libkern/libkern.h>
+#endif
+
+/*
+ * Copy src to string dst of size siz. At most siz-1 characters
+ * will be copied. Always NUL terminates (unless siz == 0).
+ * Returns strlen(src); if retval >= siz, truncation occurred.
+ */
+size_t strlcpy(dst, src, siz)
+ char *dst;
+ const char *src;
+ size_t siz;
+{
+ register char *d = dst;
+ register const char *s = src;
+ register size_t n = siz;
+
+ /* Copy as many bytes as will fit */
+ if (n != 0 && --n != 0) {
+ do {
+ if ((*d++ = *s++) == 0)
+ break;
+ } while (--n != 0);
+ }
+
+ /* Not enough room in dst, add NUL and traverse rest of src */
+ if (n == 0) {
+ if (siz != 0)
+ *d = '\0'; /* NUL-terminate dst */
+ while (*s++)
+ ;
+ }
+
+ return(s - src - 1); /* count does not include NUL */
+}
Index: arch/i386/Makefile.inc
===================================================================
RCS file: /cvs/src/sys/lib/libkern/arch/i386/Makefile.inc,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- sys/lib/libkern/arch/i386/Makefile.inc 2000/06/16 19:56:54 1.6
+++ sys/lib/libkern/arch/i386/Makefile.inc 2000/12/18 18:40:46 1.7
@@ -1,8 +1,9 @@
-# $OpenBSD: Makefile.inc,v 1.6 2000/06/16 19:56:54 millert Exp $
+# $OpenBSD: Makefile.inc,v 1.7 2000/12/18 18:40:46 provos Exp $
# $NetBSD: Makefile.inc,v 1.10 1996/04/13 01:17:41 cgd Exp $
SRCS+= __main.c imax.c imin.c lmax.c lmin.c max.c min.c ulmax.c ulmin.c \
memchr.S memcmp.S \
- bcmp.S ffs.S memset.S strcat.S strcmp.S strcpy.S strlen.S strncmp.c \
+ bcmp.S ffs.S memset.S strcat.S strcmp.S strcpy.S strlcat.c strlcpy.c \
+ strlen.S strncmp.c \
strncpy.c scanc.S skpc.S locc.S htonl.S htons.S ntohl.S ntohs.S \
strncasecmp.c
Index: arch/m68k/Makefile.inc
===================================================================
RCS file: /cvs/src/sys/lib/libkern/arch/m68k/Makefile.inc,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- sys/lib/libkern/arch/m68k/Makefile.inc 2000/06/16 19:56:54 1.6
+++ sys/lib/libkern/arch/m68k/Makefile.inc 2000/12/18 18:40:46 1.7
@@ -1,8 +1,9 @@
-# $OpenBSD: Makefile.inc,v 1.6 2000/06/16 19:56:54 millert Exp $
+# $OpenBSD: Makefile.inc,v 1.7 2000/12/18 18:40:46 provos Exp $
# $NetBSD: Makefile.inc,v 1.7 1996/04/18 01:53:04 cgd Exp $
SRCS+= __main.c imax.c imin.c lmax.c lmin.c max.c min.c ulmax.c ulmin.c \
memchr.c memcmp.S memset.S \
- bcmp.S bzero.S ffs.S strcat.S strcmp.S strcpy.S strlen.S strncmp.S \
+ bcmp.S bzero.S ffs.S strcat.S strcmp.S strcpy.S strlcat.c strlcpy.c \
+ strlen.S strncmp.S \
strncpy.S htonl.S htons.S ntohl.S ntohs.S scanc.S skpc.S locc.S \
strncasecmp.c
Index: arch/m88k/Makefile.inc
===================================================================
RCS file: /cvs/src/sys/lib/libkern/arch/m88k/Makefile.inc,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- sys/lib/libkern/arch/m88k/Makefile.inc 2000/06/16 19:56:55 1.3
+++ sys/lib/libkern/arch/m88k/Makefile.inc 2000/12/18 18:40:46 1.4
@@ -1,7 +1,7 @@
-# $OpenBSD: Makefile.inc,v 1.3 2000/06/16 19:56:55 millert Exp $
+# $OpenBSD: Makefile.inc,v 1.4 2000/12/18 18:40:46 provos Exp $
# $NetBSD: Makefile.inc,v 1.2 1996/04/13 01:17:58 cgd Exp $
SRCS+= __main.c imax.c imin.c lmax.c lmin.c max.c min.c ulmax.c ulmin.c \
memchr.c memcmp.c bcmp.c random.c \
- strcat.c strcmp.c strcpy.c strlen.c strncmp.c \
+ strcat.c strcmp.c strcpy.c strlcat.c strlcpy.c strlen.c strncmp.c \
strncpy.c scanc.c skpc.c strncasecmp.c ffs.c
Index: arch/mips/Makefile.inc
===================================================================
RCS file: /cvs/src/sys/lib/libkern/arch/mips/Makefile.inc,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- sys/lib/libkern/arch/mips/Makefile.inc 2000/08/15 01:06:12 1.8
+++ sys/lib/libkern/arch/mips/Makefile.inc 2000/12/18 18:40:46 1.9
@@ -1,11 +1,12 @@
-# $OpenBSD: Makefile.inc,v 1.8 2000/08/15 01:06:12 imp Exp $
+# $OpenBSD: Makefile.inc,v 1.9 2000/12/18 18:40:46 provos Exp $
# $NetBSD: Makefile.inc,v 1.4 1996/04/13 01:17:46 cgd Exp $
#
# There are likely more that we will notice when we go native
SRCS+= __main.c imax.c imin.c lmax.c lmin.c max.c min.c ulmax.c ulmin.c \
memchr.c memcmp.c memset.c strcmp.c \
- bcmp.S bcopy.S bzero.S strcat.c strcmp.c strcpy.c ffs.S htonl.S \
+ bcmp.S bcopy.S bzero.S strcat.c strcmp.c strcpy.c strlcat.c strlcpy.c \
+ ffs.S htonl.S \
htons.S strcmp.S strlen.S strncmp.c random.c scanc.c skpc.c strncpy.c \
strncasecmp.c
Index: arch/powerpc/Makefile.inc
===================================================================
RCS file: /cvs/src/sys/lib/libkern/arch/powerpc/Makefile.inc,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- sys/lib/libkern/arch/powerpc/Makefile.inc 2000/06/16 19:56:55 1.6
+++ sys/lib/libkern/arch/powerpc/Makefile.inc 2000/12/18 18:40:47 1.7
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile.inc,v 1.6 2000/06/16 19:56:55 millert Exp $
+# $OpenBSD: Makefile.inc,v 1.7 2000/12/18 18:40:47 provos Exp $
# $NetBSD: Makefile.inc,v 1.6 1994/10/26 06:39:03 cgd Exp $
CFLAGS += -D_KERNEL
@@ -6,7 +6,8 @@
SRCS+= __main.c __eabi.c \
imax.c imin.c lmax.c lmin.c max.c min.c ulmax.c ulmin.c \
memchr.c memcmp.c memset.c \
- bcmp.c bzero.c ffs.c strcat.c strcmp.c strcpy.c strlen.c strncmp.c \
+ bcmp.c bzero.c ffs.c strcat.c strcmp.c strcpy.c strlcat.c strlcpy.c \
+ strlen.c strncmp.c \
strncpy.c scanc.c skpc.c locc.c htonl.c htons.c ntohl.c ntohs.c \
memcpy.c random.c strncasecmp.c
# bcopy.c htolel.c letohl.c htoles.c letohs.c copystr.c \
Index: arch/sparc/Makefile.inc
===================================================================
RCS file: /cvs/src/sys/lib/libkern/arch/sparc/Makefile.inc,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- sys/lib/libkern/arch/sparc/Makefile.inc 2000/06/16 19:56:55 1.8
+++ sys/lib/libkern/arch/sparc/Makefile.inc 2000/12/18 18:40:47 1.9
@@ -1,9 +1,10 @@
-# $OpenBSD: Makefile.inc,v 1.8 2000/06/16 19:56:55 millert Exp $
+# $OpenBSD: Makefile.inc,v 1.9 2000/12/18 18:40:47 provos Exp $
# $NetBSD: Makefile.inc,v 1.12 1996/04/23 23:05:22 christos Exp $
SRCS+= __main.c imax.c imin.c lmax.c lmin.c max.c min.c ulmax.c ulmin.c \
memchr.c memcmp.c memset.c \
- bcmp.c bzero.S strcat.c strcmp.c strcpy.c strlen.S strncmp.c \
+ bcmp.c bzero.S strcat.c strcmp.c strcpy.c strlcat.c strlcpy.c \
+ strlen.S strncmp.c \
strncpy.c htonl.S htons.S ntohl.S ntohs.S scanc.c skpc.c \
strncasecmp.c
Index: arch/vax/Makefile.inc
===================================================================
RCS file: /cvs/src/sys/lib/libkern/arch/vax/Makefile.inc,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- sys/lib/libkern/arch/vax/Makefile.inc 2000/06/16 19:56:56 1.5
+++ sys/lib/libkern/arch/vax/Makefile.inc 2000/12/18 18:40:47 1.6
@@ -1,7 +1,7 @@
-# $OpenBSD: Makefile.inc,v 1.5 2000/06/16 19:56:56 millert Exp $
+# $OpenBSD: Makefile.inc,v 1.6 2000/12/18 18:40:47 provos Exp $
# $NetBSD: Makefile.inc,v 1.2 1996/04/13 01:17:58 cgd Exp $
SRCS+= __main.c imax.c imin.c lmax.c lmin.c max.c min.c ulmax.c ulmin.c \
memchr.c memcmp.c \
- strcat.c strcmp.c strcpy.c strlen.c strncmp.c \
+ strcat.c strcmp.c strcpy.c strlcat.c strlcpy.c strlen.c strncmp.c \
strncpy.c scanc.c skpc.c strncasecmp.c
Index: procfs_status.c
===================================================================
RCS file: /cvs/src/sys/miscfs/procfs/procfs_status.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- sys/miscfs/procfs/procfs_status.c 1997/12/30 01:33:14 1.3
+++ sys/miscfs/procfs/procfs_status.c 2000/12/18 18:44:28 1.4
@@ -1,4 +1,4 @@
-/* $OpenBSD: procfs_status.c,v 1.3 1997/12/30 01:33:14 deraadt Exp $ */
+/* $OpenBSD: procfs_status.c,v 1.4 2000/12/18 18:44:28 provos Exp $ */
/* $NetBSD: procfs_status.c,v 1.11 1996/03/16 23:52:50 christos Exp $ */
/*
@@ -44,6 +44,7 @@
#include <sys/systm.h>
#include <sys/time.h>
#include <sys/kernel.h>
+#include <sys/malloc.h>
#include <sys/proc.h>
#include <sys/vnode.h>
#include <sys/ioctl.h>
@@ -52,95 +53,133 @@
#include <sys/resourcevar.h>
#include <miscfs/procfs/procfs.h>
+int procfs_stat_gen(struct proc *, char *s, int);
+
+#define COUNTORCAT(s, l, ps, n) do { \
+ if (s) \
+ strlcat(s, ps, l); \
+ else \
+ n += strlen(ps); \
+ } while (0)
+
+/* Generates:
+ * comm pid ppid pgid sid maj,min ctty,sldr start ut st wmsg uid gid groups
+ */
int
-procfs_dostatus(curp, p, pfs, uio)
- struct proc *curp;
+procfs_stat_gen(p, s, l)
struct proc *p;
- struct pfsnode *pfs;
- struct uio *uio;
+ char *s;
+ int l;
{
struct session *sess;
struct tty *tp;
struct ucred *cr;
- char *ps;
- char *sep;
int pid, ppid, pgid, sid;
- int i;
- int xlen;
- int error;
- char psbuf[256]; /* XXX - conservative */
+ struct timeval ut, st;
+ char ps[256], *sep;
+ int i, n;
- if (uio->uio_rw != UIO_READ)
- return (EOPNOTSUPP);
-
pid = p->p_pid;
ppid = p->p_pptr ? p->p_pptr->p_pid : 0;
pgid = p->p_pgrp->pg_id;
sess = p->p_pgrp->pg_session;
sid = sess->s_leader ? sess->s_leader->p_pid : 0;
-/* comm pid ppid pgid sid maj,min ctty,sldr start ut st wmsg uid gid groups ... */
+ n = 0;
+ if (s)
+ bzero(s, l);
- ps = psbuf;
- bcopy(p->p_comm, ps, MAXCOMLEN);
+ bcopy(p->p_comm, ps, MAXCOMLEN-1);
ps[MAXCOMLEN] = '\0';
- ps += strlen(ps);
- ps += sprintf(ps, " %d %d %d %d ", pid, ppid, pgid, sid);
+ COUNTORCAT(s, l, ps, n);
+ (void) snprintf(ps, sizeof(ps), " %d %d %d %d ",
+ pid, ppid, pgid, sid);
+ COUNTORCAT(s, l, ps, n);
+
if ((p->p_flag&P_CONTROLT) && (tp = sess->s_ttyp))
- ps += sprintf(ps, "%d,%d ", major(tp->t_dev), minor(tp->t_dev));
+ snprintf(ps, sizeof(ps), "%d,%d ",
+ major(tp->t_dev), minor(tp->t_dev));
else
- ps += sprintf(ps, "%d,%d ", -1, -1);
+ snprintf(ps, sizeof(ps), "%d,%d ",
+ -1, -1);
+ COUNTORCAT(s, l, ps, n);
sep = "";
if (sess->s_ttyvp) {
- ps += sprintf(ps, "%sctty", sep);
+ snprintf(ps, sizeof(ps), "%sctty", sep);
sep = ",";
}
+ COUNTORCAT(s, l, ps, n);
+
if (SESS_LEADER(p)) {
- ps += sprintf(ps, "%ssldr", sep);
+ snprintf(ps, sizeof(ps), "%ssldr", sep);
sep = ",";
}
+ COUNTORCAT(s, l, ps, n);
+
if (*sep != ',')
- ps += sprintf(ps, "noflags");
+ snprintf(ps, sizeof(ps), "noflags");
+ COUNTORCAT(s, l, ps, n);
if (p->p_flag & P_INMEM)
- ps += sprintf(ps, " %ld,%ld",
- p->p_stats->p_start.tv_sec,
- p->p_stats->p_start.tv_usec);
+ snprintf(ps, sizeof(ps), " %ld,%ld",
+ p->p_stats->p_start.tv_sec, p->p_stats->p_start.tv_usec);
else
- ps += sprintf(ps, " -1,-1");
-
- {
- struct timeval ut, st;
-
- calcru(p, &ut, &st, (void *) 0);
- ps += sprintf(ps, " %ld,%ld %ld,%ld",
- ut.tv_sec,
- ut.tv_usec,
- st.tv_sec,
- st.tv_usec);
- }
+ snprintf(ps, sizeof(ps), " -1,-1");
+ COUNTORCAT(s, l, ps, n);
- ps += sprintf(ps, " %s",
- (p->p_wchan && p->p_wmesg) ? p->p_wmesg : "nochan");
+ calcru(p, &ut, &st, (void *) 0);
+ snprintf(ps, sizeof(ps), " %ld,%ld %ld,%ld",
+ ut.tv_sec, ut.tv_usec, st.tv_sec, st.tv_usec);
+ COUNTORCAT(s, l, ps, n);
+
+ snprintf(ps, sizeof(ps), " %s",
+ (p->p_wchan && p->p_wmesg) ? p->p_wmesg : "nochan");
+ COUNTORCAT(s, l, ps, n);
cr = p->p_ucred;
+
+ snprintf(ps, sizeof(ps), " %u, %u", cr->cr_uid, cr->cr_gid);
+ COUNTORCAT(s, l, ps, n);
+ for (i = 0; i < cr->cr_ngroups; i++) {
+ snprintf(ps, sizeof(ps), ",%u", cr->cr_groups[i]);
+ COUNTORCAT(s, l, ps, n);
+ }
- ps += sprintf(ps, " %d", cr->cr_uid);
- ps += sprintf(ps, " %d", cr->cr_gid);
- for (i = 0; i < cr->cr_ngroups; i++)
- ps += sprintf(ps, ",%d", cr->cr_groups[i]);
- ps += sprintf(ps, "\n");
-
- xlen = ps - psbuf;
- xlen -= uio->uio_offset;
- ps = psbuf + uio->uio_offset;
- xlen = imin(xlen, uio->uio_resid);
- if (xlen <= 0)
+ snprintf(ps, sizeof(ps), "\n");
+ COUNTORCAT(s, l, ps, n);
+
+ return (s != NULL ? strlen(s) + 1 : n + 1);
+}
+
+int
+procfs_dostatus(curp, p, pfs, uio)
+ struct proc *curp;
+ struct proc *p;
+ struct pfsnode *pfs;
+ struct uio *uio;
+{
+ char *ps;
+ int error, len;
+
+ if (uio->uio_rw != UIO_READ)
+ return (EOPNOTSUPP);
+
+ len = procfs_stat_gen(p, NULL, 0);
+ ps = malloc(len, M_TEMP, M_WAITOK);
+ if (!ps)
+ return (ENOMEM);
+ (void) procfs_stat_gen(p, ps, len);
+
+ len -= uio->uio_offset;
+ len = imin(len, uio->uio_resid);
+ if (len <= 0)
error = 0;
else
- error = uiomove(ps, xlen, uio);
+ error = uiomove(ps + uio->uio_offset, len, uio);
+ free(ps, M_TEMP);
return (error);
}
+