summaryrefslogtreecommitdiff
path: root/sys/netccitt/pk_acct.c
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>1995-10-18 08:53:40 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>1995-10-18 08:53:40 +0000
commitd6583bb2a13f329cf0332ef2570eb8bb8fc0e39c (patch)
treeece253b876159b39c620e62b6c9b1174642e070e /sys/netccitt/pk_acct.c
initial import of NetBSD tree
Diffstat (limited to 'sys/netccitt/pk_acct.c')
-rw-r--r--sys/netccitt/pk_acct.c147
1 files changed, 147 insertions, 0 deletions
diff --git a/sys/netccitt/pk_acct.c b/sys/netccitt/pk_acct.c
new file mode 100644
index 00000000000..44e579864d8
--- /dev/null
+++ b/sys/netccitt/pk_acct.c
@@ -0,0 +1,147 @@
+/* $NetBSD: pk_acct.c,v 1.8 1994/12/14 19:03:39 mycroft Exp $ */
+
+/*
+ * Copyright (c) University of British Columbia, 1984
+ * Copyright (c) 1990, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * the Laboratory for Computation Vision and the Computer Science Department
+ * of the University of British Columbia.
+ *
+ * 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. 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
+ * SUCH DAMAGE.
+ *
+ * @(#)pk_acct.c 8.1 (Berkeley) 6/10/93
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/namei.h>
+#include <sys/proc.h>
+#include <sys/vnode.h>
+#include <sys/kernel.h>
+#include <sys/file.h>
+#include <sys/socket.h>
+#include <sys/socketvar.h>
+
+#include <net/if.h>
+
+#include <netccitt/x25.h>
+#include <netccitt/pk.h>
+#include <netccitt/pk_var.h>
+#include <netccitt/x25acct.h>
+
+
+struct vnode *pkacctp;
+/*
+ * Turn on packet accounting
+ */
+
+pk_accton (path)
+ char *path;
+{
+ register struct vnode *vp = NULL;
+ struct nameidata nd;
+ struct vnode *oacctp = pkacctp;
+ struct proc *p = curproc;
+ int error;
+
+ if (path == 0)
+ goto close;
+ NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, path, p);
+ if (error = vn_open (&nd, FWRITE, 0644))
+ return (error);
+ vp = nd.ni_vp;
+ VOP_UNLOCK(vp);
+ if (vp -> v_type != VREG) {
+ vrele (vp);
+ return (EACCES);
+ }
+ pkacctp = vp;
+ if (oacctp) {
+ close:
+ error = vn_close (oacctp, FWRITE, p -> p_ucred, p);
+ }
+ return (error);
+}
+
+/*
+ * Write a record on the accounting file.
+ */
+
+pk_acct (lcp)
+register struct pklcd *lcp;
+{
+ register struct vnode *vp;
+ register struct sockaddr_x25 *sa;
+ register char *src, *dst;
+ register int len;
+ register long etime;
+ static struct x25acct acbuf;
+
+ if ((vp = pkacctp) == 0)
+ return;
+ bzero ((caddr_t)&acbuf, sizeof (acbuf));
+ if (lcp -> lcd_ceaddr != 0)
+ sa = lcp -> lcd_ceaddr;
+ else if (lcp -> lcd_craddr != 0) {
+ sa = lcp -> lcd_craddr;
+ acbuf.x25acct_callin = 1;
+ } else
+ return;
+
+ if (sa -> x25_opts.op_flags & X25_REVERSE_CHARGE)
+ acbuf.x25acct_revcharge = 1;
+ acbuf.x25acct_stime = lcp -> lcd_stime;
+ acbuf.x25acct_etime = time.tv_sec - acbuf.x25acct_stime;
+ acbuf.x25acct_uid = curproc -> p_cred -> p_ruid;
+ acbuf.x25acct_psize = sa -> x25_opts.op_psize;
+ acbuf.x25acct_net = sa -> x25_net;
+ /*
+ * Convert address to bcd
+ */
+ src = sa -> x25_addr;
+ dst = acbuf.x25acct_addr;
+ for (len = 0; *src; len++)
+ if (len & 01)
+ *dst++ |= *src++ & 0xf;
+ else
+ *dst = *src++ << 4;
+ acbuf.x25acct_addrlen = len;
+
+ bcopy (sa -> x25_udata, acbuf.x25acct_udata,
+ sizeof (acbuf.x25acct_udata));
+ acbuf.x25acct_txcnt = lcp -> lcd_txcnt;
+ acbuf.x25acct_rxcnt = lcp -> lcd_rxcnt;
+
+ (void) vn_rdwr(UIO_WRITE, vp, (caddr_t)&acbuf, sizeof (acbuf),
+ (off_t)0, UIO_SYSSPACE, IO_UNIT|IO_APPEND,
+ curproc -> p_ucred, (int *)0,
+ (struct proc *)0);
+}